diff options
Diffstat (limited to 'JavaScriptCore')
242 files changed, 61237 insertions, 42735 deletions
diff --git a/JavaScriptCore/API/APICast.h b/JavaScriptCore/API/APICast.h index 762a15e..b6d1532 100644 --- a/JavaScriptCore/API/APICast.h +++ b/JavaScriptCore/API/APICast.h @@ -26,7 +26,7 @@ #ifndef APICast_h #define APICast_h -#include "JSNumberCell.h" +#include "JSAPIValueWrapper.h" #include "JSValue.h" #include <wtf/Platform.h> #include <wtf/UnusedParam.h> @@ -58,18 +58,18 @@ inline JSC::ExecState* toJS(JSGlobalContextRef c) return reinterpret_cast<JSC::ExecState*>(c); } -inline JSC::JSValue toJS(JSC::ExecState* exec, JSValueRef v) +inline JSC::JSValue toJS(JSC::ExecState*, JSValueRef v) { - JSC::JSValue jsValue = JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(const_cast<OpaqueJSValue*>(v))); -#if USE(ALTERNATE_JSIMMEDIATE) - UNUSED_PARAM(exec); +#if USE(JSVALUE32_64) + JSC::JSCell* jsCell = reinterpret_cast<JSC::JSCell*>(const_cast<OpaqueJSValue*>(v)); + if (!jsCell) + return JSC::JSValue(); + if (jsCell->isAPIValueWrapper()) + return static_cast<JSC::JSAPIValueWrapper*>(jsCell)->value(); + return jsCell; #else - if (jsValue && jsValue.isNumber()) { - ASSERT(jsValue.isAPIMangledNumber()); - return JSC::jsNumber(exec, jsValue.uncheckedGetNumber()); - } + return JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(const_cast<OpaqueJSValue*>(v))); #endif - return jsValue; } inline JSC::JSObject* toJS(JSObjectRef o) @@ -89,15 +89,16 @@ inline JSC::JSGlobalData* toJS(JSContextGroupRef g) inline JSValueRef toRef(JSC::ExecState* exec, JSC::JSValue v) { -#if USE(ALTERNATE_JSIMMEDIATE) - UNUSED_PARAM(exec); +#if USE(JSVALUE32_64) + if (!v) + return 0; + if (!v.isCell()) + return reinterpret_cast<JSValueRef>(asCell(JSC::jsAPIValueWrapper(exec, v))); + return reinterpret_cast<JSValueRef>(asCell(v)); #else - if (v && v.isNumber()) { - ASSERT(!v.isAPIMangledNumber()); - return reinterpret_cast<JSValueRef>(JSC::JSValue::encode(JSC::jsAPIMangledNumber(exec, v.uncheckedGetNumber()))); - } -#endif + UNUSED_PARAM(exec); return reinterpret_cast<JSValueRef>(JSC::JSValue::encode(v)); +#endif } inline JSObjectRef toRef(JSC::JSObject* o) diff --git a/JavaScriptCore/API/JSBase.cpp b/JavaScriptCore/API/JSBase.cpp index fc3d0fe..4a32d35 100644 --- a/JavaScriptCore/API/JSBase.cpp +++ b/JavaScriptCore/API/JSBase.cpp @@ -96,7 +96,7 @@ void JSGarbageCollect(JSContextRef ctx) ExecState* exec = toJS(ctx); JSGlobalData& globalData = exec->globalData(); - JSLock lock(globalData.isSharedInstance); + JSLock lock(globalData.isSharedInstance ? LockForReal : SilenceAssertionsOnly); if (!globalData.heap.isBusy()) globalData.heap.collect(); diff --git a/JavaScriptCore/API/JSBase.h b/JavaScriptCore/API/JSBase.h index 6f012ca..9f3d88e 100644 --- a/JavaScriptCore/API/JSBase.h +++ b/JavaScriptCore/API/JSBase.h @@ -69,6 +69,14 @@ typedef struct OpaqueJSValue* JSObjectRef; #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. diff --git a/JavaScriptCore/API/JSCallbackObjectFunctions.h b/JavaScriptCore/API/JSCallbackObjectFunctions.h index 987c59f..1abed3f 100644 --- a/JavaScriptCore/API/JSCallbackObjectFunctions.h +++ b/JavaScriptCore/API/JSCallbackObjectFunctions.h @@ -318,11 +318,12 @@ bool JSCallbackObject<Base>::hasInstance(ExecState* exec, JSValue value, JSValue for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) { if (JSObjectHasInstanceCallback hasInstance = jsClass->hasInstance) { + JSValueRef valueRef = toRef(exec, value); JSValueRef exception = 0; bool result; { JSLock::DropAllLocks dropAllLocks(exec); - result = hasInstance(execRef, thisRef, toRef(exec, value), &exception); + result = hasInstance(execRef, thisRef, valueRef, &exception); } exec->setException(toJS(exec, exception)); return result; @@ -428,11 +429,13 @@ double JSCallbackObject<Base>::toNumber(ExecState* exec) const JSLock::DropAllLocks dropAllLocks(exec); value = convertToType(ctx, thisRef, kJSTypeNumber, &exception); } - exec->setException(toJS(exec, exception)); - if (value) { - double dValue; - return toJS(exec, value).getNumber(dValue) ? dValue : NaN; + if (exception) { + exec->setException(toJS(exec, exception)); + return 0; } + + double dValue; + return toJS(exec, value).getNumber(dValue) ? dValue : NaN; } return Base::toNumber(exec); @@ -452,11 +455,11 @@ UString JSCallbackObject<Base>::toString(ExecState* exec) const JSLock::DropAllLocks dropAllLocks(exec); value = convertToType(ctx, thisRef, kJSTypeString, &exception); } - exec->setException(toJS(exec, exception)); - if (value) - return toJS(exec, value).getString(); - if (exception) + if (exception) { + exec->setException(toJS(exec, exception)); return ""; + } + return toJS(exec, value).getString(); } return Base::toString(exec); diff --git a/JavaScriptCore/API/JSClassRef.h b/JavaScriptCore/API/JSClassRef.h index 4f67618..c4777dd 100644 --- a/JavaScriptCore/API/JSClassRef.h +++ b/JavaScriptCore/API/JSClassRef.h @@ -34,7 +34,7 @@ #include <wtf/HashMap.h> #include <wtf/RefCounted.h> -struct StaticValueEntry { +struct StaticValueEntry : FastAllocBase { StaticValueEntry(JSObjectGetPropertyCallback _getProperty, JSObjectSetPropertyCallback _setProperty, JSPropertyAttributes _attributes) : getProperty(_getProperty), setProperty(_setProperty), attributes(_attributes) { @@ -45,7 +45,7 @@ struct StaticValueEntry { JSPropertyAttributes attributes; }; -struct StaticFunctionEntry { +struct StaticFunctionEntry : FastAllocBase { StaticFunctionEntry(JSObjectCallAsFunctionCallback _callAsFunction, JSPropertyAttributes _attributes) : callAsFunction(_callAsFunction), attributes(_attributes) { @@ -58,7 +58,7 @@ struct StaticFunctionEntry { typedef HashMap<RefPtr<JSC::UString::Rep>, StaticValueEntry*> OpaqueJSClassStaticValuesTable; typedef HashMap<RefPtr<JSC::UString::Rep>, StaticFunctionEntry*> OpaqueJSClassStaticFunctionsTable; -class OpaqueJSClass; +struct OpaqueJSClass; // An OpaqueJSClass (JSClass) is created without a context, so it can be used with any context, even across context groups. // This structure holds data members that vary across context groups. diff --git a/JavaScriptCore/API/JSContextRef.cpp b/JavaScriptCore/API/JSContextRef.cpp index a3bdc69..c358a84 100644 --- a/JavaScriptCore/API/JSContextRef.cpp +++ b/JavaScriptCore/API/JSContextRef.cpp @@ -70,7 +70,7 @@ JSGlobalContextRef JSGlobalContextCreate(JSClassRef globalObjectClass) #else { #endif - JSLock lock(true); + JSLock lock(LockForReal); return JSGlobalContextCreateInGroup(toRef(&JSGlobalData::sharedInstance()), globalObjectClass); } #endif // PLATFORM(DARWIN) @@ -82,7 +82,7 @@ JSGlobalContextRef JSGlobalContextCreateInGroup(JSContextGroupRef group, JSClass { initializeThreading(); - JSLock lock(true); + JSLock lock(LockForReal); RefPtr<JSGlobalData> globalData = group ? PassRefPtr<JSGlobalData>(toJS(group)) : JSGlobalData::create(); diff --git a/JavaScriptCore/API/JSObjectRef.cpp b/JavaScriptCore/API/JSObjectRef.cpp index 50ee635..87d36ec 100644 --- a/JavaScriptCore/API/JSObjectRef.cpp +++ b/JavaScriptCore/API/JSObjectRef.cpp @@ -449,7 +449,7 @@ JSObjectRef JSObjectCallAsConstructor(JSContextRef ctx, JSObjectRef object, size return result; } -struct OpaqueJSPropertyNameArray { +struct OpaqueJSPropertyNameArray : FastAllocBase { OpaqueJSPropertyNameArray(JSGlobalData* globalData) : refCount(0) , globalData(globalData) @@ -491,7 +491,7 @@ JSPropertyNameArrayRef JSPropertyNameArrayRetain(JSPropertyNameArrayRef array) void JSPropertyNameArrayRelease(JSPropertyNameArrayRef array) { if (--array->refCount == 0) { - JSLock lock(array->globalData->isSharedInstance); + JSLock lock(array->globalData->isSharedInstance ? LockForReal : SilenceAssertionsOnly); delete array; } } @@ -511,7 +511,7 @@ void JSPropertyNameAccumulatorAddName(JSPropertyNameAccumulatorRef array, JSStri PropertyNameArray* propertyNames = toJS(array); propertyNames->globalData()->heap.registerThread(); - JSLock lock(propertyNames->globalData()->isSharedInstance); + JSLock lock(propertyNames->globalData()->isSharedInstance ? LockForReal : SilenceAssertionsOnly); propertyNames->add(propertyName->identifier(propertyNames->globalData())); } diff --git a/JavaScriptCore/API/tests/testapi.c b/JavaScriptCore/API/tests/testapi.c index 2fa2a84..1f413e1 100644 --- a/JavaScriptCore/API/tests/testapi.c +++ b/JavaScriptCore/API/tests/testapi.c @@ -383,8 +383,12 @@ static JSValueRef EvilExceptionObject_convertToType(JSContextRef context, JSObje if (!function) return NULL; JSValueRef value = JSObjectCallAsFunction(context, function, object, 0, NULL, exception); - if (!value) - return (JSValueRef)JSStringCreateWithUTF8CString("convertToType failed"); + if (!value) { + JSStringRef errorString = JSStringCreateWithUTF8CString("convertToType failed"); + JSValueRef errorStringRef = JSValueMakeString(context, errorString); + JSStringRelease(errorString); + return errorStringRef; + } return value; } diff --git a/JavaScriptCore/AllInOneFile.cpp b/JavaScriptCore/AllInOneFile.cpp index 4ccef08..7b67dbe 100644 --- a/JavaScriptCore/AllInOneFile.cpp +++ b/JavaScriptCore/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" diff --git a/JavaScriptCore/Android.mk b/JavaScriptCore/Android.mk index f31ddd9..6973fa1 100644 --- a/JavaScriptCore/Android.mk +++ b/JavaScriptCore/Android.mk @@ -52,6 +52,7 @@ LOCAL_SRC_FILES := \ API/JSCallbackObject.cpp \ API/OpaqueJSString.cpp \ \ + assembler/ARMAssembler.cpp \ bytecode/CodeBlock.cpp \ bytecode/JumpTable.cpp \ bytecode/Opcode.cpp \ @@ -114,6 +115,7 @@ LOCAL_SRC_FILES := \ runtime/Identifier.cpp \ runtime/InitializeThreading.cpp \ runtime/InternalFunction.cpp \ + runtime/JSAPIValueWrapper.cpp \ runtime/JSActivation.cpp \ runtime/JSArray.cpp \ runtime/JSByteArray.cpp \ @@ -126,6 +128,7 @@ LOCAL_SRC_FILES := \ runtime/JSLock.cpp \ runtime/JSNotAnObject.cpp \ runtime/JSNumberCell.cpp \ + runtime/JSONObject.cpp \ runtime/JSObject.cpp \ runtime/JSPropertyNameIterator.cpp \ runtime/JSStaticScopeObject.cpp \ @@ -135,6 +138,9 @@ LOCAL_SRC_FILES := \ runtime/JSWrapperObject.cpp \ runtime/LiteralParser.cpp \ runtime/Lookup.cpp \ + runtime/MarkStack.cpp \ + runtime/MarkStackPosix.cpp \ + runtime/MarkStackWin.cpp \ runtime/MathObject.cpp \ runtime/NativeErrorConstructor.cpp \ runtime/NativeErrorPrototype.cpp \ @@ -179,6 +185,7 @@ LOCAL_SRC_FILES := \ wtf/RefCountedLeakCounter.cpp \ wtf/TCSystemAlloc.cpp \ wtf/Threading.cpp \ + wtf/ThreadingNone.cpp \ wtf/ThreadingPthreads.cpp \ \ wtf/TypeTraits.cpp \ @@ -186,9 +193,11 @@ LOCAL_SRC_FILES := \ \ wtf/android/MainThreadAndroid.cpp \ \ + wtf/haiku/MainThreadHaiku.cpp \ wtf/unicode/CollatorDefault.cpp \ wtf/unicode/UTF8.cpp \ \ + wtf/unicode/glib/UnicodeGLib.cpp \ wtf/unicode/icu/CollatorICU.cpp # Rule to build grammar.y with our custom bison. diff --git a/JavaScriptCore/ChangeLog b/JavaScriptCore/ChangeLog index d06dfa0..1afea5f 100644 --- a/JavaScriptCore/ChangeLog +++ b/JavaScriptCore/ChangeLog @@ -1,39554 +1,6198 @@ -2009-06-09 Gavin Barraclough <barraclough@apple.com> +2009-08-10 Oliver Hunt <oliver@apple.com> - Reviewed by Geoff Garen. - - Enable JIT_OPTIMIZE_CALL & JIT_OPTIMIZE_METHOD_CALLS on ARMv7 platforms. - - These optimizations function correctly with no further changes. - - * wtf/Platform.h: - Change to enable JIT_OPTIMIZE_CALL & JIT_OPTIMIZE_METHOD_CALLS. - -2009-06-09 Gavin Barraclough <barraclough@apple.com> - - Not Reviewed, build fix. - - * assembler/MacroAssemblerARMv7.h: - -2009-06-09 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. - - Enable JIT_OPTIMIZE_ARITHMETIC on ARMv7 platforms. - - Temporarily split support for 'branchTruncateDoubleToInt32' onto its own switch - ('supportsFloatingPointTruncate'). See comment in MacroAssemblerARMv7, we need - to work out wherther we are going to be able to support the current interface on - all platforms, or whether this should be refactored. - - * assembler/MacroAssemblerARMv7.h: - (JSC::MacroAssemblerARMv7::supportsFloatingPoint): - Add implementation of supportsFloatingPointTruncate (returns true). - (JSC::MacroAssemblerARMv7::supportsFloatingPointTruncate): - Add implementation of supportsFloatingPointTruncate (returns false). - (JSC::MacroAssemblerARMv7::loadDouble): - (JSC::MacroAssemblerARMv7::storeDouble): - (JSC::MacroAssemblerARMv7::addDouble): - (JSC::MacroAssemblerARMv7::subDouble): - (JSC::MacroAssemblerARMv7::mulDouble): - (JSC::MacroAssemblerARMv7::convertInt32ToDouble): - (JSC::MacroAssemblerARMv7::branchDouble): - Implement FP code genertion operations. - * assembler/MacroAssemblerX86.h: - (JSC::MacroAssemblerX86::supportsFloatingPointTruncate): - Add implementation of supportsFloatingPointTruncate (returns true). - * assembler/MacroAssemblerX86_64.h: - (JSC::MacroAssemblerX86_64::supportsFloatingPointTruncate): - Add implementation of supportsFloatingPointTruncate (returns true). - * jit/JITArithmetic.cpp: - (JSC::JIT::emit_op_rshift): - Changed to call supportsFloatingPointTruncate(). - (JSC::JIT::emitSlow_op_rshift): - Changed to call supportsFloatingPointTruncate(). - * wtf/Platform.h: - Change to enable JIT_OPTIMIZE_ARITHMETIC. - -2009-06-09 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Mark Rowe & Geoff Garen. + Reviewed by NOBODY (And another build fix). - Enable JIT_OPTIMIZE_PROPERTY_ACCESS on ARMv7 platforms. + Add new exports for MSVC - Firm up interface for planting load intructions that will be repatched by - repatchLoadPtrToLEA(). This method should now no longer be applied to just - any loadPtr instruction. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + * JavaScriptCore.xcodeproj/project.pbxproj: - * assembler/MacroAssemblerARMv7.h: - (JSC::MacroAssemblerARMv7::loadPtrWithPatchToLEA): - Implement loadPtrWithPatchToLEA interface (plants a load with a fixed width address). - (JSC::MacroAssemblerARMv7::move): - (JSC::MacroAssemblerARMv7::nearCall): - (JSC::MacroAssemblerARMv7::call): - (JSC::MacroAssemblerARMv7::moveWithPatch): - (JSC::MacroAssemblerARMv7::tailRecursiveCall): - Switch to use common method 'moveFixedWidthEncoding()' to perform fixed width (often patchable) loads. - (JSC::MacroAssemblerARMv7::moveFixedWidthEncoding): - Move an immediate to a register, always plants movT3/movt instruction pair. - * assembler/MacroAssemblerX86.h: - (JSC::MacroAssemblerX86::loadPtrWithPatchToLEA): - Implement loadPtrWithPatchToLEA interface (just a regular 32-bit load on x86). - * assembler/MacroAssemblerX86_64.h: - (JSC::MacroAssemblerX86_64::loadPtrWithPatchToLEA): - Implement loadPtrWithPatchToLEA interface (just a regular 64-bit load on x86_64). - * jit/JITPropertyAccess.cpp: - (JSC::JIT::compileGetByIdHotPath): - (JSC::JIT::emit_op_put_by_id): - * wtf/Platform.h: - Change to enable JIT_OPTIMIZE_PROPERTY_ACCESS. +2009-08-10 Oliver Hunt <oliver@apple.com> -2009-06-08 Gavin Barraclough <barraclough@apple.com> + Reviewed by NOBODY (yet another build fix). - Reviewed by Geoff Garen. + Remove obsolete entries from MSVC exports file - Enable JS language JIT for ARM thumb2 platforms. Add ARMv7 specific - asm & constants, add appropriate configuration switches to Platform.h. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - Landing this disabled until jump linking is completed (see YARR jit patch). +2009-08-10 Oliver Hunt <oliver@apple.com> - * assembler/MacroAssemblerARMv7.h: - (JSC::MacroAssemblerARMv7::load32): - Fix: should load pointer with ImmPtr not Imm32. - (JSC::MacroAssemblerARMv7::store32): - Fix: should load pointer with ImmPtr not Imm32. - (JSC::MacroAssemblerARMv7::move): - Fix: When moving an Imm32 that is actually a pointer, should call movT3() - not mov(), to ensure code generation is repeatable (for exception handling). - * jit/JIT.cpp: - (JSC::JIT::privateCompileCTIMachineTrampolines): - Disable JIT_OPTIMIZE_NATIVE_CALL specific code generation if the optimization is not enabled. - * jit/JIT.h: - Add ARMv7 specific values of constants & register names. - * jit/JITInlineMethods.h: - (JSC::JIT::preverveReturnAddressAfterCall): - (JSC::JIT::restoreReturnAddressBeforeReturn): - (JSC::JIT::restoreArgumentReferenceForTrampoline): - Implement for ARMv7 (move value to/from lr). - * jit/JITStubs.cpp: - Add JIT entry/thow trampolines, add macro to add thunk wrapper around stub routines. - * jit/JITStubs.h: - (JSC::JITStackFrame::returnAddressSlot): - Add ARMv7 stack frame object. - * wtf/Platform.h: - Add changes necessary to allow JIT to build on this platform, disabled. + Reviewed by NOBODY (Build fix). -2009-06-08 Mark Rowe <mrowe@apple.com> + Add includes needed for non-allinonefile builds - Speculative GTK build fix. + * runtime/GetterSetter.h: + * runtime/ScopeChain.h: - * wtf/DateMath.cpp: +2009-08-10 Oliver Hunt <oliver@apple.com> -2009-06-08 Gavin Barraclough <barraclough@apple.com> + Reviewed by NOBODY (Build fix). - Reviewed by Mark Rowe. + Fix export file for last build fix - Previous patch caused a regression. + * JavaScriptCore.exp: - Restructure so no new (empty, inline) function calls are added on x86. +2009-08-10 Oliver Hunt <oliver@apple.com> - * jit/ExecutableAllocator.h: - (JSC::ExecutableAllocator::makeWritable): - (JSC::ExecutableAllocator::makeExecutable): - (JSC::ExecutableAllocator::reprotectRegion): - (JSC::ExecutableAllocator::cacheFlush): + Reviewed by NOBODY (Build fix). -2009-06-08 Dimitri Glazkov <dglazkov@chromium.org> + Hoist page size initialization into platform specific code. - Unreviewed, GTK build fix (thanks, bdash). + * jit/ExecutableAllocatorPosix.cpp: + * jit/ExecutableAllocatorWin.cpp: + * runtime/MarkStack.h: + (JSC::MarkStack::pageSize): + * runtime/MarkStackPosix.cpp: + (JSC::MarkStack::initializePagesize): + * runtime/MarkStackWin.cpp: + (JSC::MarkStack::initializePagesize): - * GNUmakefile.am: Moved DateMath with all other wtf kin. +2009-08-07 Oliver Hunt <oliver@apple.com> -2009-06-08 Gavin Barraclough <barraclough@apple.com> + Reviewed by Gavin Barraclough. - Reviewed by Geoff Garen. + Stack overflow crash in JavaScript garbage collector mark pass + https://bugs.webkit.org/show_bug.cgi?id=12216 - Add (incomplete) support to YARR for running with the jit enabled - on Arm thumb2 platforms. Adds new Assembler/MacroAssembler classes, - along with cache flushing support, tweaks to MacroAssemblerCodePtr - to support decorated thumb code pointers, and new enter/exit code - to YARR jit for the platform. + Make the GC mark phase iterative by using an explicit mark stack. + To do this marking any single object is performed in multiple stages + * The object is appended to the MarkStack, this sets the marked + bit for the object using the new markDirect() function, and then + returns + * When the MarkStack is drain()ed the object is popped off the stack + and markChildren(MarkStack&) is called on the object to collect + all of its children. drain() then repeats until the stack is empty. - Support for this platform is still under development - the assembler - currrently only supports planting and linking jumps with a 16Mb range. - As such, initially commiting in a disabled state. + Additionally I renamed a number of methods from 'mark' to 'markAggregate' + in order to make it more clear that marking of those object was not + going to result in an actual recursive mark. + * GNUmakefile.am + * JavaScriptCore.exp: + * JavaScriptCore.gypi: + * JavaScriptCore.pri: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: * JavaScriptCore.xcodeproj/project.pbxproj: - Add new assembler files. - * assembler/ARMv7Assembler.h: Added. - Add new Assembler. - * assembler/AbstractMacroAssembler.h: - Tweaks to ensure sizes of pointer values planted in JIT code do not change. - * assembler/MacroAssembler.h: - On ARMv7 platforms use MacroAssemblerARMv7. - * assembler/MacroAssemblerARMv7.h: Added. - Add new MacroAssembler. - * assembler/MacroAssemblerCodeRef.h: - (JSC::FunctionPtr::FunctionPtr): - Add better ASSERT. - (JSC::ReturnAddressPtr::ReturnAddressPtr): - Add better ASSERT. - (JSC::MacroAssemblerCodePtr::MacroAssemblerCodePtr): - On ARMv7, MacroAssemblerCodePtr's mush be 'decorated' with a low bit set, - to indicate to the processor that the code is thumb code, not traditional - 32-bit ARM. - (JSC::MacroAssemblerCodePtr::dataLocation): - On ARMv7, decoration must be removed. - * jit/ExecutableAllocator.h: - (JSC::ExecutableAllocator::makeWritable): - Reformatted, no change. - (JSC::ExecutableAllocator::makeExecutable): - When marking code executable also cache flush it, where necessary. - (JSC::ExecutableAllocator::MakeWritable::MakeWritable): - Only use the null implementation of this class if both !ASSEMBLER_WX_EXCLUSIVE - and running on x86(_64) - on other platforms we may also need ensure that - makeExecutable is called at the end to flush caches. - (JSC::ExecutableAllocator::reprotectRegion): - Reformatted, no change. - (JSC::ExecutableAllocator::cacheFlush): - Cache flush a region of memory, or platforms where this is necessary. - * wtf/Platform.h: - Add changes necessary to allow YARR jit to build on this platform, disabled. - * yarr/RegexJIT.cpp: - (JSC::Yarr::RegexGenerator::generateEnter): - (JSC::Yarr::RegexGenerator::generateReturn): - Add support to these methods for ARMv7. - -2009-06-08 Dimitri Glazkov <dglazkov@chromium.org> - - Unreviewed, fix my previous fix. - - * runtime/DateInstance.cpp: - (JSC::DateInstance::msToGregorianDateTime): Use WTF namespace qualifier to - disambiguate func signatures. - -2009-06-08 Mark Rowe <mrowe@apple.com> - - Attempt to fix the Tiger build. + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::markAggregate): + * bytecode/CodeBlock.h: + * bytecode/EvalCodeCache.h: + (JSC::EvalCodeCache::markAggregate): + * debugger/DebuggerActivation.cpp: + (JSC::DebuggerActivation::markChildren): + * debugger/DebuggerActivation.h: + * interpreter/Register.h: + * interpreter/RegisterFile.h: + (JSC::RegisterFile::markGlobals): + (JSC::RegisterFile::markCallFrames): + * parser/Nodes.cpp: + (JSC::ScopeNodeData::markAggregate): + (JSC::EvalNode::markAggregate): + (JSC::FunctionBodyNode::markAggregate): + * parser/Nodes.h: + (JSC::ScopeNode::markAggregate): + * runtime/ArgList.cpp: + (JSC::MarkedArgumentBuffer::markLists): + * runtime/ArgList.h: + * runtime/Arguments.cpp: + (JSC::Arguments::markChildren): + * runtime/Arguments.h: + * runtime/Collector.cpp: + (JSC::Heap::markConservatively): + (JSC::Heap::markCurrentThreadConservativelyInternal): + (JSC::Heap::markCurrentThreadConservatively): + (JSC::Heap::markOtherThreadConservatively): + (JSC::Heap::markStackObjectsConservatively): + (JSC::Heap::markProtectedObjects): + (JSC::Heap::collect): + * runtime/Collector.h: + * runtime/GetterSetter.cpp: + (JSC::GetterSetter::markChildren): + * runtime/GetterSetter.h: + (JSC::GetterSetter::GetterSetter): + (JSC::GetterSetter::createStructure): + * runtime/GlobalEvalFunction.cpp: + (JSC::GlobalEvalFunction::markChildren): + * runtime/GlobalEvalFunction.h: + * runtime/JSActivation.cpp: + (JSC::JSActivation::markChildren): + * runtime/JSActivation.h: + * runtime/JSArray.cpp: + (JSC::JSArray::markChildren): + * runtime/JSArray.h: + * runtime/JSCell.h: + (JSC::JSCell::markCellDirect): + (JSC::JSCell::markChildren): + (JSC::JSValue::markDirect): + (JSC::JSValue::markChildren): + (JSC::JSValue::hasChildren): + (JSC::MarkStack::append): + (JSC::MarkStack::drain): + * runtime/JSFunction.cpp: + (JSC::JSFunction::markChildren): + * runtime/JSFunction.h: + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + * runtime/JSGlobalData.h: + * runtime/JSGlobalObject.cpp: + (JSC::markIfNeeded): + (JSC::JSGlobalObject::markChildren): + * runtime/JSGlobalObject.h: + * runtime/JSNotAnObject.cpp: + (JSC::JSNotAnObject::markChildren): + * runtime/JSNotAnObject.h: + * runtime/JSONObject.cpp: + (JSC::Stringifier::markAggregate): + (JSC::JSONObject::markStringifiers): + * runtime/JSONObject.h: + * runtime/JSObject.cpp: + (JSC::JSObject::markChildren): + (JSC::JSObject::defineGetter): + (JSC::JSObject::defineSetter): + * runtime/JSObject.h: + * runtime/JSPropertyNameIterator.cpp: + (JSC::JSPropertyNameIterator::markChildren): + * runtime/JSPropertyNameIterator.h: + (JSC::JSPropertyNameIterator::createStructure): + (JSC::JSPropertyNameIterator::JSPropertyNameIterator): + (JSC::JSPropertyNameIterator::create): + * runtime/JSStaticScopeObject.cpp: + (JSC::JSStaticScopeObject::markChildren): + * runtime/JSStaticScopeObject.h: + * runtime/JSType.h: + (JSC::): + * runtime/JSValue.h: + * runtime/JSWrapperObject.cpp: + (JSC::JSWrapperObject::markChildren): + * runtime/JSWrapperObject.h: + * runtime/MarkStack.cpp: Added. + (JSC::MarkStack::compact): + * runtime/MarkStack.h: Added. + (JSC::): + (JSC::MarkStack::MarkStack): + (JSC::MarkStack::append): + (JSC::MarkStack::appendValues): + (JSC::MarkStack::~MarkStack): + (JSC::MarkStack::MarkSet::MarkSet): + (JSC::MarkStack::pageSize): + + MarkStackArray is a non-shrinking, mmap-based vector type + used for storing objects to be marked. + (JSC::MarkStack::MarkStackArray::MarkStackArray): + (JSC::MarkStack::MarkStackArray::~MarkStackArray): + (JSC::MarkStack::MarkStackArray::expand): + (JSC::MarkStack::MarkStackArray::append): + (JSC::MarkStack::MarkStackArray::removeLast): + (JSC::MarkStack::MarkStackArray::isEmpty): + (JSC::MarkStack::MarkStackArray::size): + (JSC::MarkStack::MarkStackArray::shrinkAllocation): + * runtime/MarkStackPosix.cpp: Added. + (JSC::MarkStack::allocateStack): + (JSC::MarkStack::releaseStack): + * runtime/MarkStackWin.cpp: Added. + (JSC::MarkStack::allocateStack): + (JSC::MarkStack::releaseStack): - * wtf/Platform.h: Only test the value of the macro once we know it is defined. + * runtime/ScopeChain.h: + * runtime/ScopeChainMark.h: + (JSC::ScopeChain::markAggregate): + * runtime/SmallStrings.cpp: + (JSC::SmallStrings::mark): + * runtime/Structure.h: + (JSC::Structure::markAggregate): -2009-06-08 Dimitri Glazkov <dglazkov@chromium.org> +2009-08-10 Mark Rowe <mrowe@apple.com> + + Reviewed by Darin Adler. - Unreviewed, another Windows build fix. + Fix hundreds of "pointer being freed was not allocated" errors seen on the build bot. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + * wtf/FastMalloc.h: Implement nothrow variants of the delete and delete[] operators since + we implement the nothrow variants of new and new[]. The nothrow variant of delete is called + explicitly in the implementation of std::sort which was resulting in FastMalloc-allocated + memory being passed to the system allocator to free. -2009-06-08 Dimitri Glazkov <dglazkov@chromium.org> +2009-08-10 Jan Michael Alonzo <jmalonzo@webkit.org> - Unreviewed, projectile-fixing Windows build. + [Gtk] Unreviewed build fix. Move JSAPIValueWrapper.cpp/.h in the debug + section. This file is already part of AllInOneFile in Release builds. - * runtime/DateConversion.cpp: Added StringExtras include. - * wtf/DateMath.cpp: Replaced math with algorithm include (looking for std::min def for Windows). + * GNUmakefile.am: -2009-06-08 Dimitri Glazkov <dglazkov@chromium.org> +2009-08-10 Darin Adler <darin@apple.com> - Unreviewed, Windows build fix. + * wtf/FastMalloc.h: Fix build. - * runtime/DateConstructor.cpp: Changed to use WTF namespace. - * runtime/DateConversion.cpp: Added UString include. - * runtime/DateInstance.cpp: Changed to use WTF namespace. - * wtf/DateMath.cpp: Added math include. +2009-08-10 Darin Adler <darin@apple.com> -2009-06-08 Dimitri Glazkov <dglazkov@chromium.org> + Reviewed by Mark Rowe. - Reviewed by Eric Seidel. + FastMalloc.h has cross-platform code but marked as WinCE-only + https://bugs.webkit.org/show_bug.cgi?id=28160 - https://bugs.webkit.org/show_bug.cgi?id=26238 - Move most of runtime/DateMath functions to wtf/DateMath, and split off conversion-related - helpers to DateConversion. - - * AllInOneFile.cpp: Changed DateMath->DateConversion. - * GNUmakefile.am: Ditto and added DateMath. - * JavaScriptCore.exp: Ditto. - * JavaScriptCore.pri: Ditto. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Ditto. - * JavaScriptCore.vcproj/WTF/WTF.vcproj: Added DateMath. - * JavaScriptCore.xcodeproj/project.pbxproj: Ditto. - * JavaScriptCoreSources.bkl: Ditto. - * pcre/pcre_exec.cpp: Changed to use DateMath. - * profiler/ProfileNode.cpp: - (JSC::getCount): Changed to use DateConversion. - * runtime/DateConstructor.cpp: Ditto. - * runtime/DateConversion.cpp: Copied from JavaScriptCore/runtime/DateMath.cpp. - (JSC::parseDate): Refactored to use null-terminated characters as input. - * runtime/DateConversion.h: Copied from JavaScriptCore/runtime/DateMath.h. - * runtime/DateInstance.cpp: Changed to use wtf/DateMath. - * runtime/DateInstance.h: Ditto. - * runtime/DateMath.cpp: Removed. - * runtime/DateMath.h: Removed. - * runtime/DatePrototype.cpp: Ditto. - * runtime/InitializeThreading.cpp: Ditto. - * wtf/DateMath.cpp: Copied from JavaScriptCore/runtime/DateMath.cpp. - * wtf/DateMath.h: Copied from JavaScriptCore/runtime/DateMath.h. - -2009-06-08 Steve Falkenburg <sfalken@apple.com> + 1) The support for nothrow was inside #if PLATFORM(WINCE) even though it is + not platform-specific. + 2) The code tried to override operator delete nothrow, which does not exist. + 3) The code in the header checks the value of USE_SYSTEM_MALLOC, but the code + in FastMalloc.cpp checks only if the macro is defined. - Windows build fix. + * wtf/FastMalloc.h: See above. + * wtf/FastMalloc.cpp: Ditto. - * JavaScriptCore.vcproj/jsc/jscCommon.vsprops: +2009-08-10 Sam Weinig <sam@webkit.org> -2009-06-07 David Kilzer <ddkilzer@apple.com> + Reviewed by Anders Carlsson. - Make JavaScriptCore compile for iPhone and iPhone Simulator + Fix an annoying indentation issue. - Reviewed by Gavin Barraclough. + * runtime/DateConstructor.cpp: + (JSC::constructDate): - * Configurations/Base.xcconfig: Split GCC_ENABLE_OBJC_GC on - $(REAL_PLATFORM_NAME). Added $(ARCHS_UNIVERSAL_IPHONE_OS) to - VALID_ARCHS. Added REAL_PLATFORM_NAME_iphoneos, - REAL_PLATFORM_NAME_iphonesimulator, HAVE_DTRACE_iphoneos and - HAVE_DTRACE_iphonesimulator variables. - * Configurations/DebugRelase.xcconfig: Split ARCHS definition on - $(REAL_PLATFORM_NAME). - * Configurations/JavaScriptCore.xcconfig: Added - EXPORTED_SYMBOLS_FILE_armv6 and EXPORTED_SYMBOLS_FILE_armv7 - variables. Split OTHER_LDFLAGS into OTHER_LDFLAGS_BASE and - OTHER_LDFLAGS_$(REAL_PLATFORM_NAME) since CoreServices.framework - is only linked to on Mac OS X. - * JavaScriptCore.xcodeproj/project.pbxproj: Removed references - to CoreServices.framework since it's linked using OTHER_LDFLAGS - in JavaScriptCore.xcconfig. - * profiler/ProfilerServer.mm: Added #import for iPhone - Simulator. - (-[ProfilerServer init]): Conditionalize use of - NSDistributedNotificationCenter to non-iPhone or iPhone - Simulator. - * wtf/FastMalloc.cpp: - (WTF::TCMallocStats::): Build fix for iPhone and iPhone - Simulator. - * wtf/Platform.h: Defined PLATFORM(IPHONE) and - PLATFORM(IPHONE_SIMULATOR). - * wtf/ThreadingPthreads.cpp: - (WTF::setThreadNameInternal): Build fix for iPhone and iPhone - Simulator. +2009-08-10 Xan Lopez <xlopez@igalia.com> -2009-06-08 Tor Arne Vestbø <tor.arne.vestbo@nokia.com> + Unreviewed build fix. - Reviewed by Simon Hausmann. + Add new files to makefile. - [Qt] Use $QMAKE_PATH_SEP instead of hardcoded / to fix Windows build + * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.pro: - * jsc.pro: +2009-08-10 Simon Hausmann <simon.hausmann@nokia.com> -2009-06-07 Gavin Barraclough <barraclough@apple.com> + Fix compilation with the interpreter instead of the JIT by including + PrototypeFunction.h as forward-declared through NativeFunctionWrapper.h. - RS by Sam Weinig. + * runtime/ObjectConstructor.cpp: - Remove bonus bogus \n from last commit. +2009-08-09 Oliver Hunt <oliver@apple.com> - * jit/JITStubs.cpp: - (JSC::): + Reviewed by George Staikos. -2009-06-07 Gavin Barraclough <barraclough@apple.com> + JSON.stringify replacer returning undefined does not omit object properties + https://bugs.webkit.org/show_bug.cgi?id=28118 - Reviewed by Sam Weinig. + Correct behaviour of stringify when using a replacer function that returns + undefined. This is a simple change to move the undefined value check to + after the replacer function is called. This means that the replacer function + is now called for properties with the value undefined, however i've confirmed + that this behaviour is correct. + + In addition I've made the cyclic object exception have a more useful error + message. - Change the implementation of op_throw so the stub function always modifies its - return address - if it doesn't find a 'catch' it will switch to a trampoline - to force a return from JIT execution. This saves memory, by avoiding the need - for a unique return for every op_throw. + * runtime/JSONObject.cpp: + (JSC::Stringifier::appendStringifiedValue): - * jit/JITOpcodes.cpp: - (JSC::JIT::emit_op_throw): - JITStubs::cti_op_throw now always changes its return address, - remove return code generated after the stub call (this is now - handled by ctiOpThrowNotCaught). - * jit/JITStubs.cpp: - (JSC::): - Add ctiOpThrowNotCaught definitions. - (JSC::JITStubs::DEFINE_STUB_FUNCTION): - Change cti_op_throw to always change its return address. - * jit/JITStubs.h: - Add ctiOpThrowNotCaught declaration. +2009-08-08 Oliver Hunt <oliver@apple.com> -2009-06-05 Gavin Barraclough <barraclough@apple.com> + Reviewed by Eric Seidel and Sam Weinig. - Rudder stamped by Sam Weinig. + [ES5] Implement Object.getPrototypeOf + https://bugs.webkit.org/show_bug.cgi?id=28114 - Add missing ASSERT. + Implement getPrototypeOf - * assembler/X86Assembler.h: - (JSC::X86Assembler::getRelocatedAddress): + * runtime/CommonIdentifiers.h: + * runtime/JSGlobalObject.cpp: + (JSC::JSGlobalObject::reset): + * runtime/ObjectConstructor.cpp: + (JSC::ObjectConstructor::ObjectConstructor): + (JSC::objectConsGetPrototypeOf): + * runtime/ObjectConstructor.h: -2009-06-05 Gavin Barraclough <barraclough@apple.com> +2009-08-07 Zoltan Horvath <hzoltan@inf.u-szeged.hu> - Reviewed by Sam Weinig. + Reviewed by Eric Seidel. - Switch storePtrWithPatch to take the initial immediate value as an argument. + Allow custom memory allocation control for Noncopyable class + https://bugs.webkit.org/show_bug.cgi?id=27879 - * assembler/MacroAssemblerX86.h: - (JSC::MacroAssemblerX86::storePtrWithPatch): - * assembler/MacroAssemblerX86_64.h: - (JSC::MacroAssemblerX86_64::storePtrWithPatch): - * jit/JITOpcodes.cpp: - (JSC::JIT::emit_op_jsr): + Several classes which are inherited from Noncopyable are instantiated by + operator new, so Noncopyable class has been inherited from FastAllocBase. -2009-06-05 Gavin Barraclough <barraclough@apple.com> + * wtf/Noncopyable.h: - Reviewed by Sam Weinig. +2009-08-07 George Staikos <george.staikos@torchmobile.com> - Remove patchLength..tByIdExternalLoadPrefix magic numbers from JIT.h. + Reviewed by Eric Seidel. - These aren't really suitable values to be tracking within common code - of the JIT, since they are not (and realistically cannot) be checked - by ASSERTs, as the other repatch offsets are. Move this functionality - (skipping the REX prefix when patching load instructions to LEAs on - x86-64) into the X86Assembler. + https://bugs.webkit.org/show_bug.cgi?id=27305 + Implement WinCE-specific unicode layer. + Written by George Staikos <george.staikos@torchmobile.com> + with bug fixes by Yong Li <yong.li@torchmobile.com> + refactored by Joe Mason <joe.mason@torchmobile.com> - * assembler/AbstractMacroAssembler.h: - (JSC::AbstractMacroAssembler::CodeLocationInstruction::repatchLoadPtrToLEA): - * assembler/X86Assembler.h: - (JSC::X86Assembler::repatchLoadPtrToLEA): - * jit/JIT.h: - * jit/JITPropertyAccess.cpp: - (JSC::JIT::patchGetByIdSelf): - (JSC::JIT::patchPutByIdReplace): + * wtf/Platform.h: + * wtf/unicode/Unicode.h: + * wtf/unicode/wince/UnicodeWince.cpp: Added. + (WTF::Unicode::toLower): + (WTF::Unicode::toUpper): + (WTF::Unicode::foldCase): + (WTF::Unicode::isPrintableChar): + (WTF::Unicode::isSpace): + (WTF::Unicode::isLetter): + (WTF::Unicode::isUpper): + (WTF::Unicode::isLower): + (WTF::Unicode::isDigit): + (WTF::Unicode::isPunct): + (WTF::Unicode::toTitleCase): + (WTF::Unicode::direction): + (WTF::Unicode::category): + (WTF::Unicode::decompositionType): + (WTF::Unicode::combiningClass): + (WTF::Unicode::mirroredChar): + (WTF::Unicode::digitValue): + * wtf/unicode/wince/UnicodeWince.h: Added. + (WTF::Unicode::): + (WTF::Unicode::isSeparatorSpace): + (WTF::Unicode::isHighSurrogate): + (WTF::Unicode::isLowSurrogate): + (WTF::Unicode::isArabicChar): + (WTF::Unicode::hasLineBreakingPropertyComplexContext): + (WTF::Unicode::umemcasecmp): + (WTF::Unicode::surrogateToUcs4): -2009-06-05 Shinichiro Hamaji <hamaji@chromium.org> +2009-08-07 Yongjun Zhang <yongjun.zhang@nokia.com> - Bug 26160: Compile fails in MacOSX when GNU fileutils are installed + Reviewed by Eric Seidel. - <https://bugs.webkit.org/show_bug.cgi?id=26160> + https://bugs.webkit.org/show_bug.cgi?id=28069 - Reviewed by Alexey Proskuryakov. + Add inline to help winscw compiler resolve specialized argument in + templated functions. - Use /bin/ln instead of ln for cases where this command is used with -h option. - As this option is not supported by GNU fileutils, this change helps users - who have GNU fileutils in their PATH. + * runtime/LiteralParser.cpp: + (JSC::LiteralParser::Lexer::lexString): - * JavaScriptCore.xcodeproj/project.pbxproj: +2009-08-07 Zoltan Horvath <hzoltan@inf.u-szeged.hu> -2009-06-05 Gavin Barraclough <barraclough@apple.com> + Reviewed by Eric Seidel. - Reviewed by Oliver Hunt. + Allow custom memory allocation control for RegExpObjectData struct + http://bugs.webkit.org/show_bug.cgi?id=26750 - Remove DoubleNotEqual floating point comparison condition for now - - it is not used, and it is unclear the semantics are correct (I think - this comparison would actually give you not-equal-or-unordered, which - might be what is wanted... we can revisit this interface & get it - right when required). + Inherits RegExpObjectData struct from FastAllocBase because + it has been instantiated by 'new' in JavaScriptCore/runtime/RegExpObject.cpp:62 - Also, fix asserts in branchArith32 ops. All adds & subs can check - for Signed, multiply only sets OF so can only check for overflow. + * runtime/RegExpObject.h: - * assembler/MacroAssemblerX86Common.h: - (JSC::MacroAssemblerX86Common::): - (JSC::MacroAssemblerX86Common::branchAdd32): - (JSC::MacroAssemblerX86Common::branchMul32): - (JSC::MacroAssemblerX86Common::branchSub32): +2009-08-06 Norbert Leser <norbert.leser@nokia.com> -2009-06-05 Gavin Barraclough <barraclough@apple.com> + Reviewed by Darin Adler. - Reviewed by Oliver Hunt. + Updated patch for bug #27059: + Symbian platform always uses little endian encoding, + regardless of compiler. + We need to make sure that we correctly detect EABI architecture + for armv5 targets on Symbian, + where __EABI__ is set but not __ARM_EABI__ - Minor tidy up in JITStubs. + * wtf/Platform.h: - * jit/JITStubs.cpp: - (JSC::StackHack::StackHack): - * jit/JITStubs.h: +2009-08-06 Adam Barth <abarth@webkit.org> -2009-06-05 Koen Kooi <koen@dominion.thruhere.net> + Unreviewed revert. - Reviewed by Xan Lopez. + http://bugs.webkit.org/show_bug.cgi?id=27879 - Build fix for glib unicode backend. + Revert 46877 because it broke GTK. - * wtf/unicode/glib/UnicodeMacrosFromICU.h: + * wtf/Noncopyable.h: -2009-06-05 Gavin Barraclough <barraclough@apple.com> +2009-08-06 Gavin Barraclough <barraclough@apple.com> Reviewed by Oliver Hunt. - 3 tiny cleanups: + Make get_by_id/put_by_id/method_check/call defer optimization using a data flag rather than a code modification. + ( https://bugs.webkit.org/show_bug.cgi?id=27635 ) - * assembler/MacroAssemblerX86.h: - * assembler/MacroAssemblerX86_64.h: - (JSC::MacroAssemblerX86_64::storePtrWithPatch): - store*() methods should take an ImplicitAddress, rather than an Address. - * assembler/X86Assembler.h: - Make patchPointer private. - * jit/JITOpcodes.cpp: - (JSC::JIT::emit_op_ret): - Remove empty line at end of function. + This improves performance of ENABLE(ASSEMBLER_WX_EXCLUSIVE) builds by 2-2.5%, reducing the overhead to about 2.5%. + (No performance impact with ASSEMBLER_WX_EXCLUSIVE disabled). -2009-06-05 Gavin Barraclough <barraclough@apple.com> + * bytecode/CodeBlock.cpp: + (JSC::printStructureStubInfo): + - Make StructureStubInfo store the type as an integer, rather than an OpcodeID. - Reviewed by Oliver Hunt. + * bytecode/CodeBlock.h: + (JSC::): + (JSC::CallLinkInfo::seenOnce): + (JSC::CallLinkInfo::setSeen): + (JSC::MethodCallLinkInfo::seenOnce): + (JSC::MethodCallLinkInfo::setSeen): + - Change a pointer in CallLinkInfo/MethodCallLinkInfo to use a PtrAndFlags, use a flag to track when an op has been executed once. - Encapsulate many uses of void* in the assembler & jit with types that provide - more semantic information. The new types are: - - * MacroAssemblerCodePtr - this wraps a pointer into JIT generated code. - * FunctionPtr - this wraps a pointer to a C/C++ function in JSC. - * ReturnAddressPtr - this wraps a return address resulting from a 'call' instruction. + * bytecode/StructureStubInfo.cpp: + (JSC::StructureStubInfo::deref): + - Make StructureStubInfo store the type as an integer, rather than an OpcodeID. - Wrapping these types allows for stronger type-checking than is possible with everything - represented a void*. For example, it is now enforced by the type system that near - calls can only be linked to JIT code and not to C functions in JSC (this was previously - required, but could not be enforced on the interface). + * bytecode/StructureStubInfo.h: + (JSC::StructureStubInfo::StructureStubInfo): + (JSC::StructureStubInfo::initGetByIdSelf): + (JSC::StructureStubInfo::initGetByIdProto): + (JSC::StructureStubInfo::initGetByIdChain): + (JSC::StructureStubInfo::initGetByIdSelfList): + (JSC::StructureStubInfo::initGetByIdProtoList): + (JSC::StructureStubInfo::initPutByIdTransition): + (JSC::StructureStubInfo::initPutByIdReplace): + (JSC::StructureStubInfo::seenOnce): + (JSC::StructureStubInfo::setSeen): + - Make StructureStubInfo store the type as an integer, rather than an OpcodeID, add a flag to track when an op has been executed once. + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitGetById): + (JSC::BytecodeGenerator::emitPutById): + - Make StructureStubInfo store the type as an integer, rather than an OpcodeID. - * assembler/AbstractMacroAssembler.h: - (JSC::AbstractMacroAssembler::CodeLocationCommon::CodeLocationCommon): - (JSC::AbstractMacroAssembler::CodeLocationCommon::dataLocation): - (JSC::AbstractMacroAssembler::CodeLocationCommon::executableAddress): - (JSC::AbstractMacroAssembler::CodeLocationCommon::reset): - (JSC::AbstractMacroAssembler::CodeLocationInstruction::repatchLoadToLEA): - (JSC::AbstractMacroAssembler::CodeLocationInstruction::CodeLocationInstruction): - (JSC::AbstractMacroAssembler::CodeLocationLabel::addressForSwitch): - (JSC::AbstractMacroAssembler::CodeLocationLabel::addressForExceptionHandler): - (JSC::AbstractMacroAssembler::CodeLocationLabel::addressForJSR): - (JSC::AbstractMacroAssembler::CodeLocationLabel::operator!): - (JSC::AbstractMacroAssembler::CodeLocationLabel::reset): - (JSC::AbstractMacroAssembler::CodeLocationLabel::CodeLocationLabel): - (JSC::AbstractMacroAssembler::CodeLocationLabel::getJumpDestination): - (JSC::AbstractMacroAssembler::CodeLocationJump::relink): - (JSC::AbstractMacroAssembler::CodeLocationJump::CodeLocationJump): - (JSC::AbstractMacroAssembler::CodeLocationCall::relink): - (JSC::AbstractMacroAssembler::CodeLocationCall::calleeReturnAddressValue): - (JSC::AbstractMacroAssembler::CodeLocationCall::CodeLocationCall): - (JSC::AbstractMacroAssembler::CodeLocationNearCall::relink): - (JSC::AbstractMacroAssembler::CodeLocationNearCall::calleeReturnAddressValue): - (JSC::AbstractMacroAssembler::CodeLocationNearCall::CodeLocationNearCall): - (JSC::AbstractMacroAssembler::CodeLocationDataLabel32::repatch): - (JSC::AbstractMacroAssembler::CodeLocationDataLabel32::CodeLocationDataLabel32): - (JSC::AbstractMacroAssembler::CodeLocationDataLabelPtr::repatch): - (JSC::AbstractMacroAssembler::CodeLocationDataLabelPtr::CodeLocationDataLabelPtr): - (JSC::AbstractMacroAssembler::ProcessorReturnAddress::relinkCallerToTrampoline): - (JSC::AbstractMacroAssembler::ProcessorReturnAddress::relinkCallerToFunction): - (JSC::AbstractMacroAssembler::ProcessorReturnAddress::relinkNearCallerToTrampoline): - (JSC::AbstractMacroAssembler::ProcessorReturnAddress::addressForLookup): - (JSC::AbstractMacroAssembler::trampolineAt): - (JSC::AbstractMacroAssembler::PatchBuffer::link): - (JSC::AbstractMacroAssembler::PatchBuffer::performFinalization): - (JSC::::CodeLocationCommon::instructionAtOffset): - (JSC::::CodeLocationCommon::labelAtOffset): - (JSC::::CodeLocationCommon::jumpAtOffset): - (JSC::::CodeLocationCommon::callAtOffset): - (JSC::::CodeLocationCommon::nearCallAtOffset): - (JSC::::CodeLocationCommon::dataLabelPtrAtOffset): - (JSC::::CodeLocationCommon::dataLabel32AtOffset): - * assembler/MacroAssemblerCodeRef.h: - (JSC::FunctionPtr::FunctionPtr): - (JSC::FunctionPtr::value): - (JSC::FunctionPtr::executableAddress): - (JSC::ReturnAddressPtr::ReturnAddressPtr): - (JSC::ReturnAddressPtr::value): - (JSC::MacroAssemblerCodePtr::MacroAssemblerCodePtr): - (JSC::MacroAssemblerCodePtr::executableAddress): - (JSC::MacroAssemblerCodePtr::dataLocation): - (JSC::MacroAssemblerCodeRef::MacroAssemblerCodeRef): - * assembler/X86Assembler.h: - (JSC::X86Assembler::patchPointerForCall): * jit/JIT.cpp: - (JSC::ctiPatchNearCallByReturnAddress): - (JSC::ctiPatchCallByReturnAddress): - (JSC::JIT::privateCompile): (JSC::JIT::privateCompileCTIMachineTrampolines): + (JSC::JIT::unlinkCall): + - Remove the "don't lazy link" stage of calls. + * jit/JIT.h: (JSC::JIT::compileCTIMachineTrampolines): + - Remove the "don't lazy link" stage of calls. + * jit/JITCall.cpp: - (JSC::JIT::compileOpCall): - * jit/JITCode.h: - (JSC::JITCode::operator !): - (JSC::JITCode::addressForCall): - (JSC::JITCode::offsetOf): - (JSC::JITCode::execute): - (JSC::JITCode::size): - (JSC::JITCode::HostFunction): - * jit/JITInlineMethods.h: - (JSC::JIT::emitNakedCall): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::privateCompilePutByIdTransition): - (JSC::JIT::patchGetByIdSelf): - (JSC::JIT::patchPutByIdReplace): - (JSC::JIT::privateCompilePatchGetArrayLength): - (JSC::JIT::privateCompileGetByIdProto): - (JSC::JIT::privateCompileGetByIdChain): + (JSC::JIT::compileOpCallSlowCase): + - Remove the "don't lazy link" stage of calls. + * jit/JITStubs.cpp: (JSC::JITThunks::JITThunks): (JSC::JITThunks::tryCachePutByID): (JSC::JITThunks::tryCacheGetByID): (JSC::JITStubs::DEFINE_STUB_FUNCTION): + (JSC::JITStubs::getPolymorphicAccessStructureListSlot): + - Remove the "don't lazy link" stage of calls, and the "_second" stage of get_by_id/put_by_id/method_check. + * jit/JITStubs.h: - (JSC::JITThunks::ctiArrayLengthTrampoline): (JSC::JITThunks::ctiStringLengthTrampoline): - (JSC::JITThunks::ctiVirtualCallPreLink): - (JSC::JITThunks::ctiVirtualCallLink): - (JSC::JITThunks::ctiVirtualCall): - (JSC::JITThunks::ctiNativeCallThunk): - * yarr/RegexJIT.h: - (JSC::Yarr::RegexCodeBlock::operator!): - (JSC::Yarr::RegexCodeBlock::execute): - -2009-06-05 Antti Koivisto <antti@apple.com> - - Try to unbreak Windows build. + (JSC::JITStubs::): + - Remove the "don't lazy link" stage of calls, and the "_second" stage of get_by_id/put_by_id/method_check. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + * wtf/PtrAndFlags.h: + (WTF::PtrAndFlags::PtrAndFlags): + (WTF::PtrAndFlags::operator!): + (WTF::PtrAndFlags::operator->): + - Add ! and -> operators, add constuctor with pointer argument. -2009-06-03 Antti Koivisto <antti@apple.com> +2009-08-06 Zoltan Horvath <hzoltan@inf.u-szeged.hu> - Reviewed by Dave Kilzer. - - https://bugs.webkit.org/show_bug.cgi?id=13128 - Safari not obeying cache header - - Export JSC::parseDate() + Reviewed by Adam Barth. - * JavaScriptCore.exp: - * JavaScriptCore.xcodeproj/project.pbxproj: + Allow custom memory allocation control for Noncopyable class + https://bugs.webkit.org/show_bug.cgi?id=27879 -2009-06-04 Oliver Hunt <oliver@apple.com> + Several classes which inherited from Noncopyable are instantiated by + operator new, so Noncopyable class has been inherited from FastAllocBase. - Reviewed by Gavin Barraclough. - - Bug in property caching of getters and setters. - - Make sure that the transition logic accounts for getters and setters. - If we don't we end up screwing up the transition tables so that some - transitions will start incorrectly believing that they need to check - for getters and setters. + * wtf/Noncopyable.h: - * runtime/JSObject.cpp: - (JSC::JSObject::defineGetter): - (JSC::JSObject::defineSetter): - * runtime/JSObject.h: - (JSC::): - * runtime/Structure.h: +2009-08-06 Mark Rowe <mrowe@apple.com> -2009-06-04 Gavin Barraclough <barraclough@apple.com> + Rubber-stamped by Sam Weinig. - Reviewed by Sam Weinig. + Add explicit dependencies for our build verification scripts to ensure that they always run after linking has completed. - Minor tweak to PatchBuffer, change it so it no longer holds a CodeRef, and instead - holds a separate code pointer and executable pool. Since it now always holds its - own copy of the code size, and to simplify the construction sequence, it's neater - this way. + * JavaScriptCore.xcodeproj/project.pbxproj: - * assembler/AbstractMacroAssembler.h: - (JSC::AbstractMacroAssembler::PatchBuffer::PatchBuffer): - (JSC::AbstractMacroAssembler::PatchBuffer::finalizeCode): - (JSC::AbstractMacroAssembler::PatchBuffer::code): - (JSC::AbstractMacroAssembler::PatchBuffer::performFinalization): +2009-08-06 Mark Rowe <mrowe@apple.com> -2009-06-04 Gavin Barraclough <barraclough@apple.com> + Bring a little order to our otherwise out of control lives. - Reviewed by Oliver Hunt. + * JavaScriptCore.xcodeproj/project.pbxproj: - Remove 'JIT_STUB_ARGUMENT_STACK' this is unused and untested. +2009-08-06 Zoltan Horvath <hzoltan@inf.u-szeged.hu> - This just leaves JIT_STUB_ARGUMENT_REGISTER and JIT_STUB_ARGUMENT_VA_LIST. - Since JIT_STUB_ARGUMENT_REGISTER is the sensible configuration on most platforms, - remove this define and make this the default behaviour. - Platforms must now define JIT_STUB_ARGUMENT_VA_LIST to get crazy va_list voodoo, - if they so desire. + Reviewed by Darin Adler. - (Refactoring of #ifdefs only, no functional change, no performance impact.) + Allow custom memory allocation control for JavaScriptCore's PolymorphicAccessStructureList struct + https://bugs.webkit.org/show_bug.cgi?id=27877 - * jit/JIT.h: - * jit/JITInlineMethods.h: - (JSC::JIT::restoreArgumentReference): - (JSC::JIT::restoreArgumentReferenceForTrampoline): - * jit/JITStubs.cpp: - (JSC::): - * jit/JITStubs.h: - * wtf/Platform.h: + Inherits PolymorphicAccessStructureList struct from FastAllocBase because it has been instantiated by + 'new' in JavaScriptCore/jit/JITStubs.cpp:1229. -2009-06-04 Gavin Barraclough <barraclough@apple.com> + * bytecode/Instruction.h: - Rubber stamped by Sam Weinig. +2009-08-05 Zoltan Horvath <hzoltan@inf.u-szeged.hu> - * jit/JITArithmetic.cpp: - Remove some redundant typedefs, unused since arithmetic was added to the MacroAssembler interface. + Reviewed by Darin Adler. -2009-06-04 Brent Fulgham <bfulgham@webkit.org> + Allow custom memory allocation control for JavaScriptCore's ScopeNodeData struct + https://bugs.webkit.org/show_bug.cgi?id=27875 - Build fix due to header include problem. + Inherits ScopeNodeData struct from FastAllocBase because it has been instantiated by + 'new' in JavaScriptCore/parser/Nodes.cpp:1848. - * interpreter/Interpreter.h: Remove wtf from includes so that - compile can find the headers in expected places. + * parser/Nodes.h: -2009-06-04 Zoltan Horvath <hzoltan@inf.u-szeged.hu> +2009-08-05 Zoltan Herczeg <zherczeg@inf.u-szeged.hu> - Reviewed by Darin Adler. + Reviewed by Gavin Barraclough. - HashTable class (JavaScriptCore/wtf/HashTable.h) doesn't instantiated by 'new', so - inheritance was removed. HashTable struct has been instantiated by operator new in - JSGlobalData.cpp:106. - HashTable couldn't inherited from FastAllocBase since struct with inheritance is - no longer POD, so HashTable struct has been instantiated by fastNew, destroyed by - fastDelete. + Add floating point support for generic ARM port. + https://bugs.webkit.org/show_bug.cgi?id=24986 + + * assembler/ARMAssembler.cpp: + (JSC::ARMAssembler::doubleTransfer): + * assembler/ARMAssembler.h: + (JSC::ARM::): + (JSC::ARMAssembler::): + (JSC::ARMAssembler::faddd_r): + (JSC::ARMAssembler::fsubd_r): + (JSC::ARMAssembler::fmuld_r): + (JSC::ARMAssembler::fcmpd_r): + (JSC::ARMAssembler::fdtr_u): + (JSC::ARMAssembler::fdtr_d): + (JSC::ARMAssembler::fmsr_r): + (JSC::ARMAssembler::fsitod_r): + (JSC::ARMAssembler::fmstat): + * assembler/MacroAssemblerARM.h: + (JSC::MacroAssemblerARM::): + (JSC::MacroAssemblerARM::supportsFloatingPoint): + (JSC::MacroAssemblerARM::loadDouble): + (JSC::MacroAssemblerARM::storeDouble): + (JSC::MacroAssemblerARM::addDouble): + (JSC::MacroAssemblerARM::subDouble): + (JSC::MacroAssemblerARM::mulDouble): + (JSC::MacroAssemblerARM::convertInt32ToDouble): + (JSC::MacroAssemblerARM::branchDouble): + * jit/JIT.h: - * interpreter/Interpreter.h: - * runtime/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): - (JSC::JSGlobalData::~JSGlobalData): - * wtf/HashTable.h: +2009-08-05 Zoltan Herczeg <zherczeg@inf.u-szeged.hu> -2009-06-04 Gavin Barraclough <barraclough@apple.com> + Reviewed by Gavin Barraclough. - Reviewed by Oliver Hunt. + Add JIT support for generic ARM port without optimizations. + https://bugs.webkit.org/show_bug.cgi?id=24986 - Wrap the code that plants pushes/pops planted by JIT in explanatorily named - methods; move property storage reallocation into a standard stub function. + All JIT optimizations are disabled. - ~No performance impact (possible <1% progression on x86-64, likely just noise). + Signed off by Zoltan Herczeg <zherczeg@inf.u-szeged.hu> + Signed off by Gabor Loki <loki@inf.u-szeged.hu> - * jit/JIT.cpp: - (JSC::JIT::privateCompile): - (JSC::JIT::privateCompileCTIMachineTrampolines): - Wrap calls to push/pop. + * assembler/ARMAssembler.cpp: + (JSC::ARMAssembler::baseIndexTransfer32): + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::Imm32::Imm32): + * assembler/MacroAssemblerARM.h: + (JSC::MacroAssemblerARM::store32): + (JSC::MacroAssemblerARM::move): + (JSC::MacroAssemblerARM::branch32): + (JSC::MacroAssemblerARM::add32): + (JSC::MacroAssemblerARM::sub32): + (JSC::MacroAssemblerARM::load32): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::getBytecodeIndex): * jit/JIT.h: - Declare the new wrapper methods. * jit/JITInlineMethods.h: - (JSC::JIT::preverveReturnAddressAfterCall): - (JSC::JIT::restoreReturnAddressBeforeReturn): - Define the new wrapper methods. + (JSC::JIT::restoreArgumentReference): * jit/JITOpcodes.cpp: - (JSC::JIT::emit_op_end): - (JSC::JIT::emit_op_ret): - Wrap calls to push/pop. - * jit/JITPropertyAccess.cpp: - (JSC::JIT::privateCompilePutByIdTransition): - Move property storage reallocation into a standard stub function. * jit/JITStubs.cpp: - (JSC::JITStubs::DEFINE_STUB_FUNCTION): * jit/JITStubs.h: - (JSC::JITStubs::): - -2009-06-04 Laszlo Gombos <laszlo.1.gombos@nokia.com> - - Reviewed by Ariya Hidayat. - - [Qt] Single-threaded QtWebKit configuration - <https://bugs.webkit.org/show_bug.cgi?id=26015> - - * JavaScriptCore.pri: Use ThreadingNone.cpp instead of - ThreadingQt.cpp and make sure ENABLE_JSC_MULTIPLE_THREADS is turned off - when ENABLE_SINGLE_THREADED is tuned on - * wtf/ThreadingNone.cpp: - (WTF::ThreadCondition::wait): Fix compilation warning. - (WTF::ThreadCondition::timedWait): Ditto. - -2009-06-02 Mark Rowe <mrowe@apple.com> - - Reviewed by Anders Carlsson. - - Remove workaround that was added to address <rdar://problem/5488678> as it no longer affects our Tiger builds. - - * Configurations/Base.xcconfig: - -2009-06-02 Xan Lopez <xlopez@igalia.com> - - Reviewed by Sam Weinig. - - Use C-style comments in Platform.h so it can be included from C - files. - + (JSC::JITStackFrame::returnAddressSlot): * wtf/Platform.h: -2009-06-02 Tor Arne Vestbø <tor.arne.vestbo@nokia.com> - - Rubber-stamped by Simon Hausmann. - - Use File::Spec->tmpdir instead of hardcoded paths for tempfile() dir - - This fixes the Windows-build if the user does not have a /tmp directory. - - * pcre/dftables: +2009-08-04 Gavin Barraclough <barraclough@apple.com> -2009-06-02 Gavin Barraclough <barraclough@apple.com> + Rubber Stamped by Oiver Hunt. - Reviewed by Oliver ">>" Hunt. + Revert r46643 since this breaks the Yarr::Interpreter running the v8 tests. + https://bugs.webkit.org/show_bug.cgi?id=27874 - emitSlow_op_rshift is linking the wrong number of slow cases, if !supportsFloatingPoint(). - Fixerate, and refactor/comment the code a little to make it clearer what is going on. + * yarr/RegexInterpreter.cpp: + (JSC::Yarr::Interpreter::allocDisjunctionContext): + (JSC::Yarr::Interpreter::freeDisjunctionContext): + (JSC::Yarr::Interpreter::allocParenthesesDisjunctionContext): + (JSC::Yarr::Interpreter::freeParenthesesDisjunctionContext): - * jit/JITArithmetic.cpp: - (JSC::JIT::emit_op_rshift): - (JSC::JIT::emitSlow_op_rshift): +2009-08-04 Oliver Hunt <oliver@apple.com> -2009-06-01 Gavin Barraclough <barraclough@apple.com> + Reviewed by NOBODY (build fix). - Reviewed by NOBODY - speculative windows build fix (errm, for the other patch!). + PPC64 Build fix - * jit/JITStubs.cpp: - (JSC::): + * wtf/Platform.h: -2009-06-01 Gavin Barraclough <barraclough@apple.com> +2009-08-04 Benjamin C Meyer <benjamin.meyer@torchmobile.com> - Reviewed by NOBODY - speculative windows build fix. + Reviewed by Adam Treat - * assembler/AbstractMacroAssembler.h: - (JSC::::CodeLocationCall::CodeLocationCall): - (JSC::::CodeLocationNearCall::CodeLocationNearCall): - -2009-06-01 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Olliej Hunt. - - Change JITStub functions from being static members on the JITStub class to be - global extern "C" functions, and switch their the function signature declaration - in the definition of the functions to be C-macro generated. This makes it easier - to work with the stub functions from assembler code (since the names no longer - require mangling), and by delaring the functions with a macro we can look at - also auto-generating asm thunks to wrap the JITStub functions to perform the - work currently in 'restoreArgumentReference' (as a memory saving). - - Making this change also forces us to be a bit more realistic about what is private - on the Register and CallFrame objects. Presently most everything on these classes - is private, and the classes have plenty of friends. We could befriend all the - global functions to perpetuate the delusion of encapsulation, but using friends is - a bit of a sledgehammer solution here - since friends can poke around with all of - the class's privates, and since all the major classes taht operate on Regsiters are - currently friends, right there is currently in practice very little protection at - all. Better to start removing friend delclarations, and exposing just the parts - that need to be exposed. + Explicitly include limits.h header when using INT_MAX and INT_MIN - * interpreter/CallFrame.h: - (JSC::ExecState::returnPC): - (JSC::ExecState::setCallerFrame): - (JSC::ExecState::returnValueRegister): - (JSC::ExecState::setArgumentCount): - (JSC::ExecState::setCallee): - (JSC::ExecState::setCodeBlock): - * interpreter/Interpreter.h: - * interpreter/Register.h: - (JSC::Register::Register): - (JSC::Register::i): - * jit/JITStubs.cpp: - (JSC::): - (JSC::JITThunks::JITThunks): - (JSC::JITThunks::tryCachePutByID): - (JSC::JITThunks::tryCacheGetByID): - (JSC::JITStubs::DEFINE_STUB_FUNCTION): - * jit/JITStubs.h: - (JSC::JITStubs::): - * runtime/JSFunction.h: - (JSC::JSFunction::nativeFunction): - (JSC::JSFunction::classInfo): - * runtime/JSGlobalData.h: + * interpreter/Interpreter.cpp -2009-06-01 Oliver Hunt <oliver@apple.com> +2009-08-03 Harald Fernengel <harald.fernengel@nokia.com> - Reviewed by Gavin Barraclough. + Reviewed by Darin Adler. - Tidy up the literal parser. + Fix compile error for ambigous call to abs() + https://bugs.webkit.org/show_bug.cgi?id=27873 - Make the number lexing in the LiteralParser exactly match the JSON spec, which - makes us cover more cases, but also more strict. Also made string lexing only - allow double-quoted strings. + Fix ambiguity in abs(long int) call by calling labs() instead - * runtime/LiteralParser.cpp: - (JSC::LiteralParser::Lexer::lex): - (JSC::LiteralParser::Lexer::lexString): - (JSC::LiteralParser::Lexer::lexNumber): + * wtf/DateMath.cpp: replace call to abs() with labs() -2009-06-01 Gavin Barraclough <barraclough@apple.com> +2009-08-03 Laszlo Gombos <laszlo.1.gombos@nokia.com> - Reviewed by Sam "WX" Weinig. + Reviewed by Eric Seidel. - Allow the JIT to operate without relying on use of RWX memory, on platforms where this is supported. + [Qt] Consolidate common gcc flags to WebKit.pri + https://bugs.webkit.org/show_bug.cgi?id=27934 - This patch adds a switch to Platform.h (ENABLE_ASSEMBLER_WX_EXCLUSIVE) which enables this mode of operation. - When this flag is set, all executable memory will be allocated RX, and switched to RW only whilst being - modified. Upon completion of code generation the protection is switched back to RX to allow execution. + * JavaScriptCore.pro: - Further optimization will be required before it is desirable to enable this mode of operation by default; - enabling this presently incurs a 5%-10% regression. +2009-08-03 Ada Chan <adachan@apple.com> - (Submitting disabled - no performance impact). + Fixed the Tiger build. - * assembler/AbstractMacroAssembler.h: - (JSC::AbstractMacroAssembler::CodeLocationInstruction::repatchLoadToLEA): - (JSC::AbstractMacroAssembler::CodeLocationLabel::fromFunctionPointer): - (JSC::AbstractMacroAssembler::CodeLocationJump::relink): - (JSC::AbstractMacroAssembler::CodeLocationCall::relink): - (JSC::AbstractMacroAssembler::CodeLocationNearCall::relink): - (JSC::AbstractMacroAssembler::CodeLocationDataLabel32::repatch): - (JSC::AbstractMacroAssembler::CodeLocationDataLabelPtr::repatch): - (JSC::AbstractMacroAssembler::ProcessorReturnAddress::relinkCallerToTrampoline): - (JSC::AbstractMacroAssembler::ProcessorReturnAddress::relinkCallerToFunction): - (JSC::AbstractMacroAssembler::ProcessorReturnAddress::relinkNearCallerToTrampoline): - (JSC::AbstractMacroAssembler::ProcessorReturnAddress::relinkNearCallerToFunction): - (JSC::AbstractMacroAssembler::PatchBuffer::PatchBuffer): - (JSC::AbstractMacroAssembler::PatchBuffer::~PatchBuffer): - (JSC::AbstractMacroAssembler::PatchBuffer::link): - (JSC::AbstractMacroAssembler::PatchBuffer::patch): - (JSC::AbstractMacroAssembler::PatchBuffer::performFinalization): - (JSC::::CodeLocationCommon::nearCallAtOffset): - (JSC::::CodeLocationCall::CodeLocationCall): - (JSC::::CodeLocationNearCall::CodeLocationNearCall): - * assembler/AssemblerBuffer.h: - (JSC::AssemblerBuffer::executableCopy): - * assembler/X86Assembler.h: - (JSC::CAN_SIGN_EXTEND_U32_64): - (JSC::X86Assembler::linkJump): - (JSC::X86Assembler::linkCall): - (JSC::X86Assembler::patchPointer): - (JSC::X86Assembler::relinkJump): - (JSC::X86Assembler::relinkCall): - (JSC::X86Assembler::repatchInt32): - (JSC::X86Assembler::repatchPointer): - (JSC::X86Assembler::repatchLoadToLEA): - (JSC::X86Assembler::patchInt32): - (JSC::X86Assembler::patchRel32): - * jit/ExecutableAllocator.h: - (JSC::ExecutableAllocator::): - (JSC::ExecutableAllocator::makeWritable): - (JSC::ExecutableAllocator::makeExecutable): - * jit/ExecutableAllocatorFixedVMPool.cpp: - (JSC::FixedVMPoolAllocator::FixedVMPoolAllocator): - * jit/ExecutableAllocatorPosix.cpp: - (JSC::ExecutablePool::systemAlloc): - (JSC::ExecutablePool::systemRelease): - (JSC::ExecutableAllocator::reprotectRegion): - * jit/ExecutableAllocatorWin.cpp: - * jit/JITPropertyAccess.cpp: - (JSC::JIT::patchGetByIdSelf): - (JSC::JIT::patchPutByIdReplace): - * wtf/Platform.h: + * wtf/FastMalloc.cpp: -2009-05-29 Zoltan Horvath <hzoltan@inf.u-szeged.hu> +2009-08-03 Ada Chan <adachan@apple.com> Reviewed by Darin Adler. - Inherits Interpreter class from FastAllocBase because it has been - instantiated by 'new' in JavaScriptCore/runtime/JSGlobalData.cpp. - - * interpreter/Interpreter.h: - -2009-06-01 David Levin <levin@chromium.org> + Don't use background thread to scavenge memory on Tiger until we figure out why it causes a crash. + https://bugs.webkit.org/show_bug.cgi?id=27900 - Reviewed by NOBODY (windows build fix). - - Add exports for windows (corresponding to the JavaScriptCore.exp modification - in the previous change). - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + * wtf/FastMalloc.cpp: -2009-06-01 David Levin <levin@chromium.org> +2009-08-03 Fumitoshi Ukai <ukai@chromium.org> - Reviewed by Darin Alder and Maciej Stachowiak. + Reviewed by Jan Alonzo. - Bug 26057: StringImpl should share buffers with UString. - https://bugs.webkit.org/show_bug.cgi?id=26057 + Fix build break on Gtk/x86_64. + https://bugs.webkit.org/show_bug.cgi?id=27936 - * JavaScriptCore.exp: - * runtime/UString.cpp: - (JSC::UString::Rep::create): - (JSC::UString::BaseString::sharedBuffer): Only do the sharing when - the buffer exceeds a certain size. The size was tuned by running - various dom benchmarks with numbers ranging from 20 to 800 and finding - a place that seemed to do the best overall. - * runtime/UString.h: + Use JSVALUE64 for X86_64 LINUX, except Qt. -2009-05-31 Gavin Barraclough <barraclough@apple.com> + * wtf/Platform.h: - Reviewed by Olliej "you just need to change NativeFunctionWrapper.h" Hunt. +2009-08-02 Xan Lopez <xlopez@igalia.com> - Add ENABLE_JIT_OPTIMIZE_NATIVE_CALL switch to allow JIT to operate without native call optimizations. + Fix the GTK+ build. - * runtime/NativeFunctionWrapper.h: * wtf/Platform.h: -2009-05-30 Darin Adler <darin@apple.com> +2009-08-02 Geoffrey Garen <ggaren@apple.com> Reviewed by Sam Weinig. - <rdar://problem/6935193> REGRESSION (r42734): Celtic Kane JavaScript benchmark does not run: - "Maximum call stack size exceeded" - - * runtime/ArrayPrototype.cpp: - (JSC::arrayProtoFuncToString): Use the same recursion limit as the other recursion checks. - We need a limit of at least 100 to run the benchmark above. - (JSC::arrayProtoFuncToLocaleString): Ditto. - (JSC::arrayProtoFuncJoin): Ditto. - -2009-05-28 Dirk Schulze <krit@webkit.org> - - Reviewed by Nikolas Zimmermann. + Disabled JSVALUE32_64 on Qt builds, since all layout tests mysteriously + crash with it enabled. - Added new build flag --filters for Mac. More details in WebCore/ChangeLog. - - * Configurations/FeatureDefines.xcconfig: - -2009-05-27 Oliver Hunt <oliver@apple.com> - - Reviewed by Mark Rowe. - - <rdar://problem/6928025> Stack overflow in JSC::stringProtoFuncReplace() running jsFunFuzz + * wtf/Platform.h: - We should always check for exceptions after creating a CachedCall, this wasn't being done in - the string replace logic. +2009-08-02 Geoffrey Garen <ggaren@apple.com> - * runtime/StringPrototype.cpp: - (JSC::stringProtoFuncReplace): + Qt build fix. -2009-05-27 Gustavo Noronha Silva <gustavo.noronha@collabora.co.uk> + Added JSAPIValueWrapper.cpp to the build. - Unreviewed (make distcheck) build fix; adding missing headers. + * JavaScriptCore.pri: - * GNUmakefile.am: +2009-08-02 Geoffrey Garen <ggaren@apple.com> -2009-05-27 Jessie Berlin <jberlin@apple.com> + Windows build fix. - Reviewed by Adam Roben - - Fix the Windows build. + Exported symbols for JSAPIValueWrapper. * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: -2009-05-27 Fridrich Strba <fridrich.strba@bluewin.ch> +2009-08-02 Geoffrey Garen <ggaren@apple.com> - Reviewed by Gustavo Noronha. + GTK build fix. - When building on Windows, consider Windows specific files. + * jit/JITStubs.cpp: #include <stdarg.h>, for a definition of va_start. - * GNUmakefile.am: +2009-08-02 Geoffrey Garen <ggaren@apple.com> -2009-05-27 Fridrich Strba <fridrich.strba@bluewin.ch> + Qt build fix. + + * runtime/Collector.cpp: #include <limits.h>, for a definition of ULONG_MAX. - Reviewed by Maciej Stachowiak. +2009-08-02 Geoffrey Garen <ggaren@apple.com> - When building with MinGW, don't use the __declspec(dl{import,export}) - decorations and rely on the linker to use its nifty auto-import feature. - It is extremely hard to get the decorations right with MinGW in general - and impossible in WebKit, where the resulting shared library is linking - together some static libraries. + Windows build fix: Nixed JSImmediate::prototype, JSImmediate::toObject, + and JSImmediate::toThisObject, and removed their exported symbols. - * config.h: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + * runtime/JSImmediate.cpp: + * runtime/JSImmediate.h: -2009-05-26 Holger Hans Peter Freyther <zecke@selfish.org> +2009-08-02 Geoffrey Garen <ggaren@apple.com> - Reviewed by Xan Lopez. + Reviewed by Mark Rowe. - https://bugs.webkit.org/show_bug.cgi?id=25613 + Enabled JSVALUE32_64 by default on all platforms other than x86_64 (which uses JSVALUE64). - Be able to use GOwnPtr for GHashTable as well. The assumption - is that the hash table has been created with g_hash_table_new_full - and has proper destruction functions. + * wtf/Platform.h: - * wtf/GOwnPtr.cpp: - (WTF::GHashTable): - * wtf/GOwnPtr.h: +2009-08-02 Kevin Ollivier <kevino@theolliviers.com> -2009-05-26 Oliver Hunt <oliver@apple.com> + Reviewed by Jan Alonzo. - Reviewed by Gavin Barraclough. + Script for building the JavaScriptCore library for wx. + https://bugs.webkit.org/show_bug.cgi?id=27619 - <rdar://problem/6924033> REGRESSION: Assertion failure due to forward references + * wscript: Added. - Add a pattern type for forward references to ensure that we don't confuse the - quantifier alternatives assertion. +2009-08-02 Yong Li <yong.li@torchmobile.com> - * yarr/RegexCompiler.cpp: - (JSC::Yarr::RegexPatternConstructor::atomBackReference): - (JSC::Yarr::RegexPatternConstructor::setupAlternativeOffsets): - * yarr/RegexInterpreter.cpp: - (JSC::Yarr::ByteCompiler::emitDisjunction): - * yarr/RegexJIT.cpp: - (JSC::Yarr::RegexGenerator::generateTerm): - * yarr/RegexPattern.h: - (JSC::Yarr::PatternTerm::): - (JSC::Yarr::PatternTerm::PatternTerm): - (JSC::Yarr::PatternTerm::ForwardReference): + Reviewed by George Staikos. -2009-05-26 Gavin Barraclough <barraclough@apple.com> + DateMath depends on strftime and localtime, which need to be imported manually on WinCE + https://bugs.webkit.org/show_bug.cgi?id=26558 - Reviewed by Oliver Hunt. + * wtf/DateMath.cpp: - Fix for: <rdar://problem/6918095> REGRESSION: jQuery load() issue (25981), - and also an ASSERT failure on http://ihasahotdog.com/. +2009-08-01 David Kilzer <ddkilzer@apple.com> - When overwriting a property on a dictionary with a cached specific value, - clear the cache if new value being written is different. + wtf/Threading.h: added include of Platform.h - * JavaScriptCore.exp: - Export the new symbols. - * jit/JITStubs.cpp: - (JSC::JITStubs::cti_op_get_by_id_method_check_second): - Close dictionary prototypes upon caching a method access, as would happen when caching - a regular get_by_id. - * runtime/JSObject.h: - (JSC::JSObject::propertyStorage): - (JSC::JSObject::locationForOffset): - Make these methods private. - (JSC::JSObject::putDirectInternal): - When overwriting a property on a dictionary with a cached specific value, - clear the cache if new value being written is different. - * runtime/Structure.cpp: - (JSC::Structure::despecifyDictionaryFunction): - Reset the specific value field for a given property in a dictionary. - (JSC::Structure::despecifyFunctionTransition): - Rename of 'changeFunctionTransition' (this was already internally refered to as a despecification). - * runtime/Structure.h: - Declare new method. + Reviewed by Mark Rowe. -2009-05-26 Gavin Barraclough <barraclough@apple.com> + * wtf/Threading.h: Added #include "Platform.h" since this header + uses PLATFORM() and other macros. - Reviewed by Oliver "pieces of eight" Hunt. +2009-08-01 Mark Rowe <mrowe@apple.com> - When reseting RegexPattern class, should fully reset the class, not just bits of it. - In particular, we delete the cached character classes (for wordchars, etc), but do - not reset the set of pointers to the cached classes. In the case of a repeated parse - due to an illegal back-reference we will continue to use the deleted character class. + Rubber-stamped by Oliver Hunt. - * yarr/RegexPattern.h: - (JSC::Yarr::RegexPattern::reset): + Roll out r46668 as it was misinformed. ScopeChain is only used with placement new. -2009-05-26 Brent Fulgham <bfulgham@webkit.org> + * runtime/ScopeChain.h: - Build fix to correct r44161. +2009-08-01 Zoltan Horvath <hzoltan@inf.u-szeged.hu> - * wtf/FastAllocBase.h: + Allow custom memory allocation control for JavaScriptCore's HashMap class + http://bugs.webkit.org/show_bug.cgi?id=27871 -2009-05-26 Zoltan Horvath <horvath.zoltan.6@stud.u-szeged.hu> + Inherits HashMap class from FastAllocBase because it has been + instantiated by 'new' in JavaScriptCore/API/JSClassRef.cpp:148. - Reviewed by Maciej Stachowiak. + * wtf/RefPtrHashMap.h: + (WTF::): - Inherite HashTable from FastAllocBase, because it has been instantiated by - 'new' in JavaScriptCore/runtime/JSGlobalData.cpp. +2009-08-01 Zoltan Horvath <hzoltan@inf.u-szeged.hu> - * wtf/HashTable.h: - * wtf/FastAllocBase.h: Remove 'wtf' path from TypeTraits.h to allow use outside of wtf. + Allow custom memory allocation control for JavaScriptCore's ScopeChain class + https://bugs.webkit.org/show_bug.cgi?id=27834 -2009-05-25 David Levin <levin@chromium.org> + Inherits ScopeChain class from FastAllocBase because it has been + instantiated by 'new' in JavaScriptCore/runtime/JSFunction.h:109. - Reviewed by Maciej Stachowiak and Oliver Hunt. + * runtime/ScopeChain.h: - https://bugs.webkit.org/show_bug.cgi?id=25126 - Allow the buffer underlying UString to be shared. +2009-08-01 Zoltan Horvath <hzoltan@inf.u-szeged.hu> - In order to not grow the underlying size of any structure, - there is a union in the Rep string which holds - + m_sharedBuffer -- a pointer to the shared ref counted buffer - if the class is BaseString and the buffer is being shared OR - + m_baseString -- the BaseString if the class is only UString::Rep - but not a UString::BaseString + Reviewed by Darin Adler. - Ideally, m_sharedBuffer would be a RefPtr, but it cannot be because - it is in a union. + Allow custom memory allocation control for JavaScriptCore's RegExpConstructorPrivate struct + https://bugs.webkit.org/show_bug.cgi?id=27833 - No change in sunspider perf. + Inherits RegExpConstructorPrivate class from FastAllocBase because it has been + instantiated by 'new' in JavaScriptCore/runtime/RegExpConstructor.cpp:152. - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * runtime/UString.cpp: - (JSC::UString::Rep::share): - (JSC::UString::Rep::destroy): - (JSC::UString::BaseString::sharedBuffer): - (JSC::UString::BaseString::setSharedBuffer): - (JSC::UString::BaseString::slowIsBufferReadOnly): - (JSC::expandCapacity): - (JSC::UString::Rep::reserveCapacity): - (JSC::UString::expandPreCapacity): - (JSC::concatenate): - (JSC::UString::append): - * runtime/UString.h: - (JSC::UString::Rep::Rep): - (JSC::UString::Rep::): - (JSC::UString::BaseString::isShared): - (JSC::UString::BaseString::isBufferReadOnly): - (JSC::UString::Rep::baseString): - * wtf/CrossThreadRefCounted.h: - (WTF::CrossThreadRefCounted::isShared): - * wtf/OwnFastMallocPtr.h: Added. - (WTF::OwnFastMallocPtr::OwnFastMallocPtr): - (WTF::OwnFastMallocPtr::~OwnFastMallocPtr): - (WTF::OwnFastMallocPtr::get): - (WTF::OwnFastMallocPtr::release): + * runtime/RegExpConstructor.cpp: -2009-05-25 Oliver Hunt <oliver@apple.com> +2009-07-31 Yong Li <yong.li@torchmobile.com> - Reviewed by Maciej Stachowiak. + Reviewed by George Staikos. - Re-add interpreter logic to jit-enabled builds as GCC mysteriously regresses without it + Resurrect the old GetTickCount implementation of currentTime, controlled by WTF_USE_QUERY_PERFORMANCE_COUNTER + currentSystemTime taken from older WebKit; currentTime written by Yong Li <yong.li@torchmobile.com>; cleanup by Joe Mason <joe.mason@torchmobile.com> + https://bugs.webkit.org/show_bug.cgi?id=27848 + * wtf/CurrentTime.cpp: + (WTF::currentSystemTime): get current time with GetCurrentFT + (WTF::currentTime): track msec elapsed since first currentSystemTime call using GetTickCount * wtf/Platform.h: -2009-05-25 Fridrich Strba <fridrich.strba@bluewin.ch> +2009-07-31 Ada Chan <adachan@apple.com> - Reviewed by Maciej Stachowiak. - - The functions written in assembly need to have a leading - underscore on Windows too. - - * jit/JITStubs.cpp: - -2009-05-24 Steve Falkenburg <sfalken@apple.com> + Fixes the Windows release-PGO build. - Build fix for experimental PGO Windows target. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2009-05-23 David Kilzer <ddkilzer@apple.com> + Reviewed by Jon Honeycutt. - Part 1 of 2: Bug 25495: Implement PassOwnPtr and replace uses of std::auto_ptr + * JavaScriptCore.vcproj/WTF/WTF.vcproj: Suppresses the warning about unreachable code that we get by adding "return 0" to WTF::TCMalloc_PageHeap::runScavengerThread(). + * wtf/FastMalloc.cpp: + (WTF::TCMalloc_PageHeap::runScavengerThread): Fixes the error about the method not returning a value in the release-PGO build. - <https://bugs.webkit.org/show_bug.cgi?id=25495> +2009-07-31 Zoltan Horvath <hzoltan@inf.u-szeged.hu> - Reviewed by Oliver Hunt. + Change malloc to fastMalloc and free to fastFree in Yarr's RegexInterpreter.cpp + https://bugs.webkit.org/show_bug.cgi?id=27874 - * GNUmakefile.am: Added OwnPtrCommon.h and PassOwnPtr.h. - * JavaScriptCore.vcproj/WTF/WTF.vcproj: Ditto. - * JavaScriptCore.xcodeproj/project.pbxproj: Ditto. + Use fastMalloc and fastFree instead of malloc and free in RegexInterpreter.cpp's methods. - * wtf/OwnPtr.h: - (WTF::OwnPtr::OwnPtr): Added constructors that take a - PassOwnPtr. Also added a copy constructor declaration that's - required when assigning a PassOwnPtr to a stack-based OwnPtr. - (WTF::operator=): Added assignment operator methods that take a - PassOwnPtr. - (WTF::swap): Reformatted. - (WTF::operator==): Whitespace changes. - (WTF::operator!=): Ditto. - - * wtf/OwnPtrCommon.h: Added. - (WTF::deleteOwnedPtr): + * yarr/RegexInterpreter.cpp: + (JSC::Yarr::Interpreter::allocDisjunctionContext): + (JSC::Yarr::Interpreter::freeDisjunctionContext): + (JSC::Yarr::Interpreter::allocParenthesesDisjunctionContext): + (JSC::Yarr::Interpreter::freeParenthesesDisjunctionContext): - * wtf/PassOwnPtr.h: Added. - (WTF::PassOwnPtr::PassOwnPtr): - (WTF::PassOwnPtr::~PassOwnPtr): - (WTF::PassOwnPtr::get): - (WTF::PassOwnPtr::clear): - (WTF::PassOwnPtr::release): - (WTF::PassOwnPtr::operator*): - (WTF::PassOwnPtr::operator->): - (WTF::PassOwnPtr::operator!): - (WTF::PassOwnPtr::operator UnspecifiedBoolType): - (WTF::::operator): - (WTF::operator==): - (WTF::operator!=): - (WTF::static_pointer_cast): - (WTF::const_pointer_cast): - (WTF::getPtr): - -2009-05-23 Oliver Hunt <oliver@apple.com> +2009-07-30 Xan Lopez <xlopez@igalia.com> - Reviewed by Maciej Stachowiak. + Reviewed by Jan Alonzo. - Remove interpreter specific logic from the JIT builds. + Fix compiler warning. - This saves ~100k in JSC release builds. + GCC does not like C++-style comments in preprocessor directives. - * interpreter/Interpreter.cpp: - (JSC::Interpreter::privateExecute): - * interpreter/Interpreter.h: * wtf/Platform.h: -2009-05-22 Mark Rowe <mrowe@apple.com> - - Part two of an attempted Windows build fix. +2009-07-30 John McCall <rjmccall@apple.com> - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - -2009-05-22 Mark Rowe <mrowe@apple.com> - - Part one of an attempted Windows build fix. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - -2009-05-21 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. + Reviewed by Gavin Barraclough. - op_method_check - - Optimize method calls, by caching specific function values within the Structure. - The new opcode is used almost like an x86 opcode prefix byte to optimize op_get_by_id, - where the property access is being used to read a function to be passed to op-call (i.e. - 'foo.bar();'). This patch modifies the Structure class such that when a property is - put to an object for the first time we will check if the value is a function. If it is, - we will cache the function value on the Structure. A Structure in such a state guarantees - that not only does a property with the given identifier exist on the object, but also that - its value is unchanged. Upon any further attempt to put a property with the same identifier - (but a different value) to the object, it will transition back to a normal Structure (where - it will guarantee the presence but not the value of the property). - - op_method_check makes use of the new information made available by the Structure, by - augmenting the functionality of op_get_by_id. Upon generating a FunctionCallDotNode a - check will be emitted prior to the property access reading the function value, and the JIT - will generate an extra (initially unlinked but patchable) set of checks prior to the regular - JIT code for get_by_id. The new code will do inline structure and prototype structure check - (unlike a regular get_by_id, which can only handle 'self' accesses inline), and then performs - an immediate load of the function value, rather than using memory accesses to load the value - from the obejct's property storage array. If the method check fails it will revert, or if - the access is polymorphic, the op_get_by_id will continue to operate - and optimize itself - - just as any other regular op_get_by_id would. - - ~2.5% on v8-tests, due to a ~9% progression on richards. + Optimize the X86_64 trampolines: avoid the need for filler arguments + and move the stub-args area closer to the stack pointer. - * API/JSCallbackObjectFunctions.h: - (JSC::::put): - (JSC::::staticFunctionGetter): - * API/JSObjectRef.cpp: - (JSObjectMakeConstructor): - * JavaScriptCore.exp: - * assembler/AbstractMacroAssembler.h: - (JSC::AbstractMacroAssembler::differenceBetween): - * assembler/MacroAssemblerX86.h: - (JSC::MacroAssemblerX86::moveWithPatch): - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::dump): - * bytecode/CodeBlock.h: - (JSC::getMethodCallLinkInfoReturnLocation): - (JSC::CodeBlock::getMethodCallLinkInfo): - (JSC::CodeBlock::addMethodCallLinkInfos): - (JSC::CodeBlock::methodCallLinkInfo): - * bytecode/Opcode.h: - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::emitMethodCheck): - * bytecompiler/BytecodeGenerator.h: - * interpreter/Interpreter.cpp: - (JSC::Interpreter::privateExecute): - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): - (JSC::JIT::privateCompile): - * jit/JIT.h: - (JSC::MethodCallCompilationInfo::MethodCallCompilationInfo): - * jit/JITOpcodes.cpp: - * jit/JITPropertyAccess.cpp: - (JSC::JIT::emit_op_method_check): - (JSC::JIT::emitSlow_op_method_check): - (JSC::JIT::emit_op_get_by_id): - (JSC::JIT::emitSlow_op_get_by_id): - (JSC::JIT::emit_op_put_by_id): - (JSC::JIT::emitSlow_op_put_by_id): - (JSC::JIT::compileGetByIdHotPath): - (JSC::JIT::compileGetByIdSlowCase): - (JSC::JIT::patchMethodCallProto): + * jit/JIT.h: adjust patch offsets because of slight code-size change + * jit/JITCode.h: + (JSC::JITCode::execute): don't pass filler args * jit/JITStubs.cpp: - (JSC::JITStubs::cti_op_get_by_id_method_check): - (JSC::JITStubs::cti_op_get_by_id_method_check_second): + (ctiTrampoline): (X86_64): push args onto stack, use args directly + (ctiVMThrowTrampoline): (X86_64): adjust %rsp by correct displacement + (ctiOpThrowNotCaught): (X86_64): adjust %rsp by correct displacement * jit/JITStubs.h: - * jsc.cpp: - (GlobalObject::GlobalObject): - * parser/Nodes.cpp: - (JSC::FunctionCallDotNode::emitBytecode): - * runtime/Arguments.cpp: - (JSC::Arguments::put): - * runtime/ArrayConstructor.cpp: - (JSC::ArrayConstructor::ArrayConstructor): - * runtime/BooleanConstructor.cpp: - (JSC::BooleanConstructor::BooleanConstructor): - * runtime/DateConstructor.cpp: - (JSC::DateConstructor::DateConstructor): - * runtime/ErrorConstructor.cpp: - (JSC::ErrorConstructor::ErrorConstructor): - (JSC::constructError): - * runtime/ErrorPrototype.cpp: - (JSC::ErrorPrototype::ErrorPrototype): - * runtime/FunctionConstructor.cpp: - (JSC::FunctionConstructor::FunctionConstructor): - * runtime/FunctionPrototype.cpp: - (JSC::FunctionPrototype::FunctionPrototype): - * runtime/InternalFunction.cpp: - (JSC::InternalFunction::InternalFunction): - * runtime/JSActivation.cpp: - (JSC::JSActivation::put): - (JSC::JSActivation::putWithAttributes): - * runtime/JSByteArray.cpp: - (JSC::JSByteArray::JSByteArray): - * runtime/JSFunction.cpp: - (JSC::JSFunction::JSFunction): - (JSC::JSFunction::getOwnPropertySlot): - * runtime/JSGlobalObject.cpp: - (JSC::JSGlobalObject::putWithAttributes): - (JSC::JSGlobalObject::reset): - (JSC::JSGlobalObject::mark): - * runtime/JSGlobalObject.h: - (JSC::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData): - (JSC::JSGlobalObject::methodCallDummy): - * runtime/JSObject.cpp: - (JSC::JSObject::put): - (JSC::JSObject::putWithAttributes): - (JSC::JSObject::deleteProperty): - (JSC::JSObject::defineGetter): - (JSC::JSObject::defineSetter): - (JSC::JSObject::getPropertyAttributes): - (JSC::JSObject::getPropertySpecificFunction): - (JSC::JSObject::putDirectFunction): - (JSC::JSObject::putDirectFunctionWithoutTransition): - * runtime/JSObject.h: - (JSC::getJSFunction): - (JSC::JSObject::getDirectLocation): - (JSC::JSObject::putDirect): - (JSC::JSObject::putDirectWithoutTransition): - * runtime/LiteralParser.cpp: - (JSC::LiteralParser::parseObject): - * runtime/Lookup.cpp: - (JSC::setUpStaticFunctionSlot): - * runtime/Lookup.h: - (JSC::lookupPut): - * runtime/MathObject.cpp: - (JSC::MathObject::MathObject): - * runtime/NativeErrorConstructor.cpp: - (JSC::NativeErrorConstructor::NativeErrorConstructor): - (JSC::NativeErrorConstructor::construct): - * runtime/NativeErrorPrototype.cpp: - (JSC::NativeErrorPrototype::NativeErrorPrototype): - * runtime/NumberConstructor.cpp: - (JSC::NumberConstructor::NumberConstructor): - * runtime/ObjectConstructor.cpp: - (JSC::ObjectConstructor::ObjectConstructor): - * runtime/PropertyMapHashTable.h: - (JSC::PropertyMapEntry::PropertyMapEntry): - * runtime/PrototypeFunction.cpp: - (JSC::PrototypeFunction::PrototypeFunction): - * runtime/PutPropertySlot.h: - (JSC::PutPropertySlot::): - (JSC::PutPropertySlot::PutPropertySlot): - (JSC::PutPropertySlot::setNewProperty): - (JSC::PutPropertySlot::setDespecifyFunctionProperty): - (JSC::PutPropertySlot::isCacheable): - (JSC::PutPropertySlot::cachedOffset): - * runtime/RegExpConstructor.cpp: - (JSC::RegExpConstructor::RegExpConstructor): - * runtime/StringConstructor.cpp: - (JSC::StringConstructor::StringConstructor): - * runtime/StringPrototype.cpp: - (JSC::StringPrototype::StringPrototype): - * runtime/Structure.cpp: - (JSC::Structure::Structure): - (JSC::Structure::~Structure): - (JSC::Structure::materializePropertyMap): - (JSC::Structure::addPropertyTransitionToExistingStructure): - (JSC::Structure::addPropertyTransition): - (JSC::Structure::changeFunctionTransition): - (JSC::Structure::addPropertyWithoutTransition): - (JSC::Structure::get): - (JSC::Structure::despecifyFunction): - (JSC::Structure::put): - (JSC::Structure::remove): - * runtime/Structure.h: - (JSC::Structure::get): - (JSC::Structure::specificFunction): - * runtime/StructureTransitionTable.h: - (JSC::StructureTransitionTableHashTraits::emptyValue): - * wtf/Platform.h: - -2009-05-22 Brent Fulgham <bfulgham@webkit.org> - - Reviewed by Steve Falkenburg. - - https://bugs.webkit.org/show_bug.cgi?id=25950 - JavaScriptCore Fails to build on Windows (Cairo) due to CoreFoundation - link requirement. + (JITStackFrame): (X86_64): move args area earlier + (ctiTrampoline): remove filler args from prototype - Modify project to add new Debug_CFLite and Release_CFLite targets. These - use the new JavaScriptCoreCFLite.vsprops to link against CFLite.dll. - Existing projects are changed to use the new JavaScriptCoreCF.vsprops - to link against CoreFoundation.dll. +2009-07-30 Gavin Barraclough <barraclough@apple.com> - The JavaScriptCoreCommon.vsprops is modified to remove the link - against CoreFoundation.dll. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreCF.vsprops: Added. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreCFLite.vsprops: Added. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreCommon.vsprops: - -2009-05-22 Dominik Röttsches <dominik.roettsches@access-company.com> - - Reviewed by Gustavo Noronha. + Reviewed by NOBODY (build fix). - https://bugs.webkit.org/show_bug.cgi?id=15914 - [GTK] Implement Unicode functionality using GLib + Temporarily revert r46618 since this is b0rking on Linux. - Original patch by Jürg Billeter and Naiem Shaik. - Implementing WTF Unicode functionality based on GLib. +2009-07-23 Gavin Barraclough <barraclough@apple.com> - * GNUmakefile.am: - * wtf/unicode/Unicode.h: - * wtf/unicode/glib: Added. - * wtf/unicode/glib/UnicodeGLib.cpp: Added. - (WTF::Unicode::foldCase): - (WTF::Unicode::toLower): - (WTF::Unicode::toUpper): - (WTF::Unicode::direction): - (WTF::Unicode::umemcasecmp): - * wtf/unicode/glib/UnicodeGLib.h: Added. - (WTF::Unicode::): - (WTF::Unicode::toLower): - (WTF::Unicode::toUpper): - (WTF::Unicode::toTitleCase): - (WTF::Unicode::isArabicChar): - (WTF::Unicode::isFormatChar): - (WTF::Unicode::isSeparatorSpace): - (WTF::Unicode::isPrintableChar): - (WTF::Unicode::isDigit): - (WTF::Unicode::isPunct): - (WTF::Unicode::mirroredChar): - (WTF::Unicode::category): - (WTF::Unicode::isLower): - (WTF::Unicode::digitValue): - (WTF::Unicode::combiningClass): - (WTF::Unicode::decompositionType): - * wtf/unicode/glib/UnicodeMacrosFromICU.h: Added. + Reviewed by Oliver Hunt. -2009-05-21 Xan Lopez <xlopez@igalia.com> + Make get_by_id/put_by_id/method_check/call defer optimization using a data flag rather than a code modification. + ( https://bugs.webkit.org/show_bug.cgi?id=27635 ) - Unreviewed build fix. + This improves performance of ENABLE(ASSEMBLER_WX_EXCLUSIVE) builds by 2-2.5%, reducing the overhead to about 2.5%. + (No performance impact with ASSEMBLER_WX_EXCLUSIVE disabled). - Add MacroAssemblerCodeRef.h to file list. + * bytecode/CodeBlock.cpp: + (JSC::printStructureStubInfo): + - Make StructureStubInfo store the type as an integer, rather than an OpcodeID. - * GNUmakefile.am: + * bytecode/CodeBlock.h: + (JSC::): + (JSC::CallLinkInfo::seenOnce): + (JSC::CallLinkInfo::setSeen): + (JSC::MethodCallLinkInfo::seenOnce): + (JSC::MethodCallLinkInfo::setSeen): + - Change a pointer in CallLinkInfo/MethodCallLinkInfo to use a PtrAndFlags, use a flag to track when an op has been executed once. -2009-05-21 Gavin Barraclough <barraclough@apple.com> + * bytecode/StructureStubInfo.cpp: + (JSC::StructureStubInfo::deref): + - Make StructureStubInfo store the type as an integer, rather than an OpcodeID. - Reviewed by Darin Adler. - Addition of MacroAssemblerCodeRef.h rubber stamped by Geoff Garen. - - Refactor JIT code-handle objects. The representation of generated code is currently - a bit of a mess. We have a class JITCode which wraps the pointer to a block of - generated code, but this object does not reference the executable pool meaning that - external events (the pool being derefed) could make the pointer become invalid. - To overcome this both the JIT and Yarr implement further (and similar) objects to - wrap the code pointer with a RefPtr to the pool. To add to the mire, as well as the - CodeBlock containing a handle onto the code the FunctionBodyNode also contains a - copy of the code pointer which is used almost (but not entirely) uniquely to access - the JIT code for a function. - - Rationalization of all this: - - * Add a new type 'MacroAssembler::CodeRef' as a handle for a block of JIT generated code. - * Change the JIT & Yarr to internally handle code using CodeRefs. - * Move the CodeRef (formerly anow defunct JITCodeRef) from CodeBlock to its owner node. - * Remove the (now) redundant code pointer from FunctionBodyNode. - - While tidying this up I've made the PatchBuffer return code in new allocations using a CodeRef, - and have enforced an interface that the PatchBuffer will always be used, and 'finalizeCode()' or - 'finalizeCodeAddendum()' will always be called exactly once on the PatchBuffer to complete code generation. - - This gives us a potentially useful hook ('PatchBuffer::performFinalization()') at the end of generation, - which may have a number of uses. It may be helpful should we wish to switch our generation - model to allow RW/RX exclusive memory, and it may be useful on non-cache-coherent platforms to - give us an oportunity to cache flush as necessary. + * bytecode/StructureStubInfo.h: + (JSC::StructureStubInfo::StructureStubInfo): + (JSC::StructureStubInfo::initGetByIdSelf): + (JSC::StructureStubInfo::initGetByIdProto): + (JSC::StructureStubInfo::initGetByIdChain): + (JSC::StructureStubInfo::initGetByIdSelfList): + (JSC::StructureStubInfo::initGetByIdProtoList): + (JSC::StructureStubInfo::initPutByIdTransition): + (JSC::StructureStubInfo::initPutByIdReplace): + (JSC::StructureStubInfo::seenOnce): + (JSC::StructureStubInfo::setSeen): + - Make StructureStubInfo store the type as an integer, rather than an OpcodeID, add a flag to track when an op has been executed once. - No performance impact. + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitGetById): + (JSC::BytecodeGenerator::emitPutById): + - Make StructureStubInfo store the type as an integer, rather than an OpcodeID. - * assembler/AbstractMacroAssembler.h: - (JSC::AbstractMacroAssembler::ProcessorReturnAddress::relinkCallerToTrampoline): - (JSC::AbstractMacroAssembler::CodeRef::CodeRef): - (JSC::AbstractMacroAssembler::CodeRef::trampolineAt): - (JSC::AbstractMacroAssembler::PatchBuffer::PatchBuffer): - (JSC::AbstractMacroAssembler::PatchBuffer::~PatchBuffer): - (JSC::AbstractMacroAssembler::PatchBuffer::link): - (JSC::AbstractMacroAssembler::PatchBuffer::linkTailRecursive): - (JSC::AbstractMacroAssembler::PatchBuffer::patch): - (JSC::AbstractMacroAssembler::PatchBuffer::complete): - (JSC::AbstractMacroAssembler::PatchBuffer::finalize): - (JSC::AbstractMacroAssembler::PatchBuffer::entry): - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::CodeBlock): - (JSC::CodeBlock::reparseForExceptionInfoIfNecessary): - (JSC::CodeBlock::setJITCode): - * bytecode/CodeBlock.h: - (JSC::CodeBlock::getBytecodeIndex): - (JSC::CodeBlock::executablePool): - * interpreter/CallFrameClosure.h: - * interpreter/Interpreter.cpp: - (JSC::Interpreter::execute): - (JSC::Interpreter::prepareForRepeatCall): * jit/JIT.cpp: - (JSC::JIT::privateCompile): (JSC::JIT::privateCompileCTIMachineTrampolines): - (JSC::JIT::linkCall): - * jit/JIT.h: - * jit/JITCode.h: - (JSC::JITCode::JITCode): - (JSC::JITCode::operator bool): - (JSC::JITCode::addressForCall): - (JSC::JITCode::offsetOf): - (JSC::JITCode::execute): - (JSC::JITCode::size): - (JSC::JITCode::executablePool): - (JSC::JITCode::HostFunction): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::privateCompilePutByIdTransition): - (JSC::JIT::privateCompilePatchGetArrayLength): - (JSC::JIT::privateCompileGetByIdProto): - (JSC::JIT::privateCompileGetByIdSelfList): - (JSC::JIT::privateCompileGetByIdProtoList): - (JSC::JIT::privateCompileGetByIdChainList): - (JSC::JIT::privateCompileGetByIdChain): - * jit/JITStubs.cpp: - (JSC::JITStubs::cti_vm_dontLazyLinkCall): - (JSC::JITStubs::cti_vm_lazyLinkCall): - * parser/Nodes.cpp: - (JSC::ProgramNode::generateJITCode): - (JSC::EvalNode::generateJITCode): - (JSC::FunctionBodyNode::FunctionBodyNode): - (JSC::FunctionBodyNode::createNativeThunk): - (JSC::FunctionBodyNode::generateJITCode): - * parser/Nodes.h: - (JSC::ScopeNode::generatedJITCode): - (JSC::ScopeNode::getExecutablePool): - (JSC::ScopeNode::setJITCode): - (JSC::ProgramNode::jitCode): - (JSC::EvalNode::jitCode): - (JSC::FunctionBodyNode::jitCode): - * runtime/RegExp.cpp: - (JSC::RegExp::match): - * yarr/RegexJIT.cpp: - (JSC::Yarr::RegexGenerator::compile): - (JSC::Yarr::jitCompileRegex): - (JSC::Yarr::executeRegex): - * yarr/RegexJIT.h: - (JSC::Yarr::RegexCodeBlock::RegexCodeBlock): - (JSC::Yarr::RegexCodeBlock::pcreFallback): - (JSC::Yarr::RegexCodeBlock::setFallback): - (JSC::Yarr::RegexCodeBlock::operator bool): - (JSC::Yarr::RegexCodeBlock::set): - (JSC::Yarr::RegexCodeBlock::execute): - -2009-05-21 Oliver Hunt <oliver@apple.com> - - Reviewed by Maciej Stachowiak. + (JSC::JIT::unlinkCall): + - Remove the "don't lazy link" stage of calls. - <rdar://problem/6910264> REGRESSION: Cached DOM global object property access fails in browser (25921) - <https://bugs.webkit.org/show_bug.cgi?id=25921> + * jit/JIT.h: + (JSC::JIT::compileCTIMachineTrampolines): + - Remove the "don't lazy link" stage of calls. - When caching properties on the global object we need to ensure that we're - not attempting to cache through a shell object. + * jit/JITCall.cpp: + (JSC::JIT::compileOpCallSlowCase): + - Remove the "don't lazy link" stage of calls. - * interpreter/Interpreter.cpp: - (JSC::Interpreter::resolveGlobal): * jit/JITStubs.cpp: - (JSC::JITStubs::cti_op_resolve_global): - -2009-05-21 Steve Falkenburg <sfalken@apple.com> - - Windows build fix. - - * JavaScriptCore.vcproj/jsc/jscCommon.vsprops: - -2009-05-21 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Mark Rowe. - - Bug 25945: Add support for MADV_FREE to TCMalloc - <https://bugs.webkit.org/show_bug.cgi?id=25945> - <rdar://problem/6910754> - - Add support for MADV_FREE to TCMalloc_SystemRelease for platforms that - don't also support MADV_FREE_REUSE. The code is identical to the MADV_DONTNEED - case except for the advice passed to madvise(), so combining the two cases - makes the most sense. - - * wtf/Platform.h: Only define HAVE_MADV_FREE when not building on Tiger or - Leopard, because while it is defined on these platforms it actually does - nothing. - * wtf/TCSystemAlloc.cpp: - (TCMalloc_SystemRelease): use MADV_FREE if it is available; otherwise use - MADV_DONTNEED. - -2009-05-21 Mark Rowe <mrowe@apple.com> - - Reviewed by Oliver Hunt. - - Fix <https://bugs.webkit.org/show_bug.cgi?id=25917> / <rdar://problem/6910066>. - Bug 25917: REGRESSION (r43559?): Javascript debugger crashes when pausing page - - The debugger currently retrieves the arguments object from an activation rather than pulling - it from a call frame. This is unreliable to due to the recent optimization to lazily create - the arguments object. In the long-term it should stop doing that (<rdar://problem/6911886>), - but for now we force eager creation of the arguments object when debugging. - - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::BytecodeGenerator): + (JSC::JITThunks::JITThunks): + (JSC::JITThunks::tryCachePutByID): + (JSC::JITThunks::tryCacheGetByID): + (JSC::JITStubs::DEFINE_STUB_FUNCTION): + (JSC::JITStubs::getPolymorphicAccessStructureListSlot): + - Remove the "don't lazy link" stage of calls, and the "_second" stage of get_by_id/put_by_id/method_check. -2009-05-21 Cameron Zwarich <zwarich@apple.com> + * jit/JITStubs.h: + (JSC::JITThunks::ctiStringLengthTrampoline): + (JSC::JITStubs::): + - Remove the "don't lazy link" stage of calls, and the "_second" stage of get_by_id/put_by_id/method_check. - Reviewed by Maciej Stachowiak. + * wtf/PtrAndFlags.h: + (WTF::PtrAndFlags::PtrAndFlags): + (WTF::PtrAndFlags::operator!): + (WTF::PtrAndFlags::operator->): + - Add ! and -> operators, add constuctor with pointer argument. - Bug 25912: Harden NumberPrototype.cpp by removing use of strcpy() - <https://bugs.webkit.org/show_bug.cgi?id=25912> +2009-07-30 Geoffrey Garen <ggaren@apple.com> - This causes no change on SunSpider. + Reviewed by Gavin Barraclough. - * runtime/NumberPrototype.cpp: - (JSC::integerPartNoExp): replace strcpy() with memcpy(), ASSERT that the - temporary buffer has sufficient space to store the result, and move the - explicit null-termination closer to the memcpy() for easier visual inspection - of the code. - (JSC::fractionalPartToString): replace strcpy() with memcpy(), and ASSERT - that the temporary buffer has sufficient space to store the result. There - is no explicit null-termination because this is done by the caller. The - same is already true for exponentialPartToString(). - (JSC::numberProtoFuncToExponential): replace strcpy() with memcpy(), explicitly - null-terminate the result, and ASSERT that the temporary buffer has sufficient - space to store the result. + Fixed failing tests seen on Windows buildbot. -2009-05-20 Sam Weinig <sam@webkit.org> + * jit/JITStubs.cpp: + (JSC::DEFINE_STUB_FUNCTION): + * jit/JITStubs.h: + (JSC::): Use "int" instead of "bool" to guarantee a 32-bit result, + regardless of compiler. gcc on mac uses 32-bit values for bool, + but gcc on linux and MSVC on Windows use 8-bit values. - Reviewed by Cameron Zwarich. +2009-07-30 Geoffrey Garen <ggaren@apple.com> - Cleanup the JSGlobalData when exiting early with the usage statement in jsc. + Windows build fix: added missing symbols on Windows. - * jsc.cpp: - (printUsageStatement): - (parseArguments): - (jscmain): + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: -2009-05-20 Stephanie Lewis <slewis@apple.com> +2009-07-30 Geoffrey Garen <ggaren@apple.com> - Update the order files. <rdar://problem/6881750> Generate new order files. + Windows build fix: removed stale symbols on Windows. - * JavaScriptCore.order: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: -2009-05-19 Kenneth Rohde Christiansen <kenneth.christiansen@openbossa.org> +=== End merge of nitro-extreme branch 2009-07-30 === - Reviewed by Simon Hausmann. +2009-07-20 Geoffrey Garen <ggaren@apple.com> - Replace WREC with YARR + YARR_JIT for the Qt port. This is only - used when compiled with JIT support for now, so it is a drop-in - replacement for the WREC usage. Still including the wrec headers - as they are being referred from RegExp.h, though the contents of - that header it protected by "#if ENABLE(WREC)". + Fixed a post-review typo in r46066 that caused tons of test failures. + + SunSpider reports no change. - * JavaScriptCore.pri: + * runtime/JSArray.cpp: + (JSC::JSArray::JSArray): Initialize the full vector capacity, to avoid + uninitialized members at the end. -2009-05-20 Xan Lopez <xlopez@igalia.com> +2009-07-20 Geoffrey Garen <ggaren@apple.com> - Reviewed by Eric Seidel. + Windows WebKit build fix: Added some missing exports. - Fix GTK debug build. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - The function dumpDisjunction, compiled with debug enabled, uses - printf, which needs stdio.h to be included. +2009-07-17 Geoffrey Garen <ggaren@apple.com> - * yarr/RegexInterpreter.cpp: + Reviewed by Sam Weinig. -2009-05-20 Laszlo Gombos <laszlo.1.gombos@nokia.com> + Get the branch working on windows. + https://bugs.webkit.org/show_bug.cgi?id=27391 + + SunSpider says 0.3% faster. - Reviewed by George Staikos. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: Updated + MSVC export lists to fix linker errors. - BUG 25843: [Qt] Remove qt-port build flag - <https://bugs.webkit.org/show_bug.cgi?id=25843> + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Added / removed + new / old project files. - * JavaScriptCore.pro: + * jit/JIT.cpp: + (JSC::JIT::privateCompileCTIMachineTrampolines): Used #pragma pack to tell + MSVC that these structures represent actual memory layout, and should not be + automatically aligned. Changed the return value load to load a 64bit quantity + into the canonical registers. + * jit/JIT.h: Moved OBJECT_OFFSETOF definition to StdLibExtras.h because + it's needed by more than just the JIT, and it supplements a standard library + macro (offsetof). -2009-05-19 Geoffrey Garen <ggaren@apple.com> + * jit/JITCall.cpp: + (JSC::JIT::compileOpCallInitializeCallFrame): Fixed an incorrectly signed + cast to resolve an MSVC warning. - Windows build fix. + * jit/JITStubs.h: Used #pragma pack to tell MSVC that these structures + represent actual memory layout, and should not be automatically aligned. - * interpreter/RegisterFile.cpp: - (JSC::RegisterFile::releaseExcessCapacity): Copy-paste typo. + * runtime/JSArray.cpp: + (JSC::JSArray::JSArray): Replaced memset_pattern8 with a for loop, since + memset_pattern8 is not portable. (I verified that this version of the loop + gives the best performance / generated code in GCC.) -2009-05-19 Geoffrey Garen <ggaren@apple.com> + * runtime/JSObject.h: + (JSC::JSObject::JSObject): Removed accidental usage of FIELD_OFFSET -- + OBJECT_OFFSETOF is our new macro name. (FIELD_OFFSET conflicts with a + definition in winnt.h.) - Reviewed by Sam Weinig. - - Fixed <rdar://problem/6885680> CrashTracer: [USER] 1 crash in Install - Mac OS X at <unknown binary> • 0x9274241c + * runtime/JSValue.cpp: Added some headers needed by non-all-in-one builds. - (Original patch by Joe Sokol and Ronnie Misra.) - - SunSpider says 1.004x faster. - - * interpreter/RegisterFile.cpp: - (JSC::RegisterFile::releaseExcessCapacity): Instead of doing complicated - math that sometimes used to overflow, just release the full range of the - register file. - - * interpreter/RegisterFile.h: - (JSC::isPageAligned): - (JSC::RegisterFile::RegisterFile): Added ASSERTs to verify that it's - safe to release the full range of the register file. - - (JSC::RegisterFile::shrink): No need to releaseExcessCapacity() if the - new end is not smaller than the old end. (Also, doing so used to cause - numeric overflow, unmapping basically the whole process from memory.) - -2009-05-19 Oliver Hunt <oliver@apple.com> - - RS=Mark Rowe. + * runtime/JSValue.h: + (JSC::JSValue::): Made the tag signed, to match MSVC's signed enum values. + (GCC doesn't seem to care one way or the other.) - <rdar://problem/6888393> REGRESSION: Start Debugging JavaScript crashes browser (nightly builds only?) - <https://bugs.webkit.org/show_bug.cgi?id=25717> + * wtf/MainThread.cpp: Moved the StdLibExtras.h #include -- I did this a + while ago to resolve a conflict with winnt.h. I can't remember if it's truly + still needed, but what the heck. - Remove JSC_FAST_CALL as it wasn't gaining us anything, and was - resulting in weird bugs in the nightly builds. + * wtf/StdLibExtras.h: Moved OBJECT_OFFSETOF definition here. - * parser/Nodes.cpp: - * parser/Nodes.h: - (JSC::ExpressionNode::isNumber): - (JSC::ExpressionNode::isString): - (JSC::ExpressionNode::isNull): - (JSC::ExpressionNode::isPure): - (JSC::ExpressionNode::isLocation): - (JSC::ExpressionNode::isResolveNode): - (JSC::ExpressionNode::isBracketAccessorNode): - (JSC::ExpressionNode::isDotAccessorNode): - (JSC::ExpressionNode::isFuncExprNode): - (JSC::ExpressionNode::isSimpleArray): - (JSC::ExpressionNode::isAdd): - (JSC::ExpressionNode::resultDescriptor): - (JSC::StatementNode::firstLine): - (JSC::StatementNode::lastLine): - (JSC::StatementNode::isEmptyStatement): - (JSC::StatementNode::isReturnNode): - (JSC::StatementNode::isExprStatement): - (JSC::StatementNode::isBlock): - (JSC::NullNode::isNull): - (JSC::BooleanNode::isPure): - (JSC::NumberNode::value): - (JSC::NumberNode::setValue): - (JSC::NumberNode::isNumber): - (JSC::NumberNode::isPure): - (JSC::StringNode::isPure): - (JSC::StringNode::isString): - (JSC::ResolveNode::identifier): - (JSC::ResolveNode::isLocation): - (JSC::ResolveNode::isResolveNode): - (JSC::BracketAccessorNode::isLocation): - (JSC::BracketAccessorNode::isBracketAccessorNode): - (JSC::DotAccessorNode::base): - (JSC::DotAccessorNode::identifier): - (JSC::DotAccessorNode::isLocation): - (JSC::DotAccessorNode::isDotAccessorNode): - (JSC::TypeOfResolveNode::identifier): - (JSC::AddNode::isAdd): - (JSC::BlockNode::isBlock): - (JSC::EmptyStatementNode::isEmptyStatement): - (JSC::ExprStatementNode::isExprStatement): - (JSC::ReturnNode::isReturnNode): - (JSC::ScopeNode::sourceURL): - (JSC::ProgramNode::bytecode): - (JSC::EvalNode::bytecode): - (JSC::FunctionBodyNode::parameters): - (JSC::FunctionBodyNode::toSourceString): - (JSC::FunctionBodyNode::bytecode): - (JSC::FuncExprNode::isFuncExprNode): - -2009-05-19 Maciej Stachowiak <mjs@apple.com> +2009-07-06 Geoffrey Garen <ggaren@apple.com> - Reviewed by Gavin Barraclough. + Reviewed by Sam Weinig (?). - - speed up string comparison, especially for short strings + Fixed an assertion seen during the stress test. - ~1% on SunSpider + Don't assume that, if op1 is constant, op2 is not, and vice versa. Sadly, + not all constants get folded. - * JavaScriptCore.exp: - * runtime/UString.cpp: - * runtime/UString.h: - (JSC::operator==): Inline UString's operator==, since it is called from - hot places in the runtime. Also, specialize 2-char strings in a similar way to - 1-char, since we're taking the hit of a switch anyway. + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_jnless): + (JSC::JIT::emitSlow_op_jnless): + (JSC::JIT::emit_op_jnlesseq): + (JSC::JIT::emitSlow_op_jnlesseq): -2009-05-18 Maciej Stachowiak <mjs@apple.com> +2009-07-06 Geoffrey Garen <ggaren@apple.com> - Reviewed by Gavin Barraclough. + Reviewed by Sam Weinig. - - for polymorphic prototype lookups, increase the number of slots from 4 to 8 + Include op_convert_this in result caching. - ~4% faster on v8 raytrace benchmark - - * bytecode/Instruction.h: + No change on SunSpider or v8. -2009-05-18 Maciej Stachowiak <mjs@apple.com> + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_convert_this): - Reviewed by Oliver Hunt. - - - tighten up the code for the load_varargs stub - - ~1-2% on v8-raytrace - * jit/JITStubs.cpp: - (JSC::JITStubs::cti_op_load_varargs): Hoist some loop invariants that - the compiler didn't feel like hoisting for us. Remove unneeded exception check. - -2009-05-18 Maciej Stachowiak <mjs@apple.com> + (JSC::DEFINE_STUB_FUNCTION): + * jit/JITStubs.h: + (JSC::): Made the op_convert_this JIT stub return an EncodedJSValue, so + to maintain the result caching contract that { tag, payload } can be + found in { regT1, regT0 }. - Reviewed by Geoff Garen. +2009-07-06 Geoffrey Garen <ggaren@apple.com> - - Improve code generation for access to prototype properties + Reviewed by Sam Weinig. - ~0.4% speedup on SunSpider. + Implemented result chaining. - Based on a suggestion from Geoff Garen. - - * jit/JIT.h: - * jit/JITPropertyAccess.cpp: - (JSC::JIT::compileGetDirectOffset): - (JSC::JIT::privateCompileGetByIdProto): - (JSC::JIT::privateCompileGetByIdProtoList): - (JSC::JIT::privateCompileGetByIdChainList): - (JSC::JIT::privateCompileGetByIdChain): - -2009-05-18 Gustavo Noronha Silva <gustavo.noronha@collabora.co.uk> - - Reviewed by Gavin Barraclough. - - Enable YARR, and disable WREC for GTK+. - - * GNUmakefile.am: - * yarr/RegexParser.h: - -2009-05-18 Jan Michael Alonzo <jmalonzo@webkit.org> - - Reviewed by Xan Lopez. - - [Gtk] Various autotools build refactoring and fixes - https://bugs.webkit.org/show_bug.cgi?id=25286 - - Add -no-install and -no-fast-install to programs and tests that we - don't install. Also remove -O2 since this is already handled at - configure time. - - * GNUmakefile.am: - -2009-05-17 Jan Michael Alonzo <jmalonzo@webkit.org> - - Reviewed by Xan Lopez. - - [Gtk] Various autotools build refactoring and fixes - https://bugs.webkit.org/show_bug.cgi?id=25286 - - Add JavaScriptCore/ to JSC include path only since it's not - required when building WebCore. - - * GNUmakefile.am: - -2009-05-17 Steve Falkenburg <sfalken@apple.com> - - Windows build fix - - * JavaScriptCore.vcproj/JavaScriptCore.make: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2009-05-15 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Looking like MSVC doesn't like static variables in inline methods? - Make the state of the SSE2 check a static variable on the class - MacroAssemblerX86Common as a speculative build fix for Windows. + 1% faster on SunSpider. 4%-5% faster on v8. * assembler/MacroAssemblerX86Common.h: - (JSC::MacroAssemblerX86Common::convertInt32ToDouble): - (JSC::MacroAssemblerX86Common::branchDouble): - (JSC::MacroAssemblerX86Common::branchTruncateDoubleToInt32): - (JSC::MacroAssemblerX86Common::isSSE2Present): - (JSC::MacroAssemblerX86Common::): - * jit/JIT.cpp: - -2009-05-15 Adam Roben <aroben@apple.com> - - Add some assembler headers to JavaScriptCore.vcproj - - This is just a convenience for Windows developers. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2009-05-15 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Add FP support to the MacroAssembler, port JITArithmetic over to make use of this. Also add - API to determine whether FP support is available 'MacroAssembler::supportsFloatingPoint()', - FP is presently only supported on SSE2 platforms, not x87. On platforms where a suitable - hardware FPU is not available 'supportsFloatingPoint()' may simply return false, and all - other methods ASSERT_NOT_REACHED(). - - * assembler/AbstractMacroAssembler.h: - * assembler/MacroAssemblerX86.h: - (JSC::MacroAssemblerX86::MacroAssemblerX86): - (JSC::MacroAssemblerX86::branch32): - (JSC::MacroAssemblerX86::branchPtrWithPatch): - (JSC::MacroAssemblerX86::supportsFloatingPoint): - * assembler/MacroAssemblerX86Common.h: - (JSC::MacroAssemblerX86Common::): - (JSC::MacroAssemblerX86Common::loadDouble): - (JSC::MacroAssemblerX86Common::storeDouble): - (JSC::MacroAssemblerX86Common::addDouble): - (JSC::MacroAssemblerX86Common::subDouble): - (JSC::MacroAssemblerX86Common::mulDouble): - (JSC::MacroAssemblerX86Common::convertInt32ToDouble): - (JSC::MacroAssemblerX86Common::branchDouble): - (JSC::MacroAssemblerX86Common::branchTruncateDoubleToInt32): - (JSC::MacroAssemblerX86Common::branch32): - (JSC::MacroAssemblerX86Common::branch16): - (JSC::MacroAssemblerX86Common::branchTest32): - (JSC::MacroAssemblerX86Common::branchAdd32): - (JSC::MacroAssemblerX86Common::branchMul32): - (JSC::MacroAssemblerX86Common::branchSub32): - (JSC::MacroAssemblerX86Common::set32): - (JSC::MacroAssemblerX86Common::setTest32): - (JSC::MacroAssemblerX86Common::x86Condition): - (JSC::MacroAssemblerX86Common::isSSE2Present): - * assembler/MacroAssemblerX86_64.h: - (JSC::MacroAssemblerX86_64::movePtrToDouble): - (JSC::MacroAssemblerX86_64::moveDoubleToPtr): - (JSC::MacroAssemblerX86_64::setPtr): - (JSC::MacroAssemblerX86_64::branchPtr): - (JSC::MacroAssemblerX86_64::branchTestPtr): - (JSC::MacroAssemblerX86_64::branchAddPtr): - (JSC::MacroAssemblerX86_64::branchSubPtr): - (JSC::MacroAssemblerX86_64::supportsFloatingPoint): + (JSC::MacroAssemblerX86Common::move): * assembler/X86Assembler.h: + (JSC::X86Assembler::movl_rr): Added an optimization to eliminate + no-op mov instructions, to simplify chaining. + * jit/JIT.cpp: (JSC::JIT::JIT): - * jit/JIT.h: - * jit/JITArithmetic.cpp: - (JSC::JIT::emit_op_rshift): - (JSC::JIT::emitSlow_op_rshift): - (JSC::JIT::emitSlow_op_jnless): - (JSC::JIT::emitSlow_op_jnlesseq): - (JSC::JIT::compileBinaryArithOp): - (JSC::JIT::compileBinaryArithOpSlowCase): - (JSC::JIT::emit_op_add): - (JSC::JIT::emitSlow_op_add): - (JSC::JIT::emit_op_mul): - (JSC::JIT::emitSlow_op_mul): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::privateCompilePutByIdTransition): - -2009-05-15 Francisco Tolmasky <francisco@280north.com> - - BUG 25467: JavaScript debugger should use function.displayName as the function's name in the call stack - <https://bugs.webkit.org/show_bug.cgi?id=25467> - - Reviewed by Adam Roben. - - * JavaScriptCore.exp: Added calculatedFunctionName - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: Added calculatedFunctionName - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: Added calculatedFunctionName - * debugger/DebuggerCallFrame.cpp: Added calculatedFunctionName to match existing one in ProfileNode. - (JSC::DebuggerCallFrame::calculatedFunctionName): - * debugger/DebuggerCallFrame.h: Added calculatedFunctionName to match existing one in ProfileNode. - -2009-05-14 Gavin Barraclough <barraclough@apple.com> - - Build fix, not reviewed. - - Quick fixes for JIT builds with OPTIMIZE flags disabled. + * jit/JIT.h: Added data members and helper functions for recording + chained results. We record both a mapping from virtual to machine register + and the opcode for which the mapping is valid, to help ensure that the + mapping isn't used after the mapped register has been stomped by other + instructions. * jit/JITCall.cpp: + (JSC::JIT::compileOpCallVarargs): + (JSC::JIT::compileOpCallVarargsSlowCase): + (JSC::JIT::emit_op_ret): + (JSC::JIT::emit_op_construct_verify): (JSC::JIT::compileOpCall): - (JSC::JIT::compileOpCallSlowCase): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::compilePutByIdHotPath): - -2009-05-14 Steve Falkenburg <sfalken@apple.com> - - Back out incorrect Windows build fix - - * JavaScriptCore.vcproj/JavaScriptCore.make: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2009-05-14 Steve Falkenburg <sfalken@apple.com> - - Windows build fix - - * JavaScriptCore.vcproj/JavaScriptCore.make: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2009-05-14 Adam Roben <aroben@apple.com> - - Windows jsc build fix - - r43648 modified jsc.vcproj's post-build event not to try to copy files - that aren't present. Then r43661 mistakenly un-did that modification. - This patch restores the modification from r43648, but puts the code in - jscCommon.vsprops (where it should have been added in r43648). - - * JavaScriptCore.vcproj/jsc/jsc.vcproj: Restored empty - VCPostBuildEventTool tags. - * JavaScriptCore.vcproj/jsc/jscCommon.vsprops: Modified the post-build - event command line to match the one in jsc.vcproj from r43648. - -2009-05-14 Laszlo Gombos <laszlo.1.gombos@nokia.com> - - Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=25325 - - Make sure pthread_self() is declared before it gets called in Collector.cpp - - * runtime/Collector.cpp: Include pthread.h in most Unix-like platforms - (not just for OPENBSD) - -2009-05-14 Mark Rowe <mrowe@apple.com> - - Reviewed by Oliver Hunt. - - Fix <https://bugs.webkit.org/show_bug.cgi?id=25785>. - Bug 25785: Segfault in mark when using JSObjectMakeConstructor - - * API/JSObjectRef.cpp: - (JSObjectMakeConstructor): OpaqueJSClass::prototype can return 0. We need to use the default object prototype when it does. - * API/tests/testapi.c: - (main): Add a test case. - * runtime/JSObject.h: - (JSC::JSObject::putDirect): Add a clearer assertion for a null value. The assertion on the next line does catch this, - but the cause of the failure is not clear from the assertion itself. - -2009-05-14 Mark Rowe <mrowe@apple.com> - - Rubber-stamped by Darin Adler. - - <rdar://problem/6681868> When building with Xcode 3.1.3 should be using gcc 4.2 - - The meaning of XCODE_VERSION_ACTUAL is more sensible in newer versions of Xcode. - Update our logic to select the compiler version to use the more appropriate XCODE_VERSION_MINOR - if the version of Xcode supports it, and fall back to XCODE_VERSION_ACTUAL if not. - - * Configurations/Base.xcconfig: - -2009-05-14 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. - - Checking register file bounds should be a ptr comparison (m_end is a Register*). - Also, the compare should be unsigned, pointers don'ts go negative. - - * jit/JIT.cpp: - (JSC::JIT::privateCompile): - -2009-05-13 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Fix <rdar://problem/6882919> REGRESSION: page at Metroauto site crashes in cti_op_loop_if_less (25730) - - op_loop_if_less (imm < op) was loading op into regT1, but in the slow path spills regT0. - This leads to bad happen. - - * jit/JITOpcodes.cpp: - (JSC::JIT::emit_op_loop_if_less): - (JSC::JIT::emitSlow_op_loop_if_less): - -2009-05-13 Dmitry Titov <dimich@chromium.org> - - Rubber-stamped by Mark Rowe. - - https://bugs.webkit.org/show_bug.cgi?id=25746 - Revert http://trac.webkit.org/changeset/43507 which caused crash in PPC nightlies with Safari 4. - - * JavaScriptCore.exp: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - * bytecode/SamplingTool.cpp: - (JSC::SamplingThread::start): - (JSC::SamplingThread::stop): - * bytecode/SamplingTool.h: - * wtf/CrossThreadRefCounted.h: - (WTF::CrossThreadRefCounted::CrossThreadRefCounted): - (WTF::::ref): - (WTF::::deref): - * wtf/Threading.h: - * wtf/ThreadingNone.cpp: - * wtf/ThreadingPthreads.cpp: - (WTF::threadMapMutex): - (WTF::initializeThreading): - (WTF::threadMap): - (WTF::identifierByPthreadHandle): - (WTF::establishIdentifierForPthreadHandle): - (WTF::pthreadHandleForIdentifier): - (WTF::clearPthreadHandleForIdentifier): - (WTF::createThreadInternal): - (WTF::waitForThreadCompletion): - (WTF::detachThread): - (WTF::currentThread): - * wtf/ThreadingWin.cpp: - (WTF::threadMapMutex): - (WTF::initializeThreading): - (WTF::threadMap): - (WTF::storeThreadHandleByIdentifier): - (WTF::threadHandleForIdentifier): - (WTF::clearThreadHandleForIdentifier): - (WTF::createThreadInternal): - (WTF::waitForThreadCompletion): - (WTF::detachThread): - (WTF::currentThread): - * wtf/gtk/ThreadingGtk.cpp: - (WTF::threadMapMutex): - (WTF::initializeThreading): - (WTF::threadMap): - (WTF::identifierByGthreadHandle): - (WTF::establishIdentifierForThread): - (WTF::threadForIdentifier): - (WTF::clearThreadForIdentifier): - (WTF::createThreadInternal): - (WTF::waitForThreadCompletion): - (WTF::currentThread): - * wtf/qt/ThreadingQt.cpp: - (WTF::threadMapMutex): - (WTF::threadMap): - (WTF::identifierByQthreadHandle): - (WTF::establishIdentifierForThread): - (WTF::clearThreadForIdentifier): - (WTF::threadForIdentifier): - (WTF::initializeThreading): - (WTF::createThreadInternal): - (WTF::waitForThreadCompletion): - (WTF::currentThread): - -2009-05-13 Darin Adler <darin@apple.com> - - Revert the parser arena change. It was a slowdown, not a speedup. - Better luck next time (I'll break it up into pieces). - -2009-05-13 Darin Adler <darin@apple.com> - - Tiger build fix. - - * parser/Grammar.y: Add back empty code blocks, needed by older - versions of bison on certain rules. - -2009-05-13 Steve Falkenburg <sfalken@apple.com> - - Windows build fix. - - * JavaScriptCore.vcproj/jsc/jsc.vcproj: - -2009-05-13 Adam Roben <aroben@apple.com> - - Windows build fixes after r43642 - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - Updated. + (JSC::JIT::compileOpCallSlowCase): Chain function call results. - * debugger/Debugger.cpp: - * runtime/ArrayConstructor.cpp: - * runtime/JSArray.cpp: - * runtime/RegExp.cpp: - * runtime/RegExpConstructor.cpp: - * runtime/RegExpPrototype.cpp: - * runtime/StringPrototype.cpp: - Added missing #includes. - -2009-05-13 Darin Adler <darin@apple.com> - - Reviewed by Cameron Zwarich. - - Bug 25674: syntax tree nodes should use arena allocation - https://bugs.webkit.org/show_bug.cgi?id=25674 - - Step 3: Add some actual arena allocation. About 1% SunSpider speedup. - - * JavaScriptCore.exp: Updated. - - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::BytecodeGenerator): Updated since VarStack - contains const Identifier* now. - (JSC::BytecodeGenerator::emitPushNewScope): Updated to take a const - Identifier&. - * bytecompiler/BytecodeGenerator.h: Ditto - - * bytecompiler/SegmentedVector.h: Added isEmpty. - - * debugger/Debugger.cpp: - (JSC::Debugger::recompileAllJSFunctions): Moved this function here from - WebCore so WebCore doesn't need the details of FunctionBodyNode. - * debugger/Debugger.h: Ditto. - - * interpreter/Interpreter.cpp: - (JSC::Interpreter::execute): Updated since VarStack contains const - Identifier* now. - - * jit/JITStubs.cpp: - (JSC::JITStubs::cti_vm_lazyLinkCall): Call isHostFunction on the body - rather than on the function object, since we can't easily have inlined - access to the FunctionBodyNode in JSFunction.h since WebCore needs - access to that header. - (JSC::JITStubs::cti_op_construct_JSConstruct): Ditto. - * profiler/Profiler.cpp: - (JSC::Profiler::createCallIdentifier): Ditto. - - * parser/Grammar.y: Use JSGlobalData* to pass the global data pointer - around whenever possible instead of using void*. Changed - SET_EXCEPTION_LOCATION from a macro to an inline function. Marked - the structure-creating functions inline. Changed the VarStack to use - identifier pointers instead of actual identifiers. This takes - advantage of the fact that all identifier pointers come from the - arena and avoids reference count churn. Changed Identifier* to - const Identifier* to make sure we don't modify any by accident. - Used identifiers for regular expression strings too, using the new - scanRegExp that has out parameters instead of the old one that relied - on side effects in the Lexer. Move the creation of numeric identifiers - out of this file and into the PropertyNode constructor. - - * parser/Lexer.cpp: - (JSC::Lexer::setCode): Pass in ParserArena, used for identifiers. - (JSC::Lexer::makeIdentifier): Changed return type to const Identifier* - and changed to call ParserArena. - (JSC::Lexer::scanRegExp): Added out arguments that are const Identifier* - as well as a prefix character argument so we can handle the /= case - without a string append. - (JSC::Lexer::skipRegExp): Added. Skips a regular expression without - allocating Identifier objects. - (JSC::Lexer::clear): Removed the code to manage m_identifiers, m_pattern, - and m_flags, and added code to set m_arena to 0. - * parser/Lexer.h: Updated for changes above. - - * parser/NodeConstructors.h: - (JSC::ParserArenaFreeable::operator new): Added. Calls allocateFreeable - on the arena. - (JSC::ParserArenaDeletable::operator new): Changed to call the - allocateDeletable function on the arena instead of deleteWithArena. - (JSC::RegExpNode::RegExpNode): Changed arguments to Identifier instead - of UString since these come from the parser which makes identifiers. - (JSC::PropertyNode::PropertyNode): Added new constructor that makes - numeric identifiers. Some day we might want to optimize this for - integers so it doesn't create a string for each one. - (JSC::ContinueNode::ContinueNode): Initialize m_ident to nullIdentifier - since it's now a const Identifier& so it can't be left uninitialized. - (JSC::BreakNode::BreakNode): Ditto. - (JSC::CaseClauseNode::CaseClauseNode): Updated to use SourceElements* - to keep track of the statements rather than a separate statement vector. - (JSC::BlockNode::BlockNode): Ditto. - (JSC::ForInNode::ForInNode): Initialize m_ident to nullIdentifier. - - * parser/Nodes.cpp: Moved the comment explaining emitBytecode in here. - It seemed strangely out of place in the header. - (JSC::ThrowableExpressionData::emitThrowError): Added an overload for - UString as well as Identifier. - (JSC::SourceElements::singleStatement): Added. - (JSC::SourceElements::lastStatement): Added. - (JSC::RegExpNode::emitBytecode): Updated since the pattern and flags - are now Identifier instead of UString. Also changed the throwError code - to use the substitution mechanism instead of doing a string append. - (JSC::SourceElements::emitBytecode): Added. Replaces the old - statementListEmitCode function, since we now keep the SourceElements - objects around. - (JSC::BlockNode::lastStatement): Added. - (JSC::BlockNode::emitBytecode): Changed to use emitBytecode instead of - statementListEmitCode. - (JSC::CaseClauseNode::emitBytecode): Added. - (JSC::CaseBlockNode::emitBytecodeForBlock): Changed to use emitBytecode - instead of statementListEmitCode. - (JSC::ScopeNodeData::ScopeNodeData): Changed to store the - SourceElements* instead of using releaseContentsIntoVector. - (JSC::ScopeNode::emitStatementsBytecode): Added. - (JSC::ScopeNode::singleStatement): Added. - (JSC::ProgramNode::emitBytecode): Call emitStatementsBytecode instead - of statementListEmitCode. - (JSC::EvalNode::emitBytecode): Ditto. - (JSC::EvalNode::generateBytecode): Removed code to clear the children - vector. This optimization is no longer possible since everything is in - a single arena. - (JSC::FunctionBodyNode::emitBytecode): Call emitStatementsBytecode - insetad of statementListEmitCode and check for the return node using - the new functions. - - * parser/Nodes.h: Changed VarStack to store const Identifier* instead - of Identifier and rely on the arena to control lifetime. Added a new - ParserArenaFreeable class. Made ParserArenaDeletable inherit from - FastAllocBase instead of having its own operator new. Base the Node - class on ParserArenaFreeable. Changed the various Node classes - to use const Identifier& instead of Identifier to avoid the need to - call their destructors and allow them to function as "freeable" in the - arena. Removed extraneous JSC_FAST_CALL on definitions of inline functions. - Changed ElementNode, PropertyNode, ArgumentsNode, ParameterNode, - CaseClauseNode, ClauseListNode, and CaseBlockNode to use ParserArenaFreeable - as a base class since they do not descend from Node. Eliminated the - StatementVector type and instead have various classes use SourceElements* - instead of StatementVector. This prevents those classes from having th - use ParserArenaDeletable to make sure the vector destructor is called. - - * parser/Parser.cpp: - (JSC::Parser::parse): Pass the arena to the lexer. - - * parser/Parser.h: Added an include of ParserArena.h, which is no longer - included by Nodes.h. - - * parser/ParserArena.cpp: - (JSC::ParserArena::ParserArena): Added. Initializes the new members, - m_freeableMemory, m_freeablePoolEnd, and m_identifiers. - (JSC::ParserArena::freeablePool): Added. Computes the pool pointer, - since we store only the current pointer and the end of pool pointer. - (JSC::ParserArena::deallocateObjects): Added. Contains the common - memory-deallocation logic used by both the destructor and the - reset function. - (JSC::ParserArena::~ParserArena): Changed to call deallocateObjects. - (JSC::ParserArena::reset): Ditto. Also added code to zero out the - new structures, and switched to use clear() instead of shrink(0) since - we don't really reuse arenas. - (JSC::ParserArena::makeNumericIdentifier): Added. - (JSC::ParserArena::allocateFreeablePool): Added. Used when the pool - is empty. - (JSC::ParserArena::isEmpty): Added. No longer inline, which is fine - since this is used only for assertions at the moment. - - * parser/ParserArena.h: Added an actual arena of "freeable" objects, - ones that don't need destructors to be called. Also added the segmented - vector of identifiers that used to be in the Lexer. - - * runtime/FunctionConstructor.cpp: - (JSC::extractFunctionBody): Use singleStatement function rather than - getting at a StatementVector. - - * runtime/FunctionPrototype.cpp: - (JSC::functionProtoFuncToString): Call isHostFunction on the body - rather than the function object. - - * runtime/JSFunction.cpp: - (JSC::JSFunction::JSFunction): Moved the structure version of this in - here from the header. It's not hot enough that it needs to be inlined. - (JSC::JSFunction::isHostFunction): Moved this in here from the header. - It's now a helper to be used only within the class. - (JSC::JSFunction::setBody): Moved this in here. It's not hot enough that - it needs to be inlined, and we want to be able to compile the header - without the definition of FunctionBodyNode. - - * runtime/JSFunction.h: Eliminated the include of "Nodes.h". This was - exposing too much JavaScriptCore dependency to WebCore. Because of this - change and some changes made to WebCore, we could now export a lot fewer - headers from JavaScriptCore, but I have not done that yet in this check-in. - Made a couple functions non-inline. Removes some isHostFunction() assertions. - - * wtf/FastAllocBase.h: Added the conventional using statements we use in - WTF so we can use identifiers from the WTF namespace without explicit - namespace qualification or namespace directive. This is the usual WTF style, - although it's unconventional in the C++ world. We use the namespace primarily - for link-time disambiguation, not compile-time. - - * wtf/FastMalloc.cpp: Fixed an incorrect comment. - -2009-05-13 Xan Lopez <xlopez@igalia.com> - - Unreviewed build fix: add JITStubCall.h to files list. - - * GNUmakefile.am: - -2009-05-13 Ariya Hidayat <ariya.hidayat@nokia.com> - - Unreviewed build fix, as suggested by Yael Aharon <yael.aharon@nokia.com>. - - * wtf/qt/ThreadingQt.cpp: - (WTF::waitForThreadCompletion): renamed IsValid to isValid. - -2009-05-13 Jan Michael Alonzo <jmalonzo@webkit.org> - - Revert r43562 - [Gtk] WTF_USE_JSC is already defined in - WebCore/config.h. - - * wtf/Platform.h: - -2009-05-12 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Add SamplingCounter tool to provide a simple mechanism for counting events in JSC - (enabled using ENABLE(SAMPLING_COUNTERS)). To count events within a single function - use the class 'SamplingCounter', where the counter may be incremented from multiple - functions 'GlobalSamplingCounter' may be convenient; all other counters (stack or - heap allocated, rather than statically declared) should use the DeletableSamplingCounter. - Further description of these classes is provided alongside their definition in - SamplingTool.h. - - Counters may be incremented from c++ by calling the 'count()' method on the counter, - or may be incremented by JIT code by using the 'emitCount()' method within the JIT. - - This patch also fixes CODEBLOCK_SAMPLING, which was missing a null pointer check. - - * JavaScriptCore.exp: - * assembler/MacroAssemblerX86.h: - (JSC::MacroAssemblerX86::addWithCarry32): - (JSC::MacroAssemblerX86::and32): - (JSC::MacroAssemblerX86::or32): - * assembler/MacroAssemblerX86Common.h: - (JSC::MacroAssemblerX86Common::and32): - (JSC::MacroAssemblerX86Common::or32): - * assembler/MacroAssemblerX86_64.h: - (JSC::MacroAssemblerX86_64::and32): - (JSC::MacroAssemblerX86_64::or32): - (JSC::MacroAssemblerX86_64::addPtr): - * assembler/X86Assembler.h: - (JSC::X86Assembler::): - (JSC::X86Assembler::adcl_im): - (JSC::X86Assembler::addq_im): - (JSC::X86Assembler::andl_im): - (JSC::X86Assembler::orl_im): - * bytecode/SamplingTool.cpp: - (JSC::AbstractSamplingCounter::dump): - * bytecode/SamplingTool.h: - (JSC::AbstractSamplingCounter::count): - (JSC::GlobalSamplingCounter::name): - (JSC::SamplingCounter::SamplingCounter): - * jit/JIT.h: - * jit/JITCall.cpp: - (JSC::): * jit/JITInlineMethods.h: - (JSC::JIT::setSamplingFlag): - (JSC::JIT::clearSamplingFlag): - (JSC::JIT::emitCount): - * jsc.cpp: - (runWithScripts): - * parser/Nodes.cpp: - (JSC::ScopeNode::ScopeNode): - * wtf/Platform.h: + (JSC::JIT::emitLoadTag): + (JSC::JIT::emitLoadPayload): + (JSC::JIT::emitLoad): + (JSC::JIT::emitLoad2): + (JSC::JIT::isLabeled): + (JSC::JIT::map): + (JSC::JIT::unmap): + (JSC::JIT::isMapped): + (JSC::JIT::getMappedPayload): + (JSC::JIT::getMappedTag): Use helper functions when loading virtual + registers into machine registers, in case the loads can be eliminated + by chaining. -2009-05-13 Steve Falkenburg <sfalken@apple.com> - - Windows build fix. - - * JavaScriptCore.vcproj/JavaScriptCore.make: - -2009-05-12 Steve Falkenburg <sfalken@apple.com> - - Windows build fix. - - * JavaScriptCore.vcproj/JavaScriptCore.make: - -2009-05-12 Oliver Hunt <oliver@apple.com> - - Reviewed by Gavin Barraclough. + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_mov): + (JSC::JIT::emit_op_end): + (JSC::JIT::emit_op_instanceof): + (JSC::JIT::emit_op_get_global_var): + (JSC::JIT::emit_op_put_global_var): + (JSC::JIT::emit_op_get_scoped_var): + (JSC::JIT::emit_op_put_scoped_var): + (JSC::JIT::emit_op_to_primitive): + (JSC::JIT::emit_op_resolve_global): + (JSC::JIT::emit_op_jneq_ptr): + (JSC::JIT::emit_op_next_pname): + (JSC::JIT::emit_op_to_jsnumber): + (JSC::JIT::emit_op_catch): Chain results from these opcodes. + + (JSC::JIT::emit_op_profile_will_call): + (JSC::JIT::emit_op_profile_did_call): Load the profiler into regT2 to + avoid stomping a chained result. - <rdar://problem/6881457> Crash occurs at JSC::Interpreter::execute() when loading http://www.sears.com + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emit_op_method_check): + (JSC::JIT::emit_op_get_by_val): + (JSC::JIT::emit_op_get_by_id): Chain results from these opcodes. - We created the arguments objects before an op_push_scope but not - before op_push_new_scope, this meant a null arguments object could - be resolved inside catch blocks. + * jit/JITStubCall.h: + (JSC::JITStubCall::addArgument): Always use { regT1, regT0 }, to facilitate + chaining. - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::emitPushNewScope): + (JSC::JITStubCall::call): Unmap all mapped registers, since our callee + stub might stomp them. -2009-05-12 Oliver Hunt <oliver@apple.com> +2009-07-01 Sam Weinig <sam@webkit.org> Reviewed by Gavin Barraclough. - <rdar://problem/6879881> Crash occurs at JSC::JSActivation::mark() when loading http://www.monster.com; http://www.cnet.com - <https://bugs.webkit.org/show_bug.cgi?id=25736> Crash loading www.google.dk/ig (and other igoogle's as well) - - Following on from the lazy arguments creation patch, it's now - possible for an activation to to have a null register in the callframe - so we can't just blindly mark the local registers in an activation, - and must null check first instead. - - * API/tests/testapi.c: - (functionGC): - * API/tests/testapi.js: - (bludgeonArguments.return.g): - (bludgeonArguments): - * runtime/JSActivation.cpp: - (JSC::JSActivation::mark): + Don't reload values in emitBinaryDoubleOp. -2009-05-12 Gavin Barraclough <barraclough@apple.com> - - Rubber stamped by Geoff Garen. - - WTF_USE_CTI_REPATCH_PIC is no longer used, remove. + SunSpider reports a 0.6% progression. * jit/JIT.h: - * jit/JITStubCall.h: - -2009-05-12 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Maciej Stachowiak. - - We've run into some problems where changing the size of the class JIT leads to - performance fluctuations. Try forcing alignment in an attempt to stabalize this. - - * jit/JIT.h: - -2009-05-12 Kevin Ollivier <kevino@theolliviers.com> - - wx build fix. Add ParserArena.cpp to the build. - - * JavaScriptCoreSources.bkl: - -2009-05-12 Oliver Hunt <oliver@apple.com> + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_jnless): + (JSC::JIT::emit_op_jnlesseq): + (JSC::JIT::emitBinaryDoubleOp): - Reviewed by Geoff Garen. +2009-07-01 Sam Weinig <sam@webkit.org> - Unsigned underflow on 64bit cannot be treated as a negative number + Reviewed by Geoffrey Garen. - This code included some placeswhere we deliberately create negative offsets - from unsigned values, on 32bit this is "safe", but in 64bit builds much - badness occurs. Solution is to use signed types as nature intended. + Convert op_div to load op1 and op2 up front. - * jit/JITStubs.cpp: - (JSC::JITStubs::cti_op_load_varargs): + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_div): -2009-05-12 Jan Michael Alonzo <jmalonzo@webkit.org> +2009-07-01 Sam Weinig <sam@webkit.org> - Reviewed by Holger Freyther. + Reviewed by Geoffrey Garen. - [Gtk] Various autotools build refactoring and fixes - https://bugs.webkit.org/show_bug.cgi?id=25286 + Don't emit code in emitBinaryDoubleOp if code is unreachable, observable + via an empty (unlinked) jumplist passed in. This only effects op_jnless + and op_jnlesseq at present. - Define WTF_USE_JSC for the Gtk port. + * jit/JITArithmetic.cpp: + (JSC::JIT::emitSlow_op_jnless): + (JSC::JIT::emitSlow_op_jnlesseq): + (JSC::JIT::emitBinaryDoubleOp): - * wtf/Platform.h: +2009-07-01 Geoffrey Garen <ggaren@apple.com> -2009-05-12 Maciej Stachowiak <mjs@apple.com> + Reviewed by Sam Weinig. - Reviewed by Oliver Hunt. + Converted op_mod to put { tag, payload } in { regT1, regT0 }, and + tidied up its constant case. - - allow all of strictEqual to be inlined into cti_op_stricteq once again - - We had this optimization once but accidentally lost it at some point. + SunSpider reports a 0.2% regression, but a micro-benchmark of op_mod + shows a 12% speedup, and the SunSpider test that uses op_mod most should + benefit a lot from result caching in the end, since it almost always + performs (expression) % constant. - * runtime/Operations.h: - (JSC::JSValue::strictEqualSlowCaseInline): - (JSC::JSValue::strictEqual): + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_mod): + (JSC::JIT::emitSlow_op_mod): -2009-05-12 Gavin Barraclough <barraclough@apple.com> +2009-06-30 Sam Weinig <sam@webkit.org> - Reviewed by Oliver Hunt. + Reviewed by Geoffrey Garen. - instanceof should throw if the constructor being tested does not implement - 'HasInstance" (i.e. is a function). Instead we were returning false. + Converted some more arithmetic ops to put { tag, payload } in + { regT1, regT0 }. - * interpreter/Interpreter.cpp: - (JSC::isInvalidParamForIn): - (JSC::isInvalidParamForInstanceOf): - (JSC::Interpreter::privateExecute): - * jit/JITStubs.cpp: - (JSC::JITStubs::cti_op_instanceof): - * tests/mozilla/ecma_2/instanceof/instanceof-003.js: - Fix broken test case. - * tests/mozilla/ecma_2/instanceof/regress-7635.js: - Remove broken test case (was an exact duplicate of a test in instanceof-003.js). - -2009-05-12 Oliver Hunt <oliver@apple.com> + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_mul): + (JSC::JIT::emitSlow_op_mul): - Reviewed by Gavin Barraclough. +2009-06-30 Geoffrey Garen <ggaren@apple.com> - Improve function call forwarding performance + Reviewed by Sam Weinig. - Make creation of the Arguments object occur lazily, so it - is not necessarily created for every function that references - it. Then add logic to Function.apply to allow it to avoid - allocating the Arguments object at all. Helps a lot with - the function forwarding/binding logic in jQuery, Prototype, - and numerous other JS libraries. + Converted some more arithmetic ops to put { tag, payload } in + { regT1, regT0 }, and added a case for subtract constant. + + SunSpider says no change. v8 says 0.3% slower. - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::dump): - * bytecode/Opcode.h: - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::BytecodeGenerator): - (JSC::BytecodeGenerator::registerFor): - (JSC::BytecodeGenerator::willResolveToArguments): - (JSC::BytecodeGenerator::uncheckedRegisterForArguments): - (JSC::BytecodeGenerator::createArgumentsIfNecessary): - (JSC::BytecodeGenerator::emitCallEval): - (JSC::BytecodeGenerator::emitPushScope): - * bytecompiler/BytecodeGenerator.h: - * interpreter/Interpreter.cpp: - (JSC::Interpreter::privateExecute): - (JSC::Interpreter::retrieveArguments): - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): * jit/JIT.h: - * jit/JITOpcodes.cpp: - (JSC::JIT::emit_op_create_arguments): - (JSC::JIT::emit_op_init_arguments): - * jit/JITStubs.cpp: - (JSC::JITStubs::cti_op_tear_off_arguments): - (JSC::JITStubs::cti_op_load_varargs): - * parser/Nodes.cpp: - (JSC::ApplyFunctionCallDotNode::emitBytecode): - -2009-05-11 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_add): + (JSC::JIT::emitAdd32Constant): + (JSC::JIT::emitSlow_op_add): + (JSC::JIT::emit_op_sub): + (JSC::JIT::emitSub32Constant): + (JSC::JIT::emitSlow_op_sub): - Enable use of SamplingFlags directly from JIT code. +2009-06-30 Gavin Barraclough <barraclough@apple.com> - * bytecode/SamplingTool.h: - * jit/JIT.h: - (JSC::JIT::sampleCodeBlock): - (JSC::JIT::sampleInstruction): - * jit/JITInlineMethods.h: - (JSC::JIT::setSamplingFlag): - (JSC::JIT::clearSamplingFlag): + Reviewed by Sam Weinig. -2009-05-11 Gavin Barraclough <barraclough@apple.com> + Remove more uses of addressFor(), load double constants directly from + the constantpool in the CodeBlock, rather than from the register file. - Reviewed by Cameron Zwarich. + * jit/JITArithmetic.cpp: + (JSC::JIT::emitAdd32Constant): + (JSC::JIT::emitBinaryDoubleOp): - Implement JIT generation for instanceof for non-objects (always returns false). - Also fixes the sequencing of the prototype and value isObject checks, to no match the spec. +2009-06-30 Geoffrey Garen <ggaren@apple.com> - 0.5% progression on v8 tests overall, due to 3.5% on early-boyer. + Reviewed by Sam Weinig. + + Fixed a bug in postfix ops, where we would treat x = x++ and x = x-- + as a no-op, even if x were not an int, and the ++/-- could have side-effects. - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): - * runtime/JSObject.cpp: - (JSC::JSObject::hasInstance): - * runtime/TypeInfo.h: - (JSC::TypeInfo::TypeInfo): + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_post_inc): + (JSC::JIT::emitSlow_op_post_inc): + (JSC::JIT::emit_op_post_dec): + (JSC::JIT::emitSlow_op_post_dec): -2009-05-11 Geoffrey Garen <ggaren@apple.com> +2009-06-30 Geoffrey Garen <ggaren@apple.com> Reviewed by Sam Weinig. - A little more JIT refactoring. - - Rearranged code to more clearly indicate what's conditionally compiled - and why. Now, all shared code is at the top of our JIT files, and all - #if'd code is at the bottom. #if'd code is delineated by large comments. + Converted some arithmetic ops to put { tag, payload } in + { regT1, regT0 }. - Moved functions that relate to the JIT but don't explicitly do codegen - into JIT.cpp. Refactored SSE2 check to store its result as a data member - in the JIT. + SunSpider says 0.7% faster. v8 says no change. - * jit/JIT.cpp: - (JSC::isSSE2Present): - (JSC::JIT::JIT): - (JSC::JIT::unlinkCall): - (JSC::JIT::linkCall): * jit/JIT.h: - (JSC::JIT::isSSE2Present): * jit/JITArithmetic.cpp: - (JSC::JIT::emit_op_mod): - (JSC::JIT::emitSlow_op_mod): - * jit/JITCall.cpp: - (JSC::JIT::compileOpCallVarargs): - (JSC::JIT::compileOpCallVarargsSlowCase): + (JSC::JIT::emit_op_jnless): + (JSC::JIT::emit_op_jnlesseq): + (JSC::JIT::emit_op_lshift): + (JSC::JIT::emit_op_rshift): + (JSC::JIT::emit_op_bitand): + (JSC::JIT::emit_op_bitor): + (JSC::JIT::emit_op_bitxor): + * jit/JITInlineMethods.h: + (JSC::JIT::isOperandConstantImmediateInt): + (JSC::JIT::getOperandConstantImmediateInt): -2009-05-11 Holger Hans Peter Freyther <zecke@selfish.org> +2009-06-30 Gavin Barraclough <barraclough@apple.com> - Build fix. + Reviewed by Sam Weinig. - * JavaScriptCore.pri: Build the new JITOpcodes.cpp + Start removing cases of addressFor(). -2009-05-11 Sam Weinig <sam@webkit.org> + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::emitAdd32Constant): + (JSC::JIT::emitBinaryDoubleOp): + (JSC::JIT::emit_op_div): + * jit/JITInlineMethods.h: + (JSC::JIT::emitLoadDouble): + (JSC::JIT::emitLoadInt32ToDouble): + (JSC::JIT::emitStoreDouble): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_jfalse): + (JSC::JIT::emit_op_jtrue): - Reviewed by Geoffrey Garen. +2009-06-30 Geoffrey Garen <ggaren@apple.com> - More re-factoring of JIT code generation. Use a macro to - forward the main switch-statement cases to the helper functions. + Rolled back in my last patch with regression fixed. * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): (JSC::JIT::privateCompileSlowCases): + * jit/JIT.h: + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_loop_if_less): + (JSC::JIT::emit_op_loop_if_lesseq): + (JSC::JIT::emit_op_resolve_global): + (JSC::JIT::emitSlow_op_resolve_global): + (JSC::JIT::emit_op_eq): + (JSC::JIT::emitSlow_op_eq): + (JSC::JIT::emit_op_neq): + (JSC::JIT::emitSlow_op_neq): -2009-05-11 Sam Weinig <sam@webkit.org> - - Reviewed by Geoffrey Garen. +2009-06-30 Geoffrey Garen <ggaren@apple.com> - More re-factoring of JIT code generation to move opcode generation - to helper functions outside the main switch-statement and gave those - helper functions standardized names. This patch covers the remaining - slow cases. + Rolled out my last patch because it was a 2% SunSpider regression. * jit/JIT.cpp: + (JSC::JIT::privateCompileSlowCases): * jit/JIT.h: * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_loop_if_less): + (JSC::JIT::emit_op_loop_if_lesseq): + (JSC::JIT::emit_op_resolve_global): + (JSC::JIT::emit_op_eq): + (JSC::JIT::emitSlow_op_eq): + (JSC::JIT::emit_op_neq): + (JSC::JIT::emitSlow_op_neq): -2009-05-11 Geoffrey Garen <ggaren@apple.com> - - Build fix. - - * GNUmakefile.am: Added JITOpcodes.cpp and JITStubCall.h to the project. - -2009-05-11 Geoffrey Garen <ggaren@apple.com> - - Build fix. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Added - JITOpcodes.cpp and JITStubCall.h to the project. - -2009-05-11 Geoffrey Garen <ggaren@apple.com> +2009-06-30 Geoffrey Garen <ggaren@apple.com> - Reviewed by Sam Weinig. - - Some JIT refactoring. + Reviewed by Gavin "Sam Weinig" Barraclough. - Moved JITStubCall* into its own header. - - Modified JITStubCall to ASSERT that its return value is handled correctly. - Also, replaced function template with explicit instantiations to resolve - some confusion. - - Replaced all uses of emit{Get,Put}CTIArgument with explicit peeks, pokes, - and calls to killLastResultRegister(). + Standardized the rest of our opcodes to put { tag, payload } in + { regT1, regT0 } where possible. - * JavaScriptCore.xcodeproj/project.pbxproj: * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompile): + (JSC::JIT::privateCompileSlowCases): * jit/JIT.h: - * jit/JITArithmetic.cpp: - * jit/JITCall.cpp: - * jit/JITInlineMethods.h: - (JSC::JIT::restoreArgumentReference): - * jit/JITPropertyAccess.cpp: - * jit/JITStubCall.h: Copied from jit/JIT.h. - (JSC::JITStubCall::JITStubCall): - (JSC::JITStubCall::addArgument): - (JSC::JITStubCall::call): - (JSC::JITStubCall::): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_loop_if_less): + (JSC::JIT::emit_op_loop_if_lesseq): + (JSC::JIT::emit_op_resolve_global): + (JSC::JIT::emitSlow_op_resolve_global): + (JSC::JIT::emit_op_eq): + (JSC::JIT::emitSlow_op_eq): + (JSC::JIT::emit_op_neq): + (JSC::JIT::emitSlow_op_neq): -2009-05-11 Sam Weinig <sam@webkit.org> +2009-06-30 Gavin Barraclough <barraclough@apple.com> Reviewed by Geoffrey Garen. - Start re-factoring JIT code generation to move opcode generation - to helper functions outside the main switch-statement and gave those - helper functions standardized names. This patch only covers the main - pass and all the arithmetic opcodes in the slow path. + Replace calls to store32(tagFor()) and store32(payloadFor()) + with emitStoreInt32(), emitStoreBool(), and emitStoreCell(). - * JavaScriptCore.xcodeproj/project.pbxproj: - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): * jit/JIT.h: * jit/JITArithmetic.cpp: - * jit/JITOpcodes.cpp: Copied from jit/JIT.cpp. - * jit/JITPropertyAccess.cpp: + (JSC::JIT::emit_op_negate): + (JSC::JIT::emit_op_lshift): + (JSC::JIT::emit_op_rshift): + (JSC::JIT::emit_op_bitand): + (JSC::JIT::emitBitAnd32Constant): + (JSC::JIT::emit_op_bitor): + (JSC::JIT::emitBitOr32Constant): + (JSC::JIT::emit_op_bitxor): + (JSC::JIT::emitBitXor32Constant): + (JSC::JIT::emit_op_bitnot): + (JSC::JIT::emit_op_post_inc): + (JSC::JIT::emit_op_post_dec): + (JSC::JIT::emit_op_pre_inc): + (JSC::JIT::emit_op_pre_dec): + (JSC::JIT::emit_op_add): + (JSC::JIT::emitAdd32Constant): + (JSC::JIT::emit_op_sub): + (JSC::JIT::emitSub32ConstantLeft): + (JSC::JIT::emitSub32ConstantRight): + (JSC::JIT::emit_op_mul): + (JSC::JIT::emitSlow_op_mul): + (JSC::JIT::emit_op_div): + (JSC::JIT::emit_op_mod): + * jit/JITCall.cpp: + (JSC::JIT::emit_op_load_varargs): + * jit/JITInlineMethods.h: + (JSC::JIT::emitStoreInt32): + (JSC::JIT::emitStoreCell): + (JSC::JIT::emitStoreBool): + (JSC::JIT::emitStore): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_instanceof): + (JSC::JIT::emit_op_not): + (JSC::JIT::emit_op_eq): + (JSC::JIT::emitSlow_op_eq): + (JSC::JIT::emit_op_neq): + (JSC::JIT::emitSlow_op_neq): + (JSC::JIT::compileOpStrictEq): + (JSC::JIT::emit_op_eq_null): + (JSC::JIT::emit_op_neq_null): + * jit/JITStubCall.h: + (JSC::JITStubCall::call): -2009-05-11 Steve Falkenburg <sfalken@apple.com> +2009-06-30 Geoffrey Garen <ggaren@apple.com> - Re-add experimental PGO configs. + Reviewed by Sam Weinig. - Reviewed by Adam Roben. - - * JavaScriptCore.vcproj/JavaScriptCore.make: - * JavaScriptCore.vcproj/JavaScriptCore.sln: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.vcproj/JavaScriptCoreSubmit.sln: - * JavaScriptCore.vcproj/jsc/jsc.vcproj: - -2009-05-11 Sam Weinig <sam@webkit.org> - - Reviewed by Geoffrey "1" Garen. - - Rip out the !USE(CTI_REPATCH_PIC) code. It was untested and unused. - - * jit/JIT.h: - (JSC::JIT::compileGetByIdChainList): - (JSC::JIT::compileGetByIdChain): - (JSC::JIT::compileCTIMachineTrampolines): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::privateCompileGetByIdProto): - (JSC::JIT::privateCompileGetByIdChainList): - (JSC::JIT::privateCompileGetByIdChain): - * jit/JITStubs.cpp: - (JSC::JITStubs::tryCachePutByID): - (JSC::JITStubs::tryCacheGetByID): - -2009-05-11 Dmitry Titov <dimich@chromium.org> - - GTK build fix - the deprecated waitForThreadCompletion is not needed on GTK. - - * wtf/ThreadingPthreads.cpp: used #ifdef PLATFORM(DARWIN) around waitForThreadCompletion(). - -2009-05-11 Adam Roben <aroben@apple.com> - - Build fix for newer versions of GCC - - * wtf/ThreadingPthreads.cpp: Added a declaration of - waitForThreadCompletion before its definition to silence a warning. - -2009-05-11 Dmitry Titov <dimich@chromium.org> - - Reviewed by Alexey Proskuryakov and Adam Roben. - - https://bugs.webkit.org/show_bug.cgi?id=25348 - Change WTF::ThreadIdentifier to be an actual (but wrapped) thread id, remove ThreadMap. - - * wtf/Threading.h: - (WTF::ThreadIdentifier::ThreadIdentifier): - (WTF::ThreadIdentifier::isValid): - (WTF::ThreadIdentifier::invalidate): - (WTF::ThreadIdentifier::platformId): - ThreadIdentifier is now a class, containing a PlatformThreadIdentifier and - methods that are used across the code on thread ids: construction, comparisons, - check for 'valid' state etc. '0' is used as invalid id, which happens to just work - with all platform-specific thread id implementations. - - All the following files repeatedly reflect the new ThreadIdentifier for each platform. - We remove ThreadMap and threadMapMutex from all of them, remove the functions that - populated/searched/cleared the map and add platform-specific comparison operators - for ThreadIdentifier. - - There are specific temporary workarounds for Safari 4 beta on OSX and Win32 since the - public build uses WTF threading functions with old type of ThreadingIdentifier. - The next time Safari 4 is rebuilt, it will 'automatically' pick up the new type and new - functions so the deprecated ones can be removed. - - * wtf/gtk/ThreadingGtk.cpp: - (WTF::ThreadIdentifier::operator==): - (WTF::ThreadIdentifier::operator!=): - (WTF::initializeThreading): - (WTF::createThreadInternal): - (WTF::waitForThreadCompletion): - (WTF::currentThread): - - * wtf/ThreadingNone.cpp: - (WTF::ThreadIdentifier::operator==): - (WTF::ThreadIdentifier::operator!=): - - * wtf/ThreadingPthreads.cpp: - (WTF::ThreadIdentifier::operator==): - (WTF::ThreadIdentifier::operator!=): - (WTF::initializeThreading): - (WTF::createThreadInternal): - (WTF::waitForThreadCompletion): - (WTF::detachThread): - (WTF::currentThread): - (WTF::waitForThreadCompletion): This is a workaround for Safari 4 beta on Mac. - Safari 4 is linked against old definition of ThreadIdentifier so it treats it as uint32_t. - This 'old' variant of waitForThreadCompletion takes uint32_t and has the old decorated name, so Safari can - load it from JavaScriptCore library. The other functions (CurrentThread() etc) happen to match their previous - decorated names and, while they return pthread_t now, it is a pointer which round-trips through a uint32_t. - This function will be removed as soon as Safari 4 will release next public build. - - * wtf/qt/ThreadingQt.cpp: - (WTF::ThreadIdentifier::operator==): - (WTF::ThreadIdentifier::operator!=): - (WTF::initializeThreading): - (WTF::createThreadInternal): - (WTF::waitForThreadCompletion): - (WTF::currentThread): - - * wtf/ThreadingWin.cpp: - (WTF::ThreadIdentifier::operator==): - (WTF::ThreadIdentifier::operator!=): - (WTF::initializeThreading): - (WTF::createThreadInternal): All the platforms (except Windows) used a sequential - counter as a thread ID and mapped it into platform ID. Windows was using native thread - id and mapped it into thread handle. Since we can always obtain a thread handle - by thread id, createThread now closes the handle. - (WTF::waitForThreadCompletion): obtains another one using OpenThread(id) API. If can not obtain a handle, - it means the thread already exited. - (WTF::detachThread): - (WTF::currentThread): - (WTF::detachThreadDeprecated): old function, renamed (for Win Safari 4 beta which uses it for now). - (WTF::waitForThreadCompletionDeprecated): same. - (WTF::currentThreadDeprecated): same. - (WTF::createThreadDeprecated): same. - - * bytecode/SamplingTool.h: - * bytecode/SamplingTool.cpp: Use DEFINE_STATIC_LOCAL for a static ThreadIdentifier variable, to avoid static constructor. - - * JavaScriptCore.exp: export lists - updated decorated names of the WTF threading functions - since they now take a different type as a parameter. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: ditto for Windows, plus added "deprecated" functions - that take old parameter type - turns out public beta of Safari 4 uses those, so they need to be kept along for a while. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: ditto. - -2009-05-11 Darin Adler <darin@apple.com> - - Reviewed by Oliver Hunt. - - Bug 25560: REGRESSION (r34821): "string value".__proto__ gets the wrong object. - https://bugs.webkit.org/show_bug.cgi?id=25560 - rdar://problem/6861069 - - I missed this case back a year ago when I sped up handling - of JavaScript wrappers. Easy to fix. - - * runtime/JSObject.h: - (JSC::JSValue::get): Return the prototype itself if the property name - is __proto__. - * runtime/JSString.cpp: - (JSC::JSString::getOwnPropertySlot): Ditto. - -2009-05-09 Oliver Hunt <oliver@apple.com> - - Reviewed by Maciej Stachowiak. + Standardized the rest of the property access instructions to put { tag, + payload } in { regT1, regT0 }. - Rename emitGetFromCallFrameHeader to emitGetFromCallFrameHeaderPtr + Small v8 speedup, 0.2% SunSpider slowdown. - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileCTIMachineTrampolines): * jit/JIT.h: * jit/JITInlineMethods.h: - (JSC::JIT::emitGetFromCallFrameHeaderPtr): - (JSC::JIT::emitGetFromCallFrameHeader32): - -2009-05-11 Holger Hans Peter Freyther <zecke@selfish.org> - - Unreviewed build fix. Build ParserAreana.cpp for Qt - - * JavaScriptCore.pri: - -2009-05-11 Norbert Leser <norbert.leser@nokia.com> - - Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=24536 - - Symbian compilers cannot resolve WTF::PassRefPtr<JSC::Profile> - unless Profile.h is included. - - * profiler/ProfileGenerator.h: - -2009-05-11 Csaba Osztrogonac <oszi@inf.u-szeged.hu> - - Reviewed by Holger Freyther. - - https://bugs.webkit.org/show_bug.cgi?id=24284 - - * JavaScriptCore.pri: coding style modified - * jsc.pro: duplicated values removed from INCLUDEPATH, DEFINES - -2009-05-11 Gustavo Noronha Silva <gustavo.noronha@collabora.co.uk> - - Reviewed by NOBODY (build fix). - - Also add ParserArena, in addition to AllInOne, for release builds, - since adding it to AllInOne breaks Mac. - - * GNUmakefile.am: - -2009-05-11 Gustavo Noronha Silva <gustavo.noronha@collabora.co.uk> - - Unreviewed build fix. Adding ParserArena to the autotools build. - - * GNUmakefile.am: - -2009-05-11 Adam Roben <aroben@apple.com> - - More Windows build fixes after r43479 - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - Export ParserArena::reset. - -2009-05-11 Adam Roben <aroben@apple.com> - - Windows build fixes after r43479 - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Added - ParserArena to the project. - - * parser/NodeConstructors.h: Added a missing include. - (JSC::ParserArenaDeletable::operator new): Marked these as inline. - -2009-05-10 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Geoff Garen. - - - fixed REGRESSION(r43432): Many JavaScriptCore tests crash in 64-bit - https://bugs.webkit.org/show_bug.cgi?id=25680 - - Accound for the 64-bit instruction prefix when rewriting mov to lea on 64-bit. - - * jit/JIT.h: + (JSC::JIT::emitLoad): + (JSC::JIT::emitLoad2): * jit/JITPropertyAccess.cpp: - (JSC::JIT::patchGetByIdSelf): + (JSC::JIT::emit_op_get_by_val): + (JSC::JIT::emitSlow_op_get_by_val): + (JSC::JIT::emit_op_put_by_val): + (JSC::JIT::emitSlow_op_put_by_val): + (JSC::JIT::emit_op_put_by_id): + (JSC::JIT::emitSlow_op_put_by_id): (JSC::JIT::patchPutByIdReplace): -2009-05-10 Darin Adler <darin@apple.com> - - Reviewed by Cameron Zwarich. - - Bug 25674: syntax tree nodes should use arena allocation - https://bugs.webkit.org/show_bug.cgi?id=25674 - - Part two: Remove reference counting from most nodes. - - * JavaScriptCore.exp: Updated. - - * JavaScriptCore.xcodeproj/project.pbxproj: Added ParserArena.h and .cpp. - - * parser/Grammar.y: Replaced uses of ParserRefCountedData with uses of - ParserArenaData. Took out now-nonfunctional code that tries to manually - release declaration list. Changed the new calls that create FuncDeclNode - and FuncExprNode so that they use the proper version of operator new for - the reference-counted idiom, not the deletion idiom. - - * parser/NodeConstructors.h: - (JSC::ParserArenaDeletable::operator new): Added. - (JSC::ParserArenaRefCounted::ParserArenaRefCounted): Added. - (JSC::Node::Node): Removed ParserRefCounted initializer. - (JSC::ElementNode::ElementNode): Ditto. - (JSC::PropertyNode::PropertyNode): Ditto. - (JSC::ArgumentsNode::ArgumentsNode): Ditto. - (JSC::SourceElements::SourceElements): Ditto. - (JSC::ParameterNode::ParameterNode): Ditto. - (JSC::FuncExprNode::FuncExprNode): Added ParserArenaRefCounted initializer. - (JSC::FuncDeclNode::FuncDeclNode): Ditto. - (JSC::CaseClauseNode::CaseClauseNode): Removed ParserRefCounted initializer. - (JSC::ClauseListNode::ClauseListNode): Ditto. - (JSC::CaseBlockNode::CaseBlockNode): Ditto. - - * parser/NodeInfo.h: Replaced uses of ParserRefCountedData with uses of - ParserArenaData. - - * parser/Nodes.cpp: - (JSC::ScopeNode::ScopeNode): Added ParserArenaRefCounted initializer. - (JSC::ProgramNode::create): Use the proper version of operator new for - the reference-counted idiom, not the deletion idiom. Use the arena - contains function instead of the vecctor find function. - (JSC::EvalNode::create): Use the proper version of operator new for - the reference-counted idiom, not the deletion idiom. Use the arena - reset function instead of the vector shrink function. - (JSC::FunctionBodyNode::createNativeThunk): Use the proper version - of operator new for the reference-counted idiom, not the deletion idiom. - (JSC::FunctionBodyNode::create): More of the same. - - * parser/Nodes.h: Added ParserArenaDeletable and ParserArenaRefCounted - to replace ParserRefCounted. Fixed inheritance so only the classes that - need reference counting inherit from ParserArenaRefCounted. - - * parser/Parser.cpp: - (JSC::Parser::parse): Set m_sourceElements to 0 since it now starts - uninitialized. Just set it to 0 again in the failure case, since it's - now just a raw pointer, not an owning one. - (JSC::Parser::reparseInPlace): Removed now-unneeded get() function. - (JSC::Parser::didFinishParsing): Replaced uses of ParserRefCountedData - with uses of ParserArenaData. - - * parser/Parser.h: Less RefPtr, more arena. - - * parser/ParserArena.cpp: Added. - * parser/ParserArena.h: Added. - - * runtime/JSGlobalData.cpp: - (JSC::JSGlobalData::~JSGlobalData): Removed arena-related code, since it's - now in the Parser. - (JSC::JSGlobalData::createLeaked): Removed unneeded #ifndef. - (JSC::JSGlobalData::createNativeThunk): Tweaked #if a bit. - - * runtime/JSGlobalData.h: Removed parserArena, which is now in Parser. - - * wtf/RefCounted.h: Added deletionHasBegun function, for use in - assertions to catch deletion not done by the deref function. - -2009-05-10 David Kilzer <ddkilzer@apple.com> - - Part 2: Try to fix the Windows build by adding a symbol which is really just a re-mangling of a changed method signature - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - -2009-05-10 David Kilzer <ddkilzer@apple.com> - - Try to fix the Windows build by removing an unknown symbol - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - -2009-05-10 David Kilzer <ddkilzer@apple.com> - - Touch Nodes.cpp to try to fix Windows build - - * parser/Nodes.cpp: Removed whitespace. - -2009-05-10 Darin Adler <darin@apple.com> - - Reviewed by Maciej Stachowiak. - - Quick fix for failures seen on buildbot. Maciej plans a better fix later. - - * wtf/dtoa.cpp: Change the hardcoded number of 32-bit words in a BigInt - from 32 to 64. Parsing "1e500", for example, requires more than 32 words. - -2009-05-10 Darin Adler <darin@apple.com> - - Reviewed by Sam Weinig. - - Bug 25674: syntax tree nodes should use arena allocation - Part one: Change lifetimes so we won't have to use reference - counting so much, but don't eliminate the reference counts - entirely yet. - - * JavaScriptCore.exp: Updated. - - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::BytecodeGenerator): Update for use of raw pointers - instead of RefPtr. - (JSC::BytecodeGenerator::emitCall): Ditto. - (JSC::BytecodeGenerator::emitConstruct): Ditto. - - * parser/Grammar.y: Update node creating code to use new (JSGlobalData*) - instead of the plain new. At the moment this is just a hook for future - arena allocation; it's inline and JSGlobalData* is not used. - - * parser/NodeConstructors.h: Updated for name change of parserObjects to - parserArena. Also added explicit initialization for raw pointers that used - to be RefPtr. Also removed some uses of get() that aren't needed now that - the pointers are raw pointers. Also eliminated m_parameter from FuncExprNode - and FuncDeclNode. Also changed node-creating code to use new (JSGlobalData*) - as above. - - * parser/Nodes.cpp: Eliminated NodeReleaser and all use of it. - (JSC::ParserRefCounted::ParserRefCounted): Updated for name change of - parserObjects to parserArena. - (JSC::SourceElements::append): Use raw pointers. - (JSC::ArrayNode::emitBytecode): Ditto. - (JSC::ArrayNode::isSimpleArray): Ditto. - (JSC::ArrayNode::toArgumentList): Ditto. - (JSC::ObjectLiteralNode::emitBytecode): Ditto. - (JSC::PropertyListNode::emitBytecode): Ditto. - (JSC::BracketAccessorNode::emitBytecode): Ditto. - (JSC::DotAccessorNode::emitBytecode): Ditto. - (JSC::ArgumentListNode::emitBytecode): Ditto. - (JSC::NewExprNode::emitBytecode): Ditto. - (JSC::EvalFunctionCallNode::emitBytecode): Ditto. - (JSC::FunctionCallValueNode::emitBytecode): Ditto. - (JSC::FunctionCallResolveNode::emitBytecode): Ditto. - (JSC::FunctionCallBracketNode::emitBytecode): Ditto. - (JSC::FunctionCallDotNode::emitBytecode): Ditto. - (JSC::CallFunctionCallDotNode::emitBytecode): Ditto. - (JSC::ApplyFunctionCallDotNode::emitBytecode): Ditto. - (JSC::PostfixBracketNode::emitBytecode): Ditto. - (JSC::PostfixDotNode::emitBytecode): Ditto. - (JSC::DeleteBracketNode::emitBytecode): Ditto. - (JSC::DeleteDotNode::emitBytecode): Ditto. - (JSC::DeleteValueNode::emitBytecode): Ditto. - (JSC::VoidNode::emitBytecode): Ditto. - (JSC::TypeOfValueNode::emitBytecode): Ditto. - (JSC::PrefixBracketNode::emitBytecode): Ditto. - (JSC::PrefixDotNode::emitBytecode): Ditto. - (JSC::UnaryOpNode::emitBytecode): Ditto. - (JSC::BinaryOpNode::emitStrcat): Ditto. - (JSC::BinaryOpNode::emitBytecode): Ditto. - (JSC::EqualNode::emitBytecode): Ditto. - (JSC::StrictEqualNode::emitBytecode): Ditto. - (JSC::ReverseBinaryOpNode::emitBytecode): Ditto. - (JSC::ThrowableBinaryOpNode::emitBytecode): Ditto. - (JSC::InstanceOfNode::emitBytecode): Ditto. - (JSC::LogicalOpNode::emitBytecode): Ditto. - (JSC::ConditionalNode::emitBytecode): Ditto. - (JSC::ReadModifyResolveNode::emitBytecode): Ditto. - (JSC::AssignResolveNode::emitBytecode): Ditto. - (JSC::AssignDotNode::emitBytecode): Ditto. - (JSC::ReadModifyDotNode::emitBytecode): Ditto. - (JSC::AssignBracketNode::emitBytecode): Ditto. - (JSC::ReadModifyBracketNode::emitBytecode): Ditto. - (JSC::CommaNode::emitBytecode): Ditto. - (JSC::ConstDeclNode::emitCodeSingle): Ditto. - (JSC::ConstDeclNode::emitBytecode): Ditto. - (JSC::ConstStatementNode::emitBytecode): Ditto. - (JSC::statementListEmitCode): Ditto. - (JSC::BlockNode::emitBytecode): Ditto. - (JSC::ExprStatementNode::emitBytecode): Ditto. - (JSC::VarStatementNode::emitBytecode): Ditto. - (JSC::IfNode::emitBytecode): Ditto. - (JSC::IfElseNode::emitBytecode): Ditto. - (JSC::DoWhileNode::emitBytecode): Ditto. - (JSC::WhileNode::emitBytecode): Ditto. - (JSC::ForNode::emitBytecode): Ditto. - (JSC::ForInNode::emitBytecode): Ditto. - (JSC::ReturnNode::emitBytecode): Ditto. - (JSC::WithNode::emitBytecode): Ditto. - (JSC::CaseBlockNode::tryOptimizedSwitch): Ditto. - (JSC::CaseBlockNode::emitBytecodeForBlock): Ditto. - (JSC::SwitchNode::emitBytecode): Ditto. - (JSC::LabelNode::emitBytecode): Ditto. - (JSC::ThrowNode::emitBytecode): Ditto. - (JSC::TryNode::emitBytecode): Ditto. - (JSC::ScopeNodeData::ScopeNodeData): Use swap to transfer ownership - of the arena, varStack and functionStack. - (JSC::ScopeNode::ScopeNode): Pass in the arena when creating the - ScopeNodeData. - (JSC::ProgramNode::ProgramNode): Made this inline since it's used - in only one place. - (JSC::ProgramNode::create): Changed this to return a PassRefPtr since - we plan to have the scope nodes be outside the arena, so they will need - some kind of ownership transfer (maybe auto_ptr instead of PassRefPtr - in the future, though). Remove the node from the newly-created arena to - avoid a circular reference. Later we'll keep the node out of the arena - by using a different operator new, but for now it's the ParserRefCounted - constructor that puts the node into the arena, and there's no way to - bypass that. - (JSC::EvalNode::EvalNode): Ditto. - (JSC::EvalNode::create): Ditto. - (JSC::FunctionBodyNode::FunctionBodyNode): Ditto. - (JSC::FunctionBodyNode::createNativeThunk): Moved the code that - reseets the arena here instead of the caller. - (JSC::FunctionBodyNode::create): Same change as the other create - functions above. - (JSC::FunctionBodyNode::emitBytecode): Use raw pointers. - - * parser/Nodes.h: Removed NodeReleaser. Changed FunctionStack to - use raw pointers. Removed the releaseNodes function. Added an override - of operator new that takes a JSGlobalData* to prepare for future arena use. - Use raw pointers instead of RefPtr everywhere possible. - - * parser/Parser.cpp: - (JSC::Parser::reparseInPlace): Pass the arena in. - - * parser/Parser.h: - (JSC::Parser::parse): Updated for name change of parserObjects to parserArena. - (JSC::Parser::reparse): Ditto. - * runtime/FunctionConstructor.cpp: - (JSC::extractFunctionBody): Ditto. - * runtime/JSGlobalData.cpp: - (JSC::JSGlobalData::~JSGlobalData): Ditto. - (JSC::JSGlobalData::createNativeThunk): Moved arena manipulation into the - FunctionBodyNode::createNativeThunk function. - - * runtime/JSGlobalData.h: Tweaked formatting and renamed parserObjects to - parserArena. +2009-06-29 Sam Weinig <sam@webkit.org> - * wtf/NotFound.h: Added the usual "using WTF" to this header to match the - rest of WTF. - -2009-05-10 Dimitri Glazkov <dglazkov@chromium.org> - - Reviewed by Geoffrey Garen. - - https://bugs.webkit.org/show_bug.cgi?id=25670 - Remove no longer valid chunk of code from dtoa. - - * wtf/dtoa.cpp: - (WTF::dtoa): Removed invalid code. - -2009-05-10 Alexey Proskuryakov <ap@webkit.org> - - Reviewed by Geoff Garen. - - "Class const *" is the same as "const Class*", use the latter syntax consistently. - - See <http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.9>. - - * pcre/pcre_compile.cpp: - (calculateCompiledPatternLength): - * runtime/JSObject.h: - (JSC::JSObject::offsetForLocation): - (JSC::JSObject::locationForOffset): - -2009-05-10 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Alexey Proskuryakov. - - - speedup dtoa/strtod - - Added a bunch of inlining, and replaced malloc with stack allocation. - - 0.5% SunSpider speedup (7% on string-tagcloud). - - * runtime/NumberPrototype.cpp: - (JSC::integerPartNoExp): - (JSC::numberProtoFuncToExponential): - * runtime/UString.cpp: - (JSC::concatenate): - (JSC::UString::from): - * wtf/dtoa.cpp: - (WTF::BigInt::BigInt): - (WTF::BigInt::operator=): - (WTF::Balloc): - (WTF::Bfree): - (WTF::multadd): - (WTF::s2b): - (WTF::i2b): - (WTF::mult): - (WTF::pow5mult): - (WTF::lshift): - (WTF::cmp): - (WTF::diff): - (WTF::b2d): - (WTF::d2b): - (WTF::ratio): - (WTF::strtod): - (WTF::quorem): - (WTF::freedtoa): - (WTF::dtoa): - * wtf/dtoa.h: - -2009-05-09 Mike Hommey <glandium@debian.org> - - Reviewed by Geoffrey Garen. Landed by Jan Alonzo. - - Enable JIT on x86-64 gtk+ - https://bugs.webkit.org/show_bug.cgi?id=24724 - - * GNUmakefile.am: - -2009-05-09 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Cameron Zwarich. - - Removed the last non-call-related manually managed JIT stub call. - - * jit/JITArithmetic.cpp: - (JSC::JIT::compileFastArithSlow_op_rshift): Fully use the JITStubCall - abstraction, instead of emitPutJITStubArg. - -2009-05-09 Sebastian Andrzej Siewior <sebastian@breakpoint.cc> - - Reviewed by Gustavo Noronha. - - https://bugs.webkit.org/show_bug.cgi?id=25653 - PLATFORM(X86_64) inherits ia64 - - __ia64__ is defined by gcc in an IA64 arch and has completely - nothing in common with X86-64 exept both are from Intel and have - an 64bit address space. That's it. Since code seems to expect x86 - here, ia64 has to go. - - * wtf/Platform.h: - -2009-05-09 Gustavo Noronha Silva <gns@gnome.org> - - Suggested by Geoffrey Garen. + Reviewed by Gavin Barraclough. - Assume SSE2 is present on X86-64 and on MAC X86-32. This fixes a - build breakage on non-Mac X86-64 when JIT is enabled. + Various cleanups. + - Use fpRegT* instead of X86::xmm*. + - Use a switch statement in emitBinaryDoubleOp instead of a bunch of + if/elses. * jit/JITArithmetic.cpp: + (JSC::JIT::emitAdd32Constant): + (JSC::JIT::emitBinaryDoubleOp): + (JSC::JIT::emit_op_div): -2009-05-09 Gustavo Noronha Silva <gns@gnome.org> - - Build fix, adding missing files to make dist. - - * GNUmakefile.am: - -2009-05-09 Geoffrey Garen <ggaren@apple.com> - - Windows build fix. +2009-06-29 Sam Weinig <sam@webkit.org> - * assembler/X86Assembler.h: - (JSC::X86Assembler::patchLoadToLEA): + Reviewed by Geoffrey Garen. -2009-05-09 Geoffrey Garen <ggaren@apple.com> + Add inline code dealing with doubles for op_jfalse and op_jtrue. - Windows build fix. + * assembler/MacroAssemblerX86Common.h: + (JSC::MacroAssemblerX86Common::): + (JSC::MacroAssemblerX86Common::zeroDouble): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_jfalse): + (JSC::JIT::emit_op_jtrue): - * assembler/X86Assembler.h: - (JSC::X86Assembler::patchLoadToLEA): +2009-06-28 Geoffrey Garen <ggaren@apple.com> -2009-05-09 Maciej Stachowiak <mjs@apple.com> + Reviewed by Sam Weinig. - Reviewed by Gavin Barraclough. + Standardized op_get_by_id to put { tag, payload } in { regT1, regT0 }. - Original patch by John McCall. Updated by Cameron Zwarich. Further refined by me. - - - Assorted speedups to property access - - ~.3%-1% speedup on SunSpider - - 1) When we know from the structure ID that an object is using inline storage, plant direct - loads and stores against it; no need to indirect through storage pointer. - - 2) Also because of the above, union the property storage pointer with the first inline property - slot and add an extra inline property slot. + SunSpider and v8 report maybe 0.2%-0.4% regressions, but the optimization + this enables will win much more than that back. - * assembler/AbstractMacroAssembler.h: - (JSC::AbstractMacroAssembler::CodeLocationInstruction::CodeLocationInstruction): - (JSC::AbstractMacroAssembler::CodeLocationInstruction::patchLoadToLEA): - (JSC::::CodeLocationCommon::instructionAtOffset): - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::storePtr): - * assembler/MacroAssemblerX86.h: - (JSC::MacroAssemblerX86::store32): - * assembler/MacroAssemblerX86_64.h: - (JSC::MacroAssemblerX86_64::storePtr): - * assembler/X86Assembler.h: - (JSC::X86Assembler::movq_EAXm): - (JSC::X86Assembler::movl_rm): - (JSC::X86Assembler::patchLoadToLEA): * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileCTIMachineTrampolines): * jit/JIT.h: * jit/JITPropertyAccess.cpp: + (JSC::JIT::emit_op_method_check): + (JSC::JIT::emit_op_get_by_id): (JSC::JIT::compileGetByIdHotPath): - (JSC::JIT::compilePutByIdHotPath): - (JSC::JIT::compilePutDirectOffset): - (JSC::JIT::compileGetDirectOffset): - (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::compileGetByIdSlowCase): (JSC::JIT::patchGetByIdSelf): - (JSC::JIT::patchPutByIdReplace): - (JSC::JIT::privateCompileGetByIdSelf): + (JSC::JIT::privateCompilePatchGetArrayLength): (JSC::JIT::privateCompileGetByIdProto): (JSC::JIT::privateCompileGetByIdSelfList): (JSC::JIT::privateCompileGetByIdProtoList): (JSC::JIT::privateCompileGetByIdChainList): (JSC::JIT::privateCompileGetByIdChain): - (JSC::JIT::privateCompilePutByIdReplace): - * runtime/JSObject.cpp: - (JSC::JSObject::mark): - (JSC::JSObject::removeDirect): - * runtime/JSObject.h: - (JSC::JSObject::propertyStorage): - (JSC::JSObject::getDirect): - (JSC::JSObject::getOffset): - (JSC::JSObject::offsetForLocation): - (JSC::JSObject::locationForOffset): - (JSC::JSObject::getDirectOffset): - (JSC::JSObject::putDirectOffset): - (JSC::JSObject::isUsingInlineStorage): - (JSC::JSObject::): - (JSC::JSObject::JSObject): - (JSC::JSObject::~JSObject): - (JSC::Structure::isUsingInlineStorage): - (JSC::JSObject::putDirect): - (JSC::JSObject::putDirectWithoutTransition): - (JSC::JSObject::allocatePropertyStorageInline): - * runtime/Structure.h: -2009-05-09 Geoffrey Garen <ggaren@apple.com> +2009-06-26 Geoffrey Garen <ggaren@apple.com> - Reviewed by Gavin Barraclough. - - Changed all our JIT stubs so that they return a maximum of 1 JS value or - two non-JS pointers, and do all other value returning through out - parameters, in preparation for 64bit JS values on a 32bit system. - - Stubs that used to return two JSValues now return one JSValue and take - and out parameter specifying where in the register array the second - value should go. - - SunSpider reports no change. - - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - * jit/JITArithmetic.cpp: - (JSC::JIT::compileFastArithSlow_op_post_inc): - (JSC::JIT::compileFastArithSlow_op_post_dec): - * jit/JITStubs.cpp: - (JSC::JITStubs::cti_op_call_arityCheck): - (JSC::JITStubs::cti_op_resolve_func): - (JSC::JITStubs::cti_op_post_inc): - (JSC::JITStubs::cti_op_resolve_with_base): - (JSC::JITStubs::cti_op_post_dec): - * jit/JITStubs.h: - (JSC::): - -2009-05-08 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Cameron Zwarich. - - Fixed <rdar://problem/6634956> CrashTracer: [REGRESSION] >400 crashes - in Safari at com.apple.JavaScriptCore • JSC::BytecodeGenerator::emitComplexJumpScopes + 468 - https://bugs.webkit.org/show_bug.cgi?id=25658 - - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::emitComplexJumpScopes): Guard the whole loop - with a bounds check. The old loop logic would decrement and read topScope - without a bounds check, which could cause crashes on page boundaries. - -2009-05-08 Jan Michael Alonzo <jmalonzo@webkit.org> - - Reviewed by NOBODY (BuildFix). - - Gtk fix: add LiteralParser to the build script per r43424. - - Add LiteralParser to the Qt and Wx build scripts too. - - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCoreSources.bkl: - -2009-05-08 Oliver Hunt <oliver@apple.com> - - Reviewed by Gavin Barraclough and Darin Adler. - - Add a limited literal parser for eval to handle object and array literals fired at eval - - This is a simplified parser and lexer that we can throw at strings passed to eval - in case a site is using eval to parse JSON (eg. json2.js). The lexer is intentionally - limited (in effect it's whitelisting a limited "common" subset of the JSON grammar) - as this decreases the likelihood of us wating time attempting to parse any significant - amount of non-JSON content. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * interpreter/Interpreter.cpp: - (JSC::Interpreter::callEval): - * runtime/JSGlobalObjectFunctions.cpp: - (JSC::globalFuncEval): - * runtime/LiteralParser.cpp: Added. - (JSC::isStringCharacter): - (JSC::LiteralParser::Lexer::lex): - (JSC::LiteralParser::Lexer::lexString): - (JSC::LiteralParser::Lexer::lexNumber): - (JSC::LiteralParser::parseStatement): - (JSC::LiteralParser::parseExpression): - (JSC::LiteralParser::parseArray): - (JSC::LiteralParser::parseObject): - (JSC::LiteralParser::StackGuard::StackGuard): - (JSC::LiteralParser::StackGuard::~StackGuard): - (JSC::LiteralParser::StackGuard::isSafe): - * runtime/LiteralParser.h: Added. - (JSC::LiteralParser::LiteralParser): - (JSC::LiteralParser::attemptJSONParse): - (JSC::LiteralParser::): - (JSC::LiteralParser::Lexer::Lexer): - (JSC::LiteralParser::Lexer::next): - (JSC::LiteralParser::Lexer::currentToken): - (JSC::LiteralParser::abortParse): - -2009-05-08 Geoffrey Garen <ggaren@apple.com> - - Not reviewed. - - Restored a Mozilla JS test I accidentally gutted. - - * tests/mozilla/ecma/Array/15.4.4.2.js: - (getTestCases): - (test): - -2009-05-08 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Gavin Barraclough. + Reviewed by Maciej Stachowiak. - More abstraction for JITStub calls from JITed code. + Standardized op_call to put { tag, payload } in { regT1, regT0 }. - Added a JITStubCall class that automatically handles things like assigning - arguments to different stack slots and storing return values. Deployed - the class in about a billion places. A bunch more places remain to be - fixed up, but this is a good stopping point for now. + SunSpider and v8 report no change. * jit/JIT.cpp: - (JSC::JIT::emitTimeoutCheck): - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): - (JSC::JIT::privateCompile): - * jit/JIT.h: - (JSC::JIT::JSRInfo::JSRInfo): - (JSC::JITStubCall::JITStubCall): - (JSC::JITStubCall::addArgument): - (JSC::JITStubCall::call): - (JSC::JITStubCall::): - (JSC::CallEvalJITStub::CallEvalJITStub): - * jit/JITArithmetic.cpp: - (JSC::JIT::compileFastArithSlow_op_lshift): - (JSC::JIT::compileFastArithSlow_op_rshift): - (JSC::JIT::compileFastArithSlow_op_jnless): - (JSC::JIT::compileFastArithSlow_op_bitand): - (JSC::JIT::compileFastArithSlow_op_mod): - (JSC::JIT::compileFastArith_op_mod): - (JSC::JIT::compileFastArithSlow_op_post_inc): - (JSC::JIT::compileFastArithSlow_op_post_dec): - (JSC::JIT::compileFastArithSlow_op_pre_inc): - (JSC::JIT::compileFastArithSlow_op_pre_dec): - (JSC::JIT::compileFastArith_op_add): - (JSC::JIT::compileFastArith_op_mul): - (JSC::JIT::compileFastArith_op_sub): - (JSC::JIT::compileBinaryArithOpSlowCase): - (JSC::JIT::compileFastArithSlow_op_add): - (JSC::JIT::compileFastArithSlow_op_mul): + (JSC::JIT::privateCompileCTIMachineTrampolines): * jit/JITCall.cpp: + (JSC::JIT::compileOpCallInitializeCallFrame): + (JSC::JIT::compileOpCallSetupArgs): + (JSC::JIT::compileOpConstructSetupArgs): + (JSC::JIT::compileOpCallVarargsSetupArgs): + (JSC::JIT::compileOpCallVarargs): (JSC::JIT::compileOpCall): - (JSC::): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::compileGetByIdHotPath): - (JSC::JIT::compilePutByIdHotPath): - (JSC::JIT::compileGetByIdSlowCase): - (JSC::JIT::compilePutByIdSlowCase): - * jit/JITStubs.cpp: - (JSC::JITStubs::cti_op_resolve_func): - (JSC::JITStubs::cti_op_resolve_with_base): - -2009-05-08 Cameron Zwarich <cwzwarich@uwaterloo.ca> + (JSC::JIT::compileOpCallSlowCase): - Reviewed by Maciej Stachowiak. +2009-06-26 Sam Weinig <sam@webkit.org> - Add a new opcode jnlesseq, and optimize its compilation in the JIT using - techniques similar to what were used to optimize jnless in r43363. + Reviewed by Geoffrey Garen. - This gives a 0.7% speedup on SunSpider, particularly on the tests 3d-cube, - control-flow-recursive, date-format-xparb, and string-base64. + Handle multiplying by zero a little better by + inlining the case that both operands are non-negative + into the slowpath. - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::dump): Add support for dumping op_jnlesseq. - * bytecode/Opcode.h: Add op_jnlesseq to the list of opcodes. - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::emitJumpIfFalse): Add a peephole optimization - for op_jnlesseq when emitting lesseq followed by a jump. - * interpreter/Interpreter.cpp: - (JSC::Interpreter::privateExecute): Add case for op_jnlesseq. - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): Add case for op_jnlesseq. - (JSC::JIT::privateCompileSlowCases): Add case for op_jnlesseq. - * jit/JIT.h: + * assembler/MacroAssemblerX86Common.h: + (JSC::MacroAssemblerX86Common::branchOr32): * jit/JITArithmetic.cpp: - (JSC::JIT::compileFastArith_op_jnlesseq): Added. - (JSC::JIT::compileFastArithSlow_op_jnlesseq): Added. - * jit/JITStubs.cpp: - (JSC::JITStubs::cti_op_jlesseq): Added. - * jit/JITStubs.h: + (JSC::JIT::emit_op_mul): + (JSC::JIT::emitSlow_op_mul): -2009-05-08 Maciej Stachowiak <mjs@apple.com> +2009-06-25 Geoffrey Garen <ggaren@apple.com> - Reviewed by Cameron Zwarich. + Reviewed by Sam Weinig. - - fix test failures on 64-bit - - * jit/JITArithmetic.cpp: - (JSC::JIT::compileFastArithSlow_op_jnless): Avoid accidentaly treating an - immediate int as an immediate float in the 64-bit value representation. - -2009-05-08 Gavin Barraclough <barraclough@apple.com> - - Rubber stamped by Oliver Hunt. - - Removing an empty constructor and an uncalled, empty function seems to be a - pretty solid 1% regeression on my machine, so I'm going to put them back. - Um. Yeah, this this pretty pointles and makes no sense at all. I officially - lose the will to live in 3... 2... - - * bytecode/SamplingTool.cpp: - (JSC::SamplingTool::notifyOfScope): - * bytecode/SamplingTool.h: - (JSC::SamplingTool::~SamplingTool): - -2009-05-08 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver "I see lots of ifdefs" Hunt. - - Fix (kinda) for sampling tool breakage. The codeblock sampling tool has become - b0rked due to recent changes in native function calling. The initialization of - a ScopeNode appears to now occur before the sampling tool (or possibly the - interpreter has been brought into existence, wihich leads to crashyness). - - This patch doesn't fix the problem. The crash occurs when tracking a Scope, but - we shouldn't need to track scopes when we're just sampling opcodes, not - codeblocks. Not retaining Scopes when just opcode sampling will reduce sampling - overhead reducing any instrumentation skew, which is a good thing. As a side - benefit this patch also gets the opcode sampling going again, albeit in a bit of - a lame way. Will come back later with a proper fix from codeblock sampling. + Optimize x++ to ++x inside for loops. + + Sadly, no measurable speedup, but this should help with result chaining. - * JavaScriptCore.exp: - * bytecode/SamplingTool.cpp: - (JSC::compareLineCountInfoSampling): - (JSC::SamplingTool::dump): - * bytecode/SamplingTool.h: - (JSC::SamplingTool::SamplingTool): * parser/Nodes.cpp: - (JSC::ScopeNode::ScopeNode): - -2009-05-07 Mark Rowe <mrowe@apple.com> + (JSC::ForNode::emitBytecode): - Rubber-stamped by Oliver Hunt. +2009-06-25 Geoffrey Garen <ggaren@apple.com> - Fix <https://bugs.webkit.org/show_bug.cgi?id=25640>. - Bug 25640: Crash on quit in r43384 nightly build on Leopard w/ Safari 4 beta installed + Reviewed by Sam Weinig. - Roll out r43366 as it removed symbols that Safari 4 Beta uses. + Standardized some more opcodes to put { tag, payload } in { regT1, regT0 }. - * JavaScriptCore.exp: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - * bytecode/SamplingTool.cpp: - (JSC::SamplingThread::start): - (JSC::SamplingThread::stop): - * bytecode/SamplingTool.h: - * wtf/CrossThreadRefCounted.h: - (WTF::CrossThreadRefCounted::CrossThreadRefCounted): - (WTF::::ref): - (WTF::::deref): - * wtf/Threading.h: - * wtf/ThreadingNone.cpp: - * wtf/ThreadingPthreads.cpp: - (WTF::threadMapMutex): - (WTF::initializeThreading): - (WTF::threadMap): - (WTF::identifierByPthreadHandle): - (WTF::establishIdentifierForPthreadHandle): - (WTF::pthreadHandleForIdentifier): - (WTF::clearPthreadHandleForIdentifier): - (WTF::createThreadInternal): - (WTF::waitForThreadCompletion): - (WTF::detachThread): - (WTF::currentThread): - * wtf/ThreadingWin.cpp: - (WTF::threadMapMutex): - (WTF::initializeThreading): - (WTF::threadMap): - (WTF::storeThreadHandleByIdentifier): - (WTF::threadHandleForIdentifier): - (WTF::clearThreadHandleForIdentifier): - (WTF::createThreadInternal): - (WTF::waitForThreadCompletion): - (WTF::detachThread): - (WTF::currentThread): - * wtf/gtk/ThreadingGtk.cpp: - (WTF::threadMapMutex): - (WTF::initializeThreading): - (WTF::threadMap): - (WTF::identifierByGthreadHandle): - (WTF::establishIdentifierForThread): - (WTF::threadForIdentifier): - (WTF::clearThreadForIdentifier): - (WTF::createThreadInternal): - (WTF::waitForThreadCompletion): - (WTF::currentThread): - * wtf/qt/ThreadingQt.cpp: - (WTF::threadMapMutex): - (WTF::threadMap): - (WTF::identifierByQthreadHandle): - (WTF::establishIdentifierForThread): - (WTF::clearThreadForIdentifier): - (WTF::threadForIdentifier): - (WTF::initializeThreading): - (WTF::createThreadInternal): - (WTF::waitForThreadCompletion): - (WTF::currentThread): - -2009-05-07 Gustavo Noronha Silva <gns@gnome.org> - - Suggested by Oliver Hunt. - - Also check for Linux for the special-cased calling convention. - - * jit/JIT.cpp: - (JSC::JIT::privateCompileCTIMachineTrampolines): - * wtf/Platform.h: - -2009-05-07 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Maciej Stachowiak. - - Previously, when appending to an existing string and growing the underlying buffer, - we would actually allocate 110% of the required size in order to give us some space - to expand into. Now we treat strings differently based on their size: - - Small Strings (up to 4 pages): - Expand the allocation size to 112.5% of the amount requested. This is largely sicking - to our previous policy, however 112.5% is cheaper to calculate. - - Medium Strings (up to 128 pages): - For pages covering multiple pages over-allocation is less of a concern - any unused - space will not be paged in if it is not used, so this is purely a VM overhead. For - these strings allocate 2x the requested size. - - Large Strings (to infinity and beyond!): - Revert to our 112.5% policy - probably best to limit the amount of unused VM we allow - any individual string be responsible for. - - Additionally, round small allocations up to a multiple of 16 bytes, and medium and - large allocations up to a multiple of page size. - - ~1.5% progression on Sunspider, due to 5% improvement on tagcloud & 15% on validate. - - * runtime/UString.cpp: - (JSC::expandedSize): + * jit/JITArithmetic.cpp: + (JSC::JIT::emitSlow_op_bitnot): + (JSC::JIT::emit_op_post_inc): -2009-05-07 Geoffrey Garen <ggaren@apple.com> +2009-06-25 Geoffrey Garen <ggaren@apple.com> - Reviewed by Cameron Zwarich. + Reviewed by Sam Weinig. - Fixed a minor sequencing error introduced by recent Parser speedups. - - * runtime/JSGlobalData.cpp: - (JSC::JSGlobalData::createNativeThunk): Missed a spot in my last patch. + Standardized some more opcodes to put { tag, payload } in { regT1, regT0 }. -2009-05-07 Geoffrey Garen <ggaren@apple.com> - - Not reviewed. - - * wtf/Platform.h: Reverted an accidental (and performance-catastrophic) - change. + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_bitnot): + (JSC::JIT::emit_op_post_dec): + (JSC::JIT::emit_op_pre_inc): + (JSC::JIT::emitSlow_op_pre_inc): + (JSC::JIT::emit_op_pre_dec): + (JSC::JIT::emitSlow_op_pre_dec): -2009-05-07 Geoffrey Garen <ggaren@apple.com> +2009-06-25 Geoffrey Garen <ggaren@apple.com> - Reviewed by Cameron Zwarich. + Reviewed by Sam Weinig. - Fixed a minor sequencing error introduced by recent Parser speedups. + Standardized some more opcodes to put { tag, payload } in { regT1, regT0 }. - * parser/Parser.cpp: - (JSC::Parser::reparseInPlace): Missed a spot in my last patch. + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_negate): + (JSC::JIT::emitSlow_op_negate): + * jit/JITCall.cpp: + (JSC::JIT::emit_op_construct_verify): + (JSC::JIT::emitSlow_op_construct_verify): -2009-05-07 Geoffrey Garen <ggaren@apple.com> +2009-06-25 Geoffrey Garen <ggaren@apple.com> - Reviewed by Cameron Zwarich. + Reviewed by Sam Weinig. - Fixed a minor sequencing error introduced by recent Parser speedups. + Standardized some more opcodes to put { tag, payload } in { regT1, regT0 }. - * parser/Parser.cpp: - (JSC::Parser::parse): - * parser/Parser.h: - (JSC::Parser::parse): - (JSC::Parser::reparse): Shrink the parsedObjects vector after allocating - the root node, to avoid leaving a stray node in the vector, since that's - a slight memory leak, and it causes problems during JSGlobalData teardown. - - * runtime/JSGlobalData.cpp: - (JSC::JSGlobalData::~JSGlobalData): ASSERT that we're not being torn - down while we think we're still parsing, since that would cause lots of - bad memory references during our destruction. + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_loop_if_true): + (JSC::JIT::emit_op_jfalse): + (JSC::JIT::emit_op_jtrue): + (JSC::JIT::emit_op_jeq_null): + (JSC::JIT::emit_op_jneq_null): + (JSC::JIT::emit_op_eq_null): + (JSC::JIT::emit_op_neq_null): -2009-05-07 Geoffrey Garen <ggaren@apple.com> +2009-06-25 Geoffrey Garen <ggaren@apple.com> - Reviewed by Cameron Zwarich. + Reviewed by Sam Weinig (sort of, maybe). - Replaced two more macros with references to the JITStackFrame structure. - - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - * jit/JITInlineMethods.h: - (JSC::JIT::restoreArgumentReference): - * jit/JITStubs.cpp: - (JSC::): - * jit/JITStubs.h: - -2009-05-07 Oliver Hunt <oliver@apple.com> - - Reviewed by Gavin Barraclough. - - Improve native call performance - - Fix the windows build by adding calling convention declarations everywhere, - chose fastcall as that seemed most sensible given we were having to declare - the convention explicitly. In addition switched to fastcall on mac in the - deluded belief that documented fastcall behavior on windows would match - actual its actual behavior. - - * API/JSCallbackFunction.h: - * API/JSCallbackObject.h: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - * interpreter/CallFrame.h: - (JSC::ExecState::argumentCount): - * jit/JIT.cpp: - (JSC::JIT::privateCompileCTIMachineTrampolines): - * jsc.cpp: - (functionPrint): - (functionDebug): - (functionGC): - (functionVersion): - (functionRun): - (functionLoad): - (functionSetSamplingFlags): - (functionClearSamplingFlags): - (functionReadline): - (functionQuit): - * runtime/ArrayConstructor.cpp: - (JSC::callArrayConstructor): - * runtime/ArrayPrototype.cpp: - (JSC::arrayProtoFuncToString): - (JSC::arrayProtoFuncToLocaleString): - (JSC::arrayProtoFuncJoin): - (JSC::arrayProtoFuncConcat): - (JSC::arrayProtoFuncPop): - (JSC::arrayProtoFuncPush): - (JSC::arrayProtoFuncReverse): - (JSC::arrayProtoFuncShift): - (JSC::arrayProtoFuncSlice): - (JSC::arrayProtoFuncSort): - (JSC::arrayProtoFuncSplice): - (JSC::arrayProtoFuncUnShift): - (JSC::arrayProtoFuncFilter): - (JSC::arrayProtoFuncMap): - (JSC::arrayProtoFuncEvery): - (JSC::arrayProtoFuncForEach): - (JSC::arrayProtoFuncSome): - (JSC::arrayProtoFuncReduce): - (JSC::arrayProtoFuncReduceRight): - (JSC::arrayProtoFuncIndexOf): - (JSC::arrayProtoFuncLastIndexOf): - * runtime/BooleanConstructor.cpp: - (JSC::callBooleanConstructor): - * runtime/BooleanPrototype.cpp: - (JSC::booleanProtoFuncToString): - (JSC::booleanProtoFuncValueOf): - * runtime/CallData.h: - * runtime/DateConstructor.cpp: - (JSC::callDate): - (JSC::dateParse): - (JSC::dateNow): - (JSC::dateUTC): - * runtime/DatePrototype.cpp: - (JSC::dateProtoFuncToString): - (JSC::dateProtoFuncToUTCString): - (JSC::dateProtoFuncToDateString): - (JSC::dateProtoFuncToTimeString): - (JSC::dateProtoFuncToLocaleString): - (JSC::dateProtoFuncToLocaleDateString): - (JSC::dateProtoFuncToLocaleTimeString): - (JSC::dateProtoFuncGetTime): - (JSC::dateProtoFuncGetFullYear): - (JSC::dateProtoFuncGetUTCFullYear): - (JSC::dateProtoFuncToGMTString): - (JSC::dateProtoFuncGetMonth): - (JSC::dateProtoFuncGetUTCMonth): - (JSC::dateProtoFuncGetDate): - (JSC::dateProtoFuncGetUTCDate): - (JSC::dateProtoFuncGetDay): - (JSC::dateProtoFuncGetUTCDay): - (JSC::dateProtoFuncGetHours): - (JSC::dateProtoFuncGetUTCHours): - (JSC::dateProtoFuncGetMinutes): - (JSC::dateProtoFuncGetUTCMinutes): - (JSC::dateProtoFuncGetSeconds): - (JSC::dateProtoFuncGetUTCSeconds): - (JSC::dateProtoFuncGetMilliSeconds): - (JSC::dateProtoFuncGetUTCMilliseconds): - (JSC::dateProtoFuncGetTimezoneOffset): - (JSC::dateProtoFuncSetTime): - (JSC::dateProtoFuncSetMilliSeconds): - (JSC::dateProtoFuncSetUTCMilliseconds): - (JSC::dateProtoFuncSetSeconds): - (JSC::dateProtoFuncSetUTCSeconds): - (JSC::dateProtoFuncSetMinutes): - (JSC::dateProtoFuncSetUTCMinutes): - (JSC::dateProtoFuncSetHours): - (JSC::dateProtoFuncSetUTCHours): - (JSC::dateProtoFuncSetDate): - (JSC::dateProtoFuncSetUTCDate): - (JSC::dateProtoFuncSetMonth): - (JSC::dateProtoFuncSetUTCMonth): - (JSC::dateProtoFuncSetFullYear): - (JSC::dateProtoFuncSetUTCFullYear): - (JSC::dateProtoFuncSetYear): - (JSC::dateProtoFuncGetYear): - * runtime/ErrorConstructor.cpp: - (JSC::callErrorConstructor): - * runtime/ErrorPrototype.cpp: - (JSC::errorProtoFuncToString): - * runtime/FunctionConstructor.cpp: - (JSC::callFunctionConstructor): - * runtime/FunctionPrototype.cpp: - (JSC::callFunctionPrototype): - (JSC::functionProtoFuncToString): - (JSC::functionProtoFuncApply): - (JSC::functionProtoFuncCall): - * runtime/JSFunction.h: - (JSC::JSFunction::nativeFunction): - (JSC::JSFunction::setScopeChain): - * runtime/JSGlobalObjectFunctions.cpp: - (JSC::globalFuncEval): - (JSC::globalFuncParseInt): - (JSC::globalFuncParseFloat): - (JSC::globalFuncIsNaN): - (JSC::globalFuncIsFinite): - (JSC::globalFuncDecodeURI): - (JSC::globalFuncDecodeURIComponent): - (JSC::globalFuncEncodeURI): - (JSC::globalFuncEncodeURIComponent): - (JSC::globalFuncEscape): - (JSC::globalFuncUnescape): - (JSC::globalFuncJSCPrint): - * runtime/JSGlobalObjectFunctions.h: - * runtime/MathObject.cpp: - (JSC::mathProtoFuncAbs): - (JSC::mathProtoFuncACos): - (JSC::mathProtoFuncASin): - (JSC::mathProtoFuncATan): - (JSC::mathProtoFuncATan2): - (JSC::mathProtoFuncCeil): - (JSC::mathProtoFuncCos): - (JSC::mathProtoFuncExp): - (JSC::mathProtoFuncFloor): - (JSC::mathProtoFuncLog): - (JSC::mathProtoFuncMax): - (JSC::mathProtoFuncMin): - (JSC::mathProtoFuncPow): - (JSC::mathProtoFuncRandom): - (JSC::mathProtoFuncRound): - (JSC::mathProtoFuncSin): - (JSC::mathProtoFuncSqrt): - (JSC::mathProtoFuncTan): - * runtime/NativeErrorConstructor.cpp: - (JSC::callNativeErrorConstructor): - * runtime/NativeFunctionWrapper.h: - * runtime/NumberConstructor.cpp: - (JSC::callNumberConstructor): - * runtime/NumberPrototype.cpp: - (JSC::numberProtoFuncToString): - (JSC::numberProtoFuncToLocaleString): - (JSC::numberProtoFuncValueOf): - (JSC::numberProtoFuncToFixed): - (JSC::numberProtoFuncToExponential): - (JSC::numberProtoFuncToPrecision): - * runtime/ObjectConstructor.cpp: - (JSC::callObjectConstructor): - * runtime/ObjectPrototype.cpp: - (JSC::objectProtoFuncValueOf): - (JSC::objectProtoFuncHasOwnProperty): - (JSC::objectProtoFuncIsPrototypeOf): - (JSC::objectProtoFuncDefineGetter): - (JSC::objectProtoFuncDefineSetter): - (JSC::objectProtoFuncLookupGetter): - (JSC::objectProtoFuncLookupSetter): - (JSC::objectProtoFuncPropertyIsEnumerable): - (JSC::objectProtoFuncToLocaleString): - (JSC::objectProtoFuncToString): - * runtime/ObjectPrototype.h: - * runtime/RegExpConstructor.cpp: - (JSC::callRegExpConstructor): - * runtime/RegExpObject.cpp: - (JSC::callRegExpObject): - * runtime/RegExpPrototype.cpp: - (JSC::regExpProtoFuncTest): - (JSC::regExpProtoFuncExec): - (JSC::regExpProtoFuncCompile): - (JSC::regExpProtoFuncToString): - * runtime/StringConstructor.cpp: - (JSC::stringFromCharCode): - (JSC::callStringConstructor): - * runtime/StringPrototype.cpp: - (JSC::stringProtoFuncReplace): - (JSC::stringProtoFuncToString): - (JSC::stringProtoFuncCharAt): - (JSC::stringProtoFuncCharCodeAt): - (JSC::stringProtoFuncConcat): - (JSC::stringProtoFuncIndexOf): - (JSC::stringProtoFuncLastIndexOf): - (JSC::stringProtoFuncMatch): - (JSC::stringProtoFuncSearch): - (JSC::stringProtoFuncSlice): - (JSC::stringProtoFuncSplit): - (JSC::stringProtoFuncSubstr): - (JSC::stringProtoFuncSubstring): - (JSC::stringProtoFuncToLowerCase): - (JSC::stringProtoFuncToUpperCase): - (JSC::stringProtoFuncLocaleCompare): - (JSC::stringProtoFuncBig): - (JSC::stringProtoFuncSmall): - (JSC::stringProtoFuncBlink): - (JSC::stringProtoFuncBold): - (JSC::stringProtoFuncFixed): - (JSC::stringProtoFuncItalics): - (JSC::stringProtoFuncStrike): - (JSC::stringProtoFuncSub): - (JSC::stringProtoFuncSup): - (JSC::stringProtoFuncFontcolor): - (JSC::stringProtoFuncFontsize): - (JSC::stringProtoFuncAnchor): - (JSC::stringProtoFuncLink): - * wtf/Platform.h: - -2009-05-07 Geoffrey Garen <ggaren@apple.com> - - Not reviewed. + Fixed some ASSERTs in http/tests/security. - Rolled out a portion of r43352 because it broke 64bit. - - * jit/JITStubs.h: - -2009-05-07 Kevin Ollivier <kevino@theolliviers.com> - - Build fix for functions reaturning ThreadIdentifier. - - * wtf/ThreadingNone.cpp: - (WTF::createThreadInternal): - (WTF::currentThread): - -2009-05-07 Maciej Stachowiak <mjs@apple.com> - - Reviewed by John Honeycutt. + These ASSERTs were introduced by http://trac.webkit.org/changeset/45057, + but the underlying problem was actually older. http://trac.webkit.org/changeset/45057 + just exposed the problem by enabling optimization in more cases. - - enable optimization case im the last patch that I accidentally had disabled. - - * jit/JITArithmetic.cpp: - (JSC::JIT::compileFastArithSlow_op_jnless): - -2009-05-07 Dmitry Titov <dimich@chromium.org> - - Attempt to fix Win build. - - * jit/JITArithmetic.cpp: - (JSC::JIT::compileFastArithSlow_op_jnless): - -2009-05-07 Dmitry Titov <dimich@chromium.org> - - Reviewed by Alexey Proskuryakov and Adam Roben. - - https://bugs.webkit.org/show_bug.cgi?id=25348 - Change WTF::ThreadIdentifier to be an actual (but wrapped) thread id, remove ThreadMap. - - * wtf/Threading.h: - (WTF::ThreadIdentifier::ThreadIdentifier): - (WTF::ThreadIdentifier::isValid): - (WTF::ThreadIdentifier::invalidate): - (WTF::ThreadIdentifier::platformId): - ThreadIdentifier is now a class, containing a PlatformThreadIdentifier and - methods that are used across the code on thread ids: construction, comparisons, - check for 'valid' state etc. '0' is used as invalid id, which happens to just work - with all platform-specific thread id implementations. - - All the following files repeatedly reflect the new ThreadIdentifier for each platform. - We remove ThreadMap and threadMapMutex from all of them, remove the functions that - populated/searched/cleared the map and add platform-specific comparison operators - for ThreadIdentifier. - - * wtf/gtk/ThreadingGtk.cpp: - (WTF::ThreadIdentifier::operator==): - (WTF::ThreadIdentifier::operator!=): - (WTF::initializeThreading): - (WTF::createThreadInternal): - (WTF::waitForThreadCompletion): - (WTF::currentThread): - - * wtf/ThreadingNone.cpp: - (WTF::ThreadIdentifier::operator==): - (WTF::ThreadIdentifier::operator!=): - - * wtf/ThreadingPthreads.cpp: - (WTF::ThreadIdentifier::operator==): - (WTF::ThreadIdentifier::operator!=): - (WTF::initializeThreading): - (WTF::createThreadInternal): - (WTF::waitForThreadCompletion): - (WTF::detachThread): - (WTF::currentThread): - - * wtf/qt/ThreadingQt.cpp: - (WTF::ThreadIdentifier::operator==): - (WTF::ThreadIdentifier::operator!=): - (WTF::initializeThreading): - (WTF::createThreadInternal): - (WTF::waitForThreadCompletion): - (WTF::currentThread): - - * wtf/ThreadingWin.cpp: - (WTF::ThreadIdentifier::operator==): - (WTF::ThreadIdentifier::operator!=): - (WTF::initializeThreading): - (WTF::createThreadInternal): All the platforms (except Windows) used a sequential - counter as a thread ID and mapped it into platform ID. Windows was using native thread - id and mapped it into thread handle. Since we can always obtain a thread handle - by thread id, createThread now closes the handle. - (WTF::waitForThreadCompletion): obtains another one using OpenThread(id) API. If can not obtain a handle, - it means the thread already exited. - (WTF::detachThread): - (WTF::currentThread): - (WTF::detachThreadDeprecated): old function, renamed (for Win Safari 4 beta which uses it for now). - (WTF::waitForThreadCompletionDeprecated): same. - (WTF::currentThreadDeprecated): same. - (WTF::createThreadDeprecated): same. + The ASSERTs fired because we tested PropertySlot::slotBase() for validity, + but slotBase() ASSERTs if it's invalid, so we would ASSERT before + the test could happen. Solution: Remove the ASSERT. Maybe it was valid + once, but it clearly goes against a pattern we've deployed of late. + + The underlying problem was that WebCore would re-use a PropertySlot in + the case of a forwarding access, and the second use would not completely + overwrite the first use. Solution: Make sure to overwrite m_offset when + setting a value on a PropertySlot. (Other values already get implicitly + overwritten during reuse.) - * bytecode/SamplingTool.h: - * bytecode/SamplingTool.cpp: Use DEFINE_STATIC_LOCAL for a static ThreadIdentifier variable, to avoid static constructor. + * runtime/PropertySlot.h: + (JSC::PropertySlot::PropertySlot): + (JSC::PropertySlot::setValueSlot): + (JSC::PropertySlot::setValue): + (JSC::PropertySlot::setRegisterSlot): + (JSC::PropertySlot::setUndefined): + (JSC::PropertySlot::slotBase): + (JSC::PropertySlot::clearOffset): - * JavaScriptCore.exp: export lists - updated the WTF threading functions decorated names - since they now take a different type as a parameter. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: ditto for Windows, plus added "deprecated" functions - that take old parameter type - turns out public beta of Safari 4 uses those, so they need to be kept along for a while. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: ditto. +2009-06-24 Gavin Barraclough <barraclough@apple.com> -2009-05-07 Maciej Stachowiak <mjs@apple.com> + Reviewed by Geoff Garen. - Reviewed by Sam Weinig. - - - optimize various cases of branch-fused less - - 1% speedup on SunSpider overall - 13% speedup on math-cordic + Enable JIT_OPTIMIZE_METHOD_CALLS on the branch, implementation matches current implemenatation in ToT. - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - op_loop_if_less: Optimize case of constant as first operand, just as case of constant as - second operand. - op_jnless: Factored out into compileFastArith_op_jnless. - (JSC::JIT::privateCompileSlowCases): - op_jnless: Factored out into compileFastArithSlow_op_jnless. * jit/JIT.h: - * jit/JITArithmetic.cpp: - (JSC::JIT::compileFastArith_op_jnless): Factored out from main compile loop. - - Generate inline code for comparison of constant immediate int as first operand to another - immediate int, as for loop_if_less - - (JSC::JIT::compileFastArithSlow_op_jnless): - - Generate inline code for comparing two floating point numbers. - - Generate code for both cases of comparing a floating point number to a constant immediate - int. - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::dump): Fix dumping of op_jnless (tangentially related bugfix). + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emit_op_method_check): + (JSC::JIT::emitSlow_op_method_check): + (JSC::JIT::emit_op_get_by_id): + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::emitSlow_op_get_by_id): + (JSC::JIT::compileGetByIdSlowCase): -2009-05-07 Geoffrey Garen <ggaren@apple.com> +2009-06-23 Geoffrey Garen <ggaren@apple.com> Reviewed by Sam Weinig. - - Added the return address of a stub function to the JITStackFrame abstraction. - - * jit/JIT.cpp: - * jit/JIT.h: - * jit/JITStubs.cpp: - (JSC::): - (JSC::StackHack::StackHack): - (JSC::StackHack::~StackHack): - (JSC::returnToThrowTrampoline): - (JSC::JITStubs::cti_op_convert_this): - (JSC::JITStubs::cti_op_end): - (JSC::JITStubs::cti_op_add): - (JSC::JITStubs::cti_op_pre_inc): - (JSC::JITStubs::cti_timeout_check): - (JSC::JITStubs::cti_register_file_check): - (JSC::JITStubs::cti_op_loop_if_less): - (JSC::JITStubs::cti_op_loop_if_lesseq): - (JSC::JITStubs::cti_op_new_object): - (JSC::JITStubs::cti_op_put_by_id_generic): - (JSC::JITStubs::cti_op_get_by_id_generic): - (JSC::JITStubs::cti_op_put_by_id): - (JSC::JITStubs::cti_op_put_by_id_second): - (JSC::JITStubs::cti_op_put_by_id_fail): - (JSC::JITStubs::cti_op_get_by_id): - (JSC::JITStubs::cti_op_get_by_id_second): - (JSC::JITStubs::cti_op_get_by_id_self_fail): - (JSC::JITStubs::cti_op_get_by_id_proto_list): - (JSC::JITStubs::cti_op_get_by_id_proto_list_full): - (JSC::JITStubs::cti_op_get_by_id_proto_fail): - (JSC::JITStubs::cti_op_get_by_id_array_fail): - (JSC::JITStubs::cti_op_get_by_id_string_fail): - (JSC::JITStubs::cti_op_instanceof): - (JSC::JITStubs::cti_op_del_by_id): - (JSC::JITStubs::cti_op_mul): - (JSC::JITStubs::cti_op_new_func): - (JSC::JITStubs::cti_op_call_JSFunction): - (JSC::JITStubs::cti_op_call_arityCheck): - (JSC::JITStubs::cti_vm_dontLazyLinkCall): - (JSC::JITStubs::cti_vm_lazyLinkCall): - (JSC::JITStubs::cti_op_push_activation): - (JSC::JITStubs::cti_op_call_NotJSFunction): - (JSC::JITStubs::cti_op_create_arguments): - (JSC::JITStubs::cti_op_create_arguments_no_params): - (JSC::JITStubs::cti_op_tear_off_activation): - (JSC::JITStubs::cti_op_tear_off_arguments): - (JSC::JITStubs::cti_op_profile_will_call): - (JSC::JITStubs::cti_op_profile_did_call): - (JSC::JITStubs::cti_op_ret_scopeChain): - (JSC::JITStubs::cti_op_new_array): - (JSC::JITStubs::cti_op_resolve): - (JSC::JITStubs::cti_op_construct_JSConstruct): - (JSC::JITStubs::cti_op_construct_NotJSConstruct): - (JSC::JITStubs::cti_op_get_by_val): - (JSC::JITStubs::cti_op_get_by_val_string): - (JSC::JITStubs::cti_op_get_by_val_byte_array): - (JSC::JITStubs::cti_op_resolve_func): - (JSC::JITStubs::cti_op_sub): - (JSC::JITStubs::cti_op_put_by_val): - (JSC::JITStubs::cti_op_put_by_val_array): - (JSC::JITStubs::cti_op_put_by_val_byte_array): - (JSC::JITStubs::cti_op_lesseq): - (JSC::JITStubs::cti_op_loop_if_true): - (JSC::JITStubs::cti_op_load_varargs): - (JSC::JITStubs::cti_op_negate): - (JSC::JITStubs::cti_op_resolve_base): - (JSC::JITStubs::cti_op_resolve_skip): - (JSC::JITStubs::cti_op_resolve_global): - (JSC::JITStubs::cti_op_div): - (JSC::JITStubs::cti_op_pre_dec): - (JSC::JITStubs::cti_op_jless): - (JSC::JITStubs::cti_op_not): - (JSC::JITStubs::cti_op_jtrue): - (JSC::JITStubs::cti_op_post_inc): - (JSC::JITStubs::cti_op_eq): - (JSC::JITStubs::cti_op_lshift): - (JSC::JITStubs::cti_op_bitand): - (JSC::JITStubs::cti_op_rshift): - (JSC::JITStubs::cti_op_bitnot): - (JSC::JITStubs::cti_op_resolve_with_base): - (JSC::JITStubs::cti_op_new_func_exp): - (JSC::JITStubs::cti_op_mod): - (JSC::JITStubs::cti_op_less): - (JSC::JITStubs::cti_op_neq): - (JSC::JITStubs::cti_op_post_dec): - (JSC::JITStubs::cti_op_urshift): - (JSC::JITStubs::cti_op_bitxor): - (JSC::JITStubs::cti_op_new_regexp): - (JSC::JITStubs::cti_op_bitor): - (JSC::JITStubs::cti_op_call_eval): - (JSC::JITStubs::cti_op_throw): - (JSC::JITStubs::cti_op_get_pnames): - (JSC::JITStubs::cti_op_next_pname): - (JSC::JITStubs::cti_op_push_scope): - (JSC::JITStubs::cti_op_pop_scope): - (JSC::JITStubs::cti_op_typeof): - (JSC::JITStubs::cti_op_is_undefined): - (JSC::JITStubs::cti_op_is_boolean): - (JSC::JITStubs::cti_op_is_number): - (JSC::JITStubs::cti_op_is_string): - (JSC::JITStubs::cti_op_is_object): - (JSC::JITStubs::cti_op_is_function): - (JSC::JITStubs::cti_op_stricteq): - (JSC::JITStubs::cti_op_to_primitive): - (JSC::JITStubs::cti_op_strcat): - (JSC::JITStubs::cti_op_nstricteq): - (JSC::JITStubs::cti_op_to_jsnumber): - (JSC::JITStubs::cti_op_in): - (JSC::JITStubs::cti_op_push_new_scope): - (JSC::JITStubs::cti_op_jmp_scopes): - (JSC::JITStubs::cti_op_put_by_index): - (JSC::JITStubs::cti_op_switch_imm): - (JSC::JITStubs::cti_op_switch_char): - (JSC::JITStubs::cti_op_switch_string): - (JSC::JITStubs::cti_op_del_by_val): - (JSC::JITStubs::cti_op_put_getter): - (JSC::JITStubs::cti_op_put_setter): - (JSC::JITStubs::cti_op_new_error): - (JSC::JITStubs::cti_op_debug): - (JSC::JITStubs::cti_vm_throw): - * jit/JITStubs.h: - (JSC::JITStackFrame::returnAddressSlot): - -2009-05-07 Darin Adler <darin@apple.com> - Reviewed by Geoff Garen. + Bit off a tiny bit more of standardizing opcode behavior to help with result + caching. + + SunSpider reports no change, v8 maybe a tiny speedup. - * parser/Lexer.cpp: - (JSC::Lexer::lex): Fix missing braces. This would make us always - take the slower case for string parsing and Visual Studio correctly - noticed unreachable code. + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_to_jsnumber): + (JSC::JIT::emitSlow_op_to_jsnumber): + (JSC::JIT::emit_op_convert_this): + (JSC::JIT::emitSlow_op_convert_this): -2009-05-07 Darin Adler <darin@apple.com> +2009-06-23 Geoffrey Garen <ggaren@apple.com> Reviewed by Sam Weinig. - Bug 25589: goto instead of state machine in lexer - https://bugs.webkit.org/show_bug.cgi?id=25589 - - SunSpider is 0.8% faster. - - * parser/Lexer.cpp: - (JSC::Lexer::currentCharacter): Added. - (JSC::Lexer::currentOffset): Changed to call currentCharacter for clarity. - (JSC::Lexer::setCode): Removed code to set now-obsolete m_skipLineEnd. - (JSC::Lexer::shiftLineTerminator): Added. Handles line numbers and the - two-character line terminators. - (JSC::Lexer::makeIdentifier): Changed to take characters and length rather - than a vector, since we now make these directly out of the source buffer - when possible. - (JSC::Lexer::lastTokenWasRestrKeyword): Added. - (JSC::isNonASCIIIdentStart): Broke out the non-inline part. - (JSC::isIdentStart): Moved here. - (JSC::isNonASCIIIdentPart): Broke out the non-inline part. - (JSC::isIdentPart): Moved here. - (JSC::singleEscape): Moved here, and removed some unneeded cases. - (JSC::Lexer::record8): Moved here. - (JSC::Lexer::record16): Moved here. - (JSC::Lexer::lex): Rewrote this whole function to use goto and not use - a state machine. Got rid of most of the local variables. Also rolled the - matchPunctuator function in here. - (JSC::Lexer::scanRegExp): Changed to use the new version of isLineTerminator. - Clear m_buffer16 after using it instead of before. - - * parser/Lexer.h: Removed State enum, setDone function, nextLine function, - lookupKeywordFunction, one of the isLineTerminator functions, m_done data member, - m_skipLineEnd data member, and m_state data member. Added shiftLineTerminator - function, currentCharacter function, and changed the arguments to the makeIdentifier - function. Removed one branch from the isLineTerminator function. - - * runtime/StringPrototype.cpp: - (JSC::stringProtoFuncReplace): Streamlined the case where we don't replace anything. - -2009-05-07 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Gavin Barraclough. - - Removed a few more special constants, and replaced them with uses of - the JITStackFrame struct. - - Removed one of the two possible definitions of VoidPtrPair. The Mac - definition was more elegant, but SunSpider doesn't think it's any - faster, and it's net less elegant to have two ways of doing things. - - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompile): - * jit/JITStubs.h: - (JSC::): - -2009-05-07 Darin Adler <darin@apple.com> - - * runtime/ScopeChain.h: - (JSC::ScopeChainNode::~ScopeChainNode): Tweak formatting. - -2009-05-07 Simon Hausmann <simon.hausmann@nokia.com> - - Reviewed by Tor Arne Vestbø. - - Fix the build thread stack base determination build on Symbian, - by moving the code block before PLATFORM(UNIX), which is also - enabled on Symbian builds. - - * runtime/Collector.cpp: - (JSC::currentThreadStackBase): - -2009-05-07 Oliver Hunt <oliver@apple.com> - - Reviewed by Gavin Barraclough. - - Fix crash due to incorrectly using an invalid scopechain - - stringProtoFuncReplace was checking for an exception on a CachedCall - by asking for the cached callframes exception. Unfortunately this - could crash in certain circumstances as CachedCall does not guarantee - a valid callframe following a call. Even more unfortunately the check - was entirely unnecessary as there is only a single exception slot per - global data, so it was already checked via the initial exec->hadException() - check. - - To make bugs like this more obvious, i've added a debug only destructor - to ScopeChainNode that 0's all of its fields. This exposed a crash in - the standard javascriptcore tests. - - * runtime/ScopeChain.h: - (JSC::ScopeChainNode::~ScopeChainNode): - (JSC::ScopeChain::~ScopeChain): - * runtime/StringPrototype.cpp: - (JSC::stringProtoFuncReplace): - -2009-05-07 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. - - Enable op_strcat across += assignments. This patch allows the lhs of a read/modify node - to be included within the concatenation operation, and also modifies the implementation - of the concatenation to attempt to reuse and cat onto the leftmost string, rather than - always allocating a new empty output string to copy into (as was previously the behaviour). - - ~0.5% progression, due to a 3%-3.5% progression on the string tests (particularly validate). - - * parser/Nodes.cpp: - (JSC::BinaryOpNode::emitStrcat): - (JSC::emitReadModifyAssignment): - (JSC::ReadModifyResolveNode::emitBytecode): - (JSC::ReadModifyDotNode::emitBytecode): - (JSC::ReadModifyBracketNode::emitBytecode): - * parser/Nodes.h: - * runtime/Operations.h: - (JSC::concatenateStrings): - * runtime/UString.cpp: - (JSC::UString::reserveCapacity): - * runtime/UString.h: - -2009-05-07 Simon Hausmann <simon.hausmann@nokia.com> - - Reviewed by Oliver Hunt. - - Fix the build on Windows without JIT: interpreter/RegisterFile.h needs - roundUpAllocationSize, which is protected by #if ENABLED(ASSEMBLER). - Moved the #ifdef down and always offer the function. - - * jit/ExecutableAllocator.h: - -2009-05-06 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Gavin "++" Barraclough. + Bit off a tiny bit more of standardizing opcode behavior to help with result + caching -- including removing my old enemy, op_resolve_function, because + it was non-standard, and removing it felt better than helping it limp along. - Added some abstraction around the JIT stub calling convention by creating - a struct to represent the persistent stack frame JIT code shares with - JIT stubs. + SunSpider reports no change, v8 maybe a tiny speedup. - SunSpider reports no change. - - * jit/JIT.h: - * jit/JITStubs.cpp: - (JSC::JITStubs::cti_op_convert_this): - (JSC::JITStubs::cti_op_end): - (JSC::JITStubs::cti_op_add): - (JSC::JITStubs::cti_op_pre_inc): - (JSC::JITStubs::cti_timeout_check): - (JSC::JITStubs::cti_register_file_check): - (JSC::JITStubs::cti_op_loop_if_less): - (JSC::JITStubs::cti_op_loop_if_lesseq): - (JSC::JITStubs::cti_op_new_object): - (JSC::JITStubs::cti_op_put_by_id_generic): - (JSC::JITStubs::cti_op_get_by_id_generic): - (JSC::JITStubs::cti_op_put_by_id): - (JSC::JITStubs::cti_op_put_by_id_second): - (JSC::JITStubs::cti_op_put_by_id_fail): - (JSC::JITStubs::cti_op_get_by_id): - (JSC::JITStubs::cti_op_get_by_id_second): - (JSC::JITStubs::cti_op_get_by_id_self_fail): - (JSC::JITStubs::cti_op_get_by_id_proto_list): - (JSC::JITStubs::cti_op_get_by_id_proto_list_full): - (JSC::JITStubs::cti_op_get_by_id_proto_fail): - (JSC::JITStubs::cti_op_get_by_id_array_fail): - (JSC::JITStubs::cti_op_get_by_id_string_fail): - (JSC::JITStubs::cti_op_instanceof): - (JSC::JITStubs::cti_op_del_by_id): - (JSC::JITStubs::cti_op_mul): - (JSC::JITStubs::cti_op_new_func): - (JSC::JITStubs::cti_op_call_JSFunction): - (JSC::JITStubs::cti_op_call_arityCheck): - (JSC::JITStubs::cti_vm_dontLazyLinkCall): - (JSC::JITStubs::cti_vm_lazyLinkCall): - (JSC::JITStubs::cti_op_push_activation): - (JSC::JITStubs::cti_op_call_NotJSFunction): - (JSC::JITStubs::cti_op_create_arguments): - (JSC::JITStubs::cti_op_create_arguments_no_params): - (JSC::JITStubs::cti_op_tear_off_activation): - (JSC::JITStubs::cti_op_tear_off_arguments): - (JSC::JITStubs::cti_op_profile_will_call): - (JSC::JITStubs::cti_op_profile_did_call): - (JSC::JITStubs::cti_op_ret_scopeChain): - (JSC::JITStubs::cti_op_new_array): - (JSC::JITStubs::cti_op_resolve): - (JSC::JITStubs::cti_op_construct_JSConstruct): - (JSC::JITStubs::cti_op_construct_NotJSConstruct): - (JSC::JITStubs::cti_op_get_by_val): - (JSC::JITStubs::cti_op_get_by_val_string): - (JSC::JITStubs::cti_op_get_by_val_byte_array): - (JSC::JITStubs::cti_op_resolve_func): - (JSC::JITStubs::cti_op_sub): - (JSC::JITStubs::cti_op_put_by_val): - (JSC::JITStubs::cti_op_put_by_val_array): - (JSC::JITStubs::cti_op_put_by_val_byte_array): - (JSC::JITStubs::cti_op_lesseq): - (JSC::JITStubs::cti_op_loop_if_true): - (JSC::JITStubs::cti_op_load_varargs): - (JSC::JITStubs::cti_op_negate): - (JSC::JITStubs::cti_op_resolve_base): - (JSC::JITStubs::cti_op_resolve_skip): - (JSC::JITStubs::cti_op_resolve_global): - (JSC::JITStubs::cti_op_div): - (JSC::JITStubs::cti_op_pre_dec): - (JSC::JITStubs::cti_op_jless): - (JSC::JITStubs::cti_op_not): - (JSC::JITStubs::cti_op_jtrue): - (JSC::JITStubs::cti_op_post_inc): - (JSC::JITStubs::cti_op_eq): - (JSC::JITStubs::cti_op_lshift): - (JSC::JITStubs::cti_op_bitand): - (JSC::JITStubs::cti_op_rshift): - (JSC::JITStubs::cti_op_bitnot): - (JSC::JITStubs::cti_op_resolve_with_base): - (JSC::JITStubs::cti_op_new_func_exp): - (JSC::JITStubs::cti_op_mod): - (JSC::JITStubs::cti_op_less): - (JSC::JITStubs::cti_op_neq): - (JSC::JITStubs::cti_op_post_dec): - (JSC::JITStubs::cti_op_urshift): - (JSC::JITStubs::cti_op_bitxor): - (JSC::JITStubs::cti_op_new_regexp): - (JSC::JITStubs::cti_op_bitor): - (JSC::JITStubs::cti_op_call_eval): - (JSC::JITStubs::cti_op_throw): - (JSC::JITStubs::cti_op_get_pnames): - (JSC::JITStubs::cti_op_next_pname): - (JSC::JITStubs::cti_op_push_scope): - (JSC::JITStubs::cti_op_pop_scope): - (JSC::JITStubs::cti_op_typeof): - (JSC::JITStubs::cti_op_is_undefined): - (JSC::JITStubs::cti_op_is_boolean): - (JSC::JITStubs::cti_op_is_number): - (JSC::JITStubs::cti_op_is_string): - (JSC::JITStubs::cti_op_is_object): - (JSC::JITStubs::cti_op_is_function): - (JSC::JITStubs::cti_op_stricteq): - (JSC::JITStubs::cti_op_to_primitive): - (JSC::JITStubs::cti_op_strcat): - (JSC::JITStubs::cti_op_nstricteq): - (JSC::JITStubs::cti_op_to_jsnumber): - (JSC::JITStubs::cti_op_in): - (JSC::JITStubs::cti_op_push_new_scope): - (JSC::JITStubs::cti_op_jmp_scopes): - (JSC::JITStubs::cti_op_put_by_index): - (JSC::JITStubs::cti_op_switch_imm): - (JSC::JITStubs::cti_op_switch_char): - (JSC::JITStubs::cti_op_switch_string): - (JSC::JITStubs::cti_op_del_by_val): - (JSC::JITStubs::cti_op_put_getter): - (JSC::JITStubs::cti_op_put_setter): - (JSC::JITStubs::cti_op_new_error): - (JSC::JITStubs::cti_op_debug): - (JSC::JITStubs::cti_vm_throw): - * jit/JITStubs.h: - (JSC::): - -2009-05-06 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Maciej Stachowiak & Darin Adler. - - Improve string concatenation (as coded in JS as a sequence of adds). - - Detect patterns corresponding to string concatenation, and change the bytecode - generation to emit a new op_strcat instruction. By handling the full set of - additions within a single function we do not need allocate JSString wrappers - for intermediate results, and we can calculate the size of the output string - prior to allocating storage, in order to prevent reallocation of the buffer. - - 1.5%-2% progression on Sunspider, largely due to a 30% progression on date-format-xparb. - * bytecode/CodeBlock.cpp: (JSC::CodeBlock::dump): - Add new opcodes. * bytecode/Opcode.h: - Add new opcodes. * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::emitStrcat): - (JSC::BytecodeGenerator::emitToPrimitive): - Add generation of new opcodes. * bytecompiler/BytecodeGenerator.h: - Add generation of new opcodes. * interpreter/Interpreter.cpp: (JSC::Interpreter::privateExecute): - Add implmentation of new opcodes. * jit/JIT.cpp: (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): - Add implmentation of new opcodes. + * jit/JIT.h: + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_get_scoped_var): + (JSC::JIT::emit_op_put_scoped_var): + (JSC::JIT::emit_op_to_primitive): + (JSC::JIT::emitSlow_op_to_primitive): * jit/JITStubs.cpp: - (JSC::JITStubs::cti_op_to_primitive): - (JSC::JITStubs::cti_op_strcat): - Add implmentation of new opcodes. * jit/JITStubs.h: - Add implmentation of new opcodes. * parser/Nodes.cpp: - (JSC::BinaryOpNode::emitStrcat): - (JSC::BinaryOpNode::emitBytecode): - (JSC::ReadModifyResolveNode::emitBytecode): - Add generation of new opcodes. - * parser/Nodes.h: - (JSC::ExpressionNode::): - (JSC::AddNode::): - Add methods to allow identification of add nodes. - * parser/ResultType.h: - (JSC::ResultType::definitelyIsString): - (JSC::ResultType::forAdd): - Fix error in detection of adds that will produce string results. - * runtime/Operations.h: - (JSC::concatenateStrings): - Add implmentation of new opcodes. - * runtime/UString.cpp: - (JSC::UString::appendNumeric): - Add methods to append numbers to an existing string. - * runtime/UString.h: - (JSC::UString::Rep::createEmptyBuffer): - (JSC::UString::BaseString::BaseString): - Add support for creating an empty string with a non-zero capacity available in the BaseString. + (JSC::FunctionCallResolveNode::emitBytecode): -2009-05-06 Darin Adler <darin@apple.com> +2009-06-23 Geoffrey Garen <ggaren@apple.com> Reviewed by Sam Weinig. - - Made RefCounted::m_refCount private. - - * runtime/Structure.h: Removed addressOfCount. - * wtf/RefCounted.h: Made m_refCount private. - Added addressOfCount. - -2009-05-06 Darin Adler <darin@apple.com> - - Fixed assertion seen a lot! - - * parser/Nodes.cpp: - (JSC::FunctionBodyNode::~FunctionBodyNode): Removed now-bogus assertion. - -2009-05-06 Darin Adler <darin@apple.com> - - Working with Sam Weinig. - - Redo parse tree constructor optimization without breaking the Windows - build the way I did yesterday. The previous try broke the build by adding - an include of Lexer.h and all its dependencies that had to work outside - the JavaScriptCore project. - - * GNUmakefile.am: Added NodeConstructors.h. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Ditto. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreCommon.vsprops: - Removed byteocde directory -- we no longer are trying to include Lexer.h - outside JavaScriptCore. - - * JavaScriptCore.xcodeproj/project.pbxproj: Change SegmentedVector.h - and Lexer.h back to internal files. Added NodeConstructors.h. - - * parser/Grammar.y: Added include of NodeConstructors.h. - Changed use of ConstDeclNode to use public functions. - - * parser/NodeConstructors.h: Copied from parser/Nodes.h. - Just contains the inlined constructors now. - - * parser/Nodes.cpp: Added include of NodeConstructors.h. - Moved node constructors into the header. - (JSC::FunctionBodyNode::FunctionBodyNode): Removed m_refCount - initialization. - - * parser/Nodes.h: Removed all the constructor definitions, and also - removed the JSC_FAST_CALL from them since these are all inlined, so the - calling convention is irrelevant. Made more things private. Used a data - member for operator opcodes instead of a virtual function. Removed the - special FunctionBodyNode::ref/deref functions since the default functions - are now just as fast. - - * runtime/FunctionConstructor.cpp: - (JSC::extractFunctionBody): Fixed types here so we don't typecast until - after we do type checking. - -2009-05-06 Simon Hausmann <simon.hausmann@nokia.com> - - Reviewed by Ariya Hidayat. - - Fix the Qt build on Windows. - - * JavaScriptCore.pri: Define BUILDING_JavaScriptCore/WTF to get the meaning - of the JS_EXPORTDATA macros correct - -2009-05-06 Simon Hausmann <simon.hausmann@nokia.com> - - Reviewed by Ariya Hidayat. - - Enable the JIT for the Qt build on Windows. - - * JavaScriptCore.pri: - -2009-05-06 Simon Hausmann <simon.hausmann@nokia.com> - - Reviewed by Tor Arne Vestbø. - - Tweak JavaScriptCore.pri for being able to override the generated sources dir for the - generated_files target. - - * JavaScriptCore.pri: - -2009-05-06 Tor Arne Vestbø <tor.arne.vestbo@nokia.com> - - Reviewed by Simon Hausmann. - - Build QtWebKit as a framework on Mac - - This implies both debug and release build by default, unless - one of the --debug or --release config options are passed to - the build-webkit script. - - Frameworks can be disabled by passing CONFIG+=webkit_no_framework - to the build-webkit script. - - To be able to build both debug and release targets in parallel - we have to use separate output directories for the generated - sources, which is not optimal, but required to avoid race conditions. - - An optimization would be to only require this spit-up on Mac. - - * JavaScriptCore.pri: - * JavaScriptCore.pro: - * jsc.pro: - -2009-05-06 Tor Arne Vestbø <tor.arne.vestbo@nokia.com> - - Reviewed by Simon Hausmann. - - [Qt] Use $$GENERATED_SOURCES_DIR as output when running bison - - A couple of the generators left the bison output file in the source - tree, and then moved it into $$GENERATED_SOURCES_DIR, which did not - work well when building release and debug configurations in parallel. - - * JavaScriptCore.pri: - -2009-05-05 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Maciej Stachowiak. - Simplified a bit of codegen. - - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - -2009-05-05 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Cameron Zwarich. + Bit off a tiny bit of standardizing opcode behavior to help with result + caching. - Moved all the JIT stub related code into one place. - - * jit/JIT.cpp: - * jit/JIT.h: - * jit/JITCode.h: - * jit/JITStubs.cpp: - (JSC::): - * jit/JITStubs.h: - -2009-05-05 Sam Weinig <sam@webkit.org> - - Try to fix Windows build. - - Move Node constructor to the .cpp file. - - * parser/Nodes.cpp: - * parser/Nodes.h: - -2009-05-05 Darin Adler <darin@apple.com> - - Try to fix Windows build. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - - Try to fix Mac build. - - * JavaScriptCore.xcodeproj/project.pbxproj: Made SegmentedVector.h private. - -2009-05-05 Darin Adler <darin@apple.com> - - Try to fix Mac build. - - * JavaScriptCore.xcodeproj/project.pbxproj: Made Lexer.h private. + 0.6% SunSpider speedup. 0.3% v8 speedup. -2009-05-05 Darin Adler <darin@apple.com> - - Reviewed by Sam Weinig. - - Bug 25569: make ParserRefCounted use conventional reference counting - https://bugs.webkit.org/show_bug.cgi?id=25569 - - SunSpider speedup of about 1.6%. - - * JavaScriptCore.exp: Updated. - - * parser/Nodes.cpp: - (JSC::NodeReleaser::releaseAllNodes): ALWAYS_INLINE. - (JSC::NodeReleaser::adopt): Ditto. - (JSC::ParserRefCounted::ParserRefCounted): Removed most of the code. - Add the object to a Vector<RefPtr> that gets cleared after parsing. - (JSC::ParserRefCounted::~ParserRefCounted): Removed most of the code. - - * parser/Nodes.h: Made ParserRefCounted inherit from RefCounted and - made inline versions of the constructor and destructor. Made the - Node constructor inline. - - * parser/Parser.cpp: - (JSC::Parser::parse): Call globalData->parserObjects.shrink(0) after - parsing, where it used to call ParserRefCounted::deleteNewObjects. - - * runtime/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): Eliminated code to manage the - newParserObjects and parserObjectExtraRefCounts. - (JSC::JSGlobalData::~JSGlobalData): Ditto. - - * runtime/JSGlobalData.h: Replaced the HashSet and HashCountedSet - with a Vector. - - * wtf/PassRefPtr.h: - (WTF::PassRefPtr::~PassRefPtr): The most common thing to do with a - PassRefPtr in hot code is to pass it and then destroy it once it's - set to zero. Help the optimizer by telling it that's true. - -2009-05-05 Xan Lopez <xlopez@igalia.com> and Gustavo Noronha Silva <gustavo.noronha@collabora.co.uk> - - Reviewed by Oliver Hunt. - - Disable the NativeFunctionWrapper for all non-Mac ports for now, - as it is also crashing on Linux/x86. - - * runtime/NativeFunctionWrapper.h: - -2009-05-05 Steve Falkenburg <sfalken@apple.com> - - Fix build. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - -2009-05-05 Oliver Hunt <oliver@apple.com> - - Reviewed by Maciej Stachowiak. - - Expose toThisObject for the DOM Window - - * JavaScriptCore.exp: - -2009-05-05 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (Make windows go again until i work out the - accursed calling convention). - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * jit/JIT.cpp: - * runtime/NativeFunctionWrapper.h: - -2009-05-05 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (Fix windows debug builds). - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - -2009-05-05 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (Hopefully the last fix). - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: - -2009-05-05 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (Fix the build fix caused by a different build fix). - - * parser/Nodes.cpp: - * parser/Nodes.h: - -2009-05-05 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (No idea how my changes could have broken these). - - * runtime/DatePrototype.cpp: - * runtime/RegExpObject.cpp: - -2009-05-05 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (Why should i expect msvc to list all the errors in a file?). - - * parser/Nodes.cpp: - -2009-05-05 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (Fix warning, and another missing include). - - * jit/JIT.cpp: - * parser/Nodes.h: - -2009-05-05 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (More build fixes). - - * runtime/ErrorPrototype.cpp: - * runtime/JSGlobalObject.cpp: - * runtime/NumberPrototype.cpp: - * runtime/ObjectPrototype.cpp: - * runtime/StringConstructor.cpp: - -2009-05-05 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (Will the fixes never end?). - - * runtime/FunctionPrototype.h: - * runtime/Lookup.cpp: - -2009-05-05 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (More build fixes). - - * jit/JIT.cpp: - -2009-05-05 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (More build fixing). - - * runtime/CallData.h: - -2009-05-05 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (Build fix). - - * runtime/ArrayConstructor.cpp: - * runtime/BooleanPrototype.cpp: - * runtime/DateConstructor.cpp: - * runtime/Error.cpp: - * runtime/ObjectConstructor.cpp: - * runtime/RegExpPrototype.cpp: - -2009-05-05 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (Buildfix). - - Add missing file - - * runtime/NativeFunctionWrapper.h: Copied from JavaScriptCore/jit/ExecutableAllocator.cpp. - -2009-05-05 Oliver Hunt <oliver@apple.com> - - Reviewed by Gavin Barraclough. - - Bug 25559: Improve native function call performance - <https://bugs.webkit.org/show_bug.cgi?id=25559> - - In order to cache calls to native functions we now make the standard - prototype functions use a small assembly thunk that converts the JS - calling convention into the native calling convention. As this is - only beneficial in the JIT we use the NativeFunctionWrapper typedef - to alternate between PrototypeFunction and JSFunction to keep the - code sane. This change from PrototypeFunction to NativeFunctionWrapper - is the bulk of this patch. - - * JavaScriptCore.exp: - * JavaScriptCore.xcodeproj/project.pbxproj: - * assembler/MacroAssemblerX86Common.h: - (JSC::MacroAssemblerX86Common::call): - * assembler/MacroAssemblerX86_64.h: - (JSC::MacroAssemblerX86_64::addPtr): - * assembler/X86Assembler.h: - (JSC::X86Assembler::leaq_mr): - (JSC::X86Assembler::call_m): - * interpreter/Interpreter.cpp: - (JSC::Interpreter::execute): - (JSC::Interpreter::prepareForRepeatCall): - * jit/JIT.cpp: - (JSC::JIT::privateCompileCTIMachineTrampolines): - * jit/JIT.h: - (JSC::JIT::compileCTIMachineTrampolines): - * jit/JITCall.cpp: - (JSC::JIT::linkCall): - (JSC::JIT::compileOpCallInitializeCallFrame): - (JSC::JIT::compileOpCall): - * jit/JITCode.h: - (JSC::JITCode::operator bool): * jit/JITInlineMethods.h: - (JSC::JIT::emitGetFromCallFrameHeader): - (JSC::JIT::emitGetFromCallFrameHeader32): - * jit/JITStubs.cpp: - (JSC::JITStubs::JITStubs): - (JSC::JITStubs::cti_op_call_JSFunction): - (JSC::JITStubs::cti_vm_dontLazyLinkCall): - (JSC::JITStubs::cti_vm_lazyLinkCall): - (JSC::JITStubs::cti_op_construct_JSConstruct): - * jit/JITStubs.h: - (JSC::JITStubs::ctiNativeCallThunk): - * jsc.cpp: - (GlobalObject::GlobalObject): - * parser/Nodes.cpp: - (JSC::FunctionBodyNode::FunctionBodyNode): - (JSC::FunctionBodyNode::createNativeThunk): - (JSC::FunctionBodyNode::generateJITCode): - * parser/Nodes.h: - (JSC::FunctionBodyNode::): - (JSC::FunctionBodyNode::generatedJITCode): - (JSC::FunctionBodyNode::jitCode): - * profiler/Profiler.cpp: - (JSC::Profiler::createCallIdentifier): - * runtime/ArgList.h: - * runtime/ArrayPrototype.cpp: - (JSC::isNumericCompareFunction): - * runtime/BooleanPrototype.cpp: - (JSC::BooleanPrototype::BooleanPrototype): - * runtime/DateConstructor.cpp: - (JSC::DateConstructor::DateConstructor): - * runtime/ErrorPrototype.cpp: - (JSC::ErrorPrototype::ErrorPrototype): - * runtime/FunctionPrototype.cpp: - (JSC::FunctionPrototype::addFunctionProperties): - (JSC::functionProtoFuncToString): - * runtime/FunctionPrototype.h: - * runtime/JSFunction.cpp: - (JSC::JSFunction::JSFunction): - (JSC::JSFunction::~JSFunction): - (JSC::JSFunction::mark): - (JSC::JSFunction::getCallData): - (JSC::JSFunction::call): - (JSC::JSFunction::argumentsGetter): - (JSC::JSFunction::callerGetter): - (JSC::JSFunction::lengthGetter): - (JSC::JSFunction::getOwnPropertySlot): - (JSC::JSFunction::put): - (JSC::JSFunction::deleteProperty): - (JSC::JSFunction::getConstructData): - (JSC::JSFunction::construct): - * runtime/JSFunction.h: - (JSC::JSFunction::JSFunction): - (JSC::JSFunction::setScope): - (JSC::JSFunction::scope): - (JSC::JSFunction::isHostFunction): - (JSC::JSFunction::scopeChain): - (JSC::JSFunction::clearScopeChain): - (JSC::JSFunction::setScopeChain): - (JSC::JSFunction::nativeFunction): - (JSC::JSFunction::setNativeFunction): - * runtime/JSGlobalData.cpp: - (JSC::JSGlobalData::~JSGlobalData): - (JSC::JSGlobalData::createNativeThunk): - * runtime/JSGlobalData.h: - (JSC::JSGlobalData::nativeFunctionThunk): - * runtime/JSGlobalObject.cpp: - (JSC::JSGlobalObject::reset): - * runtime/JSGlobalObject.h: - * runtime/Lookup.cpp: - (JSC::setUpStaticFunctionSlot): - * runtime/Lookup.h: - * runtime/NumberPrototype.cpp: - (JSC::NumberPrototype::NumberPrototype): - * runtime/ObjectPrototype.cpp: - (JSC::ObjectPrototype::ObjectPrototype): - * runtime/RegExpPrototype.cpp: - (JSC::RegExpPrototype::RegExpPrototype): - * runtime/StringConstructor.cpp: - (JSC::StringConstructor::StringConstructor): - -2009-05-05 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - For convenience, let the sampling flags tool clear multiple flags at once. - - * jsc.cpp: - (GlobalObject::GlobalObject): - (functionSetSamplingFlags): - (functionClearSamplingFlags): - -2009-05-04 Maciej Stachowiak <mjs@apple.com> - - Rubber stamped by Gavin. - - - inline Vector::resize for a ~1.5% speedup on string-tagcloud - - * wtf/Vector.h: - (WTF::Vector::resize): Inline - -2009-05-03 Steve Falkenburg <sfalken@apple.com> + (JSC::JIT::emitLoad): Accomodate a base register that overlaps with payload + by loading tag before payload, to avoid stomping base/payload. - Windows build fix. - - * JavaScriptCore.vcproj/JavaScriptCoreSubmit.sln: - -2009-05-03 Mark Rowe <mrowe@apple.com> - - Fix the 64-bit build. - - * API/APICast.h: - (toJS): - (toRef): - * runtime/JSNumberCell.cpp: - (JSC::jsAPIMangledNumber): - * runtime/JSNumberCell.h: - -2009-05-02 Sam Weinig <sam@webkit.org> - - Roll JSC API number marshaling back in one last time (I hope). - -2009-05-03 Sam Weinig <sam@webkit.org> - - Roll JSC API number marshaling back out. It still breaks windows. - -2009-05-03 Sam Weinig <sam@webkit.org> - - Roll JSC API number marshaling back in. - -2009-05-02 Darin Adler <darin@apple.com> - - Reviewed by Maciej Stachowiak. - - Bug 25519: streamline lexer by handling BOMs differently - https://bugs.webkit.org/show_bug.cgi?id=25519 - - Roughly 1% faster SunSpider. - - * parser/Grammar.y: Tweak formatting a bit. - - * parser/Lexer.cpp: - (JSC::Lexer::Lexer): Remove unnnecessary initialization of data members - that are set up by setCode. - (JSC::Lexer::currentOffset): Added. Used where the old code would look at - m_currentOffset. - (JSC::Lexer::shift1): Replaces the old shift function. No longer does anything - to handle BOM characters. - (JSC::Lexer::shift2): Ditto. - (JSC::Lexer::shift3): Ditto. - (JSC::Lexer::shift4): Ditto. - (JSC::Lexer::setCode): Updated for name change from yylineno to m_line. - Removed now-unused m_eatNextIdentifier, m_stackToken, and m_restrKeyword. - Replaced m_skipLF and m_skipCR with m_skipLineEnd. Replaced the old - m_length with m_codeEnd and m_currentOffset with m_codeStart. Added code - to scan for a BOM character and call copyCodeWithoutBOMs() if we find any. - (JSC::Lexer::copyCodeWithoutBOMs): Added. - (JSC::Lexer::nextLine): Updated for name change from yylineno to m_line. - (JSC::Lexer::makeIdentifier): Moved up higher in the file. - (JSC::Lexer::matchPunctuator): Moved up higher in the file and changed to - use a switch statement instead of just if statements. - (JSC::Lexer::isLineTerminator): Moved up higher in the file and changed to - have fewer branches. - (JSC::Lexer::lastTokenWasRestrKeyword): Added. This replaces the old - m_restrKeyword boolean. - (JSC::Lexer::isIdentStart): Moved up higher in the file. Changed to use - fewer branches in the ASCII but not identifier case. - (JSC::Lexer::isIdentPart): Ditto. - (JSC::Lexer::singleEscape): Moved up higher in the file. - (JSC::Lexer::convertOctal): Moved up higher in the file. - (JSC::Lexer::convertHex): Moved up higher in the file. Changed to use - toASCIIHexValue instead of rolling our own here. - (JSC::Lexer::convertUnicode): Ditto. - (JSC::Lexer::record8): Moved up higher in the file. - (JSC::Lexer::record16): Moved up higher in the file. - (JSC::Lexer::lex): Changed type of stringType to int. Replaced m_skipLF - and m_skipCR with m_skipLineEnd, which requires fewer branches in the - main lexer loop. Use currentOffset instead of m_currentOffset. Removed - unneeded m_stackToken. Use isASCIIDigit instead of isDecimalDigit. - Split out the two cases for InIdentifierOrKeyword and InIdentifier. - Added special case tight loops for identifiers and other simple states. - Removed a branch from the code that sets m_atLineStart to false using goto. - Streamlined the number-handling code so we don't check for the same types - twice for non-numeric cases and don't add a null to m_buffer8 when it's - not being used. Removed m_eatNextIdentifier, which wasn't working anyway, - and m_restrKeyword, which is redundant with m_lastToken. Set the - m_delimited flag without using a branch. - (JSC::Lexer::scanRegExp): Tweaked style a bit. - (JSC::Lexer::clear): Clear m_codeWithoutBOMs so we don't use memory after - parsing. Clear out UString objects in the more conventional way. - (JSC::Lexer::sourceCode): Made this no-longer inline since it has more - work to do in the case where we stripped BOMs. - - * parser/Lexer.h: Renamed yylineno to m_lineNumber. Removed convertHex - function, which is the same as toASCIIHexValue. Removed isHexDigit - function, which is the same as isASCIIHedDigit. Replaced shift with four - separate shift functions. Removed isWhiteSpace function that passes - m_current, instead just passing m_current explicitly. Removed isOctalDigit, - which is the same as isASCIIOctalDigit. Eliminated unused arguments from - matchPunctuator. Added copyCoodeWithoutBOMs and currentOffset. Moved the - makeIdentifier function out of the header. Added lastTokenWasRestrKeyword - function. Added new constants for m_skipLineEnd. Removed unused yycolumn, - m_restrKeyword, m_skipLF, m_skipCR, m_eatNextIdentifier, m_stackToken, - m_position, m_length, m_currentOffset, m_nextOffset1, m_nextOffset2, - m_nextOffset3. Added m_skipLineEnd, m_codeStart, m_codeEnd, and - m_codeWithoutBOMs. - - * parser/SourceProvider.h: Added hasBOMs function. In the future this can - be used to tell the lexer about strings known not to have BOMs. - - * runtime/JSGlobalObjectFunctions.cpp: - (JSC::globalFuncUnescape): Changed to use isASCIIHexDigit. - - * wtf/ASCIICType.h: Added using statements to match the design of the - other WTF headers. - -2009-05-02 Ada Chan <adachan@apple.com> + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_mov): Abide by the standard "tag in regT1, payload in + regT0" semantics. - Fix windows build (when doing a clean build) + (JSC::JIT::emit_op_get_global_var): + (JSC::JIT::emit_op_put_global_var): Ditto. Also, removed some irrelevent + loads while I was at it. The global object's "d" pointer never changes + after construction. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - -2009-05-02 Geoffrey Garen <ggaren@apple.com> +2009-06-23 Gavin Barraclough <barraclough@apple.com> Reviewed by Sam Weinig. - Simplified null-ish JSValues. - - Replaced calls to noValue() with calls to JSValue() (which is what - noValue() returned). Removed noValue(). - - Replaced almost all uses of jsImpossibleValue() with uses of JSValue(). - Its one remaining use is for construction of hash table deleted values. - For that specific task, I made a new, private constructor with a special - tag. Removed jsImpossibleValue(). - - Removed "JSValue()" initialiazers, since default construction happens... - by default. - - * API/JSCallbackObjectFunctions.h: - (JSC::::call): - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::emitLoad): - * bytecompiler/BytecodeGenerator.h: - * debugger/DebuggerCallFrame.cpp: - (JSC::DebuggerCallFrame::evaluate): - * debugger/DebuggerCallFrame.h: - (JSC::DebuggerCallFrame::DebuggerCallFrame): - * interpreter/CallFrame.h: - (JSC::ExecState::clearException): - * interpreter/Interpreter.cpp: - (JSC::Interpreter::privateExecute): - (JSC::Interpreter::retrieveLastCaller): - * interpreter/Register.h: - (JSC::Register::Register): - * jit/JITCall.cpp: - (JSC::JIT::unlinkCall): - (JSC::JIT::compileOpCallInitializeCallFrame): - (JSC::JIT::compileOpCall): - * jit/JITStubs.cpp: - (JSC::JITStubs::cti_op_call_eval): - (JSC::JITStubs::cti_vm_throw): - * profiler/Profiler.cpp: - (JSC::Profiler::willExecute): - (JSC::Profiler::didExecute): - * runtime/ArrayPrototype.cpp: - (JSC::getProperty): - * runtime/Completion.cpp: - (JSC::evaluate): - * runtime/Completion.h: - (JSC::Completion::Completion): - * runtime/GetterSetter.cpp: - (JSC::GetterSetter::getPrimitiveNumber): - * runtime/JSArray.cpp: - (JSC::JSArray::putSlowCase): - (JSC::JSArray::deleteProperty): - (JSC::JSArray::increaseVectorLength): - (JSC::JSArray::setLength): - (JSC::JSArray::pop): - (JSC::JSArray::sort): - (JSC::JSArray::compactForSorting): - * runtime/JSCell.cpp: - (JSC::JSCell::getJSNumber): - * runtime/JSCell.h: - (JSC::JSValue::getJSNumber): - * runtime/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): - * runtime/JSImmediate.h: - (JSC::JSImmediate::fromNumberOutsideIntegerRange): - (JSC::JSImmediate::from): - * runtime/JSNumberCell.cpp: - (JSC::jsNumberCell): - * runtime/JSObject.cpp: - (JSC::callDefaultValueFunction): - * runtime/JSObject.h: - (JSC::JSObject::getDirect): - * runtime/JSPropertyNameIterator.cpp: - (JSC::JSPropertyNameIterator::toPrimitive): - * runtime/JSPropertyNameIterator.h: - (JSC::JSPropertyNameIterator::next): - * runtime/JSValue.h: - (JSC::JSValue::): - (JSC::JSValueHashTraits::constructDeletedValue): - (JSC::JSValueHashTraits::isDeletedValue): - (JSC::JSValue::JSValue): - * runtime/JSWrapperObject.h: - (JSC::JSWrapperObject::JSWrapperObject): - * runtime/Operations.h: - (JSC::resolveBase): - * runtime/PropertySlot.h: - (JSC::PropertySlot::clearBase): - (JSC::PropertySlot::clearValue): - -2009-05-02 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Cameron Zwarich. - - - speed up the lexer in various ways - - ~2% command-line SunSpider speedup - - * parser/Lexer.cpp: - (JSC::Lexer::setCode): Moved below shift() so it can inline. - (JSC::Lexer::scanRegExp): Use resize(0) instead of clear() on Vectors, since the intent - here is not to free the underlying buffer. - (JSC::Lexer::lex): ditto; also, change the loop logic a bit for the main lexing loop - to avoid branching on !m_done twice per iteration. Now we only check it once. - (JSC::Lexer::shift): Make this ALWAYS_INLINE and tag an unusual branch as UNLIKELY - * parser/Lexer.h: - (JSC::Lexer::makeIdentifier): force to be ALWAYS_INLINE - * wtf/Vector.h: - (WTF::::append): force to be ALWAYS_INLINE (may have helped in ways other than parsing but it wasn't - getting inlined in a hot code path in the lexer) - -2009-05-01 Steve Falkenburg <sfalken@apple.com> - - Windows build fix. - - * JavaScriptCore.vcproj/JavaScriptCore.make: - -2009-05-01 Sam Weinig <sam@webkit.org> - - Fix 64bit build. - - * runtime/JSNumberCell.h: - (JSC::JSValue::JSValue): - * runtime/JSValue.h: - (JSC::jsNumber): - -2009-05-01 Sam Weinig <sam@webkit.org> - - Roll out JavaScriptCore API number marshaling. - - * API/APICast.h: - (toJS): - (toRef): - * API/JSBase.cpp: - (JSEvaluateScript): - (JSCheckScriptSyntax): - * API/JSCallbackConstructor.cpp: - (JSC::constructJSCallback): - * API/JSCallbackFunction.cpp: - (JSC::JSCallbackFunction::call): - * API/JSCallbackObjectFunctions.h: - (JSC::::getOwnPropertySlot): - (JSC::::put): - (JSC::::deleteProperty): - (JSC::::construct): - (JSC::::hasInstance): - (JSC::::call): - (JSC::::toNumber): - (JSC::::toString): - (JSC::::staticValueGetter): - (JSC::::callbackGetter): - * API/JSObjectRef.cpp: - (JSObjectMakeFunction): - (JSObjectMakeArray): - (JSObjectMakeDate): - (JSObjectMakeError): - (JSObjectMakeRegExp): - (JSObjectGetPrototype): - (JSObjectSetPrototype): - (JSObjectGetProperty): - (JSObjectSetProperty): - (JSObjectGetPropertyAtIndex): - (JSObjectSetPropertyAtIndex): - (JSObjectDeleteProperty): - (JSObjectCallAsFunction): - (JSObjectCallAsConstructor): - * API/JSValueRef.cpp: - (JSValueGetType): - (JSValueIsUndefined): - (JSValueIsNull): - (JSValueIsBoolean): - (JSValueIsNumber): - (JSValueIsString): - (JSValueIsObject): - (JSValueIsObjectOfClass): - (JSValueIsEqual): - (JSValueIsStrictEqual): - (JSValueIsInstanceOfConstructor): - (JSValueMakeUndefined): - (JSValueMakeNull): - (JSValueMakeBoolean): - (JSValueMakeNumber): - (JSValueMakeString): - (JSValueToBoolean): - (JSValueToNumber): - (JSValueToStringCopy): - (JSValueToObject): - (JSValueProtect): - (JSValueUnprotect): - * JavaScriptCore.exp: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - * runtime/JSNumberCell.cpp: - * runtime/JSNumberCell.h: - * runtime/JSValue.h: - -2009-05-01 Sam Weinig <sam@webkit.org> - - Fix windows build. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - -2009-05-01 Sam Weinig <sam@webkit.org> - - Fix the build. - - * JavaScriptCore.exp: - -2009-05-01 Sam Weinig <sam@webkit.org> - - Reviewed by Geoffrey "Too Far!" Garen. - - Move JS number construction into JSValue. - - * runtime/JSImmediate.h: - * runtime/JSNumberCell.h: - (JSC::JSValue::JSValue): - * runtime/JSValue.h: - (JSC::jsNumber): - -2009-05-01 Sam Weinig <sam@webkit.org> - - Reviewed by Geoff "The Minneapolis" Garen. - - Add mechanism to vend heap allocated JS numbers to JavaScriptCore API clients with a - representation that is independent of the number representation in the VM. - - Numbers leaving the interpreter are converted to a tagged JSNumberCell. - - The numbers coming into the interpreter (asserted to be the tagged JSNumberCell) are - converted back to the VM's internal number representation. - - * API/APICast.h: - (toJS): - (toRef): - * API/JSBase.cpp: - (JSEvaluateScript): - (JSCheckScriptSyntax): - * API/JSCallbackConstructor.cpp: - (JSC::constructJSCallback): - * API/JSCallbackFunction.cpp: - (JSC::JSCallbackFunction::call): - * API/JSCallbackObjectFunctions.h: - (JSC::::getOwnPropertySlot): - (JSC::::put): - (JSC::::deleteProperty): - (JSC::::construct): - (JSC::::hasInstance): - (JSC::::call): - (JSC::::toNumber): - (JSC::::toString): - (JSC::::staticValueGetter): - (JSC::::callbackGetter): - * API/JSObjectRef.cpp: - (JSObjectMakeFunction): - (JSObjectMakeArray): - (JSObjectMakeDate): - (JSObjectMakeError): - (JSObjectMakeRegExp): - (JSObjectGetPrototype): - (JSObjectSetPrototype): - (JSObjectGetProperty): - (JSObjectSetProperty): - (JSObjectGetPropertyAtIndex): - (JSObjectSetPropertyAtIndex): - (JSObjectDeleteProperty): - (JSObjectCallAsFunction): - (JSObjectCallAsConstructor): - * API/JSValueRef.cpp: - (JSValueGetType): - (JSValueIsUndefined): - (JSValueIsNull): - (JSValueIsBoolean): - (JSValueIsNumber): - (JSValueIsString): - (JSValueIsObject): - (JSValueIsObjectOfClass): - (JSValueIsEqual): - (JSValueIsStrictEqual): - (JSValueIsInstanceOfConstructor): - (JSValueMakeUndefined): - (JSValueMakeNull): - (JSValueMakeBoolean): - (JSValueMakeNumber): - (JSValueMakeString): - (JSValueToBoolean): - (JSValueToNumber): - (JSValueToStringCopy): - (JSValueToObject): - (JSValueProtect): - (JSValueUnprotect): - * runtime/JSNumberCell.cpp: - (JSC::jsAPIMangledNumber): - * runtime/JSNumberCell.h: - (JSC::JSNumberCell::isAPIMangledNumber): - (JSC::JSNumberCell::): - (JSC::JSNumberCell::JSNumberCell): - (JSC::JSValue::isAPIMangledNumber): - * runtime/JSValue.h: - -2009-05-01 Geoffrey Garen <ggaren@apple.com> - - Windows build fix take 6. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: - -2009-05-01 Geoffrey Garen <ggaren@apple.com> - - Windows build fix take 5. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - -2009-05-01 Geoffrey Garen <ggaren@apple.com> - - Windows build fix take 4. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - -2009-05-01 Geoffrey Garen <ggaren@apple.com> - - Windows build fix take 3. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - -2009-05-01 Geoffrey Garen <ggaren@apple.com> - - Windows build fix take 2. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: - -2009-05-01 Geoffrey Garen <ggaren@apple.com> - - Windows build fix take 1. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - -2009-05-01 Geoffrey Garen <ggaren@apple.com> + Remove 'arguments' field from Register union (again). + This time do so without breaking tests (radical, I know). - Rubber Stamped by Sam Weinig. - - Renamed JSValuePtr => JSValue. - - * API/APICast.h: - (toJS): - (toRef): - * API/JSCallbackConstructor.h: - (JSC::JSCallbackConstructor::createStructure): - * API/JSCallbackFunction.cpp: - (JSC::JSCallbackFunction::call): - * API/JSCallbackFunction.h: - (JSC::JSCallbackFunction::createStructure): - * API/JSCallbackObject.h: - (JSC::JSCallbackObject::createStructure): - * API/JSCallbackObjectFunctions.h: - (JSC::::asCallbackObject): - (JSC::::put): - (JSC::::hasInstance): - (JSC::::call): - (JSC::::staticValueGetter): - (JSC::::staticFunctionGetter): - (JSC::::callbackGetter): - * API/JSContextRef.cpp: - * API/JSObjectRef.cpp: - (JSObjectMakeConstructor): - (JSObjectSetPrototype): - (JSObjectGetProperty): - (JSObjectSetProperty): - (JSObjectGetPropertyAtIndex): - (JSObjectSetPropertyAtIndex): - * API/JSValueRef.cpp: - (JSValueGetType): - (JSValueIsUndefined): - (JSValueIsNull): - (JSValueIsBoolean): - (JSValueIsNumber): - (JSValueIsString): - (JSValueIsObject): - (JSValueIsObjectOfClass): - (JSValueIsEqual): - (JSValueIsStrictEqual): - (JSValueIsInstanceOfConstructor): - (JSValueToBoolean): - (JSValueToNumber): - (JSValueToStringCopy): - (JSValueToObject): - (JSValueProtect): - (JSValueUnprotect): - * JavaScriptCore.exp: - * bytecode/CodeBlock.cpp: - (JSC::valueToSourceString): - (JSC::constantName): - (JSC::CodeBlock::dump): - * bytecode/CodeBlock.h: - (JSC::CodeBlock::getConstant): - (JSC::CodeBlock::addUnexpectedConstant): - (JSC::CodeBlock::unexpectedConstant): - * bytecode/EvalCodeCache.h: - (JSC::EvalCodeCache::get): - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::addConstant): - (JSC::BytecodeGenerator::addUnexpectedConstant): - (JSC::BytecodeGenerator::emitLoad): - (JSC::BytecodeGenerator::emitGetScopedVar): - (JSC::BytecodeGenerator::emitPutScopedVar): - (JSC::BytecodeGenerator::emitNewError): - (JSC::keyForImmediateSwitch): - * bytecompiler/BytecodeGenerator.h: - (JSC::BytecodeGenerator::JSValueHashTraits::constructDeletedValue): - (JSC::BytecodeGenerator::JSValueHashTraits::isDeletedValue): - * debugger/Debugger.cpp: - (JSC::evaluateInGlobalCallFrame): - * debugger/Debugger.h: - * debugger/DebuggerActivation.cpp: - (JSC::DebuggerActivation::put): - (JSC::DebuggerActivation::putWithAttributes): - (JSC::DebuggerActivation::lookupGetter): - (JSC::DebuggerActivation::lookupSetter): - * debugger/DebuggerActivation.h: - (JSC::DebuggerActivation::createStructure): - * debugger/DebuggerCallFrame.cpp: - (JSC::DebuggerCallFrame::evaluate): - * debugger/DebuggerCallFrame.h: - (JSC::DebuggerCallFrame::DebuggerCallFrame): - (JSC::DebuggerCallFrame::exception): - * interpreter/CachedCall.h: - (JSC::CachedCall::CachedCall): - (JSC::CachedCall::call): - (JSC::CachedCall::setThis): - (JSC::CachedCall::setArgument): - * interpreter/CallFrame.cpp: - (JSC::CallFrame::thisValue): - (JSC::CallFrame::dumpCaller): * interpreter/CallFrame.h: - (JSC::ExecState::setException): - (JSC::ExecState::exception): - (JSC::ExecState::exceptionSlot): - * interpreter/CallFrameClosure.h: - (JSC::CallFrameClosure::setArgument): + (JSC::ExecState::optionalCalleeArguments): + (JSC::ExecState::setArgumentCount): + (JSC::ExecState::init): * interpreter/Interpreter.cpp: - (JSC::Interpreter::resolve): - (JSC::Interpreter::resolveSkip): - (JSC::Interpreter::resolveGlobal): - (JSC::Interpreter::resolveBase): - (JSC::Interpreter::resolveBaseAndProperty): - (JSC::Interpreter::resolveBaseAndFunc): - (JSC::isNotObject): - (JSC::Interpreter::callEval): + (JSC::Interpreter::dumpRegisters): (JSC::Interpreter::unwindCallFrame): - (JSC::Interpreter::throwException): - (JSC::Interpreter::execute): - (JSC::Interpreter::prepareForRepeatCall): - (JSC::Interpreter::createExceptionScope): - (JSC::Interpreter::tryCachePutByID): - (JSC::Interpreter::tryCacheGetByID): (JSC::Interpreter::privateExecute): (JSC::Interpreter::retrieveArguments): - (JSC::Interpreter::retrieveCaller): - (JSC::Interpreter::retrieveLastCaller): - * interpreter/Interpreter.h: * interpreter/Register.h: + (JSC::Register::withInt): (JSC::Register::): (JSC::Register::Register): - (JSC::Register::jsValue): - * jit/JIT.cpp: - (JSC::): - (JSC::JIT::privateCompileMainPass): - * jit/JIT.h: - * jit/JITArithmetic.cpp: - (JSC::JIT::compileFastArith_op_mod): - * jit/JITCall.cpp: - (JSC::JIT::unlinkCall): - (JSC::JIT::compileOpCallInitializeCallFrame): - (JSC::JIT::compileOpCall): - * jit/JITCode.h: - (JSC::): - (JSC::JITCode::execute): - * jit/JITInlineMethods.h: - (JSC::JIT::emitGetVirtualRegister): - (JSC::JIT::getConstantOperand): - (JSC::JIT::emitPutJITStubArgFromVirtualRegister): - (JSC::JIT::emitInitRegister): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::privateCompilePutByIdTransition): - (JSC::JIT::patchGetByIdSelf): - (JSC::JIT::patchPutByIdReplace): - (JSC::JIT::privateCompileGetByIdSelf): - (JSC::JIT::privateCompileGetByIdProto): - (JSC::JIT::privateCompileGetByIdSelfList): - (JSC::JIT::privateCompileGetByIdProtoList): - (JSC::JIT::privateCompileGetByIdChainList): - (JSC::JIT::privateCompileGetByIdChain): - (JSC::JIT::privateCompilePutByIdReplace): + (JSC::Register::i): * jit/JITStubs.cpp: - (JSC::JITStubs::tryCachePutByID): - (JSC::JITStubs::tryCacheGetByID): - (JSC::JITStubs::cti_op_convert_this): - (JSC::JITStubs::cti_op_add): - (JSC::JITStubs::cti_op_pre_inc): - (JSC::JITStubs::cti_op_loop_if_less): - (JSC::JITStubs::cti_op_loop_if_lesseq): - (JSC::JITStubs::cti_op_get_by_id_generic): - (JSC::JITStubs::cti_op_get_by_id): - (JSC::JITStubs::cti_op_get_by_id_second): - (JSC::JITStubs::cti_op_get_by_id_self_fail): - (JSC::JITStubs::cti_op_get_by_id_proto_list): - (JSC::JITStubs::cti_op_get_by_id_proto_list_full): - (JSC::JITStubs::cti_op_get_by_id_proto_fail): - (JSC::JITStubs::cti_op_get_by_id_array_fail): - (JSC::JITStubs::cti_op_get_by_id_string_fail): - (JSC::JITStubs::cti_op_instanceof): - (JSC::JITStubs::cti_op_del_by_id): - (JSC::JITStubs::cti_op_mul): - (JSC::JITStubs::cti_op_call_NotJSFunction): - (JSC::JITStubs::cti_op_resolve): - (JSC::JITStubs::cti_op_construct_NotJSConstruct): - (JSC::JITStubs::cti_op_get_by_val): - (JSC::JITStubs::cti_op_get_by_val_string): - (JSC::JITStubs::cti_op_get_by_val_byte_array): - (JSC::JITStubs::cti_op_resolve_func): - (JSC::JITStubs::cti_op_sub): - (JSC::JITStubs::cti_op_put_by_val): - (JSC::JITStubs::cti_op_put_by_val_array): - (JSC::JITStubs::cti_op_put_by_val_byte_array): - (JSC::JITStubs::cti_op_lesseq): - (JSC::JITStubs::cti_op_loop_if_true): - (JSC::JITStubs::cti_op_load_varargs): - (JSC::JITStubs::cti_op_negate): - (JSC::JITStubs::cti_op_resolve_base): - (JSC::JITStubs::cti_op_resolve_skip): - (JSC::JITStubs::cti_op_resolve_global): - (JSC::JITStubs::cti_op_div): - (JSC::JITStubs::cti_op_pre_dec): - (JSC::JITStubs::cti_op_jless): - (JSC::JITStubs::cti_op_not): - (JSC::JITStubs::cti_op_jtrue): - (JSC::JITStubs::cti_op_post_inc): - (JSC::JITStubs::cti_op_eq): - (JSC::JITStubs::cti_op_lshift): - (JSC::JITStubs::cti_op_bitand): - (JSC::JITStubs::cti_op_rshift): - (JSC::JITStubs::cti_op_bitnot): - (JSC::JITStubs::cti_op_resolve_with_base): - (JSC::JITStubs::cti_op_mod): - (JSC::JITStubs::cti_op_less): - (JSC::JITStubs::cti_op_neq): - (JSC::JITStubs::cti_op_post_dec): - (JSC::JITStubs::cti_op_urshift): - (JSC::JITStubs::cti_op_bitxor): - (JSC::JITStubs::cti_op_bitor): - (JSC::JITStubs::cti_op_call_eval): - (JSC::JITStubs::cti_op_throw): - (JSC::JITStubs::cti_op_next_pname): - (JSC::JITStubs::cti_op_typeof): - (JSC::JITStubs::cti_op_is_undefined): - (JSC::JITStubs::cti_op_is_boolean): - (JSC::JITStubs::cti_op_is_number): - (JSC::JITStubs::cti_op_is_string): - (JSC::JITStubs::cti_op_is_object): - (JSC::JITStubs::cti_op_is_function): - (JSC::JITStubs::cti_op_stricteq): - (JSC::JITStubs::cti_op_nstricteq): - (JSC::JITStubs::cti_op_to_jsnumber): - (JSC::JITStubs::cti_op_in): - (JSC::JITStubs::cti_op_switch_imm): - (JSC::JITStubs::cti_op_switch_char): - (JSC::JITStubs::cti_op_switch_string): - (JSC::JITStubs::cti_op_del_by_val): - (JSC::JITStubs::cti_op_new_error): - (JSC::JITStubs::cti_vm_throw): - * jit/JITStubs.h: - * jsc.cpp: - (functionPrint): - (functionDebug): - (functionGC): - (functionVersion): - (functionRun): - (functionLoad): - (functionSetSamplingFlag): - (functionClearSamplingFlag): - (functionReadline): - (functionQuit): - * parser/Nodes.cpp: - (JSC::processClauseList): - * profiler/ProfileGenerator.cpp: - (JSC::ProfileGenerator::addParentForConsoleStart): - * profiler/Profiler.cpp: - (JSC::Profiler::willExecute): - (JSC::Profiler::didExecute): - (JSC::Profiler::createCallIdentifier): - * profiler/Profiler.h: - * runtime/ArgList.cpp: - (JSC::MarkedArgumentBuffer::slowAppend): - * runtime/ArgList.h: - (JSC::MarkedArgumentBuffer::at): - (JSC::MarkedArgumentBuffer::append): - (JSC::ArgList::ArgList): - (JSC::ArgList::at): - * runtime/Arguments.cpp: - (JSC::Arguments::put): + (JSC::JITStubs::cti_op_tear_off_arguments): * runtime/Arguments.h: - (JSC::Arguments::createStructure): - (JSC::asArguments): - * runtime/ArrayConstructor.cpp: - (JSC::callArrayConstructor): - * runtime/ArrayPrototype.cpp: - (JSC::getProperty): - (JSC::putProperty): - (JSC::arrayProtoFuncToString): - (JSC::arrayProtoFuncToLocaleString): - (JSC::arrayProtoFuncJoin): - (JSC::arrayProtoFuncConcat): - (JSC::arrayProtoFuncPop): - (JSC::arrayProtoFuncPush): - (JSC::arrayProtoFuncReverse): - (JSC::arrayProtoFuncShift): - (JSC::arrayProtoFuncSlice): - (JSC::arrayProtoFuncSort): - (JSC::arrayProtoFuncSplice): - (JSC::arrayProtoFuncUnShift): - (JSC::arrayProtoFuncFilter): - (JSC::arrayProtoFuncMap): - (JSC::arrayProtoFuncEvery): - (JSC::arrayProtoFuncForEach): - (JSC::arrayProtoFuncSome): - (JSC::arrayProtoFuncReduce): - (JSC::arrayProtoFuncReduceRight): - (JSC::arrayProtoFuncIndexOf): - (JSC::arrayProtoFuncLastIndexOf): - * runtime/BooleanConstructor.cpp: - (JSC::callBooleanConstructor): - (JSC::constructBooleanFromImmediateBoolean): - * runtime/BooleanConstructor.h: - * runtime/BooleanObject.h: - (JSC::asBooleanObject): - * runtime/BooleanPrototype.cpp: - (JSC::booleanProtoFuncToString): - (JSC::booleanProtoFuncValueOf): - * runtime/CallData.cpp: - (JSC::call): - * runtime/CallData.h: - * runtime/Collector.cpp: - (JSC::Heap::protect): - (JSC::Heap::unprotect): - (JSC::Heap::heap): - * runtime/Collector.h: - * runtime/Completion.cpp: - (JSC::evaluate): - * runtime/Completion.h: - (JSC::Completion::Completion): - (JSC::Completion::value): - (JSC::Completion::setValue): - * runtime/ConstructData.cpp: - (JSC::construct): - * runtime/ConstructData.h: - * runtime/DateConstructor.cpp: - (JSC::constructDate): - (JSC::callDate): - (JSC::dateParse): - (JSC::dateNow): - (JSC::dateUTC): - * runtime/DateInstance.h: - (JSC::asDateInstance): - * runtime/DatePrototype.cpp: - (JSC::dateProtoFuncToString): - (JSC::dateProtoFuncToUTCString): - (JSC::dateProtoFuncToDateString): - (JSC::dateProtoFuncToTimeString): - (JSC::dateProtoFuncToLocaleString): - (JSC::dateProtoFuncToLocaleDateString): - (JSC::dateProtoFuncToLocaleTimeString): - (JSC::dateProtoFuncGetTime): - (JSC::dateProtoFuncGetFullYear): - (JSC::dateProtoFuncGetUTCFullYear): - (JSC::dateProtoFuncToGMTString): - (JSC::dateProtoFuncGetMonth): - (JSC::dateProtoFuncGetUTCMonth): - (JSC::dateProtoFuncGetDate): - (JSC::dateProtoFuncGetUTCDate): - (JSC::dateProtoFuncGetDay): - (JSC::dateProtoFuncGetUTCDay): - (JSC::dateProtoFuncGetHours): - (JSC::dateProtoFuncGetUTCHours): - (JSC::dateProtoFuncGetMinutes): - (JSC::dateProtoFuncGetUTCMinutes): - (JSC::dateProtoFuncGetSeconds): - (JSC::dateProtoFuncGetUTCSeconds): - (JSC::dateProtoFuncGetMilliSeconds): - (JSC::dateProtoFuncGetUTCMilliseconds): - (JSC::dateProtoFuncGetTimezoneOffset): - (JSC::dateProtoFuncSetTime): - (JSC::setNewValueFromTimeArgs): - (JSC::setNewValueFromDateArgs): - (JSC::dateProtoFuncSetMilliSeconds): - (JSC::dateProtoFuncSetUTCMilliseconds): - (JSC::dateProtoFuncSetSeconds): - (JSC::dateProtoFuncSetUTCSeconds): - (JSC::dateProtoFuncSetMinutes): - (JSC::dateProtoFuncSetUTCMinutes): - (JSC::dateProtoFuncSetHours): - (JSC::dateProtoFuncSetUTCHours): - (JSC::dateProtoFuncSetDate): - (JSC::dateProtoFuncSetUTCDate): - (JSC::dateProtoFuncSetMonth): - (JSC::dateProtoFuncSetUTCMonth): - (JSC::dateProtoFuncSetFullYear): - (JSC::dateProtoFuncSetUTCFullYear): - (JSC::dateProtoFuncSetYear): - (JSC::dateProtoFuncGetYear): - * runtime/DatePrototype.h: - (JSC::DatePrototype::createStructure): - * runtime/ErrorConstructor.cpp: - (JSC::callErrorConstructor): - * runtime/ErrorPrototype.cpp: - (JSC::errorProtoFuncToString): - * runtime/ExceptionHelpers.cpp: - (JSC::createInterruptedExecutionException): - (JSC::createError): - (JSC::createStackOverflowError): - (JSC::createUndefinedVariableError): - (JSC::createErrorMessage): - (JSC::createInvalidParamError): - (JSC::createNotAConstructorError): - (JSC::createNotAFunctionError): - * runtime/ExceptionHelpers.h: - * runtime/FunctionConstructor.cpp: - (JSC::callFunctionConstructor): - * runtime/FunctionPrototype.cpp: - (JSC::callFunctionPrototype): - (JSC::functionProtoFuncToString): - (JSC::functionProtoFuncApply): - (JSC::functionProtoFuncCall): - * runtime/FunctionPrototype.h: - (JSC::FunctionPrototype::createStructure): - * runtime/GetterSetter.cpp: - (JSC::GetterSetter::toPrimitive): - (JSC::GetterSetter::getPrimitiveNumber): - * runtime/GetterSetter.h: - (JSC::asGetterSetter): - * runtime/InternalFunction.cpp: - (JSC::InternalFunction::displayName): - * runtime/InternalFunction.h: - (JSC::InternalFunction::createStructure): - (JSC::asInternalFunction): + (JSC::JSActivation::copyRegisters): + (JSC::Register::arguments): * runtime/JSActivation.cpp: - (JSC::JSActivation::getOwnPropertySlot): - (JSC::JSActivation::put): - (JSC::JSActivation::putWithAttributes): (JSC::JSActivation::argumentsGetter): * runtime/JSActivation.h: - (JSC::JSActivation::createStructure): - (JSC::asActivation): - * runtime/JSArray.cpp: - (JSC::storageSize): - (JSC::JSArray::JSArray): - (JSC::JSArray::getOwnPropertySlot): - (JSC::JSArray::put): - (JSC::JSArray::putSlowCase): - (JSC::JSArray::deleteProperty): - (JSC::JSArray::setLength): - (JSC::JSArray::pop): - (JSC::JSArray::push): - (JSC::JSArray::mark): - (JSC::compareNumbersForQSort): - (JSC::JSArray::sortNumeric): - (JSC::JSArray::sort): - (JSC::JSArray::compactForSorting): - (JSC::JSArray::checkConsistency): - (JSC::constructArray): - * runtime/JSArray.h: - (JSC::JSArray::getIndex): - (JSC::JSArray::setIndex): - (JSC::JSArray::createStructure): - (JSC::asArray): - (JSC::isJSArray): - * runtime/JSByteArray.cpp: - (JSC::JSByteArray::createStructure): - (JSC::JSByteArray::put): - * runtime/JSByteArray.h: - (JSC::JSByteArray::getIndex): - (JSC::JSByteArray::setIndex): - (JSC::asByteArray): - (JSC::isJSByteArray): - * runtime/JSCell.cpp: - (JSC::JSCell::put): - (JSC::JSCell::getJSNumber): - * runtime/JSCell.h: - (JSC::asCell): - (JSC::JSValue::asCell): - (JSC::JSValue::isString): - (JSC::JSValue::isGetterSetter): - (JSC::JSValue::isObject): - (JSC::JSValue::getString): - (JSC::JSValue::getObject): - (JSC::JSValue::getCallData): - (JSC::JSValue::getConstructData): - (JSC::JSValue::getUInt32): - (JSC::JSValue::getTruncatedInt32): - (JSC::JSValue::getTruncatedUInt32): - (JSC::JSValue::mark): - (JSC::JSValue::marked): - (JSC::JSValue::toPrimitive): - (JSC::JSValue::getPrimitiveNumber): - (JSC::JSValue::toBoolean): - (JSC::JSValue::toNumber): - (JSC::JSValue::toString): - (JSC::JSValue::toObject): - (JSC::JSValue::toThisObject): - (JSC::JSValue::needsThisConversion): - (JSC::JSValue::toThisString): - (JSC::JSValue::getJSNumber): - * runtime/JSFunction.cpp: - (JSC::JSFunction::call): - (JSC::JSFunction::argumentsGetter): - (JSC::JSFunction::callerGetter): - (JSC::JSFunction::lengthGetter): - (JSC::JSFunction::getOwnPropertySlot): - (JSC::JSFunction::put): - (JSC::JSFunction::construct): - * runtime/JSFunction.h: - (JSC::JSFunction::createStructure): - (JSC::asFunction): - * runtime/JSGlobalData.h: - * runtime/JSGlobalObject.cpp: - (JSC::markIfNeeded): - (JSC::JSGlobalObject::put): - (JSC::JSGlobalObject::putWithAttributes): - (JSC::JSGlobalObject::reset): - (JSC::JSGlobalObject::resetPrototype): - * runtime/JSGlobalObject.h: - (JSC::JSGlobalObject::createStructure): - (JSC::JSGlobalObject::GlobalPropertyInfo::GlobalPropertyInfo): - (JSC::asGlobalObject): - (JSC::Structure::prototypeForLookup): - (JSC::Structure::prototypeChain): - (JSC::Structure::isValid): - * runtime/JSGlobalObjectFunctions.cpp: - (JSC::encode): - (JSC::decode): - (JSC::globalFuncEval): - (JSC::globalFuncParseInt): - (JSC::globalFuncParseFloat): - (JSC::globalFuncIsNaN): - (JSC::globalFuncIsFinite): - (JSC::globalFuncDecodeURI): - (JSC::globalFuncDecodeURIComponent): - (JSC::globalFuncEncodeURI): - (JSC::globalFuncEncodeURIComponent): - (JSC::globalFuncEscape): - (JSC::globalFuncUnescape): - (JSC::globalFuncJSCPrint): - * runtime/JSGlobalObjectFunctions.h: - * runtime/JSImmediate.cpp: - (JSC::JSImmediate::toThisObject): - (JSC::JSImmediate::toObject): - (JSC::JSImmediate::prototype): - (JSC::JSImmediate::toString): - * runtime/JSImmediate.h: - (JSC::JSImmediate::isImmediate): - (JSC::JSImmediate::isNumber): - (JSC::JSImmediate::isIntegerNumber): - (JSC::JSImmediate::isDoubleNumber): - (JSC::JSImmediate::isPositiveIntegerNumber): - (JSC::JSImmediate::isBoolean): - (JSC::JSImmediate::isUndefinedOrNull): - (JSC::JSImmediate::isEitherImmediate): - (JSC::JSImmediate::areBothImmediate): - (JSC::JSImmediate::areBothImmediateIntegerNumbers): - (JSC::JSImmediate::makeValue): - (JSC::JSImmediate::makeInt): - (JSC::JSImmediate::makeDouble): - (JSC::JSImmediate::makeBool): - (JSC::JSImmediate::makeUndefined): - (JSC::JSImmediate::makeNull): - (JSC::JSImmediate::doubleValue): - (JSC::JSImmediate::intValue): - (JSC::JSImmediate::uintValue): - (JSC::JSImmediate::boolValue): - (JSC::JSImmediate::rawValue): - (JSC::JSImmediate::trueImmediate): - (JSC::JSImmediate::falseImmediate): - (JSC::JSImmediate::undefinedImmediate): - (JSC::JSImmediate::nullImmediate): - (JSC::JSImmediate::zeroImmediate): - (JSC::JSImmediate::oneImmediate): - (JSC::JSImmediate::impossibleValue): - (JSC::JSImmediate::toBoolean): - (JSC::JSImmediate::getTruncatedUInt32): - (JSC::JSImmediate::fromNumberOutsideIntegerRange): - (JSC::JSImmediate::from): - (JSC::JSImmediate::getTruncatedInt32): - (JSC::JSImmediate::toDouble): - (JSC::JSImmediate::getUInt32): - (JSC::JSValue::JSValue): - (JSC::JSValue::isUndefinedOrNull): - (JSC::JSValue::isBoolean): - (JSC::JSValue::getBoolean): - (JSC::JSValue::toInt32): - (JSC::JSValue::toUInt32): - (JSC::JSValue::isCell): - (JSC::JSValue::isInt32Fast): - (JSC::JSValue::getInt32Fast): - (JSC::JSValue::isUInt32Fast): - (JSC::JSValue::getUInt32Fast): - (JSC::JSValue::makeInt32Fast): - (JSC::JSValue::areBothInt32Fast): - (JSC::JSFastMath::canDoFastBitwiseOperations): - (JSC::JSFastMath::equal): - (JSC::JSFastMath::notEqual): - (JSC::JSFastMath::andImmediateNumbers): - (JSC::JSFastMath::xorImmediateNumbers): - (JSC::JSFastMath::orImmediateNumbers): - (JSC::JSFastMath::canDoFastRshift): - (JSC::JSFastMath::canDoFastUrshift): - (JSC::JSFastMath::rightShiftImmediateNumbers): - (JSC::JSFastMath::canDoFastAdditiveOperations): - (JSC::JSFastMath::addImmediateNumbers): - (JSC::JSFastMath::subImmediateNumbers): - (JSC::JSFastMath::incImmediateNumber): - (JSC::JSFastMath::decImmediateNumber): - * runtime/JSNotAnObject.cpp: - (JSC::JSNotAnObject::toPrimitive): - (JSC::JSNotAnObject::getPrimitiveNumber): - (JSC::JSNotAnObject::put): - * runtime/JSNotAnObject.h: - (JSC::JSNotAnObject::createStructure): - * runtime/JSNumberCell.cpp: - (JSC::JSNumberCell::toPrimitive): - (JSC::JSNumberCell::getPrimitiveNumber): - (JSC::JSNumberCell::getJSNumber): - (JSC::jsNumberCell): - * runtime/JSNumberCell.h: - (JSC::JSNumberCell::createStructure): - (JSC::isNumberCell): - (JSC::asNumberCell): - (JSC::jsNumber): - (JSC::JSValue::isDoubleNumber): - (JSC::JSValue::getDoubleNumber): - (JSC::JSValue::isNumber): - (JSC::JSValue::uncheckedGetNumber): - (JSC::jsNaN): - (JSC::JSValue::toJSNumber): - (JSC::JSValue::getNumber): - (JSC::JSValue::numberToInt32): - (JSC::JSValue::numberToUInt32): - * runtime/JSObject.cpp: - (JSC::JSObject::mark): - (JSC::JSObject::put): - (JSC::JSObject::putWithAttributes): - (JSC::callDefaultValueFunction): - (JSC::JSObject::getPrimitiveNumber): - (JSC::JSObject::defaultValue): - (JSC::JSObject::defineGetter): - (JSC::JSObject::defineSetter): - (JSC::JSObject::lookupGetter): - (JSC::JSObject::lookupSetter): - (JSC::JSObject::hasInstance): - (JSC::JSObject::toNumber): - (JSC::JSObject::toString): - (JSC::JSObject::fillGetterPropertySlot): - * runtime/JSObject.h: - (JSC::JSObject::getDirect): - (JSC::JSObject::getDirectLocation): - (JSC::JSObject::offsetForLocation): - (JSC::JSObject::locationForOffset): - (JSC::JSObject::getDirectOffset): - (JSC::JSObject::putDirectOffset): - (JSC::JSObject::createStructure): - (JSC::asObject): - (JSC::JSObject::prototype): - (JSC::JSObject::setPrototype): - (JSC::JSValue::isObject): - (JSC::JSObject::inlineGetOwnPropertySlot): - (JSC::JSObject::getOwnPropertySlotForWrite): - (JSC::JSObject::getPropertySlot): - (JSC::JSObject::get): - (JSC::JSObject::putDirect): - (JSC::JSObject::putDirectWithoutTransition): - (JSC::JSObject::toPrimitive): - (JSC::JSValue::get): - (JSC::JSValue::put): - (JSC::JSObject::allocatePropertyStorageInline): - * runtime/JSPropertyNameIterator.cpp: - (JSC::JSPropertyNameIterator::toPrimitive): - (JSC::JSPropertyNameIterator::getPrimitiveNumber): - * runtime/JSPropertyNameIterator.h: - (JSC::JSPropertyNameIterator::create): - (JSC::JSPropertyNameIterator::next): - * runtime/JSStaticScopeObject.cpp: - (JSC::JSStaticScopeObject::put): - (JSC::JSStaticScopeObject::putWithAttributes): - * runtime/JSStaticScopeObject.h: - (JSC::JSStaticScopeObject::JSStaticScopeObject): - (JSC::JSStaticScopeObject::createStructure): - * runtime/JSString.cpp: - (JSC::JSString::toPrimitive): - (JSC::JSString::getPrimitiveNumber): - (JSC::JSString::getOwnPropertySlot): - * runtime/JSString.h: - (JSC::JSString::createStructure): - (JSC::asString): - (JSC::isJSString): - (JSC::JSValue::toThisJSString): - * runtime/JSValue.cpp: - (JSC::JSValue::toInteger): - (JSC::JSValue::toIntegerPreserveNaN): - * runtime/JSValue.h: - (JSC::JSValue::makeImmediate): - (JSC::JSValue::asValue): - (JSC::noValue): - (JSC::jsImpossibleValue): - (JSC::jsNull): - (JSC::jsUndefined): - (JSC::jsBoolean): - (JSC::operator==): - (JSC::operator!=): - (JSC::JSValue::encode): - (JSC::JSValue::decode): - (JSC::JSValue::JSValue): - (JSC::JSValue::operator bool): - (JSC::JSValue::operator==): - (JSC::JSValue::operator!=): - (JSC::JSValue::isUndefined): - (JSC::JSValue::isNull): - * runtime/JSVariableObject.h: - (JSC::JSVariableObject::symbolTablePut): - (JSC::JSVariableObject::symbolTablePutWithAttributes): - * runtime/JSWrapperObject.h: - (JSC::JSWrapperObject::internalValue): - (JSC::JSWrapperObject::setInternalValue): - * runtime/Lookup.cpp: - (JSC::setUpStaticFunctionSlot): - * runtime/Lookup.h: - (JSC::lookupPut): - * runtime/MathObject.cpp: - (JSC::mathProtoFuncAbs): - (JSC::mathProtoFuncACos): - (JSC::mathProtoFuncASin): - (JSC::mathProtoFuncATan): - (JSC::mathProtoFuncATan2): - (JSC::mathProtoFuncCeil): - (JSC::mathProtoFuncCos): - (JSC::mathProtoFuncExp): - (JSC::mathProtoFuncFloor): - (JSC::mathProtoFuncLog): - (JSC::mathProtoFuncMax): - (JSC::mathProtoFuncMin): - (JSC::mathProtoFuncPow): - (JSC::mathProtoFuncRandom): - (JSC::mathProtoFuncRound): - (JSC::mathProtoFuncSin): - (JSC::mathProtoFuncSqrt): - (JSC::mathProtoFuncTan): - * runtime/MathObject.h: - (JSC::MathObject::createStructure): - * runtime/NativeErrorConstructor.cpp: - (JSC::callNativeErrorConstructor): - * runtime/NumberConstructor.cpp: - (JSC::numberConstructorNaNValue): - (JSC::numberConstructorNegInfinity): - (JSC::numberConstructorPosInfinity): - (JSC::numberConstructorMaxValue): - (JSC::numberConstructorMinValue): - (JSC::callNumberConstructor): - * runtime/NumberConstructor.h: - (JSC::NumberConstructor::createStructure): - * runtime/NumberObject.cpp: - (JSC::NumberObject::getJSNumber): - (JSC::constructNumber): - * runtime/NumberObject.h: - * runtime/NumberPrototype.cpp: - (JSC::numberProtoFuncToString): - (JSC::numberProtoFuncToLocaleString): - (JSC::numberProtoFuncValueOf): - (JSC::numberProtoFuncToFixed): - (JSC::numberProtoFuncToExponential): - (JSC::numberProtoFuncToPrecision): - * runtime/ObjectConstructor.cpp: - (JSC::constructObject): - (JSC::callObjectConstructor): - * runtime/ObjectPrototype.cpp: - (JSC::objectProtoFuncValueOf): - (JSC::objectProtoFuncHasOwnProperty): - (JSC::objectProtoFuncIsPrototypeOf): - (JSC::objectProtoFuncDefineGetter): - (JSC::objectProtoFuncDefineSetter): - (JSC::objectProtoFuncLookupGetter): - (JSC::objectProtoFuncLookupSetter): - (JSC::objectProtoFuncPropertyIsEnumerable): - (JSC::objectProtoFuncToLocaleString): - (JSC::objectProtoFuncToString): - * runtime/ObjectPrototype.h: - * runtime/Operations.cpp: - (JSC::JSValue::equalSlowCase): - (JSC::JSValue::strictEqualSlowCase): - (JSC::throwOutOfMemoryError): - (JSC::jsAddSlowCase): - (JSC::jsTypeStringForValue): - (JSC::jsIsObjectType): - (JSC::jsIsFunctionType): - * runtime/Operations.h: - (JSC::JSValue::equal): - (JSC::JSValue::equalSlowCaseInline): - (JSC::JSValue::strictEqual): - (JSC::JSValue::strictEqualSlowCaseInline): - (JSC::jsLess): - (JSC::jsLessEq): - (JSC::jsAdd): - (JSC::countPrototypeChainEntriesAndCheckForProxies): - (JSC::resolveBase): - * runtime/PropertySlot.cpp: - (JSC::PropertySlot::functionGetter): - * runtime/PropertySlot.h: - (JSC::PropertySlot::PropertySlot): - (JSC::PropertySlot::getValue): - (JSC::PropertySlot::putValue): - (JSC::PropertySlot::setValueSlot): - (JSC::PropertySlot::setValue): - (JSC::PropertySlot::setCustom): - (JSC::PropertySlot::setCustomIndex): - (JSC::PropertySlot::slotBase): - (JSC::PropertySlot::setBase): - (JSC::PropertySlot::): - * runtime/Protect.h: - (JSC::gcProtect): - (JSC::gcUnprotect): - (JSC::ProtectedPtr::operator JSValue): - (JSC::ProtectedJSValue::ProtectedJSValue): - (JSC::ProtectedJSValue::get): - (JSC::ProtectedJSValue::operator JSValue): - (JSC::ProtectedJSValue::operator->): - (JSC::ProtectedJSValue::~ProtectedJSValue): - (JSC::ProtectedJSValue::operator=): - (JSC::operator==): - (JSC::operator!=): - * runtime/RegExpConstructor.cpp: - (JSC::RegExpConstructor::getBackref): - (JSC::RegExpConstructor::getLastParen): - (JSC::RegExpConstructor::getLeftContext): - (JSC::RegExpConstructor::getRightContext): - (JSC::regExpConstructorDollar1): - (JSC::regExpConstructorDollar2): - (JSC::regExpConstructorDollar3): - (JSC::regExpConstructorDollar4): - (JSC::regExpConstructorDollar5): - (JSC::regExpConstructorDollar6): - (JSC::regExpConstructorDollar7): - (JSC::regExpConstructorDollar8): - (JSC::regExpConstructorDollar9): - (JSC::regExpConstructorInput): - (JSC::regExpConstructorMultiline): - (JSC::regExpConstructorLastMatch): - (JSC::regExpConstructorLastParen): - (JSC::regExpConstructorLeftContext): - (JSC::regExpConstructorRightContext): - (JSC::RegExpConstructor::put): - (JSC::setRegExpConstructorInput): - (JSC::setRegExpConstructorMultiline): - (JSC::constructRegExp): - (JSC::callRegExpConstructor): - * runtime/RegExpConstructor.h: - (JSC::RegExpConstructor::createStructure): - (JSC::asRegExpConstructor): - * runtime/RegExpMatchesArray.h: - (JSC::RegExpMatchesArray::put): - * runtime/RegExpObject.cpp: - (JSC::regExpObjectGlobal): - (JSC::regExpObjectIgnoreCase): - (JSC::regExpObjectMultiline): - (JSC::regExpObjectSource): - (JSC::regExpObjectLastIndex): - (JSC::RegExpObject::put): - (JSC::setRegExpObjectLastIndex): - (JSC::RegExpObject::test): - (JSC::RegExpObject::exec): - (JSC::callRegExpObject): - * runtime/RegExpObject.h: - (JSC::RegExpObject::createStructure): - (JSC::asRegExpObject): - * runtime/RegExpPrototype.cpp: - (JSC::regExpProtoFuncTest): - (JSC::regExpProtoFuncExec): - (JSC::regExpProtoFuncCompile): - (JSC::regExpProtoFuncToString): - * runtime/StringConstructor.cpp: - (JSC::stringFromCharCodeSlowCase): - (JSC::stringFromCharCode): - (JSC::callStringConstructor): - * runtime/StringObject.cpp: - (JSC::StringObject::put): - * runtime/StringObject.h: - (JSC::StringObject::createStructure): - (JSC::asStringObject): - * runtime/StringObjectThatMasqueradesAsUndefined.h: - (JSC::StringObjectThatMasqueradesAsUndefined::createStructure): - * runtime/StringPrototype.cpp: - (JSC::stringProtoFuncReplace): - (JSC::stringProtoFuncToString): - (JSC::stringProtoFuncCharAt): - (JSC::stringProtoFuncCharCodeAt): - (JSC::stringProtoFuncConcat): - (JSC::stringProtoFuncIndexOf): - (JSC::stringProtoFuncLastIndexOf): - (JSC::stringProtoFuncMatch): - (JSC::stringProtoFuncSearch): - (JSC::stringProtoFuncSlice): - (JSC::stringProtoFuncSplit): - (JSC::stringProtoFuncSubstr): - (JSC::stringProtoFuncSubstring): - (JSC::stringProtoFuncToLowerCase): - (JSC::stringProtoFuncToUpperCase): - (JSC::stringProtoFuncLocaleCompare): - (JSC::stringProtoFuncBig): - (JSC::stringProtoFuncSmall): - (JSC::stringProtoFuncBlink): - (JSC::stringProtoFuncBold): - (JSC::stringProtoFuncFixed): - (JSC::stringProtoFuncItalics): - (JSC::stringProtoFuncStrike): - (JSC::stringProtoFuncSub): - (JSC::stringProtoFuncSup): - (JSC::stringProtoFuncFontcolor): - (JSC::stringProtoFuncFontsize): - (JSC::stringProtoFuncAnchor): - (JSC::stringProtoFuncLink): - * runtime/Structure.cpp: - (JSC::Structure::Structure): - (JSC::Structure::changePrototypeTransition): - * runtime/Structure.h: - (JSC::Structure::create): - (JSC::Structure::setPrototypeWithoutTransition): - (JSC::Structure::storedPrototype): -2009-05-01 Geoffrey Garen <ggaren@apple.com> +2009-06-23 Geoffrey Garen <ggaren@apple.com> - Reviewed by Sam "That doesn't look like what I thought it looks like" Weinig. + Reviewed by Sam Weinig. - Beefed up the JSValuePtr class and removed some non-JSValuePtr dependencies - on JSImmediate, in prepapration for making JSImmediate an implementation - detail of JSValuePtr. + Removed some result register tracking cruft in preparation for a new + result tracking mechanism. SunSpider reports no change. - * interpreter/Interpreter.cpp: - (JSC::Interpreter::privateExecute): - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - * jit/JITArithmetic.cpp: - (JSC::JIT::compileFastArith_op_mod): - * runtime/JSGlobalObjectFunctions.cpp: - (JSC::globalFuncParseInt): Updated for interface changes. - - * runtime/JSImmediate.h: - (JSC::JSValuePtr::JSValuePtr): - * runtime/JSValue.h: - (JSC::JSValuePtr::): - (JSC::jsImpossibleValue): - (JSC::jsNull): - (JSC::jsUndefined): - (JSC::jsBoolean): - (JSC::JSValuePtr::encode): - (JSC::JSValuePtr::decode): - (JSC::JSValuePtr::JSValuePtr): - (JSC::JSValuePtr::operator bool): - (JSC::JSValuePtr::operator==): - (JSC::JSValuePtr::operator!=): - (JSC::JSValuePtr::isUndefined): - (JSC::JSValuePtr::isNull): Changed jsImpossibleValue(), jsNull(), - jsUndefined(), and jsBoolean() to operate in terms of JSValuePtr instead - of JSImmediate. - - * wtf/StdLibExtras.h: - (WTF::bitwise_cast): Fixed up for clarity. - -2009-04-30 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. - - Bug fix for rdar:/6845379. If a case-insensitive regex contains - a character class containing a range with an upper bound of \uFFFF - the parser will infinite-loop whist adding other-case characters - for characters in the range that do have another case. - - * yarr/RegexCompiler.cpp: - (JSC::Yarr::CharacterClassConstructor::putRange): - -2009-04-30 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - OPCODE_SAMPLING without CODEBLOCK_SAMPLING is currently broken, - since SamplingTool::Sample::isNull() checks the m_codeBlock - member (which is always null without CODEBLOCK_SAMPLING). - - Restructure the checks so make this work again. - - * bytecode/SamplingTool.cpp: - (JSC::SamplingTool::doRun): - * bytecode/SamplingTool.h: - (JSC::SamplingTool::Sample::isNull): - -2009-04-30 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Gavin Barraclough. - - - Concatenate final three strings in simple replace case at one go - - ~0.2% SunSpider speedup - - * runtime/StringPrototype.cpp: - (JSC::stringProtoFuncReplace): Use new replaceRange helper instead of - taking substrings and concatenating three strings. - * runtime/UString.cpp: - (JSC::UString::replaceRange): New helper function. - * runtime/UString.h: - -2009-04-30 Geoffrey Garen <ggaren@apple.com> - - Rubber Stamped by Gavin Barraclough. - - Changed JSValueEncodedAsPtr* => EncodedJSValuePtr to support a non-pointer - encoding for JSValuePtrs. + * assembler/AbstractMacroAssembler.h: + * assembler/X86Assembler.h: + (JSC::X86Assembler::JmpDst::JmpDst): No need to track jump targets in + machine code; we already do this in bytecode. - * API/APICast.h: - (toJS): - * bytecompiler/BytecodeGenerator.h: - (JSC::BytecodeGenerator::JSValueHashTraits::constructDeletedValue): - (JSC::BytecodeGenerator::JSValueHashTraits::isDeletedValue): - * interpreter/Register.h: - (JSC::Register::): * jit/JIT.cpp: - (JSC::): - * jit/JIT.h: - * jit/JITCode.h: - (JSC::): - * jit/JITStubs.cpp: - (JSC::JITStubs::cti_op_add): - (JSC::JITStubs::cti_op_pre_inc): - (JSC::JITStubs::cti_op_get_by_id_generic): - (JSC::JITStubs::cti_op_get_by_id): - (JSC::JITStubs::cti_op_get_by_id_second): - (JSC::JITStubs::cti_op_get_by_id_self_fail): - (JSC::JITStubs::cti_op_get_by_id_proto_list): - (JSC::JITStubs::cti_op_get_by_id_proto_list_full): - (JSC::JITStubs::cti_op_get_by_id_proto_fail): - (JSC::JITStubs::cti_op_get_by_id_array_fail): - (JSC::JITStubs::cti_op_get_by_id_string_fail): - (JSC::JITStubs::cti_op_instanceof): - (JSC::JITStubs::cti_op_del_by_id): - (JSC::JITStubs::cti_op_mul): - (JSC::JITStubs::cti_op_call_NotJSFunction): - (JSC::JITStubs::cti_op_resolve): - (JSC::JITStubs::cti_op_construct_NotJSConstruct): - (JSC::JITStubs::cti_op_get_by_val): - (JSC::JITStubs::cti_op_get_by_val_string): - (JSC::JITStubs::cti_op_get_by_val_byte_array): - (JSC::JITStubs::cti_op_sub): - (JSC::JITStubs::cti_op_lesseq): - (JSC::JITStubs::cti_op_negate): - (JSC::JITStubs::cti_op_resolve_base): - (JSC::JITStubs::cti_op_resolve_skip): - (JSC::JITStubs::cti_op_resolve_global): - (JSC::JITStubs::cti_op_div): - (JSC::JITStubs::cti_op_pre_dec): - (JSC::JITStubs::cti_op_not): - (JSC::JITStubs::cti_op_eq): - (JSC::JITStubs::cti_op_lshift): - (JSC::JITStubs::cti_op_bitand): - (JSC::JITStubs::cti_op_rshift): - (JSC::JITStubs::cti_op_bitnot): - (JSC::JITStubs::cti_op_mod): - (JSC::JITStubs::cti_op_less): - (JSC::JITStubs::cti_op_neq): - (JSC::JITStubs::cti_op_urshift): - (JSC::JITStubs::cti_op_bitxor): - (JSC::JITStubs::cti_op_bitor): - (JSC::JITStubs::cti_op_call_eval): - (JSC::JITStubs::cti_op_throw): - (JSC::JITStubs::cti_op_next_pname): - (JSC::JITStubs::cti_op_typeof): - (JSC::JITStubs::cti_op_is_undefined): - (JSC::JITStubs::cti_op_is_boolean): - (JSC::JITStubs::cti_op_is_number): - (JSC::JITStubs::cti_op_is_string): - (JSC::JITStubs::cti_op_is_object): - (JSC::JITStubs::cti_op_is_function): - (JSC::JITStubs::cti_op_stricteq): - (JSC::JITStubs::cti_op_nstricteq): - (JSC::JITStubs::cti_op_to_jsnumber): - (JSC::JITStubs::cti_op_in): - (JSC::JITStubs::cti_op_del_by_val): - (JSC::JITStubs::cti_vm_throw): - * jit/JITStubs.h: - * runtime/JSValue.h: - (JSC::JSValuePtr::encode): - (JSC::JSValuePtr::decode): - -2009-04-30 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver "Abandon Ship!" Hunt. - - Fix a leak in Yarr. - - All Disjunctions should be recorded in RegexPattern::m_disjunctions, - so that they can be freed at the end of compilation - copyDisjunction - is failing to do so. - - * yarr/RegexCompiler.cpp: - (JSC::Yarr::RegexPatternConstructor::copyDisjunction): - -2009-04-30 Oliver Hunt <oliver@apple.com> - - Reviewed by Gavin Barraclough. - - Add function to CallFrame for dumping the current JS caller - - Added debug only method CallFrame::dumpCaller() that provide the call location - of the deepest currently executing JS function. - - * interpreter/CallFrame.cpp: - (JSC::CallFrame::dumpCaller): - * interpreter/CallFrame.h: - -2009-04-30 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Geoff Garen. - - - make BaseStrings have themselves as a base, instead of nothing, to remove common branches - - ~0.7% SunSpider speedup - - * runtime/UString.h: - (JSC::UString::Rep::Rep): For the constructor without a base, set self as base instead of null. - (JSC::UString::Rep::baseString): Just read m_baseString - no more branching. - -2009-04-30 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Two quick improvements to SamplingFlags mechanism. - - SamplingFlags::ScopedFlag class to provide support for automagically - clearing a flag as it goes out of scope, and add a little more detail - to the output generated by the tool. - - * bytecode/SamplingTool.cpp: - (JSC::SamplingFlags::stop): - * bytecode/SamplingTool.h: - (JSC::SamplingFlags::ScopedFlag::ScopedFlag): - (JSC::SamplingFlags::ScopedFlag::~ScopedFlag): - -2009-04-30 Adam Roben <aroben@apple.com> - - Restore build event steps that were truncated in r43082 - - Rubber-stamped by Steve Falkenburg. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreCommon.vsprops: - * JavaScriptCore.vcproj/jsc/jscCommon.vsprops: - * JavaScriptCore.vcproj/testapi/testapiCommon.vsprops: - Re-copied the command lines for the build events from the pre-r43082 - .vcproj files. - - * JavaScriptCore.vcproj/jsc/jsc.vcproj: Removed an unnecessary - attribute. - -2009-04-30 Adam Roben <aroben@apple.com> - - Move settings from .vcproj files to .vsprops files within the - JavaScriptCore directory - - Moving the settings to a .vsprops file means that we will only have to - change a single setting to affect all configurations, instead of one - setting per configuration. - - Reviewed by Steve Falkenburg. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - * JavaScriptCore.vcproj/jsc/jsc.vcproj: - * JavaScriptCore.vcproj/testapi/testapi.vcproj: - Moved settings from these files to the new .vsprops files. Note that - testapi.vcproj had a lot of overrides of default settings that were - the same as the defaults, which I've removed. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreCommon.vsprops: Added. - * JavaScriptCore.vcproj/WTF/WTFCommon.vsprops: Added. - * JavaScriptCore.vcproj/jsc/jscCommon.vsprops: Added. - * JavaScriptCore.vcproj/testapi/testapiCommon.vsprops: Added. - -2009-04-30 Dimitri Glazkov <dglazkov@chromium.org> - - Reviewed by Timothy Hatcher. - - https://bugs.webkit.org/show_bug.cgi?id=25470 - Extend the cover of ENABLE_JAVASCRIPT_DEBUGGER to profiler. - - * Configurations/FeatureDefines.xcconfig: Added ENABLE_JAVASCRIPT_DEBUGGER define. - -2009-04-30 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Alexey Proskuryakov. - - - speed up string concatenation by reorganizing some simple cases - - 0.7% SunSpider speedup - - * runtime/UString.cpp: - (JSC::concatenate): Put fast case for appending a single character - before the empty string special cases; streamline code a bit to - delay computing values that are not needed in the fast path. - -2009-04-30 Gavin Barraclough <barraclough@apple.com> + (JSC::JIT::JIT): + (JSC::JIT::emitTimeoutCheck): Make sure to save and restore the result + registers, so an opcode with a timeout check can still benefit from result + register caching. - Reviewed by Maciej Stachowiak. + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): Removed calls to killLastResultRegister() + in preparation for something new. - Add SamplingFlags mechanism. + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_jnless): + (JSC::JIT::emit_op_jnlesseq): + * jit/JITInlineMethods.h: + (JSC::JIT::emitGetFromCallFrameHeaderPtr): + (JSC::JIT::emitGetFromCallFrameHeader32): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_jmp): + (JSC::JIT::emit_op_jfalse): + (JSC::JIT::emit_op_jtrue): + (JSC::JIT::emit_op_jeq_null): + (JSC::JIT::emit_op_jneq_null): + (JSC::JIT::emit_op_jneq_ptr): + (JSC::JIT::emit_op_jsr): + (JSC::JIT::emit_op_sret): + (JSC::JIT::emit_op_jmp_scopes): ditto - This mechanism allows fine-grained JSC and JavaScript program aware - performance measurement. The mechanism provides a set of 32 flags, - numbered #1..#32. Flag #16 is initially set, and all other flags - are cleared. Flags may be set and cleared from within + * jit/JITStubCall.h: + (JSC::JITStubCall::JITStubCall): + (JSC::JITStubCall::getArgument): added a mechanism for reloading an argument + you passed to a JIT stub, for use in emitTimeoutCheck. - Enable by setting ENABLE_SAMPLING_FLAGS to 1 in wtf/Platform.h. - Disabled by default, no performance impact. Flags may be modified - by calling SamplingFlags::setFlag() and SamplingFlags::clearFlag() - from within JSC implementation, or by calling setSamplingFlag() and - clearSamplingFlag() from JavaScript. +2009-06-23 Sam Weinig <sam@webkit.org> - The flags are sampled with a frequency of 10000Hz, and the highest - set flag in recorded, allowing multiple events to be measured (with - the highest flag number representing the highest priority). + Reviewed by Geoffrey Garen. - Disabled by default; no performance impact. + Remove now-useless inplace variants of binary ops. - * JavaScriptCore.exp: - * bytecode/SamplingTool.cpp: - (JSC::SamplingFlags::sample): - (JSC::SamplingFlags::start): - (JSC::SamplingFlags::stop): - (JSC::SamplingThread::threadStartFunc): - (JSC::SamplingThread::start): - (JSC::SamplingThread::stop): - (JSC::ScopeSampleRecord::sample): - (JSC::SamplingTool::doRun): - (JSC::SamplingTool::sample): - (JSC::SamplingTool::start): - (JSC::SamplingTool::stop): - * bytecode/SamplingTool.h: - (JSC::SamplingFlags::setFlag): - (JSC::SamplingFlags::clearFlag): - (JSC::SamplingTool::SamplingTool): - * jsc.cpp: - (GlobalObject::GlobalObject): - (functionSetSamplingFlag): - (functionClearSamplingFlag): - (runWithScripts): - * wtf/Platform.h: + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_bitand): + (JSC::JIT::emit_op_bitor): + (JSC::JIT::emit_op_bitxor): + (JSC::JIT::emit_op_add): + (JSC::JIT::emit_op_sub): + (JSC::JIT::emit_op_mul): -2009-04-29 Sam Weinig <sam@webkit.org> +2009-06-23 Sam Weinig <sam@webkit.org> - Another attempt to fix the windows build. + Reviewed by Geoffrey Garen. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + Move off memory operands to aid in re-enabling result caching. -2009-04-29 Sam Weinig <sam@webkit.org> + - No regression measured. - Try and fix the windows build. + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_negate): + (JSC::JIT::emit_op_jnless): + (JSC::JIT::emit_op_jnlesseq): + (JSC::JIT::emit_op_lshift): + (JSC::JIT::emit_op_rshift): + (JSC::JIT::emit_op_bitand): + (JSC::JIT::emitBitAnd32Constant): + (JSC::JIT::emitBitAnd32InPlace): + (JSC::JIT::emit_op_bitor): + (JSC::JIT::emitBitOr32Constant): + (JSC::JIT::emitBitOr32InPlace): + (JSC::JIT::emit_op_bitxor): + (JSC::JIT::emitBitXor32Constant): + (JSC::JIT::emitBitXor32InPlace): + (JSC::JIT::emit_op_bitnot): + (JSC::JIT::emit_op_post_inc): + (JSC::JIT::emit_op_post_dec): + (JSC::JIT::emit_op_pre_inc): + (JSC::JIT::emitSlow_op_pre_inc): + (JSC::JIT::emit_op_pre_dec): + (JSC::JIT::emitSlow_op_pre_dec): + (JSC::JIT::emit_op_add): + (JSC::JIT::emitAdd32Constant): + (JSC::JIT::emitAdd32InPlace): + (JSC::JIT::emitSlow_op_add): + (JSC::JIT::emitSlowAdd32Constant): + (JSC::JIT::emit_op_sub): + (JSC::JIT::emitSlow_op_sub): + (JSC::JIT::emitSub32ConstantLeft): + (JSC::JIT::emitSub32ConstantRight): + (JSC::JIT::emitSub32InPlaceLeft): + (JSC::JIT::emitSub32InPlaceRight): + (JSC::JIT::emitBinaryDoubleOp): + (JSC::JIT::emit_op_mul): + (JSC::JIT::emitMul32InPlace): + (JSC::JIT::emit_op_div): + (JSC::JIT::emit_op_mod): + * jit/JITCall.cpp: + (JSC::JIT::compileOpCallVarargs): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_loop_if_less): + (JSC::JIT::emit_op_loop_if_lesseq): + (JSC::JIT::emit_op_instanceof): + (JSC::JIT::emit_op_to_primitive): + (JSC::JIT::emit_op_not): + (JSC::JIT::emit_op_jneq_ptr): + (JSC::JIT::emit_op_eq): + (JSC::JIT::emit_op_neq): + (JSC::JIT::emit_op_to_jsnumber): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emit_op_get_by_val): + (JSC::JIT::emit_op_put_by_val): - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: +2009-06-23 Geoffrey Garen <ggaren@apple.com> -2009-04-29 Gavin Barraclough <barraclough@apple.com> + Reviewed by Sam Weinig. + + Fixed some missing and/or misplaced labels in bytecode generation, so + we don't have to work around them in JIT code generation. - Reviewed by Oliver "Peg-Leg" Hunt. + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitJumpSubroutine): + * parser/Nodes.cpp: + (JSC::TryNode::emitBytecode): - Coallesce input checking and reduce futzing with the index position - between alternatives and iterations of the main loop of a regex, - when run in YARR. +2009-06-22 Geoffrey Garen <ggaren@apple.com> - Consider the following regex: /foo|bar/ + Reviewed by Sam Weinig. - Prior to this patch, this will be implemented something like this pseudo-code description: + For member function calls, emit "this" directly into the "this" slot + for the function call, instead of moving it there later. This reduces + time spent in op_mov during certain calls, like "a.b.c()". - loop: - check_for_available_input(3) // this increments the index by 3, for the first alterantive. - if (available) { test "foo" } - decrement_index(3) - check_for_available_input(3) // this increments the index by 3, for the second alterantive. - if (available) { test "bar" } - decrement_index(3) - check_for_available_input(1) // can we loop again? - if (available) { goto loop } - - With these changes it will look more like this: - - check_for_available_input(3) // this increments the index by 3, for the first alterantive. - if (!available) { goto fail } - loop: - test "foo" - test "bar" - check_for_available_input(1) // can we loop again? - if (available) { goto loop } - fail: - - - This gives about a 5% gain on v8-regex, no change on Sunspider. - - * yarr/RegexJIT.cpp: - (JSC::Yarr::RegexGenerator::TermGenerationState::linkAlternativeBacktracksTo): - (JSC::Yarr::RegexGenerator::generateDisjunction): + 1%-2% speedup on v8, mostly richards and delta-blue. -2009-04-29 Oliver Hunt <oliver@apple.com> - - Reviewed by Gavin Barraclough. - - Clean up ArgList to be a trivial type - - Separate out old ArgList logic to handle buffering and marking arguments - into a distinct MarkedArgumentBuffer type. ArgList becomes a trivial - struct of a pointer and length. - - * API/JSObjectRef.cpp: - (JSObjectMakeFunction): - (JSObjectMakeArray): - (JSObjectMakeDate): - (JSObjectMakeError): - (JSObjectMakeRegExp): - (JSObjectCallAsFunction): - (JSObjectCallAsConstructor): - * JavaScriptCore.exp: - * interpreter/CallFrame.h: - (JSC::ExecState::emptyList): - * runtime/ArgList.cpp: - (JSC::ArgList::getSlice): - (JSC::MarkedArgumentBuffer::markLists): - (JSC::MarkedArgumentBuffer::slowAppend): - * runtime/ArgList.h: - (JSC::MarkedArgumentBuffer::MarkedArgumentBuffer): - (JSC::MarkedArgumentBuffer::~MarkedArgumentBuffer): - (JSC::ArgList::ArgList): - (JSC::ArgList::at): - (JSC::ArgList::isEmpty): - (JSC::ArgList::size): - (JSC::ArgList::begin): - (JSC::ArgList::end): - * runtime/Arguments.cpp: - (JSC::Arguments::fillArgList): - * runtime/Arguments.h: - * runtime/ArrayPrototype.cpp: - (JSC::arrayProtoFuncConcat): - (JSC::arrayProtoFuncPush): - (JSC::arrayProtoFuncSort): - (JSC::arrayProtoFuncFilter): - (JSC::arrayProtoFuncMap): - (JSC::arrayProtoFuncEvery): - (JSC::arrayProtoFuncForEach): - (JSC::arrayProtoFuncSome): - (JSC::arrayProtoFuncReduce): - (JSC::arrayProtoFuncReduceRight): - * runtime/Collector.cpp: - (JSC::Heap::collect): - * runtime/Collector.h: - (JSC::Heap::markListSet): - * runtime/CommonIdentifiers.h: - * runtime/Error.cpp: - (JSC::Error::create): - * runtime/FunctionPrototype.cpp: - (JSC::functionProtoFuncApply): - * runtime/JSArray.cpp: - (JSC::JSArray::JSArray): - (JSC::AVLTreeAbstractorForArrayCompare::compare_key_key): - (JSC::JSArray::fillArgList): - (JSC::constructArray): - * runtime/JSArray.h: - * runtime/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): - * runtime/JSGlobalData.h: - * runtime/JSObject.cpp: - (JSC::JSObject::put): - * runtime/StringConstructor.cpp: - (JSC::stringFromCharCodeSlowCase): - * runtime/StringPrototype.cpp: - (JSC::stringProtoFuncReplace): - (JSC::stringProtoFuncConcat): - (JSC::stringProtoFuncMatch): + * parser/Nodes.cpp: + (JSC::FunctionCallDotNode::emitBytecode): -2009-04-29 Laszlo Gombos <laszlo.1.gombos@nokia.com> +2009-06-22 Gavin Barraclough <barraclough@apple.com> Reviewed by Sam Weinig. - https://bugs.webkit.org/show_bug.cgi?id=25334 - - Fix Qt build when ENABLE_JIT is explicitly set to 1 - to overrule defaults. - - * JavaScriptCore.pri: - -2009-04-29 Oliver Hunt <oliver@apple.com> - - Reviewed by Steve Falkenburg. - - Crash in profiler due to incorrect assuming displayName would be a string. - - Fixed by adding a type guard. + Remove 'arguments' field from Register union. Having JSCell derived types in the union is + dangerous since it opens the possibility for the field to be written as a raw pointer but + then read as a JSValue. This will lead to statle data being read for the tag, which may + be dangerous. Having removed Arguments* types form Register, all arguments objects must + always explicitly be stored in the register file as JSValues. - * runtime/InternalFunction.cpp: - (JSC::InternalFunction::displayName): - -2009-04-28 Geoffrey Garen <ggaren@apple.com> - - Rubber stamped by Beth Dakin. - - Removed scaffolding supporting dynamically converting between 32bit and - 64bit value representations. - - * API/JSCallbackConstructor.cpp: - (JSC::constructJSCallback): - * API/JSCallbackFunction.cpp: - (JSC::JSCallbackFunction::call): - * API/JSCallbackObjectFunctions.h: - (JSC::::construct): - (JSC::::call): - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::dump): - * bytecode/CodeBlock.h: - (JSC::CodeBlock::getConstant): - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::emitEqualityOp): - * interpreter/CallFrame.cpp: - (JSC::CallFrame::thisValue): + * interpreter/CallFrame.h: + (JSC::ExecState::optionalCalleeArguments): * interpreter/Interpreter.cpp: - (JSC::Interpreter::callEval): - (JSC::Interpreter::throwException): - (JSC::Interpreter::createExceptionScope): + (JSC::Interpreter::unwindCallFrame): (JSC::Interpreter::privateExecute): (JSC::Interpreter::retrieveArguments): * interpreter/Register.h: (JSC::Register::): - (JSC::Register::Register): - (JSC::Register::jsValue): - (JSC::Register::marked): - (JSC::Register::mark): - (JSC::Register::i): - (JSC::Register::activation): - (JSC::Register::arguments): - (JSC::Register::callFrame): - (JSC::Register::codeBlock): - (JSC::Register::function): - (JSC::Register::propertyNameIterator): - (JSC::Register::scopeChain): - (JSC::Register::vPC): - * jit/JITStubs.cpp: - (JSC::JITStubs::cti_op_call_NotJSFunction): - (JSC::JITStubs::cti_op_load_varargs): - (JSC::JITStubs::cti_op_call_eval): - * jsc.cpp: - (functionPrint): - (functionDebug): - (functionRun): - (functionLoad): - * runtime/ArgList.h: - (JSC::ArgList::at): - * runtime/Arguments.cpp: - (JSC::Arguments::copyToRegisters): - (JSC::Arguments::fillArgList): - (JSC::Arguments::getOwnPropertySlot): - * runtime/ArrayConstructor.cpp: - (JSC::constructArrayWithSizeQuirk): - * runtime/ArrayPrototype.cpp: - (JSC::arrayProtoFuncJoin): - (JSC::arrayProtoFuncConcat): - (JSC::arrayProtoFuncPush): - (JSC::arrayProtoFuncSlice): - (JSC::arrayProtoFuncSort): - (JSC::arrayProtoFuncSplice): - (JSC::arrayProtoFuncUnShift): - (JSC::arrayProtoFuncFilter): - (JSC::arrayProtoFuncMap): - (JSC::arrayProtoFuncEvery): - (JSC::arrayProtoFuncForEach): - (JSC::arrayProtoFuncSome): - (JSC::arrayProtoFuncReduce): - (JSC::arrayProtoFuncReduceRight): - (JSC::arrayProtoFuncIndexOf): - (JSC::arrayProtoFuncLastIndexOf): - * runtime/BooleanConstructor.cpp: - (JSC::constructBoolean): - (JSC::callBooleanConstructor): - * runtime/DateConstructor.cpp: - (JSC::constructDate): - (JSC::dateParse): - (JSC::dateUTC): - * runtime/DatePrototype.cpp: - (JSC::formatLocaleDate): - (JSC::fillStructuresUsingTimeArgs): - (JSC::fillStructuresUsingDateArgs): - (JSC::dateProtoFuncSetTime): - (JSC::dateProtoFuncSetYear): - * runtime/ErrorConstructor.cpp: - (JSC::constructError): - * runtime/FunctionConstructor.cpp: - (JSC::constructFunction): - * runtime/FunctionPrototype.cpp: - (JSC::functionProtoFuncApply): - (JSC::functionProtoFuncCall): - * runtime/JSArray.cpp: - (JSC::JSArray::JSArray): - (JSC::constructArray): - * runtime/JSArray.h: - * runtime/JSGlobalObjectFunctions.cpp: - (JSC::encode): - (JSC::decode): - (JSC::globalFuncEval): - (JSC::globalFuncParseInt): - (JSC::globalFuncParseFloat): - (JSC::globalFuncIsNaN): - (JSC::globalFuncIsFinite): - (JSC::globalFuncEscape): - (JSC::globalFuncUnescape): - (JSC::globalFuncJSCPrint): - * runtime/MathObject.cpp: - (JSC::mathProtoFuncAbs): - (JSC::mathProtoFuncACos): - (JSC::mathProtoFuncASin): - (JSC::mathProtoFuncATan): - (JSC::mathProtoFuncATan2): - (JSC::mathProtoFuncCeil): - (JSC::mathProtoFuncCos): - (JSC::mathProtoFuncExp): - (JSC::mathProtoFuncFloor): - (JSC::mathProtoFuncLog): - (JSC::mathProtoFuncMax): - (JSC::mathProtoFuncMin): - (JSC::mathProtoFuncPow): - (JSC::mathProtoFuncRound): - (JSC::mathProtoFuncSin): - (JSC::mathProtoFuncSqrt): - (JSC::mathProtoFuncTan): - * runtime/NativeErrorConstructor.cpp: - (JSC::NativeErrorConstructor::construct): - * runtime/NumberConstructor.cpp: - (JSC::constructWithNumberConstructor): - (JSC::callNumberConstructor): - * runtime/NumberPrototype.cpp: - (JSC::numberProtoFuncToString): - (JSC::numberProtoFuncToFixed): - (JSC::numberProtoFuncToExponential): - (JSC::numberProtoFuncToPrecision): - * runtime/ObjectConstructor.cpp: - (JSC::constructObject): - * runtime/ObjectPrototype.cpp: - (JSC::objectProtoFuncHasOwnProperty): - (JSC::objectProtoFuncIsPrototypeOf): - (JSC::objectProtoFuncDefineGetter): - (JSC::objectProtoFuncDefineSetter): - (JSC::objectProtoFuncLookupGetter): - (JSC::objectProtoFuncLookupSetter): - (JSC::objectProtoFuncPropertyIsEnumerable): - * runtime/PropertySlot.h: - (JSC::PropertySlot::getValue): - * runtime/RegExpConstructor.cpp: - (JSC::constructRegExp): - * runtime/RegExpObject.cpp: - (JSC::RegExpObject::match): - * runtime/RegExpPrototype.cpp: - (JSC::regExpProtoFuncCompile): - * runtime/StringConstructor.cpp: - (JSC::stringFromCharCodeSlowCase): - (JSC::stringFromCharCode): - (JSC::constructWithStringConstructor): - (JSC::callStringConstructor): - * runtime/StringPrototype.cpp: - (JSC::stringProtoFuncReplace): - (JSC::stringProtoFuncCharAt): - (JSC::stringProtoFuncCharCodeAt): - (JSC::stringProtoFuncConcat): - (JSC::stringProtoFuncIndexOf): - (JSC::stringProtoFuncLastIndexOf): - (JSC::stringProtoFuncMatch): - (JSC::stringProtoFuncSearch): - (JSC::stringProtoFuncSlice): - (JSC::stringProtoFuncSplit): - (JSC::stringProtoFuncSubstr): - (JSC::stringProtoFuncSubstring): - (JSC::stringProtoFuncLocaleCompare): - (JSC::stringProtoFuncFontcolor): - (JSC::stringProtoFuncFontsize): - (JSC::stringProtoFuncAnchor): - (JSC::stringProtoFuncLink): - -2009-04-28 David Kilzer <ddkilzer@apple.com> - - A little more hardening for UString - - Reviewed by Maciej Stachowiak. - - Revised fix for <rdar://problem/5861045> in r42644. - - * runtime/UString.cpp: - (JSC::newCapacityWithOverflowCheck): Added. - (JSC::concatenate): Used newCapacityWithOverflowCheck(). - (JSC::UString::append): Ditto. - -2009-04-28 Oliver Hunt <oliver@apple.com> - - Reviewed by Gavin Barraclough. - - Bring back r42969, this time with correct codegen - - Add logic to the codegen for right shift to avoid jumping to a helper function - when shifting a small floating point value. - - * jit/JITArithmetic.cpp: - (isSSE2Present): - (JSC::JIT::compileFastArith_op_rshift): - (JSC::JIT::compileFastArithSlow_op_rshift): - -2009-04-28 Kevin Ollivier <kevino@theolliviers.com> - - wxMSW build fix. Switch JSCore build back to static. - - * API/JSBase.h: - * config.h: - * jscore.bkl: - -2009-04-28 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (Build fix). - - Roll out r42969, due to hangs in build bot. - - * jit/JITArithmetic.cpp: - (JSC::JIT::compileFastArith_op_rshift): - (JSC::JIT::compileFastArithSlow_op_rshift): - (JSC::isSSE2Present): - -2009-04-28 Xan Lopez <xlopez@igalia.com> - - Unreviewed: fix distcheck build, add (even more) missing files to list. - - * GNUmakefile.am: - -2009-04-28 Oliver Hunt <oliver@apple.com> - - Reviewed by Geoff Garen. - - Improve performance of string indexing - - Add a cti_get_by_val_string function to specialise indexing into a string object. - This gives us a slight performance win on a number of string tests. - * jit/JITStubs.cpp: - (JSC::JITStubs::cti_op_get_by_val): - (JSC::JITStubs::cti_op_get_by_val_string): - * jit/JITStubs.h: - -2009-04-28 Oliver Hunt <oliver@apple.com> - - Reviewed by Geoff Garen. - - Improve performance of right shifts of large or otherwise floating point values. - - Add logic to the codegen for right shift to avoid jumping to a helper function - when shifting a small floating point value. - - * jit/JITArithmetic.cpp: - (isSSE2Present): Moved to the head of file. - (JSC::JIT::compileFastArith_op_rshift): - (JSC::JIT::compileFastArithSlow_op_rshift): - -2009-04-28 Xan Lopez <xlopez@igalia.com> - - Unreviewed: fix distcheck build, add (more) missing files to list. - - * GNUmakefile.am: - -2009-04-28 Xan Lopez <xlopez@igalia.com> - - Unreviewed: fix distcheck build, add missing header to file list. - - * GNUmakefile.am: - -2009-04-28 Gavin Barraclough <barraclough@apple.com> - - Rubber stamped by Maciej "Henry Morgan" Stachowiak. - - Enable YARR. - (Again.) - - * wtf/Platform.h: - -2009-04-27 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Maciej Stachowiak. - - Tweak a loop condition to keep GCC happy, - some GCCs seem to be having issues with this. :-/ - - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::breakTarget): - * wtf/Platform.h: - -2009-04-27 Adam Roben <aroben@apple.com> - - Windows Debug build fix - - Not sure why the buildbots weren't affected by this problem. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Let VS - re-order the file list, and added JavaScriptCore[_debug].def to the - project. This was not necessary for the fix, but made making the fix - easier. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - Removed a function that no longer exists. - -2009-04-26 Gavin Barraclough <barraclough@apple.com> + (JSC::JITStubs::cti_op_tear_off_arguments): + * runtime/Arguments.h: + (JSC::JSActivation::copyRegisters): + * runtime/JSActivation.cpp: + (JSC::JSActivation::argumentsGetter): + * runtime/JSActivation.h: - Reviewed by Weinig Sam. +2009-06-03 Sam Weinig <sam@webkit.org> - Fix for https://bugs.webkit.org/show_bug.cgi?id=25416 - "Cached prototype accesses unsafely hoist property storage load above structure checks." - - Do not hoist the load of the pointer to the property storage array. + Reviewed by Geoffrey Garen. - No performance impact. + Add back known this value optimization by abstracting + slow case if not JSCell jumps. + * jit/JIT.h: + * jit/JITCall.cpp: + (JSC::JIT::compileOpCallVarargs): + (JSC::JIT::compileOpCallVarargsSlowCase): + (JSC::JIT::compileOpCall): + (JSC::JIT::compileOpCallSlowCase): + * jit/JITInlineMethods.h: + (JSC::JIT::emitJumpSlowCaseIfNotJSCell): + (JSC::JIT::linkSlowCaseIfNotJSCell): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_instanceof): + (JSC::JIT::emitSlow_op_instanceof): * jit/JITPropertyAccess.cpp: - (JSC::JIT::privateCompileGetByIdProto): - (JSC::JIT::privateCompileGetByIdProtoList): - -2009-04-26 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoffrey "Gaffe or energy?" Garen. - - Randomize address requested by ExecutableAllocatorFixedVMPool. - - * jit/ExecutableAllocatorFixedVMPool.cpp: - (JSC::FixedVMPoolAllocator::FixedVMPoolAllocator): - -2009-04-26 Sam Weinig <sam@webkit.org> - - Reviewed by Eric Seidel. - - Remove scons-based build system. - - * JavaScriptCore.scons: Removed. - -2009-04-25 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (Buildfix). - - Make HAVE_MADV_FREE darwin only for now - - * wtf/Platform.h: - -2009-04-25 Jan Michael Alonzo <jmalonzo@webkit.org> - - Reviewed by Oliver Hunt. - - Gtk build fix - check if we have MADV_FREE before using it. - - * interpreter/RegisterFile.cpp: - (JSC::RegisterFile::releaseExcessCapacity): - * wtf/Platform.h: - -2009-04-24 Kevin Ollivier <kevino@theolliviers.com> - - wx build fix. Switching JSCore from a static lib to a dynamic lib - to match the Apple build and fix symbol exports. - - * jscore.bkl: - -2009-04-24 Laszlo Gombos <laszlo.1.gombos@nokia.com> - - Rubber-stamped by Mark Rowe. - - https://bugs.webkit.org/show_bug.cgi?id=25337 - Move ThreadingQt.cpp under the qt directory. - - * JavaScriptCore.pri: - * wtf/ThreadingQt.cpp: Removed. - * wtf/qt/ThreadingQt.cpp: Copied from JavaScriptCore/wtf/ThreadingQt.cpp. - -2009-04-24 Laszlo Gombos <laszlo.1.gombos@nokia.com> - - Rubber-stamped by Mark Rowe. - - https://bugs.webkit.org/show_bug.cgi?id=25338 - Move ThreadingGtk.cpp under the gtk directory. - - * GNUmakefile.am: - * wtf/ThreadingGtk.cpp: Removed. - * wtf/gtk/ThreadingGtk.cpp: Copied from JavaScriptCore/wtf/ThreadingGtk.cpp. - -2009-04-24 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Sam "Wesley" Weinig. - - Improve performance to YARR interpreter. - (From about 3x slower than PCRE on regex-dna to about 30% slower). - - * yarr/RegexCompiler.cpp: - (JSC::Yarr::RegexPatternConstructor::setupAlternativeOffsets): - * yarr/RegexInterpreter.cpp: - (JSC::Yarr::Interpreter::checkCharacter): - (JSC::Yarr::Interpreter::checkCasedCharacter): - (JSC::Yarr::Interpreter::backtrackPatternCharacter): - (JSC::Yarr::Interpreter::backtrackPatternCasedCharacter): - (JSC::Yarr::Interpreter::matchParentheticalAssertionBegin): - (JSC::Yarr::Interpreter::matchParentheticalAssertionEnd): - (JSC::Yarr::Interpreter::backtrackParentheticalAssertionBegin): - (JSC::Yarr::Interpreter::backtrackParentheticalAssertionEnd): - (JSC::Yarr::Interpreter::matchDisjunction): - (JSC::Yarr::Interpreter::interpret): - (JSC::Yarr::ByteCompiler::atomPatternCharacter): - (JSC::Yarr::ByteCompiler::atomParenthesesSubpatternBegin): - (JSC::Yarr::ByteCompiler::atomParentheticalAssertionBegin): - (JSC::Yarr::ByteCompiler::closeAlternative): - (JSC::Yarr::ByteCompiler::closeBodyAlternative): - (JSC::Yarr::ByteCompiler::atomParenthesesEnd): - (JSC::Yarr::ByteCompiler::regexBegin): - (JSC::Yarr::ByteCompiler::regexEnd): - (JSC::Yarr::ByteCompiler::alterantiveBodyDisjunction): - (JSC::Yarr::ByteCompiler::alterantiveDisjunction): - (JSC::Yarr::ByteCompiler::emitDisjunction): - * yarr/RegexInterpreter.h: - (JSC::Yarr::ByteTerm::): - (JSC::Yarr::ByteTerm::ByteTerm): - (JSC::Yarr::ByteTerm::BodyAlternativeBegin): - (JSC::Yarr::ByteTerm::BodyAlternativeDisjunction): - (JSC::Yarr::ByteTerm::BodyAlternativeEnd): - (JSC::Yarr::ByteTerm::AlternativeBegin): - (JSC::Yarr::ByteTerm::AlternativeDisjunction): - (JSC::Yarr::ByteTerm::AlternativeEnd): - (JSC::Yarr::ByteTerm::SubpatternBegin): - (JSC::Yarr::ByteTerm::SubpatternEnd): - * yarr/RegexJIT.cpp: - (JSC::Yarr::RegexGenerator::generateParentheticalAssertion): - * yarr/RegexPattern.h: - -2009-04-24 Rob Raguet-Schofield <ragfield@gmail.com> - - Rubber-stamped by Mark Rowe. - - * wtf/CurrentTime.h: Fix a typo in a comment. - -2009-04-24 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (Build fix). - - Add reinterpret_cast - - * interpreter/RegisterFile.cpp: - (JSC::RegisterFile::releaseExcessCapacity): - -2009-04-23 Oliver Hunt <oliver@apple.com> - - Reviewed by Geoff Garen. - - <rdar://problem/6050421> JavaScript register file should remap to release physical pages accumulated during deep recursion - - We now track the maximum extent of the RegisterFile, and when we reach the final - return from JS (so the stack portion of the registerfile becomes empty) we see - if that extent is greater than maxExcessCapacity. If it is we use madvise or - VirtualFree to release the physical pages that were backing the excess. - - * interpreter/RegisterFile.cpp: - (JSC::RegisterFile::releaseExcessCapacity): - * interpreter/RegisterFile.h: - (JSC::RegisterFile::RegisterFile): - (JSC::RegisterFile::shrink): - (JSC::RegisterFile::grow): - -2009-04-23 Mark Rowe <mrowe@apple.com> - - With great sadness and a heavy heart I switch us back from YARR to WREC in - order to restore greenness to the world once more. - - * wtf/Platform.h: - -2009-04-23 Mark Rowe <mrowe@apple.com> - - More Windows build fixage. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - -2009-04-23 Mark Rowe <mrowe@apple.com> - - Attempt to fix the Windows build. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: Remove a symbol that no longer exists. - -2009-04-23 Francisco Tolmasky <francisco@280north.com> - - BUG 24604: WebKit profiler reports incorrect total times - <https://bugs.webkit.org/show_bug.cgi?id=24604> - - Reviewed by Timothy Hatcher and Kevin McCullough. - - * JavaScriptCore.exp: - * JavaScriptCore.xcodeproj/project.pbxproj: - * profiler/CallIdentifier.h: - (JSC::CallIdentifier::Hash::hash): - (JSC::CallIdentifier::Hash::equal): - (JSC::CallIdentifier::hash): - (WTF::): - * profiler/HeavyProfile.cpp: Removed. - * profiler/HeavyProfile.h: Removed. - * profiler/Profile.cpp: No more need for TreeProfile/HeavyProfile - (JSC::Profile::create): - * profiler/Profile.h: - * profiler/ProfileNode.cpp: - * profiler/ProfileNode.h: - * profiler/TreeProfile.cpp: Removed. - * profiler/TreeProfile.h: Removed. - -2009-04-23 Gavin Barraclough <barraclough@apple.com> - - Not Reviewed. - - Speculative Windows build fix II. - - * yarr/RegexInterpreter.cpp: - -2009-04-23 Gavin Barraclough <barraclough@apple.com> - - Not Reviewed. - - Speculative Windows build fix. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * runtime/RegExp.cpp: - -2009-04-23 Gavin Barraclough <barraclough@apple.com> - - Rubber stamped by salty sea dogs Sam & Geoff. - - Enable YARR_JIT by default (where supported), replacing WREC. - - * wtf/Platform.h: - -2009-04-23 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff "Dread Pirate Roberts" Garen. - - Various small fixes to YARR JIT, in preparation for enabling it by default. - - * Correctly index into the callframe when storing restart addresses for - nested alternatives. - * Allow backtracking back into matched alternatives of parentheses. - * Fix callframe offset calculation for parenthetical assertions. - * When a set of parenthese are quantified with a fixed and variable portion, - and the variable portion is quantified once, this should not reset the - pattern match on failure to match (the last match from the firxed portion - should be preserved). - * Up the pattern size limit to match PCRE's new limit. - * Unlclosed parentheses should be reported with the message "missing )". - - * wtf/Platform.h: - * yarr/RegexCompiler.cpp: - (JSC::Yarr::RegexPatternConstructor::quantifyAtom): - (JSC::Yarr::RegexPatternConstructor::setupAlternativeOffsets): - * yarr/RegexInterpreter.cpp: - (JSC::Yarr::Interpreter::matchParentheses): - (JSC::Yarr::Interpreter::backtrackParentheses): - (JSC::Yarr::ByteCompiler::emitDisjunction): - * yarr/RegexJIT.cpp: - (JSC::Yarr::RegexGenerator::loadFromFrameAndJump): - (JSC::Yarr::RegexGenerator::generateParenthesesDisjunction): - (JSC::Yarr::RegexGenerator::generateParentheticalAssertion): - (JSC::Yarr::RegexGenerator::generateTerm): - (JSC::Yarr::executeRegex): - * yarr/RegexParser.h: - (JSC::Yarr::Parser::): - (JSC::Yarr::Parser::parseTokens): - (JSC::Yarr::Parser::parse): - * yarr/RegexPattern.h: - (JSC::Yarr::PatternTerm::): - (JSC::Yarr::PatternTerm::PatternTerm): - -2009-04-22 Mark Rowe <mrowe@apple.com> - - Rubber-stamped by Gavin Barraclough. - - Add the m_ prefix on FixedVMPoolAllocator's member variables, and fix typos in a few comments. - - * jit/ExecutableAllocatorFixedVMPool.cpp: - (JSC::FixedVMPoolAllocator::addToFreeList): - (JSC::FixedVMPoolAllocator::coalesceFreeSpace): - (JSC::FixedVMPoolAllocator::FixedVMPoolAllocator): - (JSC::FixedVMPoolAllocator::alloc): - (JSC::FixedVMPoolAllocator::free): - (JSC::FixedVMPoolAllocator::isWithinVMPool): - -2009-04-22 Mark Rowe <mrowe@apple.com> - - Rubber-stamped by Gavin Barraclough. - - Add some assertions to FixedVMPoolAllocator to guard against cases where we - attempt to free memory that didn't originate from the pool, or we attempt to - hand out a bogus address from alloc. - - * jit/ExecutableAllocatorFixedVMPool.cpp: - (JSC::FixedVMPoolAllocator::release): - (JSC::FixedVMPoolAllocator::FixedVMPoolAllocator): - (JSC::FixedVMPoolAllocator::alloc): - (JSC::FixedVMPoolAllocator::free): - (JSC::FixedVMPoolAllocator::isWithinVMPool): - -2009-04-22 Gavin Barraclough <barraclough@apple.com> - - Rubber stamped by Sam "Blackbeard" Weinig. - - Although pirates do spell the word 'generate' as 'genertate', - webkit developers do not. Fixertate. - - * yarr/RegexJIT.cpp: - (JSC::Yarr::RegexGenerator::generateAssertionBOL): - (JSC::Yarr::RegexGenerator::generateAssertionEOL): - (JSC::Yarr::RegexGenerator::generateAssertionWordBoundary): - (JSC::Yarr::RegexGenerator::generatePatternCharacterSingle): - (JSC::Yarr::RegexGenerator::generatePatternCharacterPair): - (JSC::Yarr::RegexGenerator::generatePatternCharacterFixed): - (JSC::Yarr::RegexGenerator::generatePatternCharacterGreedy): - (JSC::Yarr::RegexGenerator::generatePatternCharacterNonGreedy): - (JSC::Yarr::RegexGenerator::generateCharacterClassSingle): - (JSC::Yarr::RegexGenerator::generateCharacterClassFixed): - (JSC::Yarr::RegexGenerator::generateCharacterClassGreedy): - (JSC::Yarr::RegexGenerator::generateCharacterClassNonGreedy): - (JSC::Yarr::RegexGenerator::generateTerm): - -2009-04-22 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Sam "Blackbeard" Weinig. - - Improvements to YARR JIT. This patch expands support in three key areas: - * Add (temporary) support for falling back to PCRE for expressions not supported. - * Add support for x86_64 and Windows. - * Add support for singly quantified parentheses (? and ??), alternatives within - parentheses, and parenthetical assertions. - - * runtime/RegExp.cpp: - (JSC::RegExp::match): - * yarr/RegexJIT.cpp: - (JSC::Yarr::RegexGenerator::storeToFrame): - (JSC::Yarr::RegexGenerator::storeToFrameWithPatch): - (JSC::Yarr::RegexGenerator::loadFromFrameAndJump): - (JSC::Yarr::RegexGenerator::AlternativeBacktrackRecord::AlternativeBacktrackRecord): - (JSC::Yarr::RegexGenerator::TermGenerationState::resetAlternative): - (JSC::Yarr::RegexGenerator::TermGenerationState::resetTerm): - (JSC::Yarr::RegexGenerator::TermGenerationState::jumpToBacktrack): - (JSC::Yarr::RegexGenerator::TermGenerationState::plantJumpToBacktrackIfExists): - (JSC::Yarr::RegexGenerator::TermGenerationState::addBacktrackJump): - (JSC::Yarr::RegexGenerator::TermGenerationState::linkAlternativeBacktracks): - (JSC::Yarr::RegexGenerator::TermGenerationState::propagateBacktrackingFrom): - (JSC::Yarr::RegexGenerator::genertateAssertionBOL): - (JSC::Yarr::RegexGenerator::genertateAssertionEOL): - (JSC::Yarr::RegexGenerator::matchAssertionWordchar): - (JSC::Yarr::RegexGenerator::genertateAssertionWordBoundary): - (JSC::Yarr::RegexGenerator::genertatePatternCharacterSingle): - (JSC::Yarr::RegexGenerator::genertatePatternCharacterPair): - (JSC::Yarr::RegexGenerator::genertatePatternCharacterFixed): - (JSC::Yarr::RegexGenerator::genertatePatternCharacterGreedy): - (JSC::Yarr::RegexGenerator::genertatePatternCharacterNonGreedy): - (JSC::Yarr::RegexGenerator::genertateCharacterClassSingle): - (JSC::Yarr::RegexGenerator::genertateCharacterClassFixed): - (JSC::Yarr::RegexGenerator::genertateCharacterClassGreedy): - (JSC::Yarr::RegexGenerator::genertateCharacterClassNonGreedy): - (JSC::Yarr::RegexGenerator::generateParenthesesDisjunction): - (JSC::Yarr::RegexGenerator::generateParenthesesSingle): - (JSC::Yarr::RegexGenerator::generateParentheticalAssertion): - (JSC::Yarr::RegexGenerator::generateTerm): - (JSC::Yarr::RegexGenerator::generateDisjunction): - (JSC::Yarr::RegexGenerator::generateEnter): - (JSC::Yarr::RegexGenerator::generateReturn): - (JSC::Yarr::RegexGenerator::RegexGenerator): - (JSC::Yarr::RegexGenerator::generate): - (JSC::Yarr::RegexGenerator::compile): - (JSC::Yarr::RegexGenerator::generationFailed): - (JSC::Yarr::jitCompileRegex): - (JSC::Yarr::executeRegex): - * yarr/RegexJIT.h: - (JSC::Yarr::RegexCodeBlock::RegexCodeBlock): - (JSC::Yarr::RegexCodeBlock::~RegexCodeBlock): - -2009-04-22 Sam Weinig <sam@webkit.org> - - Rubber-stamped by Darin Adler. - - Fix for <rdar://problem/6816957> - Turn off Geolocation by default - - * Configurations/FeatureDefines.xcconfig: - -2009-04-22 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (Buildfix). - - * interpreter/CachedCall.h: - -2009-04-21 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (Build fix). - - * runtime/StringPrototype.cpp: - -2009-04-21 Oliver Hunt <oliver@apple.com> - - Reviewed by Maciej Stachowiak. - - Improve String.replace performance slightly - - Apply our vm reentry caching logic to String.replace with global - regexes. - - * runtime/StringPrototype.cpp: - (JSC::stringProtoFuncReplace): + (JSC::JIT::emit_op_get_by_val): + (JSC::JIT::emitSlow_op_get_by_val): + (JSC::JIT::emit_op_put_by_val): + (JSC::JIT::emitSlow_op_put_by_val): + (JSC::JIT::emit_op_get_by_id): + (JSC::JIT::emitSlow_op_get_by_id): + (JSC::JIT::emit_op_put_by_id): + (JSC::JIT::emitSlow_op_put_by_id): -2009-04-21 Geoffrey Garen <ggaren@apple.com> +2009-06-01 Geoffrey Garen <ggaren@apple.com> - Reviewed by Cameron Zwarich and Oliver Hunt. - - Re-Fixed <rdar://problem/6406045> REGRESSION: Stack overflow on PowerPC on - fast/workers/use-machine-stack.html (22531) - - SunSpider reports no change. + Reviewed by Sam Weinig. - Use a larger recursion limit on the main thread (because we can, and - there's some evidence that it may improve compatibility), and a smaller - recursion limit on secondary threads (because they tend to have smaller - stacks). - - * interpreter/Interpreter.cpp: - (JSC::Interpreter::execute): - (JSC::Interpreter::prepareForRepeatCall): - * interpreter/Interpreter.h: - (JSC::): Ditto. I wrote the recursion test slightly funny, so that the - common case remains a simple compare to constant. - - * runtime/ArrayPrototype.cpp: - (JSC::arrayProtoFuncToString): - (JSC::arrayProtoFuncToLocaleString): - (JSC::arrayProtoFuncJoin): Conservatively, set the array recursion limits - to the lower, secondary thread limit. We can do something fancier if - compatibility moves us, but this seems sufficient for now. - -2009-04-21 Geoffrey Garen <ggaren@apple.com> - - Rubber-stamped by Adam Roben. + Fixed some of the regression in crypto-aes.js. (8.5% speedup in + crypto-aes.js.) - Disabled one more Mozilla JS test because it fails intermittently on Windows. - (See https://bugs.webkit.org/show_bug.cgi?id=25160.) - - * tests/mozilla/expected.html: - -2009-04-21 Adam Roben <aroben@apple.com> - - Rename JavaScriptCore_debug.dll to JavaScriptCore.dll in the Debug - configuration - - This matches the naming scheme for WebKit.dll, and will be necessary - once Safari links against JavaScriptCore.dll. This change also causes - run-safari not to fail (because the launcher printed by FindSafari was - always looking for JavaScriptCore.dll, never - JavaScriptCore_debug.dll). - - Part of Bug 25305: can't run safari or drt on windows - <https://bugs.webkit.org/show_bug.cgi?id=25305> - - Reviewed by Steve Falkenburg and Sam Weinig. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.vcproj/jsc/jsc.vcproj: - * JavaScriptCore.vcproj/testapi/testapi.vcproj: - Use $(WebKitDLLConfigSuffix) for naming JavaScriptCore.{dll,lib}. - -2009-04-21 Adam Roben <aroben@apple.com> - - Fix JavaScriptCore build on VC++ Express - - Reviewed by Steve Falkenburg and Sam Weinig. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Link - explicitly against gdi32.lib and oleaut32.lib. - -2009-04-21 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Mark Rowe. + SunSpider reports no change overall. - Tiger crash fix: Put VM tags in their own header file, and fixed up the - #ifdefs so they're not used on Tiger. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * interpreter/RegisterFile.h: - (JSC::RegisterFile::RegisterFile): - * jit/ExecutableAllocatorFixedVMPool.cpp: - (JSC::FixedVMPoolAllocator::FixedVMPoolAllocator): - * jit/ExecutableAllocatorPosix.cpp: - (JSC::ExecutablePool::systemAlloc): - * runtime/Collector.cpp: - (JSC::allocateBlock): - * wtf/VMTags.h: Added. - -2009-04-20 Steve Falkenburg <sfalken@apple.com> - - More Windows build fixes. - - * JavaScriptCore.vcproj/JavaScriptCore.make: Copy DLLs, PDBs. - * JavaScriptCore.vcproj/JavaScriptCore.resources: Added. - * JavaScriptCore.vcproj/JavaScriptCore.resources/Info.plist: Added. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.rc: Added. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Add version stamping, resource copying. - -2009-04-20 Steve Falkenburg <sfalken@apple.com> - - Separate JavaScriptCore.dll from WebKit.dll. - Slight performance improvement or no change on benchmarks. + Division was producing double results, which took the slow path through + array access code. - Allows us to break a circular dependency between CFNetwork and WebKit on Windows, - and simplifies standalone JavaScriptCore builds. - - Reviewed by Oliver Hunt. - - * API/JSBase.h: Export symbols with JS_EXPORT when using MSVC. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.vcproj/WTF/WTF.vcproj: Build JavaScriptCore as a DLL instead of a static library. - * config.h: Specify __declspec(dllexport/dllimport) appropriately when exporting data. - * runtime/InternalFunction.h: Specify JS_EXPORTDATA on exported data. - * runtime/JSArray.h: Specify JS_EXPORTDATA on exported data. - * runtime/JSFunction.h: Specify JS_EXPORTDATA on exported data. - * runtime/StringObject.h: Specify JS_EXPORTDATA on exported data. - * runtime/UString.h: Specify JS_EXPORTDATA on exported data. - -2009-04-20 Sam Weinig <sam@webkit.org> - - Reviewed by Kevin McCullough. - - Always tag mmaped memory on darwin and clean up #defines - now that they are a little bigger. - - * interpreter/RegisterFile.h: - (JSC::RegisterFile::RegisterFile): - * jit/ExecutableAllocatorFixedVMPool.cpp: - (JSC::FixedVMPoolAllocator::FixedVMPoolAllocator): - * jit/ExecutableAllocatorPosix.cpp: - (JSC::ExecutablePool::systemAlloc): - * runtime/Collector.cpp: - (JSC::allocateBlock): - -2009-04-20 Sam Weinig <sam@webkit.org> - - Rubber-stamped by Tim Hatcher. - - Add licenses for xcconfig files. - - * Configurations/Base.xcconfig: - * Configurations/DebugRelease.xcconfig: - * Configurations/FeatureDefines.xcconfig: - * Configurations/JavaScriptCore.xcconfig: - * Configurations/Version.xcconfig: - -2009-04-20 Ariya Hidayat <ariya.hidayat@nokia.com> - - Build fix for Qt port (after r42646). Not reviewed. - - * wtf/unicode/qt4/UnicodeQt4.h: Added U16_PREV. - -2009-04-19 Sam Weinig <sam@webkit.org> - - Reviewed by Darin Adler. - - Better fix for JSStringCreateWithCFString hardening. - - * API/JSStringRefCF.cpp: - (JSStringCreateWithCFString): - -2009-04-19 Sam Weinig <sam@webkit.org> - - Reviewed by Dan Bernstein. - - Fix for <rdar://problem/5860954> - Harden JSStringCreateWithCFString against malformed CFStringRefs. - - * API/JSStringRefCF.cpp: - (JSStringCreateWithCFString): - -2009-04-19 David Kilzer <ddkilzer@apple.com> - - Make FEATURE_DEFINES completely dynamic - - Reviewed by Darin Adler. - - Make FEATURE_DEFINES depend on individual ENABLE_FEATURE_NAME - variables for each feature, making it possible to remove all - knowledge of FEATURE_DEFINES from build-webkit. - - * Configurations/FeatureDefines.xcconfig: Extract a variable - from FEATURE_DEFINES for each feature setting. - -2009-04-18 Sam Weinig <sam@webkit.org> - - Reviewed by Dan Bernstein. - - Fix typo. s/VM_MEMORY_JAVASCRIPT_JIT_REGISTER_FILE/VM_MEMORY_JAVASCRIPT_CORE/ - - * runtime/Collector.cpp: - (JSC::allocateBlock): Fix bozo typo. - -2009-04-18 Sam Weinig <sam@webkit.org> - - Reviewed by Anders Carlsson. - - Fix for <rdar://problem/6801555> Tag JavaScript memory on SnowLeopard - - * interpreter/RegisterFile.h: - (JSC::RegisterFile::RegisterFile): - * jit/ExecutableAllocatorFixedVMPool.cpp: - (JSC::FixedVMPoolAllocator::FixedVMPoolAllocator): - * jit/ExecutableAllocatorPosix.cpp: - (JSC::ExecutablePool::systemAlloc): - * runtime/Collector.cpp: - (JSC::allocateBlock): - -2009-04-18 Drew Wilson <amw@apple.com> - - <rdar://problem/6781407> VisiblePosition.characterAfter should return UChar32 - - Reviewed by Dan Bernstein. - - * wtf/unicode/icu/UnicodeIcu.h: - (WTF::Unicode::hasLineBreakingPropertyComplexContextOrIdeographic): Added. - -2009-04-18 Sam Weinig <sam@webkit.org> - - Reviewed by Mark Rowe. - - Fix for <rdar://problem/5861045> - A little bit of hardening for UString. - - * runtime/UString.cpp: - (JSC::concatenate): - (JSC::UString::append): - -2009-04-18 Sam Weinig <sam@webkit.org> - - Reviewed by Mark Rowe and Dan Bernstein. - - Fix for <rdar://problem/5861188> - A little bit of hardening for Vector. - - * wtf/Vector.h: - (WTF::Vector<T, inlineCapacity>::append): - (WTF::Vector<T, inlineCapacity>::insert): - -2009-04-17 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. - - On x86_64, make all JIT-code allocations from a new heap, managed - by FixedVMPoolAllocator. This class allocates a single large (2Gb) - pool of virtual memory from which all further allocations take place. - Since all JIT code is allocated from this pool, we can continue to - safely assume (as is already asserted) that it will always be possible - to link any JIT-code to JIT-code jumps and calls. - - * JavaScriptCore.xcodeproj/project.pbxproj: - Add new file. - * jit/ExecutableAllocatorFixedVMPool.cpp: Added. - (JSC::FreeListEntry::FreeListEntry): - (JSC::AVLTreeAbstractorForFreeList::get_less): - (JSC::AVLTreeAbstractorForFreeList::set_less): - (JSC::AVLTreeAbstractorForFreeList::get_greater): - (JSC::AVLTreeAbstractorForFreeList::set_greater): - (JSC::AVLTreeAbstractorForFreeList::get_balance_factor): - (JSC::AVLTreeAbstractorForFreeList::set_balance_factor): - (JSC::AVLTreeAbstractorForFreeList::null): - (JSC::AVLTreeAbstractorForFreeList::compare_key_key): - (JSC::AVLTreeAbstractorForFreeList::compare_key_node): - (JSC::AVLTreeAbstractorForFreeList::compare_node_node): - (JSC::sortFreeListEntriesByPointer): - (JSC::sortCommonSizedAllocations): - (JSC::FixedVMPoolAllocator::release): - (JSC::FixedVMPoolAllocator::reuse): - (JSC::FixedVMPoolAllocator::addToFreeList): - (JSC::FixedVMPoolAllocator::coalesceFreeSpace): - (JSC::FixedVMPoolAllocator::FixedVMPoolAllocator): - (JSC::FixedVMPoolAllocator::alloc): - (JSC::FixedVMPoolAllocator::free): - (JSC::ExecutableAllocator::intializePageSize): - (JSC::ExecutablePool::systemAlloc): - (JSC::ExecutablePool::systemRelease): - The new 2Gb heap class! - * jit/ExecutableAllocatorPosix.cpp: - Disable use of this implementation on x86_64. - * wtf/AVLTree.h: - Add missing variable initialization. - (WTF::::remove): - -2009-04-17 Oliver Hunt <oliver@apple.com> - - Reviewed by Darin Adler. - - Fix bug where the VM reentry cache would not correctly unroll the cached callframe - - Fix a check that was intended to mark a cached call as invalid when the callframe could - not be constructed. Instead it was just checking that there was a place to put the - exception. This eventually results in a non-recoverable RegisterFile starvation. - - * interpreter/CachedCall.h: - (JSC::CachedCall::CachedCall): - (JSC::CachedCall::call): add assertion to ensure we don't use a bad callframe - -2009-04-17 David Kilzer <ddkilzer@apple.com> - - Simplify FEATURE_DEFINES definition - - Reviewed by Darin Adler. - - This moves FEATURE_DEFINES and its related ENABLE_FEATURE_NAME - variables to their own FeatureDefines.xcconfig file. It also - extracts a new ENABLE_GEOLOCATION variable so that - FEATURE_DEFINES only needs to be defined once. - - * Configurations/FeatureDefines.xcconfig: Added. - * Configurations/JavaScriptCore.xcconfig: Removed definition of - ENABLE_SVG_DOM_OBJC_BINDINGS and FEATURE_DEFINES. Added include - of FeatureDefines.xcconfig. - * JavaScriptCore.xcodeproj/project.pbxproj: Added - FeatureDefines.xcconfig file. - -2009-04-08 Mihnea Ovidenie <mihnea@adobe.com> - - Reviewed by Oliver Hunt. - - Bug 25027: JavaScript parseInt wrong on negative numbers - <https://bugs.webkit.org/show_bug.cgi?id=25027> - - When dealing with negative numbers, parseInt should use ceil instead of floor. - - * runtime/JSGlobalObjectFunctions.cpp: - (JSC::globalFuncParseInt): - -2009-04-16 Stephanie Lewis <slewis@apple.com> - - Reviewed by Oliver Hunt. - - <rdar://problem/6744652> 32-bit to 64-bit: Javascript hash tables double in size - - Remove perfect hash optimization which removes 1 MB of overhead on 32-bit and almost 2 MB on 64-bit. Removing the optimization was not a regression on SunSpider and the acid 3 test still passes. - - * create_hash_table: - * runtime/Lookup.cpp: - (JSC::HashTable::createTable): - (JSC::HashTable::deleteTable): - * runtime/Lookup.h: - (JSC::HashEntry::initialize): - (JSC::HashEntry::next): - (JSC::HashTable::entry): - * runtime/Structure.cpp: - (JSC::Structure::getEnumerableNamesFromClassInfoTable): - -2009-04-16 Oliver Hunt <oliver@apple.com> - - Reviewed by Gavin Barraclough. - - Fix subtle error in optimised VM reentry in Array.sort - - Basically to ensure we don't accidentally invalidate the cached callframe - we should be using the cached callframe rather than our own exec state. - While the old behaviour was wrong i have been unable to actually create a - test case where anything actually ends up going wrong. - - * interpreter/CachedCall.h: - (JSC::CachedCall::newCallFrame): - * runtime/JSArray.cpp: - (JSC::AVLTreeAbstractorForArrayCompare::compare_key_key): - -2009-04-16 Oliver Hunt <oliver@apple.com> - - Reviewed by Gavin Barraclough. - - Optimise op_resolve_base - - If we can statically find a property we are trying to resolve - the base of, the base is guaranteed to be the global object. - - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::emitResolveBase): - -2009-04-16 Oliver Hunt <oliver@apple.com> - - Reviewed by Gavin Barraclough. - - Improve performance of read-write-modify operators - - Implement cross scope optimisation for read-write-modify - operators, to avoid unnecessary calls to property resolve - helper functions. - - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::BytecodeGenerator): - (JSC::BytecodeGenerator::emitLoadGlobalObject): - (JSC::BytecodeGenerator::emitResolveWithBase): - * bytecompiler/BytecodeGenerator.h: - -2009-04-16 Oliver Hunt <oliver@apple.com> - - Reviewed by Gavin Barraclough. - - Improve performance of remaining array enumeration functions - - Make use of function entry cache for remaining Array enumeration functions. - - * runtime/ArrayPrototype.cpp: - (JSC::arrayProtoFuncMap): - (JSC::arrayProtoFuncEvery): - (JSC::arrayProtoFuncForEach): - (JSC::arrayProtoFuncSome): - -2009-04-15 Oliver Hunt <oliver@apple.com> - - Reviewed by Gavin Barraclough. - - Improve performance of Array.sort - - Cache the VM entry for Array.sort when using a JS comparison function. - - * runtime/JSArray.cpp: - (JSC::AVLTreeAbstractorForArrayCompare::compare_key_key): - (JSC::JSArray::sort): - -2009-04-15 Oliver Hunt <oliver@apple.com> - - Reviewed by Gavin Barraclough. - - Bug 25229: Need support for Array.prototype.reduceRight - <https://bugs.webkit.org/show_bug.cgi?id=25229> - - Implement Array.reduceRight - - * runtime/ArrayPrototype.cpp: - (JSC::arrayProtoFuncReduceRight): - -2009-04-15 Oliver Hunt <oliver@apple.com> - - Reviewed by Gavin Barraclough. - - Bug 25227: Array.filter triggers an assertion when the target array shrinks while being filtered - <https://bugs.webkit.org/show_bug.cgi?id=25227> - - We correct this simply by making the fast array path fall back on the slow path if - we ever discover the fast access is unsafe. - - * runtime/ArrayPrototype.cpp: - (JSC::arrayProtoFuncFilter): - -2009-04-13 Oliver Hunt <oliver@apple.com> - - Reviewed by Gavin Barraclough. - - Bug 25159: Support Array.prototype.reduce - <https://bugs.webkit.org/show_bug.cgi?id=25159> - - Implement Array.prototype.reduce - - * runtime/ArrayPrototype.cpp: - (JSC::arrayProtoFuncReduce): - -2009-04-15 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (Build fix). - - Move CallFrameClosure from inside the Interpreter class to its own file. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * interpreter/CachedCall.h: - * interpreter/CallFrameClosure.h: Copied from JavaScriptCore/yarr/RegexJIT.h. - (JSC::CallFrameClosure::setArgument): - (JSC::CallFrameClosure::resetCallFrame): - * interpreter/Interpreter.cpp: - (JSC::Interpreter::prepareForRepeatCall): - * interpreter/Interpreter.h: + Strangely, all my attempts at versions of this patch that modified array + access code to accept ints encoded as doubles along the fast or slow paths + were regressions. So I did this instead. -2009-04-14 Oliver Hunt <oliver@apple.com> - - Reviewed by Cameron Zwarich. - - Bug 25202: Improve performance of repeated callbacks into the VM - - Add the concept of a CachedCall to native code for use in Array - prototype and similar functions where a single callback function - is called repeatedly with the same number of arguments. - - Used Array.prototype.filter as the test function and got a 50% win - over a naive non-caching specialised version. This makes the native - implementation of Array.prototype.filter faster than the JS one once - more. - - * JavaScriptCore.vcproj/JavaScriptCore.sln: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * interpreter/CachedCall.h: Added. - (JSC::CachedCall::CachedCall): - (JSC::CachedCall::call): - (JSC::CachedCall::setThis): - (JSC::CachedCall::setArgument): - (JSC::CachedCall::~CachedCall): - CachedCall is a wrapper that automates the calling and teardown - for a CallFrameClosure - * interpreter/CallFrame.h: - * interpreter/Interpreter.cpp: - (JSC::Interpreter::prepareForRepeatCall): - Create the basic entry closure for a function - (JSC::Interpreter::execute): - A new ::execute method to enter the interpreter from a closure - (JSC::Interpreter::endRepeatCall): - Clear the entry closure - * interpreter/Interpreter.h: - (JSC::Interpreter::CallFrameClosure::setArgument): - (JSC::Interpreter::CallFrameClosure::resetCallFrame): - Helper functions to simplify setting up the closure's callframe - * runtime/ArrayPrototype.cpp: - (JSC::arrayProtoFuncFilter): - -2009-04-14 Xan Lopez <xlopez@igalia.com> - - Fix the build. - - Add the yarr headers (and only the headers) to the build, so that - RegExp.cpp can compile. The headers are ifdefed out with yarr - disabled, so we don't need anything else for now. - - * GNUmakefile.am: - -2009-04-14 Adam Roben <aroben@apple.com> - - Remove support for profile-guided optimization on Windows - - Rubber-stamped by Steve Falkenburg. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Removed - the Release_PGO configuration. Also let VS re-order the source files - list. - -2009-04-14 Xan Lopez <xlopez@igalia.com> - - Unreviewed build fix. - - * GNUmakefile.am: - -2009-04-14 Jan Michael Alonzo <jmalonzo@webkit.org> - - Gtk build fix when building minidom. Not reviewed. - - Use C-style comment instead of C++ style since autotools builds - minidom using gcc and not g++. - - * wtf/Platform.h: - -2009-04-14 Gavin Barraclough <barraclough@apple.com> - - Reviewed by NOBODY - speculative build fix. - - * runtime/RegExp.h: - -2009-04-13 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Cap'n Geoff Garen. - - Yarr! - (Yet another regex runtime). - - Currently disabled by default since the interpreter, whilst awesomely - functional, has not been optimized and is likely slower than PCRE, and - the JIT, whilst faster than WREC, is presently incomplete and does not - fallback to using an interpreter for the cases it cannot handle. + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_div): When dividing an int by an int, go ahead and try + to turn the result into an int. Don't just do int division, though, because + testing shows it to be slower than SSE double division, and the corner + cases are pretty complicated / lengthy on top of that. Also, don't try + to canonicalize division of known tiny numerators into ints, since that's a + waste of time. - * JavaScriptCore.xcodeproj/project.pbxproj: - * assembler/MacroAssemblerX86Common.h: - (JSC::MacroAssemblerX86Common::move): - (JSC::MacroAssemblerX86Common::swap): - (JSC::MacroAssemblerX86Common::signExtend32ToPtr): - (JSC::MacroAssemblerX86Common::zeroExtend32ToPtr): - (JSC::MacroAssemblerX86Common::branch32): - (JSC::MacroAssemblerX86Common::branch16): - * assembler/X86Assembler.h: - (JSC::X86Assembler::cmpw_im): - (JSC::X86Assembler::testw_rr): - (JSC::X86Assembler::X86InstructionFormatter::immediate16): - * runtime/RegExp.cpp: - (JSC::RegExp::RegExp): - (JSC::RegExp::~RegExp): - (JSC::RegExp::create): - (JSC::RegExp::compile): - (JSC::RegExp::match): - * runtime/RegExp.h: - * wtf/Platform.h: - * yarr: Added. - * yarr/RegexCompiler.cpp: Added. - (JSC::Yarr::CharacterClassConstructor::CharacterClassConstructor): - (JSC::Yarr::CharacterClassConstructor::reset): - (JSC::Yarr::CharacterClassConstructor::append): - (JSC::Yarr::CharacterClassConstructor::putChar): - (JSC::Yarr::CharacterClassConstructor::isUnicodeUpper): - (JSC::Yarr::CharacterClassConstructor::isUnicodeLower): - (JSC::Yarr::CharacterClassConstructor::putRange): - (JSC::Yarr::CharacterClassConstructor::charClass): - (JSC::Yarr::CharacterClassConstructor::addSorted): - (JSC::Yarr::CharacterClassConstructor::addSortedRange): - (JSC::Yarr::newlineCreate): - (JSC::Yarr::digitsCreate): - (JSC::Yarr::spacesCreate): - (JSC::Yarr::wordcharCreate): - (JSC::Yarr::nondigitsCreate): - (JSC::Yarr::nonspacesCreate): - (JSC::Yarr::nonwordcharCreate): - (JSC::Yarr::RegexPatternConstructor::RegexPatternConstructor): - (JSC::Yarr::RegexPatternConstructor::~RegexPatternConstructor): - (JSC::Yarr::RegexPatternConstructor::reset): - (JSC::Yarr::RegexPatternConstructor::assertionBOL): - (JSC::Yarr::RegexPatternConstructor::assertionEOL): - (JSC::Yarr::RegexPatternConstructor::assertionWordBoundary): - (JSC::Yarr::RegexPatternConstructor::atomPatternCharacter): - (JSC::Yarr::RegexPatternConstructor::atomBuiltInCharacterClass): - (JSC::Yarr::RegexPatternConstructor::atomCharacterClassBegin): - (JSC::Yarr::RegexPatternConstructor::atomCharacterClassAtom): - (JSC::Yarr::RegexPatternConstructor::atomCharacterClassRange): - (JSC::Yarr::RegexPatternConstructor::atomCharacterClassBuiltIn): - (JSC::Yarr::RegexPatternConstructor::atomCharacterClassEnd): - (JSC::Yarr::RegexPatternConstructor::atomParenthesesSubpatternBegin): - (JSC::Yarr::RegexPatternConstructor::atomParentheticalAssertionBegin): - (JSC::Yarr::RegexPatternConstructor::atomParenthesesEnd): - (JSC::Yarr::RegexPatternConstructor::atomBackReference): - (JSC::Yarr::RegexPatternConstructor::copyDisjunction): - (JSC::Yarr::RegexPatternConstructor::copyTerm): - (JSC::Yarr::RegexPatternConstructor::quantifyAtom): - (JSC::Yarr::RegexPatternConstructor::disjunction): - (JSC::Yarr::RegexPatternConstructor::regexBegin): - (JSC::Yarr::RegexPatternConstructor::regexEnd): - (JSC::Yarr::RegexPatternConstructor::regexError): - (JSC::Yarr::RegexPatternConstructor::setupAlternativeOffsets): - (JSC::Yarr::RegexPatternConstructor::setupDisjunctionOffsets): - (JSC::Yarr::RegexPatternConstructor::setupOffsets): - (JSC::Yarr::compileRegex): - * yarr/RegexCompiler.h: Added. - * yarr/RegexInterpreter.cpp: Added. - (JSC::Yarr::Interpreter::appendParenthesesDisjunctionContext): - (JSC::Yarr::Interpreter::popParenthesesDisjunctionContext): - (JSC::Yarr::Interpreter::DisjunctionContext::DisjunctionContext): - (JSC::Yarr::Interpreter::DisjunctionContext::operator new): - (JSC::Yarr::Interpreter::allocDisjunctionContext): - (JSC::Yarr::Interpreter::freeDisjunctionContext): - (JSC::Yarr::Interpreter::ParenthesesDisjunctionContext::ParenthesesDisjunctionContext): - (JSC::Yarr::Interpreter::ParenthesesDisjunctionContext::operator new): - (JSC::Yarr::Interpreter::ParenthesesDisjunctionContext::restoreOutput): - (JSC::Yarr::Interpreter::ParenthesesDisjunctionContext::getDisjunctionContext): - (JSC::Yarr::Interpreter::allocParenthesesDisjunctionContext): - (JSC::Yarr::Interpreter::freeParenthesesDisjunctionContext): - (JSC::Yarr::Interpreter::InputStream::InputStream): - (JSC::Yarr::Interpreter::InputStream::next): - (JSC::Yarr::Interpreter::InputStream::rewind): - (JSC::Yarr::Interpreter::InputStream::read): - (JSC::Yarr::Interpreter::InputStream::readChecked): - (JSC::Yarr::Interpreter::InputStream::reread): - (JSC::Yarr::Interpreter::InputStream::prev): - (JSC::Yarr::Interpreter::InputStream::getPos): - (JSC::Yarr::Interpreter::InputStream::setPos): - (JSC::Yarr::Interpreter::InputStream::atStart): - (JSC::Yarr::Interpreter::InputStream::atEnd): - (JSC::Yarr::Interpreter::InputStream::checkInput): - (JSC::Yarr::Interpreter::InputStream::uncheckInput): - (JSC::Yarr::Interpreter::testCharacterClass): - (JSC::Yarr::Interpreter::tryConsumeCharacter): - (JSC::Yarr::Interpreter::checkCharacter): - (JSC::Yarr::Interpreter::tryConsumeCharacterClass): - (JSC::Yarr::Interpreter::checkCharacterClass): - (JSC::Yarr::Interpreter::tryConsumeBackReference): - (JSC::Yarr::Interpreter::matchAssertionBOL): - (JSC::Yarr::Interpreter::matchAssertionEOL): - (JSC::Yarr::Interpreter::matchAssertionWordBoundary): - (JSC::Yarr::Interpreter::matchPatternCharacter): - (JSC::Yarr::Interpreter::backtrackPatternCharacter): - (JSC::Yarr::Interpreter::matchCharacterClass): - (JSC::Yarr::Interpreter::backtrackCharacterClass): - (JSC::Yarr::Interpreter::matchBackReference): - (JSC::Yarr::Interpreter::backtrackBackReference): - (JSC::Yarr::Interpreter::recordParenthesesMatch): - (JSC::Yarr::Interpreter::resetMatches): - (JSC::Yarr::Interpreter::resetAssertionMatches): - (JSC::Yarr::Interpreter::parenthesesDoBacktrack): - (JSC::Yarr::Interpreter::matchParenthesesOnceBegin): - (JSC::Yarr::Interpreter::matchParenthesesOnceEnd): - (JSC::Yarr::Interpreter::backtrackParenthesesOnceBegin): - (JSC::Yarr::Interpreter::backtrackParenthesesOnceEnd): - (JSC::Yarr::Interpreter::matchParentheticalAssertionOnceBegin): - (JSC::Yarr::Interpreter::matchParentheticalAssertionOnceEnd): - (JSC::Yarr::Interpreter::backtrackParentheticalAssertionOnceBegin): - (JSC::Yarr::Interpreter::backtrackParentheticalAssertionOnceEnd): - (JSC::Yarr::Interpreter::matchParentheses): - (JSC::Yarr::Interpreter::backtrackParentheses): - (JSC::Yarr::Interpreter::matchTerm): - (JSC::Yarr::Interpreter::backtrackTerm): - (JSC::Yarr::Interpreter::matchAlternative): - (JSC::Yarr::Interpreter::matchDisjunction): - (JSC::Yarr::Interpreter::matchNonZeroDisjunction): - (JSC::Yarr::Interpreter::interpret): - (JSC::Yarr::Interpreter::Interpreter): - (JSC::Yarr::ByteCompiler::ParenthesesStackEntry::ParenthesesStackEntry): - (JSC::Yarr::ByteCompiler::ByteCompiler): - (JSC::Yarr::ByteCompiler::compile): - (JSC::Yarr::ByteCompiler::checkInput): - (JSC::Yarr::ByteCompiler::assertionBOL): - (JSC::Yarr::ByteCompiler::assertionEOL): - (JSC::Yarr::ByteCompiler::assertionWordBoundary): - (JSC::Yarr::ByteCompiler::atomPatternCharacter): - (JSC::Yarr::ByteCompiler::atomCharacterClass): - (JSC::Yarr::ByteCompiler::atomBackReference): - (JSC::Yarr::ByteCompiler::atomParenthesesSubpatternBegin): - (JSC::Yarr::ByteCompiler::atomParentheticalAssertionBegin): - (JSC::Yarr::ByteCompiler::popParenthesesStack): - (JSC::Yarr::ByteCompiler::dumpDisjunction): - (JSC::Yarr::ByteCompiler::closeAlternative): - (JSC::Yarr::ByteCompiler::atomParenthesesEnd): - (JSC::Yarr::ByteCompiler::regexBegin): - (JSC::Yarr::ByteCompiler::regexEnd): - (JSC::Yarr::ByteCompiler::alterantiveDisjunction): - (JSC::Yarr::ByteCompiler::emitDisjunction): - (JSC::Yarr::byteCompileRegex): - (JSC::Yarr::interpretRegex): - * yarr/RegexInterpreter.h: Added. - (JSC::Yarr::ByteTerm::): - (JSC::Yarr::ByteTerm::ByteTerm): - (JSC::Yarr::ByteTerm::BOL): - (JSC::Yarr::ByteTerm::CheckInput): - (JSC::Yarr::ByteTerm::EOL): - (JSC::Yarr::ByteTerm::WordBoundary): - (JSC::Yarr::ByteTerm::BackReference): - (JSC::Yarr::ByteTerm::AlternativeBegin): - (JSC::Yarr::ByteTerm::AlternativeDisjunction): - (JSC::Yarr::ByteTerm::AlternativeEnd): - (JSC::Yarr::ByteTerm::PatternEnd): - (JSC::Yarr::ByteTerm::invert): - (JSC::Yarr::ByteTerm::capture): - (JSC::Yarr::ByteDisjunction::ByteDisjunction): - (JSC::Yarr::BytecodePattern::BytecodePattern): - (JSC::Yarr::BytecodePattern::~BytecodePattern): - * yarr/RegexJIT.cpp: Added. - (JSC::Yarr::RegexGenerator::optimizeAlternative): - (JSC::Yarr::RegexGenerator::matchCharacterClassRange): - (JSC::Yarr::RegexGenerator::matchCharacterClass): - (JSC::Yarr::RegexGenerator::jumpIfNoAvailableInput): - (JSC::Yarr::RegexGenerator::jumpIfAvailableInput): - (JSC::Yarr::RegexGenerator::checkInput): - (JSC::Yarr::RegexGenerator::atEndOfInput): - (JSC::Yarr::RegexGenerator::notAtEndOfInput): - (JSC::Yarr::RegexGenerator::jumpIfCharEquals): - (JSC::Yarr::RegexGenerator::jumpIfCharNotEquals): - (JSC::Yarr::RegexGenerator::readCharacter): - (JSC::Yarr::RegexGenerator::storeToFrame): - (JSC::Yarr::RegexGenerator::loadFromFrame): - (JSC::Yarr::RegexGenerator::TermGenerationState::TermGenerationState): - (JSC::Yarr::RegexGenerator::TermGenerationState::resetAlternative): - (JSC::Yarr::RegexGenerator::TermGenerationState::alternativeValid): - (JSC::Yarr::RegexGenerator::TermGenerationState::nextAlternative): - (JSC::Yarr::RegexGenerator::TermGenerationState::alternative): - (JSC::Yarr::RegexGenerator::TermGenerationState::resetTerm): - (JSC::Yarr::RegexGenerator::TermGenerationState::termValid): - (JSC::Yarr::RegexGenerator::TermGenerationState::nextTerm): - (JSC::Yarr::RegexGenerator::TermGenerationState::term): - (JSC::Yarr::RegexGenerator::TermGenerationState::lookaheadTerm): - (JSC::Yarr::RegexGenerator::TermGenerationState::isSinglePatternCharacterLookaheadTerm): - (JSC::Yarr::RegexGenerator::TermGenerationState::inputOffset): - (JSC::Yarr::RegexGenerator::TermGenerationState::jumpToBacktrack): - (JSC::Yarr::RegexGenerator::TermGenerationState::setBacktrackGenerated): - (JSC::Yarr::RegexGenerator::jumpToBacktrackCheckEmitPending): - (JSC::Yarr::RegexGenerator::genertateAssertionBOL): - (JSC::Yarr::RegexGenerator::genertateAssertionEOL): - (JSC::Yarr::RegexGenerator::matchAssertionWordchar): - (JSC::Yarr::RegexGenerator::genertateAssertionWordBoundary): - (JSC::Yarr::RegexGenerator::genertatePatternCharacterSingle): - (JSC::Yarr::RegexGenerator::genertatePatternCharacterPair): - (JSC::Yarr::RegexGenerator::genertatePatternCharacterFixed): - (JSC::Yarr::RegexGenerator::genertatePatternCharacterGreedy): - (JSC::Yarr::RegexGenerator::genertatePatternCharacterNonGreedy): - (JSC::Yarr::RegexGenerator::genertateCharacterClassSingle): - (JSC::Yarr::RegexGenerator::genertateCharacterClassFixed): - (JSC::Yarr::RegexGenerator::genertateCharacterClassGreedy): - (JSC::Yarr::RegexGenerator::genertateCharacterClassNonGreedy): - (JSC::Yarr::RegexGenerator::generateParenthesesSingleDisjunctionOneAlternative): - (JSC::Yarr::RegexGenerator::generateParenthesesSingle): - (JSC::Yarr::RegexGenerator::generateTerm): - (JSC::Yarr::RegexGenerator::generateDisjunction): - (JSC::Yarr::RegexGenerator::RegexGenerator): - (JSC::Yarr::RegexGenerator::generate): - (JSC::Yarr::jitCompileRegex): - (JSC::Yarr::executeRegex): - * yarr/RegexJIT.h: Added. - (JSC::Yarr::RegexCodeBlock::RegexCodeBlock): - * yarr/RegexParser.h: Added. - (JSC::Yarr::): - (JSC::Yarr::Parser::): - (JSC::Yarr::Parser::CharacterClassParserDelegate::CharacterClassParserDelegate): - (JSC::Yarr::Parser::CharacterClassParserDelegate::begin): - (JSC::Yarr::Parser::CharacterClassParserDelegate::atomPatternCharacterUnescaped): - (JSC::Yarr::Parser::CharacterClassParserDelegate::atomPatternCharacter): - (JSC::Yarr::Parser::CharacterClassParserDelegate::atomBuiltInCharacterClass): - (JSC::Yarr::Parser::CharacterClassParserDelegate::end): - (JSC::Yarr::Parser::CharacterClassParserDelegate::assertionWordBoundary): - (JSC::Yarr::Parser::CharacterClassParserDelegate::atomBackReference): - (JSC::Yarr::Parser::CharacterClassParserDelegate::flush): - (JSC::Yarr::Parser::CharacterClassParserDelegate::): - (JSC::Yarr::Parser::Parser): - (JSC::Yarr::Parser::parseEscape): - (JSC::Yarr::Parser::parseAtomEscape): - (JSC::Yarr::Parser::parseCharacterClassEscape): - (JSC::Yarr::Parser::parseCharacterClass): - (JSC::Yarr::Parser::parseParenthesesBegin): - (JSC::Yarr::Parser::parseParenthesesEnd): - (JSC::Yarr::Parser::parseQuantifier): - (JSC::Yarr::Parser::parseTokens): - (JSC::Yarr::Parser::parse): - (JSC::Yarr::Parser::saveState): - (JSC::Yarr::Parser::restoreState): - (JSC::Yarr::Parser::atEndOfPattern): - (JSC::Yarr::Parser::peek): - (JSC::Yarr::Parser::peekIsDigit): - (JSC::Yarr::Parser::peekDigit): - (JSC::Yarr::Parser::consume): - (JSC::Yarr::Parser::consumeDigit): - (JSC::Yarr::Parser::consumeNumber): - (JSC::Yarr::Parser::consumeOctal): - (JSC::Yarr::Parser::tryConsume): - (JSC::Yarr::Parser::tryConsumeHex): - (JSC::Yarr::parse): - * yarr/RegexPattern.h: Added. - (JSC::Yarr::CharacterRange::CharacterRange): - (JSC::Yarr::): - (JSC::Yarr::PatternTerm::): - (JSC::Yarr::PatternTerm::PatternTerm): - (JSC::Yarr::PatternTerm::BOL): - (JSC::Yarr::PatternTerm::EOL): - (JSC::Yarr::PatternTerm::WordBoundary): - (JSC::Yarr::PatternTerm::invert): - (JSC::Yarr::PatternTerm::capture): - (JSC::Yarr::PatternTerm::quantify): - (JSC::Yarr::PatternAlternative::PatternAlternative): - (JSC::Yarr::PatternAlternative::lastTerm): - (JSC::Yarr::PatternAlternative::removeLastTerm): - (JSC::Yarr::PatternDisjunction::PatternDisjunction): - (JSC::Yarr::PatternDisjunction::~PatternDisjunction): - (JSC::Yarr::PatternDisjunction::addNewAlternative): - (JSC::Yarr::RegexPattern::RegexPattern): - (JSC::Yarr::RegexPattern::~RegexPattern): - (JSC::Yarr::RegexPattern::reset): - (JSC::Yarr::RegexPattern::containsIllegalBackReference): - (JSC::Yarr::RegexPattern::newlineCharacterClass): - (JSC::Yarr::RegexPattern::digitsCharacterClass): - (JSC::Yarr::RegexPattern::spacesCharacterClass): - (JSC::Yarr::RegexPattern::wordcharCharacterClass): - (JSC::Yarr::RegexPattern::nondigitsCharacterClass): - (JSC::Yarr::RegexPattern::nonspacesCharacterClass): - (JSC::Yarr::RegexPattern::nonwordcharCharacterClass): - -2009-04-13 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (Missed code from last patch). - - * runtime/InternalFunction.cpp: - (JSC::InternalFunction::displayName): - (JSC::InternalFunction::calculatedDisplayName): - * runtime/InternalFunction.h: - -2009-04-13 Francisco Tolmasky <francisco@280north.com> +2009-05-26 Geoffrey Garen <ggaren@apple.com> Reviewed by Oliver Hunt. - BUG 25171: It should be possible to manually set the name of an anonymous function - <https://bugs.webkit.org/show_bug.cgi?id=25171> - - This change adds the displayName property to functions, which when set overrides the - normal name when appearing in the console. - - * profiler/Profiler.cpp: - (JSC::createCallIdentifierFromFunctionImp): Changed call to InternalFunction::name to InternalFunction::calculatedDisplayName - * runtime/CommonIdentifiers.h: Added displayName common identifier. - * runtime/InternalFunction.cpp: - (JSC::InternalFunction::displayName): Access to user settable displayName property - (JSC::InternalFunction::calculatedDisplayName): Returns displayName if it exists, if not then the natural name + Fixed a regression caused by my recent fix for NaN. -2009-04-13 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Disabled another JavaScriptCore test because it fails on Windows but - not Mac, so it makes the bots red. - - * tests/mozilla/expected.html: + * jit/JITArithmetic.cpp: + (JSC::JIT::emitBinaryDoubleOp): Actually do the comparison in reverse + order, like the ChangeLog said we would, bokay? -2009-04-13 Geoffrey Garen <ggaren@apple.com> +2009-05-26 Geoffrey Garen <ggaren@apple.com> - Reviewed by Sam Weinig. + Reviewed by Sam Weinig and Oliver Hunt. - Disabled two JavaScriptCore tests because they fail on Window or Mac but - not both, so they make the bots red. - - * tests/mozilla/expected.html: Updated expected results. - -2009-04-09 Ben Murdoch <benm@google.com> - - Reviewed by Alexey Proskuryakov. - - https://bugs.webkit.org/show_bug.cgi?id=25091 - The Android platform requires threads to be registered with the VM. - This patch implements this behaviour inside ThreadingPthreads.cpp. - - * wtf/ThreadingPthreads.cpp: Add a level above threadEntryPoint that takes care of (un)registering threads with the VM. - (WTF::runThreadWithRegistration): register the thread and run entryPoint. Unregister the thread afterwards. - (WTF::createThreadInternal): call runThreadWithRegistration instead of entryPoint directly. - -2009-04-09 David Kilzer <ddkilzer@apple.com> - - Reinstating <rdar://problem/6718589> Option to turn off SVG DOM Objective-C bindings - - Rolled r42345 back in. The build failure was caused by an - internal script which had not been updated the same way that - build-webkit was updated. - - * Configurations/JavaScriptCore.xcconfig: - -2009-04-09 Alexey Proskuryakov <ap@webkit.org> - - Reverting <rdar://problem/6718589> Option to turn off SVG DOM Objective-C bindings. - It broke Mac build, and I don't know how to fix it. - - * Configurations/JavaScriptCore.xcconfig: - -2009-04-09 Xan Lopez <xlopez@igalia.com> - - Unreviewed build fix. - - Checking for __GLIBCXX__ being bigger than some date is not enough - to get std::tr1, C++0x has to be in use too. Add another check for - __GXX_EXPERIMENTAL_CXX0X__. - - * wtf/TypeTraits.h: - -2009-04-08 Oliver Hunt <oliver@apple.com> - - Reviewed by Adam Roben. - - Fix assertion failure in function.apply - - The result of excess arguments to function.apply is irrelevant - so we don't need to provide a result register. We were providing - temporary result register but not ref'ing it resulting in an - assertion failure. - - * parser/Nodes.cpp: - (JSC::ApplyFunctionCallDotNode::emitBytecode): - -2009-04-08 David Kilzer <ddkilzer@apple.com> - - <rdar://problem/6718589> Option to turn off SVG DOM Objective-C bindings - - Reviewed by Darin Adler and Maciej Stachowiak. - - Introduce the ENABLE_SVG_DOM_OBJC_BINDINGS feature define so - that SVG DOM Objective-C bindings may be optionally disabled. - - * Configurations/JavaScriptCore.xcconfig: Added - ENABLE_SVG_DOM_OBJC_BINDINGS variable and use it in - FEATURE_DEFINES. - -2009-04-08 Paul Pedriana <ppedriana@ea.com> - - Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=20422 - Allow custom memory allocation control. + Fixed two edge cases in %: - * wtf/FastAllocBase.h: - New added file. Implements allocation base class. - * wtf/TypeTraits.h: - Augments existing type traits support as needed by FastAllocBase. - * wtf/FastMalloc.h: - Changed to support FastMalloc match validation. - * wtf/FastMalloc.cpp: - Changed to support FastMalloc match validation. - * wtf/Platform.h: - Added ENABLE_FAST_MALLOC_MATCH_VALIDATION; defaults to 0. - * GNUmakefile.am: - Updated to include added FastAllocBase.h. - * JavaScriptCore.xcodeproj/project.pbxproj: - Updated to include added FastAllocBase.h. - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - Updated to include added FastAllocBase.h. - -2009-04-07 Oliver Hunt <oliver@apple.com> - - Reviewed by Geoff Garen. - - Improve function.apply performance - - Jump through a few hoops to improve performance of function.apply in the general case. - - In the case of zero or one arguments, or if there are only two arguments and the - second is an array literal we treat function.apply as function.call. - - Otherwise we use the new opcodes op_load_varargs and op_call_varargs to do the .apply call - without re-entering the virtual machine. - - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::dump): - * bytecode/Opcode.h: - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::emitJumpIfNotFunctionApply): - (JSC::BytecodeGenerator::emitLoadVarargs): - (JSC::BytecodeGenerator::emitCallVarargs): - * bytecompiler/BytecodeGenerator.h: - * interpreter/Interpreter.cpp: - (JSC::Interpreter::privateExecute): - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): - * jit/JIT.h: - * jit/JITCall.cpp: - (JSC::JIT::compileOpCallSetupArgs): - (JSC::JIT::compileOpCallVarargsSetupArgs): - (JSC::JIT::compileOpCallVarargs): - (JSC::JIT::compileOpCallVarargsSlowCase): - * jit/JITStubs.cpp: - (JSC::JITStubs::cti_op_load_varargs): - * jit/JITStubs.h: - * parser/Grammar.y: - * parser/Nodes.cpp: - (JSC::ArrayNode::isSimpleArray): - (JSC::ArrayNode::toArgumentList): - (JSC::CallFunctionCallDotNode::emitBytecode): - (JSC::ApplyFunctionCallDotNode::emitBytecode): - * parser/Nodes.h: - (JSC::ExpressionNode::): - (JSC::ApplyFunctionCallDotNode::): - * runtime/Arguments.cpp: - (JSC::Arguments::copyToRegisters): - (JSC::Arguments::fillArgList): - * runtime/Arguments.h: - (JSC::Arguments::numProvidedArguments): - * runtime/FunctionPrototype.cpp: - (JSC::FunctionPrototype::addFunctionProperties): - * runtime/FunctionPrototype.h: - * runtime/JSArray.cpp: - (JSC::JSArray::copyToRegisters): - * runtime/JSArray.h: - * runtime/JSGlobalObject.cpp: - (JSC::JSGlobalObject::reset): - (JSC::JSGlobalObject::mark): - * runtime/JSGlobalObject.h: - -2009-04-08 Alexey Proskuryakov <ap@webkit.org> - - Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=25073 - JavaScriptCore tests don't run if time zone is not PST - - * API/tests/testapi.c: - (timeZoneIsPST): Added a function that checks whether the time zone is PST, using the same - method as functions in DateMath.cpp do for formatting the result. - (main): Skip date string format test if the time zone is not PST. - -2009-04-07 David Levin <levin@chromium.org> - - Reviewed by Sam Weinig and Geoff Garen. - - https://bugs.webkit.org/show_bug.cgi?id=25039 - UString refactoring to support UChar* sharing. - - No change in sunspider perf. - - * runtime/SmallStrings.cpp: - (JSC::SmallStringsStorage::SmallStringsStorage): - * runtime/UString.cpp: - (JSC::initializeStaticBaseString): - (JSC::initializeUString): - (JSC::UString::BaseString::isShared): - Encapsulate the meaning behind the refcount == 1 checks because - this needs to do slightly more when sharing is added. - (JSC::concatenate): - (JSC::UString::append): - (JSC::UString::operator=): - * runtime/UString.h: - Make m_baseString part of a union to get rid of casts, but make it protected because - it is tricky to use it correctly since it is only valid when the Rep is not a BaseString. - The void* will be filled in when sharing is added. - - Add constructors due to the making members protected and it make ensuring proper - initialization work better (like in SmallStringsStorage). - (JSC::UString::Rep::create): - (JSC::UString::Rep::Rep): - (JSC::UString::Rep::): - (JSC::UString::BaseString::BaseString): - (JSC::UString::Rep::setBaseString): - (JSC::UString::Rep::baseString): - -2009-04-04 Xan Lopez <xlopez@igalia.com> - - Reviewed by Alexey Proskuryakov. - - https://bugs.webkit.org/show_bug.cgi?id=25033 - dtoa.cpp segfaults with g++ 4.4.0 - - g++ 4.4.0 seems to be more strict about aliasing rules, so it - produces incorrect code if dtoa.cpp is compiled with - -fstrict-aliasing (it also emits a ton of warnings, so fair enough - I guess). The problem was that we were only casting variables to - union types in order to do type punning, but GCC and the C - standard require that we actually use a union to store the value. - - This patch does just that, the code is mostly copied from the dtoa - version in GCC: - http://gcc.gnu.org/viewcvs/trunk/libjava/classpath/native/fdlibm/dtoa.c?view=markup. - - * wtf/dtoa.cpp: - (WTF::ulp): - (WTF::b2d): - (WTF::ratio): - (WTF::hexnan): - (WTF::strtod): - (WTF::dtoa): - -2009-04-04 Kevin Ollivier <kevino@theolliviers.com> - - wx build fix for Win port. Build the assembler sources to get missing functions. - - * JavaScriptCoreSources.bkl: - * jscore.bkl: - * wtf/Platform.h: - -2009-04-02 Darin Adler <darin@apple.com> - - Reviewed by Kevin Decker. - - <rdar://problem/6744471> crash in GC due to uninitialized callFunction pointer - - * runtime/JSGlobalObject.h: - (JSC::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData): Initialize - callFunction as we do the other data members that are used in the mark function. - -2009-04-02 Yael Aharon <yael.aharon@nokia.com> - - Reviewed by Simon Hausmann - - https://bugs.webkit.org/show_bug.cgi?id=24490 - - Implement WTF::ThreadSpecific in the Qt build using - QThreadStorage. - - * wtf/ThreadSpecific.h: - -2009-04-01 Greg Bolsinga <bolsinga@apple.com> - - Reviewed by Mark Rowe. - - https://bugs.webkit.org/show_bug.cgi?id=24990 - Put SECTORDER_FLAGS into xcconfig files. - - * Configurations/Base.xcconfig: - * Configurations/DebugRelease.xcconfig: - * JavaScriptCore.xcodeproj/project.pbxproj: - -2009-03-27 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (Build fix). + - Don't do -2147483648 % x as a fast case, since you might do -2147483648 % -1, + which will signal a hardware exception due to overflow. - Fix non-AllInOneFile builds. - - * bytecompiler/BytecodeGenerator.cpp: - -2009-03-27 Oliver Hunt <oliver@apple.com> - - Reviewed by Gavin Barraclough. - - Improve performance of Function.prototype.call - <https://bugs.webkit.org/show_bug.cgi?id=24907> - - Optimistically assume that expression.call(..) is going to be a call to - Function.prototype.call, and handle it specially to attempt to reduce the - degree of VM reentrancy. - - When everything goes right this removes the vm reentry improving .call() - by around a factor of 10. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::dump): - * bytecode/Opcode.h: - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::emitJumpIfNotFunctionCall): - * bytecompiler/BytecodeGenerator.h: - * interpreter/Interpreter.cpp: - (JSC::Interpreter::privateExecute): - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - * parser/Grammar.y: - * parser/Nodes.cpp: - (JSC::CallFunctionCallDotNode::emitBytecode): - * parser/Nodes.h: - (JSC::CallFunctionCallDotNode::): - * runtime/FunctionPrototype.cpp: - (JSC::FunctionPrototype::addFunctionProperties): - * runtime/FunctionPrototype.h: - * runtime/JSGlobalObject.cpp: - (JSC::JSGlobalObject::reset): - (JSC::JSGlobalObject::mark): - * runtime/JSGlobalObject.h: - -2009-03-27 Laszlo Gombos <laszlo.1.gombos@nokia.com> - - Reviewed by Darin Adler. - - Bug 24884: Include strings.h for strcasecmp() - https://bugs.webkit.org/show_bug.cgi?id=24884 - - * runtime/DateMath.cpp: Reversed previous change including strings.h - * wtf/StringExtras.h: Include strings.h here is available - -2009-03-26 Adam Roben <aroben@apple.com> - - Copy testapi.js to $WebKitOutputDir on Windows - - Part of Bug 24856: run-javascriptcore-tests should run testapi on - Windows - <https://bugs.webkit.org/show_bug.cgi?id=24856> - - This matches what Mac does, which will help once we enable running - testapi from run-javascriptcore-tests on Windows. - - Reviewed by Steve Falkenburg. - - * JavaScriptCore.vcproj/testapi/testapi.vcproj: Copy testapi.js next - to testapi.exe. - -2009-03-25 Oliver Hunt <oliver@apple.com> - - Reviewed by Geoff Garen. - - Fix exception handling for instanceof in the interpreter. - - * interpreter/Interpreter.cpp: - (JSC::Interpreter::privateExecute): - -2009-03-25 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Cameron Zwarich. + - In the case of a zero remainder, be sure to store negative zero if the + dividend was zero. - Fixed <rdar://problem/6724011> Write to freed memory in JSC::Label::deref - when reloading http://helpme.att.net/speedtest/ - - * bytecompiler/BytecodeGenerator.h: Reversed the declaration order for - m_labelScopes and m_labels to reverse their destruction order. - m_labelScopes has references to memory within m_labels, so its destructor - needs to run first. - -2009-03-24 Eli Fidler <eli.fidler@torchmobile.com> - - Reviewed by George Staikos. - - Correct warnings which in some environments are treated as errors. + SunSpider reports no change. - * wtf/dtoa.cpp: - (WTF::b2d): - (WTF::d2b): - (WTF::strtod): - (WTF::dtoa): + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_mod): + (JSC::JIT::emitSlow_op_mod): -2009-03-24 Kevin Ollivier <kevino@theolliviers.com> +2009-05-25 Geoffrey Garen <ggaren@apple.com> - Reviewed by Darin Adler. - - Explicitly define HAVE_LANGINFO_H on Darwin. Fixes the wx build bot jscore - test failure. + Reviewed by Maciej Stachowiak. - https://bugs.webkit.org/show_bug.cgi?id=24780 - - * wtf/Platform.h: - -2009-03-23 Oliver Hunt <oliver@apple.com> - - Reviewed by Cameron Zwarich. - - Fix className() for API defined class - - * API/JSCallbackObjectFunctions.h: - (JSC::::className): - * API/tests/testapi.c: - (EmptyObject_class): - (main): - * API/tests/testapi.js: - -2009-03-23 Oliver Hunt <oliver@apple.com> - - Reviewed by Geoff Garen. - - Make testapi assertions run in release builds, so that testapi actually - works in a release build. - - Many of the testapi assertions have side effects that are necessary, and - given testapi is a testing program, perf impact of an assertion is not - important, so it makes sense to apply the assertions in release builds - anyway. - - * API/tests/testapi.c: - (EvilExceptionObject_hasInstance): - -2009-03-23 David Kilzer <ddkilzer@apple.com> - - Provide JavaScript exception information after slow script timeout - - Reviewed by Oliver Hunt. - - * runtime/Completion.cpp: - (JSC::evaluate): Set the exception object as the Completion - object's value for slow script timeouts. This is used in - WebCore when reporting the exception. - * runtime/ExceptionHelpers.cpp: - (JSC::InterruptedExecutionError::toString): Added. Provides a - description message for the exception when it is reported. - -2009-03-23 Gustavo Noronha Silva <gns@gnome.org> and Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com> - - Reviewed by Adam Roben. - - https://bugs.webkit.org/show_bug.cgi?id=24674 - Crashes in !PLATFORM(MAC)'s formatLocaleDate, in very specific situations - - Make sure strftime never returns 2-digits years to avoid ambiguity - and a crash. We wrap this new code option in HAVE_LANGINFO_H, - since it is apparently not available in all platforms. - - * runtime/DatePrototype.cpp: - (JSC::formatLocaleDate): - * wtf/Platform.h: + Fixed a regression when comparing to NaN. -2009-03-22 Oliver Hunt <oliver@apple.com> - - Reviewed by Cameron Zwarich. - - Fix exception handling in API - - We can't just use the ExecState exception slot for returning exceptions - from class introspection functions provided through the API as many JSC - functions will explicitly clear the ExecState exception when returning. - - * API/JSCallbackObjectFunctions.h: - (JSC::JSCallbackObject<Base>::getOwnPropertySlot): - (JSC::JSCallbackObject<Base>::put): - (JSC::JSCallbackObject<Base>::deleteProperty): - (JSC::JSCallbackObject<Base>::construct): - (JSC::JSCallbackObject<Base>::hasInstance): - (JSC::JSCallbackObject<Base>::call): - (JSC::JSCallbackObject<Base>::toNumber): - (JSC::JSCallbackObject<Base>::toString): - (JSC::JSCallbackObject<Base>::staticValueGetter): - (JSC::JSCallbackObject<Base>::callbackGetter): - * API/tests/testapi.c: - (MyObject_hasProperty): - (MyObject_getProperty): - (MyObject_setProperty): - (MyObject_deleteProperty): - (MyObject_callAsFunction): - (MyObject_callAsConstructor): - (MyObject_hasInstance): - (EvilExceptionObject_hasInstance): - (EvilExceptionObject_convertToType): - (EvilExceptionObject_class): - (main): - * API/tests/testapi.js: - (EvilExceptionObject.hasInstance): - (EvilExceptionObject.toNumber): - (EvilExceptionObject.toStringExplicit): + * jit/JITArithmetic.cpp: + (JSC::JIT::emitBinaryDoubleOp): For op_jnless and op_jnless_eq, do the + comparison in reverse order, and jump if the result is below or + below-or-equal. This ensures that we do jump in the case of NaN. -2009-03-21 Cameron Zwarich <cwzwarich@uwaterloo.ca> +2009-05-25 Geoffrey Garen <ggaren@apple.com> Reviewed by Oliver Hunt. + + SunSpider says no change. + + Fixed regressions in fast/js/var-declarations-shadowing.html and + fast/js/equality.html, caused by recent == and != optimizations. - Bug 20049: testapi failure: MyObject - 0 should be NaN but instead is 1. - <https://bugs.webkit.org/show_bug.cgi?id=20049> - <rdar://problem/6079127> - - In this case, the test is wrong. According to the ECMA spec, subtraction - uses ToNumber, not ToPrimitive. Change the test to match the spec. - - * API/tests/testapi.js: - -2009-03-21 Oliver Hunt <oliver@apple.com> - - Reviewed by Cameron Zwarich. - - Ensure that JSObjectMakeFunction doesn't produce incorrect line numbers. - - Also make test api correctly propagate failures. - - * API/tests/testapi.c: - (main): - * runtime/FunctionConstructor.cpp: - (JSC::constructFunction): + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_op_eq): Don't treat "compare to string" as always + numeric or string comparison. If the second operand is an object, you + need to ToPrimitive it, and start all over again. Also, I wrote out each + of the possible cases explicitly, to cut down on redundant branching. -2009-03-21 Oliver Hunt <oliver@apple.com> +2009-05-25 Sam Weinig <sam@webkit.org> Reviewed by Mark Rowe. - Improve testapi by making it report failures in a way we can pick up - from our test scripts. + Fix bug in fast/js/constant-folding.html where we were not negating + -0 properly. - * API/tests/testapi.c: - (assertEqualsAsBoolean): - (assertEqualsAsNumber): - (assertEqualsAsUTF8String): - (assertEqualsAsCharactersPtr): - (main): - * API/tests/testapi.js: - (pass): - (fail): - (shouldBe): - (shouldThrow): - -2009-03-20 Norbert Leser <norbert.leser@nokia.com> - - Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=24535 - - Fixes missing line terminator character (;) after macro call. - It is common practice to add the trailing ";" where macros are substituted - and not where they are defined with #define. - This change is consistent with other macro declarations across webkit, - and it also solves compilation failure with symbian compilers. - - * runtime/UString.cpp: - * wtf/Assertions.h: - -2009-03-20 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Darin Adler. - - Fixed a JavaScriptCore crash on the Windows buildbot. - - * bytecompiler/BytecodeGenerator.h: Reduced the AST recursion limit. - Apparently, Windows has small stacks. + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_negate): -2009-03-20 Geoffrey Garen <ggaren@apple.com> +2009-05-23 Geoffrey Garen <ggaren@apple.com> Reviewed by Oliver Hunt. - A little cleanup in the RegisterFile code. - - Moved large inline functions out of the class declaration, to make it - more readable. - - Switched over to using the roundUpAllocationSize function to avoid - duplicate code and subtle bugs. + Refactored new slow case codegen for == and !=. - Renamed m_maxCommitted to m_commitEnd, to match m_end. - - Renamed allocationSize to commitSize because it's the chunk size for - committing memory, not allocating memory. - - SunSpider reports no change. + SunSpider reports no change, maybe a tiny speedup. - * interpreter/RegisterFile.h: - (JSC::RegisterFile::RegisterFile): - (JSC::RegisterFile::shrink): - (JSC::RegisterFile::grow): - * jit/ExecutableAllocator.h: - (JSC::roundUpAllocationSize): + * jit/JITOpcodes.cpp: + (JSC::JIT::emitSlow_op_eq): + (JSC::JIT::emitSlow_op_neq): Made a vptr comparison a *Ptr operation, + instead of *32, to make it portable to 64bit. Reorganized the string + and generic cases to make their control flow a little clearer. -2009-03-19 Geoffrey Garen <ggaren@apple.com> +2009-05-23 Geoffrey Garen <ggaren@apple.com> - Reviewed by Oliver Hunt. - - Fixed <rdar://problem/6033712> -- a little bit of hardening in the Collector. + Reviewed by Maciej Stachowiak. - SunSpider reports no change. I also verified in the disassembly that - we end up with a single compare to constant. - - * runtime/Collector.cpp: - (JSC::Heap::heapAllocate): - -2009-03-19 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Cameron Zwarich and Oliver Hunt. - - Fixed <rdar://problem/6406045> REGRESSION: Stack overflow on PowerPC on - fast/workers/use-machine-stack.html (22531) - - Dialed down the re-entry allowance to 64 (from 128). + Optimized == and != for our new value representation -- especially for strings. - On a 512K stack, this leaves about 64K for other code on the stack while - JavaScript is running. Not perfect, but it solves our crash on PPC. - - Different platforms may want to dial this down even more. - - Also, substantially shrunk BytecodeGenerator. Since we allocate one on - the stack in order to throw a stack overflow exception -- well, let's - just say the old code had an appreciation for irony. + 14% speedup on date-format-tofte. - SunSpider reports no change. - - * bytecompiler/BytecodeGenerator.h: - * interpreter/Interpreter.h: + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_eq): + (JSC::JIT::emitSlow_op_eq): + (JSC::JIT::emit_op_neq): + (JSC::JIT::emitSlow_op_neq): + * jit/JITStubCall.h: + (JSC::JITStubCall::JITStubCall): + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_op_eq): + (JSC::JITStubs::cti_op_eq_strings): + (JSC::JITStubs::cti_op_call_eval): + * jit/JITStubs.h: (JSC::): + * runtime/JSValue.h: -2009-03-19 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Oliver Hunt. - - Bug 24350: REGRESSION: Safari 4 breaks SPAW wysiwyg editor multiple instances - <https://bugs.webkit.org/show_bug.cgi?id=24350> - <rdar://problem/6674182> - - The SPAW editor's JavaScript assumes that toString() on a function - constructed with the Function constructor produces a function with - a newline after the opening brace. - - * runtime/FunctionConstructor.cpp: - (JSC::constructFunction): Add a newline after the opening brace of the - function's source code. - -2009-03-19 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Geoff Garen. - - Bug 23771: REGRESSION (r36016): JSObjectHasProperty freezes on global class without kJSClassAttributeNoAutomaticPrototype - <https://bugs.webkit.org/show_bug.cgi?id=23771> - <rdar://problem/6561016> - - * API/tests/testapi.c: - (main): Add a test for this bug. - * runtime/JSGlobalObject.cpp: - (JSC::JSGlobalObject::resetPrototype): Don't set the prototype of the - last object in the prototype chain to the object prototype when the - object prototype is already the last object in the prototype chain. - -2009-03-19 Timothy Hatcher <timothy@apple.com> - - <rdar://problem/6687342> -[WebView scheduleInRunLoop:forMode:] has no affect on timers - - Reviewed by Darin Adler. - - * wtf/Platform.h: Added HAVE_RUNLOOP_TIMER for PLATFORM(MAC). +2009-05-22 Sam Weinig <sam@webkit.org> -2009-03-19 Geoffrey Garen <ggaren@apple.com> + Reviewed by Gavin Barraclough. - Reviewed by Oliver Hunt. - - Fixed <rdar://problem/6279213> Regular expression run-time complexity - limit too low for long inputs (21485) - - I raised PCRE's "matchLimit" (limit on backtracking) by an order of - magnitude. This fixes all the reported examples of timing out on legitimate - regular expression matches. - - In my testing on a Core Duo MacBook Pro, the longest you can get stuck - trying to match a string is still under 1s, so this seems like a safe change. - - I can think of a number of better solutions that are more complicated, - but this is a good improvement for now. + Fix non-SSE enabled builds. - * pcre/pcre_exec.cpp: + * jit/JITArithmetic.cpp: + (JSC::JIT::emitSlow_op_add): Don't early return here, we still need to call the JIT stub. + (JSC::JIT::emitSlow_op_sub): Ditto. -2009-03-19 Geoffrey Garen <ggaren@apple.com> +2009-05-22 Geoffrey Garen <ggaren@apple.com> Reviewed by Sam Weinig. - Fixed <rdar://problem/6603562> REGRESSION (Safari 4): regular expression - pattern size limit lower than Safari 3.2, other browsers, breaks SAP (14873) - - Bumped the pattern size limit to 1MB, and standardized it between PCRE - and WREC. (Empirical testing says that we can easily compile a 1MB regular - expression without risking a hang. Other browsers support bigger regular - expressions, but also hang.) + Here's a thought: let's not take a jit stub call just to multiply by 1, + bokay? - SunSpider reports no change. - - I started with a patch posted to Bugzilla by Erik Corry (erikcorry@google.com). - - * pcre/pcre_internal.h: - (put3ByteValue): - (get3ByteValue): - (put3ByteValueAndAdvance): - (putLinkValueAllowZero): - (getLinkValueAllowZero): Made PCRE's "LINK_SIZE" (the number of bytes - used to record jumps between bytecodes) 3, to accomodate larger potential - jumps. Bumped PCRE's "MAX_PATTERN_SIZE" to 1MB. (Technically, at this - LINK_SIZE, we can support even larger patterns, but we risk a hang during - compilation, and it's not clear that such large patterns are important - on the web.) - - * wrec/WREC.cpp: - (JSC::WREC::Generator::compileRegExp): Match PCRE's maximum pattern size, - to avoid quirks between platforms. - -2009-03-18 Ada Chan <adachan@apple.com> - - Rolling out r41818 since it broke the windows build. - Error: ..\..\runtime\DatePrototype.cpp(30) : fatal error C1083: Cannot open include file: 'langinfo.h': No such file or directory - - * runtime/DatePrototype.cpp: - (JSC::formatLocaleDate): + imul doesn't set the zero flag, so to test for a zero result, we need + an explicit instruction. (Luckily, it does set the overflow flag, so + we can still use that.) -2009-03-17 Oliver Hunt <oliver@apple.com> + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_mul): + (JSC::JIT::emitSlow_op_mul): + (JSC::JIT::emitMul32InPlace): - Reviewed by Cameron Zwarich. +2009-05-22 Sam Weinig <sam@webkit.org> - <rdar://problem/6692138> REGRESSION (Safari 4): Incorrect function return value when using IE "try ... finally" memory leak work-around (24654) - <https://bugs.webkit.org/show_bug.cgi?id=24654> + Reviewed by Geoffrey "Premature Commit" Garen. - If the return value for a function is in a local register we need - to copy it before executing any finalisers, otherwise it is possible - for the finaliser to clobber the result. + Add back constant integer cases for op_add. - * bytecompiler/BytecodeGenerator.h: - (JSC::BytecodeGenerator::hasFinaliser): - * parser/Nodes.cpp: - (JSC::ReturnNode::emitBytecode): + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_add): + (JSC::JIT::emitAdd32Constant): + (JSC::JIT::emitSlow_op_add): + (JSC::JIT::emitSlowAdd32Constant): + * jit/JITInlineMethods.h: + (JSC::JIT::getConstantOperandImmediateDouble): + (JSC::JIT::isOperandConstantImmediateDouble): -2009-03-17 Kevin Ollivier <kevino@theolliviers.com> +2009-05-22 Geoffrey Garen <ggaren@apple.com> - Reviewed by Mark Rowe. + Reviewed by Sam Weinig. - Move BUILDING_ON_* defines into Platform.h to make them available to other ports. - Also tweak the defines so that they work with the default values set by - AvailabilityMacros.h. - - https://bugs.webkit.org/show_bug.cgi?id=24630 - - * JavaScriptCorePrefix.h: - * wtf/Platform.h: - -2009-03-15 Simon Fraser <simon.fraser@apple.com> - - Revert r41718 because it broke DumpRenderTree on Tiger. - - * JavaScriptCorePrefix.h: - * wtf/Platform.h: - -2009-03-15 Kevin Ollivier <kevino@theolliviers.com> - - Non-Apple Mac ports build fix. Move defines for the BUILDING_ON_ macros into - Platform.h so that they're defined for all ports building on Mac, and tweak - the definitions of those macros based on Mark Rowe's suggestions to accomodate - cases where the values may not be <= to the .0 release for that version. - - * JavaScriptCorePrefix.h: - * wtf/Platform.h: - -2009-03-13 Mark Rowe <mrowe@apple.com> - - Rubber-stamped by Dan Bernstein. - - Take advantage of the ability of recent versions of Xcode to easily switch the active - architecture. - - * Configurations/DebugRelease.xcconfig: - -2009-03-13 Mark Rowe <mrowe@apple.com> - - Reviewed by David Kilzer. - - Prevent AllInOneFile.cpp and ProfileGenerator.cpp from rebuilding unnecessarily when - switching between building in Xcode and via build-webkit. - - build-webkit passes FEATURE_DEFINES to xcodebuild, resulting in it being present in the - Derived Sources build settings. When building in Xcode, this setting isn't present so - Xcode reruns the script build phases. This results in a new version of TracingDtrace.h - being generated, and the files that include it being rebuilt. - - * JavaScriptCore.xcodeproj/project.pbxproj: Don't regenerate TracingDtrace.h if it is - already newer than the input file. - -2009-03-13 Norbert Leser <norbert.leser@nokia.com> - - Reviewed by Darin Adler. - - Resolved name conflict with globally defined tzname in Symbian. - Replaced with different name instead of using namespace qualifier - (appeared to be less clumsy). - - * runtime/DateMath.cpp: - -2009-03-12 Mark Rowe <mrowe@apple.com> - - Reviewed by Darin Adler. - - <rdar://problem/6548446> TCMalloc_SystemRelease should use madvise rather than re-mmaping span of pages - - * wtf/FastMalloc.cpp: - (WTF::mergeDecommittedStates): If either of the spans has been released to the system, release the other - span as well so that the flag in the merged span is accurate. - * wtf/Platform.h: - * wtf/TCSystemAlloc.cpp: Track decommitted spans when using MADV_FREE_REUSABLE / MADV_FREE_REUSE. - (TCMalloc_SystemRelease): Use madvise with MADV_FREE_REUSABLE when it is available. - (TCMalloc_SystemCommit): Use madvise with MADV_FREE_REUSE when it is available. - * wtf/TCSystemAlloc.h: - -2009-03-12 Adam Treat <adam.treat@torchmobile.com> - - Reviewed by NOBODY (Build fix). - - Include string.h for strlen usage. - - * wtf/Threading.cpp: - -2009-03-12 David Kilzer <ddkilzer@apple.com> - - Add NO_RETURN attribute to runInteractive() when not using readline - - Reviewed by Darin Adler. - - * jsc.cpp: - (runInteractive): If the readline library is not used, this method - will never return, thus the NO_RETURN attribute is needed to prevent - a gcc warning. - -2009-03-12 Adam Roben <aroben@apple.com> - - Adopt setThreadNameInternal on Windows - - Also changed a Windows-only assertion about thread name length to an - all-platform log message. - - Reviewed by Adam Treat. - - * wtf/Threading.cpp: - (WTF::createThread): Warn if the thread name is longer than 31 - characters, as Visual Studio will truncate names longer than that - length. - - * wtf/ThreadingWin.cpp: - (WTF::setThreadNameInternal): Renamed from setThreadName and changed - to always operate on the current thread. - (WTF::initializeThreading): Changed to use setThreadNameInternal. - (WTF::createThreadInternal): Removed call to setThreadName. This is - now handled by threadEntryPoint and setThreadNameInternal. - -2009-03-11 David Kilzer <ddkilzer@apple.com> - - Clarify comments regarding order of FEATURE_DEFINES - - Rubber-stamped by Mark Rowe. - - * Configurations/JavaScriptCore.xcconfig: Added warning about - the consequences when FEATURE_DEFINES are not kept in sync. - -2009-03-11 Dan Bernstein <mitz@apple.com> - - Reviewed by Darin Adler. - - - WTF support for fixing <rdar://problem/3919124> Thai text selection - in Safari is incorrect - - * wtf/unicode/icu/UnicodeIcu.h: - (WTF::Unicode::hasLineBreakingPropertyComplexContext): Added. Returns - whether the character has Unicode line breaking property value SA - ("Complex Context"). - * wtf/unicode/qt4/UnicodeQt4.h: - (WTF::Unicode::hasLineBreakingPropertyComplexContext): Added an - implementation that always returns false. - -2009-03-11 Darin Adler <darin@apple.com> - - Reviewed by Mark Rowe. - - Give threads names on platforms with pthread_setname_np. + Added fast double cases for op_jnless and op_jnlesseq. - * wtf/Threading.cpp: - (WTF::NewThreadContext::NewThreadContext): Initialize thread name. - (WTF::threadEntryPoint): Call setThreadNameInternal. - (WTF::createThread): Pass thread name. - - * wtf/Threading.h: Added new comments, setThreadNameInternal. - - * wtf/ThreadingGtk.cpp: - (WTF::setThreadNameInternal): Added. Empty. - * wtf/ThreadingNone.cpp: - (WTF::setThreadNameInternal): Added. Empty. - * wtf/ThreadingPthreads.cpp: - (WTF::setThreadNameInternal): Call pthread_setname_np when available. - * wtf/ThreadingQt.cpp: - (WTF::setThreadNameInternal): Added. Empty. - * wtf/ThreadingWin.cpp: - (WTF::setThreadNameInternal): Added. Empty. - -2009-03-11 Adam Roben <aroben@apple.com> - - Change the Windows implementation of ThreadSpecific to use functions - instead of extern globals - - This will make it easier to export ThreadSpecific from WebKit. - - Reviewed by John Sullivan. - - * API/JSBase.cpp: - (JSEvaluateScript): - Touched this file to force ThreadSpecific.h to be copied into - $WebKitOutputDir. - - * wtf/ThreadSpecific.h: Replaced g_tls_key_count with tlsKeyCount() - and g_tls_keys with tlsKeys(). - - (WTF::::ThreadSpecific): - (WTF::::~ThreadSpecific): - (WTF::::get): - (WTF::::set): - (WTF::::destroy): - Updated to use the new functions. - - * wtf/ThreadSpecificWin.cpp: - (WTF::tlsKeyCount): - (WTF::tlsKeys): - Added. - - (WTF::ThreadSpecificThreadExit): Changed to use the new functions. - -2009-03-10 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Geoff Garen. + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::JumpList::jumps): New accesor, used by + addSlowCase. - Bug 24291: REGRESSION (r38635): Single line JavaScript comment prevents HTML button click handler execution - <https://bugs.webkit.org/show_bug.cgi?id=24291> - <rdar://problem/6663472> + * assembler/X86Assembler.h: + (JSC::X86Assembler::ucomisd_rm): New method for comparing register to + memory. - Add an extra newline to the end of the body of the program text constructed - by the Function constructor for parsing. This allows single line comments to - be handled correctly by the parser. + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_jnless): + (JSC::JIT::emitSlow_op_jnless): + (JSC::JIT::emit_op_jnlesseq): + (JSC::JIT::emitSlow_op_jnlesseq): + (JSC::JIT::emit_op_add): + (JSC::JIT::emit_op_sub): + (JSC::JIT::emitBinaryDoubleOp): + (JSC::JIT::emit_op_mul): + (JSC::JIT::emit_op_div): Modified emitBinaryDoubleOp to accept comparison/jump + operations in addition to operations with explicit result registers. - * runtime/FunctionConstructor.cpp: - (JSC::constructFunction): + * jit/JITInlineMethods.h: + (JSC::JIT::addSlowCase): Added an "addSlowCase" for JumpLists, so clients + can track multiple jumps to the same slow case condition together. -2009-03-09 Oliver Hunt <oliver@apple.com> +2009-05-21 Sam Weinig <sam@webkit.org> Reviewed by Gavin Barraclough. - Bug 24447: REGRESSION (r41508): Google Maps does not complete initialization - <rdar://problem/6657774> - - r41508 actually exposed a pre-existing bug where we were not invalidating the result - register cache at jump targets. This causes problems when condition loads occur in an - expression -- namely through the ?: and || operators. This patch corrects these issues - by marking the target of all forward jumps as being a jump target, and then clears the - result register cache when ever it starts generating code for a targeted instruction. - - I do not believe it is possible to cause this class of failure outside of a single - expression, and expressions only provide forward branches, so this should resolve this - entire class of bug. That said i've included a test case that gets as close as possible - to hitting this bug with a back branch, to hopefully prevent anyone from introducing the - problem in future. + Implement op_negate inline fast cases. - * assembler/AbstractMacroAssembler.h: - (JSC::AbstractMacroAssembler::Label::isUsed): - (JSC::AbstractMacroAssembler::Label::used): + * assembler/MacroAssemblerX86Common.h: + (JSC::MacroAssemblerX86Common::neg32): * assembler/X86Assembler.h: - (JSC::X86Assembler::JmpDst::JmpDst): - (JSC::X86Assembler::JmpDst::isUsed): - (JSC::X86Assembler::JmpDst::used): + (JSC::X86Assembler::): + (JSC::X86Assembler::negl_m): + (JSC::X86Assembler::xorpd_rr): * jit/JIT.cpp: (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_negate): + (JSC::JIT::emitSlow_op_negate): -2009-03-09 David Levin <levin@chromium.org> - - Reviewed by Darin Adler. - - Bug 23175: String and UString should be able to share a UChar* buffer. - <https://bugs.webkit.org/show_bug.cgi?id=23175> - - Add CrossThreadRefCounted. - - * wtf/CrossThreadRefCounted.h: Added. - (WTF::CrossThreadRefCounted::create): - (WTF::CrossThreadRefCounted::isShared): - (WTF::CrossThreadRefCounted::dataAccessMustBeThreadSafe): - (WTF::CrossThreadRefCounted::mayBePassedToAnotherThread): - (WTF::CrossThreadRefCounted::CrossThreadRefCounted): - (WTF::CrossThreadRefCounted::~CrossThreadRefCounted): - (WTF::CrossThreadRefCounted::ref): - (WTF::CrossThreadRefCounted::deref): - (WTF::CrossThreadRefCounted::release): - (WTF::CrossThreadRefCounted::copy): - (WTF::CrossThreadRefCounted::threadSafeDeref): - * wtf/RefCounted.h: - * wtf/Threading.h: - (WTF::ThreadSafeSharedBase::ThreadSafeSharedBase): - (WTF::ThreadSafeSharedBase::derefBase): - (WTF::ThreadSafeShared::ThreadSafeShared): - (WTF::ThreadSafeShared::deref): - -2009-03-09 Laszlo Gombos <laszlo.1.gombos@nokia.com> - - Reviewed by George Staikos. - - https://bugs.webkit.org/show_bug.cgi?id=24353 - Allow to overrule default build options for Qt build. - - * JavaScriptCore.pri: Allow to overrule ENABLE_JIT - -2009-03-08 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (build fix). - - Build fix. - - * runtime/ArrayPrototype.cpp: - (JSC::arrayProtoFuncConcat): - -2009-03-01 Oliver Hunt <oliver@apple.com> - - Reviewed by Cameron Zwarich. - - Bug 24268: RuntimeArray is not a fully implemented JSArray - <https://bugs.webkit.org/show_bug.cgi?id=24268> - - Don't cast a type to JSArray, just because it reportsArray as a supertype - in the JS type system. Doesn't appear feasible to create a testcase - unfortunately as setting up the failure conditions requires internal access - to JSC not present in DRT. - - * runtime/ArrayPrototype.cpp: - (JSC::arrayProtoFuncConcat): - -2009-03-06 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - When preforming an op_mov, preserve any existing register mapping. - - ~0.5% progression on v8 tests x86-64. +2009-05-20 Sam Weinig <sam@webkit.org> - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): + Reviewed by Gavin Barraclough. -2009-03-05 Simone Fiorentino <simone.fiorentino@consulenti.fastweb.it> + Update the patchOffsetGetByIdSlowCaseCall constant for the + case that OPCODE_SAMPLING is enabled. - Bug 24382: request to add SH4 platform + * jit/JIT.h: - <https://bugs.webkit.org/show_bug.cgi?id=24382> +2009-05-20 Geoffrey Garen <ggaren@apple.com> - Reviewed by David Kilzer. + Reviewed by Sam Weinig. - * wtf/Platform.h: Added support for SH4 platform. + Added support for inline subtraction of doubles. -2009-03-05 Gavin Barraclough <barraclough@apple.com> + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_sub): + (JSC::JIT::emitSlow_op_sub): + (JSC::JIT::emitSlowSub32InPlaceLeft): + (JSC::JIT::emitBinaryDoubleOp): - Reviewed by Oliver Hunt. +2009-05-20 Sam Weinig <sam@webkit.org> - Writes of constant values to SF registers should be made with direct memory - writes where possible, rather than moving the value via a hardware register. + Reviewed by Geoffrey Garen. - ~3% win on SunSpider tests on x86, ~1.5% win on v8 tests on x86-64. + Added support for inline division. - * assembler/MacroAssemblerX86_64.h: - (JSC::MacroAssemblerX86_64::storePtr): * assembler/X86Assembler.h: - (JSC::X86Assembler::movq_i32m): - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - -2009-03-05 Mark Rowe <mrowe@apple.com> - - Fix the build. - - Sprinkle "static" around NumberConstructor.cpp in order to please the compiler. - - * runtime/NumberConstructor.cpp: - (JSC::numberConstructorNaNValue): - (JSC::numberConstructorNegInfinity): - (JSC::numberConstructorPosInfinity): - (JSC::numberConstructorMaxValue): - (JSC::numberConstructorMinValue): - -2009-03-04 Mark Rowe <mrowe@apple.com> - - Reviewed by Oliver Hunt. - - <rdar://problem/6354858> FastMallocZone's enumeration code reports fragmented administration space - - The handling of MALLOC_ADMIN_REGION_RANGE_TYPE in FastMalloc's zone was incorrect. It was attempting - to record the memory containing and individual span as an administrative region, when all memory - allocated via MetaDataAlloc should in fact be recorded. This was causing memory regions allocated - via MetaDataAlloc to appear as "VM_ALLOCATE ?" in vmmap output. They are now correctly reported as - "MALLOC_OTHER" regions associated with the JavaScriptCore FastMalloc zone. - - Memory is allocated via MetaDataAlloc from two locations: PageHeapAllocator, and TCMalloc_PageMap{2,3}. - These two cases are handled differently. - - PageHeapAllocator is extended to keep a linked list of memory regions that it has allocated. The - first object in an allocated region contains the link to the previously allocated region. To record - the administrative regions of a PageHeapAllocator we can simply walk the linked list and record - each allocated region we encounter. - - TCMalloc_PageMaps allocate memory via MetaDataAlloc to store each level of the radix tree. To record - the administrative regions of a TCMalloc_PageMap we walk the tree and record the storage used for nodes - at each position rather than the nodes themselves. - - A small performance improvement is achieved by coalescing adjacent memory regions inside the PageMapMemoryUsageRecorder - so that fewer calls in to the range recorder are necessary. We further reduce the number of calls to the - range recorder by aggregating the in-use ranges of a given memory region into a local buffer before recording - them with a single call. A similar approach is also used by AdminRegionRecorder. - - * wtf/FastMalloc.cpp: - (WTF::PageHeapAllocator::Init): - (WTF::PageHeapAllocator::New): - (WTF::PageHeapAllocator::recordAdministrativeRegions): - (WTF::TCMallocStats::FreeObjectFinder::isFreeObject): - (WTF::TCMallocStats::PageMapMemoryUsageRecorder::~PageMapMemoryUsageRecorder): - (WTF::TCMallocStats::PageMapMemoryUsageRecorder::recordPendingRegions): - (WTF::TCMallocStats::PageMapMemoryUsageRecorder::visit): - (WTF::TCMallocStats::AdminRegionRecorder::AdminRegionRecorder): - (WTF::TCMallocStats::AdminRegionRecorder::recordRegion): - (WTF::TCMallocStats::AdminRegionRecorder::visit): - (WTF::TCMallocStats::AdminRegionRecorder::recordPendingRegions): - (WTF::TCMallocStats::AdminRegionRecorder::~AdminRegionRecorder): - (WTF::TCMallocStats::FastMallocZone::enumerate): - (WTF::TCMallocStats::FastMallocZone::FastMallocZone): - (WTF::TCMallocStats::FastMallocZone::init): - * wtf/TCPageMap.h: - (TCMalloc_PageMap2::visitValues): - (TCMalloc_PageMap2::visitAllocations): - (TCMalloc_PageMap3::visitValues): - (TCMalloc_PageMap3::visitAllocations): - -2009-03-04 Antti Koivisto <antti@apple.com> - - Reviewed by Dave Hyatt. - - https://bugs.webkit.org/show_bug.cgi?id=24359 - Repaint throttling mechanism - - Set ENABLE_REPAINT_THROTTLING to 0 by default. - - * wtf/Platform.h: - -2009-03-03 David Kilzer <ddkilzer@apple.com> - - <rdar://problem/6581203> WebCore and WebKit should install the same set of headers during installhdrs phase as build phase - - Reviewed by Mark Rowe. - - * Configurations/Base.xcconfig: Defined REAL_PLATFORM_NAME based - on PLATFORM_NAME to work around the missing definition on Tiger. - Updated HAVE_DTRACE to use REAL_PLATFORM_NAME. - -2009-03-03 Kevin McCullough <kmccullough@apple.com> - - Reviewed by Oliver Hunt. - - <rdar://problem/6639110> console.profile() doesn't work without a title - - * profiler/Profiler.cpp: - (JSC::Profiler::startProfiling): assert if there is not title to ensure - we don't start profiling without one. - -2009-03-02 Sam Weinig <sam@webkit.org> - - Reviewed by Mark Rowe. - - Enable Geolocation (except on Tiger and Leopard). - - * Configurations/JavaScriptCore.xcconfig: - -2009-03-01 David Kilzer <ddkilzer@apple.com> - - <rdar://problem/6635688> Move HAVE_DTRACE check to Base.xcconfig - - Reviewed by Mark Rowe. - - * Configurations/Base.xcconfig: Set HAVE_DTRACE Xcode variable - based on PLATFORM_NAME and MAC_OS_X_VERSION_MAJOR. Also define - it as a preprocessor macro by modifying - GCC_PREPROCESSOR_DEFINITIONS. - * JavaScriptCore.xcodeproj/project.pbxproj: Changed "Generate - DTrace header" script phase to check for HAVE_DTRACE instead of - MACOSX_DEPLOYMENT_TARGET. - * wtf/Platform.h: Removed definition of HAVE_DTRACE macro since - it's defined in Base.xcconfig now. - -2009-03-01 Horia Olaru <olaru@adobe.com> - - By looking in grammar.y there are only a few types of statement nodes - on which the debugger should stop. - - Removed isBlock and isLoop virtual calls. No need to emit debug hooks in - the "statementListEmitCode" method as long as the necessary hooks can be - added in each "emitCode". - - https://bugs.webkit.org/show_bug.cgi?id=21073 - - Reviewed by Kevin McCullough. - - * parser/Nodes.cpp: - (JSC::ConstStatementNode::emitBytecode): - (JSC::statementListEmitCode): - (JSC::EmptyStatementNode::emitBytecode): - (JSC::ExprStatementNode::emitBytecode): - (JSC::VarStatementNode::emitBytecode): - (JSC::IfNode::emitBytecode): - (JSC::IfElseNode::emitBytecode): - (JSC::DoWhileNode::emitBytecode): - (JSC::WhileNode::emitBytecode): - (JSC::ForNode::emitBytecode): - (JSC::ForInNode::emitBytecode): - (JSC::ContinueNode::emitBytecode): - (JSC::BreakNode::emitBytecode): - (JSC::ReturnNode::emitBytecode): - (JSC::WithNode::emitBytecode): - (JSC::SwitchNode::emitBytecode): - (JSC::LabelNode::emitBytecode): - (JSC::ThrowNode::emitBytecode): - (JSC::TryNode::emitBytecode): - * parser/Nodes.h: - -2009-02-26 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. - - Fix bug #23614. Switches on double precision values were incorrectly - truncating the scrutinee value. E.g.: - - switch (1.1) { case 1: print("FAIL"); } - - Was resulting in FAIL. - + (JSC::X86Assembler::): + (JSC::X86Assembler::divsd_rr): + (JSC::X86Assembler::divsd_mr): + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * bytecode/Opcode.h: + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitBinaryOp): * interpreter/Interpreter.cpp: (JSC::Interpreter::privateExecute): - * jit/JITStubs.cpp: - (JSC::JITStubs::cti_op_switch_imm): - -2009-02-26 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Integer Immediate representation need not be canonical in x86 JIT code. - On x86-64 we already have loosened the requirement that the int immediate - representation in canonical, we should bring x86 into line. - - This patch is a minor (~0.5%) improvement on sunspider & v8-tests, and - should reduce memory footoprint (reduces JIT code size). - * jit/JIT.cpp: - (JSC::JIT::compileOpStrictEq): + (JSC::JIT::privateCompileMainPass): (JSC::JIT::privateCompileSlowCases): * jit/JIT.h: - (JSC::JIT::emitJumpIfImmediateNumber): - (JSC::JIT::emitJumpIfNotImmediateNumber): * jit/JITArithmetic.cpp: - (JSC::JIT::putDoubleResultToJSNumberCellOrJSImmediate): - (JSC::JIT::compileBinaryArithOp): - -2009-02-26 Carol Szabo <carol.szabo@nokia.com> - - Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=24099 - ARM Compiler Warnings in pcre_exec.cpp - - * pcre/pcre_exec.cpp: - (match): - -2009-02-25 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Gavin Barraclough. - - Bug 24086: Regression (r40993): WebKit crashes after logging in to lists.zenbe - <https://bugs.webkit.org/show_bug.cgi?id=24086> - <rdar://problem/6625111> - - The numeric sort optimization in r40993 generated bytecode for a function - without generating JIT code. This breaks an assumption in some parts of - the JIT's function calling logic that the presence of a CodeBlock implies - the existence of JIT code. - - In order to fix this, we simply generate JIT code whenever we check whether - a function is a numeric sort function. This only incurs an additional cost - in the case when the function is a numeric sort function, in which case it - is not expensive to generate JIT code for it. - - * runtime/ArrayPrototype.cpp: - (JSC::isNumericCompareFunction): - -2009-02-25 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Maciej Stachowiak. - - Fixed <rdar://problem/6611174> REGRESSION (r36701): Unable to select - messages on hotmail (24052) - - The bug was that for-in enumeration used a cached prototype chain without - validating that it was up-to-date. - - This led me to refactor prototype chain caching so it was easier to work - with and harder to get wrong. - - After a bit of inlining, this patch is performance-neutral on SunSpider - and the v8 benchmarks. - - * interpreter/Interpreter.cpp: - (JSC::Interpreter::tryCachePutByID): - (JSC::Interpreter::tryCacheGetByID): - * jit/JITStubs.cpp: - (JSC::JITStubs::tryCachePutByID): - (JSC::JITStubs::tryCacheGetByID): - (JSC::JITStubs::cti_op_get_by_id_proto_list): Use the new refactored goodness. See - lines beginning with "-" and smile. - - * runtime/JSGlobalObject.h: - (JSC::Structure::prototypeForLookup): A shout out to const. - - * runtime/JSPropertyNameIterator.h: - (JSC::JSPropertyNameIterator::next): We can use a pointer comparison to - see if our cached structure chain is equal to the object's structure chain, - since in the case of a cache hit, we share references to the same structure - chain. - - * runtime/Operations.h: - (JSC::countPrototypeChainEntriesAndCheckForProxies): Use the new refactored - goodness. - - * runtime/PropertyNameArray.h: - (JSC::PropertyNameArray::PropertyNameArray): - (JSC::PropertyNameArray::setShouldCache): - (JSC::PropertyNameArray::shouldCache): Renamed "cacheable" to "shouldCache" - to communicate that the client is specifying a recommendation, not a - capability. - - * runtime/Structure.cpp: - (JSC::Structure::Structure): No need to initialize a RefPtr. - (JSC::Structure::getEnumerablePropertyNames): Moved some code into helper - functions. - - (JSC::Structure::prototypeChain): New centralized accessor for a prototype - chain. Revalidates on every access, since the objects in the prototype - chain may have mutated. - - (JSC::Structure::isValid): Helper function for revalidating a cached - prototype chain. - - (JSC::Structure::getEnumerableNamesFromPropertyTable): - (JSC::Structure::getEnumerableNamesFromClassInfoTable): Factored out of - getEnumerablePropertyNames. - - * runtime/Structure.h: - - * runtime/StructureChain.cpp: - (JSC::StructureChain::StructureChain): - * runtime/StructureChain.h: - (JSC::StructureChain::create): No need for structureChainsAreEqual, since - we use pointer equality now. Refactored StructureChain to make a little - more sense and eliminate special cases for null prototypes. - -2009-02-25 Steve Falkenburg <sfalken@apple.com> - - Use timeBeginPeriod to enable timing resolution greater than 16ms in command line jsc for Windows. - Allows more accurate reporting of benchmark times via command line jsc.exe. Doesn't affect WebKit's use of JavaScriptCore. - - Reviewed by Adam Roben. + (JSC::JIT::emitBinaryDoubleOp): + (JSC::JIT::emit_op_div): + (JSC::JIT::emitSlow_op_div): - * jsc.cpp: - (main): - -2009-02-24 Geoffrey Garen <ggaren@apple.com> - - Build fix? - - * GNUmakefile.am: +2009-05-20 Geoffrey Garen <ggaren@apple.com> -2009-02-24 Mark Rowe <mrowe@apple.com> - - Reviewed by Oliver Hunt. + Reviewed by Sam Weinig. - <rdar://problem/6259220> Rename AVAILABLE_AFTER_WEBKIT_VERSION_3_1 (etc.) to match the other macros + Added support for inline addition of doubles. - * API/JSBasePrivate.h: - * API/JSContextRef.h: - * API/JSObjectRef.h: - * API/WebKitAvailability.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_add): + (JSC::JIT::emitSlow_op_add): + (JSC::JIT::emitSlowAdd32InPlace): + (JSC::JIT::emitBinaryDoubleOp): + (JSC::JIT::emit_op_mul): + (JSC::JIT::emitSlow_op_mul): -2009-02-23 Geoffrey Garen <ggaren@apple.com> +2009-05-20 Geoffrey Garen <ggaren@apple.com> Reviewed by Sam Weinig. - - Next step in splitting JIT functionality out of the Interpreter class: - Moved vptr storage from Interpreter to JSGlobalData, so it could be shared - between Interpreter and JITStubs, and moved the *Trampoline JIT stubs - into the JITStubs class. Also added a VPtrSet class to encapsulate vptr - hacks during JSGlobalData initialization. - SunSpider says 0.4% faster. Meh. + Factored inline double operations into a helper function, so that we + can reuse this code for other math operations. - * JavaScriptCore.exp: - * JavaScriptCore.xcodeproj/project.pbxproj: - * interpreter/Interpreter.cpp: - (JSC::Interpreter::Interpreter): - (JSC::Interpreter::tryCacheGetByID): - (JSC::Interpreter::privateExecute): - * interpreter/Interpreter.h: - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompile): - (JSC::JIT::privateCompileCTIMachineTrampolines): * jit/JIT.h: - (JSC::JIT::compileCTIMachineTrampolines): + * jit/JITArithmetic.cpp: + (JSC::JIT::emitBinaryDoubleOp): + (JSC::JIT::emit_op_mul): * jit/JITCall.cpp: - (JSC::JIT::compileOpCall): - (JSC::JIT::compileOpCallSlowCase): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::privateCompilePatchGetArrayLength): - * jit/JITStubs.cpp: - (JSC::JITStubs::JITStubs): - (JSC::JITStubs::tryCacheGetByID): - (JSC::JITStubs::cti_vm_dontLazyLinkCall): - (JSC::JITStubs::cti_op_get_by_val): - (JSC::JITStubs::cti_op_get_by_val_byte_array): - (JSC::JITStubs::cti_op_put_by_val): - (JSC::JITStubs::cti_op_put_by_val_array): - (JSC::JITStubs::cti_op_put_by_val_byte_array): - (JSC::JITStubs::cti_op_is_string): - * jit/JITStubs.h: - (JSC::JITStubs::ctiArrayLengthTrampoline): - (JSC::JITStubs::ctiStringLengthTrampoline): - (JSC::JITStubs::ctiVirtualCallPreLink): - (JSC::JITStubs::ctiVirtualCallLink): - (JSC::JITStubs::ctiVirtualCall): - * runtime/ArrayPrototype.cpp: - (JSC::arrayProtoFuncPop): - (JSC::arrayProtoFuncPush): - * runtime/FunctionPrototype.cpp: - (JSC::functionProtoFuncApply): - * runtime/JSArray.h: - (JSC::isJSArray): - * runtime/JSByteArray.h: - (JSC::asByteArray): - (JSC::isJSByteArray): - * runtime/JSCell.h: - * runtime/JSFunction.h: - * runtime/JSGlobalData.cpp: - (JSC::VPtrSet::VPtrSet): - (JSC::JSGlobalData::JSGlobalData): - (JSC::JSGlobalData::create): - (JSC::JSGlobalData::sharedInstance): - * runtime/JSGlobalData.h: - * runtime/JSString.h: - (JSC::isJSString): - * runtime/Operations.h: - (JSC::jsLess): - (JSC::jsLessEq): - * wrec/WREC.cpp: - (JSC::WREC::Generator::compileRegExp): - -2009-02-23 Csaba Osztrogonac <oszi@inf.u-szeged.hu> + (JSC::JIT::compileOpCallInitializeCallFrame): - Reviewed by Oliver Hunt. +2009-05-20 Geoffrey Garen <ggaren@apple.com> - Bug 23787: Allow JIT to generate SSE2 code if using GCC - <https://bugs.webkit.org/show_bug.cgi?id=23787> + Reviewed by Sam Weinig. + + Added support for inline multiplication of doubles. - GCC version of the cpuid check. + * assembler/X86Assembler.h: + (JSC::X86Assembler::cvtsi2sd_mr): New function, useful for loading an + int32 into a double register. * jit/JITArithmetic.cpp: - (JSC::isSSE2Present): previous assembly code fixed. - -2009-02-23 David Levin <levin@chromium.org> - - Reviewed by Alexey Proskuryakov. - - Bug 24047: Need to simplify nested if's in WorkerRunLoop::runInMode - <https://bugs.webkit.org/show_bug.cgi?id=24047> - - * wtf/MessageQueue.h: - (WTF::MessageQueue::infiniteTime): - Allows for one to call waitForMessageFilteredWithTimeout and wait forever. - - (WTF::MessageQueue::alwaysTruePredicate): - (WTF::MessageQueue::waitForMessage): - Made waitForMessage call waitForMessageFilteredWithTimeout, so that there is less - duplicate code. - - (WTF::MessageQueue::waitForMessageFilteredWithTimeout): - - * wtf/ThreadingQt.cpp: - (WTF::ThreadCondition::timedWait): - * wtf/ThreadingWin.cpp: - (WTF::ThreadCondition::timedWait): - Made these two implementations consistent with the pthread and gtk implementations. - Currently, the time calculations would overflow when passed large values. - -2009-02-23 Jeremy Moskovich <jeremy@chromium.org> + (JSC::JIT::emit_op_mul): + (JSC::JIT::emitSlow_op_mul): Filled out these cases for double arithmetic. - Reviewed by Adam Roben. + * jit/JIT.h: + * jit/JITInlineMethods.h: + (JSC::JIT::addressFor): New function, useful for addressing a JSValue's + full 64bits as a double. - https://bugs.webkit.org/show_bug.cgi?id=24096 - PLATFORM(MAC)->PLATFORM(CF) since we want to use the CF functions in Chrome on OS X. +2009-05-19 Sam Weinig <sam@webkit.org> - * wtf/CurrentTime.cpp: - -2009-02-22 Geoffrey Garen <ggaren@apple.com> + Reviewed by Geoffrey Garen. - Build fix? + Implement and enable optimized calls. - * GNUmakefile.am: + * jit/JIT.cpp: + (JSC::JIT::privateCompileCTIMachineTrampolines): Add ENABLE(JIT_OPTIMIZE_CALL) guards + around the the optimize call only trampolines (virtualCallPreLink and virtualCallLink). + Update the trampolines to account for the new JSValue representation. + (JSC::JIT::unlinkCall): Use NULL instead of JSValue noValue. -2009-02-22 Geoffrey Garen <ggaren@apple.com> + * jit/JITCall.cpp: + (JSC::JIT::compileOpCall): Update to account for the new JSValue representation + (JSC::JIT::compileOpCallSlowCase): Ditto. - Build fix. + * jit/JITStubs.h: Remove incorrect !ENABLE(JIT_OPTIMIZE_CALL) guard. - * GNUmakefile.am: + * wtf/Platform.h: Enable ENABLE_JIT_OPTIMIZE_CALL. -2009-02-22 Geoffrey Garen <ggaren@apple.com> +2009-05-19 Sam Weinig <sam@webkit.org> - Reviewed by Sam Weinig. + Reviewed by Geoffrey Garen. - Next step in splitting JIT functionality out of the Interpreter class: - Created a JITStubs class and renamed Interpreter::cti_* to JITStubs::cti_*. - - Also, moved timeout checking into its own class, located in JSGlobalData, - so both the Interpreter and the JIT could have access to it. + Implement and enable optimized property access. - * JavaScriptCore.exp: - * JavaScriptCore.pri: - * JavaScriptCore.scons: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * interpreter/CallFrame.h: - * interpreter/Interpreter.cpp: - (JSC::Interpreter::Interpreter): - (JSC::Interpreter::privateExecute): - * interpreter/Interpreter.h: - * interpreter/Register.h: + * assembler/AbstractMacroAssembler.h: Fix comment. * jit/JIT.cpp: - (JSC::): - (JSC::JIT::emitTimeoutCheck): - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): - (JSC::JIT::privateCompile): - (JSC::JIT::privateCompileCTIMachineTrampolines): - * jit/JIT.h: - * jit/JITArithmetic.cpp: - (JSC::JIT::compileFastArithSlow_op_lshift): - (JSC::JIT::compileFastArithSlow_op_rshift): - (JSC::JIT::compileFastArithSlow_op_bitand): - (JSC::JIT::compileFastArithSlow_op_mod): - (JSC::JIT::compileFastArith_op_mod): - (JSC::JIT::compileFastArithSlow_op_post_inc): - (JSC::JIT::compileFastArithSlow_op_post_dec): - (JSC::JIT::compileFastArithSlow_op_pre_inc): - (JSC::JIT::compileFastArithSlow_op_pre_dec): - (JSC::JIT::compileFastArith_op_add): - (JSC::JIT::compileFastArith_op_mul): - (JSC::JIT::compileFastArith_op_sub): - (JSC::JIT::compileBinaryArithOpSlowCase): - (JSC::JIT::compileFastArithSlow_op_add): - (JSC::JIT::compileFastArithSlow_op_mul): - * jit/JITCall.cpp: - (JSC::JIT::compileOpCall): - (JSC::JIT::compileOpCallSlowCase): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::compileGetByIdHotPath): - (JSC::JIT::compilePutByIdHotPath): - (JSC::JIT::compileGetByIdSlowCase): - (JSC::JIT::compilePutByIdSlowCase): + (JSC::JIT::privateCompileCTIMachineTrampolines): Remove array length trampoline + and implement the string length trampoline. + * jit/JIT.h: Add new constants for patch offsets. + * jit/JITInlineMethods.h: Remove FIELD_OFFSET which is now in StdLibExtras.h. + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emit_op_get_by_id): + (JSC::JIT::emitSlow_op_get_by_id): + (JSC::JIT::emit_op_put_by_id): + (JSC::JIT::emitSlow_op_put_by_id): + (JSC::JIT::compilePutDirectOffset): + (JSC::JIT::compileGetDirectOffset): (JSC::JIT::privateCompilePutByIdTransition): (JSC::JIT::patchGetByIdSelf): (JSC::JIT::patchPutByIdReplace): (JSC::JIT::privateCompilePatchGetArrayLength): - (JSC::JIT::privateCompileGetByIdSelf): (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdSelfList): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChainList): (JSC::JIT::privateCompileGetByIdChain): - (JSC::JIT::privateCompilePutByIdReplace): + * jit/JITStubCall.h: + (JSC::JITStubCall::addArgument): Add version of addArgument that takes + two registers for the tag and payload. * jit/JITStubs.cpp: - (JSC::JITStubs::tryCachePutByID): - (JSC::JITStubs::tryCacheGetByID): - (JSC::JITStubs::cti_op_convert_this): - (JSC::JITStubs::cti_op_end): - (JSC::JITStubs::cti_op_add): - (JSC::JITStubs::cti_op_pre_inc): - (JSC::JITStubs::cti_timeout_check): - (JSC::JITStubs::cti_register_file_check): - (JSC::JITStubs::cti_op_loop_if_less): - (JSC::JITStubs::cti_op_loop_if_lesseq): - (JSC::JITStubs::cti_op_new_object): - (JSC::JITStubs::cti_op_put_by_id_generic): - (JSC::JITStubs::cti_op_get_by_id_generic): - (JSC::JITStubs::cti_op_put_by_id): - (JSC::JITStubs::cti_op_put_by_id_second): - (JSC::JITStubs::cti_op_put_by_id_fail): - (JSC::JITStubs::cti_op_get_by_id): - (JSC::JITStubs::cti_op_get_by_id_second): - (JSC::JITStubs::cti_op_get_by_id_self_fail): - (JSC::JITStubs::cti_op_get_by_id_proto_list): - (JSC::JITStubs::cti_op_get_by_id_proto_list_full): - (JSC::JITStubs::cti_op_get_by_id_proto_fail): - (JSC::JITStubs::cti_op_get_by_id_array_fail): - (JSC::JITStubs::cti_op_get_by_id_string_fail): - (JSC::JITStubs::cti_op_instanceof): - (JSC::JITStubs::cti_op_del_by_id): - (JSC::JITStubs::cti_op_mul): - (JSC::JITStubs::cti_op_new_func): - (JSC::JITStubs::cti_op_call_JSFunction): - (JSC::JITStubs::cti_op_call_arityCheck): - (JSC::JITStubs::cti_vm_dontLazyLinkCall): - (JSC::JITStubs::cti_vm_lazyLinkCall): - (JSC::JITStubs::cti_op_push_activation): - (JSC::JITStubs::cti_op_call_NotJSFunction): - (JSC::JITStubs::cti_op_create_arguments): - (JSC::JITStubs::cti_op_create_arguments_no_params): - (JSC::JITStubs::cti_op_tear_off_activation): - (JSC::JITStubs::cti_op_tear_off_arguments): - (JSC::JITStubs::cti_op_profile_will_call): - (JSC::JITStubs::cti_op_profile_did_call): - (JSC::JITStubs::cti_op_ret_scopeChain): - (JSC::JITStubs::cti_op_new_array): - (JSC::JITStubs::cti_op_resolve): - (JSC::JITStubs::cti_op_construct_JSConstruct): - (JSC::JITStubs::cti_op_construct_NotJSConstruct): - (JSC::JITStubs::cti_op_get_by_val): - (JSC::JITStubs::cti_op_get_by_val_byte_array): - (JSC::JITStubs::cti_op_resolve_func): - (JSC::JITStubs::cti_op_sub): - (JSC::JITStubs::cti_op_put_by_val): - (JSC::JITStubs::cti_op_put_by_val_array): - (JSC::JITStubs::cti_op_put_by_val_byte_array): - (JSC::JITStubs::cti_op_lesseq): - (JSC::JITStubs::cti_op_loop_if_true): - (JSC::JITStubs::cti_op_negate): - (JSC::JITStubs::cti_op_resolve_base): - (JSC::JITStubs::cti_op_resolve_skip): - (JSC::JITStubs::cti_op_resolve_global): - (JSC::JITStubs::cti_op_div): - (JSC::JITStubs::cti_op_pre_dec): - (JSC::JITStubs::cti_op_jless): - (JSC::JITStubs::cti_op_not): - (JSC::JITStubs::cti_op_jtrue): - (JSC::JITStubs::cti_op_post_inc): - (JSC::JITStubs::cti_op_eq): - (JSC::JITStubs::cti_op_lshift): - (JSC::JITStubs::cti_op_bitand): - (JSC::JITStubs::cti_op_rshift): - (JSC::JITStubs::cti_op_bitnot): - (JSC::JITStubs::cti_op_resolve_with_base): - (JSC::JITStubs::cti_op_new_func_exp): - (JSC::JITStubs::cti_op_mod): - (JSC::JITStubs::cti_op_less): - (JSC::JITStubs::cti_op_neq): - (JSC::JITStubs::cti_op_post_dec): - (JSC::JITStubs::cti_op_urshift): - (JSC::JITStubs::cti_op_bitxor): - (JSC::JITStubs::cti_op_new_regexp): - (JSC::JITStubs::cti_op_bitor): - (JSC::JITStubs::cti_op_call_eval): - (JSC::JITStubs::cti_op_throw): - (JSC::JITStubs::cti_op_get_pnames): - (JSC::JITStubs::cti_op_next_pname): - (JSC::JITStubs::cti_op_push_scope): - (JSC::JITStubs::cti_op_pop_scope): - (JSC::JITStubs::cti_op_typeof): - (JSC::JITStubs::cti_op_is_undefined): - (JSC::JITStubs::cti_op_is_boolean): - (JSC::JITStubs::cti_op_is_number): - (JSC::JITStubs::cti_op_is_string): - (JSC::JITStubs::cti_op_is_object): - (JSC::JITStubs::cti_op_is_function): - (JSC::JITStubs::cti_op_stricteq): - (JSC::JITStubs::cti_op_nstricteq): - (JSC::JITStubs::cti_op_to_jsnumber): - (JSC::JITStubs::cti_op_in): - (JSC::JITStubs::cti_op_push_new_scope): - (JSC::JITStubs::cti_op_jmp_scopes): - (JSC::JITStubs::cti_op_put_by_index): - (JSC::JITStubs::cti_op_switch_imm): - (JSC::JITStubs::cti_op_switch_char): - (JSC::JITStubs::cti_op_switch_string): - (JSC::JITStubs::cti_op_del_by_val): - (JSC::JITStubs::cti_op_put_getter): - (JSC::JITStubs::cti_op_put_setter): - (JSC::JITStubs::cti_op_new_error): - (JSC::JITStubs::cti_op_debug): - (JSC::JITStubs::cti_vm_throw): + (JSC::JITStubs::JITStubs): Remove array length trampoline pointer. + (JSC::JITStubs::cti_op_get_by_id_self_fail): * jit/JITStubs.h: - (JSC::): - * runtime/JSFunction.h: - * runtime/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): - * runtime/JSGlobalData.h: - * runtime/JSGlobalObject.cpp: - * runtime/JSGlobalObject.h: - * runtime/TimeoutChecker.cpp: Copied from interpreter/Interpreter.cpp. - (JSC::TimeoutChecker::TimeoutChecker): - (JSC::TimeoutChecker::reset): - (JSC::TimeoutChecker::didTimeOut): - * runtime/TimeoutChecker.h: Copied from interpreter/Interpreter.h. - (JSC::TimeoutChecker::setTimeoutInterval): - (JSC::TimeoutChecker::ticksUntilNextCheck): - (JSC::TimeoutChecker::start): - (JSC::TimeoutChecker::stop): + * runtime/JSObject.h: + (JSC::JSObject::JSObject): Move m_inheritorID below the property storage + to align it to a 16 byte boundary. + * wtf/Platform.h: Enable ENABLE_JIT_OPTIMIZE_PROPERTY_ACCESS + * wtf/StdLibExtras.h: Move FIELD_OFFSET here. -2009-02-20 Gustavo Noronha Silva <gns@gnome.org> +2009-05-17 Sam Weinig <sam@webkit.org> - Unreviewed build fix after r41100. + Reviewed by Geoffrey Garen. - * GNUmakefile.am: + Remove unneeded ExecState parameter from the number JSValue constructors. -2009-02-20 Oliver Hunt <oliver@apple.com> + * runtime/JSValue.h: + (JSC::jsNumber): + (JSC::jsNaN): + (JSC::JSValue::JSValue): - Reviewed by Mark Rowe. +2009-05-15 Sam Weinig <sam@webkit.org> - <rdar://problem/6606660> 2==null returns true in 64bit jit + Reviewed by Geoffrey Garen. - Code for op_eq_null and op_neq_null was incorrectly performing - a 32bit compare, which truncated the type tag from an integer - immediate, leading to incorrect behaviour. + Implemented fast path for op_put_by_val when putting to arrays. - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::setPtr): - * assembler/MacroAssemblerX86_64.h: - (JSC::MacroAssemblerX86_64::setPtr): - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emit_op_put_by_val): + (JSC::JIT::emitSlow_op_put_by_val): -2009-02-19 Geoffrey Garen <ggaren@apple.com> +2009-05-15 Geoffrey Garen <ggaren@apple.com> (Mostly by Sam) - Reviewed by Gavin Barraclough. - - First step in splitting JIT functionality out of the Interpreter class: - Created JITStubs.h/.cpp, and moved Interpreter::cti_* into JITStubs.cpp. + Reviewed by Sam Weinig. - Functions that the Interpreter and JITStubs share moved to Operations.h/.cpp. + Implemented fast path for op_get_by_val when accessing array. - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * interpreter/Interpreter.cpp: - (JSC::Interpreter::resolveBase): - (JSC::Interpreter::checkTimeout): - (JSC::Interpreter::privateExecute): - * interpreter/Interpreter.h: - * jit/JITStubs.cpp: Copied from interpreter/Interpreter.cpp. - (JSC::Interpreter::cti_op_resolve_base): - * jit/JITStubs.h: Copied from interpreter/Interpreter.h. - * runtime/Operations.cpp: - (JSC::jsAddSlowCase): - (JSC::jsTypeStringForValue): - (JSC::jsIsObjectType): - (JSC::jsIsFunctionType): - * runtime/Operations.h: - (JSC::jsLess): - (JSC::jsLessEq): - (JSC::jsAdd): - (JSC::cachePrototypeChain): - (JSC::countPrototypeChainEntriesAndCheckForProxies): - (JSC::resolveBase): - -2009-02-19 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Fix for x86-64. Where the JavaScriptCore text segment lies outside - a 2gb range of the heap containing JIT generated code, callbacks - from JIT code to the stub functions in Interpreter will be incorrectly - linked. - - No performance impact on Sunspider, 1% regression on v8-tests, - due to a 3% regression on richards. - - * assembler/AbstractMacroAssembler.h: - (JSC::AbstractMacroAssembler::Call::Call): - (JSC::AbstractMacroAssembler::Jump::link): - (JSC::AbstractMacroAssembler::Jump::linkTo): - (JSC::AbstractMacroAssembler::CodeLocationJump::relink): - (JSC::AbstractMacroAssembler::CodeLocationCall::relink): - (JSC::AbstractMacroAssembler::ProcessorReturnAddress::relinkCallerToFunction): - (JSC::AbstractMacroAssembler::PatchBuffer::link): - (JSC::AbstractMacroAssembler::PatchBuffer::linkTailRecursive): - (JSC::AbstractMacroAssembler::differenceBetween): - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::tailRecursiveCall): - (JSC::MacroAssembler::makeTailRecursiveCall): - * assembler/MacroAssemblerX86.h: - (JSC::MacroAssemblerX86::call): - * assembler/MacroAssemblerX86Common.h: - * assembler/MacroAssemblerX86_64.h: - (JSC::MacroAssemblerX86_64::call): - (JSC::MacroAssemblerX86_64::moveWithPatch): - (JSC::MacroAssemblerX86_64::branchPtrWithPatch): - (JSC::MacroAssemblerX86_64::storePtrWithPatch): - * assembler/X86Assembler.h: - (JSC::X86Assembler::jmp_r): - (JSC::X86Assembler::linkJump): - (JSC::X86Assembler::patchJump): - (JSC::X86Assembler::patchCall): - (JSC::X86Assembler::linkCall): - (JSC::X86Assembler::patchAddress): - * interpreter/Interpreter.cpp: - (JSC::Interpreter::tryCTICachePutByID): * jit/JIT.cpp: - (JSC::JIT::privateCompile): - (JSC::JIT::privateCompileCTIMachineTrampolines): - * jit/JIT.h: - * jit/JITArithmetic.cpp: - (JSC::JIT::putDoubleResultToJSNumberCellOrJSImmediate): - (JSC::JIT::compileBinaryArithOp): * jit/JITPropertyAccess.cpp: - (JSC::JIT::privateCompilePutByIdTransition): - (JSC::JIT::privateCompileGetByIdSelf): - (JSC::JIT::privateCompilePutByIdReplace): + (JSC::JIT::emit_op_get_by_val): + (JSC::JIT::emitSlow_op_get_by_val): -2009-02-18 Geoffrey Garen <ggaren@apple.com> +2009-05-14 Geoffrey Garen <ggaren@apple.com> - Reviewed by Oliver Hunt. + Reviewed by Sam Weinig. - Simplified .call and .apply in preparation for optimizing them. Also, - a little cleanup. - - * runtime/FunctionPrototype.cpp: - (JSC::functionProtoFuncApply): - (JSC::functionProtoFuncCall): No need to do any specific conversion on - 'this' -- op_convert_this will do it if necessary. - - * runtime/JSImmediate.cpp: - (JSC::JSImmediate::toThisObject): Slightly relaxed the rules on - toThisObject to allow for 'undefined', which can be passed through - .call and .apply. - -2009-02-19 David Levin <levin@chromium.org> - - Reviewed by Alexey Proskuryakov. - - Bug 23976: MessageQueue needs a way to wait for a message that satisfies an arbitrary criteria. - <https://bugs.webkit.org/show_bug.cgi?id=23976> - - * wtf/Deque.h: - (WTF::Deque<T>::findIf): - * wtf/MessageQueue.h: - (WTF::MessageQueue<T>::waitForMessageFiltered): - -2009-02-18 David Levin <levin@chromium.org> + Fixed a failure in fast/js/math-transforms.html caused by failing to + preserve -0 in multiplication. - Reviewed by Alexey Proskuryakov. - - Bug 23974: Deque::Remove would be a useful method. - <https://bugs.webkit.org/show_bug.cgi?id=23974> + * assembler/X86Assembler.h: + (JSC::X86Assembler::jz): + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_mul): + (JSC::JIT::emitSlow_op_mul): + (JSC::JIT::emitMul32Constant): + (JSC::JIT::emitMul32InPlace): Check both for overflow and for zero when + doing multiplication. Use a slow case to get these right. - Add Deque::remove and DequeIteratorBase<T>::operator=. +2009-05-14 Geoffrey Garen <ggaren@apple.com> - Why was operator= added? Every concrete iterator (DequeIterator..DequeConstReverseIterator) - was calling DequeIteratorBase::assign(), which called Base::operator=(). Base::operator=() - was not implemented. This went unnoticed because the iterator copy code has been unused. + Reviewed by Sam Weinig. + + Fixed a bug in the varargs calling convention. - * wtf/Deque.h: - (WTF::Deque<T>::remove): - (WTF::DequeIteratorBase<T>::removeFromIteratorsList): - (WTF::DequeIteratorBase<T>::operator=): - (WTF::DequeIteratorBase<T>::~DequeIteratorBase): + * jit/JITCall.cpp: + (JSC::JIT::compileOpCallVarargs): Move the argument count into regT1, + since that's where ctiVirtualCall expects it to be. -2009-02-18 Gustavo Noronha Silva <gns@gnome.org> +2009-05-14 Geoffrey Garen <ggaren@apple.com> - Reviewed by Holger Freyther. + Reviewed by Sam Weinig. - Fix symbols.filter location, and add other missing files to the - autotools build, so that make dist works. + Fixed a small bug in instanceof's looping code. - * GNUmakefile.am: + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_instanceof): NULL means the object has no prototype, + so only loop when *not* equal to NULL. -2009-02-17 Geoffrey Garen <ggaren@apple.com> +2009-05-14 Geoffrey Garen <ggaren@apple.com> Reviewed by Sam Weinig. - Fixed failure in js1_5/Regress/regress-168347.js, as seen on the Oliver - bot. - - Technically, both behaviors are OK, but we might as well keep this test - passing. - - * runtime/FunctionPrototype.cpp: - (JSC::insertSemicolonIfNeeded): No need to add a trailing semicolon - after a trailing '}', since '}' ends a block, indicating the end of a - statement. - -2009-02-17 Geoffrey Garen <ggaren@apple.com> - - Build fix. + Fixed a small bug in instanceof's result writing code. - * runtime/FunctionPrototype.cpp: + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_instanceof): Make sure to fill out the payload bits + in all cases. -2009-02-17 Oliver Hunt <oliver@apple.com> +2009-05-14 Sam Weinig <sam@webkit.org> - Reviewed by Geoff Garen. + Reviewed by Geoffrey Garen. - Add assertion to guard against oversized pc relative calls. + Removed an invalid assertion in cti_op_urshift which + depended on a fast path for op_urshift which has + never existed. - * assembler/X86Assembler.h: - (JSC::X86Assembler::link): + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_op_urshift): -2009-02-17 Geoffrey Garen <ggaren@apple.com> +2009-05-14 Geoffrey Garen <ggaren@apple.com> Reviewed by Sam Weinig. - Fixed <rdar://problem/6595040> REGRESSION: http://www.amnestyusa.org/ - fails to load. - - amnestyusa.org uses the Optimist JavaScript library, which adds event - listeners by concatenating string-ified functions. This is only sure to - be syntactically valid if the string-ified functions end in semicolons. - - * parser/Lexer.cpp: - (JSC::Lexer::isWhiteSpace): - * parser/Lexer.h: - (JSC::Lexer::isWhiteSpace): - (JSC::Lexer::isLineTerminator): Added some helper functions for examining - whitespace. - - * runtime/FunctionPrototype.cpp: - (JSC::appendSemicolonIfNeeded): - (JSC::functionProtoFuncToString): When string-ifying a function, insert - a semicolon in the last non-whitespace position, if one doesn't already exist. - -2009-02-16 Oliver Hunt <oliver@apple.com> + Fixed loop_if_true, which had the same reversed test that jtrue had. - Reviewed by NOBODY (Build fix). - - Roll out r41022 as it breaks qt and gtk builds - - * jit/JITArithmetic.cpp: - (JSC::isSSE2Present): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_loop_if_true): -2009-02-16 Sam Weinig <sam@webkit.org> +2009-05-14 Sam Weinig <sam@webkit.org> Reviewed by Geoffrey Garen. - Fix for <rdar://problem/6468156> - REGRESSION (r36779): Adding link, images, flash in TinyMCE blocks entire page (21382) - - No performance regression. + In op_neq, we apparently want to check that one value + does *not* equal another. Go figure. - * runtime/Arguments.cpp: - (JSC::Arguments::fillArgList): Add codepath for when the "length" property has been - overridden. - -2009-02-16 Mark Rowe <mrowe@apple.com> - - Build fix. - - * wtf/FastMalloc.cpp: - (WTF::TCMallocStats::): - (WTF::TCMallocStats::FastMallocZone::FastMallocZone): - -2009-02-16 Csaba Osztrogonac <oszi@inf.u-szeged.hu> + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_neq): - Reviewed by Oliver Hunt. +2009-05-14 Sam Weinig <sam@webkit.org> - Bug 23787: Allow JIT to generate SSE2 code if using GCC - <https://bugs.webkit.org/show_bug.cgi?id=23787> + Reviewed by Geoffrey Garen. - GCC version of the cpuid check. + The slow case of op_mod should call op_mod's jit stub, + not op_mul. That would be dumb. * jit/JITArithmetic.cpp: - (JSC::isSSE2Present): GCC assembly code added. - 6.6% progression on x86 Linux with JIT and WREC on SunSpider if using SSE2 capable machine. - -2009-02-13 Adam Treat <adam.treat@torchmobile.com> - - Reviewed by George Staikos. - - https://bugs.webkit.org/show_bug.cgi?id=23960 - Crash Fix. - - Don't depend on 'initializeThreading()' to come before a call to 'isMainThread()' - as QtWebKit only calls 'initializeThreading()' during QWebPage construction. - - A client app may well make a call to QWebSettings::iconForUrl() for instance - before creating a QWebPage and that call to QWebSettings triggers an - ASSERT(isMainThread()) deep within WebCore. - - * wtf/ThreadingQt.cpp: - (WTF::isMainThread): - -2009-02-13 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Darin Adler. - - Some data in the instruction stream is potentially uninitialized - fix this. - - Change the OperandTypes constructor so that uninitialized memory in the int - is zeroed, and modify the Instruction constructor taking an Opcode so that - if !HAVE(COMPUTED_GOTO) (i.e. when Opcode is an enum, and is potentially only - a byte) it zeros the Instruction first before writing the opcode. - - * bytecode/Instruction.h: - (JSC::Instruction::Instruction): - * parser/ResultType.h: - (JSC::OperandTypes::OperandTypes): - -2009-02-13 Geoffrey Garen <ggaren@apple.com> - - Build fix for non_JIT platforms. - - * bytecode/CodeBlock.h: - (JSC::CodeBlock::setIsNumericCompareFunction): - (JSC::CodeBlock::isNumericCompareFunction): + (JSC::JIT::emitSlow_op_mod): -2009-02-13 Geoffrey Garen <ggaren@apple.com> +2009-05-14 Geoffrey Garen <ggaren@apple.com> - Reviewed by Darin Adler. - - Fixed <rdar://problem/6584057> Optimize sort by JS numeric comparison - function not to run the comparison function + Reviewed by Sam Weinig. - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::CodeBlock): - * bytecode/CodeBlock.h: - (JSC::CodeBlock::setIsNumericCompareFunction): - (JSC::CodeBlock::isNumericCompareFunction): Added the ability to track - whether a CodeBlock performs a sort-like numeric comparison. - - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::generate): Set the isNumericCompareFunction bit - after compiling. - - * parser/Nodes.cpp: - (JSC::FunctionBodyNode::emitBytecode): Fixed a bug that caused us to - codegen an extra return at the end of all functions (eek!), since this - made it harder / weirder to detect the numeric comparison pattern in - bytecode. - - * runtime/ArrayPrototype.cpp: - (JSC::arrayProtoFuncSort): Use the isNumericCompareFunction bit to do - a faster sort if we can. - - * runtime/FunctionConstructor.cpp: - (JSC::extractFunctionBody): - (JSC::constructFunction): - * runtime/FunctionConstructor.h: Renamed and exported extractFunctionBody for - use in initializing lazyNumericCompareFunction. - - * runtime/JSArray.cpp: - (JSC::compareNumbersForQSort): - (JSC::compareByStringPairForQSort): - (JSC::JSArray::sortNumeric): - (JSC::JSArray::sort): - * runtime/JSArray.h: Added a fast numeric sort. Renamed ArrayQSortPair - to be more specific since we do different kinds of qsort now. + Fixed problems when using 'arguments' due to a half-initialized register. - * runtime/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): - (JSC::JSGlobalData::numericCompareFunction): - (JSC::JSGlobalData::ClientData::~ClientData): - * runtime/JSGlobalData.h: Added helper data for computing the - isNumericCompareFunction bit. + * interpreter/CallFrame.h: + (JSC::ExecState::setCalleeArguments): + (JSC::ExecState::init): Require a full JSValue when setting up the + 'arguments' virtual register, since this register is accessible from JIT + code and bytecode, and needs to be a true JSValue. -2009-02-13 Darin Adler <darin@apple.com> + * interpreter/CallFrameClosure.h: + (JSC::CallFrameClosure::resetCallFrame): ditto - * Configurations/JavaScriptCore.xcconfig: Undo accidental commit of this file. + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): ditto -2009-02-12 Darin Adler <darin@apple.com> + * interpreter/Register.h: Removed the constructor that allowed assignment + of a JSArguments* to a register. That is not safe. See above. - Reviewed by Oliver Hunt and Alexey Proskuryakov. + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_op_create_arguments): + (JSC::JITStubs::cti_op_create_arguments_no_params): ditto - Speed up a couple string functions. +2009-05-14 Sam Weinig <sam@webkit.org> - * runtime/StringPrototype.cpp: - (JSC::stringProtoFuncIndexOf): Added a fast path for cases where the second - argument is either missing or an integer. - (JSC::stringProtoFuncBig): Use jsNontrivialString since the string is guaranteed - to be 2 or more characters long. - (JSC::stringProtoFuncSmall): Ditto. - (JSC::stringProtoFuncBlink): Ditto. - (JSC::stringProtoFuncBold): Ditto. - (JSC::stringProtoFuncItalics): Ditto. - (JSC::stringProtoFuncStrike): Ditto. - (JSC::stringProtoFuncSub): Ditto. - (JSC::stringProtoFuncSup): Ditto. - (JSC::stringProtoFuncFontcolor): Ditto. - (JSC::stringProtoFuncFontsize): Make the fast path Sam recently added even faster - by avoiding all but the minimum memory allocation. - (JSC::stringProtoFuncAnchor): Use jsNontrivialString. - (JSC::stringProtoFuncLink): Added a fast path. + Reviewed by Geoffrey Garen. - * runtime/UString.cpp: - (JSC::UString::find): Added a fast path for single-character search strings. + We really want to go to the slow case in op_jfalse and + op_jtrue if the value is *not* boolean. -2009-02-13 David Levin <levin@chromium.org> + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_jfalse): + (JSC::JIT::emit_op_jtrue): - Reviewed by Darin Adler. +2009-05-14 Sam Weinig <sam@webkit.org> - Bug 23926: Race condition in callOnMainThreadAndWait - <https://bugs.webkit.org/show_bug.cgi?id=23926> + Reviewed by Geoffrey Garen. - * wtf/MainThread.cpp: - Removed callOnMainThreadAndWait since it isn't used. + Flipped the condition when emitting a an op_loop_if_less or op_loop_if_lesseq + if the first operand is a constant. -2009-02-13 Oliver Hunt <oliver@apple.com> + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_loop_if_less): + (JSC::JIT::emit_op_loop_if_lesseq): - Reviewed by Jon Honeycutt. +2009-05-14 Sam Weinig <sam@webkit.org> - Math.random is really slow on windows. + Reviewed by Geoffrey Garen. - Math.random calls WTF::randomNumber which is implemented as - the secure rand_s on windows. Unfortunately rand_s is an order - of magnitude slower than arc4random. For this reason I've - added "weakRandomNumber" for use by JavaScript's Math Object. - In the long term we should look at using our own secure PRNG - in place of the system, but this will do for now. + Added missing return in op_jnless and op_jnlesseq. - 30% win on SunSpider on Windows, resolving most of the remaining - disparity vs. Mac. + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_jnless): + (JSC::JIT::emit_op_jnlesseq): - * runtime/MathObject.cpp: - (JSC::MathObject::MathObject): - (JSC::mathProtoFuncRandom): - * wtf/RandomNumber.cpp: - (WTF::weakRandomNumber): - (WTF::randomNumber): - * wtf/RandomNumber.h: - * wtf/RandomNumberSeed.h: - (WTF::initializeWeakRandomNumberGenerator): +2009-05-14 Sam Weinig <sam@webkit.org> -2009-02-12 Mark Rowe <mrowe@apple.com> + Reviewed by Geoffrey Garen. - Fix the build for other platforms. + Load constants into the the register file as a temporary measure to + aid bring up. This allows us to use to treat constants like any + other virtual register. - * wtf/RandomNumber.cpp: - (WTF::randomNumber): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_enter): + (JSC::JIT::emit_op_enter_with_activation): -2009-02-12 Gavin Barraclough <barraclough@apple.com> +2009-05-14 Geoffrey Garen <ggaren@apple.com> Reviewed by Sam Weinig. - - Remove (/reduce) use of hard-wired register names from the JIT. - Currently there is no abstraction of registers used in the JIT, - which has a number of negative consequences. Hard-wiring x86 - register names makes the JIT less portable to other platforms, - and prevents us from performing dynamic register allocation to - attempt to maintain more temporary values in machine registers. - (The latter will be more important on x86-64, where we have more - registers to make use of). - - Also, remove MacroAssembler::mod32. This was not providing a - useful abstraction, and was not in keeping with the rest of the - MacroAssembler interface, in having specific register requirements. + + Implemented op_strict_eq. Original patch by Snowy, by way of Sam and Gavin. * assembler/MacroAssemblerX86Common.h: + (JSC::MacroAssemblerX86Common::set8): Added set8, since it's slightly + faster than set32, and the new value representation usually doesn't + need set32. + * jit/JIT.cpp: - (JSC::JIT::compileOpStrictEq): - (JSC::JIT::emitSlowScriptCheck): - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): - (JSC::JIT::privateCompile): - (JSC::JIT::privateCompileCTIMachineTrampolines): * jit/JIT.h: - * jit/JITArithmetic.cpp: - (JSC::JIT::compileFastArith_op_lshift): - (JSC::JIT::compileFastArithSlow_op_lshift): - (JSC::JIT::compileFastArith_op_rshift): - (JSC::JIT::compileFastArithSlow_op_rshift): - (JSC::JIT::compileFastArith_op_bitand): - (JSC::JIT::compileFastArithSlow_op_bitand): - (JSC::JIT::compileFastArith_op_mod): - (JSC::JIT::compileFastArithSlow_op_mod): - (JSC::JIT::compileFastArith_op_post_inc): - (JSC::JIT::compileFastArithSlow_op_post_inc): - (JSC::JIT::compileFastArith_op_post_dec): - (JSC::JIT::compileFastArithSlow_op_post_dec): - (JSC::JIT::compileFastArith_op_pre_inc): - (JSC::JIT::compileFastArithSlow_op_pre_inc): - (JSC::JIT::compileFastArith_op_pre_dec): - (JSC::JIT::compileFastArithSlow_op_pre_dec): - (JSC::JIT::compileFastArith_op_add): - (JSC::JIT::compileFastArith_op_mul): - (JSC::JIT::compileFastArith_op_sub): - (JSC::JIT::compileBinaryArithOp): - * jit/JITCall.cpp: - (JSC::JIT::compileOpCallInitializeCallFrame): - (JSC::JIT::compileOpCallSetupArgs): - (JSC::JIT::compileOpCallEvalSetupArgs): - (JSC::JIT::compileOpConstructSetupArgs): - (JSC::JIT::compileOpCall): - (JSC::JIT::compileOpCallSlowCase): * jit/JITInlineMethods.h: - (JSC::JIT::emitGetVirtualRegister): - (JSC::JIT::emitPutVirtualRegister): - (JSC::JIT::emitNakedCall): - (JSC::JIT::restoreArgumentReference): - (JSC::JIT::restoreArgumentReferenceForTrampoline): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::compileGetByIdHotPath): - (JSC::JIT::compilePutByIdHotPath): - (JSC::JIT::compileGetByIdSlowCase): - (JSC::JIT::compilePutByIdSlowCase): - (JSC::JIT::privateCompilePutByIdTransition): - (JSC::JIT::privateCompilePatchGetArrayLength): - (JSC::JIT::privateCompileGetByIdSelf): - (JSC::JIT::privateCompileGetByIdProto): - (JSC::JIT::privateCompileGetByIdSelfList): - (JSC::JIT::privateCompileGetByIdProtoList): - (JSC::JIT::privateCompileGetByIdChainList): - (JSC::JIT::privateCompileGetByIdChain): - (JSC::JIT::privateCompilePutByIdReplace): - -2009-02-12 Horia Olaru <olaru@adobe.com> - - Reviewed by Oliver Hunt. - - https://bugs.webkit.org/show_bug.cgi?id=23400 - - When throwing an exception within an eval argument string, the dst parameter was - modified in the functions below and the return value for eval was altered. Changed - the emitNode call in JSC::ThrowNode::emitBytecode to use a temporary register - to store its results instead of dst. The JSC::FunctionCallResolveNode::emitBytecode - would load the function within the dst registry, also altering the result returned - by eval. Replaced it with another temporary. - - * parser/Nodes.cpp: - (JSC::FunctionCallResolveNode::emitBytecode): - (JSC::ThrowNode::emitBytecode): - -2009-02-12 Sam Weinig <sam@webkit.org> + (JSC::JIT::emitLoadTag): + (JSC::JIT::emitLoadPayload): Added helper functions for dealing with + constants. Eventually, we should write special cases for all constants, + but these are helpful in the short term. - Reviewed by Geoffrey Garen. - - Speed up String.prototype.fontsize. + * jit/JITOpcodes.cpp: + (JSC::JIT::compileOpStrictEq): + (JSC::JIT::emitSlow_op_stricteq): + (JSC::JIT::emitSlow_op_nstricteq): teh opcodez. - * runtime/StringPrototype.cpp: - (JSC::stringProtoFuncFontsize): Specialize for defined/commonly used values. + * runtime/JSValue.h: + (JSC::JSValue::): + (JSC::JSValue::isDouble): Added a LowestTag for clarity. -2009-02-12 Geoffrey Garen <ggaren@apple.com> +2009-05-13 Geoffrey Garen <ggaren@apple.com> Reviewed by Sam Weinig. - Correctness fix. - - * wtf/RandomNumber.cpp: - (WTF::randomNumber): Divide by the maximum representable value, which - is different on each platform now, to get values between 0 and 1. + Fixed some bugs in host function calls. + + testapi now passes! -2009-02-12 Geoffrey Garen <ggaren@apple.com> + * jit/JIT.cpp: Changed some registers around to avoid overwriting edx:eax, + which is how JSValues are now returned. Also changed the code that + passes thisValue to pass the full 64bits of the value. Also added + an #error compiler directive to other platform builds, since the JSValue + return signature probably won't return in edx:eax on those platforms, + and we'll have to investigate a solution. - Build fix. - - * wtf/RandomNumber.cpp: - (WTF::randomNumber): - -2009-02-12 Geoffrey Garen <ggaren@apple.com> +2009-05-13 Geoffrey Garen <ggaren@apple.com> Reviewed by Sam Weinig. - Fixed <rdar://problem/6582048>. - - * wtf/RandomNumber.cpp: - (WTF::randomNumber): Make only one call to the random number generator - on platforms where the generator is cryptographically secure. The value - of randomness over and above cryptographically secure randomness is not - clear, and it caused some performance problems. - -2009-02-12 Adam Roben <aroben@apple.com> - - Fix lots of Perl warnings when building JavaScriptCoreGenerated on - Windows - - Reviewed by John Sullivan. - - * JavaScriptCore.vcproj/JavaScriptCore/build-generated-files.sh: - Create the docs/ directory so that we can write bytecode.html into it. - This matches what JavaScriptCore.xcodeproj does. - -2009-02-12 Simon Hausmann <simon.hausmann@nokia.com> - - Rubber-stamped by Lars. + Removed parameters from functions that are intended never to use their + parameters. - Re-enable the JIT in the Qt build with -fno-stack-protector on Linux. - - * JavaScriptCore.pri: - -2009-02-11 Dmitry Titov <dimich@chromium.org> - - Reviewed by Alexey Proskuryakov. - - https://bugs.webkit.org/show_bug.cgi?id=23705 - Fix the UI freeze caused by Worker generating a flood of messages. - Measure time we spend in executing posted work items. If too much time is spent - without returning to the run loop, exit and reschedule. + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emitSlow_op_get_by_val): + (JSC::JIT::emitSlow_op_put_by_val): - * wtf/MainThread.h: - Added initializeMainThreadPlatform() to initialize low-level mechanism for posting - work items from thread to thread. This removes #ifdefs for WIN and CHROMIUM from platform-independent code. +2009-05-13 Geoffrey Garen <ggaren@apple.com> - * wtf/MainThread.cpp: - (WTF::initializeMainThread): - (WTF::dispatchFunctionsFromMainThread): - Instead of dispatching all work items in the queue, dispatch them one by one - and measure elapsed time. After a threshold, reschedule and quit. + Reviewed by Sam Weinig. + + Ported op_instance_of from TOT. It's basically the same, but some register + stuff changed to memory stuff. - (WTF::callOnMainThread): - (WTF::callOnMainThreadAndWait): - Only schedule dispatch if the queue was empty - to avoid many posted messages in the run loop queue. + * jit/JITInlineMethods.h: + (JSC::JIT::emitPutJITStubArgFromVirtualRegister): + (JSC::JIT::emitStore): Changed to use helper functions. - * wtf/mac/MainThreadMac.mm: - (WTF::scheduleDispatchFunctionsOnMainThread): - Use static instance of the mainThreadCaller instead of allocating and releasing it each time. - (WTF::initializeMainThreadPlatform): - * wtf/gtk/MainThreadChromium.cpp: - (WTF::initializeMainThreadPlatform): - * wtf/gtk/MainThreadGtk.cpp: - (WTF::initializeMainThreadPlatform): - * wtf/qt/MainThreadQt.cpp: - (WTF::initializeMainThreadPlatform): - * wtf/win/MainThreadWin.cpp: - (WTF::initializeMainThreadPlatform): - * wtf/wx/MainThreadWx.cpp: - (WTF::initializeMainThreadPlatform): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_instanceof): + (JSC::JIT::emitSlow_op_instanceof): Ported from TOT. -2009-02-11 Sam Weinig <sam@webkit.org> +2009-05-13 Geoffrey Garen <ggaren@apple.com> Reviewed by Gavin Barraclough. + + Added a comment to explain an exception-handling subtelty that we found + hard to remember when reviewing my last patch. - Style cleanup. + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_catch): - * assembler/AbstractMacroAssembler.h: - (JSC::AbstractMacroAssembler::CodeLocationCommon::CodeLocationCommon): - (JSC::AbstractMacroAssembler::CodeLocationCommon::operator bool): - (JSC::AbstractMacroAssembler::CodeLocationCommon::reset): - (JSC::AbstractMacroAssembler::CodeLocationLabel::addressForSwitch): - (JSC::AbstractMacroAssembler::CodeLocationLabel::addressForExceptionHandler): - (JSC::AbstractMacroAssembler::CodeLocationLabel::addressForJSR): - (JSC::AbstractMacroAssembler::CodeLocationLabel::getJumpDestination): - (JSC::AbstractMacroAssembler::CodeLocationJump::relink): - (JSC::AbstractMacroAssembler::CodeLocationJump::CodeLocationJump): - (JSC::AbstractMacroAssembler::CodeLocationCall::relink): - (JSC::AbstractMacroAssembler::CodeLocationCall::calleeReturnAddressValue): - (JSC::AbstractMacroAssembler::CodeLocationCall::CodeLocationCall): - (JSC::AbstractMacroAssembler::CodeLocationDataLabel32::repatch): - (JSC::AbstractMacroAssembler::CodeLocationDataLabel32::CodeLocationDataLabel32): - (JSC::AbstractMacroAssembler::CodeLocationDataLabelPtr::repatch): - (JSC::AbstractMacroAssembler::CodeLocationDataLabelPtr::CodeLocationDataLabelPtr): - (JSC::AbstractMacroAssembler::ProcessorReturnAddress::ProcessorReturnAddress): - (JSC::AbstractMacroAssembler::ProcessorReturnAddress::relinkCallerToFunction): - (JSC::AbstractMacroAssembler::ProcessorReturnAddress::operator void*): - (JSC::AbstractMacroAssembler::PatchBuffer::link): - (JSC::::CodeLocationCommon::labelAtOffset): - (JSC::::CodeLocationCommon::jumpAtOffset): - (JSC::::CodeLocationCommon::callAtOffset): - (JSC::::CodeLocationCommon::dataLabelPtrAtOffset): - (JSC::::CodeLocationCommon::dataLabel32AtOffset): - -2009-02-11 Sam Weinig <sam@webkit.org> +2009-05-13 Geoffrey Garen <ggaren@apple.com> - Reviewed by Gavin Barraclough. + Reviewed by Sam Weinig. + + Implemented try/catch. - * assembler/AbstractMacroAssembler.h: Fix comments. + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_throw): Updated to use JITStackFrame abstraction. + (JSC::JIT::emit_op_catch): Filled out. -2009-02-11 Alexey Proskuryakov <ap@webkit.org> +2009-05-13 Sam Weinig <sam@webkit.org> - Trying to fix wx build. + Reviewed by Geoffrey Garen. - * bytecode/JumpTable.h: Include "MacroAssembler.h", not <MacroAssembler.h>. - * jscore.bkl: Added assembler directory to search paths. + Implemented op_loop_if_true, op_jfalse, op_jtrue, op_jeq_null and op_jneq_null -2009-02-10 Gavin Barraclough <barraclough@apple.com> + * jit/JITOpcodes.cpp: + (JSC::JIT::emitSlow_op_instanceof): Moved from below to be next to its + fast brother. - Build - fix. - (Narrow - changelog - for - dhyatt). + (JSC::JIT::emit_op_loop_if_true): Similar to the old version + in that it tries to do the integer case first and reduce the + number of jumps you might need to take. + (JSC::JIT::emitSlow_op_loop_if_true): - * bytecode/Instruction.h: - (JSC::PolymorphicAccessStructureList::PolymorphicStubInfo::set): - (JSC::PolymorphicAccessStructureList::PolymorphicAccessStructureList): + (JSC::JIT::emit_op_jfalse): Very similar to op_loop_if_true, only + the inverse and without a timeout check. + (JSC::JIT::emitSlow_op_jfalse): -2009-02-10 Gavin Barraclough <barraclough@apple.com> + (JSC::JIT::emit_op_jtrue): Very similar to op_loop_if_true except + without the timeout check. + (JSC::JIT::emitSlow_op_jtrue): - Reviewed by Oliver Hunt. + (JSC::JIT::emit_op_jeq_null): Very similar to the implementation + of op_eq, except it takes jumps instead of copying the condition + to a dst. + (JSC::JIT::emit_op_jneq_null): Ditto but for op_neq. - Reduce use of void* / reinterpret_cast in JIT repatching code, - add strong types for Calls and for the various types of pointers - we retain into the JIT generated instruction stream. +2009-05-13 Geoffrey Garen <ggaren@apple.com> - No performance impact. + Reviewed by Sam Weinig. + + Implemented op_call_varargs. - * assembler/AbstractMacroAssembler.h: - (JSC::AbstractMacroAssembler::ImmPtr::ImmPtr): - (JSC::AbstractMacroAssembler::ImmPtr::asIntptr): - (JSC::AbstractMacroAssembler::Imm32::Imm32): - (JSC::AbstractMacroAssembler::Label::Label): - (JSC::AbstractMacroAssembler::DataLabelPtr::DataLabelPtr): - (JSC::AbstractMacroAssembler::Call::Call): - (JSC::AbstractMacroAssembler::Call::link): - (JSC::AbstractMacroAssembler::Call::linkTo): - (JSC::AbstractMacroAssembler::Jump::Jump): - (JSC::AbstractMacroAssembler::Jump::linkTo): - (JSC::AbstractMacroAssembler::CodeLocationCommon::CodeLocationCommon): - (JSC::AbstractMacroAssembler::CodeLocationCommon::operator bool): - (JSC::AbstractMacroAssembler::CodeLocationCommon::reset): - (JSC::AbstractMacroAssembler::CodeLocationLabel::CodeLocationLabel): - (JSC::AbstractMacroAssembler::CodeLocationLabel::addressForSwitch): - (JSC::AbstractMacroAssembler::CodeLocationLabel::addressForExceptionHandler): - (JSC::AbstractMacroAssembler::CodeLocationLabel::addressForJSR): - (JSC::AbstractMacroAssembler::CodeLocationLabel::getJumpDestination): - (JSC::AbstractMacroAssembler::CodeLocationJump::CodeLocationJump): - (JSC::AbstractMacroAssembler::CodeLocationJump::relink): - (JSC::AbstractMacroAssembler::CodeLocationCall::CodeLocationCall): - (JSC::AbstractMacroAssembler::CodeLocationCall::relink): - (JSC::AbstractMacroAssembler::CodeLocationCall::calleeReturnAddressValue): - (JSC::AbstractMacroAssembler::CodeLocationDataLabel32::CodeLocationDataLabel32): - (JSC::AbstractMacroAssembler::CodeLocationDataLabel32::repatch): - (JSC::AbstractMacroAssembler::CodeLocationDataLabelPtr::CodeLocationDataLabelPtr): - (JSC::AbstractMacroAssembler::CodeLocationDataLabelPtr::repatch): - (JSC::AbstractMacroAssembler::ProcessorReturnAddress::ProcessorReturnAddress): - (JSC::AbstractMacroAssembler::ProcessorReturnAddress::relinkCallerToFunction): - (JSC::AbstractMacroAssembler::ProcessorReturnAddress::operator void*): - (JSC::AbstractMacroAssembler::PatchBuffer::entry): - (JSC::AbstractMacroAssembler::PatchBuffer::trampolineAt): - (JSC::AbstractMacroAssembler::PatchBuffer::link): - (JSC::AbstractMacroAssembler::PatchBuffer::linkTailRecursive): - (JSC::AbstractMacroAssembler::PatchBuffer::patch): - (JSC::AbstractMacroAssembler::PatchBuffer::locationOf): - (JSC::AbstractMacroAssembler::PatchBuffer::returnAddressOffset): - (JSC::AbstractMacroAssembler::differenceBetween): - (JSC::::CodeLocationCommon::labelAtOffset): - (JSC::::CodeLocationCommon::jumpAtOffset): - (JSC::::CodeLocationCommon::callAtOffset): - (JSC::::CodeLocationCommon::dataLabelPtrAtOffset): - (JSC::::CodeLocationCommon::dataLabel32AtOffset): - * assembler/MacroAssemblerX86Common.h: - (JSC::MacroAssemblerX86Common::call): - * assembler/X86Assembler.h: - (JSC::X86Assembler::getCallReturnOffset): - * bytecode/CodeBlock.h: - (JSC::CallLinkInfo::CallLinkInfo): - (JSC::getStructureStubInfoReturnLocation): - (JSC::getCallLinkInfoReturnLocation): - * bytecode/Instruction.h: - (JSC::PolymorphicAccessStructureList::PolymorphicStubInfo::set): - (JSC::PolymorphicAccessStructureList::PolymorphicAccessStructureList): - * bytecode/JumpTable.h: - (JSC::StringJumpTable::ctiForValue): - (JSC::SimpleJumpTable::ctiForValue): - * bytecode/StructureStubInfo.h: - (JSC::StructureStubInfo::StructureStubInfo): - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::emitCatch): - (JSC::prepareJumpTableForStringSwitch): - * interpreter/Interpreter.cpp: - (JSC::Interpreter::cti_op_get_by_id_self_fail): - (JSC::getPolymorphicAccessStructureListSlot): - (JSC::Interpreter::cti_op_throw): - (JSC::Interpreter::cti_op_switch_imm): - (JSC::Interpreter::cti_op_switch_char): - (JSC::Interpreter::cti_op_switch_string): - (JSC::Interpreter::cti_vm_throw): - * jit/JIT.cpp: - (JSC::ctiSetReturnAddress): - (JSC::ctiPatchCallByReturnAddress): - (JSC::JIT::privateCompile): - (JSC::JIT::privateCompileCTIMachineTrampolines): - * jit/JIT.h: - (JSC::CallRecord::CallRecord): - (JSC::JIT::compileGetByIdSelf): - (JSC::JIT::compileGetByIdProto): - (JSC::JIT::compileGetByIdChain): - (JSC::JIT::compilePutByIdReplace): - (JSC::JIT::compilePutByIdTransition): - (JSC::JIT::compilePatchGetArrayLength): - (JSC::JIT::emitCTICall): * jit/JITCall.cpp: - (JSC::JIT::unlinkCall): - (JSC::JIT::linkCall): - * jit/JITInlineMethods.h: - (JSC::JIT::emitNakedCall): - (JSC::JIT::emitCTICall_internal): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::compileGetByIdSlowCase): - (JSC::JIT::compilePutByIdSlowCase): - (JSC::JIT::privateCompilePutByIdTransition): - (JSC::JIT::patchGetByIdSelf): - (JSC::JIT::patchPutByIdReplace): - (JSC::JIT::privateCompilePatchGetArrayLength): - (JSC::JIT::privateCompileGetByIdSelf): - (JSC::JIT::privateCompileGetByIdProto): - (JSC::JIT::privateCompileGetByIdSelfList): - (JSC::JIT::privateCompileGetByIdProtoList): - (JSC::JIT::privateCompileGetByIdChainList): - (JSC::JIT::privateCompileGetByIdChain): - (JSC::JIT::privateCompilePutByIdReplace): - -2009-02-10 Adam Roben <aroben@apple.com> - - Windows build fix after r40813 - - * JavaScriptCore.vcproj/jsc/jsc.vcproj: Added profiler/ to the include - path so that Profiler.h can be found. - -2009-02-09 Gavin Barraclough <barraclough@apple.com> + (JSC::JIT::compileOpCallVarargsSetupArgs): + (JSC::JIT::compileOpCallVarargs): + (JSC::JIT::emit_op_call): + (JSC::JIT::emit_op_call_eval): + (JSC::JIT::emit_op_load_varargs): + (JSC::JIT::emit_op_call_varargs): + (JSC::JIT::emit_op_construct): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_jneq_ptr): - Reviewed by Oliver Hunt. +2009-05-13 Geoffrey Garen <ggaren@apple.com> - Provide a class type for a generated block of JIT code. - Also changes the return address -> bytecode index map to - track the return addess as an unsigned offset into the code - instead of a ptrdiff_t in terms of void**s - the latter is - equal to the actual offset / sizeof(void*), making it a - potentially lossy representation. + Reviewed by Sam Weinig. + + Implemented op_call_eval. - * JavaScriptCore.xcodeproj/project.pbxproj: - * assembler/AbstractMacroAssembler.h: - (JSC::AbstractMacroAssembler::PatchBuffer::returnAddressOffset): - * assembler/X86Assembler.h: - (JSC::X86Assembler::getCallReturnOffset): - * bytecode/CodeBlock.h: - (JSC::CallReturnOffsetToBytecodeIndex::CallReturnOffsetToBytecodeIndex): - (JSC::getCallReturnOffset): - (JSC::CodeBlock::getBytecodeIndex): - (JSC::CodeBlock::jitCode): - (JSC::CodeBlock::callReturnIndexVector): - * interpreter/Interpreter.cpp: - (JSC::Interpreter::execute): - (JSC::Interpreter::cti_vm_dontLazyLinkCall): - (JSC::Interpreter::cti_vm_lazyLinkCall): - * jit/JIT.cpp: - (JSC::JIT::privateCompile): - * jit/JIT.h: - (JSC::): * jit/JITCall.cpp: - (JSC::JIT::linkCall): - * jit/JITCode.h: Added. - (JSC::): - (JSC::JITCode::JITCode): - (JSC::JITCode::operator bool): - (JSC::JITCode::addressForCall): - (JSC::JITCode::offsetOf): - (JSC::JITCode::execute): - -2009-02-09 John Grabowski <jrg@chromium.org> - - Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=23856 - Change the definition of "main thread" for Chromium on OSX. - It does not match the DARWIN definition. - - * wtf/ThreadingPthreads.cpp: - (WTF::initializeThreading): - (WTF::isMainThread): - -2009-02-09 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Minor bugfix, incorrect check meant that subtraction causing integer overflow - would be missed on x86-64 JIT. - - * jit/JITArithmetic.cpp: - (JSC::JIT::compileBinaryArithOp): - -2009-02-09 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - A more sensible register allocation for x86-64. - - When WREC was ported to x86-64 it stuck with the same register allocation as x86. - This requires registers to be reordered on entry into WREC generated code, since - argument passing is different on x86-64 and x86 (regparm(3)). This patch switches - x86-64 to use a native register allocation, that does not require argument registers - to be reordered. - - * wrec/WRECGenerator.cpp: - (JSC::WREC::Generator::generateEnter): - (JSC::WREC::Generator::generateReturnSuccess): - (JSC::WREC::Generator::generateReturnFailure): - * wrec/WRECGenerator.h: - -2009-02-05 Adam Roben <aroben@apple.com> - - Build fix - - Rubberstamped by Sam Weinig. - - * wtf/TypeTraits.h: Include Platform.h, since this header uses macros - defined there. - -2009-02-05 Dimitri Glazkov <dglazkov@chromium.org> - - Reviewed by Eric Seidel. - - https://bugs.webkit.org/show_bug.cgi?id=23747 - Add Chromium threading-related files. - - * wtf/MainThread.cpp: Added platform guard to initializeMainThread. - * wtf/chromium/ChromiumThreading.h: Added. - * wtf/chromium/MainThreadChromium.cpp: Added. - (WTF::initializeMainThread): - (WTF::scheduleDispatchFunctionsOnMainThread): - -2009-02-05 David Levin <levin@chromium.org> - - Reviewed by Darin Adler. - - Bug 23713: COMPILE_ASSERTS should be moved out of TypeTraits.h and into .cpp file - <https://bugs.webkit.org/show_bug.cgi?id=23713> - - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.scons: - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - - * wtf/HashTraits.h: - Remove unnecessary header file that I missed when moving out the type traits form this file. - - * wtf/TypeTraits.cpp: Added. - (WTF::): - * wtf/TypeTraits.h: - Moved the compile asserts into TypeTraits.cpp file. - -2009-02-04 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver 'the nun' Hunt. + (JSC::JIT::compileOpCallVarargsSetupArgs): + (JSC::JIT::compileOpCall): + * jit/JITStubCall.h: + (JSC::CallEvalJITStub::CallEvalJITStub): - Add -e switch to jsc to enable evaluation of scripts passed on the command line. +2009-05-13 Sam Weinig <sam@webkit.org> - * jsc.cpp: - (Script::Script): - (runWithScripts): - (printUsageStatement): - (parseArguments): - (jscmain): - -2009-02-04 Gavin Barraclough <barraclough@apple.com> + Reviewed by Gavin Barraclough. - Rubber stamped by Sam 'Big Mac' Weinig. + Implemented op_not. (Gavin did most of the work!) - * assembler/AbstractMacroAssembler.h: Copied from assembler/MacroAssembler.h. - * assembler/MacroAssemblerX86.h: Copied from assembler/MacroAssembler.h. - * assembler/MacroAssemblerX86Common.h: Copied from assembler/MacroAssembler.h. - * assembler/MacroAssemblerX86_64.h: Copied from assembler/MacroAssembler.h. + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_not): + (JSC::JIT::emitSlow_op_not): -2009-02-04 Gavin Barraclough <barraclough@apple.com> +2009-05-13 Geoffrey Garen <ggaren@apple.com> Reviewed by Sam Weinig. + + Implemented op_global_resolve. - This patch tidies up the MacroAssembler, cleaning up the code and refactoring out the - platform-specific parts. The MacroAssembler gets split up like a beef burger, with the - platform-agnostic data types being the lower bun (in the form of the class AbstractMacroAssembler), - the plaform-specific code generation forming a big meaty patty of methods like 'add32', - 'branch32', etc (MacroAssemblerX86), and finally topped off with the bun-lid of the - MacroAssembler class itself, providing covenience methods such as the stack peek & poke, - and backwards branch methods, all of which can be described in a platform independent - way using methods from the base class. The AbstractMacroAssembler is templated on the - type of the assembler class that will be used for code generation, and the three layers - are held together with the cocktail stick of inheritance. - - The above description is a slight simplification since the MacroAssemblerX86 is actually - formed from two layers (in effect giving us a kind on bacon double cheeseburger) - with the - bulk of methods that are common between x86 & x86-64 implemented in MacroAssemblerX86Common, - which forms a base class for MacroAssemblerX86 and MacroAssemblerX86_64 (which add the methods - specific to the given platform). - - I'm landing these changes first without splitting the classes across multiple files, - I will follow up with a second patch to split up the file MacroAssembler.h. - - * assembler/MacroAssembler.h: - (JSC::AbstractMacroAssembler::): - (JSC::AbstractMacroAssembler::DataLabelPtr::DataLabelPtr): - (JSC::AbstractMacroAssembler::DataLabelPtr::patch): - (JSC::AbstractMacroAssembler::DataLabel32::DataLabel32): - (JSC::AbstractMacroAssembler::DataLabel32::patch): - (JSC::AbstractMacroAssembler::Label::Label): - (JSC::AbstractMacroAssembler::Jump::Jump): - (JSC::AbstractMacroAssembler::Jump::link): - (JSC::AbstractMacroAssembler::Jump::linkTo): - (JSC::AbstractMacroAssembler::Jump::patch): - (JSC::AbstractMacroAssembler::JumpList::link): - (JSC::AbstractMacroAssembler::JumpList::linkTo): - (JSC::AbstractMacroAssembler::PatchBuffer::link): - (JSC::AbstractMacroAssembler::PatchBuffer::addressOf): - (JSC::AbstractMacroAssembler::PatchBuffer::setPtr): - (JSC::AbstractMacroAssembler::size): - (JSC::AbstractMacroAssembler::copyCode): - (JSC::AbstractMacroAssembler::label): - (JSC::AbstractMacroAssembler::align): - (JSC::AbstractMacroAssembler::differenceBetween): - (JSC::MacroAssemblerX86Common::xor32): - (JSC::MacroAssemblerX86Common::load32WithAddressOffsetPatch): - (JSC::MacroAssemblerX86Common::store32WithAddressOffsetPatch): - (JSC::MacroAssemblerX86Common::move): - (JSC::MacroAssemblerX86Common::swap): - (JSC::MacroAssemblerX86Common::signExtend32ToPtr): - (JSC::MacroAssemblerX86Common::zeroExtend32ToPtr): - (JSC::MacroAssemblerX86Common::branch32): - (JSC::MacroAssemblerX86Common::jump): - (JSC::MacroAssemblerX86_64::add32): - (JSC::MacroAssemblerX86_64::sub32): - (JSC::MacroAssemblerX86_64::load32): - (JSC::MacroAssemblerX86_64::store32): - (JSC::MacroAssemblerX86_64::addPtr): - (JSC::MacroAssemblerX86_64::andPtr): - (JSC::MacroAssemblerX86_64::orPtr): - (JSC::MacroAssemblerX86_64::rshiftPtr): - (JSC::MacroAssemblerX86_64::subPtr): - (JSC::MacroAssemblerX86_64::xorPtr): - (JSC::MacroAssemblerX86_64::loadPtr): - (JSC::MacroAssemblerX86_64::loadPtrWithAddressOffsetPatch): - (JSC::MacroAssemblerX86_64::storePtr): - (JSC::MacroAssemblerX86_64::storePtrWithAddressOffsetPatch): - (JSC::MacroAssemblerX86_64::branchPtr): - (JSC::MacroAssemblerX86_64::branchTestPtr): - (JSC::MacroAssemblerX86_64::branchAddPtr): - (JSC::MacroAssemblerX86_64::branchSubPtr): - (JSC::MacroAssemblerX86_64::branchPtrWithPatch): - (JSC::MacroAssemblerX86_64::storePtrWithPatch): - (JSC::MacroAssemblerX86::add32): - (JSC::MacroAssemblerX86::sub32): - (JSC::MacroAssemblerX86::load32): - (JSC::MacroAssemblerX86::store32): - (JSC::MacroAssemblerX86::branch32): - (JSC::MacroAssemblerX86::branchPtrWithPatch): - (JSC::MacroAssemblerX86::storePtrWithPatch): - (JSC::MacroAssembler::pop): - (JSC::MacroAssembler::peek): - (JSC::MacroAssembler::poke): - (JSC::MacroAssembler::branchPtr): - (JSC::MacroAssembler::branch32): - (JSC::MacroAssembler::branch16): - (JSC::MacroAssembler::branchTestPtr): - (JSC::MacroAssembler::addPtr): - (JSC::MacroAssembler::andPtr): - (JSC::MacroAssembler::orPtr): - (JSC::MacroAssembler::rshiftPtr): - (JSC::MacroAssembler::subPtr): - (JSC::MacroAssembler::xorPtr): - (JSC::MacroAssembler::loadPtr): - (JSC::MacroAssembler::loadPtrWithAddressOffsetPatch): - (JSC::MacroAssembler::storePtr): - (JSC::MacroAssembler::storePtrWithAddressOffsetPatch): - (JSC::MacroAssembler::branchAddPtr): - (JSC::MacroAssembler::branchSubPtr): - * jit/JITArithmetic.cpp: - (JSC::JIT::compileBinaryArithOp): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_loop_if_less): + (JSC::JIT::emit_op_loop_if_lesseq): Added back accidentally removed + early returns. -2009-02-04 Alexey Proskuryakov <ap@webkit.org> + (JSC::JIT::emit_op_resolve_global): + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_op_resolve_global): Pretty similar to the old code, + but we need two reads and a TimesEight step in order to account for the + 64bit value size. - Reviewed by Sam Weinig. + * jit/JITStubs.h: + (JSC::): Slightly tweaked this code to specialize for a JSGlobalObject*, + to avoid having to pass an irrelevant tag pointer to the stub. - https://bugs.webkit.org/show_bug.cgi?id=23681 - Worker tests crash in debug builds if run --singly +2009-05-13 Sam Weinig <sam@webkit.org> - The crash happened because worker threads continued running while debug-only static objects - were already being destroyed on main thread. + Reviewed by Geoffrey Garen. - * runtime/Structure.cpp: Create static debug-only sets in heap, so that they don't get - destroyed. + Implemented op_to_jsnumber. - * wtf/ThreadingPthreads.cpp: Changed assertions to conventional form. + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_to_jsnumber): + (JSC::JIT::emitSlow_op_to_jsnumber): -2009-02-03 Gavin Barraclough <barraclough@apple.com> +2009-05-13 Sam Weinig <sam@webkit.org> - Reviewed by Geoff Garen. + Reviewed by Geoffrey Garen. - https://bugs.webkit.org/show_bug.cgi?id=23715 + Implemented op_convert_this. - Simplify MacroAssembler interface, by combining comparison methods. - Seprate operations are combined as follows: - jz32/jnz32/jzPtr/jnzPtr -> branchTest32/branchTestPtr, - j*(Add|Mul|Sub)32/j*(Add|Mul|Sub)Ptr -> branch(Add|Mul|Sub)32/branch(Add|Mul|Sub)Ptr - j*32/j*Ptr (all other two op combparisons) -> branch32/brnachPtr - set*32 -> set32 + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_convert_this): + (JSC::JIT::emitSlow_op_convert_this): - Also, represent the Scale of BaseIndex addresses as a plain enum (0,1,2,3), - instead of as multiplicands (1,2,4,8). +2009-05-13 Geoffrey Garen <ggaren@apple.com> - This patch singificantly reduces replication of code, and increases functionality supported - by the MacroAssembler. No performance impact. + Reviewed by Sam Weinig. + + Got basic JS function and constructor calls working. - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::): - (JSC::MacroAssembler::branchPtr): - (JSC::MacroAssembler::branchPtrWithPatch): - (JSC::MacroAssembler::branch32): - (JSC::MacroAssembler::branch16): - (JSC::MacroAssembler::branchTestPtr): - (JSC::MacroAssembler::branchTest32): - (JSC::MacroAssembler::branchAddPtr): - (JSC::MacroAssembler::branchAdd32): - (JSC::MacroAssembler::branchMul32): - (JSC::MacroAssembler::branchSubPtr): - (JSC::MacroAssembler::branchSub32): - (JSC::MacroAssembler::set32): - (JSC::MacroAssembler::setTest32): - * assembler/X86Assembler.h: - (JSC::X86Assembler::): - (JSC::X86Assembler::jccRel32): - (JSC::X86Assembler::setccOpcode): - (JSC::X86Assembler::cmpq_mr): - (JSC::X86Assembler::setcc_r): - (JSC::X86Assembler::sete_r): - (JSC::X86Assembler::setne_r): - (JSC::X86Assembler::jne): - (JSC::X86Assembler::je): - (JSC::X86Assembler::jl): - (JSC::X86Assembler::jb): - (JSC::X86Assembler::jle): - (JSC::X86Assembler::jbe): - (JSC::X86Assembler::jge): - (JSC::X86Assembler::jg): - (JSC::X86Assembler::ja): - (JSC::X86Assembler::jae): - (JSC::X86Assembler::jo): - (JSC::X86Assembler::jp): - (JSC::X86Assembler::js): - (JSC::X86Assembler::jcc): - (JSC::X86Assembler::X86InstructionFormatter::putModRmSib): * jit/JIT.cpp: - (JSC::JIT::compileOpStrictEq): - (JSC::JIT::emitSlowScriptCheck): - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): - (JSC::JIT::privateCompile): (JSC::JIT::privateCompileCTIMachineTrampolines): - * jit/JITArithmetic.cpp: - (JSC::JIT::compileFastArith_op_lshift): - (JSC::JIT::compileFastArith_op_mod): - (JSC::JIT::compileFastArith_op_post_inc): - (JSC::JIT::compileFastArith_op_post_dec): - (JSC::JIT::compileFastArith_op_pre_inc): - (JSC::JIT::compileFastArith_op_pre_dec): - (JSC::JIT::compileBinaryArithOp): - (JSC::JIT::compileFastArith_op_add): - (JSC::JIT::compileFastArith_op_mul): + * jit/JIT.h: * jit/JITCall.cpp: - (JSC::JIT::compileOpCall): - (JSC::JIT::compileOpCallSlowCase): - * jit/JITInlineMethods.h: - (JSC::JIT::checkStructure): - (JSC::JIT::emitJumpIfJSCell): - (JSC::JIT::emitJumpIfNotJSCell): - (JSC::JIT::emitJumpIfImmediateNumber): - (JSC::JIT::emitJumpIfNotImmediateNumber): - (JSC::JIT::emitJumpIfImmediateInteger): - (JSC::JIT::emitJumpIfNotImmediateInteger): - (JSC::JIT::emitFastArithDeTagImmediateJumpIfZero): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::compileGetByIdHotPath): - (JSC::JIT::compilePutByIdHotPath): - (JSC::JIT::privateCompilePutByIdTransition): - (JSC::JIT::privateCompilePatchGetArrayLength): - (JSC::JIT::privateCompileGetByIdProto): - (JSC::JIT::privateCompileGetByIdProtoList): - (JSC::JIT::privateCompileGetByIdChainList): - (JSC::JIT::privateCompileGetByIdChain): - * runtime/RegExp.cpp: - (JSC::RegExp::match): - * wrec/WRECGenerator.cpp: - (JSC::WREC::Generator::generateEnter): - (JSC::WREC::Generator::generateIncrementIndex): - (JSC::WREC::Generator::generateLoadCharacter): - (JSC::WREC::Generator::generateJumpIfNotEndOfInput): - (JSC::WREC::Generator::generateBackreferenceQuantifier): - (JSC::WREC::Generator::generateNonGreedyQuantifier): - (JSC::WREC::Generator::generateGreedyQuantifier): - (JSC::WREC::Generator::generatePatternCharacterPair): - (JSC::WREC::Generator::generatePatternCharacter): - (JSC::WREC::Generator::generateCharacterClassInvertedRange): - (JSC::WREC::Generator::generateCharacterClassInverted): - (JSC::WREC::Generator::generateAssertionBOL): - (JSC::WREC::Generator::generateAssertionEOL): - (JSC::WREC::Generator::generateAssertionWordBoundary): - (JSC::WREC::Generator::generateBackreference): - -2009-02-03 David Hyatt <hyatt@apple.com> - - Fix a bug in Vector's shrinkCapacity method. It did not properly copy elements into the inline buffer - when shrinking down from a size that was greater than the inline capacity. - - Reviewed by Maciej - - * wtf/Vector.h: - (WTF::VectorBuffer::VectorBuffer): - (WTF::VectorBuffer::allocateBuffer): - -2009-02-03 Simon Hausmann <simon.hausmann@nokia.com> - - Reviewed by Tor Arne Vestbø. - - Added accessor for JSByteArray storage. - - * runtime/JSByteArray.h: - (JSC::JSByteArray::storage): - -2009-02-03 Dmitry Titov <dimich@chromium.org> - - Reviewed by Alexey Proskuryakov. - - https://bugs.webkit.org/show_bug.cgi?id=23560 - Implement SharedTimer on WorkerRunLoop - - * JavaScriptCore.exp: - Forgot to expose ThreadCondition::timedWait() in one of previous patches. - -2009-02-02 Oliver Hunt <oliver@apple.com> - - Reviewed by Gavin Barraclough. - - <https://bugs.webkit.org/show_bug.cgi?id=21414> REGRESSION: Regular Expressions and character classes, shorthands and ranges - <rdar://problem/6543487> - - In certain circumstances when WREC::Generator::generateCharacterClassInvertedRange invokes - itself recursively, it will incorrectly emit (and thus consume) the next single character - match in the current character class. As WREC uses a binary search this out of sequence - codegen could result in a character match being missed and so cause the regex to produce - incorrect results. - - * wrec/WRECGenerator.cpp: - (JSC::WREC::Generator::generateCharacterClassInvertedRange): - -2009-02-02 Darin Adler <darin@apple.com> - - Reviewed by Dave Hyatt. - - Bug 23676: Speed up uses of reserveCapacity on new vectors by adding a new reserveInitialCapacity - https://bugs.webkit.org/show_bug.cgi?id=23676 - - * API/JSObjectRef.cpp: - (JSObjectCopyPropertyNames): Use reserveInitialCapacity. - * parser/Lexer.cpp: - (JSC::Lexer::Lexer): Ditto. - (JSC::Lexer::clear): Ditto. - - * wtf/Vector.h: Added reserveInitialCapacity, a more efficient version of - reserveCapacity for use when the vector is brand new (still size 0 with no - capacity other than the inline capacity). - -2009-01-30 Mark Rowe <mrowe@apple.com> + (JSC::JIT::compileOpCallSetupArgs): + (JSC::JIT::compileOpCallVarargsSetupArgs): + (JSC::JIT::compileOpConstructSetupArgs): + (JSC::JIT::emit_op_ret): + (JSC::JIT::emit_op_construct_verify): + (JSC::JIT::emitSlow_op_construct_verify): + (JSC::JIT::emitSlow_op_call): + (JSC::JIT::emitSlow_op_call_eval): + (JSC::JIT::emitSlow_op_call_varargs): + (JSC::JIT::emitSlow_op_construct): + (JSC::JIT::compileOpCall): Filled out these cases, with call_eval #if'd out. - Rubber-stamped by Oliver Hunt. + * jit/JITInlineMethods.h: + (JSC::JIT::emitPutJITStubArgFromVirtualRegister): + (JSC::JIT::emitLoad): Restored some legacy "*CTIArg*" functions, + since I wanted to avoid the complexity of revamping the API here while + trying to bring it up. Eventually, we should re-remove all of these functions. - <rdar://problem/6391501> Enable the JIT on Mac OS X x86_64 as it passes all tests. + (JSC::JIT::recordJumpTarget): Removed unnecessary macro cruft. You will + not silence me, Sam Weinig! The world will know that you are a crufty, + crufty, crufty programmer!!! - * wtf/Platform.h: + * jit/JITOpcodes.cpp: + * jit/JITStubs.cpp: + (JSC::): + * jit/JITStubs.h: Changed up some offsets in the JITStackFrame class, since + and off-by-one error was causing stack misalignment. -2009-01-30 Oliver Hunt <oliver@apple.com> +2009-05-13 Sam Weinig <sam@webkit.org> - Reviewed by Mark Rowe and Sam Weinig. + Reviewed by Geoffrey Garen. - Finally fix load() to propagate exceptions correctly. + Implement op_eq_null and op_neq_null. + * assembler/MacroAssemblerX86Common.h: + (JSC::MacroAssemblerX86Common::set8): + (JSC::MacroAssemblerX86Common::setTest8): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_stricteq): + (JSC::JIT::emitSlow_op_stricteq): + (JSC::JIT::emit_op_nstricteq): + (JSC::JIT::emitSlow_op_nstricteq): + (JSC::JIT::emit_op_eq_null): + (JSC::JIT::emit_op_neq_null): * jsc.cpp: - (functionLoad): - -2009-01-30 David Levin <levin@chromium.org> - - Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=23618 - Templated worker tasks should be more error proof to use. - Fix Chromium build. - - * wtf/TypeTraits.h: - (WTF::IsConvertibleToInteger::IsConvertibleToDouble): - Avoid "possible loss of data" warning when using Microsoft's C++ compiler - by avoiding an implicit conversion of int types to doubles. - -2009-01-30 Laszlo Gombos <laszlo.1.gombos@nokia.com> - - Reviewed by Simon Hausmann. - - Bug 23580: GNU mode RVCT compilation support - <https://bugs.webkit.org/show_bug.cgi?id=23580> - - * pcre/pcre_exec.cpp: Use COMPILER(GCC) instead of __GNUC__. - * wtf/FastMalloc.cpp: Ditto. - (WTF::TCMallocStats::): - * wtf/Platform.h: Don't define COMPILER(GCC) with RVCT --gnu. - -2009-01-30 David Levin <levin@chromium.org> - - Reviewed by Alexey Proskuryakov. - - Bug 23618: Templated worker tasks should be more error proof to use - <https://bugs.webkit.org/show_bug.cgi?id=23618> - - Add the type traits needed for the generic worker tasks - and compile asserts for them. - - Add a summary header to the TypeTraits.h file to explain what is in there. - - Add a note to explain IsPod's deficiencies. - - * wtf/TypeTraits.h: - -2009-01-30 David Levin <levin@chromium.org> - - Reviewed by Alexey Proskuryakov. - - Bug 23616: Various "template helpers" should be consolidated from isolated files in JavaScriptCore. - <https://bugs.webkit.org/show_bug.cgi?id=23616> - - * wtf/TypeTraits.h: Moved RemovePointer, IsPod, IsInteger to this file. - - * wtf/OwnPtr.h: Use RemovePointer from TypeTraits.h. - * wtf/RetainPtr.h: Ditto. - - * wtf/HashTraits.h: Use IsInteger from TypeTraits.h. - - * wtf/VectorTraits.h: Use IsPod from TypeTraits.h. - - * GNUmakefile.am: - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - Added TypeTraits.h. - -2009-01-29 Stephanie Lewis <slewis@apple.com> - - RS by Oliver Hunt. - - Update the order files. - - * JavaScriptCore.order: - -2009-01-29 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Oliver Hunt. - - Bug 23551: Crash on page load with profiler enabled and running - <https://bugs.webkit.org/show_bug.cgi?id=23551> - <rdar://problem/6529521> - - Interpreter::execute(FunctionBodyNode*, ...) calls Profiler::didExecute() - with a stale CallFrame. If some part of the scope chain has already been - freed, Profiler::didExecute() will crash when attempting to get the lexical - global object. The fix is to make the didExecute() call use the caller's - CallFrame, not the one made for the function call. In this case, the - willExecute() call should also be changed to match. - - Since this occurs in the actual inspector JS, it is difficult to reduce. - I couldn't make a layout test. - - * interpreter/Interpreter.cpp: - (JSC::Interpreter::execute): - -2009-01-28 Sam Weinig <sam@webkit.org> - - Reviewed by Gavin Barraclough. - - Fix for <rdar://problem/6525537> - Hang occurs when closing Installer window (iTunes, Aperture) - - * JavaScriptCore.exp: Export JSGlobalData::sharedInstance. - -2009-01-28 Sam Weinig <sam@webkit.org> - - Reviewed by Geoff Garen. - - Initial patch by Mark Rowe. - - <rdar://problem/6519356> - REGRESSION (r36006): "out of memory" alert running dromaeo on Windows - - Report the cost of the ArrayStorage vector more accurately/often. - - * runtime/JSArray.cpp: - (JSC::JSArray::JSArray): Report the extra cost even for a filled array - because JSString using the single character optimization and immediates - wont increase the cost themselves. - (JSC::JSArray::putSlowCase): Update the cost when increasing the size of - the array. - (JSC::JSArray::increaseVectorLength): Ditto. - -2009-01-28 Sam Weinig <sam@webkit.org> - Reviewed by Geoff Garen. - - Fix for <rdar://problem/6129678> - REGRESSION (Safari 3-4): Local variable not accessible from Dashcode console or variables view - - Iterating the properties of activation objects accessed through the WebKit debugging - APIs was broken by forced conversion of JSActivation to the global object. To fix this, - we use a proxy activation object that acts more like a normal JSObject. - - * debugger/DebuggerActivation.cpp: Added. - (JSC::DebuggerActivation::DebuggerActivation): - (JSC::DebuggerActivation::mark): - (JSC::DebuggerActivation::className): - (JSC::DebuggerActivation::getOwnPropertySlot): - (JSC::DebuggerActivation::put): - (JSC::DebuggerActivation::putWithAttributes): - (JSC::DebuggerActivation::deleteProperty): - (JSC::DebuggerActivation::getPropertyNames): - (JSC::DebuggerActivation::getPropertyAttributes): - (JSC::DebuggerActivation::defineGetter): - (JSC::DebuggerActivation::defineSetter): - (JSC::DebuggerActivation::lookupGetter): - (JSC::DebuggerActivation::lookupSetter): - * debugger/DebuggerActivation.h: Added. - Proxy JSActivation object for Debugging. - - * runtime/JSActivation.h: - (JSC::JSActivation::isActivationObject): Added. - * runtime/JSObject.h: - (JSC::JSObject::isActivationObject): Added. - -2009-01-28 David Kilzer <ddkilzer@apple.com> - - Bug 23490: Remove initialRefCount argument from RefCounted class - - <https://bugs.webkit.org/show_bug.cgi?id=23490> - - Reviewed by Darin Adler. - - RefCountedBase now always starts with a ref count of 1, so there - is no need to pass the initialRefCount into the class anymore. - - * wtf/ByteArray.h: - (WTF::ByteArray::ByteArray): Removed call to RefCounted(1). - * wtf/RefCounted.h: - (WTF::RefCountedBase::RefCountedBase): Changed to start with a - ref count of 1. - (WTF::RefCounted::RefCounted): Removed initialRefCount argument - and removed call to RefCounted(1). - -2009-01-26 Adele Peterson <adele@apple.com> +2009-05-12 Sam Weinig <sam@webkit.org> - Build fix. + Reviewed by Geoffrey Garen. - * debugger/Debugger.cpp: + Implement op_new_error. -2009-01-26 Gavin Barraclough <barraclough@apple.com> + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_new_error): + * jit/JITStubCall.h: + (JSC::JITStubCall::addArgument): Add a version of addArgument + that takes a constant JSValue. - Reviewed by Darin Adler. +2009-05-12 Sam Weinig <sam@webkit.org> - Fixes for eq null & neq null, on 64-bit JIT. - https://bugs.webkit.org/show_bug.cgi?id=23559 + Reviewed by Geoffrey Garen. - This patch degrades 64-bit JIT performance on some benchmarks, - due to the whole not-being-incorrect thing. + Remove now unused emitGetVariableObjectRegister and emitPutVariableObjectRegister. * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - -2009-01-26 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Gavin Barraclough. - - Bug 23552: Dashcode evaluator no longer works after making ExecStates actual call frames - <https://bugs.webkit.org/show_bug.cgi?id=23552> - <rdar://problem/6398839> - - * JavaScriptCore.exp: - * debugger/Debugger.cpp: - (JSC::evaluateInGlobalCallFrame): Added so that WebScriptCallFrame can - evaluate JS starting from a global call frame. - * debugger/Debugger.h: - -2009-01-25 Mark Rowe <mrowe@apple.com> - - Rubber-stamped by Dan Bernstein. - - Improve the consistency of settings in our .xcconfig files. - - * Configurations/Base.xcconfig: Enable GCC_OBJC_CALL_CXX_CDTORS to match other projects. - -2009-01-25 Darin Adler <darin@apple.com> - - Reviewed by Mark Rowe. - - Bug 23352: Turn on more compiler warnings in the Mac build - https://bugs.webkit.org/show_bug.cgi?id=23352 - - Turn on the following warnings: - - -Wcast-qual - -Wextra-tokens - -Wformat=2 - -Winit-self - -Wmissing-noreturn - -Wpacked - -Wrendundant-decls + * jit/JIT.h: - * Configurations/Base.xcconfig: Added the new warnings. Switched to -Wextra instead of - -W for clarity since we don't have to support the older versions of gcc that require the - old -W syntax. Since we now use -Wformat=2, removed -Wformat-security. Also removed - -Wno-format-y2k since we can have that one on now. +2009-05-12 Sam Weinig <sam@webkit.org> -2009-01-25 Judit Jasz <jasy@inf.u-szeged.hu> + Reviewed by Geoffrey Garen. - Reviewed by Darin Adler. - - Compilation problem fixing - http://bugs.webkit.org/show_bug.cgi?id=23497 + Implement op_to_primitive and op_next_pname. - * jit/JITCall.cpp: - (JSC::JIT::compileOpCall): Use JSValuePtr::encode. - -2009-01-25 Darin Adler <darin@apple.com> + * jit/JITOpcodes.cpp: + (JSC::JIT::emitSlow_op_construct_verify): + (JSC::JIT::emit_op_to_primitive): + (JSC::JIT::emitSlow_op_to_primitive): + (JSC::JIT::emitSlow_op_loop_if_true): + (JSC::JIT::emit_op_jtrue): + (JSC::JIT::emit_op_next_pname): - Reviewed by Sam Weinig. +2009-05-12 Sam Weinig <sam@webkit.org> - Bug 23352: Turn on more compiler warnings in the Mac build - https://bugs.webkit.org/show_bug.cgi?id=23352 + Reviewed by Geoffrey Garen. - Fourth patch: Deal with the last few stray warnings. + Add op_get_global_var, op_put_global_var, emit_op_get_scoped_var, emit_op_put_scoped_var and + op_unexpected_load. - * parser/Parser.cpp: Only declare jscyyparse if it's not already declared. - This makes both separate compilation and all-in-one compilation work with the - -Wredundant-decls warning. + * jit/JIT.h: + * jit/JITInlineMethods.h: + (JSC::JIT::tagFor): + (JSC::JIT::payloadFor): + (JSC::JIT::emitLoad): + (JSC::JIT::emitStore): + (JSC::JIT::emitLoadReturnValue): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_get_global_var): + (JSC::JIT::emit_op_put_global_var): + (JSC::JIT::emit_op_get_scoped_var): + (JSC::JIT::emit_op_put_scoped_var): + (JSC::JIT::emit_op_unexpected_load): -2009-01-25 Darin Adler <darin@apple.com> +2009-05-12 Geoffrey Garen <ggaren@apple.com> Reviewed by Sam Weinig. - Bug 23352: Turn on more compiler warnings in the Mac build - https://bugs.webkit.org/show_bug.cgi?id=23352 - - Third patch: Use the noreturn attribute on functions that don't - return to prepare for the use of the -Wmissing-noreturn warning. - - * jit/JITCall.cpp: - (JSC::unreachable): Added NO_RETURN. - * jsc.cpp: - (functionQuit): Ditto. - (printUsageStatement): Ditto. - * wtf/AlwaysInline.h: Added definition of NO_RETURN. - -2009-01-24 Oliver Hunt <oliver@apple.com> - - Reviewed by Maciej Stachowiak. + Added overflow handling to op_sub. - Force inlining of Lexer::matchPunctuator + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::emitSlow_op_sub): + (JSC::JIT::emitSlowSub32InPlaceLeft): - 2.2% win when parsing jQuery, Mootools, Prototype, etc +2009-05-12 Sam Weinig <sam@webkit.org> - * parser/Lexer.h: + Reviewed by Geoffrey Garen. -2009-01-23 Gavin Barraclough <barraclough@apple.com> + Remove a function call by folding op_get_by_id and op_put_by_id into + their respective compile functions. - Reviewed by Geoff Garen. + * jit/JIT.h: + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emit_op_get_by_id): + (JSC::JIT::emitSlow_op_get_by_id): + (JSC::JIT::emit_op_put_by_id): + (JSC::JIT::emitSlow_op_put_by_id): - Fix for <rdar://problem/6126212> - Ensure that callbacks out from the JSC interface are only allowed - to return in reverse-chronological order to that in which they were - made. If we allow earlier callbacks to return first, then this may - result in setions of the RegisterFile in use by another thread - being trampled. +2009-05-12 Sam Weinig <sam@webkit.org> - See uber-comment in JSLock.h for details. + Reviewed by Geoffrey Garen. - * runtime/JSLock.cpp: - (JSC::JSLock::DropAllLocks::DropAllLocks): - (JSC::JSLock::DropAllLocks::~DropAllLocks): + Make JITStubCall work in 64bit by making the stack index + step dependent on the size of void*. -2009-01-23 Darin Adler <darin@apple.com> + * jit/JITStubCall.h: + (JSC::JITStubCall::JITStubCall): + (JSC::JITStubCall::addArgument): - Try to fix WX build. +2009-05-12 Sam Weinig <sam@webkit.org> - * runtime/JSGlobalObjectFunctions.h: Include <wtf/unicode/Unicode.h> - for the definition of UChar. + Reviewed by Geoffrey Garen. -2009-01-23 Anders Carlsson <andersca@apple.com> + Implement simple version of property access opcodes + which just call a stub functions. - * Configurations/Base.xcconfig: - GCC 4.0 build fix. - - * runtime/JSNumberCell.h: - 64-bit build fix. + * jit/JITOpcodes.cpp: + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emitSlow_op_put_by_id): + (JSC::JIT::emitSlow_op_get_by_id): + (JSC::JIT::emit_op_get_by_val): + (JSC::JIT::emitSlow_op_get_by_val): + (JSC::JIT::emit_op_put_by_val): + (JSC::JIT::emitSlow_op_put_by_val): + (JSC::JIT::emit_op_put_by_index): + (JSC::JIT::emit_op_put_getter): + (JSC::JIT::emit_op_put_setter): + (JSC::JIT::emit_op_del_by_id): + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::compilePutByIdHotPath): + * jit/JITStubCall.h: + (JSC::JITStubCall::addArgument): + * jsc.cpp: -2009-01-23 Anders Carlsson <andersca@apple.com> +2009-05-12 Geoffrey Garen <ggaren@apple.com> Reviewed by Sam Weinig. - Turn on -Wmissing-prototypes and fix the warnings. - - * API/JSClassRef.cpp: - (clearReferenceToPrototype): - * Configurations/Base.xcconfig: - * runtime/Collector.cpp: - (JSC::getPlatformThreadRegisters): - * runtime/ExceptionHelpers.cpp: - (JSC::createError): - * runtime/JSGlobalObjectFunctions.h: - * runtime/JSNumberCell.h: - * runtime/UString.cpp: - (JSC::initializeStaticBaseString): - (JSC::createRep): - * wtf/FastMalloc.cpp: - * wtf/Threading.cpp: - -2009-01-22 Mark Rowe <mrowe@apple.com> - - Rubber-stamped by Anders Carlsson. - - Disable GCC_WARN_ABOUT_MISSING_PROTOTYPES temporarily. - - Current versions of Xcode only respect it for C and Objective-C files, - and our code doesn't currently compile if it is applied to C++ and - Objective-C++ files. - - * Configurations/Base.xcconfig: - -2009-01-22 Steve Falkenburg <sfalken@apple.com> - - https://bugs.webkit.org/show_bug.cgi?id=23489 - - Return currentTime() in correct units for the two early return cases. - - Reviewed by Mark Rowe. - - * wtf/CurrentTime.cpp: - (WTF::currentTime): - -2009-01-22 Sam Weinig <sam@webkit.org> - - Reviewed by Mark Rowe. - - Fix for <rdar://problem/6439247> - FastMalloc allocating an extra 4MB of meta-data on 64-bit - - Rely on the fact that on all known x86-64 platforms only use 48 bits of - address space to shrink the initial size of the PageMap from ~4MB to 120K. - For 64-bit we still use a 3-level radix tree, but now each level is only 12 - bits wide. - - No performance change. - - * wtf/FastMalloc.cpp: - (WTF::MapSelector): Add specialization for 64 bit that takes into account the - 16 bits of unused address space on x86-64. - -2009-01-22 Beth Dakin <bdakin@apple.com> - - Reviewed by Sam Weinig. - - Fix for https://bugs.webkit.org/show_bug.cgi?id=23461 LayoutTests/ - fast/js/numeric-conversion.html is broken, and corresponding - <rdar://problem/6514842> - - The basic problem here is that parseInt(Infinity) should be NaN, - but we were returning 0. NaN matches Safari 3.2.1 and Firefox. - - * runtime/JSGlobalObjectFunctions.cpp: - (JSC::globalFuncParseInt): - -2009-01-22 Oliver Hunt <oliver@apple.com> - - Reviewed by Geoff Garen. - - <rdar://problem/6516853> (r39682-r39736) JSFunFuzz: crash on "(function(){({ x2: x }), })()" - <https://bugs.webkit.org/show_bug.cgi?id=23479> - - Automatic semicolon insertion was resulting in this being accepted in the initial - nodeless parsing, but subsequent reparsing for code generation would fail, leading - to a crash. The solution is to ensure that reparsing a function performs parsing - in the same state as the initial parse. We do this by modifying the saved source - ranges to include rather than exclude the opening and closing braces. - - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::reparseForExceptionInfoIfNecessary): add an assertion for successful recompile - * parser/Lexer.h: - (JSC::Lexer::sourceCode): include rather than exclude braces. - * parser/Nodes.h: - (JSC::FunctionBodyNode::toSourceString): No need to append braces anymore. - -2009-01-22 Dmitry Titov <dimich@chromium.org> - - Reviewed by Alexey Proskuryakov. - - https://bugs.webkit.org/show_bug.cgi?id=23373 - - Implement ThreadCondition::timedWait(). - Since we borrow the code for condition variables from other sources, - I did the same for timedWait(). See comments in ThreadingWin.cpp for - rationale and more info. - - * wtf/CONTRIBUTORS.pthreads-win32: - Added. A list of Pthreads-win32 contributors mentioned in their license. The license itself - is included into wtf/ThreadingWin32.cpp. - - * wtf/Threading.h: - * wtf/ThreadingWin.cpp: - Additional info and Pthreads-win32 license at the beginning. - (WTF::PlatformCondition::timedWait): new method, derived from Pthreads-win32. - (WTF::PlatformCondition::signal): same - (WTF::ThreadCondition::ThreadCondition): - (WTF::ThreadCondition::~ThreadCondition): - (WTF::ThreadCondition::wait): this now calls PlatformCondition::timedWait. - (WTF::ThreadCondition::timedWait): same - (WTF::ThreadCondition::signal): this now calls PlatformCondition::signal. - (WTF::ThreadCondition::broadcast): same - -2009-01-21 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Fix for https://bugs.webkit.org/show_bug.cgi?id=23469. - - We need to check all numbers in integer switches, not just those - represented as integer JSImmediates. - - * interpreter/Interpreter.cpp: - (JSC::Interpreter::privateExecute): - (JSC::Interpreter::cti_op_switch_imm): - -2009-01-21 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. - - Fix for https://bugs.webkit.org/show_bug.cgi?id=23468. - - * interpreter/Interpreter.cpp: - (JSC::Interpreter::privateExecute): - -2009-01-21 Alexey Proskuryakov <ap@webkit.org> - - Suggested by Oliver Hunt. Reviewed by Oliver Hunt. - - https://bugs.webkit.org/show_bug.cgi?id=23456 - Function argument names leak - - * parser/Nodes.cpp: (JSC::FunctionBodyNode::~FunctionBodyNode): Destruct parameter names. - -2009-01-20 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (Build fix). - - Windows build fix - - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - -2009-01-20 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Mark Rowe. - - Structure property table deleted offset maps are being leaked. - Probably shouldn't be doing that. - - https://bugs.webkit.org/show_bug.cgi?id=23442 - - * runtime/Structure.cpp: - (JSC::Structure::~Structure): - -2009-01-20 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (build fix). - - Attempt to fix gtk build - - * GNUmakefile.am: - -2009-01-20 Darin Adler <darin@apple.com> - - * runtime/StringPrototype.cpp: - (JSC::substituteBackreferences): Add back the initialization to fix the build. - -2009-01-20 Darin Adler <darin@apple.com> - - Reviewed by Mark Rowe. - - Bug 23352: Turn on more compiler warnings in the Mac build - https://bugs.webkit.org/show_bug.cgi?id=23352 - - First patch: Fix some simple cases of various warnings. - - * pcre/pcre_compile.cpp: - (jsRegExpCompile): Use const_cast to change const-ness. - - * runtime/StringPrototype.cpp: - (JSC::substituteBackreferences): Remove unneeded initialization and - use UChar instead of unsigned short for UTF-16 values. - - * wtf/dtoa.cpp: - (WTF::strtod): Use const_cast to change const-ness. - -2009-01-20 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (build fix). - - Whoops, remove runtime/ByteArray references from .pri and .scons builds, update .bkl - - * JavaScriptCore.pri: - * JavaScriptCore.scons: - * JavaScriptCoreSources.bkl: - -2009-01-20 Oliver Hunt <oliver@apple.com> - - RS=Dan Bernstein. - - Move runtime/ByteArray to wtf/ByteArray - - * GNUmakefile.am: - * JavaScriptCore.exp: - * JavaScriptCore.pri: - * JavaScriptCore.scons: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * runtime/JSByteArray.cpp: - * runtime/JSByteArray.h: - * wtf/ByteArray.cpp: Renamed from JavaScriptCore/runtime/ByteArray.cpp. - (WTF::ByteArray::create): - * wtf/ByteArray.h: Renamed from JavaScriptCore/runtime/ByteArray.h. - (WTF::ByteArray::length): - (WTF::ByteArray::set): - (WTF::ByteArray::get): - (WTF::ByteArray::data): - (WTF::ByteArray::deref): - (WTF::ByteArray::ByteArray): - -2009-01-19 Sam Weinig <sam@webkit.org> + Added work-around for XCode debugging echo problem. - Rubber-stamped by Gavin Barraclough. - - Remove temporary operator-> from JSValuePtr. - - * API/JSCallbackFunction.cpp: - (JSC::JSCallbackFunction::call): - * API/JSCallbackObjectFunctions.h: - (JSC::::call): - (JSC::::toNumber): - (JSC::::toString): - * API/JSObjectRef.cpp: - (JSObjectSetPrototype): - * API/JSValueRef.cpp: - (JSValueGetType): - (JSValueIsUndefined): - (JSValueIsNull): - (JSValueIsBoolean): - (JSValueIsNumber): - (JSValueIsString): - (JSValueIsObject): - (JSValueIsObjectOfClass): - (JSValueToBoolean): - (JSValueToNumber): - (JSValueToStringCopy): - (JSValueToObject): - * bytecode/CodeBlock.cpp: - (JSC::valueToSourceString): - (JSC::CodeBlock::mark): - * bytecode/CodeBlock.h: - (JSC::CodeBlock::isKnownNotImmediate): - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::emitEqualityOp): - (JSC::keyForImmediateSwitch): - * interpreter/Interpreter.cpp: - (JSC::jsLess): - (JSC::jsLessEq): - (JSC::jsAddSlowCase): - (JSC::jsAdd): - (JSC::jsTypeStringForValue): - (JSC::jsIsObjectType): - (JSC::jsIsFunctionType): - (JSC::isNotObject): - (JSC::Interpreter::callEval): - (JSC::Interpreter::throwException): - (JSC::cachePrototypeChain): - (JSC::Interpreter::tryCachePutByID): - (JSC::countPrototypeChainEntriesAndCheckForProxies): - (JSC::Interpreter::tryCacheGetByID): - (JSC::Interpreter::privateExecute): - (JSC::Interpreter::tryCTICachePutByID): - (JSC::Interpreter::tryCTICacheGetByID): - (JSC::Interpreter::cti_op_convert_this): - (JSC::Interpreter::cti_op_add): - (JSC::Interpreter::cti_op_pre_inc): - (JSC::Interpreter::cti_op_put_by_id_generic): - (JSC::Interpreter::cti_op_get_by_id_generic): - (JSC::Interpreter::cti_op_put_by_id): - (JSC::Interpreter::cti_op_put_by_id_second): - (JSC::Interpreter::cti_op_put_by_id_fail): - (JSC::Interpreter::cti_op_get_by_id): - (JSC::Interpreter::cti_op_get_by_id_second): - (JSC::Interpreter::cti_op_get_by_id_self_fail): - (JSC::Interpreter::cti_op_get_by_id_proto_list): - (JSC::Interpreter::cti_op_get_by_id_proto_list_full): - (JSC::Interpreter::cti_op_get_by_id_proto_fail): - (JSC::Interpreter::cti_op_get_by_id_array_fail): - (JSC::Interpreter::cti_op_get_by_id_string_fail): - (JSC::Interpreter::cti_op_instanceof): - (JSC::Interpreter::cti_op_del_by_id): - (JSC::Interpreter::cti_op_mul): - (JSC::Interpreter::cti_op_call_JSFunction): - (JSC::Interpreter::cti_op_call_NotJSFunction): - (JSC::Interpreter::cti_op_construct_JSConstruct): - (JSC::Interpreter::cti_op_construct_NotJSConstruct): - (JSC::Interpreter::cti_op_get_by_val): - (JSC::Interpreter::cti_op_get_by_val_byte_array): - (JSC::Interpreter::cti_op_sub): - (JSC::Interpreter::cti_op_put_by_val): - (JSC::Interpreter::cti_op_put_by_val_array): - (JSC::Interpreter::cti_op_put_by_val_byte_array): - (JSC::Interpreter::cti_op_loop_if_true): - (JSC::Interpreter::cti_op_negate): - (JSC::Interpreter::cti_op_div): - (JSC::Interpreter::cti_op_pre_dec): - (JSC::Interpreter::cti_op_not): - (JSC::Interpreter::cti_op_jtrue): - (JSC::Interpreter::cti_op_post_inc): - (JSC::Interpreter::cti_op_lshift): - (JSC::Interpreter::cti_op_bitand): - (JSC::Interpreter::cti_op_rshift): - (JSC::Interpreter::cti_op_bitnot): - (JSC::Interpreter::cti_op_mod): - (JSC::Interpreter::cti_op_post_dec): - (JSC::Interpreter::cti_op_urshift): - (JSC::Interpreter::cti_op_bitxor): - (JSC::Interpreter::cti_op_bitor): - (JSC::Interpreter::cti_op_push_scope): - (JSC::Interpreter::cti_op_is_undefined): - (JSC::Interpreter::cti_op_is_boolean): - (JSC::Interpreter::cti_op_is_number): - (JSC::Interpreter::cti_op_to_jsnumber): - (JSC::Interpreter::cti_op_in): - (JSC::Interpreter::cti_op_put_by_index): - (JSC::Interpreter::cti_op_switch_imm): - (JSC::Interpreter::cti_op_switch_char): - (JSC::Interpreter::cti_op_switch_string): - (JSC::Interpreter::cti_op_del_by_val): - (JSC::Interpreter::cti_op_put_getter): - (JSC::Interpreter::cti_op_put_setter): - (JSC::Interpreter::cti_op_new_error): - * interpreter/Interpreter.h: - (JSC::Interpreter::isJSArray): - (JSC::Interpreter::isJSString): - (JSC::Interpreter::isJSByteArray): - * interpreter/Register.h: - (JSC::Register::marked): - (JSC::Register::mark): - * jit/JITInlineMethods.h: - (JSC::JIT::getConstantOperandImmediateInt): - (JSC::JIT::isOperandConstantImmediateInt): * jsc.cpp: - (functionPrint): - (functionDebug): - (functionRun): - (functionLoad): - (runWithScripts): (runInteractive): - * parser/Nodes.cpp: - (JSC::processClauseList): - * profiler/ProfileGenerator.cpp: - (JSC::ProfileGenerator::addParentForConsoleStart): - * profiler/Profiler.cpp: - (JSC::Profiler::createCallIdentifier): - * runtime/ArrayConstructor.cpp: - (JSC::constructArrayWithSizeQuirk): - * runtime/ArrayPrototype.cpp: - (JSC::arrayProtoFuncToString): - (JSC::arrayProtoFuncToLocaleString): - (JSC::arrayProtoFuncJoin): - (JSC::arrayProtoFuncConcat): - (JSC::arrayProtoFuncPop): - (JSC::arrayProtoFuncPush): - (JSC::arrayProtoFuncReverse): - (JSC::arrayProtoFuncShift): - (JSC::arrayProtoFuncSlice): - (JSC::arrayProtoFuncSort): - (JSC::arrayProtoFuncSplice): - (JSC::arrayProtoFuncUnShift): - (JSC::arrayProtoFuncFilter): - (JSC::arrayProtoFuncMap): - (JSC::arrayProtoFuncEvery): - (JSC::arrayProtoFuncForEach): - (JSC::arrayProtoFuncSome): - (JSC::arrayProtoFuncIndexOf): - (JSC::arrayProtoFuncLastIndexOf): - * runtime/BooleanConstructor.cpp: - (JSC::constructBoolean): - (JSC::callBooleanConstructor): - * runtime/BooleanPrototype.cpp: - (JSC::booleanProtoFuncToString): - (JSC::booleanProtoFuncValueOf): - * runtime/Collector.cpp: - (JSC::Heap::protect): - (JSC::Heap::unprotect): - (JSC::Heap::heap): - (JSC::Heap::collect): - (JSC::typeName): - * runtime/Completion.cpp: - (JSC::evaluate): - * runtime/DateConstructor.cpp: - (JSC::constructDate): - (JSC::dateParse): - (JSC::dateUTC): - * runtime/DateInstance.h: - (JSC::DateInstance::internalNumber): - * runtime/DatePrototype.cpp: - (JSC::formatLocaleDate): - (JSC::fillStructuresUsingTimeArgs): - (JSC::fillStructuresUsingDateArgs): - (JSC::dateProtoFuncToString): - (JSC::dateProtoFuncToUTCString): - (JSC::dateProtoFuncToDateString): - (JSC::dateProtoFuncToTimeString): - (JSC::dateProtoFuncToLocaleString): - (JSC::dateProtoFuncToLocaleDateString): - (JSC::dateProtoFuncToLocaleTimeString): - (JSC::dateProtoFuncGetTime): - (JSC::dateProtoFuncGetFullYear): - (JSC::dateProtoFuncGetUTCFullYear): - (JSC::dateProtoFuncToGMTString): - (JSC::dateProtoFuncGetMonth): - (JSC::dateProtoFuncGetUTCMonth): - (JSC::dateProtoFuncGetDate): - (JSC::dateProtoFuncGetUTCDate): - (JSC::dateProtoFuncGetDay): - (JSC::dateProtoFuncGetUTCDay): - (JSC::dateProtoFuncGetHours): - (JSC::dateProtoFuncGetUTCHours): - (JSC::dateProtoFuncGetMinutes): - (JSC::dateProtoFuncGetUTCMinutes): - (JSC::dateProtoFuncGetSeconds): - (JSC::dateProtoFuncGetUTCSeconds): - (JSC::dateProtoFuncGetMilliSeconds): - (JSC::dateProtoFuncGetUTCMilliseconds): - (JSC::dateProtoFuncGetTimezoneOffset): - (JSC::dateProtoFuncSetTime): - (JSC::setNewValueFromTimeArgs): - (JSC::setNewValueFromDateArgs): - (JSC::dateProtoFuncSetYear): - (JSC::dateProtoFuncGetYear): - * runtime/ErrorConstructor.cpp: - (JSC::constructError): - * runtime/ErrorPrototype.cpp: - (JSC::errorProtoFuncToString): - * runtime/ExceptionHelpers.cpp: - (JSC::createError): - (JSC::createErrorMessage): - * runtime/FunctionConstructor.cpp: - (JSC::constructFunction): - * runtime/FunctionPrototype.cpp: - (JSC::functionProtoFuncToString): - (JSC::functionProtoFuncApply): - (JSC::functionProtoFuncCall): - * runtime/GetterSetter.cpp: - (JSC::GetterSetter::toObject): - * runtime/JSActivation.cpp: - (JSC::JSActivation::getOwnPropertySlot): - * runtime/JSArray.cpp: - (JSC::JSArray::put): - (JSC::JSArray::mark): - (JSC::JSArray::sort): - (JSC::AVLTreeAbstractorForArrayCompare::compare_key_key): - (JSC::JSArray::compactForSorting): - * runtime/JSByteArray.h: - (JSC::JSByteArray::setIndex): - * runtime/JSCell.h: - (JSC::asCell): - * runtime/JSFunction.cpp: - (JSC::JSFunction::call): - (JSC::JSFunction::construct): - * runtime/JSGlobalObject.cpp: - (JSC::markIfNeeded): - (JSC::lastInPrototypeChain): - * runtime/JSGlobalObjectFunctions.cpp: - (JSC::encode): - (JSC::decode): - (JSC::globalFuncEval): - (JSC::globalFuncParseInt): - (JSC::globalFuncParseFloat): - (JSC::globalFuncIsNaN): - (JSC::globalFuncIsFinite): - (JSC::globalFuncEscape): - (JSC::globalFuncUnescape): - (JSC::globalFuncJSCPrint): - * runtime/JSImmediate.cpp: - (JSC::JSImmediate::toThisObject): - (JSC::JSImmediate::toObject): - (JSC::JSImmediate::prototype): - (JSC::JSImmediate::toString): - * runtime/JSImmediate.h: - * runtime/JSObject.cpp: - (JSC::JSObject::mark): - (JSC::JSObject::put): - (JSC::callDefaultValueFunction): - (JSC::JSObject::getPrimitiveNumber): - (JSC::JSObject::defineGetter): - (JSC::JSObject::defineSetter): - (JSC::JSObject::lookupGetter): - (JSC::JSObject::lookupSetter): - (JSC::JSObject::hasInstance): - (JSC::JSObject::toNumber): - (JSC::JSObject::toString): - * runtime/JSObject.h: - (JSC::JSObject::JSObject): - (JSC::JSObject::inlineGetOwnPropertySlot): - (JSC::JSObject::getOwnPropertySlotForWrite): - (JSC::JSObject::getPropertySlot): - (JSC::JSValuePtr::get): - * runtime/JSPropertyNameIterator.h: - (JSC::JSPropertyNameIterator::create): - * runtime/JSString.cpp: - (JSC::JSString::getOwnPropertySlot): - * runtime/JSValue.h: - * runtime/JSWrapperObject.cpp: - (JSC::JSWrapperObject::mark): - * runtime/JSWrapperObject.h: - (JSC::JSWrapperObject::setInternalValue): - * runtime/MathObject.cpp: - (JSC::mathProtoFuncAbs): - (JSC::mathProtoFuncACos): - (JSC::mathProtoFuncASin): - (JSC::mathProtoFuncATan): - (JSC::mathProtoFuncATan2): - (JSC::mathProtoFuncCeil): - (JSC::mathProtoFuncCos): - (JSC::mathProtoFuncExp): - (JSC::mathProtoFuncFloor): - (JSC::mathProtoFuncLog): - (JSC::mathProtoFuncMax): - (JSC::mathProtoFuncMin): - (JSC::mathProtoFuncPow): - (JSC::mathProtoFuncRound): - (JSC::mathProtoFuncSin): - (JSC::mathProtoFuncSqrt): - (JSC::mathProtoFuncTan): - * runtime/NativeErrorConstructor.cpp: - (JSC::NativeErrorConstructor::NativeErrorConstructor): - (JSC::NativeErrorConstructor::construct): - * runtime/NumberConstructor.cpp: - (JSC::constructWithNumberConstructor): - (JSC::callNumberConstructor): - * runtime/NumberPrototype.cpp: - (JSC::numberProtoFuncToString): - (JSC::numberProtoFuncToLocaleString): - (JSC::numberProtoFuncValueOf): - (JSC::numberProtoFuncToFixed): - (JSC::numberProtoFuncToExponential): - (JSC::numberProtoFuncToPrecision): - * runtime/ObjectConstructor.cpp: - (JSC::constructObject): - * runtime/ObjectPrototype.cpp: - (JSC::objectProtoFuncValueOf): - (JSC::objectProtoFuncHasOwnProperty): - (JSC::objectProtoFuncIsPrototypeOf): - (JSC::objectProtoFuncDefineGetter): - (JSC::objectProtoFuncDefineSetter): - (JSC::objectProtoFuncLookupGetter): - (JSC::objectProtoFuncLookupSetter): - (JSC::objectProtoFuncPropertyIsEnumerable): - (JSC::objectProtoFuncToLocaleString): - (JSC::objectProtoFuncToString): - * runtime/Operations.h: - (JSC::JSValuePtr::equalSlowCaseInline): - (JSC::JSValuePtr::strictEqual): - (JSC::JSValuePtr::strictEqualSlowCaseInline): - * runtime/Protect.h: - (JSC::gcProtect): - (JSC::gcUnprotect): - * runtime/RegExpConstructor.cpp: - (JSC::setRegExpConstructorInput): - (JSC::setRegExpConstructorMultiline): - (JSC::constructRegExp): - * runtime/RegExpObject.cpp: - (JSC::setRegExpObjectLastIndex): - (JSC::RegExpObject::match): - * runtime/RegExpPrototype.cpp: - (JSC::regExpProtoFuncTest): - (JSC::regExpProtoFuncExec): - (JSC::regExpProtoFuncCompile): - (JSC::regExpProtoFuncToString): - * runtime/StringConstructor.cpp: - (JSC::stringFromCharCodeSlowCase): - (JSC::stringFromCharCode): - (JSC::constructWithStringConstructor): - (JSC::callStringConstructor): - * runtime/StringPrototype.cpp: - (JSC::stringProtoFuncReplace): - (JSC::stringProtoFuncToString): - (JSC::stringProtoFuncCharAt): - (JSC::stringProtoFuncCharCodeAt): - (JSC::stringProtoFuncConcat): - (JSC::stringProtoFuncIndexOf): - (JSC::stringProtoFuncLastIndexOf): - (JSC::stringProtoFuncMatch): - (JSC::stringProtoFuncSearch): - (JSC::stringProtoFuncSlice): - (JSC::stringProtoFuncSplit): - (JSC::stringProtoFuncSubstr): - (JSC::stringProtoFuncSubstring): - (JSC::stringProtoFuncToLowerCase): - (JSC::stringProtoFuncToUpperCase): - (JSC::stringProtoFuncLocaleCompare): - (JSC::stringProtoFuncBig): - (JSC::stringProtoFuncSmall): - (JSC::stringProtoFuncBlink): - (JSC::stringProtoFuncBold): - (JSC::stringProtoFuncFixed): - (JSC::stringProtoFuncItalics): - (JSC::stringProtoFuncStrike): - (JSC::stringProtoFuncSub): - (JSC::stringProtoFuncSup): - (JSC::stringProtoFuncFontcolor): - (JSC::stringProtoFuncFontsize): - (JSC::stringProtoFuncAnchor): - (JSC::stringProtoFuncLink): - * runtime/Structure.cpp: - (JSC::Structure::Structure): - (JSC::Structure::getEnumerablePropertyNames): - (JSC::Structure::createCachedPrototypeChain): - * runtime/Structure.h: - (JSC::Structure::mark): - * runtime/StructureChain.cpp: - (JSC::StructureChain::StructureChain): -2009-01-19 Darin Adler <darin@apple.com> +2009-05-12 Geoffrey Garen <ggaren@apple.com> Reviewed by Sam Weinig. + + Added overflow handling to op_add. - Bug 23409: REGRESSION: RegExp 'replace()' function improperly processes '$$' - <https://bugs.webkit.org/show_bug.cgi?id=23409> - <rdar://problem/6505723> - - Test: fast/js/string-replace-3.html - - * runtime/StringPrototype.cpp: - (JSC::substituteBackreferences): Remove code that adds an extra $ -- not sure - how this ever worked. - -2009-01-16 Gavin Barraclough <barraclough@apple.com> + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::emitSlow_op_add): + (JSC::JIT::emitSlowAdd32InPlace): - Reviewed by Oliver Hunt. +2009-05-12 Sam Weinig <sam@webkit.org> - On x86-64 jit, cache JSImmedate::TagMask & JSImmedate::TagTypeNumber in - registers, save reloading them every time they're used. + Reviewed by Geoffrey Garen. - Draws x86-64 jit performance close to that of i386 jit. + Add slow cases for op_jnless or emit_op_jnlesseq. - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::subPtr): - (JSC::MacroAssembler::jnzPtr): - (JSC::MacroAssembler::jzPtr): - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - * jit/JIT.h: * jit/JITArithmetic.cpp: - (JSC::JIT::compileBinaryArithOpSlowCase): - * jit/JITInlineMethods.h: - (JSC::JIT::emitJumpIfJSCell): - (JSC::JIT::emitJumpIfNotJSCell): - (JSC::JIT::emitJumpIfImmediateNumber): - (JSC::JIT::emitJumpIfNotImmediateNumber): - (JSC::JIT::emitJumpIfImmediateInteger): - (JSC::JIT::emitJumpIfNotImmediateInteger): - (JSC::JIT::emitFastArithIntToImmNoCheck): + (JSC::JIT::emitSlow_op_jnless): + (JSC::JIT::emitSlow_op_jnlesseq): -2009-01-16 Gavin Barraclough <barraclough@apple.com> +2009-05-12 Sam Weinig <sam@webkit.org> - Reviewed by Oliver Hunt. + Reviewed by Geoffrey Garen. - Add support to x86-64 JIT for inline double precision arithmetic ops. - +5/6% on x86-64, JIT enabled, sunspider. + Add implementations for op_jnless, emit_op_jnlesseq, op_loop_if_less and op_loop_if_lesseq. + No slow cases for op_jnless or emit_op_jnlesseq yet. - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::addPtr): - * assembler/X86Assembler.h: - (JSC::X86Assembler::movq_rr): - * jit/JIT.h: * jit/JITArithmetic.cpp: - (JSC::JIT::compileFastArith_op_pre_inc): - (JSC::JIT::compileBinaryArithOp): - (JSC::JIT::compileBinaryArithOpSlowCase): - (JSC::JIT::compileFastArith_op_add): - (JSC::JIT::compileFastArithSlow_op_add): - (JSC::JIT::compileFastArith_op_mul): - (JSC::JIT::compileFastArithSlow_op_mul): - (JSC::JIT::compileFastArith_op_sub): - (JSC::JIT::compileFastArithSlow_op_sub): - * parser/ResultType.h: - (JSC::ResultType::isReusable): - (JSC::ResultType::isInt32): - (JSC::ResultType::definitelyIsNumber): - (JSC::ResultType::mightBeNumber): - (JSC::ResultType::isNotNumber): - (JSC::ResultType::unknownType): - -2009-01-16 Gavin Barraclough <barraclough@apple.com> + (JSC::JIT::emit_op_jnless): + (JSC::JIT::emitSlow_op_jnless): + (JSC::JIT::emit_op_jnlesseq): + (JSC::JIT::emitSlow_op_jnlesseq): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_loop_if_less): + (JSC::JIT::emitSlow_op_loop_if_less): + (JSC::JIT::emit_op_loop_if_lesseq): + (JSC::JIT::emitSlow_op_loop_if_lesseq): - Reviewed by Geoff Garen. +2009-05-12 Sam Weinig <sam@webkit.org> - Fixes for SamplingTool. + Reviewed by Geoffrey Garen. - https://bugs.webkit.org/show_bug.cgi?id=23390 + Turn the RECORD_JUMP_TARGET macro into an inline function. - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::storePtr): - * bytecode/SamplingTool.cpp: - (JSC::SamplingTool::run): - (JSC::SamplingTool::dump): - * bytecode/SamplingTool.h: - (JSC::SamplingTool::encodeSample): - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompile): * jit/JIT.h: - (JSC::JIT::samplingToolTrackCodeBlock): - * jit/JITCall.cpp: - (JSC::JIT::compileOpCall): - (JSC::JIT::compileOpCallSlowCase): * jit/JITInlineMethods.h: - (JSC::JIT::emitCTICall_internal): - -2009-01-16 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Darin Adler. - - Fixed <rdar://problem/6452301> REGRESSION: Latest WebKit nightlies - turn "c" into "" when stripping \\c_ character - - * wrec/WRECParser.cpp: - (JSC::WREC::Parser::consumeEscape): Mimic a Firefox quirk when parsing - control escapes inside character classes. + (JSC::JIT::recordJumpTarget): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_jmp): + (JSC::JIT::emit_op_jsr): + (JSC::JIT::emit_op_jmp_scopes): -2009-01-16 Adam Roben <aroben@apple.com> +2009-05-12 Sam Weinig <sam@webkit.org> - Windows build fix + Add MacroAssemblerX86Common::set8 to fix the build. - * wrec/WRECParser.cpp: - (JSC::WREC::Parser::parseParentheses): Removed unreachable code. + * assembler/MacroAssemblerX86Common.h: + (JSC::MacroAssemblerX86Common::set8): -2009-01-15 Geoffrey Garen <ggaren@apple.com> +2009-05-12 Geoffrey Garen <ggaren@apple.com> - Reviewed by Cameron Zwarich. + Reviewed by Sam Weinig. - Fixed <rdar://problem/6471394> REGRESSION (r39164): Discarding quantifier - on assertion gives incorrect result (23075) + Added overflow recovery for pre_inc and pre_dec. - https://bugs.webkit.org/show_bug.cgi?id=23075 + Turned some short-circuit code into early returns, as is the WebKit style. - * pcre/pcre_compile.cpp: - (compileBranch): Throw away an assertion if it's followed by a quantifier - with a 0 minimum, to match SpiderMonkey, v8, and the ECMA spec. + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_post_inc): + (JSC::JIT::emitSlow_op_post_inc): + (JSC::JIT::emit_op_post_dec): + (JSC::JIT::emitSlow_op_post_dec): + (JSC::JIT::emitSlow_op_pre_inc): + (JSC::JIT::emitSlow_op_pre_dec): - * wrec/WRECParser.cpp: - (JSC::WREC::Parser::parseParentheses): Fall back on PCRE for the rare - case of an assertion with a quantifier with a 0 minimum, since we - don't handle quantified subexpressions yet, and in this special case, - we can't just throw away the quantifier. +2009-05-12 Sam Weinig <sam@webkit.org> -2009-01-15 Gavin Barraclough <barraclough@apple.com> + Reviewed by Geoffrey Garen. - Reviewed by Oliver Hunt. + Implement op_jmp, op_loop, op_eq and op_neq. - Add support in ResultType to track that the results of bitops - are always of type int32_t. + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_jmp): + (JSC::JIT::emit_op_loop): + (JSC::JIT::emit_op_eq): + (JSC::JIT::emitSlow_op_eq): + (JSC::JIT::emit_op_neq): + (JSC::JIT::emitSlow_op_neq): + (JSC::JIT::emit_op_enter): + (JSC::JIT::emit_op_enter_with_activation): - * parser/Nodes.cpp: - (JSC::ReadModifyResolveNode::emitBytecode): - (JSC::ReadModifyDotNode::emitBytecode): - (JSC::ReadModifyBracketNode::emitBytecode): - * parser/Nodes.h: - (JSC::ExpressionNode::): - (JSC::BooleanNode::): - (JSC::NumberNode::): - (JSC::StringNode::): - (JSC::PrePostResolveNode::): - (JSC::TypeOfResolveNode::): - (JSC::TypeOfValueNode::): - (JSC::UnaryPlusNode::): - (JSC::NegateNode::): - (JSC::BitwiseNotNode::): - (JSC::LogicalNotNode::): - (JSC::MultNode::): - (JSC::DivNode::): - (JSC::ModNode::): - (JSC::SubNode::): - (JSC::LeftShiftNode::): - (JSC::RightShiftNode::): - (JSC::UnsignedRightShiftNode::): - (JSC::LessNode::): - (JSC::GreaterNode::): - (JSC::LessEqNode::): - (JSC::GreaterEqNode::): - (JSC::InstanceOfNode::): - (JSC::EqualNode::): - (JSC::NotEqualNode::): - (JSC::StrictEqualNode::): - (JSC::NotStrictEqualNode::): - (JSC::BitAndNode::): - (JSC::BitOrNode::): - (JSC::BitXOrNode::): - (JSC::LogicalOpNode::): - * parser/ResultType.h: - (JSC::ResultType::isInt32): - (JSC::ResultType::isNotNumber): - (JSC::ResultType::booleanType): - (JSC::ResultType::numberType): - (JSC::ResultType::numberTypeCanReuse): - (JSC::ResultType::numberTypeCanReuseIsInt32): - (JSC::ResultType::stringOrNumberTypeCanReuse): - (JSC::ResultType::stringType): - (JSC::ResultType::unknownType): - (JSC::ResultType::forAdd): - (JSC::ResultType::forBitOp): - (JSC::OperandTypes::OperandTypes): - -2009-01-15 Gavin Barraclough <barraclough@apple.com> +2009-05-12 Sam Weinig <sam@webkit.org> - Reviewed by Oliver Hunt. + Reviewed by Geoffrey Garen. - Add support for integer addition, subtraction and multiplication - in JIT code on x86-64. + Implement the slow cases for arithmetic opcodes. - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::mul32): - (JSC::MacroAssembler::sub32): - (JSC::MacroAssembler::joMul32): - (JSC::MacroAssembler::joSub32): - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): - * jit/JIT.h: * jit/JITArithmetic.cpp: - (JSC::JIT::compileFastArith_op_add): - (JSC::JIT::compileFastArithSlow_op_add): - (JSC::JIT::compileFastArith_op_mul): - (JSC::JIT::compileFastArithSlow_op_mul): - (JSC::JIT::compileFastArith_op_sub): - (JSC::JIT::compileFastArithSlow_op_sub): - -2009-01-15 Gavin Barraclough <barraclough@apple.com> + (JSC::JIT::emitSlow_op_lshift): + (JSC::JIT::emitSlow_op_rshift): + (JSC::JIT::emitSlow_op_bitand): + (JSC::JIT::emitSlow_op_bitor): + (JSC::JIT::emitSlow_op_bitxor): + (JSC::JIT::emitSlow_op_bitnot): + (JSC::JIT::emitSlow_op_sub): + (JSC::JIT::emitSlow_op_mul): + (JSC::JIT::emitSlow_op_mod): + (JSC::JIT::emit_op_mod): - Reviewed by Geoff Garen. +2009-05-12 Sam Weinig <sam@webkit.org> - On x86-64 allow JSImmediate to encode 64-bit double precision values. - This patch only affects builds that set USE(ALTERNATE_JSIMMEDIATE). - Updates the implementation of JSValuePtr:: and JSImmediate:: methods - that operate on neumeric values to be be aware of the new representation. - When this representation is in use, the class JSNumberCell is redundant - and is compiled out. + Reviewed by Geoffrey Garen. - The format of the new immediate representation is documented in JSImmediate.h. + Implement op_bitnot. - * JavaScriptCore.exp: - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::subPtr): + * assembler/MacroAssemblerX86Common.h: + (JSC::MacroAssemblerX86Common::not32): * assembler/X86Assembler.h: - (JSC::X86Assembler::): - (JSC::X86Assembler::subq_rr): - (JSC::X86Assembler::movq_rr): - (JSC::X86Assembler::ucomisd_rr): - (JSC::X86Assembler::X86InstructionFormatter::twoByteOp64): - * interpreter/Interpreter.cpp: - (JSC::Interpreter::cti_op_stricteq): - (JSC::Interpreter::cti_op_nstricteq): - * jit/JIT.cpp: - (JSC::JIT::compileOpStrictEq): - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): - * jit/JIT.h: + (JSC::X86Assembler::notl_m): * jit/JITArithmetic.cpp: - (JSC::JIT::compileFastArith_op_lshift): - (JSC::JIT::compileFastArith_op_rshift): - (JSC::JIT::compileFastArith_op_bitand): - (JSC::JIT::compileFastArith_op_mod): - (JSC::JIT::compileFastArith_op_add): - (JSC::JIT::compileFastArith_op_mul): - (JSC::JIT::compileFastArith_op_post_inc): - (JSC::JIT::compileFastArith_op_post_dec): - (JSC::JIT::compileFastArith_op_pre_inc): - (JSC::JIT::compileFastArith_op_pre_dec): - (JSC::JIT::putDoubleResultToJSNumberCellOrJSImmediate): - (JSC::JIT::compileBinaryArithOp): - * jit/JITInlineMethods.h: - (JSC::JIT::emitJumpIfBothJSCells): - (JSC::JIT::emitJumpIfEitherNumber): - (JSC::JIT::emitJumpIfNotEitherNumber): - (JSC::JIT::emitJumpIfImmediateIntegerNumber): - (JSC::JIT::emitJumpIfNotImmediateIntegerNumber): - (JSC::JIT::emitJumpIfNotImmediateIntegerNumbers): - (JSC::JIT::emitJumpSlowCaseIfNotImmediateIntegerNumber): - (JSC::JIT::emitJumpSlowCaseIfNotImmediateIntegerNumbers): - (JSC::JIT::emitFastArithDeTagImmediate): - (JSC::JIT::emitFastArithDeTagImmediateJumpIfZero): - (JSC::JIT::emitFastArithReTagImmediate): - (JSC::JIT::emitFastArithIntToImmNoCheck): - * runtime/JSCell.h: - * runtime/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): - * runtime/JSImmediate.cpp: - (JSC::JSImmediate::toThisObject): - (JSC::JSImmediate::toObject): - (JSC::JSImmediate::toString): - * runtime/JSImmediate.h: - (JSC::wtf_reinterpret_cast): - (JSC::JSImmediate::isNumber): - (JSC::JSImmediate::isIntegerNumber): - (JSC::JSImmediate::isDoubleNumber): - (JSC::JSImmediate::isPositiveIntegerNumber): - (JSC::JSImmediate::areBothImmediateIntegerNumbers): - (JSC::JSImmediate::makeInt): - (JSC::JSImmediate::makeDouble): - (JSC::JSImmediate::doubleValue): - (JSC::doubleToBoolean): - (JSC::JSImmediate::toBoolean): - (JSC::JSImmediate::getTruncatedUInt32): - (JSC::JSImmediate::makeOutOfIntegerRange): - (JSC::JSImmediate::from): - (JSC::JSImmediate::getTruncatedInt32): - (JSC::JSImmediate::toDouble): - (JSC::JSImmediate::getUInt32): - (JSC::JSValuePtr::isInt32Fast): - (JSC::JSValuePtr::isUInt32Fast): - (JSC::JSValuePtr::areBothInt32Fast): - (JSC::JSFastMath::canDoFastBitwiseOperations): - (JSC::JSFastMath::xorImmediateNumbers): - (JSC::JSFastMath::canDoFastRshift): - (JSC::JSFastMath::canDoFastUrshift): - (JSC::JSFastMath::rightShiftImmediateNumbers): - (JSC::JSFastMath::canDoFastAdditiveOperations): - (JSC::JSFastMath::addImmediateNumbers): - (JSC::JSFastMath::subImmediateNumbers): - * runtime/JSNumberCell.cpp: - (JSC::jsNumberCell): - * runtime/JSNumberCell.h: - (JSC::createNumberStructure): - (JSC::isNumberCell): - (JSC::asNumberCell): - (JSC::jsNumber): - (JSC::JSValuePtr::isDoubleNumber): - (JSC::JSValuePtr::getDoubleNumber): - (JSC::JSValuePtr::isNumber): - (JSC::JSValuePtr::uncheckedGetNumber): - (JSC::jsNaN): - (JSC::JSValuePtr::getNumber): - (JSC::JSValuePtr::numberToInt32): - (JSC::JSValuePtr::numberToUInt32): - * runtime/JSValue.h: - * runtime/NumberConstructor.cpp: - (JSC::numberConstructorNegInfinity): - (JSC::numberConstructorPosInfinity): - (JSC::numberConstructorMaxValue): - (JSC::numberConstructorMinValue): - * runtime/NumberObject.cpp: - (JSC::constructNumber): - * runtime/NumberObject.h: - * runtime/Operations.h: - (JSC::JSValuePtr::equal): - (JSC::JSValuePtr::equalSlowCaseInline): - (JSC::JSValuePtr::strictEqual): - (JSC::JSValuePtr::strictEqualSlowCaseInline): - * wtf/Platform.h: + (JSC::JIT::emit_op_bitnot): -2009-01-15 Sam Weinig <sam@webkit.org> +2009-05-12 Sam Weinig <sam@webkit.org> Reviewed by Geoffrey Garen. - <rdar://problem/6045018> - REGRESSION (r34838): JavaScript objects appear to be leaked after loading google.com - - Subtract the number of JSStrings cached in SmallStrings when calculating the - number of live JSObjects. - - * runtime/Collector.cpp: - (JSC::Heap::objectCount): - * runtime/SmallStrings.cpp: - (JSC::SmallStrings::count): - * runtime/SmallStrings.h: - -2009-01-15 Sam Weinig <sam@webkit.org> - - Fix Qt build. - - * runtime/Collector.cpp: - -2009-01-15 Sam Weinig <sam@webkit.org> - - Reviewed by Gavin Barraclough. - - Fix crash seen running fast/canvas. - - Make sure to mark the ScopeNode and CodeBlock being created - in the re-parse for exception information. - - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::reparseForExceptionInfoIfNecessary): - * parser/Nodes.h: - (JSC::ScopeNode::mark): - * runtime/Collector.cpp: - (JSC::Heap::collect): - * runtime/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): - * runtime/JSGlobalData.h: - -2009-01-15 Craig Schlenter <craig.schlenter@gmail.com> - - Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=23347 - Compilation of JavaScriptCore/wtf/ThreadingPthreads.cpp fails on Linux - - * wtf/ThreadingPthreads.cpp: included limits.h as INT_MAX is defined there. - -2009-01-15 Oliver Hunt <oliver@apple.com> - - Reviewed by Geoff Garen. - - Bug 23225: REGRESSION: Assertion failure in reparseInPlace() (m_sourceElements) at sfgate.com - <https://bugs.webkit.org/show_bug.cgi?id=23225> <rdar://problem/6487432> + Add arithmetic opcode implementations from the old nitro-extreme branch. - Character position for open and closing brace was incorrectly referencing m_position to - record their position in a source document, however this is unsafe as BOMs may lead to - m_position being an arbitrary position from the real position of the current character. - - * parser/Lexer.cpp: - (JSC::Lexer::matchPunctuator): - -2009-01-14 David Kilzer <ddkilzer@apple.com> - - Bug 23153: JSC build always touches JavaScriptCore/docs/bytecode.html - - <https://bugs.webkit.org/show_bug.cgi?id=23153> - - Reviewed by Darin Adler. - - Instead of building bytecode.html into ${SRCROOT}/docs/bytecode.html, build it - into ${BUILT_PRODUCTS_DIR}/DerivedSources/JavaScriptCore/docs/bytecode.html. - - Also fixes make-bytecode-docs.pl to actually generate documentation. - - * DerivedSources.make: Changed bytecode.html to be built into local docs - directory in ${BUILT_PRODUCTS_DIR}/DerivedSources/JavaScriptCore. - * JavaScriptCore.xcodeproj/project.pbxproj: Added "/docs" to the end of the - "mkdir -p" command so that the docs subdirectory is automatically created. - * docs/make-bytecode-docs.pl: Changed BEGIN_OPCODE to DEFINE_OPCODE so that - documentation is actually generated. - -2009-01-14 Adam Treat <adam.treat@torchmobile.com> - - Build fix for Qt from Dmitry Titov. - - * wtf/ThreadingQt.cpp: - (WTF::ThreadCondition::timedWait): + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_jnless): + (JSC::JIT::emitSlow_op_jnless): + (JSC::JIT::emit_op_jnlesseq): + (JSC::JIT::emitSlow_op_jnlesseq): + (JSC::JIT::emit_op_lshift): + (JSC::JIT::emitSlow_op_lshift): + (JSC::JIT::emit_op_rshift): + (JSC::JIT::emitSlow_op_rshift): + (JSC::JIT::emit_op_bitand): + (JSC::JIT::emitBitAnd32Constant): + (JSC::JIT::emitBitAnd32InPlace): + (JSC::JIT::emit_op_bitor): + (JSC::JIT::emitSlow_op_bitor): + (JSC::JIT::emitBitOr32Constant): + (JSC::JIT::emitBitOr32InPlace): + (JSC::JIT::emit_op_bitxor): + (JSC::JIT::emitSlow_op_bitxor): + (JSC::JIT::emitBitXor32Constant): + (JSC::JIT::emitBitXor32InPlace): + (JSC::JIT::emit_op_bitnot): + (JSC::JIT::emitSlow_op_bitnot): + (JSC::JIT::emit_op_post_inc): + (JSC::JIT::emitSlow_op_post_inc): + (JSC::JIT::emit_op_post_dec): + (JSC::JIT::emitSlow_op_post_dec): + (JSC::JIT::emit_op_pre_inc): + (JSC::JIT::emitSlow_op_pre_inc): + (JSC::JIT::emit_op_pre_dec): + (JSC::JIT::emitSlow_op_pre_dec): + (JSC::JIT::emit_op_add): + (JSC::JIT::emitAdd32Constant): + (JSC::JIT::emitAdd32InPlace): + (JSC::JIT::emitSlow_op_add): + (JSC::JIT::emit_op_sub): + (JSC::JIT::emitSlow_op_sub): + (JSC::JIT::emitSub32ConstantLeft): + (JSC::JIT::emitSub32ConstantRight): + (JSC::JIT::emitSub32InPlaceLeft): + (JSC::JIT::emitSub32InPlaceRight): + (JSC::JIT::emit_op_mul): + (JSC::JIT::emitSlow_op_mul): + (JSC::JIT::emitMul32Constant): + (JSC::JIT::emitMul32InPlace): + (JSC::JIT::emit_op_mod): + (JSC::JIT::emitSlow_op_mod): + * jit/JITOpcodes.cpp: -2009-01-14 Oliver Hunt <oliver@apple.com> +2009-05-12 Geoffrey Garen <ggaren@apple.com> - Reviewed by Cameron Zwarich. + Removed JIT_OPTIMIZE_ARITHMETIC setting, since it was all about 32bit + value representations. + + Added JSAPIValueWrapper to the repository. - Bug 22903: REGRESSION (r36267): visiting this site reliably crashes WebKit nightly + * jit/JIT.h: + * jit/JITArithmetic.cpp: + * runtime/JSAPIValueWrapper.cpp: Added. + (JSC::JSAPIValueWrapper::toPrimitive): + (JSC::JSAPIValueWrapper::getPrimitiveNumber): + (JSC::JSAPIValueWrapper::toBoolean): + (JSC::JSAPIValueWrapper::toNumber): + (JSC::JSAPIValueWrapper::toString): + (JSC::JSAPIValueWrapper::toObject): + * runtime/JSAPIValueWrapper.h: Added. + (JSC::JSAPIValueWrapper::value): + (JSC::JSAPIValueWrapper::isAPIValueWrapper): + (JSC::JSAPIValueWrapper::JSAPIValueWrapper): + (JSC::jsAPIValueWrapper): + * wtf/Platform.h: - EvalCodeBlock's do not reference the functions that are declared inside the eval - code, this means that simply marking the EvalCodeBlock through the global object - is insufficient to mark the declared functions. This patch corrects this by - explicitly marking the CodeBlocks of all the functions declared in the cached - EvalNode. +2009-05-12 Geoffrey Garen <ggaren@apple.com> + Turned on the JIT and got it building and running the most trivial of + programs. + + All configurable optimizations are turned off, and a few opcodes are ad + hoc #if'd out. + + So far, I've only merged op_mov and op_end, but some stub-reliant + opcodes work as-is from TOT. + * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::mark): - * bytecode/CodeBlock.h: - (JSC::CodeBlock::hasFunctions): - * bytecode/EvalCodeCache.h: - (JSC::EvalCodeCache::mark): - * parser/Nodes.cpp: - (JSC::ScopeNodeData::mark): - (JSC::EvalNode::mark): - * parser/Nodes.h: - -2009-01-14 Dmitry Titov <dimich@chromium.org> - - Reviewed by Alexey Proskuryakov. - - https://bugs.webkit.org/show_bug.cgi?id=23312 - Implement MessageQueue::waitForMessageTimed() - Also fixed ThreadCondition::timedWait() to take absolute time, as discussed on webkit-dev. - Win32 version of timedWait still has to be implemented. - - * wtf/MessageQueue.h: - (WTF::MessageQueueWaitResult: new enum for the result of MessageQueue::waitForMessageTimed. - (WTF::MessageQueue::waitForMessage): - (WTF::MessageQueue::waitForMessageTimed): New method. - * wtf/Threading.h: - * wtf/ThreadingGtk.cpp: - (WTF::ThreadCondition::timedWait): changed to use absolute time instead of interval. - * wtf/ThreadingNone.cpp: - (WTF::ThreadCondition::timedWait): ditto. - * wtf/ThreadingPthreads.cpp: - (WTF::ThreadCondition::timedWait): ditto. - * wtf/ThreadingQt.cpp: - (WTF::ThreadCondition::timedWait): ditto. - * wtf/ThreadingWin.cpp: - (WTF::ThreadCondition::timedWait): ditto. The actual Win32 code is still to be implemented. - -2009-01-14 Dean McNamee <deanm@chromium.org> - - Reviewed by Darin Adler and Oliver hunt. - - Correctly match allocation functions by implementing a custom deref(). - - https://bugs.webkit.org/show_bug.cgi?id=23315 - - * runtime/ByteArray.h: - (JSC::ByteArray::deref): - (JSC::ByteArray::ByteArray): - -2009-01-14 Dan Bernstein <mitz@apple.com> - - Reviewed by John Sullivan. - - - update copyright - - * Info.plist: - -2009-01-13 Beth Dakin <bdakin@apple.com> - - Reviewed by Darin Adler and Oliver Hunt. - - <rdar://problem/6489314> REGRESSION: Business widget's front side - fails to render correctly when flipping widget - - The problem here is that parseInt was parsing NaN as 0. This patch - corrects that by parsing NaN as NaN. This matches our old behavior - and Firefox. - - * runtime/JSGlobalObjectFunctions.cpp: - (JSC::globalFuncParseInt): - -2009-01-13 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Fix for: https://bugs.webkit.org/show_bug.cgi?id=23292 - - Implementation of two argument canDoFastAdditiveOperations does not correlate well with reality. - - * runtime/JSImmediate.h: - (JSC::JSFastMath::canDoFastAdditiveOperations): - -2009-01-13 Zalan Bujtas <zbujtas@gmail.com> - - Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=23290 - Fix JSImmediate::isImmediate(src) to !src->isCell() - - * interpreter/Interpreter.cpp: - (JSC::Interpreter::privateExecute): - -2009-01-13 Dmitry Titov <dimich@chromium.org> - - Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=23281 - Fix the Chromium Win build. - Need to use PLATFORM(WIN_OS) instead of PLATFORM(WIN). - Moved GTK and WX up in #if sequence because they could come with WIN_OS too, - while they have their own implementation even on Windows. - - * wtf/CurrentTime.cpp: - (WTF::currentTime): - -2009-01-12 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Make the JSImmediate interface private. - - All manipulation of JS values should be through the JSValuePtr class, not by using JSImmediate - directly. The key missing methods on JSValuePtr are: - - * isCell() - check for values that are JSCell*s, and as such where asCell() may be used. - * isInt32Fast() getInt32Fast() - fast check/access for integer immediates. - * isUInt32Fast() getUInt32Fast() - ditto for unsigned integer immediates. - - The JIT is allowed full access to JSImmediate, since it needs to be able to directly - manipulate JSValuePtrs. The Interpreter is provided access to perform operations directly - on JSValuePtrs through the new JSFastMath interface. - - No performance impact. - - * API/JSCallbackObjectFunctions.h: - (JSC::::toNumber): - * API/JSValueRef.cpp: - (JSValueIsEqual): - (JSValueIsStrictEqual): - * JavaScriptCore.exp: + (JSC::CodeBlock::~CodeBlock): * bytecode/CodeBlock.h: - (JSC::CodeBlock::isKnownNotImmediate): - * bytecompiler/BytecodeGenerator.cpp: - (JSC::keyForImmediateSwitch): - * bytecompiler/BytecodeGenerator.h: - (JSC::BytecodeGenerator::JSValueHashTraits::constructDeletedValue): - (JSC::BytecodeGenerator::JSValueHashTraits::isDeletedValue): - * interpreter/Interpreter.cpp: - (JSC::jsLess): - (JSC::jsLessEq): - (JSC::jsAdd): - (JSC::jsIsObjectType): - (JSC::cachePrototypeChain): - (JSC::Interpreter::tryCachePutByID): - (JSC::Interpreter::tryCacheGetByID): - (JSC::Interpreter::privateExecute): - (JSC::Interpreter::tryCTICachePutByID): - (JSC::Interpreter::tryCTICacheGetByID): - (JSC::Interpreter::cti_op_add): - (JSC::Interpreter::cti_op_get_by_id_self_fail): - (JSC::Interpreter::cti_op_get_by_id_proto_list): - (JSC::Interpreter::cti_op_instanceof): - (JSC::Interpreter::cti_op_mul): - (JSC::Interpreter::cti_op_get_by_val): - (JSC::Interpreter::cti_op_get_by_val_byte_array): - (JSC::Interpreter::cti_op_sub): - (JSC::Interpreter::cti_op_put_by_val): - (JSC::Interpreter::cti_op_put_by_val_array): - (JSC::Interpreter::cti_op_put_by_val_byte_array): - (JSC::Interpreter::cti_op_negate): - (JSC::Interpreter::cti_op_div): - (JSC::Interpreter::cti_op_eq): - (JSC::Interpreter::cti_op_lshift): - (JSC::Interpreter::cti_op_bitand): - (JSC::Interpreter::cti_op_rshift): - (JSC::Interpreter::cti_op_bitnot): - (JSC::Interpreter::cti_op_neq): - (JSC::Interpreter::cti_op_urshift): - (JSC::Interpreter::cti_op_call_eval): - (JSC::Interpreter::cti_op_throw): - (JSC::Interpreter::cti_op_is_undefined): - (JSC::Interpreter::cti_op_stricteq): - (JSC::Interpreter::cti_op_nstricteq): - (JSC::Interpreter::cti_op_switch_imm): - (JSC::Interpreter::cti_vm_throw): - * interpreter/Interpreter.h: - (JSC::Interpreter::isJSArray): - (JSC::Interpreter::isJSString): - (JSC::Interpreter::isJSByteArray): * jit/JIT.cpp: (JSC::JIT::compileOpStrictEq): - (JSC::JIT::privateCompileMainPass): * jit/JIT.h: - (JSC::JIT::isStrictEqCaseHandledInJITCode): * jit/JITArithmetic.cpp: - (JSC::JIT::compileFastArith_op_rshift): - (JSC::JIT::compileFastArith_op_bitand): - (JSC::JIT::compileFastArith_op_mod): + (JSC::JIT::emit_op_lshift): + (JSC::JIT::emitSlow_op_lshift): + (JSC::JIT::emit_op_rshift): + (JSC::JIT::emitSlow_op_rshift): + (JSC::JIT::emit_op_jnless): + (JSC::JIT::emitSlow_op_jnless): + (JSC::JIT::emit_op_jnlesseq): + (JSC::JIT::emitSlow_op_jnlesseq): + (JSC::JIT::emit_op_bitand): + (JSC::JIT::emitSlow_op_bitand): + (JSC::JIT::emit_op_post_inc): + (JSC::JIT::emitSlow_op_post_inc): + (JSC::JIT::emit_op_post_dec): + (JSC::JIT::emitSlow_op_post_dec): + (JSC::JIT::emit_op_pre_inc): + (JSC::JIT::emitSlow_op_pre_inc): + (JSC::JIT::emit_op_pre_dec): + (JSC::JIT::emitSlow_op_pre_dec): + (JSC::JIT::emit_op_mod): + (JSC::JIT::emitSlow_op_mod): + (JSC::JIT::emit_op_add): + (JSC::JIT::emit_op_mul): + (JSC::JIT::emit_op_sub): + (JSC::JIT::compileBinaryArithOpSlowCase): + (JSC::JIT::emitSlow_op_add): + (JSC::JIT::emitSlow_op_mul): * jit/JITCall.cpp: - (JSC::JIT::unlinkCall): + (JSC::JIT::compileOpCallInitializeCallFrame): + (JSC::JIT::compileOpConstructSetupArgs): + (JSC::JIT::compileOpCallVarargs): (JSC::JIT::compileOpCall): + (JSC::JIT::compileOpCallSlowCase): * jit/JITInlineMethods.h: (JSC::JIT::getConstantOperandImmediateInt): (JSC::JIT::isOperandConstantImmediateInt): - * parser/Nodes.cpp: - (JSC::processClauseList): - * runtime/ArrayPrototype.cpp: - (JSC::arrayProtoFuncIndexOf): - (JSC::arrayProtoFuncLastIndexOf): - * runtime/BooleanPrototype.cpp: - (JSC::booleanProtoFuncValueOf): - * runtime/Collector.cpp: - (JSC::Heap::protect): - (JSC::Heap::unprotect): - (JSC::Heap::heap): - * runtime/JSByteArray.cpp: - (JSC::JSByteArray::getOwnPropertySlot): - * runtime/JSByteArray.h: - (JSC::JSByteArray::getIndex): - * runtime/JSCell.cpp: - * runtime/JSCell.h: - (JSC::JSValuePtr::isNumberCell): - (JSC::JSValuePtr::asCell): - (JSC::JSValuePtr::isNumber): - * runtime/JSGlobalObjectFunctions.cpp: - (JSC::globalFuncParseInt): - * runtime/JSImmediate.h: - (JSC::js0): - (JSC::jsImpossibleValue): - (JSC::JSValuePtr::toInt32): - (JSC::JSValuePtr::toUInt32): - (JSC::JSValuePtr::isCell): - (JSC::JSValuePtr::isInt32Fast): - (JSC::JSValuePtr::getInt32Fast): - (JSC::JSValuePtr::isUInt32Fast): - (JSC::JSValuePtr::getUInt32Fast): - (JSC::JSValuePtr::makeInt32Fast): - (JSC::JSValuePtr::areBothInt32Fast): - (JSC::JSFastMath::canDoFastBitwiseOperations): - (JSC::JSFastMath::equal): - (JSC::JSFastMath::notEqual): - (JSC::JSFastMath::andImmediateNumbers): - (JSC::JSFastMath::xorImmediateNumbers): - (JSC::JSFastMath::orImmediateNumbers): - (JSC::JSFastMath::canDoFastRshift): - (JSC::JSFastMath::canDoFastUrshift): - (JSC::JSFastMath::rightShiftImmediateNumbers): - (JSC::JSFastMath::canDoFastAdditiveOperations): - (JSC::JSFastMath::addImmediateNumbers): - (JSC::JSFastMath::subImmediateNumbers): - (JSC::JSFastMath::incImmediateNumber): - (JSC::JSFastMath::decImmediateNumber): - * runtime/JSNumberCell.h: - (JSC::JSValuePtr::asNumberCell): - (JSC::jsNumber): - (JSC::JSValuePtr::uncheckedGetNumber): - (JSC::JSNumberCell::toInt32): - (JSC::JSNumberCell::toUInt32): - (JSC::JSValuePtr::toJSNumber): - (JSC::JSValuePtr::getNumber): - (JSC::JSValuePtr::numberToInt32): - (JSC::JSValuePtr::numberToUInt32): - * runtime/JSObject.h: - (JSC::JSValuePtr::isObject): - (JSC::JSValuePtr::get): - (JSC::JSValuePtr::put): - * runtime/JSValue.cpp: - (JSC::JSValuePtr::toInteger): - (JSC::JSValuePtr::toIntegerPreserveNaN): - * runtime/JSValue.h: - * runtime/Operations.cpp: - (JSC::JSValuePtr::equalSlowCase): - (JSC::JSValuePtr::strictEqualSlowCase): - * runtime/Operations.h: - (JSC::JSValuePtr::equal): - (JSC::JSValuePtr::equalSlowCaseInline): - (JSC::JSValuePtr::strictEqual): - (JSC::JSValuePtr::strictEqualSlowCaseInline): - * runtime/Protect.h: - (JSC::gcProtect): - (JSC::gcUnprotect): - * runtime/StringPrototype.cpp: - (JSC::stringProtoFuncCharAt): - (JSC::stringProtoFuncCharCodeAt): - * runtime/Structure.cpp: - (JSC::Structure::createCachedPrototypeChain): - -2009-01-12 Kevin Ollivier <kevino@theolliviers.com> - - Since date time functions have moved here, now the wx port JSC - needs to depend on wx. - - * jscore.bkl: - -2009-01-11 David Levin <levin@chromium.org> - - Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=23245 - - Add initializeThreading to key places in JS API to ensure that - UString is properly initialized. - - * API/JSContextRef.cpp: - (JSContextGroupCreate): - (JSGlobalContextCreate): - * API/JSObjectRef.cpp: - (JSClassCreate): - * API/JSStringRef.cpp: - (JSStringCreateWithCharacters): - (JSStringCreateWithUTF8CString): - * API/JSStringRefCF.cpp: - (JSStringCreateWithCFString): - -2009-01-11 David Levin <levin@chromium.org> - - Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=23175 - - Separate out BaseString information from UString::Rep and make all baseString access go through - a member function, so that it may be used for something else (in the future) in the BaseString - case. - - * runtime/SmallStrings.cpp: - (JSC::SmallStringsStorage::rep): - (JSC::SmallStringsStorage::SmallStringsStorage): - (JSC::SmallStrings::SmallStrings): - (JSC::SmallStrings::mark): - Adjust to account for the changes in UString and put the UString in place in - SmallStringsStorage to aid in locality of reference among the UChar[] and UString::Rep's. - - * runtime/SmallStrings.h: - * runtime/UString.cpp: - (JSC::initializeStaticBaseString): - (JSC::initializeUString): - (JSC::UString::Rep::create): - (JSC::UString::Rep::destroy): - (JSC::UString::Rep::checkConsistency): - (JSC::expandCapacity): - (JSC::UString::expandPreCapacity): - (JSC::concatenate): - (JSC::UString::append): - (JSC::UString::operator=): - * runtime/UString.h: - (JSC::UString::Rep::baseIsSelf): - (JSC::UString::Rep::setBaseString): - (JSC::UString::Rep::baseString): - (JSC::UString::Rep::): - (JSC::UString::Rep::null): - (JSC::UString::Rep::empty): - (JSC::UString::Rep::data): - (JSC::UString::cost): - Separate out the items out used by base strings from those used in Rep's that only - point to base strings. (This potentially saves 24 bytes per Rep.) - -2009-01-11 Darin Adler <darin@apple.com> - - Reviewed by Dan Bernstein. - - Bug 23239: improve handling of unused arguments in JavaScriptCore - https://bugs.webkit.org/show_bug.cgi?id=23239 - - * runtime/DatePrototype.cpp: Moved LocaleDateTimeFormat enum outside #if - so we can use this on all platforms. Changed valueOf to share the same - function with getTime, since the contents of the two are identical. Removed - a FIXME since the idea isn't really specific enough or helpful enough to - need to sit here in the source code. - (JSC::formatLocaleDate): Changed the Mac version of this function to take - the same arguments as the non-Mac version so the caller doesn't have to - special-case the two platforms. Also made the formatString array be const; - before the characters were, but the array was a modifiable global variable. - (JSC::dateProtoFuncToLocaleString): Changed to call the new unified - version of formatLocaleDate and remove the ifdef. - (JSC::dateProtoFuncToLocaleDateString): Ditto. - (JSC::dateProtoFuncToLocaleTimeString): Ditto. - - * runtime/JSNotAnObject.cpp: - (JSC::JSNotAnObject::toObject): Use the new ASSERT_UNUSED instead of the - old UNUSED_PARAM. - - * runtime/RegExp.cpp: - (JSC::RegExp::RegExp): Changed to only use UNUSED_PARAM when the parameter - is actually unused. - - * wtf/TCSystemAlloc.cpp: - (TCMalloc_SystemRelease): Changed to only use UNUSED_PARAM when the parameter - is actually unused. - (TCMalloc_SystemCommit): Changed to omit the argument names instead of using - UNUSED_PARAM. - -2009-01-11 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (Build fix). - - Fix the build (whoops) - - * interpreter/Interpreter.cpp: - (JSC::Interpreter::cti_op_get_by_val): - -2009-01-11 Oliver Hunt <oliver@apple.com> - - Reviewed by Darin Adler and Anders Carlsson - - Bug 23128: get/put_by_val need to respecialise in the face of ByteArray - - Restructure the code slightly, and add comments per Darin's suggestions - - * interpreter/Interpreter.cpp: - (JSC::Interpreter::cti_op_get_by_val): - (JSC::Interpreter::cti_op_get_by_val_byte_array): - (JSC::Interpreter::cti_op_put_by_val): - (JSC::Interpreter::cti_op_put_by_val_byte_array): - -2009-01-11 Oliver Hunt <oliver@apple.com> - - Reviewed by Anders Carlsson. - - Whoops, I accidentally removed an exception check from fast the - fast path for string indexing when i originally landed the - byte array logic. - - * interpreter/Interpreter.cpp: - (JSC::Interpreter::cti_op_get_by_val): - -2009-01-11 Oliver Hunt <oliver@apple.com> - - Reviewed by Anders Carlsson. - - Bug 23128: get/put_by_val need to respecialise in the face of ByteArray - <https://bugs.webkit.org/show_bug.cgi?id=23128> - - Fairly simple patch, add specialised versions of cti_op_get/put_by_val - that assume ByteArray, thus avoiding a few branches in the case of bytearray - manipulation. - - No effect on SunSpider. 15% win on the original testcase. - - * interpreter/Interpreter.cpp: - (JSC::Interpreter::cti_op_get_by_val): - (JSC::Interpreter::cti_op_get_by_val_byte_array): - (JSC::Interpreter::cti_op_put_by_val): - (JSC::Interpreter::cti_op_put_by_val_byte_array): - * interpreter/Interpreter.h: - -2009-01-11 Alexey Proskuryakov <ap@webkit.org> - - Try to fix Windows build. - - * wtf/CurrentTime.cpp: Added a definition of msPerSecond (previously, this code was in - DateMath.cpp, with constant definition in DateTime.h) - -2009-01-11 Alexey Proskuryakov <ap@webkit.org> - - Try to fix Windows build. - - * wtf/CurrentTime.cpp: Include <sys/types.h> and <sys/timeb.h>, as MSDN says to. - -2009-01-11 Dmitry Titov <dimich@chromium.org> - - Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=23207 - Moved currentTime() to from WebCore to WTF. - - * GNUmakefile.am: - * JavaScriptCore.exp: added export for WTF::currentTime() - * JavaScriptCore.pri: - * JavaScriptCore.scons: - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * runtime/DateMath.cpp: - (JSC::getCurrentUTCTimeWithMicroseconds): This function had another implementation of currentTime(), essentially. Now uses WTF version. - * wtf/CurrentTime.cpp: Added. - (WTF::currentTime): - (WTF::highResUpTime): - (WTF::lowResUTCTime): - (WTF::qpcAvailable): - * wtf/CurrentTime.h: Added. - -2009-01-09 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Stage two of converting JSValue from a pointer to a class type. - Remove the class JSValue. The functionallity has been transitioned - into the wrapper class type JSValuePtr. - - The last stage will be to rename JSValuePtr to JSValue, remove the - overloaded -> operator, and switch operations on JSValuePtrs from - using '->' to use '.' instead. - - * API/APICast.h: - * JavaScriptCore.exp: - * runtime/JSCell.h: - (JSC::asCell): - (JSC::JSValuePtr::asCell): - (JSC::JSValuePtr::isNumber): - (JSC::JSValuePtr::isString): - (JSC::JSValuePtr::isGetterSetter): - (JSC::JSValuePtr::isObject): - (JSC::JSValuePtr::getNumber): - (JSC::JSValuePtr::getString): - (JSC::JSValuePtr::getObject): - (JSC::JSValuePtr::getCallData): - (JSC::JSValuePtr::getConstructData): - (JSC::JSValuePtr::getUInt32): - (JSC::JSValuePtr::getTruncatedInt32): - (JSC::JSValuePtr::getTruncatedUInt32): - (JSC::JSValuePtr::mark): - (JSC::JSValuePtr::marked): - (JSC::JSValuePtr::toPrimitive): - (JSC::JSValuePtr::getPrimitiveNumber): - (JSC::JSValuePtr::toBoolean): - (JSC::JSValuePtr::toNumber): - (JSC::JSValuePtr::toString): - (JSC::JSValuePtr::toObject): - (JSC::JSValuePtr::toThisObject): - (JSC::JSValuePtr::needsThisConversion): - (JSC::JSValuePtr::toThisString): - (JSC::JSValuePtr::getJSNumber): - * runtime/JSImmediate.h: - (JSC::JSValuePtr::isUndefined): - (JSC::JSValuePtr::isNull): - (JSC::JSValuePtr::isUndefinedOrNull): - (JSC::JSValuePtr::isBoolean): - (JSC::JSValuePtr::getBoolean): - (JSC::JSValuePtr::toInt32): - (JSC::JSValuePtr::toUInt32): - * runtime/JSNumberCell.h: - (JSC::JSValuePtr::uncheckedGetNumber): - (JSC::JSValuePtr::toJSNumber): - * runtime/JSObject.h: - (JSC::JSValuePtr::isObject): - (JSC::JSValuePtr::get): - (JSC::JSValuePtr::put): - * runtime/JSString.h: - (JSC::JSValuePtr::toThisJSString): - * runtime/JSValue.cpp: - (JSC::JSValuePtr::toInteger): - (JSC::JSValuePtr::toIntegerPreserveNaN): - (JSC::JSValuePtr::toInt32SlowCase): - (JSC::JSValuePtr::toUInt32SlowCase): + (JSC::JIT::emitInitRegister): + (JSC::JIT::addSlowCase): + (JSC::JIT::addJump): + (JSC::JIT::emitJumpSlowToHot): + (JSC::JIT::tagFor): + (JSC::JIT::payloadFor): + (JSC::JIT::emitLoad): + (JSC::JIT::emitLoadReturnValue): + (JSC::JIT::emitStore): + (JSC::JIT::emitStoreReturnValue): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_mov): + (JSC::JIT::emit_op_end): + (JSC::JIT::emit_op_jmp): + (JSC::JIT::emit_op_loop): + (JSC::JIT::emit_op_loop_if_less): + (JSC::JIT::emit_op_loop_if_lesseq): + (JSC::JIT::emit_op_instanceof): + (JSC::JIT::emit_op_get_global_var): + (JSC::JIT::emit_op_put_global_var): + (JSC::JIT::emit_op_get_scoped_var): + (JSC::JIT::emit_op_put_scoped_var): + (JSC::JIT::emit_op_tear_off_activation): + (JSC::JIT::emit_op_ret): + (JSC::JIT::emit_op_construct_verify): + (JSC::JIT::emit_op_to_primitive): + (JSC::JIT::emit_op_loop_if_true): + (JSC::JIT::emit_op_resolve_global): + (JSC::JIT::emit_op_not): + (JSC::JIT::emit_op_jfalse): + (JSC::JIT::emit_op_jeq_null): + (JSC::JIT::emit_op_jneq_null): + (JSC::JIT::emit_op_jneq_ptr): + (JSC::JIT::emit_op_unexpected_load): + (JSC::JIT::emit_op_eq): + (JSC::JIT::emit_op_bitnot): + (JSC::JIT::emit_op_jtrue): + (JSC::JIT::emit_op_neq): + (JSC::JIT::emit_op_bitxor): + (JSC::JIT::emit_op_bitor): + (JSC::JIT::emit_op_throw): + (JSC::JIT::emit_op_next_pname): + (JSC::JIT::emit_op_push_scope): + (JSC::JIT::emit_op_to_jsnumber): + (JSC::JIT::emit_op_push_new_scope): + (JSC::JIT::emit_op_catch): + (JSC::JIT::emit_op_switch_imm): + (JSC::JIT::emit_op_switch_char): + (JSC::JIT::emit_op_switch_string): + (JSC::JIT::emit_op_new_error): + (JSC::JIT::emit_op_eq_null): + (JSC::JIT::emit_op_neq_null): + (JSC::JIT::emit_op_convert_this): + (JSC::JIT::emit_op_profile_will_call): + (JSC::JIT::emit_op_profile_did_call): + (JSC::JIT::emitSlow_op_construct_verify): + (JSC::JIT::emitSlow_op_get_by_val): + (JSC::JIT::emitSlow_op_loop_if_less): + (JSC::JIT::emitSlow_op_loop_if_lesseq): + (JSC::JIT::emitSlow_op_put_by_val): + (JSC::JIT::emitSlow_op_not): + (JSC::JIT::emitSlow_op_instanceof): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emit_op_get_by_val): + (JSC::JIT::emit_op_put_by_val): + (JSC::JIT::emit_op_put_by_index): + (JSC::JIT::emit_op_put_getter): + (JSC::JIT::emit_op_put_setter): + (JSC::JIT::emit_op_del_by_id): + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::compilePutByIdHotPath): + * jit/JITStubCall.h: + (JSC::JITStubCall::JITStubCall): + (JSC::JITStubCall::addArgument): + (JSC::JITStubCall::call): + (JSC::JITStubCall::): + (JSC::CallEvalJITStub::CallEvalJITStub): + * jit/JITStubs.cpp: + (JSC::): + (JSC::JITStubs::cti_op_add): + (JSC::JITStubs::cti_op_pre_inc): + (JSC::JITStubs::cti_op_mul): + (JSC::JITStubs::cti_op_get_by_val): + (JSC::JITStubs::cti_op_get_by_val_string): + (JSC::JITStubs::cti_op_get_by_val_byte_array): + (JSC::JITStubs::cti_op_sub): + (JSC::JITStubs::cti_op_put_by_val): + (JSC::JITStubs::cti_op_put_by_val_array): + (JSC::JITStubs::cti_op_put_by_val_byte_array): + (JSC::JITStubs::cti_op_negate): + (JSC::JITStubs::cti_op_div): + (JSC::JITStubs::cti_op_pre_dec): + (JSC::JITStubs::cti_op_post_inc): + (JSC::JITStubs::cti_op_eq): + (JSC::JITStubs::cti_op_lshift): + (JSC::JITStubs::cti_op_bitand): + (JSC::JITStubs::cti_op_rshift): + (JSC::JITStubs::cti_op_bitnot): + (JSC::JITStubs::cti_op_mod): + (JSC::JITStubs::cti_op_neq): + (JSC::JITStubs::cti_op_post_dec): + (JSC::JITStubs::cti_op_urshift): + (JSC::JITStubs::cti_op_bitxor): + (JSC::JITStubs::cti_op_bitor): + (JSC::JITStubs::cti_op_switch_imm): + * jit/JITStubs.h: + * runtime/JSArray.cpp: + (JSC::JSArray::JSArray): + * runtime/JSFunction.cpp: + (JSC::JSFunction::~JSFunction): * runtime/JSValue.h: - (JSC::JSValuePtr::makeImmediate): - (JSC::JSValuePtr::immediateValue): - (JSC::JSValuePtr::JSValuePtr): - (JSC::JSValuePtr::operator->): - (JSC::JSValuePtr::operator bool): - (JSC::JSValuePtr::operator==): - (JSC::JSValuePtr::operator!=): - (JSC::JSValuePtr::encode): - (JSC::JSValuePtr::decode): - (JSC::JSValuePtr::toFloat): - (JSC::JSValuePtr::asValue): - (JSC::operator==): - (JSC::operator!=): - -2009-01-09 David Levin <levin@chromium.org> - - Reviewed by Oliver Hunt. - - https://bugs.webkit.org/show_bug.cgi?id=23175 - - Adjustment to previous patch. Remove call to initilizeThreading from JSGlobalCreate - and fix jsc.cpp instead. - - * jsc.cpp: - (main): - (jscmain): - * runtime/JSGlobalData.cpp: - (JSC::JSGlobalData::create): - -2009-01-09 Sam Weinig <sam@webkit.org> - - Roll r39720 back in with a working interpreted mode. - -2009-01-09 David Levin <levin@chromium.org> - - Reviewed by Oliver Hunt. - - https://bugs.webkit.org/show_bug.cgi?id=23175 - - Added a template to make the pointer and flags combination - in UString more readable and less error prone. - - * GNUmakefile.am: - * JavaScriptCore.exp: - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - Added PtrAndFlags.h (and sorted the xcode project file). - - * runtime/Identifier.cpp: - (JSC::Identifier::add): - (JSC::Identifier::addSlowCase): - * runtime/InitializeThreading.cpp: - (JSC::initializeThreadingOnce): - Made the init threading initialize the UString globals. Before - these were initilized using {} but that became harder due to the - addition of this tempalte class. - - * runtime/JSGlobalData.cpp: - (JSC::JSGlobalData::create): - * runtime/PropertyNameArray.cpp: - (JSC::PropertyNameArray::add): - * runtime/UString.cpp: - (JSC::initializeStaticBaseString): - (JSC::initializeUString): - (JSC::UString::Rep::create): - (JSC::UString::Rep::createFromUTF8): - (JSC::createRep): - (JSC::UString::UString): - (JSC::concatenate): - (JSC::UString::operator=): - (JSC::UString::makeNull): - (JSC::UString::nullRep): - * runtime/UString.h: - (JSC::UString::Rep::identifierTable): - (JSC::UString::Rep::setIdentifierTable): - (JSC::UString::Rep::isStatic): - (JSC::UString::Rep::setStatic): - (JSC::UString::Rep::): - (JSC::UString::Rep::null): - (JSC::UString::Rep::empty): - (JSC::UString::isNull): - (JSC::UString::null): - (JSC::UString::UString): - - * wtf/PtrAndFlags.h: Added. - (WTF::PtrAndFlags::PtrAndFlags): - (WTF::PtrAndFlags::isFlagSet): - (WTF::PtrAndFlags::setFlag): - (WTF::PtrAndFlags::clearFlag): - (WTF::PtrAndFlags::get): - (WTF::PtrAndFlags::set): - A simple way to layer together a pointer and 2 flags. It relies on the pointer being 4 byte aligned, - which should happen for all allocators (due to aligning pointers, int's, etc. on 4 byte boundaries). - -2009-01-08 Gavin Barraclough <barraclough@apple.com> + (JSC::JSValue::payload): + * wtf/Platform.h: - Reviewed by -O-l-i-v-e-r- -H-u-n-t- Sam Weinig (sorry, Sam!). +2009-05-07 Sam Weinig <sam@webkit.org> - Encode immediates in the low word of JSValuePtrs, on x86-64. + Reviewed by Geoffrey Garen. - On 32-bit platforms a JSValuePtr may represent a 31-bit signed integer. - On 64-bit platforms, if USE(ALTERNATE_JSIMMEDIATE) is defined, a full - 32-bit integer may be stored in an immediate. - - Presently USE(ALTERNATE_JSIMMEDIATE) uses the same encoding as the default - immediate format - the value is left shifted by one, so a one bit tag can - be added to indicate the value is an immediate. However this means that - values must be commonly be detagged (by right shifting by one) before - arithmetic operations can be performed on immediates. This patch modifies - the formattting so the the high bits of the immediate mark values as being - integer. + Add some new MacroAssembler and assembler functions that will be needed shortly. - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::not32): - (JSC::MacroAssembler::orPtr): - (JSC::MacroAssembler::zeroExtend32ToPtr): - (JSC::MacroAssembler::jaePtr): - (JSC::MacroAssembler::jbPtr): - (JSC::MacroAssembler::jnzPtr): - (JSC::MacroAssembler::jzPtr): + * assembler/MacroAssemblerX86Common.h: + (JSC::MacroAssemblerX86Common::add32): + (JSC::MacroAssemblerX86Common::and32): + (JSC::MacroAssemblerX86Common::mul32): + (JSC::MacroAssemblerX86Common::neg32): + (JSC::MacroAssemblerX86Common::or32): + (JSC::MacroAssemblerX86Common::sub32): + (JSC::MacroAssemblerX86Common::xor32): + (JSC::MacroAssemblerX86Common::branchAdd32): + (JSC::MacroAssemblerX86Common::branchMul32): + (JSC::MacroAssemblerX86Common::branchSub32): * assembler/X86Assembler.h: (JSC::X86Assembler::): + (JSC::X86Assembler::addl_rm): + (JSC::X86Assembler::andl_mr): + (JSC::X86Assembler::andl_rm): + (JSC::X86Assembler::andl_im): + (JSC::X86Assembler::negl_r): (JSC::X86Assembler::notl_r): - (JSC::X86Assembler::testq_i32r): - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): - (JSC::JIT::privateCompileCTIMachineTrampolines): - * jit/JIT.h: - * jit/JITArithmetic.cpp: - (JSC::JIT::compileFastArith_op_lshift): - (JSC::JIT::compileFastArith_op_rshift): - (JSC::JIT::compileFastArith_op_bitand): - (JSC::JIT::compileFastArithSlow_op_bitand): - (JSC::JIT::compileFastArith_op_mod): - (JSC::JIT::compileFastArithSlow_op_mod): - (JSC::JIT::compileFastArith_op_add): - (JSC::JIT::compileFastArith_op_mul): - (JSC::JIT::compileFastArith_op_post_inc): - (JSC::JIT::compileFastArith_op_post_dec): - (JSC::JIT::compileFastArith_op_pre_inc): - (JSC::JIT::compileFastArith_op_pre_dec): - (JSC::JIT::putDoubleResultToJSNumberCellOrJSImmediate): - (JSC::JIT::compileBinaryArithOp): - * jit/JITCall.cpp: - (JSC::JIT::compileOpCallSlowCase): - * jit/JITInlineMethods.h: - (JSC::JIT::emitJumpIfJSCell): - (JSC::JIT::emitJumpIfNotJSCell): - (JSC::JIT::emitJumpIfImmNum): - (JSC::JIT::emitJumpSlowCaseIfNotImmNum): - (JSC::JIT::emitJumpSlowCaseIfNotImmNums): - (JSC::JIT::emitFastArithDeTagImmediate): - (JSC::JIT::emitFastArithDeTagImmediateJumpIfZero): - (JSC::JIT::emitFastArithReTagImmediate): - (JSC::JIT::emitFastArithImmToInt): - (JSC::JIT::emitFastArithIntToImmNoCheck): - (JSC::JIT::emitTagAsBoolImmediate): - * jit/JITPropertyAccess.cpp: - (JSC::resizePropertyStorage): - (JSC::JIT::privateCompilePutByIdTransition): - (JSC::JIT::privateCompilePatchGetArrayLength): - (JSC::JIT::privateCompileGetByIdSelf): - (JSC::JIT::privateCompileGetByIdProto): - (JSC::JIT::privateCompileGetByIdChain): - (JSC::JIT::privateCompilePutByIdReplace): - * runtime/JSImmediate.h: - (JSC::JSImmediate::isNumber): - (JSC::JSImmediate::isPositiveNumber): - (JSC::JSImmediate::areBothImmediateNumbers): - (JSC::JSImmediate::xorImmediateNumbers): - (JSC::JSImmediate::rightShiftImmediateNumbers): - (JSC::JSImmediate::canDoFastAdditiveOperations): - (JSC::JSImmediate::addImmediateNumbers): - (JSC::JSImmediate::subImmediateNumbers): - (JSC::JSImmediate::makeInt): - (JSC::JSImmediate::toBoolean): - * wtf/Platform.h: - -2009-01-08 Sam Weinig <sam@webkit.org> - - Revert r39720. It broke Interpreted mode. - -2009-01-08 Sam Weinig <sam@webkit.org> - - Reviewed by Oliver Hunt. - - Fix for https://bugs.webkit.org/show_bug.cgi?id=23197 - Delay creating the PCVector until an exception is thrown - Part of <rdar://problem/6469060> - Don't store exception information for a CodeBlock until first exception is thrown - - - Change the process for re-parsing/re-generating bytecode for exception information - to use data from the original CodeBlock (offsets of GlobalResolve instructions) to - aid in creating an identical instruction stream on re-parse, instead of padding - interchangeable opcodes, which would result in different JITed code. - - Fix bug where the wrong ScopeChainNode was used when re-parsing/regenerating from - within some odd modified scope chains. - - Lazily create the pcVector by re-JITing the regenerated CodeBlock and stealing the - the pcVector from it. - - Saves ~2MB on Membuster head. - - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::dump): - (JSC::CodeBlock::reparseForExceptionInfoIfNecessary): - (JSC::CodeBlock::hasGlobalResolveInstructionAtBytecodeOffset): - (JSC::CodeBlock::hasGlobalResolveInfoAtBytecodeOffset): - * bytecode/CodeBlock.h: - (JSC::JITCodeRef::JITCodeRef): - (JSC::GlobalResolveInfo::GlobalResolveInfo): - (JSC::CodeBlock::getBytecodeIndex): - (JSC::CodeBlock::addGlobalResolveInstruction): - (JSC::CodeBlock::addGlobalResolveInfo): - (JSC::CodeBlock::addFunctionRegisterInfo): - (JSC::CodeBlock::hasExceptionInfo): - (JSC::CodeBlock::pcVector): - (JSC::EvalCodeBlock::EvalCodeBlock): - (JSC::EvalCodeBlock::baseScopeDepth): - * bytecode/Opcode.h: - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::BytecodeGenerator): - (JSC::BytecodeGenerator::emitResolve): - (JSC::BytecodeGenerator::emitGetScopedVar): - * bytecompiler/BytecodeGenerator.h: - (JSC::BytecodeGenerator::setRegeneratingForExceptionInfo): - * interpreter/Interpreter.cpp: - (JSC::bytecodeOffsetForPC): - (JSC::Interpreter::unwindCallFrame): - (JSC::Interpreter::privateExecute): - (JSC::Interpreter::retrieveLastCaller): - (JSC::Interpreter::cti_op_instanceof): - (JSC::Interpreter::cti_op_call_NotJSFunction): - (JSC::Interpreter::cti_op_resolve): - (JSC::Interpreter::cti_op_construct_NotJSConstruct): - (JSC::Interpreter::cti_op_resolve_func): - (JSC::Interpreter::cti_op_resolve_skip): - (JSC::Interpreter::cti_op_resolve_global): - (JSC::Interpreter::cti_op_resolve_with_base): - (JSC::Interpreter::cti_op_throw): - (JSC::Interpreter::cti_op_in): - (JSC::Interpreter::cti_vm_throw): - * jit/JIT.cpp: - (JSC::JIT::privateCompile): - * parser/Nodes.cpp: - (JSC::EvalNode::generateBytecode): - (JSC::EvalNode::bytecodeForExceptionInfoReparse): - (JSC::FunctionBodyNode::bytecodeForExceptionInfoReparse): - * parser/Nodes.h: - -2009-01-08 Jian Li <jianli@chromium.org> - - Reviewed by Alexey Proskuryakov. - - Add Win32 implementation of ThreadSpecific. - https://bugs.webkit.org/show_bug.cgi?id=22614 - - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - * wtf/ThreadSpecific.h: - (WTF::ThreadSpecific::ThreadSpecific): - (WTF::ThreadSpecific::~ThreadSpecific): - (WTF::ThreadSpecific::get): - (WTF::ThreadSpecific::set): - (WTF::ThreadSpecific::destroy): - * wtf/ThreadSpecificWin.cpp: Added. - (WTF::ThreadSpecificThreadExit): - * wtf/ThreadingWin.cpp: - (WTF::wtfThreadEntryPoint): + (JSC::X86Assembler::orl_rm): + (JSC::X86Assembler::orl_im): + (JSC::X86Assembler::subl_rm): + (JSC::X86Assembler::xorl_mr): + (JSC::X86Assembler::xorl_rm): + (JSC::X86Assembler::xorl_im): + (JSC::X86Assembler::imull_mr): -2009-01-08 Justin McPherson <justin.mcpherson@nokia.com> +2009-05-11 Sam Weinig <sam@webkit.org> - Reviewed by Simon Hausmann. + Reviewed by Cameron Zwarich. - Fix compilation with Qt on NetBSD. + Remove the NumberHeap. + * JavaScriptCore.exp: * runtime/Collector.cpp: - (JSC::currentThreadStackBase): Use PLATFORM(NETBSD) to enter the - code path to retrieve the stack base using pthread_attr_get_np. - The PTHREAD_NP_H define is not used because the header file does - not exist on NetBSD, but the function is declared nevertheless. - * wtf/Platform.h: Introduce WTF_PLATFORM_NETBSD. - -2009-01-07 Sam Weinig <sam@webkit.org> - - Reviewed by Geoffrey Garen. - - <rdar://problem/6469060> Don't store exception information for a CodeBlock until first exception is thrown - - Don't initially store exception information (lineNumber/expressionRange/getByIdExcecptionInfo) - in CodeBlocks blocks. Instead, re-parse for the data on demand and cache it then. - - One important change that was needed to make this work was to pad op_get_global_var with nops to - be the same length as op_resolve_global, since one could be replaced for the other on re-parsing, - and we want to keep the offsets bytecode offsets the same. - - 1.3MB improvement on Membuster head. - - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::dump): Update op_get_global_var to account for the padding. - (JSC::CodeBlock::dumpStatistics): Add more statistic dumping. - (JSC::CodeBlock::CodeBlock): Initialize m_exceptionInfo. - (JSC::CodeBlock::reparseForExceptionInfoIfNecessary): Re-parses the CodeBlocks - associated SourceCode and steals the ExceptionInfo from it. - (JSC::CodeBlock::lineNumberForBytecodeOffset): Creates the exception info on demand. - (JSC::CodeBlock::expressionRangeForBytecodeOffset): Ditto. - (JSC::CodeBlock::getByIdExceptionInfoForBytecodeOffset): Ditto. - * bytecode/CodeBlock.h: - (JSC::CodeBlock::numberOfExceptionHandlers): Updated to account for m_exceptionInfo indirection. - (JSC::CodeBlock::addExceptionHandler): Ditto. - (JSC::CodeBlock::exceptionHandler): Ditto. - (JSC::CodeBlock::clearExceptionInfo): Ditto. - (JSC::CodeBlock::addExpressionInfo): Ditto. - (JSC::CodeBlock::addGetByIdExceptionInfo): Ditto. - (JSC::CodeBlock::numberOfLineInfos): Ditto. - (JSC::CodeBlock::addLineInfo): Ditto. - (JSC::CodeBlock::lastLineInfo): Ditto. - - * bytecode/Opcode.h: Change length of op_get_global_var to match op_resolve_global. - - * bytecode/SamplingTool.cpp: - (JSC::SamplingTool::dump): Add comment indicating why it is okay not to pass a CallFrame. - - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::generate): Clear the exception info after generation for Function and Eval - Code when not in regenerate for exception info mode. - (JSC::BytecodeGenerator::BytecodeGenerator): Initialize m_regeneratingForExceptionInfo to false. - (JSC::BytecodeGenerator::emitGetScopedVar): Pad op_get_global_var with 2 nops. - * bytecompiler/BytecodeGenerator.h: - (JSC::BytecodeGenerator::setRegeneratingForExcpeptionInfo): Added. - - * interpreter/Interpreter.cpp: - (JSC::Interpreter::throwException): Pass the CallFrame to exception info accessors. - (JSC::Interpreter::privateExecute): Ditto. - (JSC::Interpreter::retrieveLastCaller): Ditto. - (JSC::Interpreter::cti_op_new_error): Ditto. - - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): Pass the current bytecode offset instead of hard coding the - line number, the stub will do the accessing if it gets called. - - * parser/Nodes.cpp: - (JSC::ProgramNode::emitBytecode): Moved. - (JSC::ProgramNode::generateBytecode): Moved. - (JSC::EvalNode::create): Moved. - (JSC::EvalNode::bytecodeForExceptionInfoReparse): Added. - (JSC::FunctionBodyNode::generateBytecode): Rename reparse to reparseInPlace. - (JSC::FunctionBodyNode::bytecodeForExceptionInfoReparse): Addded. - - * parser/Nodes.h: - (JSC::ScopeNode::features): Added getter. - * parser/Parser.cpp: - (JSC::Parser::reparseInPlace): Renamed from reparse. - * parser/Parser.h: - (JSC::Parser::reparse): Added. Re-parses the passed in Node into - a new Node. - * runtime/ExceptionHelpers.cpp: - (JSC::createUndefinedVariableError): Pass along CallFrame. - (JSC::createInvalidParamError): Ditto. - (JSC::createNotAConstructorError): Ditto. - (JSC::createNotAFunctionError): Ditto. - (JSC::createNotAnObjectError): Ditto. - -2009-01-06 Gavin Barraclough <baraclough@apple.com> - - Reviewed by Maciej Stachowiak. - - Replace accidentally removed references in BytecodeGenerator, deleting these - will be hindering the sharing of constant numbers and strings. - - The code to add a new constant (either number or string) to their respective - map works by attempting to add a null entry, then checking the result of the - add for null. The first time, this should return the null (or noValue). - The code checks for null (to see if this is the initial add), and then allocates - a new number / string object. This code relies on the result returned from - the add to the map being stored as a reference, such that the allocated object - will be stored in the map, and will be resused if the same constant is encountered - again. By failing to use a reference we will be leaking GC object for each - additional entry added to the map. As GC objects they should be clollected, - be we should no be allocatin them in the first place. - - https://bugs.webkit.org/show_bug.cgi?id=23158 - - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::emitLoad): - -2009-01-06 Oliver Hunt <oliver@apple.com> - - Reviewed by Gavin Barraclough. - - <rdar://problem/6040850> JavaScript register file should use VirtualAlloc on Windows - - Fairly simple, just reserve 4Mb of address space for the - register file, and then commit one section at a time. We - don't release committed memory as we drop back, but then - mac doesn't either so this probably not too much of a - problem. - - * interpreter/RegisterFile.cpp: - (JSC::RegisterFile::~RegisterFile): - * interpreter/RegisterFile.h: - (JSC::RegisterFile::RegisterFile): - (JSC::RegisterFile::grow): - -2009-01-06 Alexey Proskuryakov <ap@webkit.org> - - Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=23142 - ThreadGlobalData leaks seen on buildbot - - * wtf/ThreadSpecific.h: (WTF::ThreadSpecific::destroy): Temporarily reset the thread - specific value to make getter work on Mac OS X. - - * wtf/Platform.h: Touch this file again to make sure all Windows builds use the most recent - version of ThreadSpecific.h. + (JSC::Heap::Heap): + (JSC::Heap::destroy): + (JSC::Heap::recordExtraCost): + (JSC::Heap::heapAllocate): + (JSC::Heap::markConservatively): + (JSC::Heap::sweep): + (JSC::Heap::collect): + (JSC::Heap::objectCount): + (JSC::Heap::statistics): + (JSC::typeName): + (JSC::Heap::isBusy): + * runtime/Collector.h: + (JSC::Heap::globalData): + * runtime/JSCell.h: -2009-01-05 Gavin Barraclough <baraclough@apple.com> +2009-05-11 Geoffrey Garen <ggaren@apple.com> - Reviewed by Oliver Hunt. + Reviewed by Sam Weinig. - Replace all uses of JSValue* with a new smart pointer type, JSValuePtr. - - A JavaScript value may be a heap object or boxed primitive, represented by a - pointer, or may be an unboxed immediate value, such as an integer. Since a - value may dynamically need to contain either a pointer value or an immediate, - we encode immediates as pointer values (since all valid JSCell pointers are - allocated at alligned addesses, unaligned addresses are available to encode - immediates). As such all JavaScript values are represented using a JSValue*. - - This implementation is encumbered by a number of constraints. It ties the - JSValue representation to the size of pointer on the platform, which, for - example, means that we currently can represent different ranges of integers - as immediates on x86 and x86-64. It also prevents us from overloading the - to-boolean conversion used to test for noValue() - effectively forcing us - to represent noValue() as 0. This would potentially be problematic were we - to wish to encode integer values differently (e.g. were we to use the v8 - encoding, where pointers are tagged with 1 and integers with 0, then the - immediate integer 0 would conflict with noValue()). - - This patch replaces all usage of JSValue* with a new class, JSValuePtr, - which encapsulates the pointer. JSValuePtr maintains the same interface as - JSValue*, overloading operator-> and operator bool such that previous - operations in the code on variables of type JSValue* are still supported. - - In order to provide a ProtectPtr<> type with support for the new value - representation (without using the internal JSValue type directly), a new - ProtectJSValuePtr type has been added, equivalent to the previous type - ProtectPtr<JSValue>. - - This patch is likely the first in a sequence of three changes. With the - value now encapsulated it will likely make sense to migrate the functionality - from JSValue into JSValuePtr, such that the internal pointer representation - need not be exposed. Through migrating the functionality to the wrapper - class the existing JSValue should be rendered redundant, and the class is - likely to be removed (the JSValuePtr now wrapping a pointer to a JSCell). - At this stage it will likely make sense to rename JSValuePtr to JSValue. - - https://bugs.webkit.org/show_bug.cgi?id=23114 + Land initial commit of new number representation for 32 bit platforms, + with JIT disabled. * API/APICast.h: (toJS): (toRef): - * API/JSBase.cpp: - (JSEvaluateScript): - * API/JSCallbackConstructor.h: - (JSC::JSCallbackConstructor::createStructure): - * API/JSCallbackFunction.cpp: - (JSC::JSCallbackFunction::call): - * API/JSCallbackFunction.h: - (JSC::JSCallbackFunction::createStructure): - * API/JSCallbackObject.h: - (JSC::JSCallbackObject::createStructure): * API/JSCallbackObjectFunctions.h: - (JSC::::asCallbackObject): - (JSC::::put): (JSC::::hasInstance): - (JSC::::call): - (JSC::::staticValueGetter): - (JSC::::staticFunctionGetter): - (JSC::::callbackGetter): - * API/JSContextRef.cpp: - * API/JSObjectRef.cpp: - (JSObjectMakeConstructor): - (JSObjectSetPrototype): - (JSObjectGetProperty): - (JSObjectSetProperty): - (JSObjectGetPropertyAtIndex): - (JSObjectSetPropertyAtIndex): - * API/JSValueRef.cpp: - (JSValueGetType): - (JSValueIsUndefined): - (JSValueIsNull): - (JSValueIsBoolean): - (JSValueIsNumber): - (JSValueIsString): - (JSValueIsObject): - (JSValueIsObjectOfClass): - (JSValueIsEqual): - (JSValueIsStrictEqual): - (JSValueIsInstanceOfConstructor): - (JSValueToBoolean): - (JSValueToNumber): - (JSValueToStringCopy): - (JSValueToObject): - (JSValueProtect): - (JSValueUnprotect): + (JSC::::toNumber): + (JSC::::toString): + * API/tests/testapi.c: + (EvilExceptionObject_convertToType): + * AllInOneFile.cpp: * JavaScriptCore.exp: + * JavaScriptCore.xcodeproj/project.pbxproj: * bytecode/CodeBlock.cpp: (JSC::valueToSourceString): - (JSC::constantName): - (JSC::CodeBlock::dump): - * bytecode/CodeBlock.h: - (JSC::CodeBlock::getConstant): - (JSC::CodeBlock::addUnexpectedConstant): - (JSC::CodeBlock::unexpectedConstant): - * bytecode/EvalCodeCache.h: - (JSC::EvalCodeCache::get): * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::BytecodeGenerator): - (JSC::BytecodeGenerator::addConstant): - (JSC::BytecodeGenerator::addUnexpectedConstant): (JSC::BytecodeGenerator::emitLoad): - (JSC::BytecodeGenerator::emitLoadJSV): - (JSC::BytecodeGenerator::emitGetScopedVar): - (JSC::BytecodeGenerator::emitPutScopedVar): - (JSC::BytecodeGenerator::emitNewError): + (JSC::BytecodeGenerator::emitUnexpectedLoad): (JSC::keyForImmediateSwitch): * bytecompiler/BytecodeGenerator.h: - (JSC::BytecodeGenerator::JSValueHashTraits::constructDeletedValue): - (JSC::BytecodeGenerator::JSValueHashTraits::isDeletedValue): - * debugger/DebuggerCallFrame.cpp: - (JSC::DebuggerCallFrame::evaluate): - * debugger/DebuggerCallFrame.h: - (JSC::DebuggerCallFrame::DebuggerCallFrame): - (JSC::DebuggerCallFrame::exception): - * interpreter/CallFrame.cpp: - (JSC::CallFrame::thisValue): - * interpreter/CallFrame.h: - (JSC::ExecState::setException): - (JSC::ExecState::exception): - (JSC::ExecState::exceptionSlot): - (JSC::ExecState::hadException): * interpreter/Interpreter.cpp: - (JSC::fastIsNumber): - (JSC::fastToInt32): - (JSC::fastToUInt32): - (JSC::jsLess): - (JSC::jsLessEq): - (JSC::jsAddSlowCase): - (JSC::jsAdd): - (JSC::jsTypeStringForValue): - (JSC::jsIsObjectType): - (JSC::jsIsFunctionType): - (JSC::Interpreter::resolve): - (JSC::Interpreter::resolveSkip): - (JSC::Interpreter::resolveGlobal): - (JSC::inlineResolveBase): - (JSC::Interpreter::resolveBase): - (JSC::Interpreter::resolveBaseAndProperty): - (JSC::Interpreter::resolveBaseAndFunc): - (JSC::isNotObject): - (JSC::Interpreter::callEval): - (JSC::Interpreter::unwindCallFrame): - (JSC::Interpreter::throwException): - (JSC::Interpreter::execute): - (JSC::Interpreter::checkTimeout): - (JSC::Interpreter::createExceptionScope): - (JSC::cachePrototypeChain): - (JSC::Interpreter::tryCachePutByID): - (JSC::countPrototypeChainEntriesAndCheckForProxies): - (JSC::Interpreter::tryCacheGetByID): + (JSC::Interpreter::dumpRegisters): (JSC::Interpreter::privateExecute): - (JSC::Interpreter::retrieveArguments): - (JSC::Interpreter::retrieveCaller): - (JSC::Interpreter::retrieveLastCaller): - (JSC::Interpreter::tryCTICachePutByID): - (JSC::Interpreter::tryCTICacheGetByID): - (JSC::returnToThrowTrampoline): - (JSC::Interpreter::cti_op_convert_this): - (JSC::Interpreter::cti_op_add): - (JSC::Interpreter::cti_op_pre_inc): - (JSC::Interpreter::cti_op_loop_if_less): - (JSC::Interpreter::cti_op_loop_if_lesseq): - (JSC::Interpreter::cti_op_get_by_id_generic): - (JSC::Interpreter::cti_op_get_by_id): - (JSC::Interpreter::cti_op_get_by_id_second): - (JSC::Interpreter::cti_op_get_by_id_self_fail): - (JSC::Interpreter::cti_op_get_by_id_proto_list): - (JSC::Interpreter::cti_op_get_by_id_proto_list_full): - (JSC::Interpreter::cti_op_get_by_id_proto_fail): - (JSC::Interpreter::cti_op_get_by_id_array_fail): - (JSC::Interpreter::cti_op_get_by_id_string_fail): - (JSC::Interpreter::cti_op_instanceof): - (JSC::Interpreter::cti_op_del_by_id): - (JSC::Interpreter::cti_op_mul): - (JSC::Interpreter::cti_op_call_NotJSFunction): - (JSC::Interpreter::cti_op_resolve): - (JSC::Interpreter::cti_op_construct_NotJSConstruct): - (JSC::Interpreter::cti_op_get_by_val): - (JSC::Interpreter::cti_op_resolve_func): - (JSC::Interpreter::cti_op_sub): - (JSC::Interpreter::cti_op_put_by_val): - (JSC::Interpreter::cti_op_put_by_val_array): - (JSC::Interpreter::cti_op_lesseq): - (JSC::Interpreter::cti_op_loop_if_true): - (JSC::Interpreter::cti_op_negate): - (JSC::Interpreter::cti_op_resolve_base): - (JSC::Interpreter::cti_op_resolve_skip): - (JSC::Interpreter::cti_op_resolve_global): - (JSC::Interpreter::cti_op_div): - (JSC::Interpreter::cti_op_pre_dec): - (JSC::Interpreter::cti_op_jless): - (JSC::Interpreter::cti_op_not): - (JSC::Interpreter::cti_op_jtrue): - (JSC::Interpreter::cti_op_post_inc): - (JSC::Interpreter::cti_op_eq): - (JSC::Interpreter::cti_op_lshift): - (JSC::Interpreter::cti_op_bitand): - (JSC::Interpreter::cti_op_rshift): - (JSC::Interpreter::cti_op_bitnot): - (JSC::Interpreter::cti_op_resolve_with_base): - (JSC::Interpreter::cti_op_mod): - (JSC::Interpreter::cti_op_less): - (JSC::Interpreter::cti_op_neq): - (JSC::Interpreter::cti_op_post_dec): - (JSC::Interpreter::cti_op_urshift): - (JSC::Interpreter::cti_op_bitxor): - (JSC::Interpreter::cti_op_bitor): - (JSC::Interpreter::cti_op_call_eval): - (JSC::Interpreter::cti_op_throw): - (JSC::Interpreter::cti_op_next_pname): - (JSC::Interpreter::cti_op_typeof): - (JSC::Interpreter::cti_op_is_undefined): - (JSC::Interpreter::cti_op_is_boolean): - (JSC::Interpreter::cti_op_is_number): - (JSC::Interpreter::cti_op_is_string): - (JSC::Interpreter::cti_op_is_object): - (JSC::Interpreter::cti_op_is_function): - (JSC::Interpreter::cti_op_stricteq): - (JSC::Interpreter::cti_op_nstricteq): - (JSC::Interpreter::cti_op_to_jsnumber): - (JSC::Interpreter::cti_op_in): - (JSC::Interpreter::cti_op_switch_imm): - (JSC::Interpreter::cti_op_switch_char): - (JSC::Interpreter::cti_op_switch_string): - (JSC::Interpreter::cti_op_del_by_val): - (JSC::Interpreter::cti_op_new_error): - (JSC::Interpreter::cti_vm_throw): - * interpreter/Interpreter.h: - (JSC::Interpreter::isJSArray): - (JSC::Interpreter::isJSString): - * interpreter/Register.h: - (JSC::Register::): - (JSC::Register::Register): - (JSC::Register::jsValue): - (JSC::Register::getJSValue): - * jit/JIT.cpp: - (JSC::): - (JSC::JIT::compileOpStrictEq): - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): - * jit/JIT.h: - (JSC::): - (JSC::JIT::execute): - * jit/JITArithmetic.cpp: - (JSC::JIT::compileFastArith_op_rshift): - (JSC::JIT::compileFastArithSlow_op_rshift): - * jit/JITCall.cpp: - (JSC::JIT::unlinkCall): - (JSC::JIT::compileOpCallInitializeCallFrame): - (JSC::JIT::compileOpCall): - * jit/JITInlineMethods.h: - (JSC::JIT::emitGetVirtualRegister): - (JSC::JIT::getConstantOperand): - (JSC::JIT::isOperandConstant31BitImmediateInt): - (JSC::JIT::emitPutJITStubArgFromVirtualRegister): - (JSC::JIT::emitInitRegister): - * jit/JITPropertyAccess.cpp: - (JSC::resizePropertyStorage): - (JSC::JIT::privateCompilePutByIdTransition): - (JSC::JIT::patchGetByIdSelf): - (JSC::JIT::patchPutByIdReplace): - (JSC::JIT::privateCompileGetByIdSelf): - (JSC::JIT::privateCompileGetByIdProto): - (JSC::JIT::privateCompileGetByIdSelfList): - (JSC::JIT::privateCompileGetByIdProtoList): - (JSC::JIT::privateCompileGetByIdChainList): - (JSC::JIT::privateCompileGetByIdChain): - (JSC::JIT::privateCompilePutByIdReplace): - * jsc.cpp: - (functionPrint): - (functionDebug): - (functionGC): - (functionVersion): - (functionRun): - (functionLoad): - (functionReadline): - (functionQuit): * parser/Nodes.cpp: - (JSC::NullNode::emitBytecode): (JSC::ArrayNode::emitBytecode): - (JSC::FunctionCallValueNode::emitBytecode): - (JSC::FunctionCallResolveNode::emitBytecode): - (JSC::VoidNode::emitBytecode): - (JSC::ConstDeclNode::emitCodeSingle): - (JSC::ReturnNode::emitBytecode): (JSC::processClauseList): - (JSC::EvalNode::emitBytecode): - (JSC::FunctionBodyNode::emitBytecode): - (JSC::ProgramNode::emitBytecode): - * profiler/ProfileGenerator.cpp: - (JSC::ProfileGenerator::addParentForConsoleStart): - * profiler/Profiler.cpp: - (JSC::Profiler::willExecute): - (JSC::Profiler::didExecute): - (JSC::Profiler::createCallIdentifier): - * profiler/Profiler.h: - * runtime/ArgList.cpp: - (JSC::ArgList::slowAppend): * runtime/ArgList.h: - (JSC::ArgList::at): - (JSC::ArgList::append): - * runtime/Arguments.cpp: - (JSC::Arguments::put): - * runtime/Arguments.h: - (JSC::Arguments::createStructure): - (JSC::asArguments): - * runtime/ArrayConstructor.cpp: - (JSC::callArrayConstructor): - * runtime/ArrayPrototype.cpp: - (JSC::getProperty): - (JSC::putProperty): - (JSC::arrayProtoFuncToString): - (JSC::arrayProtoFuncToLocaleString): - (JSC::arrayProtoFuncJoin): - (JSC::arrayProtoFuncConcat): - (JSC::arrayProtoFuncPop): - (JSC::arrayProtoFuncPush): - (JSC::arrayProtoFuncReverse): - (JSC::arrayProtoFuncShift): - (JSC::arrayProtoFuncSlice): - (JSC::arrayProtoFuncSort): - (JSC::arrayProtoFuncSplice): - (JSC::arrayProtoFuncUnShift): - (JSC::arrayProtoFuncFilter): - (JSC::arrayProtoFuncMap): - (JSC::arrayProtoFuncEvery): - (JSC::arrayProtoFuncForEach): - (JSC::arrayProtoFuncSome): - (JSC::arrayProtoFuncIndexOf): - (JSC::arrayProtoFuncLastIndexOf): - * runtime/BooleanConstructor.cpp: - (JSC::callBooleanConstructor): - (JSC::constructBooleanFromImmediateBoolean): - * runtime/BooleanConstructor.h: - * runtime/BooleanObject.h: - (JSC::asBooleanObject): - * runtime/BooleanPrototype.cpp: - (JSC::booleanProtoFuncToString): - (JSC::booleanProtoFuncValueOf): - * runtime/CallData.cpp: - (JSC::call): - * runtime/CallData.h: - * runtime/Collector.cpp: - (JSC::Heap::protect): - (JSC::Heap::unprotect): - (JSC::Heap::heap): - (JSC::Heap::collect): * runtime/Collector.h: - * runtime/Completion.cpp: - (JSC::evaluate): - * runtime/Completion.h: - (JSC::Completion::Completion): - (JSC::Completion::value): - (JSC::Completion::setValue): - (JSC::Completion::isValueCompletion): - * runtime/ConstructData.cpp: - (JSC::construct): - * runtime/ConstructData.h: - * runtime/DateConstructor.cpp: - (JSC::constructDate): - (JSC::callDate): - (JSC::dateParse): - (JSC::dateNow): - (JSC::dateUTC): - * runtime/DateInstance.h: - (JSC::asDateInstance): - * runtime/DatePrototype.cpp: - (JSC::dateProtoFuncToString): - (JSC::dateProtoFuncToUTCString): - (JSC::dateProtoFuncToDateString): - (JSC::dateProtoFuncToTimeString): - (JSC::dateProtoFuncToLocaleString): - (JSC::dateProtoFuncToLocaleDateString): - (JSC::dateProtoFuncToLocaleTimeString): - (JSC::dateProtoFuncValueOf): - (JSC::dateProtoFuncGetTime): - (JSC::dateProtoFuncGetFullYear): - (JSC::dateProtoFuncGetUTCFullYear): - (JSC::dateProtoFuncToGMTString): - (JSC::dateProtoFuncGetMonth): - (JSC::dateProtoFuncGetUTCMonth): - (JSC::dateProtoFuncGetDate): - (JSC::dateProtoFuncGetUTCDate): - (JSC::dateProtoFuncGetDay): - (JSC::dateProtoFuncGetUTCDay): - (JSC::dateProtoFuncGetHours): - (JSC::dateProtoFuncGetUTCHours): - (JSC::dateProtoFuncGetMinutes): - (JSC::dateProtoFuncGetUTCMinutes): - (JSC::dateProtoFuncGetSeconds): - (JSC::dateProtoFuncGetUTCSeconds): - (JSC::dateProtoFuncGetMilliSeconds): - (JSC::dateProtoFuncGetUTCMilliseconds): - (JSC::dateProtoFuncGetTimezoneOffset): - (JSC::dateProtoFuncSetTime): - (JSC::setNewValueFromTimeArgs): - (JSC::setNewValueFromDateArgs): - (JSC::dateProtoFuncSetMilliSeconds): - (JSC::dateProtoFuncSetUTCMilliseconds): - (JSC::dateProtoFuncSetSeconds): - (JSC::dateProtoFuncSetUTCSeconds): - (JSC::dateProtoFuncSetMinutes): - (JSC::dateProtoFuncSetUTCMinutes): - (JSC::dateProtoFuncSetHours): - (JSC::dateProtoFuncSetUTCHours): - (JSC::dateProtoFuncSetDate): - (JSC::dateProtoFuncSetUTCDate): - (JSC::dateProtoFuncSetMonth): - (JSC::dateProtoFuncSetUTCMonth): - (JSC::dateProtoFuncSetFullYear): - (JSC::dateProtoFuncSetUTCFullYear): - (JSC::dateProtoFuncSetYear): - (JSC::dateProtoFuncGetYear): - * runtime/DatePrototype.h: - (JSC::DatePrototype::createStructure): - * runtime/ErrorConstructor.cpp: - (JSC::callErrorConstructor): - * runtime/ErrorPrototype.cpp: - (JSC::errorProtoFuncToString): - * runtime/ExceptionHelpers.cpp: - (JSC::createInterruptedExecutionException): - (JSC::createError): - (JSC::createStackOverflowError): - (JSC::createUndefinedVariableError): - (JSC::createErrorMessage): - (JSC::createInvalidParamError): - (JSC::createNotAConstructorError): - (JSC::createNotAFunctionError): + (JSC::sizeof): + * runtime/DateMath.cpp: * runtime/ExceptionHelpers.h: - * runtime/FunctionConstructor.cpp: - (JSC::callFunctionConstructor): - * runtime/FunctionPrototype.cpp: - (JSC::callFunctionPrototype): - (JSC::functionProtoFuncToString): - (JSC::functionProtoFuncApply): - (JSC::functionProtoFuncCall): - * runtime/FunctionPrototype.h: - (JSC::FunctionPrototype::createStructure): - * runtime/GetterSetter.cpp: - (JSC::GetterSetter::toPrimitive): - (JSC::GetterSetter::getPrimitiveNumber): - * runtime/GetterSetter.h: - (JSC::asGetterSetter): * runtime/InitializeThreading.cpp: - * runtime/InternalFunction.h: - (JSC::InternalFunction::createStructure): - (JSC::asInternalFunction): - * runtime/JSActivation.cpp: - (JSC::JSActivation::getOwnPropertySlot): - (JSC::JSActivation::put): - (JSC::JSActivation::putWithAttributes): - (JSC::JSActivation::argumentsGetter): - * runtime/JSActivation.h: - (JSC::JSActivation::createStructure): - (JSC::asActivation): * runtime/JSArray.cpp: - (JSC::storageSize): (JSC::JSArray::JSArray): - (JSC::JSArray::getOwnPropertySlot): - (JSC::JSArray::put): - (JSC::JSArray::putSlowCase): - (JSC::JSArray::deleteProperty): - (JSC::JSArray::getPropertyNames): - (JSC::JSArray::setLength): - (JSC::JSArray::pop): - (JSC::JSArray::push): - (JSC::JSArray::mark): - (JSC::JSArray::sort): - (JSC::JSArray::compactForSorting): - (JSC::JSArray::checkConsistency): - (JSC::constructArray): - * runtime/JSArray.h: - (JSC::JSArray::getIndex): - (JSC::JSArray::setIndex): - (JSC::JSArray::createStructure): - (JSC::asArray): * runtime/JSCell.cpp: - (JSC::JSCell::put): - (JSC::JSCell::getJSNumber): * runtime/JSCell.h: - (JSC::asCell): - (JSC::JSValue::asCell): + (JSC::JSCell::isAPIValueWrapper): + (JSC::JSValue::isString): + (JSC::JSValue::isGetterSetter): + (JSC::JSValue::isObject): + (JSC::JSValue::getString): + (JSC::JSValue::getObject): + (JSC::JSValue::getCallData): + (JSC::JSValue::getConstructData): + (JSC::JSValue::getUInt32): + (JSC::JSValue::marked): (JSC::JSValue::toPrimitive): (JSC::JSValue::getPrimitiveNumber): + (JSC::JSValue::toBoolean): + (JSC::JSValue::toNumber): + (JSC::JSValue::toString): + (JSC::JSValue::needsThisConversion): + (JSC::JSValue::toThisString): (JSC::JSValue::getJSNumber): - * runtime/JSFunction.cpp: - (JSC::JSFunction::call): - (JSC::JSFunction::argumentsGetter): - (JSC::JSFunction::callerGetter): - (JSC::JSFunction::lengthGetter): - (JSC::JSFunction::getOwnPropertySlot): - (JSC::JSFunction::put): - (JSC::JSFunction::construct): - * runtime/JSFunction.h: - (JSC::JSFunction::createStructure): - (JSC::asFunction): + (JSC::JSValue::toObject): + (JSC::JSValue::toThisObject): + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): * runtime/JSGlobalData.h: - * runtime/JSGlobalObject.cpp: - (JSC::markIfNeeded): - (JSC::JSGlobalObject::put): - (JSC::JSGlobalObject::putWithAttributes): - (JSC::JSGlobalObject::reset): - (JSC::JSGlobalObject::resetPrototype): * runtime/JSGlobalObject.h: - (JSC::JSGlobalObject::createStructure): - (JSC::JSGlobalObject::GlobalPropertyInfo::GlobalPropertyInfo): - (JSC::asGlobalObject): (JSC::Structure::prototypeForLookup): * runtime/JSGlobalObjectFunctions.cpp: - (JSC::encode): - (JSC::decode): - (JSC::globalFuncEval): (JSC::globalFuncParseInt): - (JSC::globalFuncParseFloat): - (JSC::globalFuncIsNaN): - (JSC::globalFuncIsFinite): - (JSC::globalFuncDecodeURI): - (JSC::globalFuncDecodeURIComponent): - (JSC::globalFuncEncodeURI): - (JSC::globalFuncEncodeURIComponent): - (JSC::globalFuncEscape): - (JSC::globalFuncUnescape): - (JSC::globalFuncJSCPrint): - * runtime/JSGlobalObjectFunctions.h: - * runtime/JSImmediate.cpp: - (JSC::JSImmediate::toThisObject): - (JSC::JSImmediate::toObject): - (JSC::JSImmediate::prototype): - (JSC::JSImmediate::toString): * runtime/JSImmediate.h: - (JSC::JSImmediate::isImmediate): - (JSC::JSImmediate::isNumber): - (JSC::JSImmediate::isPositiveNumber): - (JSC::JSImmediate::isBoolean): - (JSC::JSImmediate::isUndefinedOrNull): - (JSC::JSImmediate::isNegative): - (JSC::JSImmediate::isEitherImmediate): - (JSC::JSImmediate::isAnyImmediate): - (JSC::JSImmediate::areBothImmediate): - (JSC::JSImmediate::areBothImmediateNumbers): - (JSC::JSImmediate::andImmediateNumbers): - (JSC::JSImmediate::xorImmediateNumbers): - (JSC::JSImmediate::orImmediateNumbers): - (JSC::JSImmediate::rightShiftImmediateNumbers): - (JSC::JSImmediate::canDoFastAdditiveOperations): - (JSC::JSImmediate::addImmediateNumbers): - (JSC::JSImmediate::subImmediateNumbers): - (JSC::JSImmediate::incImmediateNumber): - (JSC::JSImmediate::decImmediateNumber): - (JSC::JSImmediate::makeValue): - (JSC::JSImmediate::makeInt): - (JSC::JSImmediate::makeBool): - (JSC::JSImmediate::makeUndefined): - (JSC::JSImmediate::makeNull): - (JSC::JSImmediate::intValue): - (JSC::JSImmediate::uintValue): - (JSC::JSImmediate::boolValue): - (JSC::JSImmediate::rawValue): - (JSC::JSImmediate::trueImmediate): - (JSC::JSImmediate::falseImmediate): - (JSC::JSImmediate::undefinedImmediate): - (JSC::JSImmediate::nullImmediate): - (JSC::JSImmediate::zeroImmediate): - (JSC::JSImmediate::oneImmediate): - (JSC::JSImmediate::impossibleValue): - (JSC::JSImmediate::toBoolean): - (JSC::JSImmediate::getTruncatedUInt32): - (JSC::JSImmediate::from): - (JSC::JSImmediate::getTruncatedInt32): - (JSC::JSImmediate::toDouble): - (JSC::JSImmediate::getUInt32): - (JSC::jsNull): - (JSC::jsBoolean): - (JSC::jsUndefined): - (JSC::JSValue::isUndefined): - (JSC::JSValue::isNull): - (JSC::JSValue::isUndefinedOrNull): - (JSC::JSValue::isBoolean): - (JSC::JSValue::getBoolean): - (JSC::JSValue::toInt32): - (JSC::JSValue::toUInt32): - (JSC::toInt32): - (JSC::toUInt32): - * runtime/JSNotAnObject.cpp: - (JSC::JSNotAnObject::toPrimitive): - (JSC::JSNotAnObject::getPrimitiveNumber): - (JSC::JSNotAnObject::put): - * runtime/JSNotAnObject.h: - (JSC::JSNotAnObject::createStructure): - * runtime/JSNumberCell.cpp: - (JSC::JSNumberCell::toPrimitive): - (JSC::JSNumberCell::getPrimitiveNumber): - (JSC::JSNumberCell::getJSNumber): - (JSC::jsNumberCell): - (JSC::jsNaN): - * runtime/JSNumberCell.h: - (JSC::JSNumberCell::createStructure): - (JSC::asNumberCell): - (JSC::jsNumber): - (JSC::JSValue::toJSNumber): - * runtime/JSObject.cpp: - (JSC::JSObject::mark): - (JSC::JSObject::put): - (JSC::JSObject::putWithAttributes): - (JSC::callDefaultValueFunction): - (JSC::JSObject::getPrimitiveNumber): - (JSC::JSObject::defaultValue): - (JSC::JSObject::defineGetter): - (JSC::JSObject::defineSetter): - (JSC::JSObject::lookupGetter): - (JSC::JSObject::lookupSetter): - (JSC::JSObject::hasInstance): - (JSC::JSObject::toNumber): - (JSC::JSObject::toString): - (JSC::JSObject::fillGetterPropertySlot): + * runtime/JSNumberCell.cpp: Removed. + * runtime/JSNumberCell.h: Removed. * runtime/JSObject.h: - (JSC::JSObject::getDirect): - (JSC::JSObject::getDirectLocation): - (JSC::JSObject::offsetForLocation): - (JSC::JSObject::locationForOffset): - (JSC::JSObject::getDirectOffset): - (JSC::JSObject::putDirectOffset): - (JSC::JSObject::createStructure): - (JSC::asObject): - (JSC::JSObject::prototype): - (JSC::JSObject::setPrototype): - (JSC::JSObject::inlineGetOwnPropertySlot): - (JSC::JSObject::getOwnPropertySlotForWrite): - (JSC::JSObject::getPropertySlot): - (JSC::JSObject::get): - (JSC::JSObject::putDirect): - (JSC::JSObject::putDirectWithoutTransition): - (JSC::JSObject::toPrimitive): (JSC::JSValue::get): (JSC::JSValue::put): - (JSC::JSObject::allocatePropertyStorageInline): - * runtime/JSPropertyNameIterator.cpp: - (JSC::JSPropertyNameIterator::toPrimitive): - (JSC::JSPropertyNameIterator::getPrimitiveNumber): - * runtime/JSPropertyNameIterator.h: - (JSC::JSPropertyNameIterator::create): - (JSC::JSPropertyNameIterator::next): - * runtime/JSStaticScopeObject.cpp: - (JSC::JSStaticScopeObject::put): - (JSC::JSStaticScopeObject::putWithAttributes): - * runtime/JSStaticScopeObject.h: - (JSC::JSStaticScopeObject::JSStaticScopeObject): - (JSC::JSStaticScopeObject::createStructure): - * runtime/JSString.cpp: - (JSC::JSString::toPrimitive): - (JSC::JSString::getPrimitiveNumber): - (JSC::JSString::getOwnPropertySlot): * runtime/JSString.h: - (JSC::JSString::createStructure): - (JSC::asString): + (JSC::JSValue::toThisJSString): + * runtime/JSValue.cpp: + (JSC::JSValue::toInteger): + (JSC::JSValue::toIntegerPreserveNaN): + (JSC::JSValue::toObjectSlowCase): + (JSC::JSValue::toThisObjectSlowCase): + (JSC::JSValue::synthesizeObject): + (JSC::JSValue::synthesizePrototype): + (JSC::JSValue::description): + (JSC::nonInlineNaN): * runtime/JSValue.h: - (JSC::JSValuePtr::makeImmediate): - (JSC::JSValuePtr::immediateValue): - (JSC::JSValuePtr::JSValuePtr): - (JSC::JSValuePtr::operator->): - (JSC::JSValuePtr::hasValue): - (JSC::JSValuePtr::operator==): - (JSC::JSValuePtr::operator!=): - (JSC::JSValuePtr::encode): - (JSC::JSValuePtr::decode): - (JSC::JSValue::asValue): - (JSC::noValue): + (JSC::JSValue::): + (JSC::EncodedJSValueHashTraits::emptyValue): + (JSC::jsNaN): (JSC::operator==): (JSC::operator!=): - * runtime/JSVariableObject.h: - (JSC::JSVariableObject::symbolTablePut): - (JSC::JSVariableObject::symbolTablePutWithAttributes): - * runtime/JSWrapperObject.cpp: - (JSC::JSWrapperObject::mark): - * runtime/JSWrapperObject.h: - (JSC::JSWrapperObject::internalValue): - (JSC::JSWrapperObject::setInternalValue): - * runtime/Lookup.cpp: - (JSC::setUpStaticFunctionSlot): - * runtime/Lookup.h: - (JSC::lookupPut): - * runtime/MathObject.cpp: - (JSC::mathProtoFuncAbs): - (JSC::mathProtoFuncACos): - (JSC::mathProtoFuncASin): - (JSC::mathProtoFuncATan): - (JSC::mathProtoFuncATan2): - (JSC::mathProtoFuncCeil): - (JSC::mathProtoFuncCos): - (JSC::mathProtoFuncExp): - (JSC::mathProtoFuncFloor): - (JSC::mathProtoFuncLog): - (JSC::mathProtoFuncMax): - (JSC::mathProtoFuncMin): - (JSC::mathProtoFuncPow): - (JSC::mathProtoFuncRandom): - (JSC::mathProtoFuncRound): - (JSC::mathProtoFuncSin): - (JSC::mathProtoFuncSqrt): - (JSC::mathProtoFuncTan): - * runtime/MathObject.h: - (JSC::MathObject::createStructure): - * runtime/NativeErrorConstructor.cpp: - (JSC::callNativeErrorConstructor): - * runtime/NumberConstructor.cpp: - (JSC::numberConstructorNaNValue): - (JSC::numberConstructorNegInfinity): - (JSC::numberConstructorPosInfinity): - (JSC::numberConstructorMaxValue): - (JSC::numberConstructorMinValue): - (JSC::callNumberConstructor): - * runtime/NumberConstructor.h: - (JSC::NumberConstructor::createStructure): - * runtime/NumberObject.cpp: - (JSC::NumberObject::getJSNumber): - (JSC::constructNumberFromImmediateNumber): - * runtime/NumberObject.h: - * runtime/NumberPrototype.cpp: - (JSC::numberProtoFuncToString): - (JSC::numberProtoFuncToLocaleString): - (JSC::numberProtoFuncValueOf): - (JSC::numberProtoFuncToFixed): - (JSC::numberProtoFuncToExponential): - (JSC::numberProtoFuncToPrecision): - * runtime/ObjectConstructor.cpp: - (JSC::constructObject): - (JSC::callObjectConstructor): - * runtime/ObjectPrototype.cpp: - (JSC::objectProtoFuncValueOf): - (JSC::objectProtoFuncHasOwnProperty): - (JSC::objectProtoFuncIsPrototypeOf): - (JSC::objectProtoFuncDefineGetter): - (JSC::objectProtoFuncDefineSetter): - (JSC::objectProtoFuncLookupGetter): - (JSC::objectProtoFuncLookupSetter): - (JSC::objectProtoFuncPropertyIsEnumerable): - (JSC::objectProtoFuncToLocaleString): - (JSC::objectProtoFuncToString): - * runtime/ObjectPrototype.h: - * runtime/Operations.cpp: - (JSC::equal): - (JSC::equalSlowCase): - (JSC::strictEqual): - (JSC::strictEqualSlowCase): - (JSC::throwOutOfMemoryError): + (JSC::toInt32): + (JSC::toUInt32): + (JSC::JSValue::encode): + (JSC::JSValue::decode): + (JSC::JSValue::JSValue): + (JSC::JSValue::operator bool): + (JSC::JSValue::operator==): + (JSC::JSValue::operator!=): + (JSC::JSValue::isUndefined): + (JSC::JSValue::isNull): + (JSC::JSValue::isUndefinedOrNull): + (JSC::JSValue::isCell): + (JSC::JSValue::isInt32): + (JSC::JSValue::isUInt32): + (JSC::JSValue::isDouble): + (JSC::JSValue::isTrue): + (JSC::JSValue::isFalse): + (JSC::JSValue::tag): + (JSC::JSValue::asInt32): + (JSC::JSValue::asUInt32): + (JSC::JSValue::asDouble): + (JSC::JSValue::asCell): + (JSC::JSValue::isNumber): + (JSC::JSValue::isBoolean): + (JSC::JSValue::getBoolean): + (JSC::JSValue::uncheckedGetNumber): + (JSC::JSValue::toJSNumber): + (JSC::JSValue::getNumber): + (JSC::JSValue::toInt32): + (JSC::JSValue::toUInt32): * runtime/Operations.h: - (JSC::equalSlowCaseInline): - (JSC::strictEqualSlowCaseInline): - * runtime/PropertySlot.cpp: - (JSC::PropertySlot::functionGetter): + (JSC::JSValue::equal): + (JSC::JSValue::equalSlowCaseInline): + (JSC::JSValue::strictEqual): + (JSC::JSValue::strictEqualSlowCaseInline): + (JSC::jsLess): + (JSC::jsLessEq): + (JSC::jsAdd): * runtime/PropertySlot.h: - (JSC::PropertySlot::PropertySlot): - (JSC::PropertySlot::getValue): - (JSC::PropertySlot::putValue): - (JSC::PropertySlot::setValueSlot): - (JSC::PropertySlot::setValue): - (JSC::PropertySlot::setCustom): - (JSC::PropertySlot::setCustomIndex): - (JSC::PropertySlot::slotBase): - (JSC::PropertySlot::setBase): - (JSC::PropertySlot::): - * runtime/Protect.h: - (JSC::gcProtect): - (JSC::gcUnprotect): - (JSC::ProtectedPtr::ProtectedPtr): - (JSC::ProtectedPtr::operator JSValuePtr): - (JSC::ProtectedJSValuePtr::ProtectedJSValuePtr): - (JSC::ProtectedJSValuePtr::get): - (JSC::ProtectedJSValuePtr::operator JSValuePtr): - (JSC::ProtectedJSValuePtr::operator->): - (JSC::::ProtectedPtr): - (JSC::::~ProtectedPtr): - (JSC::::operator): - (JSC::ProtectedJSValuePtr::~ProtectedJSValuePtr): - (JSC::ProtectedJSValuePtr::operator=): - (JSC::operator==): - (JSC::operator!=): - * runtime/RegExpConstructor.cpp: - (JSC::RegExpConstructor::getBackref): - (JSC::RegExpConstructor::getLastParen): - (JSC::RegExpConstructor::getLeftContext): - (JSC::RegExpConstructor::getRightContext): - (JSC::regExpConstructorDollar1): - (JSC::regExpConstructorDollar2): - (JSC::regExpConstructorDollar3): - (JSC::regExpConstructorDollar4): - (JSC::regExpConstructorDollar5): - (JSC::regExpConstructorDollar6): - (JSC::regExpConstructorDollar7): - (JSC::regExpConstructorDollar8): - (JSC::regExpConstructorDollar9): - (JSC::regExpConstructorInput): - (JSC::regExpConstructorMultiline): - (JSC::regExpConstructorLastMatch): - (JSC::regExpConstructorLastParen): - (JSC::regExpConstructorLeftContext): - (JSC::regExpConstructorRightContext): - (JSC::RegExpConstructor::put): - (JSC::setRegExpConstructorInput): - (JSC::setRegExpConstructorMultiline): - (JSC::constructRegExp): - (JSC::callRegExpConstructor): - * runtime/RegExpConstructor.h: - (JSC::RegExpConstructor::createStructure): - (JSC::asRegExpConstructor): - * runtime/RegExpMatchesArray.h: - (JSC::RegExpMatchesArray::put): - * runtime/RegExpObject.cpp: - (JSC::regExpObjectGlobal): - (JSC::regExpObjectIgnoreCase): - (JSC::regExpObjectMultiline): - (JSC::regExpObjectSource): - (JSC::regExpObjectLastIndex): - (JSC::RegExpObject::put): - (JSC::setRegExpObjectLastIndex): - (JSC::RegExpObject::test): - (JSC::RegExpObject::exec): - (JSC::callRegExpObject): - * runtime/RegExpObject.h: - (JSC::RegExpObject::createStructure): - (JSC::asRegExpObject): - * runtime/RegExpPrototype.cpp: - (JSC::regExpProtoFuncTest): - (JSC::regExpProtoFuncExec): - (JSC::regExpProtoFuncCompile): - (JSC::regExpProtoFuncToString): - * runtime/StringConstructor.cpp: - (JSC::stringFromCharCodeSlowCase): - (JSC::stringFromCharCode): - (JSC::callStringConstructor): - * runtime/StringObject.cpp: - (JSC::StringObject::put): - * runtime/StringObject.h: - (JSC::StringObject::createStructure): - (JSC::asStringObject): - * runtime/StringObjectThatMasqueradesAsUndefined.h: - (JSC::StringObjectThatMasqueradesAsUndefined::createStructure): * runtime/StringPrototype.cpp: - (JSC::stringProtoFuncReplace): - (JSC::stringProtoFuncToString): (JSC::stringProtoFuncCharAt): (JSC::stringProtoFuncCharCodeAt): - (JSC::stringProtoFuncConcat): (JSC::stringProtoFuncIndexOf): - (JSC::stringProtoFuncLastIndexOf): - (JSC::stringProtoFuncMatch): - (JSC::stringProtoFuncSearch): - (JSC::stringProtoFuncSlice): - (JSC::stringProtoFuncSplit): - (JSC::stringProtoFuncSubstr): - (JSC::stringProtoFuncSubstring): - (JSC::stringProtoFuncToLowerCase): - (JSC::stringProtoFuncToUpperCase): - (JSC::stringProtoFuncLocaleCompare): - (JSC::stringProtoFuncBig): - (JSC::stringProtoFuncSmall): - (JSC::stringProtoFuncBlink): - (JSC::stringProtoFuncBold): - (JSC::stringProtoFuncFixed): - (JSC::stringProtoFuncItalics): - (JSC::stringProtoFuncStrike): - (JSC::stringProtoFuncSub): - (JSC::stringProtoFuncSup): - (JSC::stringProtoFuncFontcolor): - (JSC::stringProtoFuncFontsize): - (JSC::stringProtoFuncAnchor): - (JSC::stringProtoFuncLink): - * runtime/Structure.cpp: - (JSC::Structure::Structure): - (JSC::Structure::changePrototypeTransition): - (JSC::Structure::createCachedPrototypeChain): - * runtime/Structure.h: - (JSC::Structure::create): - (JSC::Structure::setPrototypeWithoutTransition): - (JSC::Structure::storedPrototype): - -2009-01-06 Oliver Hunt <oliver@apple.com> - - Reviewed by Cameron Zwarich. - - <https://bugs.webkit.org/show_bug.cgi?id=23085> [jsfunfuzz] Over released ScopeChainNode - <rdar://problem/6474110> - - So this delightful bug was caused by our unwind code using a ScopeChain to perform - the unwind. The ScopeChain would ref the initial top of the scope chain, then deref - the resultant top of scope chain, which is incorrect. - - This patch removes the dependency on ScopeChain for the unwind, and i've filed - <https://bugs.webkit.org/show_bug.cgi?id=23144> to look into the unintuitive - ScopeChain behaviour. - - * interpreter/Interpreter.cpp: - (JSC::Interpreter::throwException): - -2009-01-06 Adam Roben <aroben@apple.com> - - Hopeful Windows crash-on-launch fix - - * wtf/Platform.h: Force a world rebuild by touching this file. - -2009-01-06 Holger Hans Peter Freyther <zecke@selfish.org> - - Reviewed by NOBODY (Build fix). - - * GNUmakefile.am:Add ByteArray.cpp too - -2009-01-06 Holger Hans Peter Freyther <zecke@selfish.org> - - Reviewed by NOBODY (Speculative build fix). - - AllInOneFile.cpp does not include the JSByteArray.cpp include it... - - * GNUmakefile.am: - -2009-01-05 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (Build fix). - - Fix Wx build - - * JavaScriptCoreSources.bkl: - -2009-01-05 Oliver Hunt <oliver@apple.com> - - Windows build fixes - - Rubber-stamped by Alice Liu. - - * interpreter/Interpreter.cpp: - (JSC::Interpreter::Interpreter): - * runtime/ByteArray.cpp: - (JSC::ByteArray::create): - * runtime/ByteArray.h: + * wtf/Platform.h: -2009-01-05 Oliver Hunt <oliver@apple.com> +=== Start merge of nitro-extreme branch 2009-07-30 === - Reviewed by Gavin Barraclough. +2009-07-29 Laszlo Gombos <laszlo.1.gombos@nokia.com> - CanvasPixelArray performance is too slow - <https://bugs.webkit.org/show_bug.cgi?id=23123> - - The fix to this is to devirtualise get and put in a manner similar to - JSString and JSArray. To do this I've added a ByteArray implementation - and JSByteArray wrapper to JSC. We can then do vptr comparisons to - devirtualise the calls. + Reviewed by George Staikos. - This devirtualisation improves performance by 1.5-2x in my somewhat ad - hoc tests. + Resolve class/struct mixup in forward declarations + https://bugs.webkit.org/show_bug.cgi?id=27708 - * GNUmakefile.am: - * JavaScriptCore.exp: - * JavaScriptCore.pri: - * JavaScriptCore.scons: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * interpreter/Interpreter.cpp: - (JSC::Interpreter::Interpreter): - (JSC::Interpreter::privateExecute): - (JSC::Interpreter::cti_op_get_by_val): - (JSC::Interpreter::cti_op_put_by_val): + * API/JSClassRef.h: + * bytecode/SamplingTool.h: * interpreter/Interpreter.h: - (JSC::Interpreter::isJSByteArray): - * runtime/ByteArray.cpp: Added. - (JSC::ByteArray::create): - * runtime/ByteArray.h: Added. - (JSC::ByteArray::length): - (JSC::ByteArray::set): - (JSC::ByteArray::get): - (JSC::ByteArray::data): - (JSC::ByteArray::ByteArray): - * runtime/JSByteArray.cpp: Added. - (JSC::): - (JSC::JSByteArray::JSByteArray): - (JSC::JSByteArray::createStructure): - (JSC::JSByteArray::getOwnPropertySlot): - (JSC::JSByteArray::put): - (JSC::JSByteArray::getPropertyNames): - * runtime/JSByteArray.h: Added. - (JSC::JSByteArray::canAccessIndex): - (JSC::JSByteArray::getIndex): - (JSC::JSByteArray::setIndex): - (JSC::JSByteArray::classInfo): - (JSC::JSByteArray::length): - (JSC::JSByteArray::): - (JSC::JSByteArray::JSByteArray): - (JSC::asByteArray): - -2009-01-05 Alexey Proskuryakov <ap@webkit.org> - - Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=23073 - <rdar://problem/6471129> Workers crash on Windows Release builds - - * wtf/ThreadSpecific.h: - (WTF::ThreadSpecific::destroy): Changed to clear the pointer only after data object - destruction is finished - otherwise, WebCore::ThreadGlobalData destructor was re-creating - the object in order to access atomic string table. - (WTF::ThreadSpecific::operator T*): Symmetrically, set up the per-thread pointer before - data constructor is called. - - * wtf/ThreadingWin.cpp: (WTF::wtfThreadEntryPoint): Remove a Windows-only hack to finalize - a thread - pthreadVC2 is a DLL, so it gets thread detached messages, and cleans up thread - specific data automatically. Besides, this code wasn't even compiled in for some time now. + * jit/JIT.h: + * profiler/ProfileGenerator.h: + * profiler/Profiler.h: + * runtime/ClassInfo.h: + * runtime/ExceptionHelpers.h: + * runtime/JSByteArray.h: + * runtime/JSCell.h: + * runtime/JSFunction.h: + * runtime/JSGlobalData.h: + * runtime/JSObject.h: + * runtime/JSString.h: -2009-01-05 Alexey Proskuryakov <ap@webkit.org> +2009-07-28 Ada Chan <adachan@apple.com> Reviewed by Darin Adler. - https://bugs.webkit.org/show_bug.cgi?id=23115 - Create a version of ASSERT for use with otherwise unused variables + https://bugs.webkit.org/show_bug.cgi?id=27236 + - Implement TCMalloc_SystemRelease and TCMalloc_SystemCommit for Windows. + - Use a background thread to periodically scavenge memory to release back to the system. - * wtf/Assertions.h: Added ASSERT_UNUSED. - - * jit/ExecutableAllocatorPosix.cpp: - (JSC::ExecutablePool::systemRelease): - * runtime/Collector.cpp: - (JSC::Heap::destroy): - (JSC::Heap::heapAllocate): - * runtime/JSNotAnObject.cpp: - (JSC::JSNotAnObject::toPrimitive): - (JSC::JSNotAnObject::getPrimitiveNumber): - (JSC::JSNotAnObject::toBoolean): - (JSC::JSNotAnObject::toNumber): - (JSC::JSNotAnObject::toString): - (JSC::JSNotAnObject::getOwnPropertySlot): - (JSC::JSNotAnObject::put): - (JSC::JSNotAnObject::deleteProperty): - (JSC::JSNotAnObject::getPropertyNames): + * wtf/FastMalloc.cpp: + (WTF::TCMalloc_PageHeap::init): + (WTF::TCMalloc_PageHeap::runScavengerThread): + (WTF::TCMalloc_PageHeap::scavenge): + (WTF::TCMalloc_PageHeap::shouldContinueScavenging): + (WTF::TCMalloc_PageHeap::New): + (WTF::TCMalloc_PageHeap::AllocLarge): + (WTF::TCMalloc_PageHeap::Delete): + (WTF::TCMalloc_PageHeap::GrowHeap): + (WTF::sleep): + (WTF::TCMalloc_PageHeap::scavengerThread): * wtf/TCSystemAlloc.cpp: (TCMalloc_SystemRelease): - Use it in some places that used other idioms for this purpose. - -2009-01-04 Alice Liu <alice.liu@apple.com> - - <rdar://problem/6341776> Merge m_transitionCount and m_offset in Structure. - - Reviewed by Darin Adler. - - * runtime/Structure.cpp: - (JSC::Structure::Structure): Remove m_transitionCount - (JSC::Structure::addPropertyTransitionToExistingStructure): No need to wait until after the assignment to offset to assert if it's notFound; move it up. - (JSC::Structure::addPropertyTransition): Use method for transitionCount instead of m_transitionCount. Remove line that maintains the m_transitionCount. - (JSC::Structure::changePrototypeTransition): Remove line that maintains the m_transitionCount. - (JSC::Structure::getterSetterTransition): Remove line that maintains the m_transitionCount. - * runtime/Structure.h: - Changed s_maxTransitionLength and m_offset from size_t to signed char. m_offset will never become greater than 64 - because the structure transitions to a dictionary at that time. - (JSC::Structure::transitionCount): method to replace the data member - -2009-01-04 Darin Adler <darin@apple.com> - - Reviewed by David Kilzer. - - Bug 15114: Provide compile-time assertions for sizeof(UChar), sizeof(DeprecatedChar), etc. - https://bugs.webkit.org/show_bug.cgi?id=15114 - - * wtf/unicode/Unicode.h: Assert size of UChar. There is no DeprecatedChar any more. - -2009-01-03 Sam Weinig <sam@webkit.org> - - Reviewed by Oliver Hunt. - - Change the pcVector from storing native code pointers to storing offsets - from the base pointer. This will allow us to generate the pcVector on demand - for exceptions. - - * bytecode/CodeBlock.h: - (JSC::PC::PC): - (JSC::getNativePCOffset): - (JSC::CodeBlock::getBytecodeIndex): - * jit/JIT.cpp: - (JSC::JIT::privateCompile): - -2009-01-02 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (Build fix). - - * runtime/ScopeChain.cpp: - -2009-01-02 Oliver Hunt <oliver@apple.com> - - Reviewed by Gavin Barraclough. - - [jsfunfuzz] unwind logic for exceptions in eval fails to account for dynamic scope external to the eval - https://bugs.webkit.org/show_bug.cgi?id=23078 - - This bug was caused by eval codeblocks being generated without accounting - for the depth of the scope chain they inherited. This meant that exception - handlers would understate their expected scope chain depth, which in turn - led to incorrectly removing nodes from the scope chain. - - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::BytecodeGenerator): - (JSC::BytecodeGenerator::emitCatch): - * bytecompiler/BytecodeGenerator.h: - * interpreter/Interpreter.cpp: - (JSC::depth): - * runtime/ScopeChain.cpp: - (JSC::ScopeChain::localDepth): - * runtime/ScopeChain.h: - (JSC::ScopeChainNode::deref): - (JSC::ScopeChainNode::ref): - -2009-01-02 David Smith <catfish.man@gmail.com> - - Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=22699 - Enable NodeList caching for getElementsByTagName - - * wtf/HashFunctions.h: Moved the definition of PHI here and renamed to stringHashingStartValue - -2009-01-02 David Kilzer <ddkilzer@apple.com> - - Attempt to fix Qt Linux build after r39553 - - * wtf/RandomNumberSeed.h: Include <sys/time.h> for gettimeofday(). - Include <sys/types.h> and <unistd.h> for getpid(). - -2009-01-02 David Kilzer <ddkilzer@apple.com> - - Bug 23081: These files are no longer part of the KDE libraries - - <https://bugs.webkit.org/show_bug.cgi?id=23081> - - Reviewed by Darin Adler. - - Removed "This file is part of the KDE libraries" comment from - source files. Added or updated Apple copyrights as well. - - * parser/Lexer.h: - * wtf/HashCountedSet.h: - * wtf/RetainPtr.h: - * wtf/VectorTraits.h: - -2009-01-02 David Kilzer <ddkilzer@apple.com> - - Bug 23080: Remove last vestiges of KJS references - - <https://bugs.webkit.org/show_bug.cgi?id=23080> - - Reviewed by Darin Adler. - - Also updated Apple copyright statements. - - * DerivedSources.make: Changed bison "kjsyy" prefix to "jscyy". - * GNUmakefile.am: Ditto. - * JavaScriptCore.pri: Ditto. Also changed KJSBISON to JSCBISON - and kjsbison to jscbison. - - * JavaScriptCoreSources.bkl: Changed JSCORE_KJS_SOURCES to - JSCORE_JSC_SOURCES. - * jscore.bkl: Ditto. - - * create_hash_table: Updated copyright and removed old comment. - - * parser/Grammar.y: Changed "kjsyy" prefix to "jscyy" prefix. - * parser/Lexer.cpp: Ditto. Also changed KJS_DEBUG_LEX to - JSC_DEBUG_LEX. - (jscyylex): - (JSC::Lexer::lex): - * parser/Parser.cpp: Ditto. - (JSC::Parser::parse): - - * pcre/dftables: Changed "kjs_pcre_" prefix to "jsc_pcre_". - * pcre/pcre_compile.cpp: Ditto. - (getOthercaseRange): - (encodeUTF8): - (compileBranch): - (calculateCompiledPatternLength): - * pcre/pcre_exec.cpp: Ditto. - (matchRef): - (getUTF8CharAndIncrementLength): - (match): - * pcre/pcre_internal.h: Ditto. - (toLowerCase): - (flipCase): - (classBitmapForChar): - (charTypeForChar): - * pcre/pcre_tables.cpp: Ditto. - * pcre/pcre_ucp_searchfuncs.cpp: Ditto. - (jsc_pcre_ucp_othercase): - * pcre/pcre_xclass.cpp: Ditto. - (getUTF8CharAndAdvancePointer): - (jsc_pcre_xclass): - - * runtime/Collector.h: Updated header guards using the - clean-header-guards script. - * runtime/CollectorHeapIterator.h: Added missing header guard. - * runtime/Identifier.h: Updated header guards. - * runtime/JSFunction.h: Fixed end-of-namespace comment. - - * runtime/JSGlobalObject.cpp: - (JSC::JSGlobalObject::reset): Renamed "kjsprint" debug function - to "jscprint". Changed implementation method from - globalFuncKJSPrint() to globalFuncJSCPrint(). - * runtime/JSGlobalObjectFunctions.cpp: - (JSC::globalFuncJSCPrint): Renamed from globalFuncKJSPrint(). - * runtime/JSGlobalObjectFunctions.h: Ditto. - - * runtime/JSImmediate.h: Updated header guards. - * runtime/JSLock.h: Ditto. - * runtime/JSType.h: Ditto. - * runtime/JSWrapperObject.h: Ditto. - * runtime/Lookup.h: Ditto. - * runtime/Operations.h: Ditto. - * runtime/Protect.h: Ditto. - * runtime/RegExp.h: Ditto. - * runtime/UString.h: Ditto. - - * tests/mozilla/js1_5/Array/regress-157652.js: Changed "KJS" - reference in comment to "JSC". - - * wrec/CharacterClassConstructor.cpp: Change "kjs_pcre_" function - prefixes to "jsc_pcre_". - (JSC::WREC::CharacterClassConstructor::put): - (JSC::WREC::CharacterClassConstructor::flush): - - * wtf/unicode/Unicode.h: Change "KJS_" header guard to "WTF_". - * wtf/unicode/icu/UnicodeIcu.h: Ditto. - * wtf/unicode/qt4/UnicodeQt4.h: Ditto. - -2009-01-02 Oliver Hunt <oliver@apple.com> - - Reviewed by Maciej Stachowiak. + (TCMalloc_SystemCommit): + * wtf/TCSystemAlloc.h: - Make randomNumber generate 2^53 values instead of 2^32 (or 2^31 for rand() platforms) +2009-07-28 Xan Lopez <xlopez@igalia.com> - * wtf/RandomNumber.cpp: - (WTF::randomNumber): + Add new files, fixes distcheck. -2009-01-02 David Kilzer <ddkilzer@apple.com> + * GNUmakefile.am: - Remove declaration for JSC::Identifier::initializeIdentifierThreading() +2009-07-28 Csaba Osztrogonac <oszi@inf.u-szeged.hu> - Reviewed by Alexey Proskuryakov. + Reviewed by Simon Hausmann. - * runtime/Identifier.h: - (JSC::Identifier::initializeIdentifierThreading): Removed - declaration since the implementation was removed in r34412. + [Qt] Determining whether to use JIT or interpreter + moved from JavaScriptCore.pri to Platform.h -2009-01-01 Darin Adler <darin@apple.com> + * JavaScriptCore.pri: + * wtf/Platform.h: - Reviewed by Oliver Hunt. +2009-07-27 Brian Weinstein <bweinstein@apple.com> - String.replace does not support $& replacement metacharacter when search term is not a RegExp - <https://bugs.webkit.org/show_bug.cgi?id=21431> - <rdar://problem/6274993> + Fix of misuse of sort command. - Test: fast/js/string-replace-3.html + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - * runtime/StringPrototype.cpp: - (JSC::substituteBackreferences): Added a null check here so we won't try to handle $$-$9 - backreferences when the search term is a string, not a RegExp. Added a check for 0 so we - won't try to handle $0 or $00 as a backreference. - (JSC::stringProtoFuncReplace): Added a call to substituteBackreferences. +2009-07-27 Brian Weinstein <bweinstein@apple.com> -2009-01-01 Gavin Barraclough <barraclough@apple.com> + Build fix for Windows. - Reviewed by Darin Adler. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - Allow 32-bit integers to be stored in JSImmediates, on x64-bit. - Presently the top 32-bits of a 64-bit JSImmediate serve as a sign extension of a 31-bit - int stored in the low word (shifted left by one, to make room for a tag). In the new - format, the top 31-bits serve as a sign extension of a 32-bit int, still shifted left by - one. +2009-07-27 Gavin Barraclough <barraclough@apple.com> - The new behavior is enabled using a flag in Platform.h, 'WTF_USE_ALTERNATE_JSIMMEDIATE'. - When this is set the constants defining the range of ints allowed to be stored as - JSImmediate values is extended. The code in JSImmediate.h can safely operate on either - format. This patch updates the JIT so that it can also operate with the new format. + Rubber stamped by Oliver Hunt. - ~2% progression on x86-64, with & without the JIT, on sunspider & v8 tests. + Fix tyop in JIT, renamed preverveReturnAddressAfterCall -> preserveReturnAddressAfterCall. - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::addPtr): - (JSC::MacroAssembler::orPtr): - (JSC::MacroAssembler::or32): - (JSC::MacroAssembler::rshiftPtr): - (JSC::MacroAssembler::rshift32): - (JSC::MacroAssembler::subPtr): - (JSC::MacroAssembler::xorPtr): - (JSC::MacroAssembler::xor32): - (JSC::MacroAssembler::move): - (JSC::MacroAssembler::compareImm64ForBranch): - (JSC::MacroAssembler::compareImm64ForBranchEquality): - (JSC::MacroAssembler::jePtr): - (JSC::MacroAssembler::jgePtr): - (JSC::MacroAssembler::jlPtr): - (JSC::MacroAssembler::jlePtr): - (JSC::MacroAssembler::jnePtr): - (JSC::MacroAssembler::jnzSubPtr): - (JSC::MacroAssembler::joAddPtr): - (JSC::MacroAssembler::jzSubPtr): - * assembler/X86Assembler.h: - (JSC::X86Assembler::addq_rr): - (JSC::X86Assembler::orq_ir): - (JSC::X86Assembler::subq_ir): - (JSC::X86Assembler::xorq_rr): - (JSC::X86Assembler::sarq_CLr): - (JSC::X86Assembler::sarq_i8r): - (JSC::X86Assembler::cmpq_ir): * jit/JIT.cpp: - (JSC::JIT::compileOpStrictEq): - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): + (JSC::JIT::privateCompile): (JSC::JIT::privateCompileCTIMachineTrampolines): * jit/JIT.h: - * jit/JITArithmetic.cpp: - (JSC::JIT::compileFastArith_op_lshift): - (JSC::JIT::compileFastArithSlow_op_lshift): - (JSC::JIT::compileFastArith_op_rshift): - (JSC::JIT::compileFastArithSlow_op_rshift): - (JSC::JIT::compileFastArith_op_bitand): - (JSC::JIT::compileFastArithSlow_op_bitand): - (JSC::JIT::compileFastArith_op_mod): - (JSC::JIT::compileFastArithSlow_op_mod): - (JSC::JIT::compileFastArith_op_add): - (JSC::JIT::compileFastArithSlow_op_add): - (JSC::JIT::compileFastArith_op_mul): - (JSC::JIT::compileFastArithSlow_op_mul): - (JSC::JIT::compileFastArith_op_post_inc): - (JSC::JIT::compileFastArithSlow_op_post_inc): - (JSC::JIT::compileFastArith_op_post_dec): - (JSC::JIT::compileFastArithSlow_op_post_dec): - (JSC::JIT::compileFastArith_op_pre_inc): - (JSC::JIT::compileFastArithSlow_op_pre_inc): - (JSC::JIT::compileFastArith_op_pre_dec): - (JSC::JIT::compileFastArithSlow_op_pre_dec): - (JSC::JIT::compileBinaryArithOp): * jit/JITInlineMethods.h: - (JSC::JIT::getConstantOperand): - (JSC::JIT::getConstantOperandImmediateInt): - (JSC::JIT::isOperandConstantImmediateInt): - (JSC::JIT::isOperandConstant31BitImmediateInt): - (JSC::JIT::emitFastArithDeTagImmediate): - (JSC::JIT::emitFastArithDeTagImmediateJumpIfZero): - (JSC::JIT::emitFastArithReTagImmediate): - (JSC::JIT::emitFastArithImmToInt): - (JSC::JIT::emitFastArithIntToImmNoCheck): - * runtime/JSImmediate.h: - (JSC::JSImmediate::isPositiveNumber): - (JSC::JSImmediate::isNegative): - (JSC::JSImmediate::rightShiftImmediateNumbers): - (JSC::JSImmediate::canDoFastAdditiveOperations): - (JSC::JSImmediate::makeValue): - (JSC::JSImmediate::makeInt): - (JSC::JSImmediate::makeBool): - (JSC::JSImmediate::intValue): - (JSC::JSImmediate::rawValue): - (JSC::JSImmediate::toBoolean): - (JSC::JSImmediate::from): - * wtf/Platform.h: - -2008-12-31 Oliver Hunt <oliver@apple.com> - - Reviewed by Cameron Zwarich. - - [jsfunfuzz] Assertion + incorrect behaviour with dynamically created local variable in a catch block - <https://bugs.webkit.org/show_bug.cgi?id=23063> - - Eval inside a catch block attempts to use the catch block's static scope in - an unsafe way by attempting to add new properties to the scope. This patch - fixes this issue simply by preventing the catch block from using a static - scope if it contains an eval. - - * parser/Grammar.y: - * parser/Nodes.cpp: - (JSC::TryNode::emitBytecode): - * parser/Nodes.h: - (JSC::TryNode::): - -2008-12-31 Oliver Hunt <oliver@apple.com> - - Reviewed by Gavin Barraclough. - - [jsfunfuzz] Computed exception offset wrong when first instruction is attempt to resolve deleted eval - <https://bugs.webkit.org/show_bug.cgi?id=23062> - - This was caused by the expression information for the initial resolve of - eval not being emitted. If this resolve was the first instruction that - could throw an exception the information search would fail leading to an - assertion failure. If it was not the first throwable opcode the wrong - expression information would used. + (JSC::JIT::preserveReturnAddressAfterCall): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::privateCompilePutByIdTransition): - Fix is simply to emit the expression info. +2009-07-27 Alexey Proskuryakov <ap@webkit.org> - * parser/Nodes.cpp: - (JSC::EvalFunctionCallNode::emitBytecode): + Gtk build fix. -2008-12-31 Cameron Zwarich <cwzwarich@uwaterloo.ca> + * runtime/JSLock.cpp: (JSC::JSLock::JSLock): Fix "no threading" case. - Reviewed by Oliver Hunt. +2009-07-27 Alexey Proskuryakov <ap@webkit.org> - Bug 23054: Caching of global lookups occurs even when the global object has become a dictionary - <https://bugs.webkit.org/show_bug.cgi?id=23054> - <rdar://problem/6469905> + Release build fix. - * interpreter/Interpreter.cpp: - (JSC::Interpreter::resolveGlobal): Do not cache lookup if the global - object has transitioned to a dictionary. - (JSC::Interpreter::cti_op_resolve_global): Do not cache lookup if the - global object has transitioned to a dictionary. + * runtime/JSLock.h: (JSC::JSLock::~JSLock): -2008-12-30 Oliver Hunt <oliver@apple.com> +2009-07-27 Alexey Proskuryakov <ap@webkit.org> Reviewed by Darin Adler. - <https://bugs.webkit.org/show_bug.cgi?id=23049> [jsfunfuzz] With blocks do not correctly protect their scope object - <rdar://problem/6469742> Crash in JSC::TypeInfo::hasStandardGetOwnPropertySlot() running jsfunfuzz - - The problem that caused this was that with nodes were not correctly protecting - the final object that was placed in the scope chain. We correct this by forcing - the use of a temporary register (which stops us relying on a local register - protecting the scope) and changing the behaviour of op_push_scope so that it - will store the final scope object. - - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::emitPushScope): - * interpreter/Interpreter.cpp: - (JSC::Interpreter::privateExecute): - (JSC::Interpreter::cti_op_push_scope): - * interpreter/Interpreter.h: - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - * parser/Nodes.cpp: - (JSC::WithNode::emitBytecode): - -2008-12-30 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Sam Weinig. - - Bug 23037: Parsing and reparsing disagree on automatic semicolon insertion - <https://bugs.webkit.org/show_bug.cgi?id=23037> - <rdar://problem/6467124> - - Parsing and reparsing disagree about automatic semicolon insertion, so that a - function like - - function() { a = 1, } - - is parsed as being syntactically valid but gets a syntax error upon reparsing. - This leads to an assertion failure in Parser::reparse(). It is not that big of - an issue in practice, because in a Release build such a function will return - 'undefined' when called. - - In this case, we are not following the spec and it should be a syntax error. - However, unless there is a newline separating the ',' and the '}', WebKit would - not treat it as a syntax error in the past either. It would be a bit of work to - make the automatic semicolon insertion match the spec exactly, so this patch - changes it to match our past behaviour. - - The problem is that even during reparsing, the Lexer adds a semicolon at the - end of the input, which confuses allowAutomaticSemicolon(), because it is - expecting either a '}', the end of input, or a terminator like a newline. + https://bugs.webkit.org/show_bug.cgi?id=27735 + Give a helpful name to JSLock constructor argument - * parser/Lexer.cpp: - (JSC::Lexer::Lexer): Initialize m_isReparsing to false. - (JSC::Lexer::lex): Do not perform automatic semicolon insertion in the Lexer if - we are in the middle of reparsing. - (JSC::Lexer::clear): Set m_isReparsing to false. - * parser/Lexer.h: - (JSC::Lexer::setIsReparsing): Added. - * parser/Parser.cpp: - (JSC::Parser::reparse): Call Lexer::setIsReparsing() to notify the Lexer of - reparsing. - -2008-12-29 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (Build fix). - - Yet another attempt to fix Tiger. - - * wtf/RandomNumber.cpp: - (WTF::randomNumber): - -2008-12-29 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (Build fix). - - Tiger build fix (correct this time) - - * wtf/RandomNumber.cpp: - -2008-12-29 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Rubber-stamped by Alexey Proskuryakov. + * API/JSBase.cpp: + (JSGarbageCollect): + * API/JSContextRef.cpp: + * API/JSObjectRef.cpp: + (JSPropertyNameArrayRelease): + (JSPropertyNameAccumulatorAddName): + * JavaScriptCore.exp: + * jsc.cpp: + (functionGC): + (cleanupGlobalData): + (jscmain): + * runtime/Collector.cpp: + (JSC::Heap::destroy): + * runtime/JSLock.cpp: + (JSC::JSLock::JSLock): + (JSC::JSLock::lock): + (JSC::JSLock::unlock): + (JSC::JSLock::DropAllLocks::DropAllLocks): + (JSC::JSLock::DropAllLocks::~DropAllLocks): + * runtime/JSLock.h: + (JSC::): + (JSC::JSLock::JSLock): + (JSC::JSLock::~JSLock): - Revert r39509, because kjsyydebug is used in the generated code if YYDEBUG is 1. +2009-07-25 Zoltan Horvath <hzoltan@inf.u-szeged.hu> - * parser/Grammar.y: + Reviewed by Eric Seidel. -2008-12-29 Oliver Hunt <oliver@apple.com> + Allow custom memory allocation control for OpaqueJSPropertyNameArray struct + https://bugs.webkit.org/show_bug.cgi?id=27342 - Reviewed by NOBODY (Build fix). + Inherits OpaqueJSPropertyNameArray struct from FastAllocBase because it has been + instantiated by 'new' JavaScriptCore/API/JSObjectRef.cpp:473. - Tiger build fix. + * API/JSObjectRef.cpp: - * wtf/RandomNumber.cpp: +2009-07-24 Ada Chan <adachan@apple.com> -2008-12-29 Oliver Hunt <oliver@apple.com> + In preparation for https://bugs.webkit.org/show_bug.cgi?id=27236: + Remove TCMALLOC_TRACK_DECOMMITED_SPANS. We'll always track decommitted spans. + We have tested this and show it has little impact on performance. Reviewed by Mark Rowe. - <rdar://problem/6358108> Insecure randomness in Math.random() leads to user tracking - - Switch to arc4random on PLATFORM(DARWIN), this is ~1.5x slower than random(), but the - it is still so fast that there is no fathomable way it could be a bottleneck for anything. - - randomNumber is called in two places - * During form submission where it is called once per form - * Math.random in JSC. For this difference to show up you have to be looping on - a cached local copy of random, for a large (>10000) calls. - - No change in SunSpider. - - * wtf/RandomNumber.cpp: - (WTF::randomNumber): - * wtf/RandomNumberSeed.h: - (WTF::initializeRandomNumberGenerator): - -2008-12-29 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Rubber-stamped by Sam Weinig. - - Remove unused kjsyydebug #define. - - * parser/Grammar.y: - -2008-12-29 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Oliver Hunt and Sam Weinig. - - Bug 23029: REGRESSION (r39337): jsfunfuzz generates identical test files - <https://bugs.webkit.org/show_bug.cgi?id=23029> - <rdar://problem/6469185> - - The unification of random number generation in r39337 resulted in random() - being initialized on Darwin, but rand() actually being used. Fix this by - making randomNumber() use random() instead of rand() on Darwin. - - * wtf/RandomNumber.cpp: - (WTF::randomNumber): - -2008-12-29 Sam Weinig <sam@webkit.org> - - Fix buildbots. - - * runtime/Structure.cpp: - -2008-12-29 Sam Weinig <sam@webkit.org> + * wtf/FastMalloc.cpp: + (WTF::TCMalloc_PageHeap::New): + (WTF::TCMalloc_PageHeap::AllocLarge): + (WTF::propagateDecommittedState): + (WTF::mergeDecommittedStates): + (WTF::TCMalloc_PageHeap::Delete): + (WTF::TCMalloc_PageHeap::IncrementalScavenge): - Reviewed by Oliver Hunt. +2009-07-24 Csaba Osztrogonac <oszi@inf.u-szeged.hu> - Patch for https://bugs.webkit.org/show_bug.cgi?id=23026 - Move the deleted offsets vector into the PropertyMap + Reviewed by Darin Adler and Adam Barth. - Saves 3 words per Structure. + Build fix for x86 platforms. + https://bugs.webkit.org/show_bug.cgi?id=27602 - * runtime/PropertyMapHashTable.h: - * runtime/Structure.cpp: - (JSC::Structure::addPropertyTransition): - (JSC::Structure::changePrototypeTransition): - (JSC::Structure::getterSetterTransition): - (JSC::Structure::toDictionaryTransition): - (JSC::Structure::fromDictionaryTransition): - (JSC::Structure::copyPropertyTable): - (JSC::Structure::put): - (JSC::Structure::remove): - (JSC::Structure::rehashPropertyMapHashTable): - * runtime/Structure.h: - (JSC::Structure::propertyStorageSize): + * jit/JIT.cpp: -2008-12-29 Cameron Zwarich <cwzwarich@uwaterloo.ca> +2009-07-23 Kevin Ollivier <kevino@theolliviers.com> - Reviewed by Oliver Hunt. + wx build fix, adding missing header. - Change code using m_body.get() as a boolean to take advantage of the - implicit conversion of RefPtr to boolean. + * jit/JIT.cpp: - * runtime/JSFunction.cpp: - (JSC::JSFunction::~JSFunction): +2009-07-22 Yong Li <yong.li@torchmobile.com> -2008-12-28 Cameron Zwarich <cwzwarich@uwaterloo.ca> + Reviewed by George Staikos. - Reviewed by Oliver Hunt. + Add wince specific memory files into wtf/wince + https://bugs.webkit.org/show_bug.cgi?id=27550 - Bug 22840: REGRESSION (r38349): Gmail doesn't load with profiling enabled - <https://bugs.webkit.org/show_bug.cgi?id=22840> - <rdar://problem/6468077> + * wtf/wince/FastMallocWince.h: Added. + * wtf/wince/MemoryManager.cpp: Added. + * wtf/wince/MemoryManager.h: Added. - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::emitNewArray): Add an assertion that the range - of registers passed to op_new_array is sequential. - (JSC::BytecodeGenerator::emitCall): Correct the relocation of registers - when emitting profiler hooks so that registers aren't leaked. Also, add - an assertion that the 'this' register is always ref'd (because it is), - remove the needless protection of the 'this' register when relocating, - and add an assertion that the range of registers passed to op_call for - function call arguments is sequential. - (JSC::BytecodeGenerator::emitConstruct): Correct the relocation of - registers when emitting profiler hooks so that registers aren't leaked. - Also, add an assertion that the range of registers passed to op_construct - for function call arguments is sequential. - -2008-12-26 Mark Rowe <mrowe@apple.com> +2009-07-23 Norbert Leser <norbert.leser@nokia.com> - Reviewed by Alexey Proskuryakov. + Reviewed by Simon Hausmann. - <rdar://problem/6467376> Race condition in WTF::currentThread can lead to a thread using two different identifiers during its lifetime + Fix for missing mmap features in Symbian + https://bugs.webkit.org/show_bug.cgi?id=24540 - If a newly-created thread calls WTF::currentThread() before WTF::createThread calls establishIdentifierForPthreadHandle - then more than one identifier will be used for the same thread. We can avoid this by adding some extra synchronization - during thread creation that delays the execution of the thread function until the thread identifier has been set up, and - an assertion to catch this problem should it reappear in the future. + Fix, conditionally for PLATFORM(SYMBIAN), as an alternative + to missing support for the MAP_ANON property flag in mmap. + It utilizes Symbian specific memory allocation features. - * wtf/Threading.cpp: Added. - (WTF::NewThreadContext::NewThreadContext): - (WTF::threadEntryPoint): - (WTF::createThread): Add cross-platform createThread function that delays the execution of the thread function until - after the thread identifier has been set up. - * wtf/Threading.h: - * wtf/ThreadingGtk.cpp: - (WTF::establishIdentifierForThread): - (WTF::createThreadInternal): - * wtf/ThreadingNone.cpp: - (WTF::createThreadInternal): - * wtf/ThreadingPthreads.cpp: - (WTF::establishIdentifierForPthreadHandle): - (WTF::createThreadInternal): - * wtf/ThreadingQt.cpp: - (WTF::identifierByQthreadHandle): - (WTF::establishIdentifierForThread): - (WTF::createThreadInternal): - * wtf/ThreadingWin.cpp: - (WTF::storeThreadHandleByIdentifier): - (WTF::createThreadInternal): + * runtime/Collector.cpp - Add Threading.cpp to the build. +2009-07-22 Gavin Barraclough <barraclough@apple.com> - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.scons: - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: + Reviewed by Sam Weinig. -2008-12-26 Sam Weinig <sam@webkit.org> + With ENABLE(ASSEMBLER_WX_EXCLUSIVE), only change permissions once per repatch event. + ( https://bugs.webkit.org/show_bug.cgi?id=27564 ) - Reviewed by Alexey Proskuryakov. + Currently we change permissions forwards and backwards for each instruction modified, + instead we should only change permissions once per complete repatching event. - Remove unused method. + 2.5% progression running with ENABLE(ASSEMBLER_WX_EXCLUSIVE) enabled, + which recoups 1/3 of the penalty of running with this mode enabled. - * runtime/Structure.h: Remove mutableTypeInfo. + * assembler/ARMAssembler.cpp: + (JSC::ARMAssembler::linkBranch): + - Replace usage of MakeWritable with cacheFlush. + + * assembler/ARMAssembler.h: + (JSC::ARMAssembler::patchPointerInternal): + (JSC::ARMAssembler::repatchLoadPtrToLEA): + - Replace usage of MakeWritable with cacheFlush. -2008-12-22 Gavin Barraclough <barraclough@apple.com> + * assembler/ARMv7Assembler.h: + (JSC::ARMv7Assembler::relinkJump): + (JSC::ARMv7Assembler::relinkCall): + (JSC::ARMv7Assembler::repatchInt32): + (JSC::ARMv7Assembler::repatchPointer): + (JSC::ARMv7Assembler::repatchLoadPtrToLEA): + (JSC::ARMv7Assembler::setInt32): + - Replace usage of MakeWritable with cacheFlush. - Reviewed by Oliver Hunt. + * assembler/LinkBuffer.h: + (JSC::LinkBuffer::performFinalization): + - Make explicit call to cacheFlush. - Fix rounding / bounds / signed comparison bug in ExecutableAllocator. + * assembler/MacroAssemblerCodeRef.h: + (JSC::MacroAssemblerCodeRef::MacroAssemblerCodeRef): + - Make size always available. - ExecutableAllocator::alloc assumed that m_freePtr would be aligned. This was - not always true, since the first allocation from an additional pool would not - be rounded up. Subsequent allocations would be unaligned, and too much memory - could be erroneously allocated from the pool, when the size requested was - available, but the size rounded up to word granularity was not available in the - pool. This may result in the value of m_freePtr being greater than m_end. + * assembler/RepatchBuffer.h: + (JSC::RepatchBuffer::RepatchBuffer): + (JSC::RepatchBuffer::~RepatchBuffer): + - Add calls to MakeWritable & makeExecutable. - Under these circumstances, the unsigned check for space will always pass, - resulting in pointers to memory outside of the arena being returned, and - ultimately segfaulty goodness when attempting to memcpy the hot freshly jitted - code from the AssemblerBuffer. + * assembler/X86Assembler.h: + (JSC::X86Assembler::relinkJump): + (JSC::X86Assembler::relinkCall): + (JSC::X86Assembler::repatchInt32): + (JSC::X86Assembler::repatchPointer): + (JSC::X86Assembler::repatchLoadPtrToLEA): + - Remove usage of MakeWritable. - https://bugs.webkit.org/show_bug.cgi?id=22974 - ... and probably many, many more. + * bytecode/CodeBlock.h: + (JSC::CodeBlock::getJITCode): + - Provide access to CodeBlock's JITCode. * jit/ExecutableAllocator.h: - (JSC::ExecutablePool::alloc): - (JSC::ExecutablePool::roundUpAllocationSize): - (JSC::ExecutablePool::ExecutablePool): - (JSC::ExecutablePool::poolAllocate): - -2008-12-22 Sam Weinig <sam@webkit.org> - - Reviewed by Gavin Barraclough. - - Rename all uses of the term "repatch" to "patch". + (JSC::ExecutableAllocator::makeExecutable): + (JSC::ExecutableAllocator::cacheFlush): + - Remove MakeWritable, make cacheFlush public. - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::DataLabelPtr::patch): - (JSC::MacroAssembler::DataLabel32::patch): - (JSC::MacroAssembler::Jump::patch): - (JSC::MacroAssembler::PatchBuffer::PatchBuffer): - (JSC::MacroAssembler::PatchBuffer::setPtr): - (JSC::MacroAssembler::loadPtrWithAddressOffsetPatch): - (JSC::MacroAssembler::storePtrWithAddressOffsetPatch): - (JSC::MacroAssembler::storePtrWithPatch): - (JSC::MacroAssembler::jnePtrWithPatch): - * assembler/X86Assembler.h: - (JSC::X86Assembler::patchAddress): - (JSC::X86Assembler::patchImmediate): - (JSC::X86Assembler::patchPointer): - (JSC::X86Assembler::patchBranchOffset): - * interpreter/Interpreter.cpp: - (JSC::Interpreter::tryCTICachePutByID): - (JSC::Interpreter::tryCTICacheGetByID): - (JSC::Interpreter::cti_op_put_by_id): - (JSC::Interpreter::cti_op_get_by_id): - (JSC::Interpreter::cti_op_get_by_id_self_fail): - (JSC::Interpreter::cti_op_get_by_id_proto_list): - (JSC::Interpreter::cti_vm_dontLazyLinkCall): * jit/JIT.cpp: + (JSC::ctiPatchNearCallByReturnAddress): (JSC::ctiPatchCallByReturnAddress): - (JSC::JIT::privateCompileMainPass): (JSC::JIT::privateCompile): - (JSC::JIT::privateCompileCTIMachineTrampolines): - * jit/JIT.h: - * jit/JITCall.cpp: (JSC::JIT::unlinkCall): (JSC::JIT::linkCall): - (JSC::JIT::compileOpCall): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::compileGetByIdHotPath): - (JSC::JIT::compilePutByIdHotPath): - (JSC::JIT::compileGetByIdSlowCase): - (JSC::JIT::compilePutByIdSlowCase): - (JSC::JIT::privateCompilePutByIdTransition): - (JSC::JIT::patchGetByIdSelf): - (JSC::JIT::patchPutByIdReplace): - (JSC::JIT::privateCompilePatchGetArrayLength): - (JSC::JIT::privateCompileGetByIdSelf): - (JSC::JIT::privateCompileGetByIdProto): - (JSC::JIT::privateCompileGetByIdSelfList): - (JSC::JIT::privateCompileGetByIdProtoList): - (JSC::JIT::privateCompileGetByIdChainList): - (JSC::JIT::privateCompileGetByIdChain): - (JSC::JIT::privateCompilePutByIdReplace): - -2008-12-22 Adam Roben <aroben@apple.com> - - Build fix after r39428 - - * jit/JITCall.cpp: - (JSC::JIT::compileOpCallSlowCase): Added a missing MacroAssembler:: - -2008-12-22 Nikolas Zimmermann <nikolas.zimmermann@torchmobile.com> - - Rubber-stamped by George Staikos. - - Unify all TorchMobile copyright lines. Consolidate in a single line, as requested by Mark Rowe, some time ago. - - * wtf/RandomNumber.cpp: - * wtf/RandomNumber.h: - * wtf/RandomNumberSeed.h: - -2008-12-21 Nikolas Zimmermann <nikolas.zimmermann@torchmobile.com> - - Rubber-stamped by George Staikos. + - Add CodeBlock argument to RepatchBuffer. - Fix copyright of the new RandomNumber* files. - - * wtf/RandomNumber.cpp: - * wtf/RandomNumber.h: - * wtf/RandomNumberSeed.h: - -2008-12-21 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt & Cameron Zwarich. - - Add support for call and property access repatching on x86-64. - - No change in performance on current configurations (2x impovement on v8-tests with JIT enabled on x86-64). - - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::DataLabelPtr::repatch): - (JSC::MacroAssembler::DataLabelPtr::operator X86Assembler::JmpDst): - (JSC::MacroAssembler::DataLabel32::repatch): - (JSC::MacroAssembler::RepatchBuffer::addressOf): - (JSC::MacroAssembler::add32): - (JSC::MacroAssembler::sub32): - (JSC::MacroAssembler::loadPtrWithAddressOffsetRepatch): - (JSC::MacroAssembler::storePtrWithAddressOffsetRepatch): - (JSC::MacroAssembler::jePtr): - (JSC::MacroAssembler::jnePtr): - (JSC::MacroAssembler::jnePtrWithRepatch): - (JSC::MacroAssembler::differenceBetween): - * assembler/X86Assembler.h: - (JSC::X86Assembler::addl_im): - (JSC::X86Assembler::subl_im): - (JSC::X86Assembler::cmpl_rm): - (JSC::X86Assembler::movq_rm_disp32): - (JSC::X86Assembler::movq_mr_disp32): - (JSC::X86Assembler::repatchPointer): - (JSC::X86Assembler::X86InstructionFormatter::oneByteOp64_disp32): - * jit/JIT.cpp: - (JSC::JIT::privateCompile): - (JSC::JIT::privateCompileCTIMachineTrampolines): * jit/JIT.h: - * jit/JITCall.cpp: - (JSC::JIT::unlinkCall): - (JSC::JIT::linkCall): - (JSC::JIT::compileOpCall): - (JSC::JIT::compileOpCallSlowCase): - * jit/JITInlineMethods.h: - (JSC::JIT::restoreArgumentReferenceForTrampoline): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::compileGetByIdHotPath): - (JSC::JIT::compileGetByIdSlowCase): - (JSC::JIT::compilePutByIdHotPath): - (JSC::JIT::compilePutByIdSlowCase): - (JSC::resizePropertyStorage): - (JSC::JIT::privateCompilePutByIdTransition): - (JSC::JIT::privateCompileGetByIdProto): - (JSC::JIT::privateCompileGetByIdProtoList): - (JSC::JIT::privateCompileGetByIdChainList): - (JSC::JIT::privateCompileGetByIdChain): - * wtf/Platform.h: - -2008-12-20 Gavin Barraclough <barraclough@apple.com> + - Pass CodeBlock argument for use by RepatchBuffer. - Reviewed by Oliver Hunt. - - Port optimized property access generation to the MacroAssembler. + * jit/JITCode.h: + (JSC::JITCode::start): + (JSC::JITCode::size): + - Provide access to code start & size. - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::AbsoluteAddress::AbsoluteAddress): - (JSC::MacroAssembler::DataLabelPtr::repatch): - (JSC::MacroAssembler::DataLabel32::DataLabel32): - (JSC::MacroAssembler::DataLabel32::repatch): - (JSC::MacroAssembler::Label::operator X86Assembler::JmpDst): - (JSC::MacroAssembler::Jump::repatch): - (JSC::MacroAssembler::JumpList::empty): - (JSC::MacroAssembler::RepatchBuffer::link): - (JSC::MacroAssembler::add32): - (JSC::MacroAssembler::and32): - (JSC::MacroAssembler::sub32): - (JSC::MacroAssembler::loadPtrWithAddressRepatch): - (JSC::MacroAssembler::storePtrWithAddressRepatch): - (JSC::MacroAssembler::push): - (JSC::MacroAssembler::ja32): - (JSC::MacroAssembler::jePtr): - (JSC::MacroAssembler::jnePtr): - (JSC::MacroAssembler::jnePtrWithRepatch): - (JSC::MacroAssembler::align): - (JSC::MacroAssembler::differenceBetween): - * assembler/X86Assembler.h: - (JSC::X86Assembler::movl_rm_disp32): - (JSC::X86Assembler::movl_mr_disp32): - (JSC::X86Assembler::X86InstructionFormatter::oneByteOp_disp32): - (JSC::X86Assembler::X86InstructionFormatter::memoryModRM): - * jit/JIT.cpp: - (JSC::ctiRepatchCallByReturnAddress): - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompile): - (JSC::JIT::privateCompileCTIMachineTrampolines): - * jit/JIT.h: * jit/JITPropertyAccess.cpp: - (JSC::JIT::compileGetByIdHotPath): - (JSC::JIT::compileGetByIdSlowCase): - (JSC::JIT::compilePutByIdHotPath): - (JSC::JIT::compilePutByIdSlowCase): - (JSC::resizePropertyStorage): (JSC::JIT::privateCompilePutByIdTransition): (JSC::JIT::patchGetByIdSelf): + (JSC::JIT::patchMethodCallProto): (JSC::JIT::patchPutByIdReplace): (JSC::JIT::privateCompilePatchGetArrayLength): - (JSC::JIT::privateCompileGetByIdSelf): (JSC::JIT::privateCompileGetByIdProto): (JSC::JIT::privateCompileGetByIdSelfList): (JSC::JIT::privateCompileGetByIdProtoList): (JSC::JIT::privateCompileGetByIdChainList): (JSC::JIT::privateCompileGetByIdChain): - (JSC::JIT::privateCompilePutByIdReplace): - * wtf/RefCounted.h: - (WTF::RefCountedBase::addressOfCount): - -2008-12-19 Gustavo Noronha Silva <gns@gnome.org> - - Reviewed by Holger Freyther. - - https://bugs.webkit.org/show_bug.cgi?id=22686 - - Added file which was missing to the javascriptcore_sources - variable, so that it shows up in the tarball created by `make - dist'. - - * GNUmakefile.am: - -2008-12-19 Holger Hans Peter Freyther <zecke@selfish.org> - - Reviewed by Antti Koivisto. - - Build fix when building JS API tests with a c89 c compiler - - Do not use C++ style comments and convert them to C comments. - - * wtf/Platform.h: - -2008-12-18 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Sam Weinig. - - Same as last revision, adding cases for pre & post inc & dec. - - https://bugs.webkit.org/show_bug.cgi?id=22928 - - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - -2008-12-18 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Sam Weinig. - - Fixes for the JIT's handling of JSImmediate values on x86-64. - On 64-bit systems, the code in JSImmediate.h relies on the upper - bits of a JSImmediate being a sign extension of the low 32-bits. - This was not being enforced by the JIT, since a number of inline - operations were being performed on 32-bit values in registers, and - when a 32-bit result is written to a register on x86-64 the value - is zero-extended to 64-bits. - - This fix honors previous behavoir. A better fix in the long run - (when the JIT is enabled by default) may be to change JSImmediate.h - so it no longer relies on the upper bits of the pointer,... though - if we're going to change JSImmediate.h for 64-bit, we probably may - as well change the format so that the full range of 32-bit ints can - be stored, rather than just 31-bits. - - https://bugs.webkit.org/show_bug.cgi?id=22925 - - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::addPtr): - (JSC::MacroAssembler::andPtr): - (JSC::MacroAssembler::orPtr): - (JSC::MacroAssembler::or32): - (JSC::MacroAssembler::xor32): - (JSC::MacroAssembler::xorPtr): - (JSC::MacroAssembler::signExtend32ToPtr): - * assembler/X86Assembler.h: - (JSC::X86Assembler::): - (JSC::X86Assembler::andq_rr): - (JSC::X86Assembler::andq_ir): - (JSC::X86Assembler::orq_rr): - (JSC::X86Assembler::xorq_ir): - (JSC::X86Assembler::movsxd_rr): - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - * jit/JITInlineMethods.h: - (JSC::JIT::emitFastArithReTagImmediate): - (JSC::JIT::emitFastArithPotentiallyReTagImmediate): - (JSC::JIT::emitFastArithImmToInt): - -2008-12-18 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Sam Weinig. - - Just a tidy up - rename & refactor some the #defines configuring the JIT. - - * interpreter/Interpreter.cpp: - (JSC::Interpreter::cti_op_convert_this): - (JSC::Interpreter::cti_op_end): - (JSC::Interpreter::cti_op_add): - (JSC::Interpreter::cti_op_pre_inc): - (JSC::Interpreter::cti_timeout_check): - (JSC::Interpreter::cti_register_file_check): - (JSC::Interpreter::cti_op_loop_if_less): - (JSC::Interpreter::cti_op_loop_if_lesseq): - (JSC::Interpreter::cti_op_new_object): - (JSC::Interpreter::cti_op_put_by_id_generic): - (JSC::Interpreter::cti_op_get_by_id_generic): - (JSC::Interpreter::cti_op_put_by_id): - (JSC::Interpreter::cti_op_put_by_id_second): - (JSC::Interpreter::cti_op_put_by_id_fail): - (JSC::Interpreter::cti_op_get_by_id): - (JSC::Interpreter::cti_op_get_by_id_second): - (JSC::Interpreter::cti_op_get_by_id_self_fail): - (JSC::Interpreter::cti_op_get_by_id_proto_list): - (JSC::Interpreter::cti_op_get_by_id_proto_list_full): - (JSC::Interpreter::cti_op_get_by_id_proto_fail): - (JSC::Interpreter::cti_op_get_by_id_array_fail): - (JSC::Interpreter::cti_op_get_by_id_string_fail): - (JSC::Interpreter::cti_op_instanceof): - (JSC::Interpreter::cti_op_del_by_id): - (JSC::Interpreter::cti_op_mul): - (JSC::Interpreter::cti_op_new_func): - (JSC::Interpreter::cti_op_call_JSFunction): - (JSC::Interpreter::cti_op_call_arityCheck): - (JSC::Interpreter::cti_vm_dontLazyLinkCall): - (JSC::Interpreter::cti_vm_lazyLinkCall): - (JSC::Interpreter::cti_op_push_activation): - (JSC::Interpreter::cti_op_call_NotJSFunction): - (JSC::Interpreter::cti_op_create_arguments): - (JSC::Interpreter::cti_op_create_arguments_no_params): - (JSC::Interpreter::cti_op_tear_off_activation): - (JSC::Interpreter::cti_op_tear_off_arguments): - (JSC::Interpreter::cti_op_profile_will_call): - (JSC::Interpreter::cti_op_profile_did_call): - (JSC::Interpreter::cti_op_ret_scopeChain): - (JSC::Interpreter::cti_op_new_array): - (JSC::Interpreter::cti_op_resolve): - (JSC::Interpreter::cti_op_construct_JSConstruct): - (JSC::Interpreter::cti_op_construct_NotJSConstruct): - (JSC::Interpreter::cti_op_get_by_val): - (JSC::Interpreter::cti_op_resolve_func): - (JSC::Interpreter::cti_op_sub): - (JSC::Interpreter::cti_op_put_by_val): - (JSC::Interpreter::cti_op_put_by_val_array): - (JSC::Interpreter::cti_op_lesseq): - (JSC::Interpreter::cti_op_loop_if_true): - (JSC::Interpreter::cti_op_negate): - (JSC::Interpreter::cti_op_resolve_base): - (JSC::Interpreter::cti_op_resolve_skip): - (JSC::Interpreter::cti_op_resolve_global): - (JSC::Interpreter::cti_op_div): - (JSC::Interpreter::cti_op_pre_dec): - (JSC::Interpreter::cti_op_jless): - (JSC::Interpreter::cti_op_not): - (JSC::Interpreter::cti_op_jtrue): - (JSC::Interpreter::cti_op_post_inc): - (JSC::Interpreter::cti_op_eq): - (JSC::Interpreter::cti_op_lshift): - (JSC::Interpreter::cti_op_bitand): - (JSC::Interpreter::cti_op_rshift): - (JSC::Interpreter::cti_op_bitnot): - (JSC::Interpreter::cti_op_resolve_with_base): - (JSC::Interpreter::cti_op_new_func_exp): - (JSC::Interpreter::cti_op_mod): - (JSC::Interpreter::cti_op_less): - (JSC::Interpreter::cti_op_neq): - (JSC::Interpreter::cti_op_post_dec): - (JSC::Interpreter::cti_op_urshift): - (JSC::Interpreter::cti_op_bitxor): - (JSC::Interpreter::cti_op_new_regexp): - (JSC::Interpreter::cti_op_bitor): - (JSC::Interpreter::cti_op_call_eval): - (JSC::Interpreter::cti_op_throw): - (JSC::Interpreter::cti_op_get_pnames): - (JSC::Interpreter::cti_op_next_pname): - (JSC::Interpreter::cti_op_push_scope): - (JSC::Interpreter::cti_op_pop_scope): - (JSC::Interpreter::cti_op_typeof): - (JSC::Interpreter::cti_op_is_undefined): - (JSC::Interpreter::cti_op_is_boolean): - (JSC::Interpreter::cti_op_is_number): - (JSC::Interpreter::cti_op_is_string): - (JSC::Interpreter::cti_op_is_object): - (JSC::Interpreter::cti_op_is_function): - (JSC::Interpreter::cti_op_stricteq): - (JSC::Interpreter::cti_op_nstricteq): - (JSC::Interpreter::cti_op_to_jsnumber): - (JSC::Interpreter::cti_op_in): - (JSC::Interpreter::cti_op_push_new_scope): - (JSC::Interpreter::cti_op_jmp_scopes): - (JSC::Interpreter::cti_op_put_by_index): - (JSC::Interpreter::cti_op_switch_imm): - (JSC::Interpreter::cti_op_switch_char): - (JSC::Interpreter::cti_op_switch_string): - (JSC::Interpreter::cti_op_del_by_val): - (JSC::Interpreter::cti_op_put_getter): - (JSC::Interpreter::cti_op_put_setter): - (JSC::Interpreter::cti_op_new_error): - (JSC::Interpreter::cti_op_debug): - (JSC::Interpreter::cti_vm_throw): - * interpreter/Interpreter.h: - * jit/JIT.cpp: - (JSC::): - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompile): - * jit/JIT.h: - * jit/JITInlineMethods.h: - (JSC::JIT::restoreArgumentReference): - (JSC::JIT::restoreArgumentReferenceForTrampoline): - * wtf/Platform.h: - -2008-12-18 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Geoff Garen. - - Bug 21855: REGRESSION (r37323): Gmail complains about popup blocking when opening a link - <https://bugs.webkit.org/show_bug.cgi?id=21855> - <rdar://problem/6278244> - - Move DynamicGlobalObjectScope to JSGlobalObject.h so that it can be used - from WebCore. - - * interpreter/Interpreter.cpp: - * runtime/JSGlobalObject.h: - (JSC::DynamicGlobalObjectScope::DynamicGlobalObjectScope): - (JSC::DynamicGlobalObjectScope::~DynamicGlobalObjectScope): - -2008-12-17 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Gavin Barraclough. - - Fixed https://bugs.webkit.org/show_bug.cgi?id=22393 - Segfault when caching property accesses to primitive cells. - - Changed some asObject casts to asCell casts in cases where a primitive - value may be a cell and not an object. - - Re-enabled property caching for primitives in cases where it had been - disabled because of this bug. - - Updated a comment to better explain something Darin thought needed - explaining in an old patch review. - - * interpreter/Interpreter.cpp: - (JSC::countPrototypeChainEntriesAndCheckForProxies): - (JSC::Interpreter::tryCacheGetByID): - (JSC::Interpreter::tryCTICacheGetByID): - (JSC::Interpreter::cti_op_get_by_id_self_fail): - (JSC::Interpreter::cti_op_get_by_id_proto_list): - -2008-12-17 Gavin Barraclough <barraclough@apple.com> + - Add CodeBlock argument to RepatchBuffer. - Reviewed by Cameron Zwarich. - - Fixes for Sunspider failures with the JIT enabled on x86-64. - - * assembler/MacroAssembler.h: - Switch the order of the RegisterID & Address form of je32, to keep it consistent with jne32. - * jit/JIT.cpp: - * jit/JIT.h: - * jit/JITInlineMethods.h: - Port the m_ctiVirtualCall tramopline generation to use the MacroAssembler interface. - * jit/JITCall.cpp: - Fix bug in the non-optimizing code path, vptr check should have been to the memory address pointer - to by the register, not to the register itself. - * wrec/WRECGenerator.cpp: - See assembler/MacroAssembler.h, above. - -2008-12-17 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Sam Weinig. - - print("Hello, 64-bit jitted world!"); - Get hello-world working through the JIT, on x86-64. - - * assembler/X86Assembler.h: - Fix encoding of opcode + RegisterID format instructions for 64-bit. - * interpreter/Interpreter.cpp: - * interpreter/Interpreter.h: - Make VoidPtrPair actually be a pair of void*s. - (Possibly should make this change for 32-bit Mac platforms, too - but won't change 32-bit behaviour in this patch). - * jit/JIT.cpp: - * jit/JIT.h: - Provide names for the timeoutCheckRegister & callFrameRegister on x86-64, - force x86-64 ctiTrampoline arguments onto the stack, - implement the asm trampolines for x86-64, - implement the restoreArgumentReference methods for x86-64 calling conventions. - * jit/JITCall.cpp: - * jit/JITInlineMethods.h: - * wtf/Platform.h: - Add switch settings to ENABLE(JIT), on PLATFORM(X86_64) (currently still disabled). + * jit/JITStubs.cpp: + (JSC::JITThunks::tryCachePutByID): + (JSC::JITThunks::tryCacheGetByID): + (JSC::JITStubs::DEFINE_STUB_FUNCTION): + - Pass CodeBlock argument for use by RepatchBuffer. -2008-12-17 Sam Weinig <sam@webkit.org> +2009-07-21 Zoltan Herczeg <zherczeg@inf.u-szeged.hu> Reviewed by Gavin Barraclough. - Add more CodeBlock statistics. - - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::dumpStatistics): - -2008-12-17 Sam Weinig <sam@webkit.org> - - Reviewed by Darin Adler. - - Fix for https://bugs.webkit.org/show_bug.cgi?id=22897 - <rdar://problem/6428342> - Look into feasibility of discarding bytecode after native codegen - - Clear the bytecode Instruction vector at the end JIT generation. - - Saves 4.8 MB on Membuster head. - - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::dump): Add logging for the case that someone tries - to dump the instructions of a CodeBlock that has had its bytecode - vector cleared. - (JSC::CodeBlock::CodeBlock): Initialize the instructionCount - (JSC::CodeBlock::handlerForBytecodeOffset): Use instructionCount instead - of the size of the instruction vector in the assertion. - (JSC::CodeBlock::lineNumberForBytecodeOffset): Ditto. - (JSC::CodeBlock::expressionRangeForBytecodeOffset): Ditto. - (JSC::CodeBlock::getByIdExceptionInfoForBytecodeOffset): Ditto. - (JSC::CodeBlock::functionRegisterForBytecodeOffset): Ditto. - * bytecode/CodeBlock.h: - (JSC::CodeBlock::setInstructionCount): Store the instruction vector size - in debug builds for assertions. - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::generate): - * jit/JIT.cpp: - (JSC::JIT::privateCompile): Clear the bytecode vector unless we - have compiled with Opcode sampling where we will continue to require it - -2008-12-17 Cary Clark <caryclark@google.com> - - Reviewed by Darin Adler. - Landed by Adam Barth. - - Add ENABLE_TEXT_CARET to permit the ANDROID platform - to invalidate and draw the caret in a separate thread. - - * wtf/Platform.h: - Default ENABLE_TEXT_CARET to 1. - -2008-12-17 Alexey Proskuryakov <ap@webkit.org> - - Reviewed by Darin Adler. - - Don't use unique context group in JSGlobalContextCreate() on Tiger or Leopard, take two. - - * API/JSContextRef.cpp: The previous patch that claimed to do this was making Tiger and - Leopard always use unique context group instead. - -2008-12-16 Sam Weinig <sam@webkit.org> - - Reviewed by Geoffrey Garen. - - Fix for https://bugs.webkit.org/show_bug.cgi?id=22838 - Remove dependency on the bytecode Instruction buffer in Interpreter::throwException - Part of <rdar://problem/6428342> + Cache not only the structure of the method, but the + structure of its prototype as well. + https://bugs.webkit.org/show_bug.cgi?id=27077 * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::functionRegisterForBytecodeOffset): Added. Function to get - a function Register index in a callFrame for a bytecode offset. - (JSC::CodeBlock::shrinkToFit): Shrink m_getByIdExceptionInfo and m_functionRegisterInfos. + (JSC::CodeBlock::~CodeBlock): * bytecode/CodeBlock.h: - (JSC::FunctionRegisterInfo::FunctionRegisterInfo): Added. - (JSC::CodeBlock::addFunctionRegisterInfo): - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::emitCall): - * interpreter/Interpreter.cpp: - (JSC::Interpreter::throwException): Use functionRegisterForBytecodeOffset in JIT - mode. - -2008-12-16 Sam Weinig <sam@webkit.org> - - Reviewed by Gavin Barraclough. - - Fix for https://bugs.webkit.org/show_bug.cgi?id=22837 - Remove dependency on the bytecode Instruction buffer in Interpreter::cti_op_call_NotJSFunction - Part of <rdar://problem/6428342> - - * interpreter/CallFrame.h: Added comment regarding returnPC storing a void*. - * interpreter/Interpreter.cpp: - (JSC::bytecodeOffsetForPC): We no longer have any cases of the PC - being in the instruction stream for JIT, so we can remove the check. - (JSC::Interpreter::cti_op_call_NotJSFunction): Use the CTI_RETURN_ADDRESS - as the call frame returnPC as it is only necessary for looking up when - throwing an exception. - * interpreter/RegisterFile.h: - (JSC::RegisterFile::): Added comment regarding returnPC storing a void*. - * jit/JIT.h: Remove ARG_instr4. - * jit/JITCall.cpp: - (JSC::JIT::compileOpCallSetupArgs): Don't pass the instruction pointer. - -2008-12-16 Darin Adler <darin@apple.com> - - Reviewed and landed by Cameron Zwarich. - - Preparatory work for fixing - - Bug 22887: Make UString::Rep use RefCounted rather than implementing its own ref counting - <https://bugs.webkit.org/show_bug.cgi?id=22887> - - Change the various string translators used by Identifier:add() so that - they never zero the ref count of a newly created UString::Rep. - - * runtime/Identifier.cpp: - (JSC::CStringTranslator::translate): - (JSC::Identifier::add): - (JSC::UCharBufferTranslator::translate): - -2008-12-16 Gavin Barraclough <barraclough@apple.com> - - Build fix for 'doze. - - * assembler/AssemblerBuffer.h: - -2008-12-16 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Cameron Zwarich. - - Make the JIT compile on x86-64. - This largely involves populting the missing calls in MacroAssembler.h. - In addition some reinterpret_casts need removing from the JIT, and the - repatching property access code will need to be fully compiled out for - now. The changes in interpret.cpp are to reorder the functions so that - the _generic forms come before all other property access methods, and - then to place all property access methods other than the generic forms - under control of the ENABLE_JIT_OPTIMIZE_PROPERTY_ACCESS macro. - - No performance impact. - - * assembler/AssemblerBuffer.h: - (JSC::AssemblerBuffer::putInt64Unchecked): - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::loadPtr): - (JSC::MacroAssembler::load32): - (JSC::MacroAssembler::storePtr): - (JSC::MacroAssembler::storePtrWithRepatch): - (JSC::MacroAssembler::store32): - (JSC::MacroAssembler::poke): - (JSC::MacroAssembler::move): - (JSC::MacroAssembler::testImm64): - (JSC::MacroAssembler::jePtr): - (JSC::MacroAssembler::jnePtr): - (JSC::MacroAssembler::jnzPtr): - (JSC::MacroAssembler::jzPtr): - * assembler/X86Assembler.h: - (JSC::X86Assembler::): - (JSC::X86Assembler::cmpq_rr): - (JSC::X86Assembler::cmpq_rm): - (JSC::X86Assembler::cmpq_im): - (JSC::X86Assembler::testq_i32m): - (JSC::X86Assembler::movl_mEAX): - (JSC::X86Assembler::movl_i32r): - (JSC::X86Assembler::movl_EAXm): - (JSC::X86Assembler::movq_rm): - (JSC::X86Assembler::movq_mEAX): - (JSC::X86Assembler::movq_mr): - (JSC::X86Assembler::movq_i64r): - (JSC::X86Assembler::movl_mr): - (JSC::X86Assembler::X86InstructionFormatter::oneByteOp64): - (JSC::X86Assembler::X86InstructionFormatter::immediate64): - * interpreter/Interpreter.cpp: - (JSC::Interpreter::cti_op_put_by_id_generic): - (JSC::Interpreter::cti_op_get_by_id_generic): - (JSC::Interpreter::cti_op_put_by_id): - (JSC::Interpreter::cti_op_put_by_id_second): - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompile): - (JSC::JIT::privateCompileCTIMachineTrampolines): - * jit/JITCall.cpp: - (JSC::JIT::compileOpCallSetupArgs): - (JSC::JIT::compileOpCall): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::compileGetByIdHotPath): - (JSC::JIT::compilePutByIdHotPath): - * runtime/JSImmediate.h: - (JSC::JSImmediate::makeInt): - -2008-12-16 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Darin Adler. - - Bug 22869: REGRESSION (r38407): http://news.cnet.com/8301-13579_3-9953533-37.html crashes - <https://bugs.webkit.org/show_bug.cgi?id=22869> - <rdar://problem/6402499> - - Before r38407, Structure::m_nameInPrevious was ref'd due to it being - stored in a PropertyMap. However, PropertyMaps are created lazily after - r38407, so Structure::m_nameInPrevious is not necessarily ref'd while - it is being used. Making it a RefPtr instead of a raw pointer fixes - the problem. - - Unfortunately, the crash in the bug is rather intermittent, and it is - impossible to add an assertion in UString::Ref::ref() to catch this bug - because some users of UString::Rep deliberately zero out the reference - count. Therefore, there is no layout test accompanying this bug fix. - - * runtime/Structure.cpp: - (JSC::Structure::~Structure): Use get(). - (JSC::Structure::materializePropertyMap): Use get(). - (JSC::Structure::addPropertyTransitionToExistingStructure): Use get(). - (JSC::Structure::addPropertyTransition): Use get(). - * runtime/Structure.h: Make Structure::m_nameInPrevious a RefPtr instead - of a raw pointer. - -2008-12-16 Nikolas Zimmermann <nikolas.zimmermann@torchmobile.com> - - Not reviewed. Attempt to fix win build. No 'using namespace WTF' in this file, needs manual WTF:: prefix. - Not sure why the build works as is here. - - * runtime/MathObject.cpp: - (JSC::mathProtoFuncRandom): - -2008-12-16 Nikolas Zimmermann <nikolas.zimmermann@torchmobile.com> - - Reviewed by Darin Adler. - - Fixes: https://bugs.webkit.org/show_bug.cgi?id=22876 - - Unify random number generation in JavaScriptCore & WebCore, by introducing - wtf/RandomNumber.h and moving wtf_random/wtf_random_init out of MathExtras.h. - - wtf_random_init() has been renamed to initializeRandomNumberGenerator() and - lives in it's own private header: wtf/RandomNumberSeed.h, only intended to - be used from within JavaScriptCore. - - wtf_random() has been renamed to randomNumber() and lives in a public header - wtf/RandomNumber.h, usable from within JavaScriptCore & WebCore. It encapsulates - the code taking care of initializing the random number generator (only when - building without ENABLE(JSC_MULTIPLE_THREADS), otherwhise initializeThreading() - already took care of that). - - Functional change on darwin: Use random() instead of rand(), as it got a larger - period (more randomness). HTMLFormElement already contains this implementation - and I just moved it in randomNumber(), as special case for PLATFORM(DARWIN). - - * GNUmakefile.am: Add RandomNumber.(cpp/h) / RandomNumberSeed.h. - * JavaScriptCore.exp: Ditto. - * JavaScriptCore.pri: Ditto. - * JavaScriptCore.scons: Ditto. - * JavaScriptCore.vcproj/WTF/WTF.vcproj: Ditto. - * JavaScriptCore.xcodeproj/project.pbxproj: Ditto. - * JavaScriptCoreSources.bkl: Ditto. - * runtime/MathObject.cpp: Use new WTF::randomNumber() functionality. - (JSC::mathProtoFuncRandom): - * wtf/MathExtras.h: Move wtf_random / wtf_random_init to new files. - * wtf/RandomNumber.cpp: Added. - (WTF::randomNumber): - * wtf/RandomNumber.h: Added. - * wtf/RandomNumberSeed.h: Added. Internal usage within JSC only. - (WTF::initializeRandomNumberGenerator): - * wtf/ThreadingGtk.cpp: Rename wtf_random_init() to initializeRandomNumberGenerator(). - (WTF::initializeThreading): - * wtf/ThreadingPthreads.cpp: Ditto. - (WTF::initializeThreading): - * wtf/ThreadingQt.cpp: Ditto. - (WTF::initializeThreading): - * wtf/ThreadingWin.cpp: Ditto. - (WTF::initializeThreading): - -2008-12-16 Yael Aharon <yael.aharon@nokia.com> - - Reviewed by Tor Arne Vestbø. - - Qt/Win build fix - - * JavaScriptCore.pri: - -2008-12-15 Mark Rowe <mrowe@apple.com> - - Reviewed by Cameron Zwarich. - - Fix the build with GCC 4.0. - - * Configurations/JavaScriptCore.xcconfig: GCC 4.0 appears to have a bug when compiling with -funwind-tables on, - so don't use it with that compiler version. - -2008-12-15 Mark Rowe <mrowe@apple.com> - - Rubber-stamped by Cameron Zwarich. - - <rdar://problem/6289933> Change WebKit-related projects to build with GCC 4.2 on Leopard. - - * Configurations/Base.xcconfig: - * Configurations/DebugRelease.xcconfig: - -2008-12-15 Alexey Proskuryakov <ap@webkit.org> - - Reviewed by Darin Adler. - - Don't use unique context group in JSGlobalContextCreate() on Tiger or Leopard. - - * API/JSContextRef.cpp: (JSGlobalContextCreate): - -2008-12-15 Alexey Proskuryakov <ap@webkit.org> - - Reviewed by Darin Adler. - - <rdar://problem/6445089> Mach ports leak from worker threads - - * interpreter/Interpreter.cpp: (JSC::getCPUTime): - Deallocate the thread self port. - -2008-12-15 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Mark Rowe. - - Construct stack frames in JIT code, so that backtracing can still work. - <rdar://problem/6447870> JIT should play nice with attempts to take stack traces - - * jit/JIT.cpp: - (JSC::): - (JSC::JIT::privateCompileMainPass): - -2008-12-15 Mark Rowe <mrowe@apple.com> - - Reviewed by Gavin Barraclough. - - <rdar://problem/6402262> JavaScriptCore needs exception handling tables in order to get stack traces without frame pointers - - * Configurations/JavaScriptCore.xcconfig: - -2008-12-15 Gavin Barraclough <barraclough@apple.com> - - Rubber stamped by Mark Rowe. - - Revert r39226 / Bug 22818: Unify JIT callback argument access OS X / Windows - This causes Acid3 failures – reverting for now & will revisit later. - https://bugs.webkit.org/show_bug.cgi?id=22873 - - * interpreter/Interpreter.h: - * jit/JIT.cpp: - (JSC::JIT::privateCompileCTIMachineTrampolines): - * jit/JIT.h: - * jit/JITInlineMethods.h: - (JSC::JIT::restoreArgumentReference): - (JSC::JIT::restoreArgumentReferenceForTrampoline): - (JSC::JIT::emitCTICall_internal): + (JSC::MethodCallLinkInfo::MethodCallLinkInfo): * jit/JITPropertyAccess.cpp: - (JSC::JIT::privateCompilePutByIdTransition): - * wtf/Platform.h: + (JSC::JIT::patchMethodCallProto): -2008-12-15 Darin Adler <darin@apple.com> +2009-07-21 Gavin Barraclough <barraclough@apple.com> Reviewed by Sam Weinig. - - fix <rdar://problem/6427048> crash due to infinite recursion after setting window.__proto__ = window - - Replaced toGlobalObject with the more generally useful unwrappedObject and used it to - fix the cycle detection code in put(__proto__). - - * JavaScriptCore.exp: Updated. - - * runtime/JSGlobalObject.cpp: Removed toGlobalObject. We now use unwrappedObject instead. - * runtime/JSGlobalObject.h: - (JSC::JSGlobalObject::isGlobalObject): Ditto. - - * runtime/JSGlobalObjectFunctions.cpp: - (JSC::globalFuncEval): Use unwrappedObject and isGlobalObject here rather than toGlobalObject. - - * runtime/JSObject.cpp: - (JSC::JSObject::put): Rewrote prototype cycle checking loop. Use unwrappedObject in the loop now. - (JSC::JSObject::unwrappedObject): Replaced toGlobalObject with this new function. - * runtime/JSObject.h: More of the same. - -2008-12-15 Steve Falkenburg <sfalken@apple.com> - - Windows build fix. - - Visual Studio requires visibility of forward declarations to match class declaration. - - * assembler/X86Assembler.h: - -2008-12-15 Gustavo Noronha Silva <kov@kov.eti.br> - - Reviewed by Mark Rowe. - - https://bugs.webkit.org/show_bug.cgi?id=22686 - - GTK+ build fix. - - * GNUmakefile.am: - -2008-12-15 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. + Move call linking / repatching down from AbstractMacroAssembler into MacroAssemblerARCH classes. + ( https://bugs.webkit.org/show_bug.cgi?id=27527 ) - Add support to X86Assembler emitting instructions that access all 16 registers on x86-64. - Add a new formating class, that is reponsible for both emitting the opcode bytes and the - ModRm bytes of an instruction in a single call; this can insert the REX byte as necessary - before the opcode, but has access to the register numbers to build the REX. + This allows the implementation to be defined per architecture. Specifically this addresses the + fact that x86-64 MacroAssembler implements far calls as a load to register, followed by a call + to register. Patching the call actually requires the pointer load to be patched, rather than + the call to be patched. This is implementation detail specific to MacroAssemblerX86_64, and as + such is best handled there. - * assembler/AssemblerBuffer.h: - (JSC::AssemblerBuffer::isAligned): - (JSC::AssemblerBuffer::data): - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::addPtr): - (JSC::MacroAssembler::add32): - (JSC::MacroAssembler::and32): - (JSC::MacroAssembler::or32): - (JSC::MacroAssembler::sub32): - (JSC::MacroAssembler::xor32): - (JSC::MacroAssembler::loadPtr): - (JSC::MacroAssembler::load32): - (JSC::MacroAssembler::load16): - (JSC::MacroAssembler::storePtr): - (JSC::MacroAssembler::storePtrWithRepatch): - (JSC::MacroAssembler::store32): - (JSC::MacroAssembler::pop): - (JSC::MacroAssembler::push): - (JSC::MacroAssembler::compareImm32ForBranch): - (JSC::MacroAssembler::compareImm32ForBranchEquality): - (JSC::MacroAssembler::testImm32): - (JSC::MacroAssembler::jae32): - (JSC::MacroAssembler::jb32): - (JSC::MacroAssembler::je16): - (JSC::MacroAssembler::jg32): - (JSC::MacroAssembler::jnePtr): - (JSC::MacroAssembler::jne32): - (JSC::MacroAssembler::jump): - * assembler/X86Assembler.h: - (JSC::X86::): - (JSC::X86Assembler::): - (JSC::X86Assembler::size): - (JSC::X86Assembler::push_r): - (JSC::X86Assembler::pop_r): - (JSC::X86Assembler::push_i32): - (JSC::X86Assembler::push_m): - (JSC::X86Assembler::pop_m): - (JSC::X86Assembler::addl_rr): - (JSC::X86Assembler::addl_mr): - (JSC::X86Assembler::addl_ir): - (JSC::X86Assembler::addq_ir): - (JSC::X86Assembler::addl_im): - (JSC::X86Assembler::andl_rr): - (JSC::X86Assembler::andl_ir): - (JSC::X86Assembler::orl_rr): - (JSC::X86Assembler::orl_mr): - (JSC::X86Assembler::orl_ir): - (JSC::X86Assembler::subl_rr): - (JSC::X86Assembler::subl_mr): - (JSC::X86Assembler::subl_ir): - (JSC::X86Assembler::subl_im): - (JSC::X86Assembler::xorl_rr): - (JSC::X86Assembler::xorl_ir): - (JSC::X86Assembler::sarl_i8r): - (JSC::X86Assembler::sarl_CLr): - (JSC::X86Assembler::shll_i8r): - (JSC::X86Assembler::shll_CLr): - (JSC::X86Assembler::imull_rr): - (JSC::X86Assembler::imull_i32r): - (JSC::X86Assembler::idivl_r): - (JSC::X86Assembler::cmpl_rr): - (JSC::X86Assembler::cmpl_rm): - (JSC::X86Assembler::cmpl_mr): - (JSC::X86Assembler::cmpl_ir): - (JSC::X86Assembler::cmpl_ir_force32): - (JSC::X86Assembler::cmpl_im): - (JSC::X86Assembler::cmpl_im_force32): - (JSC::X86Assembler::cmpw_rm): - (JSC::X86Assembler::testl_rr): - (JSC::X86Assembler::testl_i32r): - (JSC::X86Assembler::testl_i32m): - (JSC::X86Assembler::testq_rr): - (JSC::X86Assembler::testq_i32r): - (JSC::X86Assembler::testb_i8r): - (JSC::X86Assembler::sete_r): - (JSC::X86Assembler::setz_r): - (JSC::X86Assembler::setne_r): - (JSC::X86Assembler::setnz_r): - (JSC::X86Assembler::cdq): - (JSC::X86Assembler::xchgl_rr): - (JSC::X86Assembler::movl_rr): - (JSC::X86Assembler::movl_rm): - (JSC::X86Assembler::movl_mr): - (JSC::X86Assembler::movl_i32r): - (JSC::X86Assembler::movl_i32m): - (JSC::X86Assembler::movq_rr): - (JSC::X86Assembler::movq_rm): - (JSC::X86Assembler::movq_mr): - (JSC::X86Assembler::movzwl_mr): - (JSC::X86Assembler::movzbl_rr): - (JSC::X86Assembler::leal_mr): - (JSC::X86Assembler::call): - (JSC::X86Assembler::jmp): - (JSC::X86Assembler::jmp_r): - (JSC::X86Assembler::jmp_m): - (JSC::X86Assembler::jne): - (JSC::X86Assembler::jnz): - (JSC::X86Assembler::je): - (JSC::X86Assembler::jl): - (JSC::X86Assembler::jb): - (JSC::X86Assembler::jle): - (JSC::X86Assembler::jbe): - (JSC::X86Assembler::jge): - (JSC::X86Assembler::jg): - (JSC::X86Assembler::ja): - (JSC::X86Assembler::jae): - (JSC::X86Assembler::jo): - (JSC::X86Assembler::jp): - (JSC::X86Assembler::js): - (JSC::X86Assembler::addsd_rr): - (JSC::X86Assembler::addsd_mr): - (JSC::X86Assembler::cvtsi2sd_rr): - (JSC::X86Assembler::cvttsd2si_rr): - (JSC::X86Assembler::movd_rr): - (JSC::X86Assembler::movsd_rm): - (JSC::X86Assembler::movsd_mr): - (JSC::X86Assembler::mulsd_rr): - (JSC::X86Assembler::mulsd_mr): - (JSC::X86Assembler::pextrw_irr): - (JSC::X86Assembler::subsd_rr): - (JSC::X86Assembler::subsd_mr): - (JSC::X86Assembler::ucomis_rr): - (JSC::X86Assembler::int3): - (JSC::X86Assembler::ret): - (JSC::X86Assembler::predictNotTaken): - (JSC::X86Assembler::label): - (JSC::X86Assembler::align): - (JSC::X86Assembler::link): - (JSC::X86Assembler::executableCopy): - (JSC::X86Assembler::X86InstructionFormater::prefix): - (JSC::X86Assembler::X86InstructionFormater::oneByteOp): - (JSC::X86Assembler::X86InstructionFormater::twoByteOp): - (JSC::X86Assembler::X86InstructionFormater::oneByteOp64): - (JSC::X86Assembler::X86InstructionFormater::oneByteOp8): - (JSC::X86Assembler::X86InstructionFormater::twoByteOp8): - (JSC::X86Assembler::X86InstructionFormater::instructionImmediate8): - (JSC::X86Assembler::X86InstructionFormater::instructionImmediate32): - (JSC::X86Assembler::X86InstructionFormater::instructionRel32): - (JSC::X86Assembler::X86InstructionFormater::size): - (JSC::X86Assembler::X86InstructionFormater::isAligned): - (JSC::X86Assembler::X86InstructionFormater::data): - (JSC::X86Assembler::X86InstructionFormater::executableCopy): - (JSC::X86Assembler::X86InstructionFormater::registerModRM): - (JSC::X86Assembler::X86InstructionFormater::memoryModRM): - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompile): - (JSC::JIT::privateCompileCTIMachineTrampolines): - * jit/JITArithmetic.cpp: - (JSC::JIT::putDoubleResultToJSNumberCellOrJSImmediate): - (JSC::JIT::compileBinaryArithOp): - * jit/JITCall.cpp: - (JSC::JIT::compileOpCall): - (JSC::JIT::compileOpCallSlowCase): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::compileGetByIdHotPath): - (JSC::JIT::compilePutByIdHotPath): - (JSC::JIT::privateCompilePutByIdTransition): - (JSC::JIT::privateCompilePatchGetArrayLength): - (JSC::JIT::privateCompileGetByIdProto): - (JSC::JIT::privateCompileGetByIdProtoList): - (JSC::JIT::privateCompileGetByIdChainList): - (JSC::JIT::privateCompileGetByIdChain): - -2008-12-15 Darin Adler <darin@apple.com> + * assembler/AbstractMacroAssembler.h: + * assembler/MacroAssemblerARM.h: + (JSC::MacroAssemblerARM::linkCall): + (JSC::MacroAssemblerARM::repatchCall): + * assembler/MacroAssemblerARMv7.h: + (JSC::MacroAssemblerARMv7::linkCall): + (JSC::MacroAssemblerARMv7::repatchCall): + * assembler/MacroAssemblerX86.h: + (JSC::MacroAssemblerX86::linkCall): + (JSC::MacroAssemblerX86::repatchCall): + * assembler/MacroAssemblerX86_64.h: + (JSC::MacroAssemblerX86_64::linkCall): + (JSC::MacroAssemblerX86_64::repatchCall): - * interpreter/RegisterFile.h: Tweak include formatting. +2009-07-21 Adam Treat <adam.treat@torchmobile.com> -2008-12-15 Holger Hans Peter Freyther <zecke@selfish.org> + Reviewed by George Staikos. - Build fix for Gtk+. + Every wtf file includes other wtf files with <> style includes + except this one. Fix the exception. - * interpreter/RegisterFile.h: Include stdio.h for fprintf + * wtf/ByteArray.h: -2008-12-15 Alexey Proskuryakov <ap@webkit.org> +2009-07-21 Gavin Barraclough <barraclough@apple.com> Reviewed by Oliver Hunt. - <rdar://problem/6444455> Worker Thread crash running multiple workers for a moderate amount of time - - * interpreter/RegisterFile.h: (JSC::RegisterFile::RegisterFile): - Improve error handling: if mmap fails, crash immediately, and print out the reason. - -2008-12-13 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Cameron Zwarich. - - Re-enable WREC on 64-bit. - Implements one of the MacroAssembler::jnzPtr methods, previously only implemented for 32-bit x86. - - https://bugs.webkit.org/show_bug.cgi?id=22849 - - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::testImm64): - (JSC::MacroAssembler::jnzPtr): - * assembler/X86Assembler.h: - (JSC::X86Assembler::testq_i32r): - (JSC::X86Assembler::testq_rr): - * wtf/Platform.h: - -2008-12-13 Gavin Barraclough <barraclough@apple.com> - - Fix PPC builds. - - * assembler/MacroAssembler.h: - -2008-12-13 Gavin Barraclough <barraclough@apple.com> + Move LinkBuffer/RepatchBuffer out of AbstractMacroAssembler. + ( https://bugs.webkit.org/show_bug.cgi?id=27485 ) - Build fix only, no review. + This change is the first step in a process to move code that should be in + the architecture-specific MacroAssembler classes up out of Assmbler and + AbstractMacroAssembler. - * bytecode/CodeBlock.h: - -2008-12-13 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Cameron Zwarich. + * JavaScriptCore.xcodeproj/project.pbxproj: + - added new files + + * assembler/ARMAssembler.h: + (JSC::ARMAssembler::linkPointer): + - rename patchPointer to bring it in line with the current link/repatch naming scheme + + * assembler/ARMv7Assembler.h: + (JSC::ARMv7Assembler::linkCall): + (JSC::ARMv7Assembler::linkPointer): + (JSC::ARMv7Assembler::relinkCall): + (JSC::ARMv7Assembler::repatchInt32): + (JSC::ARMv7Assembler::repatchPointer): + (JSC::ARMv7Assembler::setInt32): + (JSC::ARMv7Assembler::setPointer): + - rename patchPointer to bring it in line with the current link/repatch naming scheme - Port the remainder of the JIT, bar calling convention related code, and code - implementing optimizations which can be disabled, to use the MacroAssembler. + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::linkJump): + (JSC::AbstractMacroAssembler::linkCall): + (JSC::AbstractMacroAssembler::linkPointer): + (JSC::AbstractMacroAssembler::getLinkerAddress): + (JSC::AbstractMacroAssembler::getLinkerCallReturnOffset): + (JSC::AbstractMacroAssembler::repatchJump): + (JSC::AbstractMacroAssembler::repatchCall): + (JSC::AbstractMacroAssembler::repatchNearCall): + (JSC::AbstractMacroAssembler::repatchInt32): + (JSC::AbstractMacroAssembler::repatchPointer): + (JSC::AbstractMacroAssembler::repatchLoadPtrToLEA): + - remove the LinkBuffer/RepatchBuffer classes, but leave a set of (private, friended) methods to interface to the Assembler + + * assembler/LinkBuffer.h: Added. + (JSC::LinkBuffer::LinkBuffer): + (JSC::LinkBuffer::~LinkBuffer): + (JSC::LinkBuffer::link): + (JSC::LinkBuffer::patch): + (JSC::LinkBuffer::locationOf): + (JSC::LinkBuffer::locationOfNearCall): + (JSC::LinkBuffer::returnAddressOffset): + (JSC::LinkBuffer::finalizeCode): + (JSC::LinkBuffer::finalizeCodeAddendum): + (JSC::LinkBuffer::code): + (JSC::LinkBuffer::performFinalization): + - new file containing the LinkBuffer class, previously a member of AbstractMacroAssembler + + * assembler/RepatchBuffer.h: Added. + (JSC::RepatchBuffer::RepatchBuffer): + (JSC::RepatchBuffer::relink): + (JSC::RepatchBuffer::repatch): + (JSC::RepatchBuffer::repatchLoadPtrToLEA): + (JSC::RepatchBuffer::relinkCallerToTrampoline): + (JSC::RepatchBuffer::relinkCallerToFunction): + (JSC::RepatchBuffer::relinkNearCallerToTrampoline): + - new file containing the RepatchBuffer class, previously a member of AbstractMacroAssembler - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::DataLabelPtr::DataLabelPtr): - (JSC::MacroAssembler::RepatchBuffer::RepatchBuffer): - (JSC::MacroAssembler::RepatchBuffer::link): - (JSC::MacroAssembler::RepatchBuffer::addressOf): - (JSC::MacroAssembler::RepatchBuffer::setPtr): - (JSC::MacroAssembler::addPtr): - (JSC::MacroAssembler::lshift32): - (JSC::MacroAssembler::mod32): - (JSC::MacroAssembler::rshift32): - (JSC::MacroAssembler::storePtrWithRepatch): - (JSC::MacroAssembler::jnzPtr): - (JSC::MacroAssembler::jzPtr): - (JSC::MacroAssembler::jump): - (JSC::MacroAssembler::label): * assembler/X86Assembler.h: - (JSC::X86Assembler::): - (JSC::X86Assembler::xchgl_rr): - (JSC::X86Assembler::jmp_m): - (JSC::X86Assembler::repatchAddress): - (JSC::X86Assembler::getRelocatedAddress): - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::CodeBlock): - * bytecode/CodeBlock.h: - (JSC::JITCodeRef::JITCodeRef): - (JSC::CodeBlock::setJITCode): - (JSC::CodeBlock::jitCode): - (JSC::CodeBlock::executablePool): - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileLinkPass): - (JSC::JIT::privateCompile): - (JSC::JIT::privateCompileCTIMachineTrampolines): - * jit/JIT.h: - (JSC::CallRecord::CallRecord): - (JSC::JumpTable::JumpTable): - (JSC::JIT::emitCTICall): - (JSC::JIT::JSRInfo::JSRInfo): - * jit/JITArithmetic.cpp: - * jit/JITCall.cpp: - * jit/JITInlineMethods.h: - (JSC::JIT::emitNakedCall): - (JSC::JIT::emitCTICall_internal): - (JSC::JIT::checkStructure): - (JSC::JIT::emitFastArithDeTagImmediateJumpIfZero): - (JSC::JIT::addSlowCase): - (JSC::JIT::addJump): - (JSC::JIT::emitJumpSlowToHot): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::privateCompileGetByIdChainList): - (JSC::JIT::privateCompileGetByIdChain): - -2008-12-12 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Sam Weinig. - - Fix the failures of the following layout tests, which regressed in - r39255: - - fast/dom/StyleSheet/ownerNode-lifetime-2.html - fast/xsl/transform-xhr-doc.xhtml - - The binary search in CodeBlock::getByIdExceptionInfoForBytecodeOffset() - doesn't guarantee that it actually finds a match, so add an explicit check - for this. - - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::getByIdExceptionInfoForBytecodeOffset): - -2008-12-12 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Cameron Zwarich. - - Replace emitPutCallArg methods with emitPutJITStubArg methods. Primarily to make the argument numbering - more sensible (1-based incrementing by 1, rather than 0-based incrementing by 4). The CTI name also seems - to be being deprecated from the code generally. - - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): - (JSC::JIT::privateCompileCTIMachineTrampolines): - * jit/JIT.h: - * jit/JITArithmetic.cpp: - (JSC::JIT::compileBinaryArithOp): - (JSC::JIT::compileBinaryArithOpSlowCase): - * jit/JITCall.cpp: - (JSC::JIT::compileOpCallSetupArgs): - (JSC::JIT::compileOpCallEvalSetupArgs): - (JSC::JIT::compileOpConstructSetupArgs): - (JSC::JIT::compileOpCall): - * jit/JITInlineMethods.h: - (JSC::JIT::emitPutJITStubArg): - (JSC::JIT::emitPutJITStubArgConstant): - (JSC::JIT::emitGetJITStubArg): - (JSC::JIT::emitPutJITStubArgFromVirtualRegister): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::compileGetByIdHotPath): - (JSC::JIT::compilePutByIdHotPath): - (JSC::JIT::compileGetByIdSlowCase): - (JSC::JIT::compilePutByIdSlowCase): - -2008-12-12 Gavin Barraclough <barraclough@apple.com> - - Fix windows builds. + (JSC::X86Assembler::linkJump): + (JSC::X86Assembler::linkCall): + (JSC::X86Assembler::linkPointerForCall): + (JSC::X86Assembler::linkPointer): + (JSC::X86Assembler::relinkJump): + (JSC::X86Assembler::relinkCall): + (JSC::X86Assembler::repatchInt32): + (JSC::X86Assembler::repatchPointer): + (JSC::X86Assembler::setPointer): + (JSC::X86Assembler::setInt32): + (JSC::X86Assembler::setRel32): + - rename patchPointer to bring it in line with the current link/repatch naming scheme * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): - (JSC::JIT::privateCompile): - -2008-12-12 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. - - Remove loop counter 'i' from the JIT generation passes, replace with a member m_bytecodeIndex. - - No impact on performance. + (JSC::ctiPatchNearCallByReturnAddress): + (JSC::ctiPatchCallByReturnAddress): + - include new headers + - remove MacroAssembler:: specification from RepatchBuffer usage - * jit/JIT.cpp: - (JSC::JIT::compileOpStrictEq): - (JSC::JIT::emitSlowScriptCheck): - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): - (JSC::JIT::privateCompile): - * jit/JIT.h: - (JSC::CallRecord::CallRecord): - (JSC::JmpTable::JmpTable): - (JSC::JIT::emitCTICall): - * jit/JITArithmetic.cpp: - (JSC::JIT::compileBinaryArithOp): - (JSC::JIT::compileBinaryArithOpSlowCase): - * jit/JITCall.cpp: - (JSC::JIT::compileOpCall): - (JSC::JIT::compileOpCallSlowCase): - * jit/JITInlineMethods.h: - (JSC::JIT::emitGetVirtualRegister): - (JSC::JIT::emitGetVirtualRegisters): - (JSC::JIT::emitNakedCall): - (JSC::JIT::emitCTICall_internal): - (JSC::JIT::emitJumpSlowCaseIfJSCell): - (JSC::JIT::emitJumpSlowCaseIfNotJSCell): - (JSC::JIT::emitJumpSlowCaseIfNotImmNum): - (JSC::JIT::emitJumpSlowCaseIfNotImmNums): - (JSC::JIT::emitFastArithIntToImmOrSlowCase): - (JSC::JIT::addSlowCase): - (JSC::JIT::addJump): - (JSC::JIT::emitJumpSlowToHot): * jit/JITPropertyAccess.cpp: - (JSC::JIT::compileGetByIdHotPath): - (JSC::JIT::compileGetByIdSlowCase): - (JSC::JIT::compilePutByIdHotPath): - (JSC::JIT::compilePutByIdSlowCase): - -2008-12-12 Sam Weinig <sam@webkit.org> - - Reviewed by Cameron Zwarich. - - <rdar://problem/6428342> Look into feasibility of discarding bytecode after native codegen - - Move more JIT functionality to using offsets into the Instruction buffer - instead of raw pointers. Two to go! - - * interpreter/Interpreter.cpp: - (JSC::bytecodeOffsetForPC): Rename from vPCForPC. - (JSC::Interpreter::resolve): Pass offset to exception helper. - (JSC::Interpreter::resolveSkip): Ditto. - (JSC::Interpreter::resolveGlobal): Ditto. - (JSC::Interpreter::resolveBaseAndProperty): Ditto. - (JSC::Interpreter::resolveBaseAndFunc): Ditto. - (JSC::isNotObject): Ditto. - (JSC::Interpreter::unwindCallFrame): Call bytecodeOffsetForPC. - (JSC::Interpreter::throwException): Use offsets instead of vPCs. - (JSC::Interpreter::privateExecute): Pass offset to exception helper. - (JSC::Interpreter::retrieveLastCaller): Ditto. - (JSC::Interpreter::cti_op_instanceof): Ditto. - (JSC::Interpreter::cti_op_call_NotJSFunction): Ditto. - (JSC::Interpreter::cti_op_resolve): Pass offset to exception helper. - (JSC::Interpreter::cti_op_construct_NotJSConstruct): Ditto. - (JSC::Interpreter::cti_op_resolve_func): Ditto. - (JSC::Interpreter::cti_op_resolve_skip): Ditto. - (JSC::Interpreter::cti_op_resolve_global): Ditto. - (JSC::Interpreter::cti_op_resolve_with_base): Ditto. - (JSC::Interpreter::cti_op_throw): Ditto. - (JSC::Interpreter::cti_op_in): Ditto. - (JSC::Interpreter::cti_vm_throw): Ditto. - * interpreter/Interpreter.h: - - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): Don't pass unnecessary vPC to stub. - * jit/JIT.h: Remove ARG_instr1 - ARG_instr3 and ARG_instr5 - ARG_instr6. - * jit/JITCall.cpp: - (JSC::JIT::compileOpCallEvalSetupArgs): Don't pass unnecessary vPC to stub.. - (JSC::JIT::compileOpConstructSetupArgs): Ditto. - - * runtime/ExceptionHelpers.cpp: - (JSC::createUndefinedVariableError): Take an offset instead of vPC. - (JSC::createInvalidParamError): Ditto. - (JSC::createNotAConstructorError): Ditto. - (JSC::createNotAFunctionError): Ditto. - (JSC::createNotAnObjectError): Ditto. - * runtime/ExceptionHelpers.h: - -2008-12-12 Cameron Zwarich <zwarich@apple.com> + * yarr/RegexJIT.cpp: + - include new headers - Reviewed by Oliver Hunt. +2009-07-21 Robert Agoston <Agoston.Robert@stud.u-szeged.hu> - Bug 22835: Crash during bytecode generation when comparing to null - <https://bugs.webkit.org/show_bug.cgi?id=22835> - <rdar://problem/6286749> + Reviewed by David Levin. - Change the special cases in bytecode generation for comparison to null - to use tempDestination(). + Fixed #undef typo. + https://bugs.webkit.org/show_bug.cgi?id=27506 - * parser/Nodes.cpp: - (JSC::BinaryOpNode::emitBytecode): - (JSC::EqualNode::emitBytecode): + * bytecode/Opcode.h: -2008-12-12 Gavin Barraclough <barraclough@apple.com> +2009-07-21 Adam Roben <aroben@apple.com> - Reviewed by Geoff Garen. + Roll out r46153, r46154, and r46155 - Move slow-cases of JIT code generation over to the MacroAssembler interface. + These changes were causing build failures and assertion failures on + Windows. - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::Label::Label): - (JSC::MacroAssembler::jae32): - (JSC::MacroAssembler::jg32): - (JSC::MacroAssembler::jzPtr): - * jit/JIT.cpp: - (JSC::JIT::privateCompileSlowCases): - (JSC::JIT::privateCompile): - (JSC::JIT::emitGetVariableObjectRegister): - (JSC::JIT::emitPutVariableObjectRegister): - * jit/JIT.h: - (JSC::SlowCaseEntry::SlowCaseEntry): - (JSC::JIT::getSlowCase): - (JSC::JIT::linkSlowCase): - * jit/JITArithmetic.cpp: - (JSC::JIT::compileBinaryArithOpSlowCase): - * jit/JITCall.cpp: - (JSC::JIT::compileOpCallInitializeCallFrame): - (JSC::JIT::compileOpCall): - (JSC::JIT::compileOpCallSlowCase): - * jit/JITInlineMethods.h: - (JSC::JIT::emitJumpSlowCaseIfNotJSCell): - (JSC::JIT::linkSlowCaseIfNotJSCell): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::compileGetByIdHotPath): - (JSC::JIT::compilePutByIdHotPath): - (JSC::JIT::compileGetByIdSlowCase): - (JSC::JIT::compilePutByIdSlowCase): + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + * JavaScriptCore.xcodeproj/project.pbxproj: + * runtime/JSArray.cpp: + * runtime/StringPrototype.cpp: + * runtime/UString.cpp: + * runtime/UString.h: + * wtf/FastMalloc.cpp: + * wtf/FastMalloc.h: + * wtf/Platform.h: + * wtf/PossiblyNull.h: Removed. -2008-12-12 Cameron Zwarich <zwarich@apple.com> +2009-07-21 Roland Steiner <rolandsteiner@google.com> - Reviewed by Sam Weinig. + Reviewed by David Levin. - Bug 22828: Do not inspect bytecode instruction stream for op_get_by_id exception information - <https://bugs.webkit.org/show_bug.cgi?id=22828> + Add ENABLE_RUBY to list of build options + https://bugs.webkit.org/show_bug.cgi?id=27324 - In order to remove the bytecode instruction stream after generating - native code, all inspection of bytecode instructions at runtime must - be removed. One particular instance of this is the special handling of - exceptions thrown by the op_get_by_id emitted directly before an - op_construct or an op_instanceof. This patch moves that information to - an auxiliary data structure in CodeBlock. + * Configurations/FeatureDefines.xcconfig: Added flag ENABLE_RUBY. - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::getByIdExceptionInfoForBytecodeOffset): - * bytecode/CodeBlock.h: - (JSC::CodeBlock::addGetByIdExceptionInfo): - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::emitConstruct): - * bytecompiler/BytecodeGenerator.h: - (JSC::BytecodeGenerator::emitGetByIdExceptionInfo): - * parser/Nodes.cpp: - (JSC::InstanceOfNode::emitBytecode): - * runtime/ExceptionHelpers.cpp: - (JSC::createNotAnObjectError): +2009-07-20 Oliver Hunt <oliver@apple.com> -2008-12-12 Sam Weinig <sam@webkit.org> + Reviewed by NOBODY (Build fix). - Reviewed by Geoffrey Garen. + Build fix attempt #2 - Change exception information accessors to take offsets into the bytecode - instruction buffer instead of pointers so that they can work even even - if the bytecode buffer is purged. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - * bytecode/CodeBlock.cpp: - (JSC::instructionOffsetForNth): - (JSC::CodeBlock::handlerForBytecodeOffset): - (JSC::CodeBlock::lineNumberForBytecodeOffset): - (JSC::CodeBlock::expressionRangeForBytecodeOffset): - * bytecode/CodeBlock.h: - * bytecode/SamplingTool.cpp: - (JSC::SamplingTool::dump): - * interpreter/Interpreter.cpp: - (JSC::Interpreter::throwException): - (JSC::Interpreter::privateExecute): - (JSC::Interpreter::retrieveLastCaller): - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - * runtime/ExceptionHelpers.cpp: - (JSC::createUndefinedVariableError): - (JSC::createInvalidParamError): - (JSC::createNotAConstructorError): - (JSC::createNotAFunctionError): - (JSC::createNotAnObjectError): +2009-07-20 Oliver Hunt <oliver@apple.com> -2008-12-12 Geoffrey Garen <ggaren@apple.com> + Reviewed by NOBODY (Build fix). - Reviewed by Cameron Zwarich. - - Tiny bit of refactoring in quantifier generation. + Build fix attempt #1 - * wrec/WRECGenerator.cpp: - (JSC::WREC::Generator::generateNonGreedyQuantifier): - (JSC::WREC::Generator::generateGreedyQuantifier): + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: -2008-12-11 Sam Weinig <sam@webkit.org> +2009-07-20 Oliver Hunt <oliver@apple.com> - Reviewed by Geoffrey Garen. + Reviewed by Gavin Barraclough. - Remove dependancy on having the Instruction buffer in order to - deref Structures used for property access and global resolves. - Instead, we put references to the necessary Structures in auxiliary - data structures on the CodeBlock. This is not an ideal solution, - as we still pay for having the Structures in two places and we - would like to eventually just hold on to offsets into the machine - code buffer. + Make it harder to misuse try* allocation routines + https://bugs.webkit.org/show_bug.cgi?id=27469 - - Also removes CodeBlock bloat in non-JIT by #ifdefing the JIT - only data structures. + Jump through a few hoops to make it much harder to accidentally + miss null-checking of values returned by the try-* allocation + routines. - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.scons: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * bytecode/CodeBlock.cpp: - (JSC::isGlobalResolve): - (JSC::isPropertyAccess): - (JSC::instructionOffsetForNth): - (JSC::printGlobalResolveInfo): - (JSC::printStructureStubInfo): - (JSC::CodeBlock::printStructures): - (JSC::CodeBlock::dump): - (JSC::CodeBlock::~CodeBlock): - (JSC::CodeBlock::shrinkToFit): - * bytecode/CodeBlock.h: - (JSC::GlobalResolveInfo::GlobalResolveInfo): - (JSC::getNativePC): - (JSC::CodeBlock::instructions): - (JSC::CodeBlock::getStubInfo): - (JSC::CodeBlock::getBytecodeIndex): - (JSC::CodeBlock::addPropertyAccessInstruction): - (JSC::CodeBlock::addGlobalResolveInstruction): - (JSC::CodeBlock::numberOfStructureStubInfos): - (JSC::CodeBlock::addStructureStubInfo): - (JSC::CodeBlock::structureStubInfo): - (JSC::CodeBlock::addGlobalResolveInfo): - (JSC::CodeBlock::globalResolveInfo): - (JSC::CodeBlock::numberOfCallLinkInfos): - (JSC::CodeBlock::addCallLinkInfo): - (JSC::CodeBlock::callLinkInfo): - * bytecode/Instruction.h: - (JSC::PolymorphicAccessStructureList::PolymorphicStubInfo::set): - (JSC::PolymorphicAccessStructureList::PolymorphicAccessStructureList): - * bytecode/Opcode.h: - (JSC::): - * bytecode/StructureStubInfo.cpp: Copied from bytecode/CodeBlock.cpp. - (JSC::StructureStubInfo::deref): - * bytecode/StructureStubInfo.h: Copied from bytecode/CodeBlock.h. - (JSC::StructureStubInfo::StructureStubInfo): - (JSC::StructureStubInfo::initGetByIdSelf): - (JSC::StructureStubInfo::initGetByIdProto): - (JSC::StructureStubInfo::initGetByIdChain): - (JSC::StructureStubInfo::initGetByIdSelfList): - (JSC::StructureStubInfo::initGetByIdProtoList): - (JSC::StructureStubInfo::initPutByIdTransition): - (JSC::StructureStubInfo::initPutByIdReplace): - (JSC::StructureStubInfo::): - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::emitResolve): - (JSC::BytecodeGenerator::emitGetById): - (JSC::BytecodeGenerator::emitPutById): - (JSC::BytecodeGenerator::emitCall): - (JSC::BytecodeGenerator::emitConstruct): - (JSC::BytecodeGenerator::emitCatch): - * interpreter/Interpreter.cpp: - (JSC::Interpreter::tryCTICachePutByID): - (JSC::Interpreter::tryCTICacheGetByID): - (JSC::Interpreter::cti_op_get_by_id_self_fail): - (JSC::getPolymorphicAccessStructureListSlot): - (JSC::Interpreter::cti_op_get_by_id_proto_list): - (JSC::Interpreter::cti_op_resolve_global): - * jit/JIT.cpp: - (JSC::JIT::JIT): - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): - (JSC::JIT::privateCompile): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::compileGetByIdHotPath): - (JSC::JIT::compilePutByIdHotPath): - (JSC::JIT::compileGetByIdSlowCase): - (JSC::JIT::compilePutByIdSlowCase): - (JSC::JIT::privateCompileGetByIdSelfList): - (JSC::JIT::privateCompileGetByIdProtoList): - (JSC::JIT::privateCompileGetByIdChainList): - -2008-12-11 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Remove CTI_ARGUMENTS mode, use va_start implementation on Windows, - unifying JIT callback (cti_*) argument access on OS X & Windows - - No performance impact. - - * interpreter/Interpreter.h: - * jit/JIT.cpp: - (JSC::JIT::privateCompileCTIMachineTrampolines): - * jit/JIT.h: - * jit/JITInlineMethods.h: - (JSC::JIT::emitCTICall): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::privateCompilePutByIdTransition): + * runtime/JSArray.cpp: + (JSC::JSArray::putSlowCase): + (JSC::JSArray::increaseVectorLength): + * runtime/StringPrototype.cpp: + (JSC::stringProtoFuncFontsize): + (JSC::stringProtoFuncLink): + * runtime/UString.cpp: + (JSC::allocChars): + (JSC::reallocChars): + (JSC::expandCapacity): + (JSC::UString::Rep::reserveCapacity): + (JSC::UString::expandPreCapacity): + (JSC::createRep): + (JSC::concatenate): + (JSC::UString::spliceSubstringsWithSeparators): + (JSC::UString::replaceRange): + (JSC::UString::append): + (JSC::UString::operator=): + * runtime/UString.h: + (JSC::UString::Rep::createEmptyBuffer): + * wtf/FastMalloc.cpp: + (WTF::tryFastZeroedMalloc): + (WTF::tryFastMalloc): + (WTF::tryFastCalloc): + (WTF::tryFastRealloc): + (WTF::TCMallocStats::tryFastMalloc): + (WTF::TCMallocStats::tryFastCalloc): + (WTF::TCMallocStats::tryFastRealloc): + * wtf/FastMalloc.h: + (WTF::TryMallocReturnValue::TryMallocReturnValue): + (WTF::TryMallocReturnValue::~TryMallocReturnValue): + (WTF::TryMallocReturnValue::operator Maybe<T>): + (WTF::TryMallocReturnValue::getValue): + * wtf/PossiblyNull.h: + (WTF::PossiblyNull::PossiblyNull): + (WTF::PossiblyNull::~PossiblyNull): + (WTF::PossiblyNull::getValue): * wtf/Platform.h: -2008-12-11 Holger Freyther <zecke@selfish.org> - - Reviewed by Simon Hausmann. - - https://bugs.webkit.org/show_bug.cgi?id=20953 - - For Qt it is not pratical to have a FontCache and GlyphPageTreeNode - implementation. This is one of the reasons why the Qt port is currently not - using WebCore/platform/graphics/Font.cpp. By allowing to not use - the simple/fast-path the Qt port will be able to use it. +2009-07-20 Gavin Barraclough <barraclough@apple.com> - Introduce USE(FONT_FAST_PATH) and define it for every port but the - Qt one. + RS Oliver Hunt. - * wtf/Platform.h: Enable USE(FONT_FAST_PATH) + Add ARM assembler files to xcodeproj, for convenience editing. -2008-12-11 Gabor Loki <loki@inf.u-szeged.hu> - - Reviewed by Darin Adler and landed by Holger Freyther. - - <https://bugs.webkit.org/show_bug.cgi?id=22648> - Fix threading on Qt-port and Gtk-port for Sampling tool. - - * wtf/ThreadingGtk.cpp: - (WTF::waitForThreadCompletion): - * wtf/ThreadingQt.cpp: - (WTF::waitForThreadCompletion): - -2008-12-10 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Oliver Hunt. - - Bug 22734: Debugger crashes when stepping into a function call in a return statement - <https://bugs.webkit.org/show_bug.cgi?id=22734> - <rdar://problem/6426796> - - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::BytecodeGenerator): The DebuggerCallFrame uses - the 'this' value stored in a callFrame, so op_convert_this should be - emitted at the beginning of a function body when generating bytecode - with debug hooks. - * debugger/DebuggerCallFrame.cpp: - (JSC::DebuggerCallFrame::thisObject): The assertion inherent in the call - to asObject() here is valid, because any 'this' value should have been - converted to a JSObject*. + * JavaScriptCore.xcodeproj/project.pbxproj: -2008-12-10 Gavin Barraclough <barraclough@apple.com> +2009-07-20 Jessie Berlin <jberlin@apple.com> - Reviewed by Geoff Garen. + Reviewed by David Levin. - Port more of the JIT to use the MacroAssembler interface. + Fix an incorrect assertion in Vector::remove. - Everything in the main pass, bar a few corner cases (operations with required - registers, or calling convention code). Slightly refactors array creation, - moving the offset calculation into the callFrame into C code (reducing code - planted). - - Overall this appears to be a 1% win on v8-tests, due to the smaller immediates - being planted (in jfalse in particular). + https://bugs.webkit.org/show_bug.cgi?id=27477 - * interpreter/Interpreter.cpp: - (JSC::Interpreter::cti_op_new_array): - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): - * jit/JIT.h: - * wrec/WRECGenerator.cpp: - (JSC::WREC::Generator::generateEnter): - -2008-12-10 Sam Weinig <sam@webkit.org> - - Fix non-JIT builds. - - * bytecode/CodeBlock.h: - -2008-12-10 Sam Weinig <sam@webkit.org> - - Reviewed by Geoffrey Garen. - - <rdar://problem/6428332> Remove the CTI return address table from CodeBlock - - Step 2: - - Convert the return address table from a HashMap to a sorted Vector. This - reduces the size of the data structure by ~4.5MB on Membuster head. + * wtf/Vector.h: + (WTF::::remove): + Assert that the position at which to start removing elements + the + length (the number of elements to remove) is less than or equal to the + size of the entire Vector. - SunSpider reports a 0.5% progression. +2009-07-20 Peter Kasting <pkasting@google.com> - * bytecode/CodeBlock.cpp: - (JSC::sizeInBytes): Generic method to get the cost of a Vector. - (JSC::CodeBlock::dumpStatistics): Add dumping of member sizes. - * bytecode/CodeBlock.h: - (JSC::PC::PC): Struct representing NativePC -> VirtualPC mappings. - (JSC::getNativePC): Helper for binary chop. - (JSC::CodeBlock::getBytecodeIndex): Used to get the VirtualPC from a - NativePC using a binary chop of the pcVector. - (JSC::CodeBlock::pcVector): Accessor. + Reviewed by Mark Rowe. - * interpreter/Interpreter.cpp: - (JSC::vPCForPC): Use getBytecodeIndex instead of jitReturnAddressVPCMap().get(). - (JSC::Interpreter::cti_op_instanceof): Ditto. - (JSC::Interpreter::cti_op_resolve): Ditto. - (JSC::Interpreter::cti_op_resolve_func): Ditto. - (JSC::Interpreter::cti_op_resolve_skip): Ditto. - (JSC::Interpreter::cti_op_resolve_with_base): Ditto. - (JSC::Interpreter::cti_op_throw): Ditto. - (JSC::Interpreter::cti_op_in): Ditto. - (JSC::Interpreter::cti_vm_throw): Ditto. + https://bugs.webkit.org/show_bug.cgi?id=27468 + Back out r46060, which caused problems for some Apple developers. - * jit/JIT.cpp: - (JSC::JIT::privateCompile): Reserve exact capacity and fill the pcVector. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreCommon.vsprops: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.vcproj: + * JavaScriptCore.vcproj/WTF/WTFCommon.vsprops: + * JavaScriptCore.vcproj/jsc/jscCommon.vsprops: + * JavaScriptCore.vcproj/testapi/testapiCommon.vsprops: -2008-12-09 Geoffrey Garen <ggaren@apple.com> +2009-07-20 Zoltan Horvath <hzoltan@inf.u-szeged.hu> Reviewed by Oliver Hunt. - Added WREC support for an assertion followed by a quantifier. Fixed - PCRE to match. - - * wrec/WRECParser.cpp: - (JSC::WREC::Parser::parseParentheses): Throw away the quantifier, since - it's meaningless. (Firefox does the same.) - - * pcre/pcre_compile.cpp: - (compileBranch): ditto. - -2008-12-09 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Cameron Zwarich. - - In preparation for compiling WREC without PCRE: - - Further relaxed WREC's parsing to be more web-compatible. Fixed PCRE to - match in cases where it didn't already. - - Changed JavaScriptCore to report syntax errors detected by WREC, rather - than falling back on PCRE any time WREC sees an error. - - * pcre/pcre_compile.cpp: - (checkEscape): Relaxed parsing of \c and \N escapes to be more - web-compatible. - - * runtime/RegExp.cpp: - (JSC::RegExp::RegExp): Only fall back on PCRE if WREC has not reported - a syntax error. - - * wrec/WREC.cpp: - (JSC::WREC::Generator::compileRegExp): Fixed some error reporting to - match PCRE. - - * wrec/WRECParser.cpp: Added error messages that match PCRE. - - (JSC::WREC::Parser::consumeGreedyQuantifier): - (JSC::WREC::Parser::parseParentheses): - (JSC::WREC::Parser::parseCharacterClass): - (JSC::WREC::Parser::parseNonCharacterEscape): Updated the above functions to - use the new setError API. - - (JSC::WREC::Parser::consumeEscape): Relaxed parsing of \c \N \u \x \B - to be more web-compatible. - - (JSC::WREC::Parser::parseAlternative): Distinguish between a malformed - quantifier and a quantifier with no prefix, like PCRE does. + Allow custom memory allocation control in NewThreadContext + https://bugs.webkit.org/show_bug.cgi?id=27338 - (JSC::WREC::Parser::consumeParenthesesType): Updated to use the new setError API. + Inherits NewThreadContext struct from FastAllocBase because it + has been instantiated by 'new' JavaScriptCore/wtf/Threading.cpp:76. - * wrec/WRECParser.h: - (JSC::WREC::Parser::error): - (JSC::WREC::Parser::syntaxError): - (JSC::WREC::Parser::parsePattern): - (JSC::WREC::Parser::reset): - (JSC::WREC::Parser::setError): Store error messages instead of error codes, - to provide for exception messages. Use a setter for reporting errors, so - errors detected early are not overwritten by errors detected later. + * wtf/Threading.cpp: -2008-12-09 Gavin Barraclough <barraclough@apple.com> +2009-07-20 Zoltan Horvath <hzoltan@inf.u-szeged.hu> Reviewed by Oliver Hunt. - Use va_args to access cti function arguments. - https://bugs.webkit.org/show_bug.cgi?id=22774 - - This may be a minor regression, but we'll take the hit if so to reduce fragility. - - * interpreter/Interpreter.cpp: - * interpreter/Interpreter.h: - -2008-12-09 Sam Weinig <sam@webkit.org> - - Reviewed twice by Cameron Zwarich. - - Fix for https://bugs.webkit.org/show_bug.cgi?id=22752 - Clear SymbolTable after codegen for Function codeblocks that - don't require an activation - - This is a ~1.5MB improvement on Membuster-head. - - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::dumpStatistics): Add logging of non-empty symbol tables - and total size used by symbol tables. - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::generate): Clear the symbol table here. - -2008-12-09 Sam Weinig <sam@webkit.org> - - Reviewed by Geoffrey Garen. - - Remove unnecessary extra lookup when throwing an exception. - We used to first lookup the target offset using getHandlerForVPC - and then we would lookup the native code stub using - nativeExceptionCodeForHandlerVPC. Instead, we can just pass around - the HandlerInfo. - - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::handlerForVPC): Return the HandlerInfo. - * bytecode/CodeBlock.h: Remove nativeExceptionCodeForHandlerVPC. - - * interpreter/Interpreter.cpp: - (JSC::Interpreter::throwException): Return a HandlerInfo instead of - and Instruction offset. - (JSC::Interpreter::privateExecute): Get the offset from HandlerInfo. - (JSC::Interpreter::cti_op_throw): Get the native code from the HandleInfo. - (JSC::Interpreter::cti_vm_throw): Ditto. - * interpreter/Interpreter.h: - -2008-12-09 Eric Seidel <eric@webkit.org> - - Build fix only, no review. - - Speculative fix for the Chromium-Windows bot. - Add JavaScriptCore/os-win32 to the include path (for stdint.h) - Strangely it builds fine on my local windows box (or at least doesn't hit this error) - - * JavaScriptCore.scons: - -2008-12-09 Eric Seidel <eric@webkit.org> - - No review, build fix only. - - Add ExecutableAllocator files missing from Scons build. - - * JavaScriptCore.scons: + Allow custom memory allocation control in JavaScriptCore's JSClassRef.h + https://bugs.webkit.org/show_bug.cgi?id=27340 -2008-12-09 Dimitri Glazkov <dglazkov@chromium.org> + Inherit StaticValueEntry and StaticFunctionEntry struct from FastAllocBase because these + have been instantiated by 'new' in JavaScriptCore/API/JSClassRef.cpp:153 + and in JavaScriptCore/API/JSClassRef.cpp:166. - Reviewed by Timothy Hatcher. - - https://bugs.webkit.org/show_bug.cgi?id=22631 - Allow ScriptCallFrame query names of functions in the call stack. + * API/JSClassRef.h: - * JavaScriptCore.exp: added InternalFunction::name and - UString operator==() as exported symbol +2009-07-20 Zoltan Horvath <hzoltan@inf.u-szeged.hu> -2008-12-08 Judit Jasz <jasy@inf.u-szeged.hu> + Reviewed by Darin Adler. - Reviewed and tweaked by Cameron Zwarich. + Allow custom memory allocation control in JavaScriptCore's RegexPattern.h + https://bugs.webkit.org/show_bug.cgi?id=27343 - Bug 22352: Annotate opcodes with their length - <https://bugs.webkit.org/show_bug.cgi?id=22352> + Inherits RegexPattern.h's structs (which have been instantiated by operator new) from FastAllocBase: - * bytecode/Opcode.cpp: - * bytecode/Opcode.h: - * interpreter/Interpreter.cpp: - (JSC::Interpreter::privateExecute): - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): + CharacterClass (new call: JavaScriptCore/yarr/RegexCompiler.cpp:144) + PatternAlternative (new call: JavaScriptCore/yarr/RegexPattern.h:221) + PatternDisjunction (new call: JavaScriptCore/yarr/RegexCompiler.cpp:446) -2008-12-08 Geoffrey Garen <ggaren@apple.com> + * yarr/RegexPattern.h: - Reviewed by Oliver Hunt. - - Implemented more of the relaxed and somewhat weird rules for deciding - how to interpret a non-pattern-character. - - * wrec/Escapes.h: - (JSC::WREC::Escape::): - (JSC::WREC::Escape::Escape): Eliminated Escape::None because it was - unused. If you see an '\\', it's either a valid escape or an error. - - * wrec/Quantifier.h: - (JSC::WREC::Quantifier::Quantifier): - * wrec/WRECGenerator.cpp: - (JSC::WREC::Generator::generateNonGreedyQuantifier): - (JSC::WREC::Generator::generateGreedyQuantifier): Renamed "noMaxSpecified" - to "Infinity", since that's what it means. - - * wrec/WRECParser.cpp: - (JSC::WREC::Parser::consumeGreedyQuantifier): Re-wrote {n,m} parsing rules - because they were too strict before. Added support for backtracking - in the case where the {n,m} fails to parse as a quantifier, and yet is - not a syntax error. - - (JSC::WREC::Parser::parseCharacterClass): - (JSC::WREC::Parser::parseNonCharacterEscape): Eliminated Escape::None, - as above. - - (JSC::WREC::Parser::consumeEscape): Don't treat ASCII and _ escapes - as syntax errors. See fast/regex/non-pattern-characters.html. - - * wrec/WRECParser.h: - (JSC::WREC::Parser::SavedState::SavedState): - (JSC::WREC::Parser::SavedState::restore): Added a state backtracker, - since parsing {n,m} forms requires backtracking if the form turns out - not to be a quantifier. +2009-07-20 Zoltan Horvath <hzoltan@inf.u-szeged.hu> -2008-12-08 Geoffrey Garen <ggaren@apple.com> + Reviewed by Darin Adler. - Reviewed by Oliver Hunt. - - Refactored WREC parsing so that only one piece of code needs to know - the relaxed and somewhat weird rules for deciding how to interpret a - non-pattern-character, in preparation for implementing those rules. - - Also, implemented the relaxed and somewhat weird rules for '}' and ']'. + Allow custom memory allocation control for JavaScriptCore's MatchFrame struct + https://bugs.webkit.org/show_bug.cgi?id=27344 - * wrec/WREC.cpp: Reduced the regular expression size limit. Now that - WREC handles ']' properly, it compiles fast/js/regexp-charclass-crash.html, - which makes it hang at the old limit. (The old limit was based on the - misimpression that the same value in PCRE limited the regular expression - pattern size; in reality, it limited the expected compiled regular - expression size. WREC doesn't have a way to calculate an expected - compiled regular expression size, but this should be good enough.) + Inherits MatchFrame struct from FastAllocBase because it has + been instantiated by 'new' JavaScriptCore/pcre/pcre_exec.cpp:359. - * wrec/WRECParser.cpp: - (JSC::WREC::parsePatternCharacterSequence): Nixed this function because - it contained a second copy of the logic for handling non-pattern-characters, - which is about to get a lot more complicated. + * pcre/pcre_exec.cpp: - (JSC::WREC::PatternCharacterSequence::PatternCharacterSequence): - (JSC::WREC::PatternCharacterSequence::size): - (JSC::WREC::PatternCharacterSequence::append): - (JSC::WREC::PatternCharacterSequence::flush): Helper object for generating - an optimized sequence of pattern characters. +2009-07-20 Laszlo Gombos <laszlo.1.gombos@nokia.com> - (JSC::WREC::Parser::parseNonCharacterEscape): Renamed to reflect the fact - that the main parseAlternative loop handles character escapes. + Reviewed by Holger Freyther. - (JSC::WREC::Parser::parseAlternative): Moved pattern character sequence - logic from parsePatternCharacterSequence to here, using - PatternCharacterSequence to help with the details. + Remove some outdated S60 platform specific code + https://bugs.webkit.org/show_bug.cgi?id=27423 - * wrec/WRECParser.h: Updated for renames. + * wtf/Platform.h: -2008-12-08 Alexey Proskuryakov <ap@webkit.org> +2009-07-20 Csaba Osztrogonac <oszi@inf.u-szeged.hu> - Reviewed by Geoff Garen. + Reviewed by Simon Hausmann. - <rdar://problem/6166088> Give JSGlobalContextCreate a behavior that is concurrency aware, - and un-deprecate it + Qt build fix with MSVC and MinGW. - * API/JSContextRef.cpp: (JSGlobalContextCreate): - * API/JSContextRef.h: - Use a unique context group for the context, unless the application was linked against old - JavaScriptCore. + * jsc.pro: Make sure jsc is a console application, and turn off + exceptions and stl support to fix the build. -2008-12-08 Sam Weinig <sam@webkit.org> +2009-07-20 Xan Lopez <xlopez@igalia.com> - Reviewed by Cameron Zwarich. - - Fix for <rdar://problem/6428332> Remove the CTI return address table from CodeBlock + Reviewed by Gustavo Noronha. - Step 1: + Do not use C++-style comments in preprocessor directives. - Remove use of jitReturnAddressVPCMap when looking for vPC to store Structures - in for cached lookup. Instead, use the offset in the StructureStubInfo that is - already required. + GCC does not like this in some configurations, using C-style + comments is safer. - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::dumpStatistics): Fix extraneous semicolon. - * interpreter/Interpreter.cpp: - (JSC::Interpreter::tryCTICachePutByID): - (JSC::Interpreter::tryCTICacheGetByID): - (JSC::Interpreter::cti_op_get_by_id_self_fail): - (JSC::Interpreter::cti_op_get_by_id_proto_list): - * jit/JIT.h: - (JSC::JIT::compileGetByIdSelf): - (JSC::JIT::compileGetByIdProto): - (JSC::JIT::compileGetByIdChain): - (JSC::JIT::compilePutByIdReplace): - (JSC::JIT::compilePutByIdTransition): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::privateCompilePutByIdTransition): - (JSC::JIT::patchGetByIdSelf): - (JSC::JIT::patchPutByIdReplace): - (JSC::JIT::privateCompilePatchGetArrayLength): Remove extra call to getStubInfo. - (JSC::JIT::privateCompileGetByIdSelf): - (JSC::JIT::privateCompileGetByIdProto): - (JSC::JIT::privateCompileGetByIdChain): - (JSC::JIT::privateCompilePutByIdReplace): + * wtf/Platform.h: -2008-12-08 Gavin Barraclough <barraclough@apple.com> +2009-07-17 Peter Kasting <pkasting@google.com> - Reviewed by Oliver Hunt. + Reviewed by Steve Falkenburg. - Port the op_j?n?eq_null JIT code generation to use the MacroAssembler, - and clean up slightly at the same time. The 'j' forms currently compare, - then set a register, then compare again, then branch. Branch directly on - the result of the first compare. + https://bugs.webkit.org/show_bug.cgi?id=27323 + Only add Cygwin to the path when it isn't already there. This avoids + causing problems for people who purposefully have non-Cygwin versions of + executables like svn in front of the Cygwin ones in their paths. - Around a 1% progression on deltablue, crypto & early boyer, for about 1/2% - overall on v8-tests. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreCommon.vsprops: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.vcproj: + * JavaScriptCore.vcproj/WTF/WTFCommon.vsprops: + * JavaScriptCore.vcproj/jsc/jscCommon.vsprops: + * JavaScriptCore.vcproj/testapi/testapiCommon.vsprops: - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::compileGetByIdSlowCase): +2009-07-17 Gabor Loki <loki@inf.u-szeged.hu> -2008-12-08 Gavin Barraclough <barraclough@apple.com> + Reviewed by Gavin Barraclough. - Reviewed by Geoff Garen. + Add YARR support for generic ARM platforms (disabled by default). + https://bugs.webkit.org/show_bug.cgi?id=24986 - Expand MacroAssembler to support more operations, required by the JIT. + Add generic ARM port for MacroAssembler. It supports the whole + MacroAssembler functionality except floating point. - Generally adds more operations and permutations of operands to the existing - interface. Rename 'jset' to 'jnz' and 'jnset' to 'jz', which seem clearer, - and require that immediate pointer operands (though not pointer addresses to - load and store instructions) are wrapped in a ImmPtr() type, akin to Imm32(). + The class JmpSrc is extended with a flag which enables to patch + the jump destination offset during execution. This feature is + required for generic ARM port. - No performance impact. + Signed off by Zoltan Herczeg <zherczeg@inf.u-szeged.hu> + Signed off by Gabor Loki <loki@inf.u-szeged.hu> + * JavaScriptCore.pri: + * assembler/ARMAssembler.cpp: Added. + (JSC::ARMAssembler::getLdrImmAddress): + (JSC::ARMAssembler::linkBranch): + (JSC::ARMAssembler::patchConstantPoolLoad): + (JSC::ARMAssembler::getOp2): + (JSC::ARMAssembler::genInt): + (JSC::ARMAssembler::getImm): + (JSC::ARMAssembler::moveImm): + (JSC::ARMAssembler::dataTransfer32): + (JSC::ARMAssembler::baseIndexTransfer32): + (JSC::ARMAssembler::executableCopy): + * assembler/ARMAssembler.h: Added. + (JSC::ARM::): + (JSC::ARMAssembler::ARMAssembler): + (JSC::ARMAssembler::): + (JSC::ARMAssembler::JmpSrc::JmpSrc): + (JSC::ARMAssembler::JmpSrc::enableLatePatch): + (JSC::ARMAssembler::JmpDst::JmpDst): + (JSC::ARMAssembler::JmpDst::isUsed): + (JSC::ARMAssembler::JmpDst::used): + (JSC::ARMAssembler::emitInst): + (JSC::ARMAssembler::and_r): + (JSC::ARMAssembler::ands_r): + (JSC::ARMAssembler::eor_r): + (JSC::ARMAssembler::eors_r): + (JSC::ARMAssembler::sub_r): + (JSC::ARMAssembler::subs_r): + (JSC::ARMAssembler::rsb_r): + (JSC::ARMAssembler::rsbs_r): + (JSC::ARMAssembler::add_r): + (JSC::ARMAssembler::adds_r): + (JSC::ARMAssembler::adc_r): + (JSC::ARMAssembler::adcs_r): + (JSC::ARMAssembler::sbc_r): + (JSC::ARMAssembler::sbcs_r): + (JSC::ARMAssembler::rsc_r): + (JSC::ARMAssembler::rscs_r): + (JSC::ARMAssembler::tst_r): + (JSC::ARMAssembler::teq_r): + (JSC::ARMAssembler::cmp_r): + (JSC::ARMAssembler::orr_r): + (JSC::ARMAssembler::orrs_r): + (JSC::ARMAssembler::mov_r): + (JSC::ARMAssembler::movs_r): + (JSC::ARMAssembler::bic_r): + (JSC::ARMAssembler::bics_r): + (JSC::ARMAssembler::mvn_r): + (JSC::ARMAssembler::mvns_r): + (JSC::ARMAssembler::mul_r): + (JSC::ARMAssembler::muls_r): + (JSC::ARMAssembler::mull_r): + (JSC::ARMAssembler::ldr_imm): + (JSC::ARMAssembler::ldr_un_imm): + (JSC::ARMAssembler::dtr_u): + (JSC::ARMAssembler::dtr_ur): + (JSC::ARMAssembler::dtr_d): + (JSC::ARMAssembler::dtr_dr): + (JSC::ARMAssembler::ldrh_r): + (JSC::ARMAssembler::ldrh_d): + (JSC::ARMAssembler::ldrh_u): + (JSC::ARMAssembler::strh_r): + (JSC::ARMAssembler::push_r): + (JSC::ARMAssembler::pop_r): + (JSC::ARMAssembler::poke_r): + (JSC::ARMAssembler::peek_r): + (JSC::ARMAssembler::clz_r): + (JSC::ARMAssembler::bkpt): + (JSC::ARMAssembler::lsl): + (JSC::ARMAssembler::lsr): + (JSC::ARMAssembler::asr): + (JSC::ARMAssembler::lsl_r): + (JSC::ARMAssembler::lsr_r): + (JSC::ARMAssembler::asr_r): + (JSC::ARMAssembler::size): + (JSC::ARMAssembler::ensureSpace): + (JSC::ARMAssembler::label): + (JSC::ARMAssembler::align): + (JSC::ARMAssembler::jmp): + (JSC::ARMAssembler::patchPointerInternal): + (JSC::ARMAssembler::patchConstantPoolLoad): + (JSC::ARMAssembler::patchPointer): + (JSC::ARMAssembler::repatchInt32): + (JSC::ARMAssembler::repatchPointer): + (JSC::ARMAssembler::repatchLoadPtrToLEA): + (JSC::ARMAssembler::linkJump): + (JSC::ARMAssembler::relinkJump): + (JSC::ARMAssembler::linkCall): + (JSC::ARMAssembler::relinkCall): + (JSC::ARMAssembler::getRelocatedAddress): + (JSC::ARMAssembler::getDifferenceBetweenLabels): + (JSC::ARMAssembler::getCallReturnOffset): + (JSC::ARMAssembler::getOp2Byte): + (JSC::ARMAssembler::placeConstantPoolBarrier): + (JSC::ARMAssembler::RM): + (JSC::ARMAssembler::RS): + (JSC::ARMAssembler::RD): + (JSC::ARMAssembler::RN): + (JSC::ARMAssembler::getConditionalField): + * assembler/ARMv7Assembler.h: + (JSC::ARMv7Assembler::JmpSrc::enableLatePatch): + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::Call::enableLatePatch): + (JSC::AbstractMacroAssembler::Jump::enableLatePatch): * assembler/MacroAssembler.h: - (JSC::MacroAssembler::): - (JSC::MacroAssembler::ImmPtr::ImmPtr): - (JSC::MacroAssembler::add32): - (JSC::MacroAssembler::and32): - (JSC::MacroAssembler::or32): - (JSC::MacroAssembler::sub32): - (JSC::MacroAssembler::xor32): - (JSC::MacroAssembler::loadPtr): - (JSC::MacroAssembler::load32): - (JSC::MacroAssembler::storePtr): - (JSC::MacroAssembler::store32): - (JSC::MacroAssembler::poke): - (JSC::MacroAssembler::move): - (JSC::MacroAssembler::testImm32): - (JSC::MacroAssembler::jae32): - (JSC::MacroAssembler::jb32): - (JSC::MacroAssembler::jePtr): - (JSC::MacroAssembler::je32): - (JSC::MacroAssembler::jnePtr): - (JSC::MacroAssembler::jne32): - (JSC::MacroAssembler::jnzPtr): - (JSC::MacroAssembler::jnz32): - (JSC::MacroAssembler::jzPtr): - (JSC::MacroAssembler::jz32): - (JSC::MacroAssembler::joSub32): - (JSC::MacroAssembler::jump): - (JSC::MacroAssembler::sete32): - (JSC::MacroAssembler::setne32): - (JSC::MacroAssembler::setnz32): - (JSC::MacroAssembler::setz32): + * assembler/MacroAssemblerARM.h: Added. + (JSC::MacroAssemblerARM::): + (JSC::MacroAssemblerARM::add32): + (JSC::MacroAssemblerARM::and32): + (JSC::MacroAssemblerARM::lshift32): + (JSC::MacroAssemblerARM::mul32): + (JSC::MacroAssemblerARM::not32): + (JSC::MacroAssemblerARM::or32): + (JSC::MacroAssemblerARM::rshift32): + (JSC::MacroAssemblerARM::sub32): + (JSC::MacroAssemblerARM::xor32): + (JSC::MacroAssemblerARM::load32): + (JSC::MacroAssemblerARM::load32WithAddressOffsetPatch): + (JSC::MacroAssemblerARM::loadPtrWithPatchToLEA): + (JSC::MacroAssemblerARM::load16): + (JSC::MacroAssemblerARM::store32WithAddressOffsetPatch): + (JSC::MacroAssemblerARM::store32): + (JSC::MacroAssemblerARM::pop): + (JSC::MacroAssemblerARM::push): + (JSC::MacroAssemblerARM::move): + (JSC::MacroAssemblerARM::swap): + (JSC::MacroAssemblerARM::signExtend32ToPtr): + (JSC::MacroAssemblerARM::zeroExtend32ToPtr): + (JSC::MacroAssemblerARM::branch32): + (JSC::MacroAssemblerARM::branch16): + (JSC::MacroAssemblerARM::branchTest32): + (JSC::MacroAssemblerARM::jump): + (JSC::MacroAssemblerARM::branchAdd32): + (JSC::MacroAssemblerARM::mull32): + (JSC::MacroAssemblerARM::branchMul32): + (JSC::MacroAssemblerARM::branchSub32): + (JSC::MacroAssemblerARM::breakpoint): + (JSC::MacroAssemblerARM::nearCall): + (JSC::MacroAssemblerARM::call): + (JSC::MacroAssemblerARM::ret): + (JSC::MacroAssemblerARM::set32): + (JSC::MacroAssemblerARM::setTest32): + (JSC::MacroAssemblerARM::tailRecursiveCall): + (JSC::MacroAssemblerARM::makeTailRecursiveCall): + (JSC::MacroAssemblerARM::moveWithPatch): + (JSC::MacroAssemblerARM::branchPtrWithPatch): + (JSC::MacroAssemblerARM::storePtrWithPatch): + (JSC::MacroAssemblerARM::supportsFloatingPoint): + (JSC::MacroAssemblerARM::supportsFloatingPointTruncate): + (JSC::MacroAssemblerARM::loadDouble): + (JSC::MacroAssemblerARM::storeDouble): + (JSC::MacroAssemblerARM::addDouble): + (JSC::MacroAssemblerARM::subDouble): + (JSC::MacroAssemblerARM::mulDouble): + (JSC::MacroAssemblerARM::convertInt32ToDouble): + (JSC::MacroAssemblerARM::branchDouble): + (JSC::MacroAssemblerARM::branchTruncateDoubleToInt32): + (JSC::MacroAssemblerARM::ARMCondition): + (JSC::MacroAssemblerARM::prepareCall): + (JSC::MacroAssemblerARM::call32): * assembler/X86Assembler.h: - (JSC::X86Assembler::addl_mr): - (JSC::X86Assembler::andl_i8r): - (JSC::X86Assembler::cmpl_rm): - (JSC::X86Assembler::cmpl_mr): - (JSC::X86Assembler::cmpl_i8m): - (JSC::X86Assembler::subl_mr): - (JSC::X86Assembler::testl_i32m): - (JSC::X86Assembler::xorl_i32r): - (JSC::X86Assembler::movl_rm): - (JSC::X86Assembler::modRm_opmsib): - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - * jit/JITInlineMethods.h: - (JSC::JIT::emitGetVirtualRegister): - (JSC::JIT::emitPutCTIArgConstant): - (JSC::JIT::emitPutCTIParam): - (JSC::JIT::emitPutImmediateToCallFrameHeader): - (JSC::JIT::emitInitRegister): - (JSC::JIT::checkStructure): - (JSC::JIT::emitJumpIfJSCell): - (JSC::JIT::emitJumpIfNotJSCell): - (JSC::JIT::emitJumpSlowCaseIfNotImmNum): - -2008-12-08 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Fixed a bug where WREC would allow a quantifier whose minimum was - greater than its maximum. - - * wrec/Quantifier.h: - (JSC::WREC::Quantifier::Quantifier): ASSERT that the quantifier is not - backwards. - - * wrec/WRECParser.cpp: - (JSC::WREC::Parser::consumeGreedyQuantifier): Verify that the minimum - is not greater than the maximum. - -2008-12-08 Eric Seidel <eric@webkit.org> - - Build fix only, no review. - - * JavaScriptCore.scons: add bytecode/JumpTable.cpp - -2008-12-08 Sam Weinig <sam@webkit.org> - - Reviewed by Geoffrey Garen. - - Patch for https://bugs.webkit.org/show_bug.cgi?id=22716 - <rdar://problem/6428315> - Add RareData structure to CodeBlock for infrequently used auxiliary data - members. - - Reduces memory on Membuster-head by ~.5MB - - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::dump): - (JSC::CodeBlock::dumpStatistics): - (JSC::CodeBlock::mark): - (JSC::CodeBlock::getHandlerForVPC): - (JSC::CodeBlock::nativeExceptionCodeForHandlerVPC): - (JSC::CodeBlock::shrinkToFit): - * bytecode/CodeBlock.h: - (JSC::CodeBlock::numberOfExceptionHandlers): - (JSC::CodeBlock::addExceptionHandler): - (JSC::CodeBlock::exceptionHandler): - (JSC::CodeBlock::addFunction): - (JSC::CodeBlock::function): - (JSC::CodeBlock::addUnexpectedConstant): - (JSC::CodeBlock::unexpectedConstant): - (JSC::CodeBlock::addRegExp): - (JSC::CodeBlock::regexp): - (JSC::CodeBlock::numberOfImmediateSwitchJumpTables): - (JSC::CodeBlock::addImmediateSwitchJumpTable): - (JSC::CodeBlock::immediateSwitchJumpTable): - (JSC::CodeBlock::numberOfCharacterSwitchJumpTables): - (JSC::CodeBlock::addCharacterSwitchJumpTable): - (JSC::CodeBlock::characterSwitchJumpTable): - (JSC::CodeBlock::numberOfStringSwitchJumpTables): - (JSC::CodeBlock::addStringSwitchJumpTable): - (JSC::CodeBlock::stringSwitchJumpTable): - (JSC::CodeBlock::evalCodeCache): - (JSC::CodeBlock::createRareDataIfNecessary): - -2008-11-26 Peter Kasting <pkasting@google.com> - - Reviewed by Anders Carlsson. - - https://bugs.webkit.org/show_bug.cgi?id=16814 - Allow ports to disable ActiveX->NPAPI conversion for Media Player. - Improve handling of miscellaneous ActiveX objects. - - * wtf/Platform.h: Add another ENABLE(...). - -2008-12-08 Sam Weinig <sam@webkit.org> - - Reviewed by Mark Rowe. - - Add dumping of CodeBlock member structure usage. - - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::dumpStatistics): - * bytecode/EvalCodeCache.h: - (JSC::EvalCodeCache::isEmpty): - -2008-12-08 David Kilzer <ddkilzer@apple.com> - - Bug 22555: Sort "children" sections in Xcode project files - - <https://bugs.webkit.org/show_bug.cgi?id=22555> - - Reviewed by Eric Seidel. - - * JavaScriptCore.xcodeproj/project.pbxproj: Sorted. - -2008-12-08 Tony Chang <tony@chromium.org> - - Reviewed by Eric Seidel. - - Enable Pan scrolling only when building on PLATFORM(WIN_OS) - Previously platforms like Apple Windows WebKit, Cairo Windows WebKit, - Wx and Chromium were enabling it explicitly, now we just turn it on - for all WIN_OS, later platforms can turn it off as needed on Windows - (or turn it on under Linux, etc.) - https://bugs.webkit.org/show_bug.cgi?id=22698 - + (JSC::X86Assembler::JmpSrc::enableLatePatch): + * jit/ExecutableAllocator.h: + (JSC::ExecutableAllocator::cacheFlush): * wtf/Platform.h: + * yarr/RegexJIT.cpp: + (JSC::Yarr::RegexGenerator::generateEnter): + (JSC::Yarr::RegexGenerator::generateReturn): -2008-12-08 Sam Weinig <sam@webkit.org> - - Reviewed by Cameron Zwarich. - - Add basic memory statistics dumping for CodeBlock. - - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::dumpStatistics): - (JSC::CodeBlock::CodeBlock): - (JSC::CodeBlock::~CodeBlock): - * bytecode/CodeBlock.h: - -2008-12-08 Simon Hausmann <simon.hausmann@nokia.com> - - Fix the Linux build with newer gcc/glibc. +2009-07-17 Gabor Loki <loki@inf.u-szeged.hu> - * jit/ExecutableAllocatorPosix.cpp: Include unistd.h for - getpagesize(), according to - http://opengroup.org/onlinepubs/007908775/xsh/getpagesize.html + Reviewed by Gavin Barraclough. -2008-12-08 Simon Hausmann <simon.hausmann@nokia.com> + Extend AssemblerBuffer with constant pool handling mechanism. + https://bugs.webkit.org/show_bug.cgi?id=24986 - Fix the build with Qt on Windows. + Add a platform independed constant pool framework. + This pool can store 32 or 64 bits values which is enough to hold + any integer, pointer or double constant. - * JavaScriptCore.pri: Compile ExecutableAllocatorWin.cpp on Windows. + * assembler/AssemblerBuffer.h: + (JSC::AssemblerBuffer::putIntUnchecked): + (JSC::AssemblerBuffer::putInt64Unchecked): + (JSC::AssemblerBuffer::append): + (JSC::AssemblerBuffer::grow): + * assembler/AssemblerBufferWithConstantPool.h: Added. + (JSC::): -2008-12-07 Oliver Hunt <oliver@apple.com> +2009-07-17 Eric Roman <eroman@chromium.org> - Reviewed by NOBODY (Buildfix). + Reviewed by Darin Adler. - Fix non-WREC builds + Build fix for non-Darwin. + Add a guard for inclusion of RetainPtr.h which includes CoreFoundation.h - * runtime/RegExp.cpp: - (JSC::RegExp::RegExp): + https://bugs.webkit.org/show_bug.cgi?id=27382 -2008-12-07 Oliver Hunt <oliver@apple.com> + * wtf/unicode/icu/CollatorICU.cpp: - Reviewed by NOBODY (Build fix). +2009-07-17 Alexey Proskuryakov <ap@webkit.org> - Put ENABLE(ASSEMBLER) guards around use of ExecutableAllocator in global data + Reviewed by John Sullivan. - Correct Qt and Gtk project files + Get user default collation order via a CFLocale API when available. - * GNUmakefile.am: - * JavaScriptCore.pri: - * runtime/JSGlobalData.h: + * wtf/unicode/icu/CollatorICU.cpp: (WTF::Collator::userDefault): -2008-12-07 Oliver Hunt <oliver@apple.com> +2009-07-17 Laszlo Gombos <laszlo.1.gombos@nokia.com> - Reviewed by NOBODY (Build fix). + Reviewed by Simon Hausmann. - Add new files to other projects. + [Qt] Fix the include path for the Symbian port + https://bugs.webkit.org/show_bug.cgi?id=27358 - * GNUmakefile.am: * JavaScriptCore.pri: - * JavaScriptCore.pro: - -2008-12-07 Oliver Hunt <oliver@apple.com> - - Rubber stamped by Mark Rowe. - - Rename ExecutableAllocatorMMAP to the more sensible ExecutableAllocatorPosix - - * JavaScriptCore.xcodeproj/project.pbxproj: - * jit/ExecutableAllocator.h: - * jit/ExecutableAllocatorPosix.cpp: Renamed from JavaScriptCore/jit/ExecutableAllocatorMMAP.cpp. - (JSC::ExecutableAllocator::intializePageSize): - (JSC::ExecutablePool::systemAlloc): - (JSC::ExecutablePool::systemRelease): -2008-12-07 Oliver Hunt <oliver@apple.com> +2009-07-17 Csaba Osztrogonac <oszi@inf.u-szeged.hu> - Reviewed by Cameron Zwarich and Sam Weinig + Reviewed by David Levin. - <rdar://problem/6309878> Need more granular control over allocation of executable memory (21783) - <https://bugs.webkit.org/show_bug.cgi?id=21783> + Build fix on platforms don't have MMAP. + https://bugs.webkit.org/show_bug.cgi?id=27365 - Add a new allocator for use by the JIT that provides executable pages, so - we can get rid of the current hack that makes the entire heap executable. + * interpreter/RegisterFile.h: Including stdio.h irrespectively of HAVE(MMAP) - 1-2% progression on SunSpider-v8, 1% on SunSpider. Reduces memory usage as well! +2009-07-16 Fumitoshi Ukai <ukai@chromium.org> - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.vcproj/jsc/jsc.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * assembler/AssemblerBuffer.h: - (JSC::AssemblerBuffer::size): - (JSC::AssemblerBuffer::executableCopy): - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::size): - (JSC::MacroAssembler::copyCode): - * assembler/X86Assembler.h: - (JSC::X86Assembler::size): - (JSC::X86Assembler::executableCopy): - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::~CodeBlock): - * bytecode/CodeBlock.h: - (JSC::CodeBlock::executablePool): - (JSC::CodeBlock::setExecutablePool): - * bytecode/Instruction.h: - (JSC::PolymorphicAccessStructureList::derefStructures): - * interpreter/Interpreter.cpp: - (JSC::Interpreter::~Interpreter): - * interpreter/Interpreter.h: - * jit/ExecutableAllocator.cpp: Added. - * jit/ExecutableAllocator.h: Added. - (JSC::ExecutablePool::create): - (JSC::ExecutablePool::alloc): - (JSC::ExecutablePool::~ExecutablePool): - (JSC::ExecutablePool::available): - (JSC::ExecutablePool::ExecutablePool): - (JSC::ExecutablePool::poolAllocate): - (JSC::ExecutableAllocator::ExecutableAllocator): - (JSC::ExecutableAllocator::poolForSize): - (JSC::ExecutablePool::sizeForAllocation): - * jit/ExecutableAllocatorMMAP.cpp: Added. - (JSC::ExecutableAllocator::intializePageSize): - (JSC::ExecutablePool::systemAlloc): - (JSC::ExecutablePool::systemRelease): - * jit/ExecutableAllocatorWin.cpp: Added. - (JSC::ExecutableAllocator::intializePageSize): - (JSC::ExecutablePool::systemAlloc): - (JSC::ExecutablePool::systemRelease): - * jit/JIT.cpp: - (JSC::JIT::privateCompile): - (JSC::JIT::privateCompileCTIMachineTrampolines): - * jit/JIT.h: - (JSC::JIT::compileCTIMachineTrampolines): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::privateCompilePutByIdTransition): - (JSC::JIT::privateCompilePatchGetArrayLength): - (JSC::JIT::privateCompileGetByIdSelf): - (JSC::JIT::privateCompileGetByIdProto): - (JSC::JIT::privateCompileGetByIdSelfList): - (JSC::JIT::privateCompileGetByIdProtoList): - (JSC::JIT::privateCompileGetByIdChainList): - (JSC::JIT::privateCompileGetByIdChain): - (JSC::JIT::privateCompilePutByIdReplace): - * parser/Nodes.cpp: - (JSC::RegExpNode::emitBytecode): - * runtime/JSGlobalData.h: - (JSC::JSGlobalData::poolForSize): - * runtime/RegExp.cpp: - (JSC::RegExp::RegExp): - (JSC::RegExp::create): - (JSC::RegExp::~RegExp): - * runtime/RegExp.h: - * runtime/RegExpConstructor.cpp: - (JSC::constructRegExp): - * runtime/RegExpPrototype.cpp: - (JSC::regExpProtoFuncCompile): - * runtime/StringPrototype.cpp: - (JSC::stringProtoFuncMatch): - (JSC::stringProtoFuncSearch): - * wrec/WREC.cpp: - (JSC::WREC::Generator::compileRegExp): - * wrec/WRECGenerator.h: - * wtf/FastMalloc.cpp: - * wtf/FastMalloc.h: - * wtf/TCSystemAlloc.cpp: - (TryMmap): - (TryVirtualAlloc): - (TryDevMem): - (TCMalloc_SystemRelease): - -2008-12-06 Sam Weinig <sam@webkit.org> + Reviewed by David Levin. - Fix the Gtk build. - - * jit/JITPropertyAccess.cpp: - (JSC::JIT::compileGetByIdHotPath): - (JSC::JIT::compilePutByIdHotPath): - -2008-12-06 Sam Weinig <sam@webkit.org> - - Reviewed by Cameron Zwarich, - - Move CodeBlock constructor into the .cpp file. - - Sunspider reports a .7% progression, but I can only assume this - is noise. + Add --web-sockets flag and ENABLE_WEB_SOCKETS define. + https://bugs.webkit.org/show_bug.cgi?id=27206 + + Add ENABLE_WEB_SOCKETS - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::CodeBlock): - * bytecode/CodeBlock.h: + * Configurations/FeatureDefines.xcconfig: add ENABLE_WEB_SOCKETS -2008-12-06 Sam Weinig <sam@webkit.org> +2009-07-16 Maxime Simon <simon.maxime@gmail.com> - Reviewed by Cameron Zwarich. + Reviewed by Eric Seidel. - Split JumpTable code into its own file. + Added Haiku-specific files for JavaScriptCore. + https://bugs.webkit.org/show_bug.cgi?id=26620 - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * bytecode/CodeBlock.cpp: - * bytecode/CodeBlock.h: - * bytecode/JumpTable.cpp: Copied from bytecode/CodeBlock.cpp. - * bytecode/JumpTable.h: Copied from bytecode/CodeBlock.h. + * wtf/haiku/MainThreadHaiku.cpp: Added. + (WTF::initializeMainThreadPlatform): + (WTF::scheduleDispatchFunctionsOnMainThread): -2008-12-05 Sam Weinig <sam@webkit.org> +2009-07-16 Gavin Barraclough <barraclough@apple.com> - Reviewed by Cameron Zwarich. + RS by Oliver Hunt. - Fix for https://bugs.webkit.org/show_bug.cgi?id=22715 - Encapsulate more CodeBlock members in preparation - of moving some of them to a rare data structure. + Revert r45969, this fix does not appear to be valid. + https://bugs.webkit.org/show_bug.cgi?id=27077 * bytecode/CodeBlock.cpp: - (JSC::locationForOffset): - (JSC::printConditionalJump): - (JSC::printGetByIdOp): - (JSC::printPutByIdOp): - (JSC::CodeBlock::printStructure): - (JSC::CodeBlock::printStructures): - (JSC::CodeBlock::dump): (JSC::CodeBlock::~CodeBlock): (JSC::CodeBlock::unlinkCallers): - (JSC::CodeBlock::derefStructures): - (JSC::CodeBlock::refStructures): - (JSC::CodeBlock::mark): - (JSC::CodeBlock::getHandlerForVPC): - (JSC::CodeBlock::nativeExceptionCodeForHandlerVPC): - (JSC::CodeBlock::lineNumberForVPC): - (JSC::CodeBlock::expressionRangeForVPC): - (JSC::CodeBlock::shrinkToFit): - * bytecode/CodeBlock.h: - (JSC::CodeBlock::CodeBlock): - (JSC::CodeBlock::addCaller): - (JSC::CodeBlock::removeCaller): - (JSC::CodeBlock::isKnownNotImmediate): - (JSC::CodeBlock::isConstantRegisterIndex): - (JSC::CodeBlock::getConstant): - (JSC::CodeBlock::isTemporaryRegisterIndex): - (JSC::CodeBlock::getStubInfo): - (JSC::CodeBlock::getCallLinkInfo): - (JSC::CodeBlock::instructions): - (JSC::CodeBlock::setJITCode): - (JSC::CodeBlock::jitCode): - (JSC::CodeBlock::ownerNode): - (JSC::CodeBlock::setGlobalData): - (JSC::CodeBlock::setThisRegister): - (JSC::CodeBlock::thisRegister): - (JSC::CodeBlock::setNeedsFullScopeChain): - (JSC::CodeBlock::needsFullScopeChain): - (JSC::CodeBlock::setUsesEval): - (JSC::CodeBlock::usesEval): - (JSC::CodeBlock::setUsesArguments): - (JSC::CodeBlock::usesArguments): - (JSC::CodeBlock::codeType): - (JSC::CodeBlock::source): - (JSC::CodeBlock::sourceOffset): - (JSC::CodeBlock::addGlobalResolveInstruction): - (JSC::CodeBlock::numberOfPropertyAccessInstructions): - (JSC::CodeBlock::addPropertyAccessInstruction): - (JSC::CodeBlock::propertyAccessInstruction): - (JSC::CodeBlock::numberOfCallLinkInfos): - (JSC::CodeBlock::addCallLinkInfo): - (JSC::CodeBlock::callLinkInfo): - (JSC::CodeBlock::numberOfJumpTargets): - (JSC::CodeBlock::addJumpTarget): - (JSC::CodeBlock::jumpTarget): - (JSC::CodeBlock::lastJumpTarget): - (JSC::CodeBlock::numberOfExceptionHandlers): - (JSC::CodeBlock::addExceptionHandler): - (JSC::CodeBlock::exceptionHandler): - (JSC::CodeBlock::addExpressionInfo): - (JSC::CodeBlock::numberOfLineInfos): - (JSC::CodeBlock::addLineInfo): - (JSC::CodeBlock::lastLineInfo): - (JSC::CodeBlock::jitReturnAddressVPCMap): - (JSC::CodeBlock::numberOfIdentifiers): - (JSC::CodeBlock::addIdentifier): - (JSC::CodeBlock::identifier): - (JSC::CodeBlock::numberOfConstantRegisters): - (JSC::CodeBlock::addConstantRegister): - (JSC::CodeBlock::constantRegister): - (JSC::CodeBlock::addFunction): - (JSC::CodeBlock::function): - (JSC::CodeBlock::addFunctionExpression): - (JSC::CodeBlock::functionExpression): - (JSC::CodeBlock::addUnexpectedConstant): - (JSC::CodeBlock::unexpectedConstant): - (JSC::CodeBlock::addRegExp): - (JSC::CodeBlock::regexp): - (JSC::CodeBlock::symbolTable): - (JSC::CodeBlock::evalCodeCache): - New inline setters/getters. - - (JSC::ProgramCodeBlock::ProgramCodeBlock): - (JSC::ProgramCodeBlock::~ProgramCodeBlock): - (JSC::ProgramCodeBlock::clearGlobalObject): - * bytecode/SamplingTool.cpp: - (JSC::ScopeSampleRecord::sample): - (JSC::SamplingTool::dump): - * bytecompiler/BytecodeGenerator.cpp: - * bytecompiler/BytecodeGenerator.h: - * bytecompiler/Label.h: - * interpreter/CallFrame.cpp: - * interpreter/Interpreter.cpp: - * jit/JIT.cpp: - * jit/JITCall.cpp: - * jit/JITInlineMethods.h: - * jit/JITPropertyAccess.cpp: - * parser/Nodes.cpp: - * runtime/Arguments.h: - * runtime/ExceptionHelpers.cpp: - * runtime/JSActivation.cpp: - * runtime/JSActivation.h: - * runtime/JSGlobalObject.cpp: - Change direct access to use new getter/setters. - -2008-12-05 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Prevent GCC4.2 from hanging when trying to compile Interpreter.cpp. - Added "-fno-var-tracking" compiler flag. - - https://bugs.webkit.org/show_bug.cgi?id=22704 - - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-12-05 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Ordering of branch operands in MacroAssembler in unnecessarily inconsistent. - - je, jg etc take an immediate operand as the second argument, but for the - equality branches (je, jne) the immediate operand was the first argument. This - was unnecessarily inconsistent. Change je, jne methods to take the immediate - as the second argument. - - https://bugs.webkit.org/show_bug.cgi?id=22703 - - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::je32): - (JSC::MacroAssembler::jne32): - * jit/JIT.cpp: - (JSC::JIT::compileOpStrictEq): - * wrec/WRECGenerator.cpp: - (JSC::WREC::Generator::generateEnter): - (JSC::WREC::Generator::generateNonGreedyQuantifier): - (JSC::WREC::Generator::generateGreedyQuantifier): - (JSC::WREC::Generator::generatePatternCharacterPair): - (JSC::WREC::Generator::generatePatternCharacter): - (JSC::WREC::Generator::generateCharacterClassInvertedRange): - (JSC::WREC::Generator::generateCharacterClassInverted): - (JSC::WREC::Generator::generateAssertionBOL): - (JSC::WREC::Generator::generateAssertionWordBoundary): - -2008-12-05 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. - - Second tranche of porting JIT.cpp to MacroAssembler interface. - - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::mul32): - (JSC::MacroAssembler::jl32): - (JSC::MacroAssembler::jnzSub32): - (JSC::MacroAssembler::joAdd32): - (JSC::MacroAssembler::joMul32): - (JSC::MacroAssembler::jzSub32): - * jit/JIT.cpp: - (JSC::JIT::emitSlowScriptCheck): - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): - (JSC::JIT::privateCompileCTIMachineTrampolines): - * jit/JIT.h: - * jit/JITInlineMethods.h: - (JSC::JIT::emitJumpIfNotJSCell): - (JSC::JIT::emitJumpSlowCaseIfNotJSCell): - -2008-12-05 David Kilzer <ddkilzer@apple.com> - - Bug 22609: Provide a build-time choice when generating hash tables for properties of built-in DOM objects - - <https://bugs.webkit.org/show_bug.cgi?id=22609> - <rdar://problem/6331749> - - Reviewed by Darin Adler. - - Initial patch by Yosen Lin. Adapted for ToT WebKit by David Kilzer. - - Added back the code that generates a "compact" hash (instead of a - perfect hash) as a build-time option using the - ENABLE(PERFECT_HASH_SIZE) macro as defined in Lookup.h. - - * create_hash_table: Rename variables to differentiate perfect hash - values from compact hash values. Added back code to compute compact - hash tables. Generate both hash table sizes and emit - conditionalized code based on ENABLE(PERFECT_HASH_SIZE). - * runtime/Lookup.cpp: - (JSC::HashTable::createTable): Added version of createTable() for - use with compact hash tables. - (JSC::HashTable::deleteTable): Updated to work with compact hash - tables. - * runtime/Lookup.h: Defined ENABLE(PERFECT_HASH_SIZE) macro here. - (JSC::HashEntry::initialize): Set m_next to zero when using compact - hash tables. - (JSC::HashEntry::setNext): Added for compact hash tables. - (JSC::HashEntry::next): Added for compact hash tables. - (JSC::HashTable::entry): Added version of entry() for use with - compact hash tables. - * runtime/Structure.cpp: - (JSC::Structure::getEnumerablePropertyNames): Updated to work with - compact hash tables. - -2008-12-05 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. - - Remove redundant calls to JIT::emitSlowScriptCheck. - This is checked in the hot path, so is not needed on the slow path - and the code - was being planted before the start of the slow case, so was completely unreachable! - - * jit/JIT.cpp: - (JSC::JIT::privateCompileSlowCases): - -2008-12-05 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. - - Move JIT::compileOpStrictEq to MacroAssembler interface. - - The rewrite also looks like a small (<1%) performance progression. - - https://bugs.webkit.org/show_bug.cgi?id=22697 - - * jit/JIT.cpp: - (JSC::JIT::compileOpStrictEq): - (JSC::JIT::privateCompileSlowCases): - * jit/JIT.h: - * jit/JITInlineMethods.h: - (JSC::JIT::emitJumpIfJSCell): - (JSC::JIT::emitJumpSlowCaseIfJSCell): - -2008-12-05 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. - - Remove m_assembler from MacroAssembler::Jump. - Keeping a pointer allowed for some syntactic sugar - "link()" looks nicer - than "link(this)". But maintaining this doubles the size of Jump, which - is even more unfortunate for the JIT, since there are many large structures - holding JmpSrcs. Probably best to remove it. - - https://bugs.webkit.org/show_bug.cgi?id=22693 - - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::Jump::Jump): - (JSC::MacroAssembler::Jump::link): - (JSC::MacroAssembler::Jump::linkTo): - (JSC::MacroAssembler::JumpList::link): - (JSC::MacroAssembler::JumpList::linkTo): - (JSC::MacroAssembler::jae32): - (JSC::MacroAssembler::je32): - (JSC::MacroAssembler::je16): - (JSC::MacroAssembler::jg32): - (JSC::MacroAssembler::jge32): - (JSC::MacroAssembler::jl32): - (JSC::MacroAssembler::jle32): - (JSC::MacroAssembler::jnePtr): - (JSC::MacroAssembler::jne32): - (JSC::MacroAssembler::jnset32): - (JSC::MacroAssembler::jset32): - (JSC::MacroAssembler::jump): - (JSC::MacroAssembler::jzSub32): - (JSC::MacroAssembler::joAdd32): - (JSC::MacroAssembler::call): - * wrec/WREC.cpp: - (JSC::WREC::Generator::compileRegExp): - * wrec/WRECGenerator.cpp: - (JSC::WREC::Generator::generateEnter): - (JSC::WREC::Generator::generateBackreferenceQuantifier): - (JSC::WREC::Generator::generateNonGreedyQuantifier): - (JSC::WREC::Generator::generateGreedyQuantifier): - (JSC::WREC::Generator::generatePatternCharacter): - (JSC::WREC::Generator::generateCharacterClassInvertedRange): - (JSC::WREC::Generator::generateCharacterClassInverted): - (JSC::WREC::Generator::generateCharacterClass): - (JSC::WREC::Generator::generateParenthesesAssertion): - (JSC::WREC::Generator::generateParenthesesInvertedAssertion): - (JSC::WREC::Generator::generateParenthesesNonGreedy): - (JSC::WREC::Generator::generateParenthesesResetTrampoline): - (JSC::WREC::Generator::generateAssertionBOL): - (JSC::WREC::Generator::generateAssertionEOL): - (JSC::WREC::Generator::generateAssertionWordBoundary): - (JSC::WREC::Generator::generateBackreference): - (JSC::WREC::Generator::terminateAlternative): - (JSC::WREC::Generator::terminateDisjunction): - * wrec/WRECParser.h: - -2008-12-05 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoffrey Garen. - - Simplify JIT generated checks for timeout code, by moving more work into the C function. - https://bugs.webkit.org/show_bug.cgi?id=22688 - - * interpreter/Interpreter.cpp: - (JSC::Interpreter::cti_timeout_check): - * interpreter/Interpreter.h: - * jit/JIT.cpp: - (JSC::JIT::emitSlowScriptCheck): - -2008-12-05 Sam Weinig <sam@webkit.org> - - Reviewed by Geoffrey Garen. - - Encapsulate access to jump tables in the CodeBlock in preparation - of moving them to a rare data structure. - - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::dump): - (JSC::CodeBlock::shrinkToFit): - * bytecode/CodeBlock.h: - (JSC::CodeBlock::numberOfImmediateSwitchJumpTables): - (JSC::CodeBlock::addImmediateSwitchJumpTable): - (JSC::CodeBlock::immediateSwitchJumpTable): - (JSC::CodeBlock::numberOfCharacterSwitchJumpTables): - (JSC::CodeBlock::addCharacterSwitchJumpTable): - (JSC::CodeBlock::characterSwitchJumpTable): - (JSC::CodeBlock::numberOfStringSwitchJumpTables): - (JSC::CodeBlock::addStringSwitchJumpTable): - (JSC::CodeBlock::stringSwitchJumpTable): - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::generate): - (JSC::BytecodeGenerator::endSwitch): - * interpreter/Interpreter.cpp: - (JSC::Interpreter::privateExecute): - (JSC::Interpreter::cti_op_switch_imm): - (JSC::Interpreter::cti_op_switch_char): - (JSC::Interpreter::cti_op_switch_string): - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - -2008-12-05 Adam Roben <aroben@apple.com> - - Windows build fix after r39020 - - * jit/JITInlineMethods.h: - (JSC::JIT::restoreArgumentReference): - (JSC::JIT::restoreArgumentReferenceForTrampoline): - Add some apparently-missing __. - -2008-12-04 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=22673 - - Added support for the assertion (?=) and inverted assertion (?!) atoms - in WREC. - - * wrec/WRECGenerator.cpp: - (JSC::WREC::Generator::generateParenthesesAssertion): - (JSC::WREC::Generator::generateParenthesesInvertedAssertion): Split the - old (unused) generateParentheses into these two functions, with more - limited capabilities. - - * wrec/WRECGenerator.h: - (JSC::WREC::Generator::): Moved an enum to the top of the class definition, - to match the WebKit style, and removed a defunct comment. - - * wrec/WRECParser.cpp: - (JSC::WREC::Parser::parseParentheses): - (JSC::WREC::Parser::consumeParenthesesType): - * wrec/WRECParser.h: - (JSC::WREC::Parser::): Added support for parsing (?=) and (?!). - -2008-12-05 Simon Hausmann <simon.hausmann@nokia.com> - - Rubber-stamped by Tor Arne Vestbø. - - Disable the JIT for the Qt build alltogether again, after observing - more miscompilations in a wider range of newer gcc versions. - - * JavaScriptCore.pri: - -2008-12-05 Simon Hausmann <simon.hausmann@nokia.com> - - Reviewed by Tor Arne Vestbø. - - Disable the JIT for the Qt build on Linux unless gcc is >= 4.2, - due to miscompilations. - - * JavaScriptCore.pri: - -2008-12-04 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. - - Start porting the JIT to use the MacroAssembler. - - https://bugs.webkit.org/show_bug.cgi?id=22671 - No change in performance. - - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::Jump::operator X86Assembler::JmpSrc): - (JSC::MacroAssembler::add32): - (JSC::MacroAssembler::and32): - (JSC::MacroAssembler::lshift32): - (JSC::MacroAssembler::rshift32): - (JSC::MacroAssembler::storePtr): - (JSC::MacroAssembler::store32): - (JSC::MacroAssembler::poke): - (JSC::MacroAssembler::move): - (JSC::MacroAssembler::compareImm32ForBranchEquality): - (JSC::MacroAssembler::jnePtr): - (JSC::MacroAssembler::jnset32): - (JSC::MacroAssembler::jset32): - (JSC::MacroAssembler::jzeroSub32): - (JSC::MacroAssembler::joverAdd32): - (JSC::MacroAssembler::call): - * assembler/X86Assembler.h: - (JSC::X86Assembler::shll_i8r): * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompile): - (JSC::JIT::privateCompileCTIMachineTrampolines): * jit/JIT.h: - * jit/JITArithmetic.cpp: - (JSC::JIT::compileBinaryArithOp): - * jit/JITInlineMethods.h: - (JSC::JIT::emitGetVirtualRegister): - (JSC::JIT::emitPutCTIArg): - (JSC::JIT::emitPutCTIArgConstant): - (JSC::JIT::emitGetCTIArg): - (JSC::JIT::emitPutCTIArgFromVirtualRegister): - (JSC::JIT::emitPutCTIParam): - (JSC::JIT::emitGetCTIParam): - (JSC::JIT::emitPutToCallFrameHeader): - (JSC::JIT::emitPutImmediateToCallFrameHeader): - (JSC::JIT::emitGetFromCallFrameHeader): - (JSC::JIT::emitPutVirtualRegister): - (JSC::JIT::emitInitRegister): - (JSC::JIT::emitNakedCall): - (JSC::JIT::restoreArgumentReference): - (JSC::JIT::restoreArgumentReferenceForTrampoline): - (JSC::JIT::emitCTICall): - (JSC::JIT::checkStructure): - (JSC::JIT::emitJumpSlowCaseIfNotJSCell): - (JSC::JIT::emitJumpSlowCaseIfNotImmNum): - (JSC::JIT::emitJumpSlowCaseIfNotImmNums): - (JSC::JIT::emitFastArithDeTagImmediate): - (JSC::JIT::emitFastArithDeTagImmediateJumpIfZero): - (JSC::JIT::emitFastArithReTagImmediate): - (JSC::JIT::emitFastArithPotentiallyReTagImmediate): - (JSC::JIT::emitFastArithImmToInt): - (JSC::JIT::emitFastArithIntToImmOrSlowCase): - (JSC::JIT::emitFastArithIntToImmNoCheck): - (JSC::JIT::emitTagAsBoolImmediate): - * jit/JITPropertyAccess.cpp: - (JSC::JIT::privateCompilePutByIdTransition): -2008-12-04 Geoffrey Garen <ggaren@apple.com> +2009-07-16 Zoltan Horvath <hzoltan@inf.u-szeged.hu> Reviewed by Oliver Hunt. - - Some refactoring for generateGreedyQuantifier. - - SunSpider reports no change (possibly a 0.3% speedup). - - * wrec/WRECGenerator.cpp: - (JSC::WREC::Generator::generateGreedyQuantifier): Clarified label - meanings and unified some logic to simplify things. - * wrec/WRECParser.h: - (JSC::WREC::Parser::parseAlternative): Added a version of parseAlternative - that can jump to a Label, instead of a JumpList, upon failure. (Eventually, - when we have a true Label class, this will be redundant.) This makes - things easier for generateGreedyQuantifier, because it can avoid - explicitly linking things. + Allow custom memory allocation control in ExceptionInfo and RareData struct + https://bugs.webkit.org/show_bug.cgi?id=27336 -2008-12-04 Simon Hausmann <simon.hausmann@nokia.com> + Inherits ExceptionInfo and RareData struct from FastAllocBase because these + have been instantiated by 'new' in JavaScriptCore/bytecode/CodeBlock.cpp:1289 and + in JavaScriptCore/bytecode/CodeBlock.h:453. - Reviewed by Holger Freyther. + Remove unnecessary WTF:: namespace from CodeBlock inheritance. + + * bytecode/CodeBlock.h: - Fix crashes in the Qt build on Linux/i386 with non-executable memory - by enabling TCSystemAlloc and the PROT_EXEC flag for mmap. +2009-07-16 Mark Rowe <mrowe@apple.com> - * JavaScriptCore.pri: Enable the use of TCSystemAlloc if the JIT is - enabled. - * wtf/TCSystemAlloc.cpp: Extend the PROT_EXEC permissions to - PLATFORM(QT). + Rubber-stamped by Geoff Garen. -2008-12-04 Simon Hausmann <simon.hausmann@nokia.com> + Fix FeatureDefines.xcconfig to not be out of sync with the rest of the world. - Reviewed by Tor Arne Vestbø. + * Configurations/FeatureDefines.xcconfig: - Enable ENABLE_JIT_OPTIMIZE_CALL, ENABLE_JIT_OPTIMIZE_PROPERTY_ACCESS - and ENABLE_JIT_OPTIMIZE_ARITHMETIC, as suggested by Niko. +2009-07-16 Yong Li <yong.li@torchmobile.com> - * JavaScriptCore.pri: + Reviewed by George Staikos. -2008-12-04 Kent Hansen <khansen@trolltech.com> + https://bugs.webkit.org/show_bug.cgi?id=27320 + _countof is only included in CE6; for CE5 we need to define it ourself - Reviewed by Simon Hausmann. + * wtf/Platform.h: - Enable the JSC jit for the Qt build by default for release builds on - linux-g++ and win32-msvc. - - * JavaScriptCore.pri: - -2008-12-04 Gavin Barraclough <barraclough@apple.com> +2009-07-16 Zoltan Herczeg <zherczeg@inf.u-szeged.hu> Reviewed by Oliver Hunt. - Allow JIT to function without property access repatching and arithmetic optimizations. - Controlled by ENABLE_JIT_OPTIMIZE_PROPERTY_ACCESS and ENABLE_JIT_OPTIMIZE_ARITHMETIC switches. + Workers + garbage collector: weird crashes + https://bugs.webkit.org/show_bug.cgi?id=27077 - https://bugs.webkit.org/show_bug.cgi?id=22643 + We need to unlink cached method call sites when a function is destroyed. * JavaScriptCore.xcodeproj/project.pbxproj: + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::~CodeBlock): + (JSC::CodeBlock::unlinkCallers): * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): + (JSC::JIT::unlinkMethodCall): * jit/JIT.h: - * jit/JITArithmetic.cpp: Copied from jit/JIT.cpp. - (JSC::JIT::compileBinaryArithOp): - (JSC::JIT::compileBinaryArithOpSlowCase): - * jit/JITPropertyAccess.cpp: Copied from jit/JIT.cpp. - (JSC::JIT::compileGetByIdHotPath): - (JSC::JIT::compileGetByIdSlowCase): - (JSC::JIT::compilePutByIdHotPath): - (JSC::JIT::compilePutByIdSlowCase): - (JSC::resizePropertyStorage): - (JSC::transitionWillNeedStorageRealloc): - (JSC::JIT::privateCompilePutByIdTransition): - (JSC::JIT::patchGetByIdSelf): - (JSC::JIT::patchPutByIdReplace): - (JSC::JIT::privateCompilePatchGetArrayLength): - * wtf/Platform.h: -2008-12-03 Geoffrey Garen <ggaren@apple.com> +2009-07-15 Steve Falkenburg <sfalken@apple.com> - Reviewed by Oliver Hunt. - - Optimized sequences of characters in regular expressions by comparing - two characters at a time. - - 1-2% speedup on SunSpider, 19-25% speedup on regexp-dna. + Windows Build fix. - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::load32): - (JSC::MacroAssembler::jge32): Filled out a few more macro methods. - - * assembler/X86Assembler.h: - (JSC::X86Assembler::movl_mr): Added a verion of movl_mr that operates - without an offset, to allow the macro assembler to optmize for that case. + Visual Studio reset our intermediate directory on us. + This sets it back. - * wrec/WREC.cpp: - (JSC::WREC::Generator::compileRegExp): Test the saved value of index - instead of the index register when checking for "end of input." The - index register doesn't increment by 1 in an orderly fashion, so testing - it for == "end of input" is not valid. - - Also, jump all the way to "return failure" upon reaching "end of input," - instead of executing the next alternative. This is more logical, and - it's a slight optimization in the case of an expression with many alternatives. - - * wrec/WRECGenerator.cpp: - (JSC::WREC::Generator::generateIncrementIndex): Added support for - jumping to a failure label in the case where the index has reached "end - of input." - - (JSC::WREC::Generator::generatePatternCharacterSequence): - (JSC::WREC::Generator::generatePatternCharacterPair): This is the - optmization. It's basically like generatePatternCharacter, but it runs two - characters at a time. - - (JSC::WREC::Generator::generatePatternCharacter): Changed to use isASCII, - since it's clearer than comparing to a magic hex value. - - * wrec/WRECGenerator.h: - -2008-12-03 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Cameron Zwarich. - - Allow JIT to operate without the call-repatching optimization. - Controlled by ENABLE(JIT_OPTIMIZE_CALL), defaults on, disabling - this leads to significant performance regression. - - https://bugs.webkit.org/show_bug.cgi?id=22639 - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * jit/JIT.cpp: - (JSC::JIT::privateCompileSlowCases): - * jit/JIT.h: - * jit/JITCall.cpp: Copied from jit/JIT.cpp. - (JSC::JIT::compileOpCallInitializeCallFrame): - (JSC::JIT::compileOpCallSetupArgs): - (JSC::JIT::compileOpCallEvalSetupArgs): - (JSC::JIT::compileOpConstructSetupArgs): - (JSC::JIT::compileOpCall): - (JSC::JIT::compileOpCallSlowCase): - (JSC::unreachable): - * jit/JITInlineMethods.h: Copied from jit/JIT.cpp. - (JSC::JIT::checkStructure): - (JSC::JIT::emitFastArithPotentiallyReTagImmediate): - (JSC::JIT::emitTagAsBoolImmediate): - * wtf/Platform.h: - -2008-12-03 Eric Seidel <eric@webkit.org> - - Rubber-stamped by David Hyatt. - - Make HAVE_ACCESSIBILITY only define if !defined - - * wtf/Platform.h: - -2008-12-03 Sam Weinig <sam@webkit.org> - - Fix build. - - * assembler/X86Assembler.h: - (JSC::X86Assembler::orl_i32r): - -2008-12-03 Sam Weinig <sam@webkit.org> - - Reviewed by Geoffrey Garen. - - Remove shared AssemblerBuffer 1MB buffer and instead give AssemblerBuffer - an 256 byte inline capacity. - - 1% progression on Sunspider. + * JavaScriptCore.vcproj/testapi/testapi.vcproj: - * assembler/AssemblerBuffer.h: - (JSC::AssemblerBuffer::AssemblerBuffer): - (JSC::AssemblerBuffer::~AssemblerBuffer): - (JSC::AssemblerBuffer::grow): - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::MacroAssembler): - * assembler/X86Assembler.h: - (JSC::X86Assembler::X86Assembler): - * interpreter/Interpreter.cpp: - (JSC::Interpreter::Interpreter): - * interpreter/Interpreter.h: - * jit/JIT.cpp: - (JSC::JIT::JIT): - * parser/Nodes.cpp: - (JSC::RegExpNode::emitBytecode): - * runtime/RegExp.cpp: - (JSC::RegExp::RegExp): - (JSC::RegExp::create): - * runtime/RegExp.h: - * runtime/RegExpConstructor.cpp: - (JSC::constructRegExp): - * runtime/RegExpPrototype.cpp: - (JSC::regExpProtoFuncCompile): - * runtime/StringPrototype.cpp: - (JSC::stringProtoFuncMatch): - (JSC::stringProtoFuncSearch): - * wrec/WREC.cpp: - (JSC::WREC::Generator::compileRegExp): - * wrec/WRECGenerator.h: - (JSC::WREC::Generator::Generator): - * wrec/WRECParser.h: - (JSC::WREC::Parser::Parser): - -2008-12-03 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Oliver Hunt, with help from Gavin Barraclough. - - orl_i32r was actually coded as an 8bit OR. So, I renamed orl_i32r to - orl_i8r, changed all orl_i32r clients to use orl_i8r, and then added - a new orl_i32r that actually does a 32bit OR. - - (32bit OR is currently unused, but a patch I'm working on uses it.) +2009-07-15 Kwang Yul Seo <skyul@company100.net> - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::or32): Updated to choose between 8bit and 32bit OR. + Reviewed by Eric Seidel. - * assembler/X86Assembler.h: - (JSC::X86Assembler::orl_i8r): The old orl_i32r. - (JSC::X86Assembler::orl_i32r): The new orl_i32r. + https://bugs.webkit.org/show_bug.cgi?id=26794 + Make Yacc-generated parsers to use fastMalloc/fastFree. - * jit/JIT.cpp: - (JSC::JIT::emitFastArithPotentiallyReTagImmediate): - (JSC::JIT::emitTagAsBoolImmediate): Use orl_i8r, since we're ORing 8bit - values. - -2008-12-03 Dean Jackson <dino@apple.com> - - Reviewed by Dan Bernstein. - - Helper functions for turn -> degrees. - https://bugs.webkit.org/show_bug.cgi?id=22497 + Define YYMALLOC and YYFREE to fastMalloc and fastFree + respectively. - * wtf/MathExtras.h: - (turn2deg): - (deg2turn): - -2008-12-02 Cameron Zwarich <zwarich@apple.com> + * parser/Grammar.y: - Reviewed by Geoff Garen. +2009-07-15 Darin Adler <darin@apple.com> - Bug 22504: Crashes during code generation occur due to refing of ignoredResult() - <https://bugs.webkit.org/show_bug.cgi?id=22504> + Fix a build for a particular Apple configuration. - Since ignoredResult() was implemented by casting 1 to a RegisterID*, any - attempt to ref ignoredResult() results in a crash. This will occur in - code generation of a function body where a node emits another node with - the dst that was passed to it, and then refs the returned RegisterID*. + * wtf/FastAllocBase.h: Change include to use "" style for + including another wtf header. This is the style we use for + including other public headers in the same directory. - To fix this problem, make ignoredResult() a member function of - BytecodeGenerator that simply returns a pointe to a fixed RegisterID - member of BytecodeGenerator. +2009-07-15 George Staikos <george.staikos@torchmobile.com> - * bytecompiler/BytecodeGenerator.h: - (JSC::BytecodeGenerator::ignoredResult): - * bytecompiler/RegisterID.h: - * parser/Nodes.cpp: - (JSC::NullNode::emitBytecode): - (JSC::BooleanNode::emitBytecode): - (JSC::NumberNode::emitBytecode): - (JSC::StringNode::emitBytecode): - (JSC::RegExpNode::emitBytecode): - (JSC::ThisNode::emitBytecode): - (JSC::ResolveNode::emitBytecode): - (JSC::ObjectLiteralNode::emitBytecode): - (JSC::PostfixResolveNode::emitBytecode): - (JSC::PostfixBracketNode::emitBytecode): - (JSC::PostfixDotNode::emitBytecode): - (JSC::DeleteValueNode::emitBytecode): - (JSC::VoidNode::emitBytecode): - (JSC::TypeOfResolveNode::emitBytecode): - (JSC::TypeOfValueNode::emitBytecode): - (JSC::PrefixResolveNode::emitBytecode): - (JSC::AssignResolveNode::emitBytecode): - (JSC::CommaNode::emitBytecode): - (JSC::ForNode::emitBytecode): - (JSC::ForInNode::emitBytecode): - (JSC::ReturnNode::emitBytecode): - (JSC::ThrowNode::emitBytecode): - (JSC::FunctionBodyNode::emitBytecode): - (JSC::FuncDeclNode::emitBytecode): + Reviewed by Adam Treat. -2008-12-02 Geoffrey Garen <ggaren@apple.com> + https://bugs.webkit.org/show_bug.cgi?id=27303 + Implement createThreadInternal for WinCE. + Contains changes by George Staikos <george.staikos@torchmobile.com> and Joe Mason <joe.mason@torchmobile.com> - Reviewed by Cameron Zwarich. - - Fixed https://bugs.webkit.org/show_bug.cgi?id=22537 - REGRESSION (r38745): Assertion failure in jsSubstring() at ge.com + * wtf/ThreadingWin.cpp: + (WTF::createThreadInternal): - The bug was that index would become greater than length, so our - "end of input" checks, which all check "index == length", would fail. - - The solution is to check for end of input before incrementing index, - to ensure that index is always <= length. - - As a side benefit, generateJumpIfEndOfInput can now use je instead of - jg, which should be slightly faster. +2009-07-15 Joe Mason <joe.mason@torchmobile.com> - * wrec/WREC.cpp: - (JSC::WREC::Generator::compileRegExp): - * wrec/WRECGenerator.cpp: - (JSC::WREC::Generator::generateJumpIfEndOfInput): + Reviewed by George Staikos. -2008-12-02 Gavin Barraclough <barraclough@apple.com> + https://bugs.webkit.org/show_bug.cgi?id=27298 + Platform defines for WINCE. + Contains changes by Yong Li <yong.li@torchmobile.com>, + George Staikos <george.staikos@torchmobile.com> and Joe Mason <joe.mason@torchmobile.com> - Reviewed by Geoffrey Garen. + * wtf/Platform.h: - Plant shift right immediate instructions, which are awesome. - https://bugs.webkit.org/show_bug.cgi?id=22610 - ~5% on the v8-crypto test. +2009-07-15 Yong Li <yong.li@torchmobile.com> - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): + Reviewed by Adam Treat. -2008-12-02 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Cleaned up SegmentedVector by abstracting segment access into helper - functions. - - SunSpider reports no change. + https://bugs.webkit.org/show_bug.cgi?id=27306 + Use RegisterClass instead of RegisterClassEx on WinCE. - * bytecompiler/SegmentedVector.h: - (JSC::SegmentedVector::SegmentedVector): - (JSC::SegmentedVector::~SegmentedVector): - (JSC::SegmentedVector::size): - (JSC::SegmentedVector::at): - (JSC::SegmentedVector::operator[]): - (JSC::SegmentedVector::last): - (JSC::SegmentedVector::append): - (JSC::SegmentedVector::removeLast): - (JSC::SegmentedVector::grow): - (JSC::SegmentedVector::clear): - (JSC::SegmentedVector::deleteAllSegments): - (JSC::SegmentedVector::segmentFor): - (JSC::SegmentedVector::subscriptFor): - (JSC::SegmentedVector::ensureSegmentsFor): - (JSC::SegmentedVector::ensureSegment): - -2008-12-02 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Geoffrey Garen. (Patch by Cameron Zwarich <zwarich@apple.com>.) - - Fixed https://bugs.webkit.org/show_bug.cgi?id=22482 - REGRESSION (r37991): Occasionally see "Scene rendered incorrectly" - message when running the V8 Raytrace benchmark - - Rolled out r37991. It didn't properly save xmm0, which is caller-save, - before calling helper functions. - - SunSpider and v8 benchmarks show little change -- possibly a .2% - SunSpider regression, possibly a .2% v8 benchmark speedup. + * wtf/win/MainThreadWin.cpp: + (WTF::initializeMainThreadPlatform): - * assembler/X86Assembler.h: - (JSC::X86Assembler::): - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::dump): - * bytecode/Instruction.h: - (JSC::Instruction::): - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::emitUnaryOp): - * bytecompiler/BytecodeGenerator.h: - (JSC::BytecodeGenerator::emitToJSNumber): - (JSC::BytecodeGenerator::emitTypeOf): - (JSC::BytecodeGenerator::emitGetPropertyNames): - * interpreter/Interpreter.cpp: - (JSC::Interpreter::privateExecute): - * interpreter/Interpreter.h: - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): - * jit/JIT.h: - * parser/Nodes.cpp: - (JSC::UnaryOpNode::emitBytecode): - (JSC::BinaryOpNode::emitBytecode): - (JSC::EqualNode::emitBytecode): - * parser/ResultType.h: - (JSC::ResultType::isReusable): - (JSC::ResultType::mightBeNumber): - * runtime/JSNumberCell.h: +2009-07-15 Yong Li <yong.li@torchmobile.com> -2008-12-01 Gavin Barraclough <barraclough@apple.com> + Reviewed by George Staikos. - Reviewed by Geoffrey Garen. + https://bugs.webkit.org/show_bug.cgi?id=27301 + Use OutputDebugStringW on WinCE since OutputDebugStringA is not supported + Originally written by Yong Li <yong.li@torchmobile.com> and refactored by + Joe Mason <joe.mason@torchmobile.com> - Remove unused (sampling only, and derivable) argument to JIT::emitCTICall. - https://bugs.webkit.org/show_bug.cgi?id=22587 + * wtf/Assertions.cpp: vprintf_stderr_common - * jit/JIT.cpp: - (JSC::JIT::emitCTICall): - (JSC::JIT::compileOpCall): - (JSC::JIT::emitSlowScriptCheck): - (JSC::JIT::compileBinaryArithOpSlowCase): - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): - (JSC::JIT::privateCompile): - * jit/JIT.h: +2009-07-15 Yong Li <yong.li@torchmobile.com> -2008-12-02 Dimitri Glazkov <dglazkov@chromium.org> + Reviewed by George Staikos. - Reviewed by Eric Seidel. - - Fix the inheritance chain for JSFunction. + https://bugs.webkit.org/show_bug.cgi?id=27020 + msToGregorianDateTime should set utcOffset to 0 when outputIsUTC is false - * runtime/JSFunction.cpp: - (JSC::JSFunction::info): Add InternalFunction::info as parent class + * wtf/DateMath.cpp: + (WTF::gregorianDateTimeToMS): -2008-12-02 Simon Hausmann <hausmann@webkit.org> +2009-07-15 Laszlo Gombos <laszlo.1.gombos@nokia.com> - Reviewed by Tor Arne Vestbø. + Reviewed by Simon Hausmann. - Fix ability to include JavaScriptCore.pri from other .pro files. + [Qt] Cleanup - Remove obsolete code from the make system + https://bugs.webkit.org/show_bug.cgi?id=27299 - * JavaScriptCore.pri: Moved -O3 setting into the .pro files. * JavaScriptCore.pro: * jsc.pro: -2008-12-01 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Cameron Zwarich, with help from Gavin Barraclough. - - Fixed https://bugs.webkit.org/show_bug.cgi?id=22583. - - Refactored regular expression parsing to parse sequences of characters - as a single unit, in preparation for optimizing sequences of characters. - - SunSpider reports no change. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * wrec/Escapes.h: Added. Set of classes for representing an escaped - token in a pattern. - - * wrec/Quantifier.h: - (JSC::WREC::Quantifier::Quantifier): Simplified this constructor slightly, - to match the new Escape constructor. - - * wrec/WRECGenerator.cpp: - (JSC::WREC::Generator::generatePatternCharacterSequence): - * wrec/WRECGenerator.h: Added an interface for generating a sequence - of pattern characters at a time. It doesn't do anything special yet. - - * wrec/WRECParser.cpp: - (JSC::WREC::Parser::consumeGreedyQuantifier): - (JSC::WREC::Parser::consumeQuantifier): Renamed "parse" to "consume" in - these functions, to match "consumeEscape." - - (JSC::WREC::Parser::parsePatternCharacterSequence): New function for - iteratively aggregating a sequence of characters in a pattern. - - (JSC::WREC::Parser::parseCharacterClassQuantifier): - (JSC::WREC::Parser::parseBackreferenceQuantifier): Renamed "parse" to - "consume" in these functions, to match "consumeEscape." - - (JSC::WREC::Parser::parseCharacterClass): Refactored to use the common - escape processing code in consumeEscape. - - (JSC::WREC::Parser::parseEscape): Refactored to use the common - escape processing code in consumeEscape. - - (JSC::WREC::Parser::consumeEscape): Factored escaped token processing - into a common function, since we were doing this in a few places. - - (JSC::WREC::Parser::parseTerm): Refactored to use the common - escape processing code in consumeEscape. - - * wrec/WRECParser.h: - (JSC::WREC::Parser::consumeOctal): Refactored to use a helper function - for reading a digit. - -2008-12-01 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Oliver Hunt. - - Bug 20340: SegmentedVector segment allocations can lead to unsafe use of temporary registers - <https://bugs.webkit.org/show_bug.cgi?id=20340> - - SegmentedVector currently frees segments and reallocates them when used - as a stack. This can lead to unsafe use of pointers into freed segments. - - In order to fix this problem, SegmentedVector will be changed to only - grow and never shrink. Also, rename the reserveCapacity() member - function to grow() to match the actual usage in BytecodeGenerator, where - this function is used to allocate a group of registers at once, rather - than merely saving space for them. - - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::BytecodeGenerator): Use grow() instead of - reserveCapacity(). - * bytecompiler/SegmentedVector.h: - (JSC::SegmentedVector::SegmentedVector): - (JSC::SegmentedVector::last): - (JSC::SegmentedVector::append): - (JSC::SegmentedVector::removeLast): - (JSC::SegmentedVector::grow): Renamed from reserveCapacity(). - (JSC::SegmentedVector::clear): - -2008-12-01 Mark Rowe <mrowe@apple.com> - - Rubber-stamped by Anders Carlsson. - - Disable WREC for x86_64 since memory allocated by the system allocator is not marked executable, - which causes 64-bit debug builds to crash. Once we have a dedicated allocator for executable - memory we can turn this back on. - - * wtf/Platform.h: - -2008-12-01 Antti Koivisto <antti@apple.com> - - Reviewed by Maciej Stachowiak. - - Restore inline buffer after vector is shrunk back below its inline capacity. - - * wtf/Vector.h: - (WTF::): - (WTF::VectorBuffer::restoreInlineBufferIfNeeded): - (WTF::::shrinkCapacity): - -2008-11-30 Antti Koivisto <antti@apple.com> - - Reviewed by Mark Rowe. - - Try to return free pages in the current thread cache too. - - * wtf/FastMalloc.cpp: - (WTF::TCMallocStats::releaseFastMallocFreeMemory): - -2008-12-01 David Levin <levin@chromium.org> - - Reviewed by Alexey Proskuryakov. - - https://bugs.webkit.org/show_bug.cgi?id=22567 - Make HashTable work as expected with respect to threads. Specifically, it has class-level - thread safety and constant methods work on constant objects without synchronization. - - No observable change in behavior, so no test. This only affects debug builds. - - * wtf/HashTable.cpp: - (WTF::hashTableStatsMutex): - (WTF::HashTableStats::~HashTableStats): - (WTF::HashTableStats::recordCollisionAtCount): - Guarded variable access with a mutex. - - * wtf/HashTable.h: - (WTF::::lookup): - (WTF::::lookupForWriting): - (WTF::::fullLookupForWriting): - (WTF::::add): - (WTF::::reinsert): - (WTF::::remove): - (WTF::::rehash): - Changed increments of static variables to use atomicIncrement. - - (WTF::::invalidateIterators): - (WTF::addIterator): - (WTF::removeIterator): - Guarded mutable access with a mutex. - -2008-11-29 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Cameron Zwarich. - - Enable WREC on PLATFORM(X86_64). This change predominantly requires changes to the - WREC::Generator::generateEnter method to support the x86-64 ABI, and addition of - support for a limited number of quadword operations in the X86Assembler. - - This patch will cause the JS heap to be allocated with RWX permissions on 64-bit Mac - platforms. This is a regression with respect to previous 64-bit behaviour, but is no - more permissive than on 32-bit builds. This issue should be addressed at some point. - (This is tracked by bug #21783.) - - https://bugs.webkit.org/show_bug.cgi?id=22554 - Greater than 4x speedup on regexp-dna, on x86-64. - - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::addPtr): - (JSC::MacroAssembler::loadPtr): - (JSC::MacroAssembler::storePtr): - (JSC::MacroAssembler::pop): - (JSC::MacroAssembler::push): - (JSC::MacroAssembler::move): - * assembler/X86Assembler.h: - (JSC::X86Assembler::): - (JSC::X86Assembler::movq_rr): - (JSC::X86Assembler::addl_i8m): - (JSC::X86Assembler::addl_i32r): - (JSC::X86Assembler::addq_i8r): - (JSC::X86Assembler::addq_i32r): - (JSC::X86Assembler::movq_mr): - (JSC::X86Assembler::movq_rm): - * wrec/WREC.h: - * wrec/WRECGenerator.cpp: - (JSC::WREC::Generator::generateEnter): - (JSC::WREC::Generator::generateReturnSuccess): - (JSC::WREC::Generator::generateReturnFailure): - * wtf/Platform.h: - * wtf/TCSystemAlloc.cpp: - -2008-12-01 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Sam Weinig. - - Preliminary work for bug 20340: SegmentedVector segment allocations can lead to unsafe use of temporary registers - <https://bugs.webkit.org/show_bug.cgi?id=20340> - - SegmentedVector currently frees segments and reallocates them when used - as a stack. This can lead to unsafe use of pointers into freed segments. - - In order to fix this problem, SegmentedVector will be changed to only - grow and never shrink, with the sole exception of clearing all of its - data, a capability that is required by Lexer. This patch changes the - public interface to only allow for these capabilities. - - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::BytecodeGenerator): Use reserveCapacity() - instead of resize() for m_globals and m_parameters. - * bytecompiler/SegmentedVector.h: - (JSC::SegmentedVector::resize): Removed. - (JSC::SegmentedVector::reserveCapacity): Added. - (JSC::SegmentedVector::clear): Added. - (JSC::SegmentedVector::shrink): Removed. - (JSC::SegmentedVector::grow): Removed. - * parser/Lexer.cpp: - (JSC::Lexer::clear): Use clear() instead of resize(0). - -2008-11-30 Sam Weinig <sam@webkit.org> - - Reviewed by Mark Rowe. - - Renames jumps to m_jumps in JumpList. - - * assembler/MacroAssembler.h: - (JSC::MacroAssembler::JumpList::link): - (JSC::MacroAssembler::JumpList::linkTo): - (JSC::MacroAssembler::JumpList::append): - -2008-11-30 Antti Koivisto <antti@apple.com> - - Reviewed by Mark Rowe. - - https://bugs.webkit.org/show_bug.cgi?id=22557 - - Report free size in central and thread caches too. - - * wtf/FastMalloc.cpp: - (WTF::TCMallocStats::fastMallocStatistics): - * wtf/FastMalloc.h: - -2008-11-29 Antti Koivisto <antti@apple.com> - - Reviewed by Dan Bernstein. - - https://bugs.webkit.org/show_bug.cgi?id=22557 - Add statistics for JavaScript GC heap. - - * JavaScriptCore.exp: - * runtime/Collector.cpp: - (JSC::Heap::objectCount): - (JSC::addToStatistics): - (JSC::Heap::statistics): - * runtime/Collector.h: - -2008-11-29 Antti Koivisto <antti@apple.com> - - Fix debug build by adding a stub method. - - * wtf/FastMalloc.cpp: - (WTF::fastMallocStatistics): - -2008-11-29 Antti Koivisto <antti@apple.com> - - Reviewed by Alexey Proskuryakov. - - https://bugs.webkit.org/show_bug.cgi?id=22557 - - Add function for getting basic statistics from FastMalloc. - - * JavaScriptCore.exp: - * wtf/FastMalloc.cpp: - (WTF::DLL_Length): - (WTF::TCMalloc_PageHeap::ReturnedBytes): - (WTF::TCMallocStats::fastMallocStatistics): - * wtf/FastMalloc.h: - -2008-11-29 Cameron Zwarich <zwarich@apple.com> - - Not reviewed. - - The C++ standard does not automatically grant the friendships of an - enclosing class to its nested subclasses, so we should do so explicitly. - This fixes the GCC 4.0 build, although both GCC 4.2 and Visual C++ 2005 - accept the incorrect code as it is. - - * assembler/MacroAssembler.h: - -2008-11-29 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Cameron Zwarich. - - Add the class MacroAssembler to provide some abstraction of code generation, - and change WREC to make use of this class, rather than directly accessing - the X86Assembler. - - This patch also allows WREC to be compiled without the rest of the JIT enabled. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * assembler/MacroAssembler.h: Added. - (JSC::MacroAssembler::): - (JSC::MacroAssembler::MacroAssembler): - (JSC::MacroAssembler::copyCode): - (JSC::MacroAssembler::Address::Address): - (JSC::MacroAssembler::ImplicitAddress::ImplicitAddress): - (JSC::MacroAssembler::BaseIndex::BaseIndex): - (JSC::MacroAssembler::Label::Label): - (JSC::MacroAssembler::Jump::Jump): - (JSC::MacroAssembler::Jump::link): - (JSC::MacroAssembler::Jump::linkTo): - (JSC::MacroAssembler::JumpList::link): - (JSC::MacroAssembler::JumpList::linkTo): - (JSC::MacroAssembler::JumpList::append): - (JSC::MacroAssembler::Imm32::Imm32): - (JSC::MacroAssembler::add32): - (JSC::MacroAssembler::or32): - (JSC::MacroAssembler::sub32): - (JSC::MacroAssembler::loadPtr): - (JSC::MacroAssembler::load32): - (JSC::MacroAssembler::load16): - (JSC::MacroAssembler::storePtr): - (JSC::MacroAssembler::store32): - (JSC::MacroAssembler::pop): - (JSC::MacroAssembler::push): - (JSC::MacroAssembler::peek): - (JSC::MacroAssembler::poke): - (JSC::MacroAssembler::move): - (JSC::MacroAssembler::compareImm32ForBranch): - (JSC::MacroAssembler::compareImm32ForBranchEquality): - (JSC::MacroAssembler::jae32): - (JSC::MacroAssembler::je32): - (JSC::MacroAssembler::je16): - (JSC::MacroAssembler::jg32): - (JSC::MacroAssembler::jge32): - (JSC::MacroAssembler::jl32): - (JSC::MacroAssembler::jle32): - (JSC::MacroAssembler::jne32): - (JSC::MacroAssembler::jump): - (JSC::MacroAssembler::breakpoint): - (JSC::MacroAssembler::ret): - * assembler/X86Assembler.h: - (JSC::X86Assembler::cmpw_rm): - * interpreter/Interpreter.cpp: - (JSC::Interpreter::Interpreter): - * interpreter/Interpreter.h: - (JSC::Interpreter::assemblerBuffer): - * runtime/RegExp.cpp: - (JSC::RegExp::RegExp): - * wrec/WREC.cpp: - (JSC::WREC::Generator::compileRegExp): - * wrec/WREC.h: - * wrec/WRECFunctors.cpp: - (JSC::WREC::GeneratePatternCharacterFunctor::generateAtom): - (JSC::WREC::GenerateCharacterClassFunctor::generateAtom): - (JSC::WREC::GenerateBackreferenceFunctor::generateAtom): - (JSC::WREC::GenerateParenthesesNonGreedyFunctor::generateAtom): - * wrec/WRECFunctors.h: - (JSC::WREC::GenerateParenthesesNonGreedyFunctor::GenerateParenthesesNonGreedyFunctor): - * wrec/WRECGenerator.cpp: - (JSC::WREC::Generator::generateEnter): - (JSC::WREC::Generator::generateReturnSuccess): - (JSC::WREC::Generator::generateSaveIndex): - (JSC::WREC::Generator::generateIncrementIndex): - (JSC::WREC::Generator::generateLoadCharacter): - (JSC::WREC::Generator::generateJumpIfEndOfInput): - (JSC::WREC::Generator::generateJumpIfNotEndOfInput): - (JSC::WREC::Generator::generateReturnFailure): - (JSC::WREC::Generator::generateBacktrack1): - (JSC::WREC::Generator::generateBacktrackBackreference): - (JSC::WREC::Generator::generateBackreferenceQuantifier): - (JSC::WREC::Generator::generateNonGreedyQuantifier): - (JSC::WREC::Generator::generateGreedyQuantifier): - (JSC::WREC::Generator::generatePatternCharacter): - (JSC::WREC::Generator::generateCharacterClassInvertedRange): - (JSC::WREC::Generator::generateCharacterClassInverted): - (JSC::WREC::Generator::generateCharacterClass): - (JSC::WREC::Generator::generateParentheses): - (JSC::WREC::Generator::generateParenthesesNonGreedy): - (JSC::WREC::Generator::generateParenthesesResetTrampoline): - (JSC::WREC::Generator::generateAssertionBOL): - (JSC::WREC::Generator::generateAssertionEOL): - (JSC::WREC::Generator::generateAssertionWordBoundary): - (JSC::WREC::Generator::generateBackreference): - (JSC::WREC::Generator::terminateAlternative): - (JSC::WREC::Generator::terminateDisjunction): - * wrec/WRECGenerator.h: - (JSC::WREC::Generator::Generator): - * wrec/WRECParser.cpp: - (JSC::WREC::Parser::parsePatternCharacterQualifier): - (JSC::WREC::Parser::parseCharacterClassQuantifier): - (JSC::WREC::Parser::parseBackreferenceQuantifier): - (JSC::WREC::Parser::parseParentheses): - (JSC::WREC::Parser::parseCharacterClass): - (JSC::WREC::Parser::parseOctalEscape): - (JSC::WREC::Parser::parseEscape): - (JSC::WREC::Parser::parseTerm): - (JSC::WREC::Parser::parseDisjunction): - * wrec/WRECParser.h: - (JSC::WREC::Parser::Parser): - (JSC::WREC::Parser::parsePattern): - (JSC::WREC::Parser::parseAlternative): - * wtf/Platform.h: - -2008-11-28 Simon Hausmann <hausmann@webkit.org> - - Reviewed by Tor Arne Vestbø. - - Fix compilation on Windows CE - - Port away from the use of errno after calling strtol(), instead - detect conversion errors by checking the result and the stop - position. - - * runtime/DateMath.cpp: - (JSC::parseLong): - (JSC::parseDate): - -2008-11-28 Joerg Bornemann <joerg.bornemann@trolltech.com> +2009-07-07 Norbert Leser <norbert.leser@nokia.com> Reviewed by Simon Hausmann. - Implement lowResUTCTime() on Windows CE using GetSystemTime as _ftime() is not available. + https://bugs.webkit.org/show_bug.cgi?id=27056 - * runtime/DateMath.cpp: - (JSC::lowResUTCTime): + Alternate bool operator for codewarrior compiler (WINSCW). + Compiler (latest b482) reports error for UnspecifiedBoolType construct: + "illegal explicit conversion from 'WTF::OwnArrayPtr<JSC::Register>' to 'bool'" -2008-11-28 Simon Hausmann <hausmann@webkit.org> + Same fix as in r38391. - Rubber-stamped by Tor Arne Vestbø. + * JavaScriptCore/wtf/OwnArrayPtr.h: - Removed unnecessary inclusion of errno.h, which also fixes compilation on Windows CE. +2009-07-15 Norbert Leser <norbert.leser@nokia.com> - * runtime/JSGlobalObjectFunctions.cpp: - -2008-11-27 Cameron Zwarich <zwarich@apple.com> - - Not reviewed. - - r38825 made JSFunction::m_body private, but some inspector code in - WebCore sets the field. Add setters for it. - - * runtime/JSFunction.h: - (JSC::JSFunction::setBody): - -2008-11-27 Sam Weinig <sam@webkit.org> - - Reviewed by Cameron Zwarich. - - Fix FIXME by adding accessor for JSFunction's m_body property. - - * interpreter/Interpreter.cpp: - (JSC::Interpreter::cti_op_call_JSFunction): - (JSC::Interpreter::cti_vm_dontLazyLinkCall): - (JSC::Interpreter::cti_vm_lazyLinkCall): - * profiler/Profiler.cpp: - (JSC::createCallIdentifierFromFunctionImp): - * runtime/Arguments.h: - (JSC::Arguments::getArgumentsData): - (JSC::Arguments::Arguments): - * runtime/FunctionPrototype.cpp: - (JSC::functionProtoFuncToString): - * runtime/JSFunction.h: - (JSC::JSFunction::JSFunction): - (JSC::JSFunction::body): - -2008-11-27 Sam Weinig <sam@webkit.org> - - Reviewed by Oliver Hunt. - - Remove unused member variables from ProgramNode. - - * parser/Nodes.h: - -2008-11-27 Brent Fulgham <bfulgham@gmail.com> + Reviewed by Darin Adler. - Reviewed by Alexey Proskuryakov. + Qualify include path with wtf to fix compilation + on Symbian. + https://bugs.webkit.org/show_bug.cgi?id=27055 - Enable mouse panning feaure on Windows Cairo build. - See http://bugs.webkit.org/show_bug.cgi?id=22525 + * interpreter/Interpreter.h: - * wtf/Platform.h: Enable mouse panning feaure on Windows Cairo build. +2009-07-15 Laszlo Gombos <laszlo.1.gombos@nokia.com> -2008-11-27 Alp Toker <alp@nuanti.com> + Reviewed by Dave Kilzer. - Change recently introduced C++ comments in Platform.h to C comments to - fix the minidom build with traditional C. + Turn off non-portable date manipulations for SYMBIAN + https://bugs.webkit.org/show_bug.cgi?id=27064 - Build GtkLauncher and minidom with the '-ansi' compiler flag to detect - API header breakage at build time. + Introduce HAVE(TM_GMTOFF), HAVE(TM_ZONE) and HAVE(TIMEGM) guards + and place the rules for controlling the guards in Platform.h. + Turn off these newly introduced guards for SYMBIAN. - * GNUmakefile.am: + * wtf/DateMath.cpp: + (WTF::calculateUTCOffset): + * wtf/DateMath.h: + (WTF::GregorianDateTime::GregorianDateTime): + (WTF::GregorianDateTime::operator tm): * wtf/Platform.h: -2008-11-27 Alp Toker <alp@nuanti.com> - - Remove C++ comment from JavaScriptCore API headers (introduced r35449). - Fixes build for ANSI C applications using the public API. - - * API/WebKitAvailability.h: - -2008-11-26 Eric Seidel <eric@webkit.org> - - No review, build fix only. - - Fix the JSC Chromium Mac build by adding JavaScriptCore/icu into the include path - - * JavaScriptCore.scons: - -2008-11-25 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Maciej Stachowiak. - - Remove the unused member function JSFunction::getParameterName(). - - * runtime/JSFunction.cpp: - * runtime/JSFunction.h: - -2008-11-24 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. - - Polymorpic caching for get by id chain. Similar to the polymorphic caching already implemented - for self and proto accesses (implemented by allowing multiple trampolines to be JIT genertaed, - and linked together) - the get by id chain caching is implemented as a genericization of the - proto list caching, allowing cached access lists to contain a mix of proto and proto chain - accesses (since in JS style inheritance hierarchies you may commonly see a mix of properties - being overridden on the direct prototype, or higher up its prototype chain). - - In order to allow this patch to compile there is a fix to appease gcc 4.2 compiler issues - (removing the jumps between fall-through cases in privateExecute). - - This patch also removes redundant immediate checking from the reptach code, and fixes a related - memory leak (failure to deallocate trampolines). - - ~2% progression on v8 tests (bulk on the win on deltablue) +2009-07-15 Norbert Leser <norbert.leser@nokia.com> - * bytecode/Instruction.h: - (JSC::PolymorphicAccessStructureList::PolymorphicStubInfo::): - (JSC::PolymorphicAccessStructureList::PolymorphicStubInfo::set): - (JSC::PolymorphicAccessStructureList::PolymorphicAccessStructureList): - (JSC::PolymorphicAccessStructureList::derefStructures): - * interpreter/Interpreter.cpp: - (JSC::countPrototypeChainEntriesAndCheckForProxies): - (JSC::Interpreter::tryCacheGetByID): - (JSC::Interpreter::privateExecute): - (JSC::Interpreter::tryCTICacheGetByID): - (JSC::Interpreter::cti_op_get_by_id_self_fail): - (JSC::getPolymorphicAccessStructureListSlot): - (JSC::Interpreter::cti_op_get_by_id_proto_list): - * interpreter/Interpreter.h: - * jit/JIT.cpp: - (JSC::JIT::privateCompileGetByIdProto): - (JSC::JIT::privateCompileGetByIdSelfList): - (JSC::JIT::privateCompileGetByIdProtoList): - (JSC::JIT::privateCompileGetByIdChainList): - (JSC::JIT::privateCompileGetByIdChain): - (JSC::JIT::privateCompilePatchGetArrayLength): - * jit/JIT.h: - (JSC::JIT::compileGetByIdChainList): - -2008-11-25 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Alexey Proskuryakov. + Reviewed by Simon Hausmann. - Move the collect() call in Heap::heapAllocate() that is conditionally - compiled under COLLECT_ON_EVERY_ALLOCATION so that it is before we get - information about the heap. This was causing assertion failures for me - while I was reducing a bug. + Undef ASSERT on Symbian, to avoid excessive warnings + https://bugs.webkit.org/show_bug.cgi?id=27052 - * runtime/Collector.cpp: - (JSC::Heap::heapAllocate): + * wtf/Assertions.h: -2008-11-24 Cameron Zwarich <zwarich@apple.com> +2009-07-15 Oliver Hunt <oliver@apple.com> - Reviewed by Geoff Garen. + Reviewed by Simon Hausmann. - Bug 13790: Function declarations are not treated as statements (used to affect starcraft2.com) - <https://bugs.webkit.org/show_bug.cgi?id=13790> + REGRESSION: fast/js/postfix-syntax.html fails with interpreter + https://bugs.webkit.org/show_bug.cgi?id=27294 - Modify the parser to treat function declarations as statements, - simplifying the grammar in the process. Technically, according to the - grammar in the ECMA spec, function declarations are not statements and - can not be used everywhere that statements can, but it is not worth the - possibility compatibility issues just to stick to the spec in this case. + When postfix operators operating on locals assign to the same local + the order of operations has to be to store the incremented value, then + store the unmodified number. Rather than implementing this subtle + semantic in the interpreter I've just made the logic explicit in the + bytecode generator, so x=x++ effectively becomes x=ToNumber(x) (for a + local var x). - * parser/Grammar.y: * parser/Nodes.cpp: - (JSC::FuncDeclNode::emitBytecode): Avoid returning ignoredResult() - as a result, because it causes a crash in DoWhileNode::emitBytecode(). - -2008-11-24 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Unroll the regexp matching loop by 1. 10% speedup on simple matching - stress test. No change on SunSpider. - - (I decided not to unroll to arbitrary levels because the returns diminsh - quickly.) - - * wrec/WREC.cpp: - (JSC::WREC::compileRegExp): - * wrec/WRECGenerator.cpp: - (JSC::WREC::Generator::generateJumpIfEndOfInput): - (JSC::WREC::Generator::generateJumpIfNotEndOfInput): - * wrec/WRECGenerator.h: - * wrec/WRECParser.h: - (JSC::WREC::Parser::error): - (JSC::WREC::Parser::parsePattern): - -2008-11-24 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Removed some unnecessary "Generator::" prefixes. - - * wrec/WRECGenerator.cpp: - (JSC::WREC::Generator::generateEnter): - (JSC::WREC::Generator::generateReturnSuccess): - (JSC::WREC::Generator::generateSaveIndex): - (JSC::WREC::Generator::generateIncrementIndex): - (JSC::WREC::Generator::generateLoopIfNotEndOfInput): - (JSC::WREC::Generator::generateReturnFailure): - -2008-11-24 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Made a bunch of WREC::Parser functions private, and added an explicit - "reset()" function, so a parser can be reused. - - * wrec/WRECParser.h: - (JSC::WREC::Parser::Parser): - (JSC::WREC::Parser::generator): - (JSC::WREC::Parser::ignoreCase): - (JSC::WREC::Parser::multiline): - (JSC::WREC::Parser::recordSubpattern): - (JSC::WREC::Parser::numSubpatterns): - (JSC::WREC::Parser::parsePattern): - (JSC::WREC::Parser::parseAlternative): - (JSC::WREC::Parser::reset): - -2008-11-24 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Cameron Zwarich. - - Implement repatching for get by id chain. - Previously the access is performed in a function stub, in the repatch form - the trampoline is not called to; instead the hot path is relinked to jump - directly to the trampoline, if it fails it will jump to the slow case. - - https://bugs.webkit.org/show_bug.cgi?id=22449 - 3% progression on deltablue. - - * jit/JIT.cpp: - (JSC::JIT::privateCompileGetByIdProto): - (JSC::JIT::privateCompileGetByIdChain): + (JSC::emitPostIncOrDec): -2008-11-24 Joerg Bornemann <joerg.bornemann@trolltech.com> +2009-07-15 Oliver Hunt <oliver@apple.com> Reviewed by Simon Hausmann. - https://bugs.webkit.org/show_bug.cgi?id=20746 - - Various small compilation fixes to make the Qt port of WebKit - compile on Windows CE. - - * config.h: Don't set _CRT_RAND_S for CE, it's not available. - * jsc.cpp: Disabled use of debugger includes for CE. It - does not have the debugging functions. - * runtime/DateMath.cpp: Use localtime() on Windows CE. - * wtf/Assertions.cpp: Compile on Windows CE without debugger. - * wtf/Assertions.h: Include windows.h before defining ASSERT. - * wtf/MathExtras.h: Include stdlib.h instead of xmath.h. - * wtf/Platform.h: Disable ERRNO_H and detect endianess based - on the Qt endianess. On Qt for Windows CE the endianess is - defined by the vendor specific build spec. - * wtf/Threading.h: Use the volatile-less atomic functions. - * wtf/dtoa.cpp: Compile without errno. - * wtf/win/MainThreadWin.cpp: Don't include windows.h on CE after - Assertions.h due to the redefinition of ASSERT. - -2008-11-22 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Cameron Zwarich. - - Replace accidentally deleted immediate check from get by id chain trampoline. - https://bugs.webkit.org/show_bug.cgi?id=22413 - - * jit/JIT.cpp: - (JSC::JIT::privateCompileGetByIdChain): - -2008-11-21 Gavin Barraclough <barraclough@apple.com> + REGRESSION(43559): fast/js/kde/arguments-scope.html fails with interpreter + https://bugs.webkit.org/show_bug.cgi?id=27259 - Reviewed by Oliver Hunt. + The interpreter was incorrectly basing its need to create the arguments object + based on the presence of the callframe's argument reference rather than the local + arguments reference. Based on this it then overrode the local variable reference. - Add (really) polymorphic caching for get by id self. - Very similar to caching of prototype accesses, described below. - - Oh, also, probably shouldn't have been leaking those structure list objects. - - 4% preogression on deltablue. - - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::dump): - (JSC::CodeBlock::derefStructures): - (JSC::PrototypeStructureList::derefStructures): - * bytecode/Instruction.h: - * bytecode/Opcode.h: * interpreter/Interpreter.cpp: (JSC::Interpreter::privateExecute): - (JSC::Interpreter::cti_op_get_by_id_self_fail): - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileGetByIdSelfList): - (JSC::JIT::patchGetByIdSelf): - * jit/JIT.h: - (JSC::JIT::compileGetByIdSelfList): - -2008-11-21 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Fixed many crashes seen 'round the world (but only in release builds). - - Update outputParameter offset to reflect slight re-ordering of push - instructions in r38669. - - * wrec/WRECGenerator.cpp: - -2008-11-21 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - A little more RegExp refactoring. - - Deployed a helper function for reading the next character. Used the "link - vector of jumps" helper in a place I missed before. - - * wrec/WRECGenerator.cpp: - (JSC::WREC::Generator::generateLoadCharacter): - (JSC::WREC::Generator::generatePatternCharacter): - (JSC::WREC::Generator::generateCharacterClass): - (JSC::WREC::Generator::generateAssertionEOL): - (JSC::WREC::Generator::generateAssertionWordBoundary): - * wrec/WRECGenerator.h: - -2008-11-21 Alexey Proskuryakov <ap@webkit.org> - - Reviewed by Dan Bernstein. - - https://bugs.webkit.org/show_bug.cgi?id=22402 - Replace abort() with CRASH() - - * wtf/Assertions.h: Added a different method to crash, which should work even is 0xbbadbeef - is a valid memory address. - - * runtime/Collector.cpp: - * wtf/FastMalloc.cpp: - * wtf/FastMalloc.h: - * wtf/TCSpinLock.h: - Replace abort() with CRASH(). - -2008-11-21 Alexey Proskuryakov <ap@webkit.org> - - Reverted fix for bug 22042 (Replace abort() with CRASH()), because it was breaking - FOR_EACH_OPCODE_ID macro somehow, making Safari crash. - - * runtime/Collector.cpp: - (JSC::Heap::heapAllocate): - (JSC::Heap::collect): - * wtf/Assertions.h: - * wtf/FastMalloc.cpp: - (WTF::fastMalloc): - (WTF::fastCalloc): - (WTF::fastRealloc): - (WTF::InitSizeClasses): - (WTF::PageHeapAllocator::New): - (WTF::TCMallocStats::do_malloc): - * wtf/FastMalloc.h: - * wtf/TCSpinLock.h: - (TCMalloc_SpinLock::Init): - (TCMalloc_SpinLock::Finalize): - (TCMalloc_SpinLock::Lock): - (TCMalloc_SpinLock::Unlock): - -2008-11-21 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - A little more RegExp refactoring. - - Moved all assembly from WREC.cpp into WRECGenerator helper functions. - This should help with portability and readability. - - Removed ASSERTs after calls to executableCopy(), and changed - executableCopy() to ASSERT instead. - - * assembler/X86Assembler.h: - (JSC::X86Assembler::executableCopy): - * jit/JIT.cpp: - (JSC::JIT::privateCompile): - (JSC::JIT::privateCompileGetByIdSelf): - (JSC::JIT::privateCompileGetByIdProto): - (JSC::JIT::privateCompileGetByIdChain): - (JSC::JIT::privateCompilePutByIdReplace): - (JSC::JIT::privateCompilePutByIdTransition): - (JSC::JIT::privateCompileCTIMachineTrampolines): - (JSC::JIT::privateCompilePatchGetArrayLength): - * wrec/WREC.cpp: - (JSC::WREC::compileRegExp): - * wrec/WRECGenerator.cpp: - (JSC::WREC::Generator::generateEnter): - (JSC::WREC::Generator::generateReturnSuccess): - (JSC::WREC::Generator::generateSaveIndex): - (JSC::WREC::Generator::generateIncrementIndex): - (JSC::WREC::Generator::generateLoopIfNotEndOfInput): - (JSC::WREC::Generator::generateReturnFailure): - * wrec/WRECGenerator.h: - * wrec/WRECParser.h: - (JSC::WREC::Parser::ignoreCase): - (JSC::WREC::Parser::generator): - -2008-11-21 Alexey Proskuryakov <ap@webkit.org> - - Build fix. - - * wtf/Assertions.h: Use ::abort for C++ code. - -2008-11-21 Alexey Proskuryakov <ap@webkit.org> - - Reviewed by Sam Weinig. - - https://bugs.webkit.org/show_bug.cgi?id=22402 - Replace abort() with CRASH() - - * wtf/Assertions.h: Added abort() after an attempt to crash for extra safety. - - * runtime/Collector.cpp: - * wtf/FastMalloc.cpp: - * wtf/FastMalloc.h: - * wtf/TCSpinLock.h: - Replace abort() with CRASH(). - -2008-11-21 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Renamed wrec => generator. - * wrec/WRECFunctors.cpp: - (JSC::WREC::GeneratePatternCharacterFunctor::generateAtom): - (JSC::WREC::GeneratePatternCharacterFunctor::backtrack): - (JSC::WREC::GenerateCharacterClassFunctor::generateAtom): - (JSC::WREC::GenerateCharacterClassFunctor::backtrack): - (JSC::WREC::GenerateBackreferenceFunctor::generateAtom): - (JSC::WREC::GenerateBackreferenceFunctor::backtrack): - (JSC::WREC::GenerateParenthesesNonGreedyFunctor::generateAtom): +2009-07-14 Steve Falkenburg <sfalken@apple.com> -2008-11-19 Gavin Barraclough <barraclough@apple.com> + Reorganize JavaScriptCore headers into: + API: include/JavaScriptCore/ + Private: include/private/JavaScriptCore/ Reviewed by Darin Adler. - Add support for (really) polymorphic caching of prototype accesses. - - If a cached prototype access misses, cti_op_get_by_id_proto_list is called. - When this occurs the Structure pointers from the instruction stream are copied - off into a new ProtoStubInfo object. A second prototype access trampoline is - generated, and chained onto the first. Subsequent missed call to - cti_op_get_by_id_proto_list_append, which append futher new trampolines, up to - PROTOTYPE_LIST_CACHE_SIZE (currently 4). If any of the misses result in an - access other than to a direct prototype property, list formation is halted (or - for the initial miss, does not take place at all). - - Separate fail case functions are provided for each access since this contributes - to the performance progression (enables better processor branch prediction). - - Overall this is a near 5% progression on v8, with around 10% wins on richards - and deltablue. - - * bytecode/CodeBlock.cpp: - (JSC::CodeBlock::dump): - (JSC::CodeBlock::derefStructures): - * bytecode/Instruction.h: - (JSC::ProtoStructureList::ProtoStubInfo::set): - (JSC::ProtoStructureList::ProtoStructureList): - (JSC::Instruction::Instruction): - (JSC::Instruction::): - * bytecode/Opcode.h: - * interpreter/Interpreter.cpp: - (JSC::Interpreter::privateExecute): - (JSC::Interpreter::tryCTICacheGetByID): - (JSC::Interpreter::cti_op_put_by_id_fail): - (JSC::Interpreter::cti_op_get_by_id_self_fail): - (JSC::Interpreter::cti_op_get_by_id_proto_list): - (JSC::Interpreter::cti_op_get_by_id_proto_list_append): - (JSC::Interpreter::cti_op_get_by_id_proto_list_full): - (JSC::Interpreter::cti_op_get_by_id_proto_fail): - (JSC::Interpreter::cti_op_get_by_id_chain_fail): - (JSC::Interpreter::cti_op_get_by_id_array_fail): - (JSC::Interpreter::cti_op_get_by_id_string_fail): - * interpreter/Interpreter.h: - * jit/JIT.cpp: - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileGetByIdSelf): - (JSC::JIT::privateCompileGetByIdProto): - (JSC::JIT::privateCompileGetByIdProtoList): - (JSC::JIT::privateCompileGetByIdChain): - (JSC::JIT::privateCompileCTIMachineTrampolines): - (JSC::JIT::privateCompilePatchGetArrayLength): - * jit/JIT.h: - (JSC::JIT::compileGetByIdProtoList): - -2008-11-20 Sam Weinig <sam@webkit.org> - - Try and fix the tiger build. - - * parser/Grammar.y: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreCommon.vsprops: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.make: + * JavaScriptCore.vcproj/testapi/testapi.vcproj: + * JavaScriptCore.vcproj/testapi/testapiCommon.vsprops: -2008-11-20 Eric Seidel <eric@webkit.org> +2009-07-14 Zoltan Horvath <hzoltan@inf.u-szeged.hu> Reviewed by Darin Adler. - Make JavaScriptCore Chromium build under Windows (cmd only, cygwin almost works) - https://bugs.webkit.org/show_bug.cgi?id=22347 - - * JavaScriptCore.scons: - * parser/Parser.cpp: Add using std::auto_ptr since we use auto_ptr + Change JSCell's superclass to NoncopyableCustomAllocated + https://bugs.webkit.org/show_bug.cgi?id=27248 -2008-11-20 Steve Falkenburg <sfalken@apple.com> + JSCell class customizes operator new, since Noncopyable will be + inherited from FastAllocBase, NoncopyableCustomAllocated has + to be used. - Fix build. - - Reviewed by Sam Weinig. - - * parser/Parser.cpp: - (JSC::Parser::reparse): - -2008-11-20 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - A little more RegExp refactoring. - - Created a helper function in the assembler for linking a vector of - JmpSrc to a location, and deployed it in a bunch of places. + * runtime/JSCell.h: - * JavaScriptCore.xcodeproj/project.pbxproj: - * assembler/X86Assembler.h: - (JSC::X86Assembler::link): - * wrec/WREC.cpp: - (JSC::WREC::compileRegExp): - * wrec/WRECGenerator.cpp: - (JSC::WREC::Generator::generateNonGreedyQuantifier): - (JSC::WREC::Generator::generateGreedyQuantifier): - (JSC::WREC::Generator::generateCharacterClassInverted): - (JSC::WREC::Generator::generateParentheses): - (JSC::WREC::Generator::generateParenthesesResetTrampoline): - (JSC::WREC::Generator::generateAssertionBOL): - (JSC::WREC::Generator::generateAssertionEOL): - (JSC::WREC::Generator::generateAssertionWordBoundary): - (JSC::WREC::Generator::terminateAlternative): - (JSC::WREC::Generator::terminateDisjunction): - * wrec/WRECParser.cpp: - * wrec/WRECParser.h: - (JSC::WREC::Parser::consumeHex): - -2008-11-20 Sam Weinig <sam@webkit.org> - - Fix non-mac builds. - - * parser/Lexer.cpp: - * parser/Parser.cpp: - -2008-11-20 Sam Weinig <sam@webkit.org> +2009-07-14 Zoltan Horvath <hzoltan@inf.u-szeged.hu> Reviewed by Darin Adler. - Patch for https://bugs.webkit.org/show_bug.cgi?id=22385 - <rdar://problem/6390179> - Lazily reparse FunctionBodyNodes on first execution. + Change all Noncopyable inheriting visibility to public. + https://bugs.webkit.org/show_bug.cgi?id=27225 - - Saves 57MB on Membuster head. + Change all Noncopyable inheriting visibility to public because + it is needed to the custom allocation framework (bug #20422). - * bytecompiler/BytecodeGenerator.cpp: - (JSC::BytecodeGenerator::generate): Remove vector shrinking since this is now - handled by destroying the ScopeNodeData after generation. - - * parser/Grammar.y: Add alternate NoNode version of the grammar - that does not create nodes. This is used to lazily create FunctionBodyNodes - on first execution. - - * parser/Lexer.cpp: - (JSC::Lexer::setCode): Fix bug where on reparse, the Lexer was confused about - what position and length meant. Position is the current position in the original - data buffer (important for getting correct line/column information) and length - the end offset in the original buffer. + * bytecode/SamplingTool.h: + * bytecompiler/RegisterID.h: + * interpreter/CachedCall.h: + * interpreter/RegisterFile.h: * parser/Lexer.h: - (JSC::Lexer::sourceCode): Positions are relative to the beginning of the buffer. - - * parser/Nodes.cpp: - (JSC::ScopeNodeData::ScopeNodeData): Move initialization of ScopeNode data here. - (JSC::ScopeNode::ScopeNode): Add constructor that only sets the JSGlobalData - for FunctionBodyNode stubs. - (JSC::ScopeNode::~ScopeNode): Release m_children now that we don't inherit from - BlockNode. - (JSC::ScopeNode::releaseNodes): Ditto. - (JSC::EvalNode::generateBytecode): Only shrink m_children, as we need to keep around - the rest of the data. - (JSC::FunctionBodyNode::FunctionBodyNode): Add constructor that only sets the - JSGlobalData. - (JSC::FunctionBodyNode::create): Ditto. - (JSC::FunctionBodyNode::generateBytecode): If we don't have the data, do a reparse - to construct it. Then after generation, destroy the data. - (JSC::ProgramNode::generateBytecode): After generation, destroy the AST data. - * parser/Nodes.h: - (JSC::ExpressionNode::): Add isFuncExprNode for FunctionConstructor. - (JSC::StatementNode::): Add isExprStatementNode for FunctionConstructor. - (JSC::ExprStatementNode::): Ditto. - (JSC::ExprStatementNode::expr): Add accessor for FunctionConstructor. - (JSC::FuncExprNode::): Add isFuncExprNode for FunctionConstructor - - (JSC::ScopeNode::adoptData): Adopts a ScopeNodeData. - (JSC::ScopeNode::data): Accessor for ScopeNodeData. - (JSC::ScopeNode::destroyData): Deletes the ScopeNodeData. - (JSC::ScopeNode::setFeatures): Added. - (JSC::ScopeNode::varStack): Added assert. - (JSC::ScopeNode::functionStack): Ditto. - (JSC::ScopeNode::children): Ditto. - (JSC::ScopeNode::neededConstants): Ditto. - Factor m_varStack, m_functionStack, m_children and m_numConstants into ScopeNodeData. - - * parser/Parser.cpp: - (JSC::Parser::reparse): Reparse the SourceCode in the FunctionBodyNode and set - set up the ScopeNodeData for it. * parser/Parser.h: - - * parser/SourceCode.h: - (JSC::SourceCode::endOffset): Added for use in the lexer. - - * runtime/FunctionConstructor.cpp: - (JSC::getFunctionBody): Assuming a ProgramNode with one FunctionExpression in it, - get the FunctionBodyNode. Any issues signifies a parse failure in constructFunction. - (JSC::constructFunction): Make parsing functions in the form new Function(""), easier - by concatenating the strings together (with some glue) and parsing the function expression - as a ProgramNode from which we can receive the FunctionBodyNode. This has the added benefit - of not having special parsing code for the arguments and lazily constructing the - FunctionBodyNode's AST on first execution. - - * runtime/Identifier.h: - (JSC::operator!=): Added. - -2008-11-20 Sam Weinig <sam@webkit.org> - - Reviewed by Geoffrey Garen. - - Speedup the lexer to offset coming re-parsing patch. - - - .6% progression on Sunspider. - - * bytecompiler/SegmentedVector.h: - (JSC::SegmentedVector::shrink): Fixed bug where m_size would not be - set when shrinking to 0. - - * parser/Lexer.cpp: - (JSC::Lexer::Lexer): - (JSC::Lexer::isIdentStart): Use isASCIIAlpha and isASCII to avoid going into ICU in the common cases. - (JSC::Lexer::isIdentPart): Use isASCIIAlphanumeric and isASCII to avoid going into ICU in the common cases - (JSC::isDecimalDigit): Use version in ASCIICType.h. Inlining it was a regression. - (JSC::Lexer::isHexDigit): Ditto. - (JSC::Lexer::isOctalDigit): Ditto. - (JSC::Lexer::clear): Resize the m_identifiers SegmentedVector to initial - capacity - * parser/Lexer.h: Remove unused m_strings vector. Make m_identifiers - a SegmentedVector<Identifier> to avoid allocating a new Identifier* for - each identifier found. The SegmentedVector is need so we can passes - references to the Identifier to the parser, which remain valid even when - the vector is resized. - (JSC::Lexer::makeIdentifier): Inline and return a reference to the added - Identifier. - -2008-11-20 Sam Weinig <sam@webkit.org> - - Reviewed by Darin Adler. - - Add isASCII to ASCIICType. Use coming soon! - - * wtf/ASCIICType.h: - (WTF::isASCII): - -2008-11-20 Sam Weinig <sam@webkit.org> - - Reviewed by Darin Adler. - - Add OwnPtr constructor and OwnPtr::adopt that take an auto_ptr. - + * runtime/ArgList.h: + * runtime/BatchedTransitionOptimizer.h: + * runtime/Collector.h: + * runtime/CommonIdentifiers.h: + * runtime/JSCell.h: + * runtime/JSGlobalObject.h: + * runtime/JSLock.h: + * runtime/JSONObject.cpp: + * runtime/SmallStrings.cpp: + * runtime/SmallStrings.h: + * wtf/CrossThreadRefCounted.h: + * wtf/GOwnPtr.h: + * wtf/Locker.h: + * wtf/MessageQueue.h: + * wtf/OwnArrayPtr.h: + * wtf/OwnFastMallocPtr.h: * wtf/OwnPtr.h: - (WTF::OwnPtr::OwnPtr): - (WTF::OwnPtr::adopt): + * wtf/RefCounted.h: + * wtf/ThreadSpecific.h: + * wtf/Threading.h: + * wtf/Vector.h: + * wtf/unicode/Collator.h: -2008-11-20 Alexey Proskuryakov <ap@webkit.org> +2009-07-14 Zoltan Horvath <hzoltan@inf.u-szeged.hu> Reviewed by Darin Adler. - https://bugs.webkit.org/show_bug.cgi?id=22364 - Crashes seen on Tiger buildbots due to worker threads exhausting pthread keys - - * runtime/Collector.cpp: - (JSC::Heap::Heap): - (JSC::Heap::destroy): - (JSC::Heap::makeUsableFromMultipleThreads): - (JSC::Heap::registerThread): - * runtime/Collector.h: - Pthread key for tracking threads is only created on request now, because this is a limited - resource, and thread tracking is not needed for worker heaps, or for WebCore heap. - - * API/JSContextRef.cpp: (JSGlobalContextCreateInGroup): Call makeUsableFromMultipleThreads(). - - * runtime/JSGlobalData.cpp: (JSC::JSGlobalData::sharedInstance): Ditto. + Change ParserArenaRefCounted's superclass to RefCountedCustomAllocated + https://bugs.webkit.org/show_bug.cgi?id=27249 - * runtime/JSGlobalData.h: (JSC::JSGlobalData::makeUsableFromMultipleThreads): Just forward - the call to Heap, which clients need not know about, ideally. + ParserArenaDeletable customizes operator new, to avoid double inheritance + ParserArenaDeletable's superclass has been changed to RefCountedCustomAllocated. -2008-11-20 Geoffrey Garen <ggaren@apple.com> + * parser/Nodes.h: - Reviewed by Sam Weinig. - - A little more WREC refactoring. - - Removed the "Register" suffix from register names in WREC, and renamed: - currentPosition => index - currentValue => character - quantifierCount => repeatCount - - Added a top-level parsePattern function to the WREC parser, which - allowed me to remove the error() and atEndOfPattern() accessors. - - Factored out an MSVC customization into a constant. - - Renamed nextLabel => beginPattern. - - * wrec/WREC.cpp: - (JSC::WREC::compileRegExp): - * wrec/WRECGenerator.cpp: - (JSC::WREC::Generator::generateBacktrack1): - (JSC::WREC::Generator::generateBacktrackBackreference): - (JSC::WREC::Generator::generateBackreferenceQuantifier): - (JSC::WREC::Generator::generateNonGreedyQuantifier): - (JSC::WREC::Generator::generateGreedyQuantifier): - (JSC::WREC::Generator::generatePatternCharacter): - (JSC::WREC::Generator::generateCharacterClassInvertedRange): - (JSC::WREC::Generator::generateCharacterClassInverted): - (JSC::WREC::Generator::generateCharacterClass): - (JSC::WREC::Generator::generateParentheses): - (JSC::WREC::Generator::generateParenthesesResetTrampoline): - (JSC::WREC::Generator::generateAssertionBOL): - (JSC::WREC::Generator::generateAssertionEOL): - (JSC::WREC::Generator::generateAssertionWordBoundary): - (JSC::WREC::Generator::generateBackreference): - (JSC::WREC::Generator::generateDisjunction): - (JSC::WREC::Generator::terminateDisjunction): - * wrec/WRECGenerator.h: - * wrec/WRECParser.h: - (JSC::WREC::Parser::parsePattern): - -2008-11-19 Geoffrey Garen <ggaren@apple.com> +2009-07-14 Zoltan Horvath <hzoltan@inf.u-szeged.hu> Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=22361 - A little more RegExp refactoring. - - Consistently named variables holding the starting position at which - regexp matching should begin to "startOffset". - - A few more "regExpObject" => "regExpConstructor" changes. - - Refactored RegExpObject::match for clarity, and replaced a slow "get" - of the "global" property with a fast access to the global bit. - - Made the error message you see when RegExpObject::match has no input a - little more informative, as in Firefox. - - * runtime/RegExp.cpp: - (JSC::RegExp::match): - * runtime/RegExp.h: - * runtime/RegExpObject.cpp: - (JSC::RegExpObject::match): - * runtime/StringPrototype.cpp: - (JSC::stringProtoFuncReplace): - (JSC::stringProtoFuncMatch): - (JSC::stringProtoFuncSearch): - -2008-11-19 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - A little more refactoring. - - Removed the "emit" and "emitUnlinked" prefixes from the assembler. - - Moved the JmpSrc and JmpDst class definitions to the top of the X86 - assembler class, in accordance with WebKit style guidelines. - - * assembler/X86Assembler.h: - (JSC::X86Assembler::JmpSrc::JmpSrc): - (JSC::X86Assembler::JmpDst::JmpDst): - (JSC::X86Assembler::int3): - (JSC::X86Assembler::pushl_m): - (JSC::X86Assembler::popl_m): - (JSC::X86Assembler::movl_rr): - (JSC::X86Assembler::addl_rr): - (JSC::X86Assembler::addl_i8r): - (JSC::X86Assembler::addl_i8m): - (JSC::X86Assembler::addl_i32r): - (JSC::X86Assembler::addl_mr): - (JSC::X86Assembler::andl_rr): - (JSC::X86Assembler::andl_i32r): - (JSC::X86Assembler::cmpl_i8r): - (JSC::X86Assembler::cmpl_rr): - (JSC::X86Assembler::cmpl_rm): - (JSC::X86Assembler::cmpl_mr): - (JSC::X86Assembler::cmpl_i32r): - (JSC::X86Assembler::cmpl_i32m): - (JSC::X86Assembler::cmpl_i8m): - (JSC::X86Assembler::cmpw_rm): - (JSC::X86Assembler::orl_rr): - (JSC::X86Assembler::orl_mr): - (JSC::X86Assembler::orl_i32r): - (JSC::X86Assembler::subl_rr): - (JSC::X86Assembler::subl_i8r): - (JSC::X86Assembler::subl_i8m): - (JSC::X86Assembler::subl_i32r): - (JSC::X86Assembler::subl_mr): - (JSC::X86Assembler::testl_i32r): - (JSC::X86Assembler::testl_i32m): - (JSC::X86Assembler::testl_rr): - (JSC::X86Assembler::xorl_i8r): - (JSC::X86Assembler::xorl_rr): - (JSC::X86Assembler::sarl_i8r): - (JSC::X86Assembler::sarl_CLr): - (JSC::X86Assembler::shl_i8r): - (JSC::X86Assembler::shll_CLr): - (JSC::X86Assembler::imull_rr): - (JSC::X86Assembler::imull_i32r): - (JSC::X86Assembler::idivl_r): - (JSC::X86Assembler::negl_r): - (JSC::X86Assembler::movl_mr): - (JSC::X86Assembler::movzbl_rr): - (JSC::X86Assembler::movzwl_mr): - (JSC::X86Assembler::movl_rm): - (JSC::X86Assembler::movl_i32r): - (JSC::X86Assembler::movl_i32m): - (JSC::X86Assembler::leal_mr): - (JSC::X86Assembler::jmp_r): - (JSC::X86Assembler::jmp_m): - (JSC::X86Assembler::movsd_mr): - (JSC::X86Assembler::xorpd_mr): - (JSC::X86Assembler::movsd_rm): - (JSC::X86Assembler::movd_rr): - (JSC::X86Assembler::cvtsi2sd_rr): - (JSC::X86Assembler::cvttsd2si_rr): - (JSC::X86Assembler::addsd_mr): - (JSC::X86Assembler::subsd_mr): - (JSC::X86Assembler::mulsd_mr): - (JSC::X86Assembler::addsd_rr): - (JSC::X86Assembler::subsd_rr): - (JSC::X86Assembler::mulsd_rr): - (JSC::X86Assembler::ucomis_rr): - (JSC::X86Assembler::pextrw_irr): - (JSC::X86Assembler::call): - (JSC::X86Assembler::jmp): - (JSC::X86Assembler::jne): - (JSC::X86Assembler::jnz): - (JSC::X86Assembler::je): - (JSC::X86Assembler::jl): - (JSC::X86Assembler::jb): - (JSC::X86Assembler::jle): - (JSC::X86Assembler::jbe): - (JSC::X86Assembler::jge): - (JSC::X86Assembler::jg): - (JSC::X86Assembler::ja): - (JSC::X86Assembler::jae): - (JSC::X86Assembler::jo): - (JSC::X86Assembler::jp): - (JSC::X86Assembler::js): - (JSC::X86Assembler::predictNotTaken): - (JSC::X86Assembler::convertToFastCall): - (JSC::X86Assembler::restoreArgumentReference): - (JSC::X86Assembler::restoreArgumentReferenceForTrampoline): - (JSC::X86Assembler::modRm_rr): - (JSC::X86Assembler::modRm_rr_Unchecked): - (JSC::X86Assembler::modRm_rm): - (JSC::X86Assembler::modRm_rm_Unchecked): - (JSC::X86Assembler::modRm_rmsib): - (JSC::X86Assembler::modRm_opr): - (JSC::X86Assembler::modRm_opr_Unchecked): - (JSC::X86Assembler::modRm_opm): - (JSC::X86Assembler::modRm_opm_Unchecked): - (JSC::X86Assembler::modRm_opmsib): - * jit/JIT.cpp: - (JSC::JIT::emitNakedCall): - (JSC::JIT::emitNakedFastCall): - (JSC::JIT::emitCTICall): - (JSC::JIT::emitJumpSlowCaseIfNotJSCell): - (JSC::JIT::emitJumpSlowCaseIfNotImmNum): - (JSC::JIT::emitFastArithDeTagImmediateJumpIfZero): - (JSC::JIT::emitFastArithIntToImmOrSlowCase): - (JSC::JIT::emitArithIntToImmWithJump): - (JSC::JIT::compileOpCall): - (JSC::JIT::compileOpStrictEq): - (JSC::JIT::emitSlowScriptCheck): - (JSC::JIT::putDoubleResultToJSNumberCellOrJSImmediate): - (JSC::JIT::compileBinaryArithOp): - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileSlowCases): - (JSC::JIT::privateCompile): - (JSC::JIT::privateCompileGetByIdSelf): - (JSC::JIT::privateCompileGetByIdProto): - (JSC::JIT::privateCompileGetByIdChain): - (JSC::JIT::privateCompilePutByIdReplace): - (JSC::JIT::privateCompilePutByIdTransition): - (JSC::JIT::privateCompileCTIMachineTrampolines): - (JSC::JIT::privateCompilePatchGetArrayLength): - * wrec/WREC.cpp: - (JSC::WREC::compileRegExp): - * wrec/WRECGenerator.cpp: - (JSC::WREC::Generator::generateBackreferenceQuantifier): - (JSC::WREC::Generator::generateNonGreedyQuantifier): - (JSC::WREC::Generator::generateGreedyQuantifier): - (JSC::WREC::Generator::generatePatternCharacter): - (JSC::WREC::Generator::generateCharacterClassInvertedRange): - (JSC::WREC::Generator::generateCharacterClassInverted): - (JSC::WREC::Generator::generateCharacterClass): - (JSC::WREC::Generator::generateParentheses): - (JSC::WREC::Generator::generateParenthesesNonGreedy): - (JSC::WREC::Generator::generateParenthesesResetTrampoline): - (JSC::WREC::Generator::generateAssertionBOL): - (JSC::WREC::Generator::generateAssertionEOL): - (JSC::WREC::Generator::generateAssertionWordBoundary): - (JSC::WREC::Generator::generateBackreference): - (JSC::WREC::Generator::generateDisjunction): - -2008-11-19 Simon Hausmann <hausmann@webkit.org> - - Sun CC build fix, removed trailing comman for last enum value. - - * wtf/unicode/qt4/UnicodeQt4.h: - (WTF::Unicode::): - -2008-11-19 Mark Rowe <mrowe@apple.com> - - Reviewed by Alexey Proskuryakov. - - Expand the workaround for Apple GCC compiler bug <rdar://problem/6354696> to all versions of GCC 4.0.1. - It has been observed with builds 5465 (Xcode 3.0) and 5484 (Xcode 3.1), and there is no evidence - that it has been fixed in newer builds of GCC 4.0.1. - - This addresses <https://bugs.webkit.org/show_bug.cgi?id=22351> (WebKit nightly crashes on launch on 10.4.11). - - * wtf/StdLibExtras.h: - -2008-11-18 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Maciej Stachowiak and Geoff Garen. - - Bug 22287: ASSERTION FAILED: Not enough jumps linked in slow case codegen in CTI::privateCompileSlowCases()) - <https://bugs.webkit.org/show_bug.cgi?id=22287> - Fix a typo in the number cell reuse code where the first and second - operands are sometimes confused. + Add RefCountedCustomAllocated to RefCounted.h + https://bugs.webkit.org/show_bug.cgi?id=27232 - * jit/JIT.cpp: - (JSC::JIT::compileBinaryArithOpSlowCase): - -2008-11-18 Dan Bernstein <mitz@apple.com> - - - try to fix the Windows build - - * interpreter/Interpreter.cpp: - (JSC::Interpreter::privateExecute): - -2008-11-18 Geoffrey Garen <ggaren@apple.com> + Some class which are inherited from RefCounted customize + operator new, but RefCounted is inherited from Noncopyable + which will be inherited from FastAllocBase. To avoid + conflicts Noncopyable inheriting was moved down to RefCounted + and to avoid double inheritance this class has been added. - Reviewed by Sam Weinig. - - Minor RegExp cleanup. - - SunSpider says no change. - - * runtime/RegExpObject.cpp: - (JSC::RegExpObject::match): Renamed "regExpObj" to "regExpConstructor". - - * wrec/WREC.cpp: - (JSC::WREC::compileRegExp): Instead of checking for a NULL output vector, - ASSERT that the output vector is not NULL. (The rest of WREC is not - safe to use with a NULL output vector, and we probably don't want to - spend the time and/or performance to make it safe.) + * wtf/RefCounted.h: + (WTF::RefCountedCustomAllocated::deref): + (WTF::RefCountedCustomAllocated::~RefCountedCustomAllocated): -2008-11-18 Geoffrey Garen <ggaren@apple.com> +2009-07-14 Zoltan Horvath <hzoltan@inf.u-szeged.hu> Reviewed by Darin Adler. - - A little more renaming and refactoring. - - VM_CHECK_EXCEPTION() => CHECK_FOR_EXCEPTION(). - NEXT_INSTRUCTION => NEXT_INSTRUCTION(). - - Removed the "Error_" and "TempError_" prefixes from WREC error types. - - Refactored the WREC parser so it doesn't need a "setError" function, - and changed "isEndOfPattern" and its use -- they read kind of backwards - before. - - Changed our "TODO:" error messages at least to say something, since you - can't say "TODO:" in shipping software. - - * interpreter/Interpreter.cpp: - (JSC::Interpreter::privateExecute): - (JSC::Interpreter::cti_op_convert_this): - (JSC::Interpreter::cti_op_add): - (JSC::Interpreter::cti_op_pre_inc): - (JSC::Interpreter::cti_op_loop_if_less): - (JSC::Interpreter::cti_op_loop_if_lesseq): - (JSC::Interpreter::cti_op_put_by_id): - (JSC::Interpreter::cti_op_put_by_id_second): - (JSC::Interpreter::cti_op_put_by_id_generic): - (JSC::Interpreter::cti_op_put_by_id_fail): - (JSC::Interpreter::cti_op_get_by_id): - (JSC::Interpreter::cti_op_get_by_id_second): - (JSC::Interpreter::cti_op_get_by_id_generic): - (JSC::Interpreter::cti_op_get_by_id_fail): - (JSC::Interpreter::cti_op_instanceof): - (JSC::Interpreter::cti_op_del_by_id): - (JSC::Interpreter::cti_op_mul): - (JSC::Interpreter::cti_op_call_NotJSFunction): - (JSC::Interpreter::cti_op_resolve): - (JSC::Interpreter::cti_op_construct_NotJSConstruct): - (JSC::Interpreter::cti_op_get_by_val): - (JSC::Interpreter::cti_op_resolve_func): - (JSC::Interpreter::cti_op_sub): - (JSC::Interpreter::cti_op_put_by_val): - (JSC::Interpreter::cti_op_put_by_val_array): - (JSC::Interpreter::cti_op_lesseq): - (JSC::Interpreter::cti_op_loop_if_true): - (JSC::Interpreter::cti_op_negate): - (JSC::Interpreter::cti_op_resolve_skip): - (JSC::Interpreter::cti_op_resolve_global): - (JSC::Interpreter::cti_op_div): - (JSC::Interpreter::cti_op_pre_dec): - (JSC::Interpreter::cti_op_jless): - (JSC::Interpreter::cti_op_not): - (JSC::Interpreter::cti_op_jtrue): - (JSC::Interpreter::cti_op_post_inc): - (JSC::Interpreter::cti_op_eq): - (JSC::Interpreter::cti_op_lshift): - (JSC::Interpreter::cti_op_bitand): - (JSC::Interpreter::cti_op_rshift): - (JSC::Interpreter::cti_op_bitnot): - (JSC::Interpreter::cti_op_resolve_with_base): - (JSC::Interpreter::cti_op_mod): - (JSC::Interpreter::cti_op_less): - (JSC::Interpreter::cti_op_neq): - (JSC::Interpreter::cti_op_post_dec): - (JSC::Interpreter::cti_op_urshift): - (JSC::Interpreter::cti_op_bitxor): - (JSC::Interpreter::cti_op_bitor): - (JSC::Interpreter::cti_op_push_scope): - (JSC::Interpreter::cti_op_to_jsnumber): - (JSC::Interpreter::cti_op_in): - (JSC::Interpreter::cti_op_del_by_val): - * wrec/WREC.cpp: - (JSC::WREC::compileRegExp): - * wrec/WRECParser.cpp: - (JSC::WREC::Parser::parseGreedyQuantifier): - (JSC::WREC::Parser::parseParentheses): - (JSC::WREC::Parser::parseCharacterClass): - (JSC::WREC::Parser::parseEscape): - * wrec/WRECParser.h: - (JSC::WREC::Parser::): - (JSC::WREC::Parser::atEndOfPattern): - -2008-11-18 Alexey Proskuryakov <ap@webkit.org> - - Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=22337 - Enable workers by default - - * Configurations/JavaScriptCore.xcconfig: Define ENABLE_WORKERS. - -2008-11-18 Alexey Proskuryakov <ap@webkit.org> - - - Windows build fix - - * wrec/WRECFunctors.h: - * wrec/WRECGenerator.h: - * wrec/WRECParser.h: - CharacterClass is a struct, not a class, fix forward declarations. - -2008-11-18 Dan Bernstein <mitz@apple.com> - - - Windows build fix - - * assembler/X86Assembler.h: - -2008-11-17 Geoffrey Garen <ggaren@apple.com> - Not reviewed. + Add NoncopyableCustomAllocated to Noncopyable.h. + https://bugs.webkit.org/show_bug.cgi?id=27228 - Try to fix gtk build. + Some classes which inherited from Noncopyable overrides operator new + since Noncopyable'll be inherited from FastAllocBase, Noncopyable.h + needs to be extended with this new class to support the overriding. - * wrec/Quantifier.h: - -2008-11-17 Geoffrey Garen <ggaren@apple.com> - - Not reviewed. - - Try to fix gtk build. - - * assembler/AssemblerBuffer.h: - -2008-11-17 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Split WREC classes out into individual files, with a few modifications - to more closely match the WebKit coding style. - - * GNUmakefile.am: - * JavaScriptCore.scons: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * assembler/X86Assembler.h: - * runtime/RegExp.cpp: - * wrec/CharacterClass.cpp: Copied from wrec/CharacterClassConstructor.cpp. - (JSC::WREC::CharacterClass::newline): - (JSC::WREC::CharacterClass::digits): - (JSC::WREC::CharacterClass::spaces): - (JSC::WREC::CharacterClass::wordchar): - (JSC::WREC::CharacterClass::nondigits): - (JSC::WREC::CharacterClass::nonspaces): - (JSC::WREC::CharacterClass::nonwordchar): - * wrec/CharacterClass.h: Copied from wrec/CharacterClassConstructor.h. - * wrec/CharacterClassConstructor.cpp: - (JSC::WREC::CharacterClassConstructor::addSortedRange): - (JSC::WREC::CharacterClassConstructor::append): - * wrec/CharacterClassConstructor.h: - * wrec/Quantifier.h: Copied from wrec/WREC.h. - * wrec/WREC.cpp: - (JSC::WREC::compileRegExp): - * wrec/WREC.h: - * wrec/WRECFunctors.cpp: Copied from wrec/WREC.cpp. - * wrec/WRECFunctors.h: Copied from wrec/WREC.cpp. - (JSC::WREC::GenerateAtomFunctor::~GenerateAtomFunctor): - (JSC::WREC::GeneratePatternCharacterFunctor::GeneratePatternCharacterFunctor): - (JSC::WREC::GenerateCharacterClassFunctor::GenerateCharacterClassFunctor): - (JSC::WREC::GenerateBackreferenceFunctor::GenerateBackreferenceFunctor): - (JSC::WREC::GenerateParenthesesNonGreedyFunctor::GenerateParenthesesNonGreedyFunctor): - * wrec/WRECGenerator.cpp: Copied from wrec/WREC.cpp. - (JSC::WREC::Generator::generatePatternCharacter): - (JSC::WREC::Generator::generateCharacterClassInvertedRange): - (JSC::WREC::Generator::generateCharacterClassInverted): - (JSC::WREC::Generator::generateCharacterClass): - (JSC::WREC::Generator::generateParentheses): - (JSC::WREC::Generator::generateAssertionBOL): - (JSC::WREC::Generator::generateAssertionEOL): - (JSC::WREC::Generator::generateAssertionWordBoundary): - * wrec/WRECGenerator.h: Copied from wrec/WREC.h. - * wrec/WRECParser.cpp: Copied from wrec/WREC.cpp. - (JSC::WREC::Parser::parseGreedyQuantifier): - (JSC::WREC::Parser::parseCharacterClassQuantifier): - (JSC::WREC::Parser::parseParentheses): - (JSC::WREC::Parser::parseCharacterClass): - (JSC::WREC::Parser::parseEscape): - (JSC::WREC::Parser::parseTerm): - * wrec/WRECParser.h: Copied from wrec/WREC.h. - (JSC::WREC::Parser::): - (JSC::WREC::Parser::Parser): - (JSC::WREC::Parser::setError): - (JSC::WREC::Parser::error): - (JSC::WREC::Parser::recordSubpattern): - (JSC::WREC::Parser::numSubpatterns): - (JSC::WREC::Parser::ignoreCase): - (JSC::WREC::Parser::multiline): - -2008-11-17 Geoffrey Garen <ggaren@apple.com> - - Not reviewed. - - Try to fix a few builds. - - * JavaScriptCoreSources.bkl: - -2008-11-17 Geoffrey Garen <ggaren@apple.com> - - Not reviewed. - - Try to fix a few builds. - - * JavaScriptCore.pri: - * JavaScriptCore.scons: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2008-11-17 Geoffrey Garen <ggaren@apple.com> + * wtf/Noncopyable.h: + (WTFNoncopyable::NoncopyableCustomAllocated::NoncopyableCustomAllocated): + (WTFNoncopyable::NoncopyableCustomAllocated::~NoncopyableCustomAllocated): - Reviewed by Sam Weinig. - - Moved VM/CTI.* => jit/JIT.*. - - Removed VM. +2009-07-14 Zoltan Horvath <hzoltan@inf.u-szeged.hu> - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.scons: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/CTI.cpp: Removed. - * VM/CTI.h: Removed. - * bytecode/CodeBlock.cpp: - * interpreter/Interpreter.cpp: - * jit: Added. - * jit/JIT.cpp: Copied from VM/CTI.cpp. - * jit/JIT.h: Copied from VM/CTI.h. - * runtime/RegExp.cpp: + Reviewed by Darin Adler. -2008-11-17 Geoffrey Garen <ggaren@apple.com> + Allow custom memory allocation control for JavaScriptCore's IdentifierTable class + https://bugs.webkit.org/show_bug.cgi?id=27260 - Reviewed by Sam Weinig. - - Moved runtime/ExecState.* => interpreter/CallFrame.*. + Inherits IdentifierTable class from FastAllocBase because it has been + instantiated by 'new' in JavaScriptCore/runtime/Identifier.cpp:70. - * API/JSBase.cpp: - * API/OpaqueJSString.cpp: - * GNUmakefile.am: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * debugger/DebuggerCallFrame.h: - * interpreter/CallFrame.cpp: Copied from runtime/ExecState.cpp. - * interpreter/CallFrame.h: Copied from runtime/ExecState.h. - * interpreter/Interpreter.cpp: - * parser/Nodes.cpp: - * profiler/ProfileGenerator.cpp: - * profiler/Profiler.cpp: - * runtime/ClassInfo.h: - * runtime/Collector.cpp: - * runtime/Completion.cpp: - * runtime/ExceptionHelpers.cpp: - * runtime/ExecState.cpp: Removed. - * runtime/ExecState.h: Removed. * runtime/Identifier.cpp: - * runtime/JSFunction.cpp: - * runtime/JSGlobalObjectFunctions.cpp: - * runtime/JSLock.cpp: - * runtime/JSNumberCell.h: - * runtime/JSObject.h: - * runtime/JSString.h: - * runtime/Lookup.h: - * runtime/PropertyNameArray.h: - -2008-11-17 Geoffrey Garen <ggaren@apple.com> - - Not reviewed. - - Try to fix Windows build. - - * API/APICast.h: - -2008-11-17 Geoffrey Garen <ggaren@apple.com> - - Not reviewed. - - Try to fix Windows build. - * API/APICast.h: - * runtime/ExecState.h: +2009-07-14 Zoltan Horvath <hzoltan@inf.u-szeged.hu> -2008-11-17 Geoffrey Garen <ggaren@apple.com> + Reviewed by Darin Adler. - Reviewed by Sam Weinig. - - Moved VM/SamplingTool.* => bytecode/SamplingTool.*. + Allow custom memory allocation control for JavaScriptCore's Profiler class + https://bugs.webkit.org/show_bug.cgi?id=27253 - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.scons: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * VM/SamplingTool.cpp: Removed. - * VM/SamplingTool.h: Removed. - * bytecode/SamplingTool.cpp: Copied from VM/SamplingTool.cpp. - * bytecode/SamplingTool.h: Copied from VM/SamplingTool.h. - * jsc.cpp: - (runWithScripts): + Inherits Profiler class from FastAllocBase because it has been instantiated by + 'new' in JavaScriptCore/profiler/Profiler.cpp:56. -2008-11-17 Geoffrey Garen <ggaren@apple.com> + * profiler/Profiler.h: - Not reviewed. - - Try to fix Windows build. +2009-07-06 George Staikos <george.staikos@torchmobile.com> - * runtime/ExecState.h: + Reviewed by Adam Treat. -2008-11-17 Geoffrey Garen <ggaren@apple.com> + Authors: George Staikos <george.staikos@torchmobile.com>, Joe Mason <joe.mason@torchmobile.com>, Makoto Matsumoto <matumoto@math.keio.ac.jp>, Takuji Nishimura - Reviewed by Sam Weinig. - - Moved VM/ExceptionHelpers.cpp => runtime/ExceptionHelpers.cpp. + https://bugs.webkit.org/show_bug.cgi?id=27030 + Implement custom RNG for WinCE using Mersenne Twister - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.scons: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * VM/ExceptionHelpers.cpp: Removed. - * runtime/ExceptionHelpers.cpp: Copied from VM/ExceptionHelpers.cpp. + * wtf/RandomNumber.cpp: + (WTF::randomNumber): + * wtf/RandomNumberSeed.h: + (WTF::initializeRandomNumberGenerator): + * wtf/wince/mt19937ar.c: Added. + (init_genrand): + (init_by_array): + (genrand_int32): + (genrand_int31): + (genrand_real1): + (genrand_real2): + (genrand_real3): + (genrand_res53): -2008-11-17 Geoffrey Garen <ggaren@apple.com> +2009-07-13 Gustavo Noronha Silva <gustavo.noronha@collabora.co.uk> - Reviewed by Sam Weinig. - - Moved VM/RegisterFile.cpp => interpreter/RegisterFile.cpp. + Unreviewed make dist build fix. - * AllInOneFile.cpp: * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.scons: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * VM/RegisterFile.cpp: Removed. - * interpreter/RegisterFile.cpp: Copied from VM/RegisterFile.cpp. -2008-11-17 Geoffrey Garen <ggaren@apple.com> +2009-07-13 Drew Wilson <atwilson@google.com> - Not reviewed. - - Try to fix Windows build. + Reviewed by David Levin. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2008-11-17 Geoffrey Garen <ggaren@apple.com> + Add ENABLE(SHARED_WORKERS) flag and define SharedWorker APIs + https://bugs.webkit.org/show_bug.cgi?id=26932 - Not reviewed. - - Try to fix Windows build. + Added ENABLE(SHARED_WORKERS) flag (off by default). - * JavaScriptCore.vcproj/jsc/jsc.vcproj: - -2008-11-17 Geoffrey Garen <ggaren@apple.com> + * Configurations/FeatureDefines.xcconfig: - Not reviewed. - - Try to fix Windows build. +2009-07-07 Norbert Leser <norbert.leser@nokia.com> - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + Reviewed by Maciej Stachoviak. -2008-11-17 Geoffrey Garen <ggaren@apple.com> + https://bugs.webkit.org/show_bug.cgi?id=27058 - Reviewed by Sam Weinig. - - Moved: - VM/ExceptionHelpers.h => runtime/ExceptionHelpers.h - VM/Register.h => interpreter/Register.h - VM/RegisterFile.h => interpreter/RegisterFile.h - - - * GNUmakefile.am: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/ExceptionHelpers.h: Removed. - * VM/Register.h: Removed. - * VM/RegisterFile.h: Removed. - * interpreter/Register.h: Copied from VM/Register.h. - * interpreter/RegisterFile.h: Copied from VM/RegisterFile.h. - * runtime/ExceptionHelpers.h: Copied from VM/ExceptionHelpers.h. + Removed superfluous parenthesis around single expression. + Compilers on Symbian platform fail to properly parse and compile. -2008-11-17 Geoffrey Garen <ggaren@apple.com> + * JavaScriptCore/wtf/Platform.h: - Not reviewed. - - Try to fix Qt build. +2009-07-13 Norbert Leser <norbert.leser@nokia.com> - * JavaScriptCore.pri: + Reviewed by Maciej Stachoviak. -2008-11-17 Geoffrey Garen <ggaren@apple.com> + https://bugs.webkit.org/show_bug.cgi?id=27054 - Reviewed by Sam Weinig. - - Moved VM/Machine.cpp => interpreter/Interpreter.cpp. + Renamed Translator to HashTranslator - * DerivedSources.make: - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.scons: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * VM/Machine.cpp: Removed. - * interpreter/Interpreter.cpp: Copied from VM/Machine.cpp. + Codewarrior compiler (WINSCW) latest b482 cannot resolve typename + mismatch between template declaration and definition + (HashTranslator / Translator) -2008-11-17 Geoffrey Garen <ggaren@apple.com> + * wtf/HashSet.h: - Reviewed by Sam Weinig. - - Moved VM/Machine.h => interpreter/Interpreter.h +2009-07-13 Norbert Leser <norbert.leser@nokia.com> - * GNUmakefile.am: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/CTI.cpp: - * VM/CTI.h: - * VM/ExceptionHelpers.cpp: - * VM/Machine.cpp: - * VM/Machine.h: Removed. - * VM/SamplingTool.cpp: - * bytecode/CodeBlock.cpp: - * bytecompiler/BytecodeGenerator.cpp: - * bytecompiler/BytecodeGenerator.h: - * debugger/DebuggerCallFrame.cpp: - * interpreter: Added. - * interpreter/Interpreter.h: Copied from VM/Machine.h. - * profiler/ProfileGenerator.cpp: - * runtime/Arguments.h: - * runtime/ArrayPrototype.cpp: - * runtime/Collector.cpp: - * runtime/Completion.cpp: - * runtime/ExecState.h: - * runtime/FunctionPrototype.cpp: - * runtime/JSActivation.cpp: - * runtime/JSFunction.cpp: - * runtime/JSGlobalData.cpp: - * runtime/JSGlobalObject.cpp: - * runtime/JSGlobalObjectFunctions.cpp: - * wrec/WREC.cpp: + Reviewed by Eric Seidel. -2008-11-17 Geoffrey Garen <ggaren@apple.com> + https://bugs.webkit.org/show_bug.cgi?id=27053 - Reviewed by Sam Weinig. - - Moved runtime/Interpreter.cpp => runtime/Completion.cpp. + Ambiguity in LabelScope initialization - Moved functions from Interpreter.h to Completion.h, and removed - Interpreter.h from the project. + Codewarrior compiler (WINSCW) latest b482 on Symbian cannot resolve + type of "0" unambiguously. Set expression explicitly to + PassRefPtr<Label>::PassRefPtr() - * API/JSBase.cpp: - * AllInOneFile.cpp: - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * jsc.cpp: - * runtime/Completion.cpp: Copied from runtime/Interpreter.cpp. - * runtime/Completion.h: - * runtime/Interpreter.cpp: Removed. - * runtime/Interpreter.h: Removed. + * bytecompiler/BytecodeGenerator.cpp -2008-11-17 Gabor Loki <loki@inf.u-szeged.hu> +2009-07-11 Simon Fraser <simon.fraser@apple.com> - Reviewed by Darin Adler. + Enable support for accelerated compositing and 3d transforms on Leopard. + <https://bugs.webkit.org/show_bug.cgi?id=20166> + <rdar://problem/6120614> - <https://bugs.webkit.org/show_bug.cgi?id=22312> - Fix PCRE include path problem on Qt-port + Reviewed by Oliver Hunt. - * JavaScriptCore.pri: - * pcre/pcre.pri: + * Configurations/FeatureDefines.xcconfig: + * wtf/Platform.h: -2008-11-17 Gabor Loki <loki@inf.u-szeged.hu> +2009-07-10 Mark Rowe <mrowe@apple.com> - Reviewed by Darin Adler. + Second part of the "make Windows happier" dance. - <https://bugs.webkit.org/show_bug.cgi?id=22313> - Add missing CTI source to the build system on Qt-port + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - * JavaScriptCore.pri: +2009-07-10 Mark Rowe <mrowe@apple.com> -2008-11-17 Geoffrey Garen <ggaren@apple.com> + Try and make the Windows build happy. - Not reviewed. - - Try to fix JSGlue build. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: - * JavaScriptCore.xcodeproj/project.pbxproj: +2009-07-10 Kevin McCullough <kmccullough@apple.com> -2008-11-17 Geoffrey Garen <ggaren@apple.com> + Reviewed by Geoffrey Garen. - Not reviewed. - - Try to fix Qt build. + * debugger/Debugger.h: Made this function virtual for use in WebCore's + WebInspector. - * jsc.pro: +2009-07-10 Kwang Yul Seo <skyul@company100.net> -2008-11-17 Geoffrey Garen <ggaren@apple.com> + Reviewed by Darin Adler. - Not reviewed. - - Try to fix Qt build. + ParserArenaDeletable should override delete + https://bugs.webkit.org/show_bug.cgi?id=26790 - * JavaScriptCore.pri: + ParserArenaDeletable overrides new, but it does not override delete. + ParserArenaDeletable must be freed by fastFree + because it is allocated by fastMalloc. -2008-11-17 Geoffrey Garen <ggaren@apple.com> + * parser/NodeConstructors.h: + (JSC::ParserArenaDeletable::operator delete): + * parser/Nodes.h: - Not reviewed. - - Try to fix Qt build. +2009-07-10 Adam Roben <aroben@apple.com> - * JavaScriptCore.pri: + Sort all our Xcode projects -2008-11-17 Geoffrey Garen <ggaren@apple.com> + Accomplished using sort-Xcode-project-file. - Reviewed by Sam Weinig. - - More file moves: - - VM/CodeBlock.* => bytecode/CodeBlock.* - VM/EvalCodeCache.h => bytecode/EvalCodeCache.h - VM/Instruction.h => bytecode/Instruction.h - VM/Opcode.* => bytecode/Opcode.* + Requested by Dave Kilzer. - * GNUmakefile.am: - * JavaScriptCore.scons: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.vcproj/jsc/jsc.vcproj: * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * VM/CodeBlock.cpp: Removed. - * VM/CodeBlock.h: Removed. - * VM/EvalCodeCache.h: Removed. - * VM/Instruction.h: Removed. - * VM/Opcode.cpp: Removed. - * VM/Opcode.h: Removed. - * bytecode: Added. - * bytecode/CodeBlock.cpp: Copied from VM/CodeBlock.cpp. - * bytecode/CodeBlock.h: Copied from VM/CodeBlock.h. - * bytecode/EvalCodeCache.h: Copied from VM/EvalCodeCache.h. - * bytecode/Instruction.h: Copied from VM/Instruction.h. - * bytecode/Opcode.cpp: Copied from VM/Opcode.cpp. - * bytecode/Opcode.h: Copied from VM/Opcode.h. - * jsc.pro: - * jscore.bkl: - -2008-11-17 Geoffrey Garen <ggaren@apple.com> - - Not reviewed. - - Try to fix a few more builds. - - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.scons: - * JavaScriptCoreSources.bkl: - -2008-11-17 Geoffrey Garen <ggaren@apple.com> - - Not reviewed. - - Try to fix gtk build. - - * GNUmakefile.am: -2008-11-17 Geoffrey Garen <ggaren@apple.com> +2009-07-09 Maciej Stachowiak <mjs@apple.com> - Not reviewed. - - Try to fix Windows build. + Not reviewed, build fix. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + Windows build fix for the last change. -2008-11-17 Geoffrey Garen <ggaren@apple.com> + * wtf/dtoa.cpp: Forgot to include Vector.h - Reviewed by Sam Weinig. - - Some file moves: - - VM/LabelID.h => bytecompiler/Label.h - VM/RegisterID.h => bytecompiler/RegisterID.h - VM/SegmentedVector.h => bytecompiler/SegmentedVector.h - bytecompiler/CodeGenerator.* => bytecompiler/BytecodeGenerator.* - - * AllInOneFile.cpp: - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/LabelID.h: Removed. - * VM/RegisterID.h: Removed. - * VM/SegmentedVector.h: Removed. - * bytecompiler/BytecodeGenerator.cpp: Copied from bytecompiler/CodeGenerator.cpp. - * bytecompiler/BytecodeGenerator.h: Copied from bytecompiler/CodeGenerator.h. - * bytecompiler/CodeGenerator.cpp: Removed. - * bytecompiler/CodeGenerator.h: Removed. - * bytecompiler/Label.h: Copied from VM/LabelID.h. - * bytecompiler/LabelScope.h: - * bytecompiler/RegisterID.h: Copied from VM/RegisterID.h. - * bytecompiler/SegmentedVector.h: Copied from VM/SegmentedVector.h. - * jsc.cpp: - * parser/Nodes.cpp: +2009-07-09 Maciej Stachowiak <mjs@apple.com> -2008-11-17 Geoffrey Garen <ggaren@apple.com> + Reviewed by Darin Adler. - Not reviewed. + REGRESSION: crash in edge cases of floating point parsing. + https://bugs.webkit.org/show_bug.cgi?id=27110 + <rdar://problem/7044458> - Try to fix Windows build. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2008-11-17 Geoffrey Garen <ggaren@apple.com> - - Not reviewed. + Tests: fast/css/number-parsing-crash.html + fast/css/number-parsing-crash.html + fast/js/number-parsing-crash.html - Try to fix Windows build. + * wtf/dtoa.cpp: + (WTF::BigInt::BigInt): Converted this to more a proper class, using a Vector + with inline capacity + + (WTF::lshift): Rearranged logic somewhat nontrivially to deal with the new way of sizing BigInts. + Added an assertion to verify that invariants are maintained. + + All other functions are adapted fairly mechanically to the above changes. + (WTF::BigInt::clear): + (WTF::BigInt::size): + (WTF::BigInt::resize): + (WTF::BigInt::words): + (WTF::BigInt::append): + (WTF::multadd): + (WTF::s2b): + (WTF::i2b): + (WTF::mult): + (WTF::cmp): + (WTF::diff): + (WTF::b2d): + (WTF::d2b): + (WTF::ratio): + (WTF::strtod): + (WTF::quorem): + (WTF::dtoa): - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: +2009-07-09 Drew Wilson <atwilson@google.com> -2008-11-17 Geoffrey Garen <ggaren@apple.com> + Reviewed by Alexey Proskuryakov. - Not reviewed. - - Try to fix Windows build. + Turned on CHANNEL_MESSAGING by default because the MessageChannel API + can now be implemented for Web Workers and is reasonably stable. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * Configurations/FeatureDefines.xcconfig: -2008-11-16 Geoffrey Garen <ggaren@apple.com> +2009-07-09 Oliver Hunt <oliver@apple.com> - Not reviewed. - - Try to fix Windows build. + Reviewed by NOBODY (Build fix). - * JavaScriptCore.vcproj/jsc/jsc.vcproj: + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): -2008-11-16 Geoffrey Garen <ggaren@apple.com> +2009-07-09 Oliver Hunt <oliver@apple.com> - Not reviewed. - - Try to fix Windows build. + Reviewed by Darin Adler. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + Bug 27016 - Interpreter crashes due to invalid array indexes + <https://bugs.webkit.org/show_bug.cgi?id=27016> -2008-11-16 Geoffrey Garen <ggaren@apple.com> + Unsigned vs signed conversions results in incorrect behaviour in + 64bit interpreter builds. - Reviewed by Sam Weinig. - - Moved masm => assembler and split "AssemblerBuffer.h" out of "X86Assembler.h". - - Also renamed ENABLE_MASM to ENABLE_ASSEMBLER. + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): - * GNUmakefile.am: - * JavaScriptCore.xcodeproj/project.pbxproj: - * assembler: Added. - * assembler/AssemblerBuffer.h: Copied from masm/X86Assembler.h. - (JSC::AssemblerBuffer::AssemblerBuffer): - (JSC::AssemblerBuffer::~AssemblerBuffer): - (JSC::AssemblerBuffer::ensureSpace): - (JSC::AssemblerBuffer::isAligned): - (JSC::AssemblerBuffer::putByteUnchecked): - (JSC::AssemblerBuffer::putByte): - (JSC::AssemblerBuffer::putShortUnchecked): - (JSC::AssemblerBuffer::putShort): - (JSC::AssemblerBuffer::putIntUnchecked): - (JSC::AssemblerBuffer::putInt): - (JSC::AssemblerBuffer::data): - (JSC::AssemblerBuffer::size): - (JSC::AssemblerBuffer::reset): - (JSC::AssemblerBuffer::executableCopy): - (JSC::AssemblerBuffer::grow): - * assembler/X86Assembler.h: Copied from masm/X86Assembler.h. - * masm: Removed. - * masm/X86Assembler.h: Removed. - * wtf/Platform.h: +2009-07-09 Dimitri Glazkov <dglazkov@chromium.org> -2008-11-16 Geoffrey Garen <ggaren@apple.com> + Reviewed by Darin Fisher. - Not reviewed. - - Try to fix gtk build. + [Chromium] Upstream JavaScriptCore.gypi, the project file for Chromium build. + https://bugs.webkit.org/show_bug.cgi?id=27135 - * GNUmakefile.am: + * JavaScriptCore.gypi: Added. -2008-11-16 Geoffrey Garen <ggaren@apple.com> +2009-07-09 Joe Mason <joe.mason@torchmobile.com> - Not reviewed. + Reviewed by George Staikos. - Fixed tyop. - - * VM/CTI.cpp: - -2008-11-16 Geoffrey Garen <ggaren@apple.com> + Authors: Yong Li <yong.li@torchmobile.com>, Joe Mason <joe.mason@torchmobile.com> - Not reviewed. + https://bugs.webkit.org/show_bug.cgi?id=27031 + Add an override for deleteOwnedPtr(HDC) on Windows - Try to fix windows build. - - * VM/CTI.cpp: - -2008-11-16 Geoffrey Garen <ggaren@apple.com> + * wtf/OwnPtrCommon.h: + * wtf/OwnPtrWin.cpp: + (WTF::deleteOwnedPtr): - Not reviewed. - - Try to fix gtk build. +2009-07-09 Laszlo Gombos <laszlo.1.gombos@nokia.com> - * GNUmakefile.am: + Reviewed by Darin Adler. -2008-11-16 Geoffrey Garen <ggaren@apple.com> + Guard singal.h dependency with HAVE(SIGNAL_H) to enable building jsc + on SYMBIAN. - Reviewed by Sam Weinig. + https://bugs.webkit.org/show_bug.cgi?id=27026 - Renamed ENABLE_CTI and ENABLE(CTI) to ENABLE_JIT and ENABLE(JIT). + Based on Norbert Leser's work. - * VM/CTI.cpp: - * VM/CTI.h: - * VM/CodeBlock.cpp: - (JSC::CodeBlock::~CodeBlock): - * VM/CodeBlock.h: - (JSC::CodeBlock::CodeBlock): - * VM/Machine.cpp: - (JSC::Interpreter::Interpreter): - (JSC::Interpreter::initialize): - (JSC::Interpreter::~Interpreter): - (JSC::Interpreter::execute): - (JSC::Interpreter::privateExecute): - * VM/Machine.h: - * bytecompiler/CodeGenerator.cpp: - (JSC::prepareJumpTableForStringSwitch): - * runtime/JSFunction.cpp: - (JSC::JSFunction::~JSFunction): - * runtime/JSGlobalData.h: - * wrec/WREC.h: + * jsc.cpp: + (printUsageStatement): + (parseArguments): * wtf/Platform.h: - * wtf/TCSystemAlloc.cpp: - -2008-11-16 Geoffrey Garen <ggaren@apple.com> - - Not reviewed. - - Try to fix gtk build. - - * VM/CTI.cpp: - -2008-11-16 Geoffrey Garen <ggaren@apple.com> - - Reviewed by a few people on squirrelfish-dev. - - Renamed CTI => JIT. - - * VM/CTI.cpp: - (JSC::JIT::killLastResultRegister): - (JSC::JIT::emitGetVirtualRegister): - (JSC::JIT::emitGetVirtualRegisters): - (JSC::JIT::emitPutCTIArgFromVirtualRegister): - (JSC::JIT::emitPutCTIArg): - (JSC::JIT::emitGetCTIArg): - (JSC::JIT::emitPutCTIArgConstant): - (JSC::JIT::getConstantImmediateNumericArg): - (JSC::JIT::emitPutCTIParam): - (JSC::JIT::emitGetCTIParam): - (JSC::JIT::emitPutToCallFrameHeader): - (JSC::JIT::emitGetFromCallFrameHeader): - (JSC::JIT::emitPutVirtualRegister): - (JSC::JIT::emitInitRegister): - (JSC::JIT::printBytecodeOperandTypes): - (JSC::JIT::emitAllocateNumber): - (JSC::JIT::emitNakedCall): - (JSC::JIT::emitNakedFastCall): - (JSC::JIT::emitCTICall): - (JSC::JIT::emitJumpSlowCaseIfNotJSCell): - (JSC::JIT::linkSlowCaseIfNotJSCell): - (JSC::JIT::emitJumpSlowCaseIfNotImmNum): - (JSC::JIT::emitJumpSlowCaseIfNotImmNums): - (JSC::JIT::getDeTaggedConstantImmediate): - (JSC::JIT::emitFastArithDeTagImmediate): - (JSC::JIT::emitFastArithDeTagImmediateJumpIfZero): - (JSC::JIT::emitFastArithReTagImmediate): - (JSC::JIT::emitFastArithPotentiallyReTagImmediate): - (JSC::JIT::emitFastArithImmToInt): - (JSC::JIT::emitFastArithIntToImmOrSlowCase): - (JSC::JIT::emitFastArithIntToImmNoCheck): - (JSC::JIT::emitArithIntToImmWithJump): - (JSC::JIT::emitTagAsBoolImmediate): - (JSC::JIT::JIT): - (JSC::JIT::compileOpCallInitializeCallFrame): - (JSC::JIT::compileOpCallSetupArgs): - (JSC::JIT::compileOpCallEvalSetupArgs): - (JSC::JIT::compileOpConstructSetupArgs): - (JSC::JIT::compileOpCall): - (JSC::JIT::compileOpStrictEq): - (JSC::JIT::emitSlowScriptCheck): - (JSC::JIT::putDoubleResultToJSNumberCellOrJSImmediate): - (JSC::JIT::compileBinaryArithOp): - (JSC::JIT::compileBinaryArithOpSlowCase): - (JSC::JIT::privateCompileMainPass): - (JSC::JIT::privateCompileLinkPass): - (JSC::JIT::privateCompileSlowCases): - (JSC::JIT::privateCompile): - (JSC::JIT::privateCompileGetByIdSelf): - (JSC::JIT::privateCompileGetByIdProto): - (JSC::JIT::privateCompileGetByIdChain): - (JSC::JIT::privateCompilePutByIdReplace): - (JSC::JIT::privateCompilePutByIdTransition): - (JSC::JIT::unlinkCall): - (JSC::JIT::linkCall): - (JSC::JIT::privateCompileCTIMachineTrampolines): - (JSC::JIT::freeCTIMachineTrampolines): - (JSC::JIT::patchGetByIdSelf): - (JSC::JIT::patchPutByIdReplace): - (JSC::JIT::privateCompilePatchGetArrayLength): - (JSC::JIT::emitGetVariableObjectRegister): - (JSC::JIT::emitPutVariableObjectRegister): - * VM/CTI.h: - (JSC::JIT::compile): - (JSC::JIT::compileGetByIdSelf): - (JSC::JIT::compileGetByIdProto): - (JSC::JIT::compileGetByIdChain): - (JSC::JIT::compilePutByIdReplace): - (JSC::JIT::compilePutByIdTransition): - (JSC::JIT::compileCTIMachineTrampolines): - (JSC::JIT::compilePatchGetArrayLength): - * VM/CodeBlock.cpp: - (JSC::CodeBlock::unlinkCallers): - * VM/Machine.cpp: - (JSC::Interpreter::initialize): - (JSC::Interpreter::~Interpreter): - (JSC::Interpreter::execute): - (JSC::Interpreter::tryCTICachePutByID): - (JSC::Interpreter::tryCTICacheGetByID): - (JSC::Interpreter::cti_op_call_JSFunction): - (JSC::Interpreter::cti_vm_dontLazyLinkCall): - (JSC::Interpreter::cti_vm_lazyLinkCall): - * VM/Machine.h: - * VM/RegisterFile.h: - * parser/Nodes.h: - * runtime/JSArray.h: - * runtime/JSCell.h: - * runtime/JSFunction.h: - * runtime/JSImmediate.h: - * runtime/JSNumberCell.h: - * runtime/JSObject.h: - * runtime/JSString.h: - * runtime/JSVariableObject.h: - * runtime/ScopeChain.h: - * runtime/Structure.h: - * runtime/TypeInfo.h: - * runtime/UString.h: - -2008-11-16 Geoffrey Garen <ggaren@apple.com> - - Not reviewed. - - Try to fix wx build. - - * jscore.bkl: -2008-11-16 Geoffrey Garen <ggaren@apple.com> +2009-07-07 Gavin Barraclough <barraclough@apple.com> Reviewed by Sam Weinig. - Nixed X86:: and X86Assembler:: prefixes in a lot of places using typedefs. - - * VM/CTI.cpp: - (JSC::CTI::emitGetVirtualRegister): - (JSC::CTI::emitGetVirtualRegisters): - (JSC::CTI::emitPutCTIArgFromVirtualRegister): - (JSC::CTI::emitPutCTIArg): - (JSC::CTI::emitGetCTIArg): - (JSC::CTI::emitPutCTIParam): - (JSC::CTI::emitGetCTIParam): - (JSC::CTI::emitPutToCallFrameHeader): - (JSC::CTI::emitGetFromCallFrameHeader): - (JSC::CTI::emitPutVirtualRegister): - (JSC::CTI::emitNakedCall): - (JSC::CTI::emitNakedFastCall): - (JSC::CTI::emitCTICall): - (JSC::CTI::emitJumpSlowCaseIfNotJSCell): - (JSC::CTI::emitJumpSlowCaseIfNotImmNum): - (JSC::CTI::emitJumpSlowCaseIfNotImmNums): - (JSC::CTI::emitFastArithDeTagImmediate): - (JSC::CTI::emitFastArithDeTagImmediateJumpIfZero): - (JSC::CTI::emitFastArithReTagImmediate): - (JSC::CTI::emitFastArithPotentiallyReTagImmediate): - (JSC::CTI::emitFastArithImmToInt): - (JSC::CTI::emitFastArithIntToImmOrSlowCase): - (JSC::CTI::emitFastArithIntToImmNoCheck): - (JSC::CTI::emitArithIntToImmWithJump): - (JSC::CTI::emitTagAsBoolImmediate): - (JSC::CTI::compileOpCall): - (JSC::CTI::compileOpStrictEq): - (JSC::CTI::emitSlowScriptCheck): - (JSC::CTI::putDoubleResultToJSNumberCellOrJSImmediate): - (JSC::CTI::compileBinaryArithOp): - (JSC::CTI::compileBinaryArithOpSlowCase): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - (JSC::CTI::privateCompile): - (JSC::CTI::privateCompileGetByIdSelf): - (JSC::CTI::privateCompileGetByIdProto): - (JSC::CTI::privateCompileGetByIdChain): - (JSC::CTI::privateCompilePutByIdReplace): - (JSC::CTI::privateCompilePutByIdTransition): - (JSC::CTI::privateCompileCTIMachineTrampolines): - (JSC::CTI::privateCompilePatchGetArrayLength): - (JSC::CTI::emitGetVariableObjectRegister): - (JSC::CTI::emitPutVariableObjectRegister): - * VM/CTI.h: - (JSC::CallRecord::CallRecord): - (JSC::JmpTable::JmpTable): - (JSC::SlowCaseEntry::SlowCaseEntry): - (JSC::CTI::JSRInfo::JSRInfo): - * wrec/WREC.h: - -2008-11-16 Geoffrey Garen <ggaren@apple.com> - - Not reviewed. - - Try to fix Qt build. + Stop loading constants into the register file. - * JavaScriptCore.pri: + Instead, use high register values (highest bit bar the sign bit set) to indicate + constants in the instruction stream, and when we encounter such a value load it + directly from the CodeBlock. -2008-11-16 Geoffrey Garen <ggaren@apple.com> + Since constants are no longer copied into the register file, this patch renders + the 'unexpected constant' mechanism redundant, and removes it. - Reviewed by Sam Weinig. - - Renamed OBJECT_OFFSET => FIELD_OFFSET - - Nixed use of OBJECT_OFFSET outside of CTI.cpp by making CTI a friend in - more places. - - * VM/CTI.cpp: - (JSC::CTI::compileOpCallInitializeCallFrame): - (JSC::CTI::compileOpCall): - (JSC::CTI::emitSlowScriptCheck): - (JSC::CTI::putDoubleResultToJSNumberCellOrJSImmediate): - (JSC::CTI::compileBinaryArithOp): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - (JSC::CTI::privateCompile): - (JSC::CTI::privateCompileGetByIdSelf): - (JSC::CTI::privateCompileGetByIdProto): - (JSC::CTI::privateCompileGetByIdChain): - (JSC::CTI::privateCompilePutByIdReplace): - (JSC::CTI::privateCompilePutByIdTransition): - (JSC::CTI::privateCompileCTIMachineTrampolines): - (JSC::CTI::privateCompilePatchGetArrayLength): - (JSC::CTI::emitGetVariableObjectRegister): - (JSC::CTI::emitPutVariableObjectRegister): - * runtime/JSValue.h: - * runtime/JSVariableObject.h: - -2008-11-16 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Renames: - - X86Assembler::copy => X86Assembler::executableCopy - AssemblerBuffer::copy => AssemblerBuffer::executableCopy - - * VM/CTI.cpp: - (JSC::CTI::privateCompile): - (JSC::CTI::privateCompileGetByIdSelf): - (JSC::CTI::privateCompileGetByIdProto): - (JSC::CTI::privateCompileGetByIdChain): - (JSC::CTI::privateCompilePutByIdReplace): - (JSC::CTI::privateCompilePutByIdTransition): - (JSC::CTI::privateCompileCTIMachineTrampolines): - (JSC::CTI::privateCompilePatchGetArrayLength): - * masm/X86Assembler.h: - (JSC::AssemblerBuffer::executableCopy): - (JSC::X86Assembler::executableCopy): - * wrec/WREC.cpp: - (JSC::WREC::compileRegExp): - -2008-11-16 Geoffrey Garen <ggaren@apple.com> + 2% improvement, thanks to Sam Weinig. - Reviewed by Sam Weinig. - - Renamed WREC => JSC::WREC, removing JSC:: prefix in a lot of places. - Renamed WRECFunction => WREC::CompiledRegExp, and deployed this type - name in place of a few casts. - - * runtime/RegExp.cpp: - (JSC::RegExp::RegExp): - (JSC::RegExp::~RegExp): - (JSC::RegExp::match): - * runtime/RegExp.h: - * wrec/CharacterClassConstructor.cpp: - * wrec/CharacterClassConstructor.h: - * wrec/WREC.cpp: - (JSC::WREC::compileRegExp): - * wrec/WREC.h: - (JSC::WREC::Generator::Generator): - (JSC::WREC::Parser::Parser): - (JSC::WREC::Parser::parseAlternative): - -2008-11-16 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Renamed BytecodeInterpreter => Interpreter. - - * JavaScriptCore.exp: - * VM/CTI.cpp: - (JSC::): - (JSC::CTI::compileOpCall): - (JSC::CTI::emitSlowScriptCheck): - (JSC::CTI::compileBinaryArithOpSlowCase): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - (JSC::CTI::privateCompile): - (JSC::CTI::privateCompileGetByIdSelf): - (JSC::CTI::privateCompileGetByIdProto): - (JSC::CTI::privateCompileGetByIdChain): - (JSC::CTI::privateCompilePutByIdReplace): - (JSC::CTI::privateCompilePutByIdTransition): - (JSC::CTI::privateCompileCTIMachineTrampolines): - (JSC::CTI::freeCTIMachineTrampolines): - (JSC::CTI::patchGetByIdSelf): - (JSC::CTI::patchPutByIdReplace): - (JSC::CTI::privateCompilePatchGetArrayLength): - * VM/CTI.h: - * VM/CodeBlock.cpp: - (JSC::CodeBlock::printStructures): - (JSC::CodeBlock::derefStructures): - (JSC::CodeBlock::refStructures): - * VM/Machine.cpp: - (JSC::jsLess): - (JSC::jsLessEq): - (JSC::Interpreter::resolve): - (JSC::Interpreter::resolveSkip): - (JSC::Interpreter::resolveGlobal): - (JSC::Interpreter::resolveBase): - (JSC::Interpreter::resolveBaseAndProperty): - (JSC::Interpreter::resolveBaseAndFunc): - (JSC::Interpreter::slideRegisterWindowForCall): - (JSC::Interpreter::callEval): - (JSC::Interpreter::Interpreter): - (JSC::Interpreter::initialize): - (JSC::Interpreter::~Interpreter): - (JSC::Interpreter::dumpCallFrame): - (JSC::Interpreter::dumpRegisters): - (JSC::Interpreter::isOpcode): - (JSC::Interpreter::unwindCallFrame): - (JSC::Interpreter::throwException): - (JSC::Interpreter::execute): - (JSC::Interpreter::debug): - (JSC::Interpreter::resetTimeoutCheck): - (JSC::Interpreter::checkTimeout): - (JSC::Interpreter::createExceptionScope): - (JSC::Interpreter::tryCachePutByID): - (JSC::Interpreter::uncachePutByID): - (JSC::Interpreter::tryCacheGetByID): - (JSC::Interpreter::uncacheGetByID): - (JSC::Interpreter::privateExecute): - (JSC::Interpreter::retrieveArguments): - (JSC::Interpreter::retrieveCaller): - (JSC::Interpreter::retrieveLastCaller): - (JSC::Interpreter::findFunctionCallFrame): - (JSC::Interpreter::tryCTICachePutByID): - (JSC::Interpreter::tryCTICacheGetByID): - (JSC::Interpreter::cti_op_convert_this): - (JSC::Interpreter::cti_op_end): - (JSC::Interpreter::cti_op_add): - (JSC::Interpreter::cti_op_pre_inc): - (JSC::Interpreter::cti_timeout_check): - (JSC::Interpreter::cti_register_file_check): - (JSC::Interpreter::cti_op_loop_if_less): - (JSC::Interpreter::cti_op_loop_if_lesseq): - (JSC::Interpreter::cti_op_new_object): - (JSC::Interpreter::cti_op_put_by_id): - (JSC::Interpreter::cti_op_put_by_id_second): - (JSC::Interpreter::cti_op_put_by_id_generic): - (JSC::Interpreter::cti_op_put_by_id_fail): - (JSC::Interpreter::cti_op_get_by_id): - (JSC::Interpreter::cti_op_get_by_id_second): - (JSC::Interpreter::cti_op_get_by_id_generic): - (JSC::Interpreter::cti_op_get_by_id_fail): - (JSC::Interpreter::cti_op_instanceof): - (JSC::Interpreter::cti_op_del_by_id): - (JSC::Interpreter::cti_op_mul): - (JSC::Interpreter::cti_op_new_func): - (JSC::Interpreter::cti_op_call_JSFunction): - (JSC::Interpreter::cti_op_call_arityCheck): - (JSC::Interpreter::cti_vm_dontLazyLinkCall): - (JSC::Interpreter::cti_vm_lazyLinkCall): - (JSC::Interpreter::cti_op_push_activation): - (JSC::Interpreter::cti_op_call_NotJSFunction): - (JSC::Interpreter::cti_op_create_arguments): - (JSC::Interpreter::cti_op_create_arguments_no_params): - (JSC::Interpreter::cti_op_tear_off_activation): - (JSC::Interpreter::cti_op_tear_off_arguments): - (JSC::Interpreter::cti_op_profile_will_call): - (JSC::Interpreter::cti_op_profile_did_call): - (JSC::Interpreter::cti_op_ret_scopeChain): - (JSC::Interpreter::cti_op_new_array): - (JSC::Interpreter::cti_op_resolve): - (JSC::Interpreter::cti_op_construct_JSConstruct): - (JSC::Interpreter::cti_op_construct_NotJSConstruct): - (JSC::Interpreter::cti_op_get_by_val): - (JSC::Interpreter::cti_op_resolve_func): - (JSC::Interpreter::cti_op_sub): - (JSC::Interpreter::cti_op_put_by_val): - (JSC::Interpreter::cti_op_put_by_val_array): - (JSC::Interpreter::cti_op_lesseq): - (JSC::Interpreter::cti_op_loop_if_true): - (JSC::Interpreter::cti_op_negate): - (JSC::Interpreter::cti_op_resolve_base): - (JSC::Interpreter::cti_op_resolve_skip): - (JSC::Interpreter::cti_op_resolve_global): - (JSC::Interpreter::cti_op_div): - (JSC::Interpreter::cti_op_pre_dec): - (JSC::Interpreter::cti_op_jless): - (JSC::Interpreter::cti_op_not): - (JSC::Interpreter::cti_op_jtrue): - (JSC::Interpreter::cti_op_post_inc): - (JSC::Interpreter::cti_op_eq): - (JSC::Interpreter::cti_op_lshift): - (JSC::Interpreter::cti_op_bitand): - (JSC::Interpreter::cti_op_rshift): - (JSC::Interpreter::cti_op_bitnot): - (JSC::Interpreter::cti_op_resolve_with_base): - (JSC::Interpreter::cti_op_new_func_exp): - (JSC::Interpreter::cti_op_mod): - (JSC::Interpreter::cti_op_less): - (JSC::Interpreter::cti_op_neq): - (JSC::Interpreter::cti_op_post_dec): - (JSC::Interpreter::cti_op_urshift): - (JSC::Interpreter::cti_op_bitxor): - (JSC::Interpreter::cti_op_new_regexp): - (JSC::Interpreter::cti_op_bitor): - (JSC::Interpreter::cti_op_call_eval): - (JSC::Interpreter::cti_op_throw): - (JSC::Interpreter::cti_op_get_pnames): - (JSC::Interpreter::cti_op_next_pname): - (JSC::Interpreter::cti_op_push_scope): - (JSC::Interpreter::cti_op_pop_scope): - (JSC::Interpreter::cti_op_typeof): - (JSC::Interpreter::cti_op_is_undefined): - (JSC::Interpreter::cti_op_is_boolean): - (JSC::Interpreter::cti_op_is_number): - (JSC::Interpreter::cti_op_is_string): - (JSC::Interpreter::cti_op_is_object): - (JSC::Interpreter::cti_op_is_function): - (JSC::Interpreter::cti_op_stricteq): - (JSC::Interpreter::cti_op_nstricteq): - (JSC::Interpreter::cti_op_to_jsnumber): - (JSC::Interpreter::cti_op_in): - (JSC::Interpreter::cti_op_push_new_scope): - (JSC::Interpreter::cti_op_jmp_scopes): - (JSC::Interpreter::cti_op_put_by_index): - (JSC::Interpreter::cti_op_switch_imm): - (JSC::Interpreter::cti_op_switch_char): - (JSC::Interpreter::cti_op_switch_string): - (JSC::Interpreter::cti_op_del_by_val): - (JSC::Interpreter::cti_op_put_getter): - (JSC::Interpreter::cti_op_put_setter): - (JSC::Interpreter::cti_op_new_error): - (JSC::Interpreter::cti_op_debug): - (JSC::Interpreter::cti_vm_throw): - * VM/Machine.h: - * VM/Register.h: - * VM/SamplingTool.h: - (JSC::SamplingTool::SamplingTool): - * bytecompiler/CodeGenerator.cpp: - (JSC::BytecodeGenerator::generate): + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): + (JSC::CodeBlock::CodeBlock): + (JSC::CodeBlock::mark): + (JSC::CodeBlock::shrinkToFit): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::isTemporaryRegisterIndex): + (JSC::CodeBlock::constantRegister): + (JSC::CodeBlock::isConstantRegisterIndex): + (JSC::CodeBlock::getConstant): + (JSC::ExecState::r): + * bytecode/Opcode.h: + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::preserveLastVar): (JSC::BytecodeGenerator::BytecodeGenerator): - * jsc.cpp: - (runWithScripts): - * runtime/ExecState.h: - (JSC::ExecState::interpreter): - * runtime/JSCell.h: - * runtime/JSFunction.h: - * runtime/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): - * runtime/JSGlobalData.h: - * runtime/JSString.h: - * wrec/WREC.cpp: - (WREC::compileRegExp): - * wrec/WREC.h: - -2008-11-16 Geoffrey Garen <ggaren@apple.com> - - Roll out r38461 (my last patch) because it broke the world. - -2008-11-16 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - A few more renames: - - BytecodeInterpreter => Interpreter - WREC => JSC::WREC, removing JSC:: prefix in a lot of places - X86Assembler::copy => X86Assembler::executableCopy - AssemblerBuffer::copy => AssemblerBuffer::executableCopy - WRECFunction => WREC::RegExpFunction - OBJECT_OFFSET => FIELD_OFFSET - - Also: - - Nixed use of OBJECT_OFFSET outside of CTI.cpp by making CTI a friend in more places. - Nixed X86:: and X86Assembler:: prefixes in a lot of places using typedefs - - * JavaScriptCore.exp: - * VM/CTI.cpp: - (JSC::): - (JSC::CTI::emitGetVirtualRegister): - (JSC::CTI::emitGetVirtualRegisters): - (JSC::CTI::emitPutCTIArgFromVirtualRegister): - (JSC::CTI::emitPutCTIArg): - (JSC::CTI::emitGetCTIArg): - (JSC::CTI::emitPutCTIParam): - (JSC::CTI::emitGetCTIParam): - (JSC::CTI::emitPutToCallFrameHeader): - (JSC::CTI::emitGetFromCallFrameHeader): - (JSC::CTI::emitPutVirtualRegister): - (JSC::CTI::emitNakedCall): - (JSC::CTI::emitNakedFastCall): - (JSC::CTI::emitCTICall): - (JSC::CTI::emitJumpSlowCaseIfNotJSCell): - (JSC::CTI::emitJumpSlowCaseIfNotImmNum): - (JSC::CTI::emitJumpSlowCaseIfNotImmNums): - (JSC::CTI::emitFastArithDeTagImmediate): - (JSC::CTI::emitFastArithDeTagImmediateJumpIfZero): - (JSC::CTI::emitFastArithReTagImmediate): - (JSC::CTI::emitFastArithPotentiallyReTagImmediate): - (JSC::CTI::emitFastArithImmToInt): - (JSC::CTI::emitFastArithIntToImmOrSlowCase): - (JSC::CTI::emitFastArithIntToImmNoCheck): - (JSC::CTI::emitArithIntToImmWithJump): - (JSC::CTI::emitTagAsBoolImmediate): - (JSC::CTI::compileOpCallInitializeCallFrame): - (JSC::CTI::compileOpCall): - (JSC::CTI::compileOpStrictEq): - (JSC::CTI::emitSlowScriptCheck): - (JSC::CTI::putDoubleResultToJSNumberCellOrJSImmediate): - (JSC::CTI::compileBinaryArithOp): - (JSC::CTI::compileBinaryArithOpSlowCase): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - (JSC::CTI::privateCompile): - (JSC::CTI::privateCompileGetByIdSelf): - (JSC::CTI::privateCompileGetByIdProto): - (JSC::CTI::privateCompileGetByIdChain): - (JSC::CTI::privateCompilePutByIdReplace): - (JSC::CTI::privateCompilePutByIdTransition): - (JSC::CTI::privateCompileCTIMachineTrampolines): - (JSC::CTI::freeCTIMachineTrampolines): - (JSC::CTI::patchGetByIdSelf): - (JSC::CTI::patchPutByIdReplace): - (JSC::CTI::privateCompilePatchGetArrayLength): - (JSC::CTI::emitGetVariableObjectRegister): - (JSC::CTI::emitPutVariableObjectRegister): - * VM/CTI.h: - (JSC::CallRecord::CallRecord): - (JSC::JmpTable::JmpTable): - (JSC::SlowCaseEntry::SlowCaseEntry): - (JSC::CTI::JSRInfo::JSRInfo): - * VM/CodeBlock.cpp: - (JSC::CodeBlock::printStructures): - (JSC::CodeBlock::derefStructures): - (JSC::CodeBlock::refStructures): - * VM/Machine.cpp: - (JSC::jsLess): - (JSC::jsLessEq): + (JSC::BytecodeGenerator::addConstantValue): + (JSC::BytecodeGenerator::emitEqualityOp): + (JSC::BytecodeGenerator::emitLoad): + (JSC::BytecodeGenerator::emitResolveBase): + (JSC::BytecodeGenerator::emitResolveWithBase): + (JSC::BytecodeGenerator::emitNewError): + * bytecompiler/BytecodeGenerator.h: + (JSC::BytecodeGenerator::emitNode): + * interpreter/CallFrame.h: + (JSC::ExecState::noCaller): + (JSC::ExecState::hasHostCallFrameFlag): + (JSC::ExecState::addHostCallFrameFlag): + (JSC::ExecState::removeHostCallFrameFlag): + * interpreter/Interpreter.cpp: (JSC::Interpreter::resolve): (JSC::Interpreter::resolveSkip): (JSC::Interpreter::resolveGlobal): (JSC::Interpreter::resolveBase): (JSC::Interpreter::resolveBaseAndProperty): (JSC::Interpreter::resolveBaseAndFunc): - (JSC::Interpreter::slideRegisterWindowForCall): - (JSC::Interpreter::callEval): - (JSC::Interpreter::Interpreter): - (JSC::Interpreter::initialize): - (JSC::Interpreter::~Interpreter): - (JSC::Interpreter::dumpCallFrame): (JSC::Interpreter::dumpRegisters): - (JSC::Interpreter::isOpcode): - (JSC::Interpreter::unwindCallFrame): (JSC::Interpreter::throwException): - (JSC::Interpreter::execute): - (JSC::Interpreter::debug): - (JSC::Interpreter::resetTimeoutCheck): - (JSC::Interpreter::checkTimeout): (JSC::Interpreter::createExceptionScope): - (JSC::Interpreter::tryCachePutByID): - (JSC::Interpreter::uncachePutByID): - (JSC::Interpreter::tryCacheGetByID): - (JSC::Interpreter::uncacheGetByID): (JSC::Interpreter::privateExecute): (JSC::Interpreter::retrieveArguments): - (JSC::Interpreter::retrieveCaller): - (JSC::Interpreter::retrieveLastCaller): - (JSC::Interpreter::findFunctionCallFrame): - (JSC::Interpreter::tryCTICachePutByID): - (JSC::Interpreter::tryCTICacheGetByID): - (JSC::): - (JSC::Interpreter::cti_op_convert_this): - (JSC::Interpreter::cti_op_end): - (JSC::Interpreter::cti_op_add): - (JSC::Interpreter::cti_op_pre_inc): - (JSC::Interpreter::cti_timeout_check): - (JSC::Interpreter::cti_register_file_check): - (JSC::Interpreter::cti_op_loop_if_less): - (JSC::Interpreter::cti_op_loop_if_lesseq): - (JSC::Interpreter::cti_op_new_object): - (JSC::Interpreter::cti_op_put_by_id): - (JSC::Interpreter::cti_op_put_by_id_second): - (JSC::Interpreter::cti_op_put_by_id_generic): - (JSC::Interpreter::cti_op_put_by_id_fail): - (JSC::Interpreter::cti_op_get_by_id): - (JSC::Interpreter::cti_op_get_by_id_second): - (JSC::Interpreter::cti_op_get_by_id_generic): - (JSC::Interpreter::cti_op_get_by_id_fail): - (JSC::Interpreter::cti_op_instanceof): - (JSC::Interpreter::cti_op_del_by_id): - (JSC::Interpreter::cti_op_mul): - (JSC::Interpreter::cti_op_new_func): - (JSC::Interpreter::cti_op_call_JSFunction): - (JSC::Interpreter::cti_op_call_arityCheck): - (JSC::Interpreter::cti_vm_dontLazyLinkCall): - (JSC::Interpreter::cti_vm_lazyLinkCall): - (JSC::Interpreter::cti_op_push_activation): - (JSC::Interpreter::cti_op_call_NotJSFunction): - (JSC::Interpreter::cti_op_create_arguments): - (JSC::Interpreter::cti_op_create_arguments_no_params): - (JSC::Interpreter::cti_op_tear_off_activation): - (JSC::Interpreter::cti_op_tear_off_arguments): - (JSC::Interpreter::cti_op_profile_will_call): - (JSC::Interpreter::cti_op_profile_did_call): - (JSC::Interpreter::cti_op_ret_scopeChain): - (JSC::Interpreter::cti_op_new_array): - (JSC::Interpreter::cti_op_resolve): - (JSC::Interpreter::cti_op_construct_JSConstruct): - (JSC::Interpreter::cti_op_construct_NotJSConstruct): - (JSC::Interpreter::cti_op_get_by_val): - (JSC::Interpreter::cti_op_resolve_func): - (JSC::Interpreter::cti_op_sub): - (JSC::Interpreter::cti_op_put_by_val): - (JSC::Interpreter::cti_op_put_by_val_array): - (JSC::Interpreter::cti_op_lesseq): - (JSC::Interpreter::cti_op_loop_if_true): - (JSC::Interpreter::cti_op_negate): - (JSC::Interpreter::cti_op_resolve_base): - (JSC::Interpreter::cti_op_resolve_skip): - (JSC::Interpreter::cti_op_resolve_global): - (JSC::Interpreter::cti_op_div): - (JSC::Interpreter::cti_op_pre_dec): - (JSC::Interpreter::cti_op_jless): - (JSC::Interpreter::cti_op_not): - (JSC::Interpreter::cti_op_jtrue): - (JSC::Interpreter::cti_op_post_inc): - (JSC::Interpreter::cti_op_eq): - (JSC::Interpreter::cti_op_lshift): - (JSC::Interpreter::cti_op_bitand): - (JSC::Interpreter::cti_op_rshift): - (JSC::Interpreter::cti_op_bitnot): - (JSC::Interpreter::cti_op_resolve_with_base): - (JSC::Interpreter::cti_op_new_func_exp): - (JSC::Interpreter::cti_op_mod): - (JSC::Interpreter::cti_op_less): - (JSC::Interpreter::cti_op_neq): - (JSC::Interpreter::cti_op_post_dec): - (JSC::Interpreter::cti_op_urshift): - (JSC::Interpreter::cti_op_bitxor): - (JSC::Interpreter::cti_op_new_regexp): - (JSC::Interpreter::cti_op_bitor): - (JSC::Interpreter::cti_op_call_eval): - (JSC::Interpreter::cti_op_throw): - (JSC::Interpreter::cti_op_get_pnames): - (JSC::Interpreter::cti_op_next_pname): - (JSC::Interpreter::cti_op_push_scope): - (JSC::Interpreter::cti_op_pop_scope): - (JSC::Interpreter::cti_op_typeof): - (JSC::Interpreter::cti_op_is_undefined): - (JSC::Interpreter::cti_op_is_boolean): - (JSC::Interpreter::cti_op_is_number): - (JSC::Interpreter::cti_op_is_string): - (JSC::Interpreter::cti_op_is_object): - (JSC::Interpreter::cti_op_is_function): - (JSC::Interpreter::cti_op_stricteq): - (JSC::Interpreter::cti_op_nstricteq): - (JSC::Interpreter::cti_op_to_jsnumber): - (JSC::Interpreter::cti_op_in): - (JSC::Interpreter::cti_op_push_new_scope): - (JSC::Interpreter::cti_op_jmp_scopes): - (JSC::Interpreter::cti_op_put_by_index): - (JSC::Interpreter::cti_op_switch_imm): - (JSC::Interpreter::cti_op_switch_char): - (JSC::Interpreter::cti_op_switch_string): - (JSC::Interpreter::cti_op_del_by_val): - (JSC::Interpreter::cti_op_put_getter): - (JSC::Interpreter::cti_op_put_setter): - (JSC::Interpreter::cti_op_new_error): - (JSC::Interpreter::cti_op_debug): - (JSC::Interpreter::cti_vm_throw): - * VM/Machine.h: - * VM/Register.h: - * VM/SamplingTool.cpp: - (JSC::SamplingTool::dump): - * VM/SamplingTool.h: - (JSC::SamplingTool::SamplingTool): - * bytecompiler/CodeGenerator.cpp: - (JSC::BytecodeGenerator::generate): - (JSC::BytecodeGenerator::BytecodeGenerator): - * jsc.cpp: - (runWithScripts): - * masm/X86Assembler.h: - (JSC::AssemblerBuffer::executableCopy): - (JSC::X86Assembler::executableCopy): - * runtime/ExecState.h: - (JSC::ExecState::interpreter): - * runtime/JSCell.h: - * runtime/JSFunction.h: - * runtime/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): - * runtime/JSGlobalData.h: - * runtime/JSImmediate.h: - * runtime/JSString.h: - * runtime/JSValue.h: - * runtime/JSVariableObject.h: - * runtime/RegExp.cpp: - (JSC::RegExp::RegExp): - (JSC::RegExp::~RegExp): - (JSC::RegExp::match): - * runtime/RegExp.h: - * wrec/CharacterClassConstructor.cpp: - * wrec/CharacterClassConstructor.h: - * wrec/WREC.cpp: - (JSC::WREC::compileRegExp): - * wrec/WREC.h: - (JSC::WREC::Generator::Generator): - (JSC::WREC::Parser::): - (JSC::WREC::Parser::Parser): - (JSC::WREC::Parser::parseAlternative): - -2008-11-16 Greg Bolsinga <bolsinga@apple.com> - - Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=21810 - Remove use of static C++ objects that are destroyed at exit time (destructors) - - Conditionally have the DEFINE_STATIC_LOCAL workaround <rdar://problem/6354696> - (Codegen issue with C++ static reference in gcc build 5465) based upon the compiler - build versions. It will use the: - static T& = *new T; - style for all other compilers. - - * wtf/StdLibExtras.h: - -2008-11-16 Alexey Proskuryakov <ap@webkit.org> - - Reviewed by Dan Bernstein. - - https://bugs.webkit.org/show_bug.cgi?id=22290 - Remove cross-heap GC and MessagePort multi-threading support - - It is broken (and may not be implementable at all), and no longer needed, as we - don't use MessagePorts for communication with workers any more. - - * JavaScriptCore.exp: - * runtime/Collector.cpp: - (JSC::Heap::collect): - * runtime/JSGlobalObject.cpp: - * runtime/JSGlobalObject.h: - Remove hooks for cross-heap GC. - -2008-11-15 Sam Weinig <sam@webkit.org> - - Reviewed by Cameron Zwarich. - - Cleanup jsc command line code a little. - - * jsc.cpp: - (functionQuit): - (main): Use standard exit status macros - (cleanupGlobalData): Factor out cleanup code into this function. - (printUsageStatement): Use standard exit status macros. - -2008-11-15 Sam Weinig <sam@webkit.org> - - Reviewed by Cameron Zwarich. - - Cleanup BytecodeGenerator constructors. - - * bytecompiler/CodeGenerator.cpp: - (JSC::BytecodeGenerator::BytecodeGenerator): - * bytecompiler/CodeGenerator.h: - * parser/Nodes.cpp: - (JSC::ProgramNode::generateBytecode): - -2008-11-15 Darin Adler <darin@apple.com> - - Rubber stamped by Geoff Garen. - - - do the long-planned StructureID -> Structure rename - - * API/JSCallbackConstructor.cpp: - (JSC::JSCallbackConstructor::JSCallbackConstructor): - * API/JSCallbackConstructor.h: - (JSC::JSCallbackConstructor::createStructure): - * API/JSCallbackFunction.h: - (JSC::JSCallbackFunction::createStructure): - * API/JSCallbackObject.h: - (JSC::JSCallbackObject::createStructure): - * API/JSCallbackObjectFunctions.h: - (JSC::::JSCallbackObject): - * API/JSValueRef.cpp: - (JSValueIsInstanceOfConstructor): - * GNUmakefile.am: - * JavaScriptCore.exp: - * JavaScriptCore.pri: - * JavaScriptCore.scons: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * VM/CTI.cpp: - (JSC::CTI::compileBinaryArithOp): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileGetByIdSelf): - (JSC::CTI::privateCompileGetByIdProto): - (JSC::CTI::privateCompileGetByIdChain): - (JSC::CTI::privateCompilePutByIdReplace): - (JSC::transitionWillNeedStorageRealloc): - (JSC::CTI::privateCompilePutByIdTransition): - (JSC::CTI::patchGetByIdSelf): - (JSC::CTI::patchPutByIdReplace): - * VM/CTI.h: - (JSC::CTI::compileGetByIdSelf): - (JSC::CTI::compileGetByIdProto): - (JSC::CTI::compileGetByIdChain): - (JSC::CTI::compilePutByIdReplace): - (JSC::CTI::compilePutByIdTransition): - * VM/CodeBlock.cpp: - (JSC::CodeBlock::printStructure): - (JSC::CodeBlock::printStructures): - (JSC::CodeBlock::dump): - (JSC::CodeBlock::~CodeBlock): - (JSC::CodeBlock::derefStructures): - (JSC::CodeBlock::refStructures): - * VM/CodeBlock.h: - * VM/Instruction.h: - (JSC::Instruction::Instruction): - (JSC::Instruction::): - * VM/Machine.cpp: - (JSC::jsTypeStringForValue): - (JSC::jsIsObjectType): - (JSC::BytecodeInterpreter::resolveGlobal): - (JSC::BytecodeInterpreter::BytecodeInterpreter): - (JSC::cachePrototypeChain): - (JSC::BytecodeInterpreter::tryCachePutByID): - (JSC::BytecodeInterpreter::uncachePutByID): - (JSC::BytecodeInterpreter::tryCacheGetByID): - (JSC::BytecodeInterpreter::uncacheGetByID): - (JSC::BytecodeInterpreter::privateExecute): - (JSC::BytecodeInterpreter::tryCTICachePutByID): - (JSC::BytecodeInterpreter::tryCTICacheGetByID): - (JSC::BytecodeInterpreter::cti_op_instanceof): - (JSC::BytecodeInterpreter::cti_op_construct_JSConstruct): - (JSC::BytecodeInterpreter::cti_op_resolve_global): - (JSC::BytecodeInterpreter::cti_op_is_undefined): - * runtime/Arguments.h: - (JSC::Arguments::createStructure): - * runtime/ArrayConstructor.cpp: - (JSC::ArrayConstructor::ArrayConstructor): - * runtime/ArrayConstructor.h: - * runtime/ArrayPrototype.cpp: - (JSC::ArrayPrototype::ArrayPrototype): - * runtime/ArrayPrototype.h: - * runtime/BatchedTransitionOptimizer.h: - (JSC::BatchedTransitionOptimizer::BatchedTransitionOptimizer): - (JSC::BatchedTransitionOptimizer::~BatchedTransitionOptimizer): - * runtime/BooleanConstructor.cpp: - (JSC::BooleanConstructor::BooleanConstructor): - * runtime/BooleanConstructor.h: - * runtime/BooleanObject.cpp: - (JSC::BooleanObject::BooleanObject): - * runtime/BooleanObject.h: - * runtime/BooleanPrototype.cpp: - (JSC::BooleanPrototype::BooleanPrototype): - * runtime/BooleanPrototype.h: - * runtime/DateConstructor.cpp: - (JSC::DateConstructor::DateConstructor): - * runtime/DateConstructor.h: - * runtime/DateInstance.cpp: - (JSC::DateInstance::DateInstance): - * runtime/DateInstance.h: - * runtime/DatePrototype.cpp: - (JSC::DatePrototype::DatePrototype): - * runtime/DatePrototype.h: - (JSC::DatePrototype::createStructure): - * runtime/ErrorConstructor.cpp: - (JSC::ErrorConstructor::ErrorConstructor): - * runtime/ErrorConstructor.h: - * runtime/ErrorInstance.cpp: - (JSC::ErrorInstance::ErrorInstance): - * runtime/ErrorInstance.h: - * runtime/ErrorPrototype.cpp: - (JSC::ErrorPrototype::ErrorPrototype): - * runtime/ErrorPrototype.h: - * runtime/FunctionConstructor.cpp: - (JSC::FunctionConstructor::FunctionConstructor): - * runtime/FunctionConstructor.h: - * runtime/FunctionPrototype.cpp: - (JSC::FunctionPrototype::FunctionPrototype): - (JSC::FunctionPrototype::addFunctionProperties): - * runtime/FunctionPrototype.h: - (JSC::FunctionPrototype::createStructure): - * runtime/GlobalEvalFunction.cpp: - (JSC::GlobalEvalFunction::GlobalEvalFunction): - * runtime/GlobalEvalFunction.h: - * runtime/Identifier.h: - * runtime/InternalFunction.cpp: - (JSC::InternalFunction::InternalFunction): - * runtime/InternalFunction.h: - (JSC::InternalFunction::createStructure): - (JSC::InternalFunction::InternalFunction): - * runtime/JSActivation.cpp: - (JSC::JSActivation::JSActivation): - * runtime/JSActivation.h: - (JSC::JSActivation::createStructure): - * runtime/JSArray.cpp: - (JSC::JSArray::JSArray): - * runtime/JSArray.h: - (JSC::JSArray::createStructure): - * runtime/JSCell.h: - (JSC::JSCell::JSCell): - (JSC::JSCell::isObject): - (JSC::JSCell::isString): - (JSC::JSCell::structure): - (JSC::JSValue::needsThisConversion): - * runtime/JSFunction.cpp: - (JSC::JSFunction::construct): - * runtime/JSFunction.h: - (JSC::JSFunction::JSFunction): - (JSC::JSFunction::createStructure): - * runtime/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): - (JSC::JSGlobalData::createLeaked): - * runtime/JSGlobalData.h: - * runtime/JSGlobalObject.cpp: - (JSC::markIfNeeded): - (JSC::JSGlobalObject::reset): - * runtime/JSGlobalObject.h: - (JSC::JSGlobalObject::JSGlobalObject): - (JSC::JSGlobalObject::argumentsStructure): - (JSC::JSGlobalObject::arrayStructure): - (JSC::JSGlobalObject::booleanObjectStructure): - (JSC::JSGlobalObject::callbackConstructorStructure): - (JSC::JSGlobalObject::callbackFunctionStructure): - (JSC::JSGlobalObject::callbackObjectStructure): - (JSC::JSGlobalObject::dateStructure): - (JSC::JSGlobalObject::emptyObjectStructure): - (JSC::JSGlobalObject::errorStructure): - (JSC::JSGlobalObject::functionStructure): - (JSC::JSGlobalObject::numberObjectStructure): - (JSC::JSGlobalObject::prototypeFunctionStructure): - (JSC::JSGlobalObject::regExpMatchesArrayStructure): - (JSC::JSGlobalObject::regExpStructure): - (JSC::JSGlobalObject::stringObjectStructure): - (JSC::JSGlobalObject::createStructure): - (JSC::Structure::prototypeForLookup): - * runtime/JSNotAnObject.h: - (JSC::JSNotAnObject::createStructure): - * runtime/JSNumberCell.h: - (JSC::JSNumberCell::createStructure): - (JSC::JSNumberCell::JSNumberCell): - * runtime/JSObject.cpp: - (JSC::JSObject::mark): - (JSC::JSObject::put): - (JSC::JSObject::deleteProperty): - (JSC::JSObject::defineGetter): - (JSC::JSObject::defineSetter): - (JSC::JSObject::getPropertyAttributes): - (JSC::JSObject::getPropertyNames): - (JSC::JSObject::removeDirect): - (JSC::JSObject::createInheritorID): - * runtime/JSObject.h: - (JSC::JSObject::getDirect): - (JSC::JSObject::getDirectLocation): - (JSC::JSObject::hasCustomProperties): - (JSC::JSObject::hasGetterSetterProperties): - (JSC::JSObject::createStructure): - (JSC::JSObject::JSObject): - (JSC::JSObject::~JSObject): - (JSC::JSObject::prototype): - (JSC::JSObject::setPrototype): - (JSC::JSObject::setStructure): - (JSC::JSObject::inheritorID): - (JSC::JSObject::inlineGetOwnPropertySlot): - (JSC::JSObject::getOwnPropertySlotForWrite): - (JSC::JSCell::fastGetOwnPropertySlot): - (JSC::JSObject::putDirect): - (JSC::JSObject::putDirectWithoutTransition): - (JSC::JSObject::transitionTo): - * runtime/JSPropertyNameIterator.h: - (JSC::JSPropertyNameIterator::next): - * runtime/JSStaticScopeObject.h: - (JSC::JSStaticScopeObject::JSStaticScopeObject): - (JSC::JSStaticScopeObject::createStructure): - * runtime/JSString.h: - (JSC::JSString::JSString): - (JSC::JSString::createStructure): - * runtime/JSVariableObject.h: - (JSC::JSVariableObject::JSVariableObject): - * runtime/JSWrapperObject.h: - (JSC::JSWrapperObject::JSWrapperObject): - * runtime/MathObject.cpp: - (JSC::MathObject::MathObject): - * runtime/MathObject.h: - (JSC::MathObject::createStructure): - * runtime/NativeErrorConstructor.cpp: - (JSC::NativeErrorConstructor::NativeErrorConstructor): - * runtime/NativeErrorConstructor.h: - * runtime/NativeErrorPrototype.cpp: - (JSC::NativeErrorPrototype::NativeErrorPrototype): - * runtime/NativeErrorPrototype.h: - * runtime/NumberConstructor.cpp: - (JSC::NumberConstructor::NumberConstructor): - * runtime/NumberConstructor.h: - (JSC::NumberConstructor::createStructure): - * runtime/NumberObject.cpp: - (JSC::NumberObject::NumberObject): - * runtime/NumberObject.h: - * runtime/NumberPrototype.cpp: - (JSC::NumberPrototype::NumberPrototype): - * runtime/NumberPrototype.h: - * runtime/ObjectConstructor.cpp: - (JSC::ObjectConstructor::ObjectConstructor): - * runtime/ObjectConstructor.h: - * runtime/ObjectPrototype.cpp: - (JSC::ObjectPrototype::ObjectPrototype): - * runtime/ObjectPrototype.h: - * runtime/Operations.h: - (JSC::equalSlowCaseInline): - * runtime/PropertyNameArray.h: - (JSC::PropertyNameArrayData::setCachedStructure): - (JSC::PropertyNameArrayData::cachedStructure): - (JSC::PropertyNameArrayData::setCachedPrototypeChain): - (JSC::PropertyNameArrayData::cachedPrototypeChain): - (JSC::PropertyNameArrayData::PropertyNameArrayData): - * runtime/PrototypeFunction.cpp: - (JSC::PrototypeFunction::PrototypeFunction): - * runtime/PrototypeFunction.h: - * runtime/RegExpConstructor.cpp: - (JSC::RegExpConstructor::RegExpConstructor): - * runtime/RegExpConstructor.h: - (JSC::RegExpConstructor::createStructure): - * runtime/RegExpObject.cpp: - (JSC::RegExpObject::RegExpObject): - * runtime/RegExpObject.h: - (JSC::RegExpObject::createStructure): - * runtime/RegExpPrototype.cpp: - (JSC::RegExpPrototype::RegExpPrototype): - * runtime/RegExpPrototype.h: - * runtime/StringConstructor.cpp: - (JSC::StringConstructor::StringConstructor): - * runtime/StringConstructor.h: - * runtime/StringObject.cpp: - (JSC::StringObject::StringObject): - * runtime/StringObject.h: - (JSC::StringObject::createStructure): - * runtime/StringObjectThatMasqueradesAsUndefined.h: - (JSC::StringObjectThatMasqueradesAsUndefined::create): - (JSC::StringObjectThatMasqueradesAsUndefined::StringObjectThatMasqueradesAsUndefined): - (JSC::StringObjectThatMasqueradesAsUndefined::createStructure): - * runtime/StringPrototype.cpp: - (JSC::StringPrototype::StringPrototype): - * runtime/StringPrototype.h: - * runtime/Structure.cpp: Copied from JavaScriptCore/runtime/StructureID.cpp. - (JSC::Structure::dumpStatistics): - (JSC::Structure::Structure): - (JSC::Structure::~Structure): - (JSC::Structure::startIgnoringLeaks): - (JSC::Structure::stopIgnoringLeaks): - (JSC::Structure::materializePropertyMap): - (JSC::Structure::getEnumerablePropertyNames): - (JSC::Structure::clearEnumerationCache): - (JSC::Structure::growPropertyStorageCapacity): - (JSC::Structure::addPropertyTransitionToExistingStructure): - (JSC::Structure::addPropertyTransition): - (JSC::Structure::removePropertyTransition): - (JSC::Structure::changePrototypeTransition): - (JSC::Structure::getterSetterTransition): - (JSC::Structure::toDictionaryTransition): - (JSC::Structure::fromDictionaryTransition): - (JSC::Structure::addPropertyWithoutTransition): - (JSC::Structure::removePropertyWithoutTransition): - (JSC::Structure::createCachedPrototypeChain): - (JSC::Structure::checkConsistency): - (JSC::Structure::copyPropertyTable): - (JSC::Structure::get): - (JSC::Structure::put): - (JSC::Structure::remove): - (JSC::Structure::insertIntoPropertyMapHashTable): - (JSC::Structure::createPropertyMapHashTable): - (JSC::Structure::expandPropertyMapHashTable): - (JSC::Structure::rehashPropertyMapHashTable): - (JSC::Structure::getEnumerablePropertyNamesInternal): - * runtime/Structure.h: Copied from JavaScriptCore/runtime/StructureID.h. - (JSC::Structure::create): - (JSC::Structure::previousID): - (JSC::Structure::setCachedPrototypeChain): - (JSC::Structure::cachedPrototypeChain): - (JSC::Structure::): - (JSC::Structure::get): - * runtime/StructureChain.cpp: Copied from JavaScriptCore/runtime/StructureIDChain.cpp. - (JSC::StructureChain::StructureChain): - (JSC::structureChainsAreEqual): - * runtime/StructureChain.h: Copied from JavaScriptCore/runtime/StructureIDChain.h. - (JSC::StructureChain::create): - (JSC::StructureChain::head): - * runtime/StructureID.cpp: Removed. - * runtime/StructureID.h: Removed. - * runtime/StructureIDChain.cpp: Removed. - * runtime/StructureIDChain.h: Removed. - * runtime/StructureIDTransitionTable.h: Removed. - * runtime/StructureTransitionTable.h: Copied from JavaScriptCore/runtime/StructureIDTransitionTable.h. - -2008-11-15 Darin Adler <darin@apple.com> - - - fix non-WREC build - - * runtime/RegExp.cpp: Put "using namespace WREC" inside #if ENABLE(WREC). - -2008-11-15 Kevin Ollivier <kevino@theolliviers.com> - - Reviewed by Timothy Hatcher. - - As ThreadingNone doesn't implement threads, isMainThread should return true, - not false. - - https://bugs.webkit.org/show_bug.cgi?id=22285 - - * wtf/ThreadingNone.cpp: - (WTF::isMainThread): - -2008-11-15 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Moved all WREC-related code into WREC.cpp and put it in a WREC namespace. - Removed the WREC prefix from class names. - - * VM/CTI.cpp: - * VM/CTI.h: - * VM/Machine.h: - (JSC::BytecodeInterpreter::assemblerBuffer): - * masm/X86Assembler.h: - * runtime/RegExp.cpp: - (JSC::RegExp::RegExp): - * wrec/CharacterClassConstructor.cpp: - * wrec/CharacterClassConstructor.h: - * wrec/WREC.cpp: - (WREC::GenerateParenthesesNonGreedyFunctor::GenerateParenthesesNonGreedyFunctor): - (WREC::GeneratePatternCharacterFunctor::generateAtom): - (WREC::GeneratePatternCharacterFunctor::backtrack): - (WREC::GenerateCharacterClassFunctor::generateAtom): - (WREC::GenerateCharacterClassFunctor::backtrack): - (WREC::GenerateBackreferenceFunctor::generateAtom): - (WREC::GenerateBackreferenceFunctor::backtrack): - (WREC::GenerateParenthesesNonGreedyFunctor::generateAtom): - (WREC::GenerateParenthesesNonGreedyFunctor::backtrack): - (WREC::Generator::generateBacktrack1): - (WREC::Generator::generateBacktrackBackreference): - (WREC::Generator::generateBackreferenceQuantifier): - (WREC::Generator::generateNonGreedyQuantifier): - (WREC::Generator::generateGreedyQuantifier): - (WREC::Generator::generatePatternCharacter): - (WREC::Generator::generateCharacterClassInvertedRange): - (WREC::Generator::generateCharacterClassInverted): - (WREC::Generator::generateCharacterClass): - (WREC::Generator::generateParentheses): - (WREC::Generator::generateParenthesesNonGreedy): - (WREC::Generator::generateParenthesesResetTrampoline): - (WREC::Generator::generateAssertionBOL): - (WREC::Generator::generateAssertionEOL): - (WREC::Generator::generateAssertionWordBoundary): - (WREC::Generator::generateBackreference): - (WREC::Generator::generateDisjunction): - (WREC::Generator::terminateDisjunction): - (WREC::Parser::parseGreedyQuantifier): - (WREC::Parser::parseQuantifier): - (WREC::Parser::parsePatternCharacterQualifier): - (WREC::Parser::parseCharacterClassQuantifier): - (WREC::Parser::parseBackreferenceQuantifier): - (WREC::Parser::parseParentheses): - (WREC::Parser::parseCharacterClass): - (WREC::Parser::parseOctalEscape): - (WREC::Parser::parseEscape): - (WREC::Parser::parseTerm): - (WREC::Parser::parseDisjunction): - (WREC::compileRegExp): - * wrec/WREC.h: - (WREC::Generator::Generator): - (WREC::Parser::Parser): - (WREC::Parser::parseAlternative): - -2008-11-15 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Changed another case of "m_jit" to "m_assembler". - - * VM/CTI.cpp: - * wrec/WREC.cpp: - * wrec/WREC.h: - (JSC::WRECGenerator::WRECGenerator): - (JSC::WRECParser::WRECParser): - -2008-11-15 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Renamed "jit" to "assembler" and, for brevity, replaced *jit.* with __ - using a macro. - - * VM/CTI.cpp: - (JSC::CTI::emitGetVirtualRegister): - (JSC::CTI::emitPutCTIArgFromVirtualRegister): - (JSC::CTI::emitPutCTIArg): - (JSC::CTI::emitGetCTIArg): - (JSC::CTI::emitPutCTIArgConstant): - (JSC::CTI::emitPutCTIParam): - (JSC::CTI::emitGetCTIParam): - (JSC::CTI::emitPutToCallFrameHeader): - (JSC::CTI::emitGetFromCallFrameHeader): - (JSC::CTI::emitPutVirtualRegister): - (JSC::CTI::emitInitRegister): - (JSC::CTI::emitAllocateNumber): - (JSC::CTI::emitNakedCall): - (JSC::CTI::emitNakedFastCall): - (JSC::CTI::emitCTICall): - (JSC::CTI::emitJumpSlowCaseIfNotJSCell): - (JSC::CTI::linkSlowCaseIfNotJSCell): - (JSC::CTI::emitJumpSlowCaseIfNotImmNum): - (JSC::CTI::emitJumpSlowCaseIfNotImmNums): - (JSC::CTI::emitFastArithDeTagImmediate): - (JSC::CTI::emitFastArithDeTagImmediateJumpIfZero): - (JSC::CTI::emitFastArithReTagImmediate): - (JSC::CTI::emitFastArithPotentiallyReTagImmediate): - (JSC::CTI::emitFastArithImmToInt): - (JSC::CTI::emitFastArithIntToImmOrSlowCase): - (JSC::CTI::emitFastArithIntToImmNoCheck): - (JSC::CTI::emitArithIntToImmWithJump): - (JSC::CTI::emitTagAsBoolImmediate): - (JSC::CTI::CTI): - (JSC::CTI::compileOpCallInitializeCallFrame): - (JSC::CTI::compileOpCall): - (JSC::CTI::compileOpStrictEq): - (JSC::CTI::emitSlowScriptCheck): - (JSC::CTI::putDoubleResultToJSNumberCellOrJSImmediate): - (JSC::CTI::compileBinaryArithOp): - (JSC::CTI::compileBinaryArithOpSlowCase): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileLinkPass): - (JSC::CTI::privateCompileSlowCases): - (JSC::CTI::privateCompile): - (JSC::CTI::privateCompileGetByIdSelf): - (JSC::CTI::privateCompileGetByIdProto): - (JSC::CTI::privateCompileGetByIdChain): - (JSC::CTI::privateCompilePutByIdReplace): - (JSC::CTI::privateCompilePutByIdTransition): - (JSC::CTI::privateCompileCTIMachineTrampolines): - (JSC::CTI::privateCompilePatchGetArrayLength): - (JSC::CTI::emitGetVariableObjectRegister): - (JSC::CTI::emitPutVariableObjectRegister): - (JSC::CTI::compileRegExp): - * VM/CTI.h: - * wrec/WREC.cpp: - (JSC::WRECGenerator::generateBacktrack1): - (JSC::WRECGenerator::generateBacktrackBackreference): - (JSC::WRECGenerator::generateBackreferenceQuantifier): - (JSC::WRECGenerator::generateNonGreedyQuantifier): - (JSC::WRECGenerator::generateGreedyQuantifier): - (JSC::WRECGenerator::generatePatternCharacter): - (JSC::WRECGenerator::generateCharacterClassInvertedRange): - (JSC::WRECGenerator::generateCharacterClassInverted): - (JSC::WRECGenerator::generateCharacterClass): - (JSC::WRECGenerator::generateParentheses): - (JSC::WRECGenerator::generateParenthesesNonGreedy): - (JSC::WRECGenerator::generateParenthesesResetTrampoline): - (JSC::WRECGenerator::generateAssertionBOL): - (JSC::WRECGenerator::generateAssertionEOL): - (JSC::WRECGenerator::generateAssertionWordBoundary): - (JSC::WRECGenerator::generateBackreference): - (JSC::WRECGenerator::generateDisjunction): - (JSC::WRECGenerator::terminateDisjunction): - -2008-11-15 Sam Weinig <sam@webkit.org> - - Reviewed by Geoffrey Garen. - - Remove dead method declaration. - - * bytecompiler/CodeGenerator.h: - -2008-11-15 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Renamed LabelID to Label, Label::isForwardLabel to Label::isForward. - - * VM/LabelID.h: - (JSC::Label::Label): - (JSC::Label::isForward): - * bytecompiler/CodeGenerator.cpp: - (JSC::BytecodeGenerator::newLabel): - (JSC::BytecodeGenerator::emitLabel): - (JSC::BytecodeGenerator::emitJump): - (JSC::BytecodeGenerator::emitJumpIfTrue): - (JSC::BytecodeGenerator::emitJumpIfFalse): - (JSC::BytecodeGenerator::pushFinallyContext): - (JSC::BytecodeGenerator::emitComplexJumpScopes): - (JSC::BytecodeGenerator::emitJumpScopes): - (JSC::BytecodeGenerator::emitNextPropertyName): - (JSC::BytecodeGenerator::emitCatch): - (JSC::BytecodeGenerator::emitJumpSubroutine): - (JSC::prepareJumpTableForImmediateSwitch): - (JSC::prepareJumpTableForCharacterSwitch): - (JSC::prepareJumpTableForStringSwitch): - (JSC::BytecodeGenerator::endSwitch): - * bytecompiler/CodeGenerator.h: - * bytecompiler/LabelScope.h: - (JSC::LabelScope::LabelScope): - (JSC::LabelScope::breakTarget): - (JSC::LabelScope::continueTarget): - * parser/Nodes.cpp: - (JSC::LogicalOpNode::emitBytecode): - (JSC::ConditionalNode::emitBytecode): - (JSC::IfNode::emitBytecode): - (JSC::IfElseNode::emitBytecode): - (JSC::DoWhileNode::emitBytecode): - (JSC::WhileNode::emitBytecode): - (JSC::ForNode::emitBytecode): - (JSC::ForInNode::emitBytecode): - (JSC::ReturnNode::emitBytecode): - (JSC::CaseBlockNode::emitBytecodeForBlock): - (JSC::TryNode::emitBytecode): - -2008-11-15 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Renamed JITCodeBuffer to AssemblerBuffer and renamed its data members - to be more like the rest of our buffer classes, with a size and a - capacity. - - Added an assert in the unchecked put case to match the test in the checked - put case. - - Changed a C-style cast to a C++-style cast. - - Renamed MAX_INSTRUCTION_SIZE to maxInstructionSize. - - * VM/CTI.cpp: - (JSC::CTI::CTI): - (JSC::CTI::compileRegExp): - * VM/Machine.cpp: - (JSC::BytecodeInterpreter::BytecodeInterpreter): - * VM/Machine.h: - (JSC::BytecodeInterpreter::assemblerBuffer): - * masm/X86Assembler.h: - (JSC::AssemblerBuffer::AssemblerBuffer): - (JSC::AssemblerBuffer::~AssemblerBuffer): - (JSC::AssemblerBuffer::ensureSpace): - (JSC::AssemblerBuffer::isAligned): - (JSC::AssemblerBuffer::putByteUnchecked): - (JSC::AssemblerBuffer::putByte): - (JSC::AssemblerBuffer::putShortUnchecked): - (JSC::AssemblerBuffer::putShort): - (JSC::AssemblerBuffer::putIntUnchecked): - (JSC::AssemblerBuffer::putInt): - (JSC::AssemblerBuffer::data): - (JSC::AssemblerBuffer::size): - (JSC::AssemblerBuffer::reset): - (JSC::AssemblerBuffer::copy): - (JSC::AssemblerBuffer::grow): - (JSC::X86Assembler::): - (JSC::X86Assembler::X86Assembler): - (JSC::X86Assembler::testl_i32r): - (JSC::X86Assembler::movl_mr): - (JSC::X86Assembler::movl_rm): - (JSC::X86Assembler::movl_i32m): - (JSC::X86Assembler::emitCall): - (JSC::X86Assembler::label): - (JSC::X86Assembler::emitUnlinkedJmp): - (JSC::X86Assembler::emitUnlinkedJne): - (JSC::X86Assembler::emitUnlinkedJe): - (JSC::X86Assembler::emitUnlinkedJl): - (JSC::X86Assembler::emitUnlinkedJb): - (JSC::X86Assembler::emitUnlinkedJle): - (JSC::X86Assembler::emitUnlinkedJbe): - (JSC::X86Assembler::emitUnlinkedJge): - (JSC::X86Assembler::emitUnlinkedJg): - (JSC::X86Assembler::emitUnlinkedJa): - (JSC::X86Assembler::emitUnlinkedJae): - (JSC::X86Assembler::emitUnlinkedJo): - (JSC::X86Assembler::emitUnlinkedJp): - (JSC::X86Assembler::emitUnlinkedJs): - (JSC::X86Assembler::link): - (JSC::X86Assembler::emitModRm_rr): - (JSC::X86Assembler::emitModRm_rm): - (JSC::X86Assembler::emitModRm_opr): - -2008-11-15 Geoffrey Garen <ggaren@apple.com> - - Suggested by Maciej Stachowiak. - - Reverted most "opcode" => "bytecode" renames. We use "bytecode" as a - mass noun to refer to a stream of instructions. Each instruction may be - an opcode or an operand. - - * VM/CTI.cpp: - (JSC::CTI::emitCTICall): - (JSC::CTI::compileOpCall): - (JSC::CTI::compileBinaryArithOp): - (JSC::CTI::compileBinaryArithOpSlowCase): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - (JSC::CTI::privateCompile): - * VM/CTI.h: - * VM/CodeBlock.cpp: - (JSC::CodeBlock::printStructureIDs): - (JSC::CodeBlock::dump): - (JSC::CodeBlock::derefStructureIDs): - (JSC::CodeBlock::refStructureIDs): - * VM/CodeBlock.h: - * VM/ExceptionHelpers.cpp: - (JSC::createNotAnObjectError): - * VM/Instruction.h: - (JSC::Instruction::Instruction): - (JSC::Instruction::): - * VM/Machine.cpp: - (JSC::BytecodeInterpreter::isOpcode): - (JSC::BytecodeInterpreter::throwException): - (JSC::BytecodeInterpreter::tryCachePutByID): - (JSC::BytecodeInterpreter::uncachePutByID): - (JSC::BytecodeInterpreter::tryCacheGetByID): - (JSC::BytecodeInterpreter::uncacheGetByID): - (JSC::BytecodeInterpreter::privateExecute): - (JSC::BytecodeInterpreter::tryCTICachePutByID): - (JSC::BytecodeInterpreter::tryCTICacheGetByID): - * VM/Machine.h: - (JSC::BytecodeInterpreter::getOpcode): - (JSC::BytecodeInterpreter::getOpcodeID): - (JSC::BytecodeInterpreter::isCallBytecode): - * VM/Opcode.cpp: - (JSC::): - (JSC::OpcodeStats::OpcodeStats): - (JSC::compareOpcodeIndices): - (JSC::compareOpcodePairIndices): - (JSC::OpcodeStats::~OpcodeStats): - (JSC::OpcodeStats::recordInstruction): - (JSC::OpcodeStats::resetLastInstruction): - * VM/Opcode.h: - (JSC::): - (JSC::padOpcodeName): - * VM/SamplingTool.cpp: - (JSC::ScopeSampleRecord::sample): - (JSC::SamplingTool::run): - (JSC::compareOpcodeIndicesSampling): - (JSC::SamplingTool::dump): - * VM/SamplingTool.h: - (JSC::ScopeSampleRecord::ScopeSampleRecord): - (JSC::SamplingTool::SamplingTool): - * bytecompiler/CodeGenerator.cpp: - (JSC::BytecodeGenerator::BytecodeGenerator): - (JSC::BytecodeGenerator::emitLabel): - (JSC::BytecodeGenerator::emitOpcode): - (JSC::BytecodeGenerator::emitJump): - (JSC::BytecodeGenerator::emitJumpIfTrue): - (JSC::BytecodeGenerator::emitJumpIfFalse): - (JSC::BytecodeGenerator::emitMove): - (JSC::BytecodeGenerator::emitUnaryOp): - (JSC::BytecodeGenerator::emitPreInc): - (JSC::BytecodeGenerator::emitPreDec): - (JSC::BytecodeGenerator::emitPostInc): - (JSC::BytecodeGenerator::emitPostDec): - (JSC::BytecodeGenerator::emitBinaryOp): - (JSC::BytecodeGenerator::emitEqualityOp): - (JSC::BytecodeGenerator::emitUnexpectedLoad): - (JSC::BytecodeGenerator::emitInstanceOf): - (JSC::BytecodeGenerator::emitResolve): - (JSC::BytecodeGenerator::emitGetScopedVar): - (JSC::BytecodeGenerator::emitPutScopedVar): - (JSC::BytecodeGenerator::emitResolveBase): - (JSC::BytecodeGenerator::emitResolveWithBase): - (JSC::BytecodeGenerator::emitResolveFunction): - (JSC::BytecodeGenerator::emitGetById): - (JSC::BytecodeGenerator::emitPutById): - (JSC::BytecodeGenerator::emitPutGetter): - (JSC::BytecodeGenerator::emitPutSetter): - (JSC::BytecodeGenerator::emitDeleteById): - (JSC::BytecodeGenerator::emitGetByVal): - (JSC::BytecodeGenerator::emitPutByVal): - (JSC::BytecodeGenerator::emitDeleteByVal): - (JSC::BytecodeGenerator::emitPutByIndex): - (JSC::BytecodeGenerator::emitNewObject): - (JSC::BytecodeGenerator::emitNewArray): - (JSC::BytecodeGenerator::emitNewFunction): - (JSC::BytecodeGenerator::emitNewRegExp): - (JSC::BytecodeGenerator::emitNewFunctionExpression): - (JSC::BytecodeGenerator::emitCall): - (JSC::BytecodeGenerator::emitReturn): - (JSC::BytecodeGenerator::emitUnaryNoDstOp): - (JSC::BytecodeGenerator::emitConstruct): - (JSC::BytecodeGenerator::emitPopScope): - (JSC::BytecodeGenerator::emitDebugHook): - (JSC::BytecodeGenerator::emitComplexJumpScopes): - (JSC::BytecodeGenerator::emitJumpScopes): - (JSC::BytecodeGenerator::emitNextPropertyName): - (JSC::BytecodeGenerator::emitCatch): - (JSC::BytecodeGenerator::emitNewError): - (JSC::BytecodeGenerator::emitJumpSubroutine): - (JSC::BytecodeGenerator::emitSubroutineReturn): - (JSC::BytecodeGenerator::emitPushNewScope): - (JSC::BytecodeGenerator::beginSwitch): - * bytecompiler/CodeGenerator.h: - * jsc.cpp: - (runWithScripts): - * masm/X86Assembler.h: - (JSC::X86Assembler::): - (JSC::X86Assembler::emitModRm_opr): - (JSC::X86Assembler::emitModRm_opr_Unchecked): - (JSC::X86Assembler::emitModRm_opm): - (JSC::X86Assembler::emitModRm_opm_Unchecked): - (JSC::X86Assembler::emitModRm_opmsib): - * parser/Nodes.cpp: - (JSC::UnaryOpNode::emitBytecode): - (JSC::BinaryOpNode::emitBytecode): - (JSC::ReverseBinaryOpNode::emitBytecode): - (JSC::ThrowableBinaryOpNode::emitBytecode): - (JSC::emitReadModifyAssignment): - (JSC::ScopeNode::ScopeNode): - * parser/Nodes.h: - (JSC::UnaryPlusNode::): - (JSC::NegateNode::): - (JSC::BitwiseNotNode::): - (JSC::LogicalNotNode::): - (JSC::MultNode::): - (JSC::DivNode::): - (JSC::ModNode::): - (JSC::AddNode::): - (JSC::SubNode::): - (JSC::LeftShiftNode::): - (JSC::RightShiftNode::): - (JSC::UnsignedRightShiftNode::): - (JSC::LessNode::): - (JSC::GreaterNode::): - (JSC::LessEqNode::): - (JSC::GreaterEqNode::): - (JSC::InstanceOfNode::): - (JSC::InNode::): - (JSC::EqualNode::): - (JSC::NotEqualNode::): - (JSC::StrictEqualNode::): - (JSC::NotStrictEqualNode::): - (JSC::BitAndNode::): - (JSC::BitOrNode::): - (JSC::BitXOrNode::): - * runtime/StructureID.cpp: - (JSC::StructureID::fromDictionaryTransition): - * wtf/Platform.h: - -2008-11-15 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Renames: - - CodeGenerator => BytecodeGenerator - emitCodeForBlock => emitBytecodeForBlock - generatedByteCode => generatedBytecode - generateCode => generateBytecode - - * JavaScriptCore.exp: - * bytecompiler/CodeGenerator.cpp: - (JSC::BytecodeGenerator::setDumpsGeneratedCode): - (JSC::BytecodeGenerator::generate): - (JSC::BytecodeGenerator::addVar): - (JSC::BytecodeGenerator::addGlobalVar): - (JSC::BytecodeGenerator::allocateConstants): - (JSC::BytecodeGenerator::BytecodeGenerator): - (JSC::BytecodeGenerator::addParameter): - (JSC::BytecodeGenerator::registerFor): - (JSC::BytecodeGenerator::constRegisterFor): - (JSC::BytecodeGenerator::isLocal): - (JSC::BytecodeGenerator::isLocalConstant): - (JSC::BytecodeGenerator::newRegister): - (JSC::BytecodeGenerator::newTemporary): - (JSC::BytecodeGenerator::highestUsedRegister): - (JSC::BytecodeGenerator::newLabelScope): - (JSC::BytecodeGenerator::newLabel): - (JSC::BytecodeGenerator::emitLabel): - (JSC::BytecodeGenerator::emitBytecode): - (JSC::BytecodeGenerator::retrieveLastBinaryOp): - (JSC::BytecodeGenerator::retrieveLastUnaryOp): - (JSC::BytecodeGenerator::rewindBinaryOp): - (JSC::BytecodeGenerator::rewindUnaryOp): - (JSC::BytecodeGenerator::emitJump): - (JSC::BytecodeGenerator::emitJumpIfTrue): - (JSC::BytecodeGenerator::emitJumpIfFalse): - (JSC::BytecodeGenerator::addConstant): - (JSC::BytecodeGenerator::addUnexpectedConstant): - (JSC::BytecodeGenerator::addRegExp): - (JSC::BytecodeGenerator::emitMove): - (JSC::BytecodeGenerator::emitUnaryOp): - (JSC::BytecodeGenerator::emitPreInc): - (JSC::BytecodeGenerator::emitPreDec): - (JSC::BytecodeGenerator::emitPostInc): - (JSC::BytecodeGenerator::emitPostDec): - (JSC::BytecodeGenerator::emitBinaryOp): - (JSC::BytecodeGenerator::emitEqualityOp): - (JSC::BytecodeGenerator::emitLoad): - (JSC::BytecodeGenerator::emitUnexpectedLoad): - (JSC::BytecodeGenerator::findScopedProperty): - (JSC::BytecodeGenerator::emitInstanceOf): - (JSC::BytecodeGenerator::emitResolve): - (JSC::BytecodeGenerator::emitGetScopedVar): - (JSC::BytecodeGenerator::emitPutScopedVar): - (JSC::BytecodeGenerator::emitResolveBase): - (JSC::BytecodeGenerator::emitResolveWithBase): - (JSC::BytecodeGenerator::emitResolveFunction): - (JSC::BytecodeGenerator::emitGetById): - (JSC::BytecodeGenerator::emitPutById): - (JSC::BytecodeGenerator::emitPutGetter): - (JSC::BytecodeGenerator::emitPutSetter): - (JSC::BytecodeGenerator::emitDeleteById): - (JSC::BytecodeGenerator::emitGetByVal): - (JSC::BytecodeGenerator::emitPutByVal): - (JSC::BytecodeGenerator::emitDeleteByVal): - (JSC::BytecodeGenerator::emitPutByIndex): - (JSC::BytecodeGenerator::emitNewObject): - (JSC::BytecodeGenerator::emitNewArray): - (JSC::BytecodeGenerator::emitNewFunction): - (JSC::BytecodeGenerator::emitNewRegExp): - (JSC::BytecodeGenerator::emitNewFunctionExpression): - (JSC::BytecodeGenerator::emitCall): - (JSC::BytecodeGenerator::emitCallEval): - (JSC::BytecodeGenerator::emitReturn): - (JSC::BytecodeGenerator::emitUnaryNoDstOp): - (JSC::BytecodeGenerator::emitConstruct): - (JSC::BytecodeGenerator::emitPushScope): - (JSC::BytecodeGenerator::emitPopScope): - (JSC::BytecodeGenerator::emitDebugHook): - (JSC::BytecodeGenerator::pushFinallyContext): - (JSC::BytecodeGenerator::popFinallyContext): - (JSC::BytecodeGenerator::breakTarget): - (JSC::BytecodeGenerator::continueTarget): - (JSC::BytecodeGenerator::emitComplexJumpScopes): - (JSC::BytecodeGenerator::emitJumpScopes): - (JSC::BytecodeGenerator::emitNextPropertyName): - (JSC::BytecodeGenerator::emitCatch): - (JSC::BytecodeGenerator::emitNewError): - (JSC::BytecodeGenerator::emitJumpSubroutine): - (JSC::BytecodeGenerator::emitSubroutineReturn): - (JSC::BytecodeGenerator::emitPushNewScope): - (JSC::BytecodeGenerator::beginSwitch): - (JSC::BytecodeGenerator::endSwitch): - (JSC::BytecodeGenerator::emitThrowExpressionTooDeepException): - * bytecompiler/CodeGenerator.h: - * jsc.cpp: - (runWithScripts): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + * jit/JITInlineMethods.h: + (JSC::JIT::emitLoadDouble): + (JSC::JIT::emitLoadInt32ToDouble): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_new_error): + (JSC::JIT::emit_op_enter): + (JSC::JIT::emit_op_enter_with_activation): * parser/Nodes.cpp: - (JSC::ThrowableExpressionData::emitThrowError): - (JSC::NullNode::emitBytecode): - (JSC::BooleanNode::emitBytecode): - (JSC::NumberNode::emitBytecode): - (JSC::StringNode::emitBytecode): - (JSC::RegExpNode::emitBytecode): - (JSC::ThisNode::emitBytecode): - (JSC::ResolveNode::isPure): - (JSC::ResolveNode::emitBytecode): - (JSC::ArrayNode::emitBytecode): - (JSC::ObjectLiteralNode::emitBytecode): - (JSC::PropertyListNode::emitBytecode): - (JSC::BracketAccessorNode::emitBytecode): - (JSC::DotAccessorNode::emitBytecode): - (JSC::ArgumentListNode::emitBytecode): - (JSC::NewExprNode::emitBytecode): - (JSC::EvalFunctionCallNode::emitBytecode): - (JSC::FunctionCallValueNode::emitBytecode): - (JSC::FunctionCallResolveNode::emitBytecode): - (JSC::FunctionCallBracketNode::emitBytecode): - (JSC::FunctionCallDotNode::emitBytecode): - (JSC::emitPreIncOrDec): - (JSC::emitPostIncOrDec): - (JSC::PostfixResolveNode::emitBytecode): - (JSC::PostfixBracketNode::emitBytecode): - (JSC::PostfixDotNode::emitBytecode): - (JSC::PostfixErrorNode::emitBytecode): (JSC::DeleteResolveNode::emitBytecode): - (JSC::DeleteBracketNode::emitBytecode): - (JSC::DeleteDotNode::emitBytecode): (JSC::DeleteValueNode::emitBytecode): - (JSC::VoidNode::emitBytecode): - (JSC::TypeOfResolveNode::emitBytecode): - (JSC::TypeOfValueNode::emitBytecode): (JSC::PrefixResolveNode::emitBytecode): - (JSC::PrefixBracketNode::emitBytecode): - (JSC::PrefixDotNode::emitBytecode): - (JSC::PrefixErrorNode::emitBytecode): - (JSC::UnaryOpNode::emitBytecode): - (JSC::BinaryOpNode::emitBytecode): - (JSC::EqualNode::emitBytecode): - (JSC::StrictEqualNode::emitBytecode): - (JSC::ReverseBinaryOpNode::emitBytecode): - (JSC::ThrowableBinaryOpNode::emitBytecode): - (JSC::InstanceOfNode::emitBytecode): - (JSC::LogicalOpNode::emitBytecode): - (JSC::ConditionalNode::emitBytecode): - (JSC::emitReadModifyAssignment): - (JSC::ReadModifyResolveNode::emitBytecode): - (JSC::AssignResolveNode::emitBytecode): - (JSC::AssignDotNode::emitBytecode): - (JSC::ReadModifyDotNode::emitBytecode): - (JSC::AssignErrorNode::emitBytecode): - (JSC::AssignBracketNode::emitBytecode): - (JSC::ReadModifyBracketNode::emitBytecode): - (JSC::CommaNode::emitBytecode): - (JSC::ConstDeclNode::emitCodeSingle): - (JSC::ConstDeclNode::emitBytecode): - (JSC::ConstStatementNode::emitBytecode): - (JSC::statementListEmitCode): - (JSC::BlockNode::emitBytecode): - (JSC::EmptyStatementNode::emitBytecode): - (JSC::DebuggerStatementNode::emitBytecode): - (JSC::ExprStatementNode::emitBytecode): - (JSC::VarStatementNode::emitBytecode): - (JSC::IfNode::emitBytecode): - (JSC::IfElseNode::emitBytecode): - (JSC::DoWhileNode::emitBytecode): - (JSC::WhileNode::emitBytecode): - (JSC::ForNode::emitBytecode): - (JSC::ForInNode::emitBytecode): - (JSC::ContinueNode::emitBytecode): - (JSC::BreakNode::emitBytecode): - (JSC::ReturnNode::emitBytecode): - (JSC::WithNode::emitBytecode): - (JSC::CaseBlockNode::emitBytecodeForBlock): - (JSC::SwitchNode::emitBytecode): - (JSC::LabelNode::emitBytecode): - (JSC::ThrowNode::emitBytecode): - (JSC::TryNode::emitBytecode): - (JSC::EvalNode::emitBytecode): - (JSC::EvalNode::generateBytecode): - (JSC::FunctionBodyNode::generateBytecode): - (JSC::FunctionBodyNode::emitBytecode): - (JSC::ProgramNode::emitBytecode): - (JSC::ProgramNode::generateBytecode): - (JSC::FuncDeclNode::emitBytecode): - (JSC::FuncExprNode::emitBytecode): - * parser/Nodes.h: - (JSC::ExpressionNode::): - (JSC::BooleanNode::): - (JSC::NumberNode::): - (JSC::StringNode::): - (JSC::ProgramNode::): - (JSC::EvalNode::): - (JSC::FunctionBodyNode::): - * runtime/Arguments.h: - (JSC::Arguments::getArgumentsData): - (JSC::JSActivation::copyRegisters): * runtime/JSActivation.cpp: - (JSC::JSActivation::mark): - * runtime/JSActivation.h: - (JSC::JSActivation::JSActivationData::JSActivationData): - * runtime/JSFunction.cpp: - (JSC::JSFunction::~JSFunction): - -2008-11-15 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Renamed all forms of "byte code" "opcode" "op code" "code" "bitcode" - etc. to "bytecode". - - * VM/CTI.cpp: - (JSC::CTI::printBytecodeOperandTypes): - (JSC::CTI::emitAllocateNumber): - (JSC::CTI::emitNakedCall): - (JSC::CTI::emitNakedFastCall): - (JSC::CTI::emitCTICall): - (JSC::CTI::emitJumpSlowCaseIfNotJSCell): - (JSC::CTI::emitJumpSlowCaseIfNotImmNum): - (JSC::CTI::emitJumpSlowCaseIfNotImmNums): - (JSC::CTI::emitFastArithIntToImmOrSlowCase): - (JSC::CTI::compileOpCall): - (JSC::CTI::emitSlowScriptCheck): - (JSC::CTI::compileBinaryArithOp): - (JSC::CTI::compileBinaryArithOpSlowCase): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - (JSC::CTI::privateCompile): - * VM/CTI.h: - (JSC::CallRecord::CallRecord): - (JSC::SwitchRecord::SwitchRecord): - * VM/CodeBlock.cpp: - (JSC::CodeBlock::printStructureIDs): - (JSC::CodeBlock::dump): - (JSC::CodeBlock::~CodeBlock): - (JSC::CodeBlock::derefStructureIDs): - (JSC::CodeBlock::refStructureIDs): - * VM/CodeBlock.h: - (JSC::StructureStubInfo::StructureStubInfo): - * VM/ExceptionHelpers.cpp: - (JSC::createNotAnObjectError): - * VM/Instruction.h: - (JSC::Instruction::Instruction): - (JSC::Instruction::): - * VM/Machine.cpp: - (JSC::BytecodeInterpreter::isBytecode): - (JSC::BytecodeInterpreter::throwException): - (JSC::BytecodeInterpreter::execute): - (JSC::BytecodeInterpreter::tryCachePutByID): - (JSC::BytecodeInterpreter::uncachePutByID): - (JSC::BytecodeInterpreter::tryCacheGetByID): - (JSC::BytecodeInterpreter::uncacheGetByID): - (JSC::BytecodeInterpreter::privateExecute): - (JSC::BytecodeInterpreter::tryCTICachePutByID): - (JSC::BytecodeInterpreter::tryCTICacheGetByID): - (JSC::BytecodeInterpreter::cti_op_call_JSFunction): - (JSC::BytecodeInterpreter::cti_vm_dontLazyLinkCall): - (JSC::BytecodeInterpreter::cti_vm_lazyLinkCall): - * VM/Machine.h: - (JSC::BytecodeInterpreter::getBytecode): - (JSC::BytecodeInterpreter::getBytecodeID): - (JSC::BytecodeInterpreter::isCallBytecode): - * VM/Opcode.cpp: - (JSC::): - (JSC::BytecodeStats::BytecodeStats): - (JSC::compareBytecodeIndices): - (JSC::compareBytecodePairIndices): - (JSC::BytecodeStats::~BytecodeStats): - (JSC::BytecodeStats::recordInstruction): - (JSC::BytecodeStats::resetLastInstruction): - * VM/Opcode.h: - (JSC::): - (JSC::padBytecodeName): - * VM/SamplingTool.cpp: - (JSC::ScopeSampleRecord::sample): - (JSC::SamplingTool::run): - (JSC::compareBytecodeIndicesSampling): - (JSC::SamplingTool::dump): - * VM/SamplingTool.h: - (JSC::ScopeSampleRecord::ScopeSampleRecord): - (JSC::SamplingTool::SamplingTool): - * bytecompiler/CodeGenerator.cpp: - (JSC::CodeGenerator::generate): - (JSC::CodeGenerator::CodeGenerator): - (JSC::CodeGenerator::emitLabel): - (JSC::CodeGenerator::emitBytecode): - (JSC::CodeGenerator::emitJump): - (JSC::CodeGenerator::emitJumpIfTrue): - (JSC::CodeGenerator::emitJumpIfFalse): - (JSC::CodeGenerator::emitMove): - (JSC::CodeGenerator::emitUnaryOp): - (JSC::CodeGenerator::emitPreInc): - (JSC::CodeGenerator::emitPreDec): - (JSC::CodeGenerator::emitPostInc): - (JSC::CodeGenerator::emitPostDec): - (JSC::CodeGenerator::emitBinaryOp): - (JSC::CodeGenerator::emitEqualityOp): - (JSC::CodeGenerator::emitUnexpectedLoad): - (JSC::CodeGenerator::emitInstanceOf): - (JSC::CodeGenerator::emitResolve): - (JSC::CodeGenerator::emitGetScopedVar): - (JSC::CodeGenerator::emitPutScopedVar): - (JSC::CodeGenerator::emitResolveBase): - (JSC::CodeGenerator::emitResolveWithBase): - (JSC::CodeGenerator::emitResolveFunction): - (JSC::CodeGenerator::emitGetById): - (JSC::CodeGenerator::emitPutById): - (JSC::CodeGenerator::emitPutGetter): - (JSC::CodeGenerator::emitPutSetter): - (JSC::CodeGenerator::emitDeleteById): - (JSC::CodeGenerator::emitGetByVal): - (JSC::CodeGenerator::emitPutByVal): - (JSC::CodeGenerator::emitDeleteByVal): - (JSC::CodeGenerator::emitPutByIndex): - (JSC::CodeGenerator::emitNewObject): - (JSC::CodeGenerator::emitNewArray): - (JSC::CodeGenerator::emitNewFunction): - (JSC::CodeGenerator::emitNewRegExp): - (JSC::CodeGenerator::emitNewFunctionExpression): - (JSC::CodeGenerator::emitCall): - (JSC::CodeGenerator::emitReturn): - (JSC::CodeGenerator::emitUnaryNoDstOp): - (JSC::CodeGenerator::emitConstruct): - (JSC::CodeGenerator::emitPopScope): - (JSC::CodeGenerator::emitDebugHook): - (JSC::CodeGenerator::emitComplexJumpScopes): - (JSC::CodeGenerator::emitJumpScopes): - (JSC::CodeGenerator::emitNextPropertyName): - (JSC::CodeGenerator::emitCatch): - (JSC::CodeGenerator::emitNewError): - (JSC::CodeGenerator::emitJumpSubroutine): - (JSC::CodeGenerator::emitSubroutineReturn): - (JSC::CodeGenerator::emitPushNewScope): - (JSC::CodeGenerator::beginSwitch): - (JSC::CodeGenerator::endSwitch): - * bytecompiler/CodeGenerator.h: - (JSC::CodeGenerator::emitNode): - * jsc.cpp: - (runWithScripts): - * masm/X86Assembler.h: - (JSC::X86Assembler::): - (JSC::X86Assembler::emitModRm_opr): - (JSC::X86Assembler::emitModRm_opr_Unchecked): - (JSC::X86Assembler::emitModRm_opm): - (JSC::X86Assembler::emitModRm_opm_Unchecked): - (JSC::X86Assembler::emitModRm_opmsib): - * parser/Nodes.cpp: - (JSC::NullNode::emitBytecode): - (JSC::BooleanNode::emitBytecode): - (JSC::NumberNode::emitBytecode): - (JSC::StringNode::emitBytecode): - (JSC::RegExpNode::emitBytecode): - (JSC::ThisNode::emitBytecode): - (JSC::ResolveNode::emitBytecode): - (JSC::ArrayNode::emitBytecode): - (JSC::ObjectLiteralNode::emitBytecode): - (JSC::PropertyListNode::emitBytecode): - (JSC::BracketAccessorNode::emitBytecode): - (JSC::DotAccessorNode::emitBytecode): - (JSC::ArgumentListNode::emitBytecode): - (JSC::NewExprNode::emitBytecode): - (JSC::EvalFunctionCallNode::emitBytecode): - (JSC::FunctionCallValueNode::emitBytecode): - (JSC::FunctionCallResolveNode::emitBytecode): - (JSC::FunctionCallBracketNode::emitBytecode): - (JSC::FunctionCallDotNode::emitBytecode): - (JSC::PostfixResolveNode::emitBytecode): - (JSC::PostfixBracketNode::emitBytecode): - (JSC::PostfixDotNode::emitBytecode): - (JSC::PostfixErrorNode::emitBytecode): - (JSC::DeleteResolveNode::emitBytecode): - (JSC::DeleteBracketNode::emitBytecode): - (JSC::DeleteDotNode::emitBytecode): - (JSC::DeleteValueNode::emitBytecode): - (JSC::VoidNode::emitBytecode): - (JSC::TypeOfResolveNode::emitBytecode): - (JSC::TypeOfValueNode::emitBytecode): - (JSC::PrefixResolveNode::emitBytecode): - (JSC::PrefixBracketNode::emitBytecode): - (JSC::PrefixDotNode::emitBytecode): - (JSC::PrefixErrorNode::emitBytecode): - (JSC::UnaryOpNode::emitBytecode): - (JSC::BinaryOpNode::emitBytecode): - (JSC::EqualNode::emitBytecode): - (JSC::StrictEqualNode::emitBytecode): - (JSC::ReverseBinaryOpNode::emitBytecode): - (JSC::ThrowableBinaryOpNode::emitBytecode): - (JSC::InstanceOfNode::emitBytecode): - (JSC::LogicalOpNode::emitBytecode): - (JSC::ConditionalNode::emitBytecode): - (JSC::emitReadModifyAssignment): - (JSC::ReadModifyResolveNode::emitBytecode): - (JSC::AssignResolveNode::emitBytecode): - (JSC::AssignDotNode::emitBytecode): - (JSC::ReadModifyDotNode::emitBytecode): - (JSC::AssignErrorNode::emitBytecode): - (JSC::AssignBracketNode::emitBytecode): - (JSC::ReadModifyBracketNode::emitBytecode): - (JSC::CommaNode::emitBytecode): - (JSC::ConstDeclNode::emitBytecode): - (JSC::ConstStatementNode::emitBytecode): - (JSC::BlockNode::emitBytecode): - (JSC::EmptyStatementNode::emitBytecode): - (JSC::DebuggerStatementNode::emitBytecode): - (JSC::ExprStatementNode::emitBytecode): - (JSC::VarStatementNode::emitBytecode): - (JSC::IfNode::emitBytecode): - (JSC::IfElseNode::emitBytecode): - (JSC::DoWhileNode::emitBytecode): - (JSC::WhileNode::emitBytecode): - (JSC::ForNode::emitBytecode): - (JSC::ForInNode::emitBytecode): - (JSC::ContinueNode::emitBytecode): - (JSC::BreakNode::emitBytecode): - (JSC::ReturnNode::emitBytecode): - (JSC::WithNode::emitBytecode): - (JSC::SwitchNode::emitBytecode): - (JSC::LabelNode::emitBytecode): - (JSC::ThrowNode::emitBytecode): - (JSC::TryNode::emitBytecode): - (JSC::ScopeNode::ScopeNode): - (JSC::EvalNode::emitBytecode): - (JSC::FunctionBodyNode::emitBytecode): - (JSC::ProgramNode::emitBytecode): - (JSC::FuncDeclNode::emitBytecode): - (JSC::FuncExprNode::emitBytecode): - * parser/Nodes.h: - (JSC::UnaryPlusNode::): - (JSC::NegateNode::): - (JSC::BitwiseNotNode::): - (JSC::LogicalNotNode::): - (JSC::MultNode::): - (JSC::DivNode::): - (JSC::ModNode::): - (JSC::AddNode::): - (JSC::SubNode::): - (JSC::LeftShiftNode::): - (JSC::RightShiftNode::): - (JSC::UnsignedRightShiftNode::): - (JSC::LessNode::): - (JSC::GreaterNode::): - (JSC::LessEqNode::): - (JSC::GreaterEqNode::): - (JSC::InstanceOfNode::): - (JSC::InNode::): - (JSC::EqualNode::): - (JSC::NotEqualNode::): - (JSC::StrictEqualNode::): - (JSC::NotStrictEqualNode::): - (JSC::BitAndNode::): - (JSC::BitOrNode::): - (JSC::BitXOrNode::): - (JSC::ProgramNode::): - (JSC::EvalNode::): - (JSC::FunctionBodyNode::): - * runtime/JSNotAnObject.h: - * runtime/StructureID.cpp: - (JSC::StructureID::fromDictionaryTransition): + (JSC::JSActivation::JSActivation): * wtf/Platform.h: -2008-11-15 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Renamed Machine to BytecodeInterpreter. - - Nixed the Interpreter class, and changed its two functions to stand-alone - functions. - - * JavaScriptCore.exp: - * VM/CTI.cpp: - (JSC::): - (JSC::CTI::emitCTICall): - (JSC::CTI::CTI): - (JSC::CTI::compileOpCall): - (JSC::CTI::emitSlowScriptCheck): - (JSC::CTI::compileBinaryArithOpSlowCase): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - (JSC::CTI::privateCompile): - (JSC::CTI::privateCompileGetByIdSelf): - (JSC::CTI::privateCompileGetByIdProto): - (JSC::CTI::privateCompileGetByIdChain): - (JSC::CTI::privateCompilePutByIdReplace): - (JSC::CTI::privateCompilePutByIdTransition): - (JSC::CTI::privateCompileCTIMachineTrampolines): - (JSC::CTI::freeCTIMachineTrampolines): - (JSC::CTI::patchGetByIdSelf): - (JSC::CTI::patchPutByIdReplace): - (JSC::CTI::privateCompilePatchGetArrayLength): - (JSC::CTI::compileRegExp): - * VM/CTI.h: - * VM/CodeBlock.cpp: - (JSC::CodeBlock::printStructureIDs): - (JSC::CodeBlock::dump): - (JSC::CodeBlock::derefStructureIDs): - (JSC::CodeBlock::refStructureIDs): - * VM/ExceptionHelpers.cpp: - (JSC::createNotAnObjectError): - * VM/Machine.cpp: - (JSC::jsLess): - (JSC::jsLessEq): - (JSC::BytecodeInterpreter::resolve): - (JSC::BytecodeInterpreter::resolveSkip): - (JSC::BytecodeInterpreter::resolveGlobal): - (JSC::BytecodeInterpreter::resolveBase): - (JSC::BytecodeInterpreter::resolveBaseAndProperty): - (JSC::BytecodeInterpreter::resolveBaseAndFunc): - (JSC::BytecodeInterpreter::slideRegisterWindowForCall): - (JSC::BytecodeInterpreter::callEval): - (JSC::BytecodeInterpreter::BytecodeInterpreter): - (JSC::BytecodeInterpreter::initialize): - (JSC::BytecodeInterpreter::~BytecodeInterpreter): - (JSC::BytecodeInterpreter::dumpCallFrame): - (JSC::BytecodeInterpreter::dumpRegisters): - (JSC::BytecodeInterpreter::isOpcode): - (JSC::BytecodeInterpreter::unwindCallFrame): - (JSC::BytecodeInterpreter::throwException): - (JSC::BytecodeInterpreter::execute): - (JSC::BytecodeInterpreter::debug): - (JSC::BytecodeInterpreter::resetTimeoutCheck): - (JSC::BytecodeInterpreter::checkTimeout): - (JSC::BytecodeInterpreter::createExceptionScope): - (JSC::BytecodeInterpreter::tryCachePutByID): - (JSC::BytecodeInterpreter::uncachePutByID): - (JSC::BytecodeInterpreter::tryCacheGetByID): - (JSC::BytecodeInterpreter::uncacheGetByID): - (JSC::BytecodeInterpreter::privateExecute): - (JSC::BytecodeInterpreter::retrieveArguments): - (JSC::BytecodeInterpreter::retrieveCaller): - (JSC::BytecodeInterpreter::retrieveLastCaller): - (JSC::BytecodeInterpreter::findFunctionCallFrame): - (JSC::BytecodeInterpreter::tryCTICachePutByID): - (JSC::BytecodeInterpreter::tryCTICacheGetByID): - (JSC::BytecodeInterpreter::cti_op_convert_this): - (JSC::BytecodeInterpreter::cti_op_end): - (JSC::BytecodeInterpreter::cti_op_add): - (JSC::BytecodeInterpreter::cti_op_pre_inc): - (JSC::BytecodeInterpreter::cti_timeout_check): - (JSC::BytecodeInterpreter::cti_register_file_check): - (JSC::BytecodeInterpreter::cti_op_loop_if_less): - (JSC::BytecodeInterpreter::cti_op_loop_if_lesseq): - (JSC::BytecodeInterpreter::cti_op_new_object): - (JSC::BytecodeInterpreter::cti_op_put_by_id): - (JSC::BytecodeInterpreter::cti_op_put_by_id_second): - (JSC::BytecodeInterpreter::cti_op_put_by_id_generic): - (JSC::BytecodeInterpreter::cti_op_put_by_id_fail): - (JSC::BytecodeInterpreter::cti_op_get_by_id): - (JSC::BytecodeInterpreter::cti_op_get_by_id_second): - (JSC::BytecodeInterpreter::cti_op_get_by_id_generic): - (JSC::BytecodeInterpreter::cti_op_get_by_id_fail): - (JSC::BytecodeInterpreter::cti_op_instanceof): - (JSC::BytecodeInterpreter::cti_op_del_by_id): - (JSC::BytecodeInterpreter::cti_op_mul): - (JSC::BytecodeInterpreter::cti_op_new_func): - (JSC::BytecodeInterpreter::cti_op_call_JSFunction): - (JSC::BytecodeInterpreter::cti_op_call_arityCheck): - (JSC::BytecodeInterpreter::cti_vm_dontLazyLinkCall): - (JSC::BytecodeInterpreter::cti_vm_lazyLinkCall): - (JSC::BytecodeInterpreter::cti_op_push_activation): - (JSC::BytecodeInterpreter::cti_op_call_NotJSFunction): - (JSC::BytecodeInterpreter::cti_op_create_arguments): - (JSC::BytecodeInterpreter::cti_op_create_arguments_no_params): - (JSC::BytecodeInterpreter::cti_op_tear_off_activation): - (JSC::BytecodeInterpreter::cti_op_tear_off_arguments): - (JSC::BytecodeInterpreter::cti_op_profile_will_call): - (JSC::BytecodeInterpreter::cti_op_profile_did_call): - (JSC::BytecodeInterpreter::cti_op_ret_scopeChain): - (JSC::BytecodeInterpreter::cti_op_new_array): - (JSC::BytecodeInterpreter::cti_op_resolve): - (JSC::BytecodeInterpreter::cti_op_construct_JSConstruct): - (JSC::BytecodeInterpreter::cti_op_construct_NotJSConstruct): - (JSC::BytecodeInterpreter::cti_op_get_by_val): - (JSC::BytecodeInterpreter::cti_op_resolve_func): - (JSC::BytecodeInterpreter::cti_op_sub): - (JSC::BytecodeInterpreter::cti_op_put_by_val): - (JSC::BytecodeInterpreter::cti_op_put_by_val_array): - (JSC::BytecodeInterpreter::cti_op_lesseq): - (JSC::BytecodeInterpreter::cti_op_loop_if_true): - (JSC::BytecodeInterpreter::cti_op_negate): - (JSC::BytecodeInterpreter::cti_op_resolve_base): - (JSC::BytecodeInterpreter::cti_op_resolve_skip): - (JSC::BytecodeInterpreter::cti_op_resolve_global): - (JSC::BytecodeInterpreter::cti_op_div): - (JSC::BytecodeInterpreter::cti_op_pre_dec): - (JSC::BytecodeInterpreter::cti_op_jless): - (JSC::BytecodeInterpreter::cti_op_not): - (JSC::BytecodeInterpreter::cti_op_jtrue): - (JSC::BytecodeInterpreter::cti_op_post_inc): - (JSC::BytecodeInterpreter::cti_op_eq): - (JSC::BytecodeInterpreter::cti_op_lshift): - (JSC::BytecodeInterpreter::cti_op_bitand): - (JSC::BytecodeInterpreter::cti_op_rshift): - (JSC::BytecodeInterpreter::cti_op_bitnot): - (JSC::BytecodeInterpreter::cti_op_resolve_with_base): - (JSC::BytecodeInterpreter::cti_op_new_func_exp): - (JSC::BytecodeInterpreter::cti_op_mod): - (JSC::BytecodeInterpreter::cti_op_less): - (JSC::BytecodeInterpreter::cti_op_neq): - (JSC::BytecodeInterpreter::cti_op_post_dec): - (JSC::BytecodeInterpreter::cti_op_urshift): - (JSC::BytecodeInterpreter::cti_op_bitxor): - (JSC::BytecodeInterpreter::cti_op_new_regexp): - (JSC::BytecodeInterpreter::cti_op_bitor): - (JSC::BytecodeInterpreter::cti_op_call_eval): - (JSC::BytecodeInterpreter::cti_op_throw): - (JSC::BytecodeInterpreter::cti_op_get_pnames): - (JSC::BytecodeInterpreter::cti_op_next_pname): - (JSC::BytecodeInterpreter::cti_op_push_scope): - (JSC::BytecodeInterpreter::cti_op_pop_scope): - (JSC::BytecodeInterpreter::cti_op_typeof): - (JSC::BytecodeInterpreter::cti_op_is_undefined): - (JSC::BytecodeInterpreter::cti_op_is_boolean): - (JSC::BytecodeInterpreter::cti_op_is_number): - (JSC::BytecodeInterpreter::cti_op_is_string): - (JSC::BytecodeInterpreter::cti_op_is_object): - (JSC::BytecodeInterpreter::cti_op_is_function): - (JSC::BytecodeInterpreter::cti_op_stricteq): - (JSC::BytecodeInterpreter::cti_op_nstricteq): - (JSC::BytecodeInterpreter::cti_op_to_jsnumber): - (JSC::BytecodeInterpreter::cti_op_in): - (JSC::BytecodeInterpreter::cti_op_push_new_scope): - (JSC::BytecodeInterpreter::cti_op_jmp_scopes): - (JSC::BytecodeInterpreter::cti_op_put_by_index): - (JSC::BytecodeInterpreter::cti_op_switch_imm): - (JSC::BytecodeInterpreter::cti_op_switch_char): - (JSC::BytecodeInterpreter::cti_op_switch_string): - (JSC::BytecodeInterpreter::cti_op_del_by_val): - (JSC::BytecodeInterpreter::cti_op_put_getter): - (JSC::BytecodeInterpreter::cti_op_put_setter): - (JSC::BytecodeInterpreter::cti_op_new_error): - (JSC::BytecodeInterpreter::cti_op_debug): - (JSC::BytecodeInterpreter::cti_vm_throw): - * VM/Machine.h: - * VM/Register.h: - * VM/SamplingTool.cpp: - (JSC::SamplingTool::run): - * VM/SamplingTool.h: - (JSC::SamplingTool::SamplingTool): - * bytecompiler/CodeGenerator.cpp: - (JSC::CodeGenerator::generate): - (JSC::CodeGenerator::CodeGenerator): - (JSC::CodeGenerator::emitOpcode): - * debugger/DebuggerCallFrame.cpp: - (JSC::DebuggerCallFrame::evaluate): - * jsc.cpp: - (runWithScripts): - * parser/Nodes.cpp: - (JSC::ScopeNode::ScopeNode): - * profiler/ProfileGenerator.cpp: - (JSC::ProfileGenerator::addParentForConsoleStart): - * runtime/ArrayPrototype.cpp: - (JSC::arrayProtoFuncPop): - (JSC::arrayProtoFuncPush): - * runtime/Collector.cpp: - (JSC::Heap::collect): - * runtime/ExecState.h: - (JSC::ExecState::interpreter): - * runtime/FunctionPrototype.cpp: - (JSC::functionProtoFuncApply): - * runtime/Interpreter.cpp: - (JSC::Interpreter::evaluate): - * runtime/JSCell.h: - * runtime/JSFunction.cpp: - (JSC::JSFunction::call): - (JSC::JSFunction::argumentsGetter): - (JSC::JSFunction::callerGetter): - (JSC::JSFunction::construct): - * runtime/JSFunction.h: - * runtime/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): - (JSC::JSGlobalData::~JSGlobalData): - * runtime/JSGlobalData.h: - * runtime/JSGlobalObject.cpp: - (JSC::JSGlobalObject::~JSGlobalObject): - (JSC::JSGlobalObject::setTimeoutTime): - (JSC::JSGlobalObject::startTimeoutCheck): - (JSC::JSGlobalObject::stopTimeoutCheck): - (JSC::JSGlobalObject::mark): - * runtime/JSGlobalObjectFunctions.cpp: - (JSC::globalFuncEval): - * runtime/JSString.h: - * runtime/RegExp.cpp: - (JSC::RegExp::RegExp): - -2008-11-15 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Sam Weinig. - - - Remove SymbolTable from FunctionBodyNode and move it to CodeBlock - - It's not needed for functions that have never been executed, so no - need to waste the memory. Saves ~4M on membuster after 30 pages. - - * VM/CodeBlock.h: - * VM/Machine.cpp: - (JSC::Machine::retrieveArguments): - * parser/Nodes.cpp: - (JSC::EvalNode::generateCode): - (JSC::FunctionBodyNode::generateCode): - * parser/Nodes.h: - * runtime/JSActivation.h: - (JSC::JSActivation::JSActivationData::JSActivationData): - -2008-11-14 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Darin Adler. - - Bug 22259: Make all opcodes use eax as their final result register - <https://bugs.webkit.org/show_bug.cgi?id=22259> - - Change one case of op_add (and the corresponding slow case) to use eax - rather than edx. Also, change the order in which the two results of - resolve_func and resolve_base are emitted so that the retrieved value is - put last into eax. - - This gives no performance change on SunSpider or the V8 benchmark suite - when run in either harness. - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - -2008-11-14 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. - - Geoff has this wacky notion that emitGetArg and emitPutArg should be related to - doing the same thing. Crazy. - - Rename the methods for accessing virtual registers to say 'VirtualRegister' in the - name, and those for setting up the arguments for CTI methods to contain 'CTIArg'. - - * VM/CTI.cpp: - (JSC::CTI::emitGetVirtualRegister): - (JSC::CTI::emitGetVirtualRegisters): - (JSC::CTI::emitPutCTIArgFromVirtualRegister): - (JSC::CTI::emitPutCTIArg): - (JSC::CTI::emitGetCTIArg): - (JSC::CTI::emitPutCTIArgConstant): - (JSC::CTI::emitPutVirtualRegister): - (JSC::CTI::compileOpCallSetupArgs): - (JSC::CTI::compileOpCallEvalSetupArgs): - (JSC::CTI::compileOpConstructSetupArgs): - (JSC::CTI::compileOpCall): - (JSC::CTI::compileOpStrictEq): - (JSC::CTI::putDoubleResultToJSNumberCellOrJSImmediate): - (JSC::CTI::compileBinaryArithOp): - (JSC::CTI::compileBinaryArithOpSlowCase): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - (JSC::CTI::privateCompileCTIMachineTrampolines): - * VM/CTI.h: - -2008-11-14 Greg Bolsinga <bolsinga@apple.com> - - Reviewed by Antti Koivisto - - Fix potential build break by adding StdLibExtras.h - - * GNUmakefile.am: - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - -2008-11-14 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. - - Generate less code for the slow cases of op_call and op_construct. - https://bugs.webkit.org/show_bug.cgi?id=22272 - - 1% progression on v8 tests. - - * VM/CTI.cpp: - (JSC::CTI::emitRetrieveArg): - (JSC::CTI::emitNakedCall): - (JSC::CTI::compileOpCallInitializeCallFrame): - (JSC::CTI::compileOpCall): - (JSC::CTI::privateCompileSlowCases): - (JSC::CTI::privateCompileCTIMachineTrampolines): - * VM/CTI.h: - * VM/CodeBlock.h: - (JSC::getCallLinkInfoReturnLocation): - (JSC::CodeBlock::getCallLinkInfo): - * VM/Machine.cpp: - (JSC::Machine::Machine): - (JSC::Machine::cti_vm_dontLazyLinkCall): - (JSC::Machine::cti_vm_lazyLinkCall): - * VM/Machine.h: - -2008-11-14 Greg Bolsinga <bolsinga@apple.com> - - Reviewed by Darin Alder. - - https://bugs.webkit.org/show_bug.cgi?id=21810 - Remove use of static C++ objects that are destroyed at exit time (destructors) - - Create DEFINE_STATIC_LOCAL macro. Change static local objects to leak to avoid - exit-time destructor. Update code that was changed to fix this issue that ran - into a gcc bug (<rdar://problem/6354696> Codegen issue with C++ static reference - in gcc build 5465). Also typdefs for template types needed to be added in some - cases so the type could make it through the macro successfully. - - Basically code of the form: - static T m; - becomes: - DEFINE_STATIC_LOCAL(T, m, ()); - - Also any code of the form: - static T& m = *new T; - also becomes: - DEFINE_STATIC_LOCAL(T, m, ()); - - * JavaScriptCore.xcodeproj/project.pbxproj: - * wtf/MainThread.cpp: - (WTF::mainThreadFunctionQueueMutex): - (WTF::functionQueue): - * wtf/StdLibExtras.h: Added. Add DEFINE_STATIC_LOCAL macro - * wtf/ThreadingPthreads.cpp: - (WTF::threadMapMutex): - (WTF::threadMap): - (WTF::identifierByPthreadHandle): - -2008-11-13 Sam Weinig <sam@webkit.org> - - Reviewed by Darin Adler - - Fix for https://bugs.webkit.org/show_bug.cgi?id=22269 - Reduce PropertyMap usage - - From observation of StructureID statistics, it became clear that many - StructureID's were not being used as StructureIDs themselves, but rather - only being necessary as links in the transition chain. Acknowledging this - and that PropertyMaps stored in StructureIDs can be treated as caches, that - is that they can be reconstructed on demand, it became clear that we could - reduce the memory consumption of StructureIDs by only keeping PropertyMaps - for the StructureIDs that need them the most. - - The specific strategy used to reduce the number of StructureIDs with - PropertyMaps is to take the previous StructureIDs PropertyMap when initially - transitioning (addPropertyTransition) from it and clearing out the pointer - in the process. The next time we need to do the same transition, for instance - repeated calls to the same constructor, we use the new addPropertyTransitionToExistingStructure - first, which allows us not to need the PropertyMap to determine if the property - exists already, since a transition to that property would require it not already - be present in the StructureID. Should there be no transition, the PropertyMap - can be constructed on demand (via materializePropertyMap) to determine if the put is a - replace or a transition to a new StructureID. - - Reduces memory use on Membuster head test (30 pages open) by ~15MB. - - * JavaScriptCore.exp: - * runtime/JSObject.h: - (JSC::JSObject::putDirect): First use addPropertyTransitionToExistingStructure - so that we can avoid building the PropertyMap on subsequent similar object - creations. - * runtime/PropertyMapHashTable.h: - (JSC::PropertyMapEntry::PropertyMapEntry): Add version of constructor which takes - all values to be used when lazily building the PropertyMap. - * runtime/StructureID.cpp: - (JSC::StructureID::dumpStatistics): Add statistics on the number of StructureIDs - with PropertyMaps. - (JSC::StructureID::StructureID): Rename m_cachedTransistionOffset to m_offset - (JSC::isPowerOf2): - (JSC::nextPowerOf2): - (JSC::sizeForKeyCount): Returns the expected size of a PropertyMap for a key count. - (JSC::StructureID::materializePropertyMap): Builds the PropertyMap out of its previous pointer chain. - (JSC::StructureID::addPropertyTransitionToExistingStructure): Only transitions if there is a - an existing transition. - (JSC::StructureID::addPropertyTransition): Instead of always copying the ProperyMap, try and take - it from it previous pointer. - (JSC::StructureID::removePropertyTransition): Simplify by calling toDictionaryTransition() to do - transition work. - (JSC::StructureID::changePrototypeTransition): Build the PropertyMap if necessary before transitioning - because once you have transitioned, you will not be able to reconstruct it afterwards as there is no - previous pointer, pinning the ProperyMap as well. - (JSC::StructureID::getterSetterTransition): Ditto. - (JSC::StructureID::toDictionaryTransition): Pin the PropertyMap so that it is not destroyed on further transitions. - (JSC::StructureID::fromDictionaryTransition): We can only transition back from a dictionary transition if there - are no deleted offsets. - (JSC::StructureID::addPropertyWithoutTransition): Build PropertyMap on demands and pin. - (JSC::StructureID::removePropertyWithoutTransition): Ditto. - (JSC::StructureID::get): Build on demand. - (JSC::StructureID::createPropertyMapHashTable): Add version of create that takes a size - for on demand building. - (JSC::StructureID::expandPropertyMapHashTable): - (JSC::StructureID::rehashPropertyMapHashTable): - (JSC::StructureID::getEnumerablePropertyNamesInternal): Build PropertyMap on demand. - * runtime/StructureID.h: - (JSC::StructureID::propertyStorageSize): Account for StructureIDs without PropertyMaps. - (JSC::StructureID::isEmpty): Ditto. - (JSC::StructureID::materializePropertyMapIfNecessary): - (JSC::StructureID::get): Build PropertyMap on demand - -2008-11-14 Csaba Osztrogonac <oszi@inf.u-szeged.hu> - - Reviewed by Simon Hausmann. - - <https://bugs.webkit.org/show_bug.cgi?id=21500> - - JavaScriptCore build with -O3 flag instead of -O2 (gcc). - 2.02% speedup on SunSpider (Qt-port on Linux) - 1.10% speedup on V8 (Qt-port on Linux) - 3.45% speedup on WindScorpion (Qt-port on Linux) - - * JavaScriptCore.pri: - -2008-11-14 Kristian Amlie <kristian.amlie@trolltech.com> +2009-07-07 Mark Rowe <mrowe@apple.com> Reviewed by Darin Adler. - Compile fix for RVCT. - - In reality, it is two fixes: - - 1. Remove typename. I believe typename can only be used when the named - type depends on the template parameters, which it doesn't in this - case, so I think this is more correct. - 2. Replace ::iterator scope with specialized typedef. This is to work - around a bug in RVCT. - - https://bugs.webkit.org/show_bug.cgi?id=22260 - - * wtf/ListHashSet.h: - (WTF::::find): - -2008-11-14 Kristian Amlie <kristian.amlie@trolltech.com> - - Reviewed by Darin Adler. - - Compile fix for WINSCW. - - This fix doesn't protect against implicit conversions from bool to - integers, but most likely that will be caught on another platform. - - https://bugs.webkit.org/show_bug.cgi?id=22260 - - * wtf/PassRefPtr.h: - (WTF::PassRefPtr::operator bool): - * wtf/RefPtr.h: - (WTF::RefPtr::operator bool): - -2008-11-14 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Darin Adler. - - Bug 22245: Move wtf/dtoa.h into the WTF namespace - <https://bugs.webkit.org/show_bug.cgi?id=22245> - - Move wtf/dtoa.h into the WTF namespace from the JSC namespace. This - introduces some ambiguities in name lookups, so I changed all uses of - the functions in wtf/dtoa.h to explicitly state the namespace. - - * JavaScriptCore.exp: - * parser/Lexer.cpp: - (JSC::Lexer::lex): - * runtime/InitializeThreading.cpp: - * runtime/JSGlobalObjectFunctions.cpp: - (JSC::parseInt): - * runtime/NumberPrototype.cpp: - (JSC::integerPartNoExp): - (JSC::numberProtoFuncToExponential): - * runtime/UString.cpp: - (JSC::concatenate): - (JSC::UString::from): - (JSC::UString::toDouble): - * wtf/dtoa.cpp: - * wtf/dtoa.h: - -2008-11-14 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Maciej Stachowiak. - - Bug 22257: Enable redundant read optimizations for results generated by compileBinaryArithOp() - <https://bugs.webkit.org/show_bug.cgi?id=22257> - - This shows no change in performance on either SunSpider or the V8 - benchmark suite, but it removes an ugly special case and allows for - future optimizations to be implemented in a cleaner fashion. - - This patch was essentially given to me by Gavin Barraclough upon my - request, but I did regression and performance testing so that he could - work on something else. - - * VM/CTI.cpp: - (JSC::CTI::putDoubleResultToJSNumberCellOrJSImmediate): Move the final - result to eax if it is not already there. - (JSC::CTI::compileBinaryArithOp): Remove the killing of the final result - register that disables the optimization. - -2008-11-13 Eric Seidel <eric@webkit.org> - - Reviewed by Adam Roben. + Fix <https://bugs.webkit.org/show_bug.cgi?id=27025> / <rdar://problem/7033448>. + Bug 27025: Crashes and regression test failures related to regexps in 64-bit - Add a Scons-based build system for building - the Chromium-Mac build of JavaScriptCore. - https://bugs.webkit.org/show_bug.cgi?id=21991 + For x86_64 RegexGenerator uses rbx, a callee-save register, as a scratch register but + neglects to save and restore it. The change in handling of the output vector in r45545 + altered code generation so that the RegExp::match was now storing important data in rbx, + which caused crashes and bogus results when it was clobbered. - * JavaScriptCore.scons: Added. - * SConstruct: Added. - -2008-11-13 Eric Seidel <eric@webkit.org> - - Reviewed by Adam Roben. - - Add PLATFORM(CHROMIUM) to the "we don't use cairo" blacklist - until https://bugs.webkit.org/show_bug.cgi?id=22250 is fixed. - - * wtf/Platform.h: + * yarr/RegexJIT.cpp: + (JSC::Yarr::RegexGenerator::generateEnter): Save rbx. + (JSC::Yarr::RegexGenerator::generateReturn): Restore rbx. -2008-11-13 Cameron Zwarich <zwarich@apple.com> +2009-07-06 Ada Chan <adachan@apple.com> - Reviewed by Sam Weinig. + Reviewed by Darin Adler and Mark Rowe. - In r38375 the 'jsc' shell was changed to improve teardown on quit. The - main() function in jsc.cpp uses Structured Exception Handling, so Visual - C++ emits a warning when destructors are used. + Decommitted spans are added to the list of normal spans rather than + the returned spans in TCMalloc_PageHeap::Delete(). + https://bugs.webkit.org/show_bug.cgi?id=26998 - In order to speculatively fix the Windows build, this patch changes that - code to use explicit pointer manipulation and locking rather than smart - pointers and RAII. - - * jsc.cpp: - (main): - -2008-11-13 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Darin Adler. - - Bug 22246: Get arguments for opcodes together to eliminate more redundant memory reads - <https://bugs.webkit.org/show_bug.cgi?id=22246> - - It is common for opcodes to read their first operand into eax and their - second operand into edx. If the value intended for the second operand is - in eax, we should first move eax to the register for the second operand - and then read the first operand into eax. - - This is a 0.5% speedup on SunSpider and a 2.0% speedup on the V8 - benchmark suite when measured using the V8 harness. - - * VM/CTI.cpp: - (JSC::CTI::emitGetArgs): - (JSC::CTI::compileOpStrictEq): - (JSC::CTI::compileBinaryArithOp): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - * VM/CTI.h: - -2008-11-13 Cameron Zwarich <zwarich@apple.com> + In TCMalloc_PageHeap::Delete(), the deleted span can be decommitted in + the process of merging with neighboring spans that are also decommitted. + The merged span needs to be placed in the list of returned spans (spans + whose memory has been returned to the system). Right now it's always added + to the list of the normal spans which can theoretically cause thrashing. - Reviewed by Darin Adler. - - Bug 22238: Avoid unnecessary reads of temporaries when the target machine register is not eax - <https://bugs.webkit.org/show_bug.cgi?id=22238> - - Enable the optimization of not reading a value back from memory that we - just wrote when the target machine register is not eax. In order to do - this, the code generation for op_put_global_var must be changed to - read its argument into a register before overwriting eax. - - This is a 0.5% speedup on SunSpider and shows no change on the V8 - benchmark suite when run in either harness. - - * VM/CTI.cpp: - (JSC::CTI::emitGetArg): - (JSC::CTI::privateCompileMainPass): - -2008-11-13 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Alexey Proskuryakov. - - Perform teardown in the 'jsc' shell in order to suppress annoying and - misleading leak messages. There is still a lone JSC::Node leaking when - quit() is called, but hopefully that can be fixed as well. - - * jsc.cpp: - (functionQuit): - (main): - -2008-11-13 Mike Pinkerton <pinkerton@chromium.org> - - Reviewed by Sam Weinig. - - Fix for https://bugs.webkit.org/show_bug.cgi?id=22087 - Need correct platform defines for Mac Chromium - - Set the appropriate platform defines for Mac Chromium, which is - similar to PLATFORM(MAC), but isn't. - - * wtf/Platform.h: - -2008-11-13 Maciej Stachowiak <mjs@apple.com> + * wtf/FastMalloc.cpp: + (WTF::TCMalloc_PageHeap::Delete): - Reviewed by Cameron Zwarich. - - - remove immediate checks from native codegen for known non-immediate cases like "this" - - ~.5% speedup on v8 benchmarks - - In the future we can extend this model to remove all sorts of - typechecks based on local type info or type inference. - - I also added an assertion to verify that all slow cases linked as - many slow case jumps as the corresponding fast case generated, and - fixed the pre-existing cases where this was not true. - - * VM/CTI.cpp: - (JSC::CTI::emitJumpSlowCaseIfNotJSCell): - (JSC::CTI::linkSlowCaseIfNotJSCell): - (JSC::CTI::compileBinaryArithOp): - (JSC::CTI::compileBinaryArithOpSlowCase): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - * VM/CTI.h: - * VM/CodeBlock.h: - (JSC::CodeBlock::isKnownNotImmediate): - -2008-11-13 Cameron Zwarich <zwarich@apple.com> +2009-07-05 Lars Knoll <lars.knoll@nokia.com> Reviewed by Maciej Stachowiak. - Bug 21943: Avoid needless reads of temporary values in CTI code - <https://bugs.webkit.org/show_bug.cgi?id=21943> - - If an opcode needs to load a virtual register and a previous opcode left - the contents of that virtual register in a machine register, use the - value in the machine register rather than getting it from memory. - - In order to perform this optimization, it is necessary to know the - jump tagets in the CodeBlock. For temporaries, the only problematic - jump targets are binary logical operators and the ternary conditional - operator. However, if this optimization were to be extended to local - variable registers as well, other jump targets would need to be - included, like switch statement cases and the beginnings of catch - blocks. - - This optimization also requires that the fast case and the slow case - of an opcode use emitPutResult() on the same register, which was chosen - to be eax, as that is the register into which we read the first operand - of opcodes. In order to make this the case, we needed to add some mov - instructions to the slow cases of some instructions. - - This optimizaton is not applied whenever compileBinaryArithOp() is used - to compile an opcode, because different machine registers may be used to - store the final result. It seems possible to rewrite the code generation - in compileBinaryArithOp() to allow for this optimization. - - This optimization is also not applied when generating slow cases, - because some fast cases overwrite the value of eax before jumping to the - slow case. In the future, it may be possible to apply this optimization - to slow cases as well, but it did not seem to be a speedup when testing - an early version of this patch. - - This is a 1.0% speedup on SunSpider and a 6.3% speedup on the V8 - benchmark suite. - - * VM/CTI.cpp: - (JSC::CTI::killLastResultRegister): - (JSC::CTI::emitGetArg): - (JSC::CTI::emitGetPutArg): - (JSC::CTI::emitGetCTIParam): - (JSC::CTI::emitGetFromCallFrameHeader): - (JSC::CTI::emitPutResult): - (JSC::CTI::emitCTICall): - (JSC::CTI::CTI): - (JSC::CTI::compileOpCall): - (JSC::CTI::compileOpStrictEq): - (JSC::CTI::emitSlowScriptCheck): - (JSC::CTI::compileBinaryArithOp): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - (JSC::CTI::privateCompileGetByIdProto): - (JSC::CTI::privateCompilePatchGetArrayLength): - * VM/CTI.h: - * VM/CodeBlock.h: - (JSC::CodeBlock::isTemporaryRegisterIndex): - * bytecompiler/CodeGenerator.cpp: - (JSC::CodeGenerator::emitLabel): - -2008-11-12 Alp Toker <alp@nuanti.com> - - autotools build system fix-up only. Add FloatQuad.h to the source - lists and sort them. - - * GNUmakefile.am: - -2008-11-12 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Fixed https://bugs.webkit.org/show_bug.cgi?id=22192 - +37 failures in fast/profiler - - along with Darin's review comments in - https://bugs.webkit.org/show_bug.cgi?id=22174 - Simplified op_call by nixing its responsibility for moving the value of - "this" into the first argument slot - - * VM/Machine.cpp: - (JSC::returnToThrowTrampoline): - (JSC::throwStackOverflowError): - (JSC::Machine::cti_register_file_check): - (JSC::Machine::cti_op_call_arityCheck): - (JSC::Machine::cti_vm_throw): Moved the throw logic into a function, since - functions are better than macros. - - * bytecompiler/CodeGenerator.cpp: - (JSC::CodeGenerator::emitCall): - (JSC::CodeGenerator::emitConstruct): Ensure that the function register - is preserved if profiling is enabled, since the profiler uses that - register. - - * runtime/JSGlobalData.h: Renamed throwReturnAddress to exceptionLocation, - because I had a hard time understanding what "throwReturnAddress" meant. - -2008-11-12 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Roll in r38322, now that test failures have been fixed. - - * VM/CTI.cpp: - (JSC::CTI::compileOpCallSetupArgs): - (JSC::CTI::compileOpCallEvalSetupArgs): - (JSC::CTI::compileOpConstructSetupArgs): - (JSC::CTI::compileOpCall): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - * VM/CTI.h: - * VM/CodeBlock.cpp: - (JSC::CodeBlock::dump): - * VM/Machine.cpp: - (JSC::Machine::callEval): - (JSC::Machine::dumpCallFrame): - (JSC::Machine::dumpRegisters): - (JSC::Machine::execute): - (JSC::Machine::privateExecute): - (JSC::Machine::cti_register_file_check): - (JSC::Machine::cti_op_call_arityCheck): - (JSC::Machine::cti_op_call_NotJSFunction): - (JSC::Machine::cti_op_construct_JSConstruct): - (JSC::Machine::cti_op_construct_NotJSConstruct): - (JSC::Machine::cti_op_call_eval): - (JSC::Machine::cti_vm_throw): - * VM/Machine.h: - * bytecompiler/CodeGenerator.cpp: - (JSC::CodeGenerator::emitCall): - (JSC::CodeGenerator::emitCallEval): - (JSC::CodeGenerator::emitConstruct): - * bytecompiler/CodeGenerator.h: - * parser/Nodes.cpp: - (JSC::EvalFunctionCallNode::emitCode): - (JSC::FunctionCallValueNode::emitCode): - (JSC::FunctionCallResolveNode::emitCode): - (JSC::FunctionCallBracketNode::emitCode): - (JSC::FunctionCallDotNode::emitCode): - * parser/Nodes.h: - (JSC::ScopeNode::neededConstants): - -2008-11-12 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Cameron Zwarich. - - Fix for https://bugs.webkit.org/show_bug.cgi?id=22201 - Integer conversion in array.length was safe signed values, - but the length is unsigned. - - * VM/CTI.cpp: - (JSC::CTI::privateCompilePatchGetArrayLength): - -2008-11-12 Cameron Zwarich <zwarich@apple.com> - - Rubber-stamped by Mark Rowe. - - Roll out r38322 due to test failures on the bots. - - * VM/CTI.cpp: - (JSC::CTI::compileOpCallSetupArgs): - (JSC::CTI::compileOpCall): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - * VM/CTI.h: - * VM/CodeBlock.cpp: - (JSC::CodeBlock::dump): - * VM/Machine.cpp: - (JSC::Machine::callEval): - (JSC::Machine::dumpCallFrame): - (JSC::Machine::dumpRegisters): - (JSC::Machine::execute): - (JSC::Machine::privateExecute): - (JSC::Machine::throwStackOverflowPreviousFrame): - (JSC::Machine::cti_register_file_check): - (JSC::Machine::cti_op_call_arityCheck): - (JSC::Machine::cti_op_call_NotJSFunction): - (JSC::Machine::cti_op_construct_JSConstruct): - (JSC::Machine::cti_op_construct_NotJSConstruct): - (JSC::Machine::cti_op_call_eval): - (JSC::Machine::cti_vm_throw): - * VM/Machine.h: - * bytecompiler/CodeGenerator.cpp: - (JSC::CodeGenerator::emitCall): - (JSC::CodeGenerator::emitCallEval): - (JSC::CodeGenerator::emitConstruct): - * bytecompiler/CodeGenerator.h: - * parser/Nodes.cpp: - (JSC::EvalFunctionCallNode::emitCode): - (JSC::FunctionCallValueNode::emitCode): - (JSC::FunctionCallResolveNode::emitCode): - (JSC::FunctionCallBracketNode::emitCode): - (JSC::FunctionCallDotNode::emitCode): - * parser/Nodes.h: - (JSC::ScopeNode::neededConstants): - -2008-11-11 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Darin Adler. - - Fixed https://bugs.webkit.org/show_bug.cgi?id=22174 - Simplified op_call by nixing its responsibility for moving the value of - "this" into the first argument slot. - - Instead, the caller emits an explicit load or mov instruction, or relies - on implicit knowledge that "this" is already in the first argument slot. - As a result, two operands to op_call are gone: firstArg and thisVal. - - SunSpider and v8 tests show no change in bytecode or CTI. - - * VM/CTI.cpp: - (JSC::CTI::compileOpCallSetupArgs): - (JSC::CTI::compileOpCallEvalSetupArgs): - (JSC::CTI::compileOpConstructSetupArgs): Split apart these three versions - of setting up arguments to op_call, because they're more different than - they are the same -- even more so with this patch. - - (JSC::CTI::compileOpCall): Updated for the fact that op_construct doesn't - match op_call anymore. - - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): Merged a few call cases. Updated - for changes mentioned above. - - * VM/CTI.h: - - * VM/CodeBlock.cpp: - (JSC::CodeBlock::dump): Updated for new bytecode format of call / construct. - - * VM/Machine.cpp: - (JSC::Machine::callEval): Updated for new bytecode format of call / construct. - - (JSC::Machine::dumpCallFrame): - (JSC::Machine::dumpRegisters): Simplified these debugging functions, - taking advantage of the new call frame layout. - - (JSC::Machine::execute): Fixed up the eval version of execute to be - friendlier to calls in the new format. - - (JSC::Machine::privateExecute): Implemented the new call format in - bytecode. + https://bugs.webkit.org/show_bug.cgi?id=26843 - (JSC::Machine::cti_op_call_NotJSFunction): - (JSC::Machine::cti_op_construct_JSConstruct): - (JSC::Machine::cti_op_construct_NotJSConstruct): - (JSC::Machine::cti_op_call_eval): Updated CTI helpers to match the new - call format. - - Fixed a latent bug in stack overflow checking that is now hit because - the register layout has changed a bit -- namely: when throwing a stack - overflow exception inside an op_call helper, we need to account for the - fact that the current call frame is only half-constructed, and use the - parent call frame instead. - - * VM/Machine.h: - - * bytecompiler/CodeGenerator.cpp: - (JSC::CodeGenerator::emitCall): - (JSC::CodeGenerator::emitCallEval): - (JSC::CodeGenerator::emitConstruct): - * bytecompiler/CodeGenerator.h: Updated codegen to match the new call - format. - - * parser/Nodes.cpp: - (JSC::EvalFunctionCallNode::emitCode): - (JSC::FunctionCallValueNode::emitCode): - (JSC::FunctionCallResolveNode::emitCode): - (JSC::FunctionCallBracketNode::emitCode): - (JSC::FunctionCallDotNode::emitCode): - * parser/Nodes.h: - (JSC::ScopeNode::neededConstants): ditto - -2008-11-11 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Geoff Garen. - - Remove an unused forwarding header for a file that no longer exists. - - * ForwardingHeaders/JavaScriptCore/JSLock.h: Removed. - -2008-11-11 Mark Rowe <mrowe@apple.com> + Fix run-time crashes in JavaScriptCore with the Metrowerks compiler on Symbian. - Fix broken dependencies building JavaScriptCore on a freezing cold cat, caused - by failure to update all instances of "kjs" to their new locations. + The Metrowerks compiler on the Symbian platform moves the globally + defined Hashtables into read-only memory, despite one of the members + being mutable. This causes crashes at run-time due to write access to + read-only memory. - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-11-11 Alexey Proskuryakov <ap@webkit.org> - - Rubber-stamped by Adam Roben. - - * wtf/AVLTree.h: (WTF::AVLTree::Iterator::start_iter): - Fix indentation a little more. - -2008-11-11 Cameron Zwarich <zwarich@apple.com> - - Rubber-stamped by Sam Weinig. - - Clean up EvalCodeCache to match our coding style a bit more. + Avoid the use of const with this compiler by introducing the + JSC_CONST_HASHTABLE macro. - * VM/EvalCodeCache.h: - (JSC::EvalCodeCache::get): + Based on idea by Norbert Leser. -2008-11-11 Cameron Zwarich <zwarich@apple.com> + * runtime/Lookup.h: Define JSC_CONST_HASHTABLE as const for !WINSCW. + * create_hash_table: Use JSC_CONST_HASHTABLE for hashtables. + * runtime/JSGlobalData.cpp: Import various global hashtables via the macro. - Rubber-stamped by Sam Weinig. +2009-07-04 Dan Bernstein <mitz@apple.com> - Bug 22179: Move EvalCodeCache from CodeBlock.h into its own file - <https://bugs.webkit.org/show_bug.cgi?id=22179> + - debug build fix - * GNUmakefile.am: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/CodeBlock.h: - * VM/EvalCodeCache.h: Copied from VM/CodeBlock.h. - * VM/Machine.cpp: - -2008-11-11 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Sam Weinig. - - Remove the 'm_' prefix from the fields of the SwitchRecord struct. - - * VM/CTI.cpp: - (JSC::CTI::privateCompile): - * VM/CTI.h: - (JSC::SwitchRecord): - (JSC::SwitchRecord::SwitchRecord): - -2008-11-11 Cameron Zwarich <zwarich@apple.com> - - Rubber-stamped by Sam Weinig. - - Make asInteger() a static function so that it has internal linkage. - - * VM/CTI.cpp: - (JSC::asInteger): - -2008-11-11 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Mark Rowe. - - - shrink CodeBlock and AST related Vectors to exact fit (5-10M savings on membuster test) - - No perf regression combined with the last patch (each seems like a small regression individually) + * runtime/RegExpConstructor.cpp: + (JSC::RegExpConstructor::getLastParen): - * bytecompiler/CodeGenerator.cpp: - (JSC::CodeGenerator::generate): - * parser/Nodes.h: - (JSC::SourceElements::releaseContentsIntoVector): - * wtf/Vector.h: - (WTF::Vector::shrinkToFit): +2009-07-03 Yong Li <yong.li@torchmobile.com> -2008-11-11 Maciej Stachowiak <mjs@apple.com> + Reviewed by Maciej Stachowiak (and revised slightly) - Reviewed by Mark Rowe. - - - remove inline capacity from declaration stacks (15M savings on membuster test) + RegExp::match to be optimized + https://bugs.webkit.org/show_bug.cgi?id=26957 - No perf regression on SunSpider or V8 test combined with other upcoming memory improvement patch. + Allow regexp matching to use Vectors with inline capacity instead of + allocating a new ovector buffer every time. - * JavaScriptCore.exp: - * parser/Nodes.h: + ~5% speedup on SunSpider string-unpack-code test, 0.3% on SunSpider overall. -2008-11-11 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Oliver Hunt. - - While r38286 removed the need for the m_callFrame member variable of - CTI, it should be also be removed. - - * VM/CTI.h: - -2008-11-10 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Oliver Hunt. - - Make CTI::asInteger() a non-member function, since it needs no access to - any of CTI's member variables. - - * VM/CTI.cpp: - (JSC::asInteger): - * VM/CTI.h: - -2008-11-10 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Maciej Stachowiak. - - Use 'value' instead of 'js' in CTI as a name for JSValue* to match our - usual convention elsewhere. - - * VM/CTI.cpp: - (JSC::CTI::emitGetArg): - (JSC::CTI::emitGetPutArg): - (JSC::CTI::getConstantImmediateNumericArg): - (JSC::CTI::printOpcodeOperandTypes): - -2008-11-10 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Maciej Stachowiak. - - Make CTI::getConstant() a member function of CodeBlock instead. - - * VM/CTI.cpp: - (JSC::CTI::emitGetArg): - (JSC::CTI::emitGetPutArg): - (JSC::CTI::getConstantImmediateNumericArg): - (JSC::CTI::printOpcodeOperandTypes): - (JSC::CTI::privateCompileMainPass): - * VM/CTI.h: - * VM/CodeBlock.h: - (JSC::CodeBlock::getConstant): + * runtime/RegExp.cpp: + (JSC::RegExp::match): + * runtime/RegExp.h: + * runtime/RegExpConstructor.cpp: + (JSC::RegExpConstructorPrivate::RegExpConstructorPrivate): + (JSC::RegExpConstructorPrivate::lastOvector): + (JSC::RegExpConstructorPrivate::tempOvector): + (JSC::RegExpConstructorPrivate::changeLastOvector): + (JSC::RegExpConstructor::performMatch): + (JSC::RegExpMatchesArray::RegExpMatchesArray): + (JSC::RegExpMatchesArray::fillArrayInstance): + (JSC::RegExpConstructor::getBackref): + (JSC::RegExpConstructor::getLastParen): + (JSC::RegExpConstructor::getLeftContext): + (JSC::RegExpConstructor::getRightContext): + * runtime/StringPrototype.cpp: + (JSC::stringProtoFuncSplit): -2008-11-10 Cameron Zwarich <zwarich@apple.com> +2009-06-30 Kwang Yul Seo <skyul@company100.net> - Reviewed by Sam Weinig. + Reviewed by Eric Seidel. - Rename CodeBlock::isConstant() to isConstantRegisterIndex(). + Override operator new/delete with const std::nothrow_t& as the second + argument. + https://bugs.webkit.org/show_bug.cgi?id=26792 - * VM/CTI.cpp: - (JSC::CTI::emitGetArg): - (JSC::CTI::emitGetPutArg): - (JSC::CTI::getConstantImmediateNumericArg): - (JSC::CTI::printOpcodeOperandTypes): - (JSC::CTI::privateCompileMainPass): - * VM/CodeBlock.h: - (JSC::CodeBlock::isConstantRegisterIndex): - * bytecompiler/CodeGenerator.cpp: - (JSC::CodeGenerator::emitEqualityOp): + On Windows CE, operator new/delete, new[]/delete[] with const + std::nothrow_t& must be overrided because some standard template + libraries use these operators. -2008-11-10 Gavin Barraclough <barraclough@apple.com> + The problem occurs when memory allocated by new(size_t s, const + std::nothrow_t&) is freed by delete(void* p). This causes the umatched + malloc/free problem. - Build fix for non-CTI builds. + The patch overrides all new, delete, new[] and delete[] to use + fastMaloc and fastFree consistently. - * VM/Machine.cpp: - (JSC::Machine::initialize): + * wtf/FastMalloc.h: + (throw): -2008-11-10 Cameron Zwarich <zwarich@apple.com> +2009-06-30 Gabor Loki <loki@inf.u-szeged.hu> Reviewed by Sam Weinig. - Remove the unused labels member variable of CodeBlock. - - * VM/CodeBlock.h: - * VM/LabelID.h: - (JSC::LabelID::setLocation): - -2008-11-10 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Cameron Zwarich. - - Batch compile the set of static trampolines at the point Machine is constructed, using a single allocation. - Refactor out m_callFrame from CTI, since this is only needed to access the global data (instead store a - pointer to the global data directly, since this is available at the point the Machine is constructed). - Add a method to align the code buffer, to allow JIT generation for multiple trampolines in one block. - - * VM/CTI.cpp: - (JSC::CTI::getConstant): - (JSC::CTI::emitGetArg): - (JSC::CTI::emitGetPutArg): - (JSC::CTI::getConstantImmediateNumericArg): - (JSC::CTI::printOpcodeOperandTypes): - (JSC::CTI::CTI): - (JSC::CTI::compileBinaryArithOp): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileGetByIdProto): - (JSC::CTI::privateCompileGetByIdChain): - (JSC::CTI::privateCompileCTIMachineTrampolines): - (JSC::CTI::freeCTIMachineTrampolines): - * VM/CTI.h: - (JSC::CTI::compile): - (JSC::CTI::compileGetByIdSelf): - (JSC::CTI::compileGetByIdProto): - (JSC::CTI::compileGetByIdChain): - (JSC::CTI::compilePutByIdReplace): - (JSC::CTI::compilePutByIdTransition): - (JSC::CTI::compileCTIMachineTrampolines): - (JSC::CTI::compilePatchGetArrayLength): - * VM/Machine.cpp: - (JSC::Machine::initialize): - (JSC::Machine::~Machine): - (JSC::Machine::execute): - (JSC::Machine::tryCTICachePutByID): - (JSC::Machine::tryCTICacheGetByID): - (JSC::Machine::cti_op_call_JSFunction): - (JSC::Machine::cti_vm_lazyLinkCall): - * VM/Machine.h: - * masm/X86Assembler.h: - (JSC::JITCodeBuffer::isAligned): - (JSC::X86Assembler::): - (JSC::X86Assembler::align): - * runtime/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): - -2008-11-10 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Antti Koivisto. - - - Make Vector::clear() release the Vector's memory (1MB savings on membuster) - https://bugs.webkit.org/show_bug.cgi?id=22170 - - * wtf/Vector.h: - (WTF::VectorBufferBase::deallocateBuffer): Set capacity to 0 as - well as size, otherwise shrinking capacity to 0 can fail to reset - the capacity and thus cause a future crash. - (WTF::Vector::~Vector): Shrink size not capacity; we only need - to call destructors, the buffer will be freed anyway. - (WTF::Vector::clear): Change this to shrinkCapacity(0), not just shrink(0). - (WTF::::shrinkCapacity): Use shrink() instead of resize() for case where - the size is greater than the new capacity, to work with types that have no - default constructor. - -2008-11-10 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Maciej Stachowiak. - - Split multiple definitions into separate lines. - - * VM/CTI.cpp: - (JSC::CTI::compileBinaryArithOp): - -2008-11-10 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Geoff Garen. - - Bug 22162: Remove cachedValueGetter from the JavaScriptCore API implementation - <https://bugs.webkit.org/show_bug.cgi?id=22162> - - There is no more need for the cachedValueGetter hack now that we have - PropertySlot::setValue(), so we should remove it. - - * API/JSCallbackObject.h: - * API/JSCallbackObjectFunctions.h: - (JSC::::getOwnPropertySlot): - -2008-11-10 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Darin Adler. - - Bug 22152: Remove asObject() call from JSCallbackObject::getOwnPropertySlot() - <https://bugs.webkit.org/show_bug.cgi?id=22152> - - With the recent change to adopt asType() style cast functions with - assertions instead of static_casts in many places, the assertion for - the asObject() call in JSCallbackObject::getOwnPropertySlot() has been - failing when using any nontrivial client of the JavaScriptCore API. - The cast isn't even necessary to call slot.setCustom(), so it should - be removed. - - * API/JSCallbackObjectFunctions.h: - (JSC::JSCallbackObject::getOwnPropertySlot): - -2008-11-10 Alexey Proskuryakov <ap@webkit.org> - - Reviewed by Adam Roben. - - A few coding style fixes for AVLTree. - - * wtf/AVLTree.h: Moved to WTF namespace, Removed "KJS_" from include guards. - (WTF::AVLTree::Iterator::start_iter): Fixed indentation - - * runtime/JSArray.cpp: Added "using namepace WTF". - -2008-11-09 Cameron Zwarich <zwarich@apple.com> - - Not reviewed. - - Speculatively fix the non-AllInOne build. - - * runtime/NativeErrorConstructor.cpp: - -2008-11-09 Darin Adler <darin@apple.com> - - Reviewed by Tim Hatcher. - - - https://bugs.webkit.org/show_bug.cgi?id=22149 - remove unused code from the parser - - * AllInOneFile.cpp: Removed nodes2string.cpp. - * GNUmakefile.am: Ditto. - * JavaScriptCore.exp: Ditto. - * JavaScriptCore.pri: Ditto. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Ditto. - * JavaScriptCore.xcodeproj/project.pbxproj: Ditto. - * JavaScriptCoreSources.bkl: Ditto. - - * VM/CodeBlock.h: Added include. - - * VM/Machine.cpp: (JSC::Machine::execute): Use the types from - DeclarationStacks as DeclarationStacks:: rather than Node:: since - "Node" really has little to do with it. - * bytecompiler/CodeGenerator.cpp: - (JSC::CodeGenerator::CodeGenerator): Ditto. - - * jsc.cpp: - (Options::Options): Removed prettyPrint option. - (runWithScripts): Ditto. - (printUsageStatement): Ditto. - (parseArguments): Ditto. - (jscmain): Ditto. - - * parser/Grammar.y: Removed use of obsolete ImmediateNumberNode. - - * parser/Nodes.cpp: - (JSC::ThrowableExpressionData::emitThrowError): Use inline functions - instead of direct member access for ThrowableExpressionData values. - (JSC::BracketAccessorNode::emitCode): Ditto. - (JSC::DotAccessorNode::emitCode): Ditto. - (JSC::NewExprNode::emitCode): Ditto. - (JSC::EvalFunctionCallNode::emitCode): Ditto. - (JSC::FunctionCallValueNode::emitCode): Ditto. - (JSC::FunctionCallResolveNode::emitCode): Ditto. - (JSC::FunctionCallBracketNode::emitCode): Ditto. - (JSC::FunctionCallDotNode::emitCode): Ditto. - (JSC::PostfixResolveNode::emitCode): Ditto. - (JSC::PostfixBracketNode::emitCode): Ditto. - (JSC::PostfixDotNode::emitCode): Ditto. - (JSC::DeleteResolveNode::emitCode): Ditto. - (JSC::DeleteBracketNode::emitCode): Ditto. - (JSC::DeleteDotNode::emitCode): Ditto. - (JSC::PrefixResolveNode::emitCode): Ditto. - (JSC::PrefixBracketNode::emitCode): Ditto. - (JSC::PrefixDotNode::emitCode): Ditto. - (JSC::ThrowableBinaryOpNode::emitCode): Ditto. - (JSC::InstanceOfNode::emitCode): Ditto. - (JSC::ReadModifyResolveNode::emitCode): Ditto. - (JSC::AssignResolveNode::emitCode): Ditto. - (JSC::AssignDotNode::emitCode): Ditto. - (JSC::ReadModifyDotNode::emitCode): Ditto. - (JSC::AssignBracketNode::emitCode): Ditto. - (JSC::ReadModifyBracketNode::emitCode): Ditto. - (JSC::statementListEmitCode): Take a const StatementVector instead - of a non-const one. Also removed unused statementListPushFIFO. - (JSC::ForInNode::emitCode): Inline functions instead of member access. - (JSC::ThrowNode::emitCode): Ditto. - (JSC::EvalNode::emitCode): Ditto. - (JSC::FunctionBodyNode::emitCode): Ditto. - (JSC::ProgramNode::emitCode): Ditto. - - * parser/Nodes.h: Removed unused includes and forward declarations. - Removed Precedence enum. Made many more members private instead of - protected or public. Removed unused NodeStack typedef. Moved the - VarStack and FunctionStack typedefs from Node to ScopeNode. Made - Node::emitCode pure virtual and changed classes that don't emit - any code to inherit from ParserRefCounted rather than Node. - Moved isReturnNode from Node to StatementNode. Removed the - streamTo, precedence, and needsParensIfLeftmost functions from - all classes. Removed the ImmediateNumberNode class and make - NumberNode::setValue nonvirtual. - - * parser/nodes2string.cpp: Removed. - -2008-11-09 Darin Adler <darin@apple.com> - - Reviewed by Sam Weinig and Maciej Stachowiak. - Includes some work done by Chris Brichford. - - - fix https://bugs.webkit.org/show_bug.cgi?id=14886 - Stack overflow due to deeply nested parse tree doing repeated string concatentation - - Test: fast/js/large-expressions.html - - 1) Code generation is recursive, so takes stack proportional to the complexity - of the source code expression. Fixed by setting an arbitrary recursion limit - of 10,000 nodes. - - 2) Destruction of the syntax tree was recursive. Fixed by introducing a - non-recursive mechanism for destroying the tree. - - * bytecompiler/CodeGenerator.cpp: - (JSC::CodeGenerator::CodeGenerator): Initialize depth to 0. - (JSC::CodeGenerator::emitThrowExpressionTooDeepException): Added. Emits the code - to throw a "too deep" exception. - * bytecompiler/CodeGenerator.h: - (JSC::CodeGenerator::emitNode): Check depth and emit an exception if we exceed - the maximum depth. - - * parser/Nodes.cpp: - (JSC::NodeReleaser::releaseAllNodes): Added. To be called inside node destructors - to avoid recursive calls to destructors for nodes inside this one. - (JSC::NodeReleaser::release): Added. To be called inside releaseNodes functions. - Also added releaseNodes functions and calls to releaseAllNodes inside destructors - for each class derived from Node that has RefPtr to other nodes. - (JSC::NodeReleaser::adopt): Added. Used by the release function. - (JSC::NodeReleaser::adoptFunctionBodyNode): Added. - - * parser/Nodes.h: Added declarations of releaseNodes and destructors in all classes - that needed it. Eliminated use of ListRefPtr and releaseNext, which are the two parts - of an older solution to the non-recursive destruction problem that works only for - lists, whereas the new solution works for other graphs. Changed ReverseBinaryOpNode - to use BinaryOpNode as a base class to avoid some duplicated code. - -2008-11-08 Kevin Ollivier <kevino@theolliviers.com> - - wx build fixes after addition of JSCore parser and bycompiler dirs. Also cleanup - the JSCore Bakefile's group names to be consistent. - - * JavaScriptCoreSources.bkl: - * jscore.bkl: - -2008-11-07 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Geoff Garen. - - Bug 21801: REGRESSION (r37821): YUI date formatting JavaScript puts the letter 'd' in place of the day - <https://bugs.webkit.org/show_bug.cgi?id=21801> + <https://bugs.webkit.org/show_bug.cgi?id=24986> - Fix the constant register check in the 'typeof' optimization in - CodeGenerator, which was completely broken after r37821. + Remove unnecessary references to AssemblerBuffer. - * bytecompiler/CodeGenerator.cpp: - (JSC::CodeGenerator::emitEqualityOp): - -2008-11-07 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Geoff Garen. - - Bug 22129: Move CTI::isConstant() to CodeBlock - <https://bugs.webkit.org/show_bug.cgi?id=22129> - - * VM/CTI.cpp: - (JSC::CTI::emitGetArg): - (JSC::CTI::emitGetPutArg): - (JSC::CTI::getConstantImmediateNumericArg): - (JSC::CTI::printOpcodeOperandTypes): - (JSC::CTI::privateCompileMainPass): - * VM/CTI.h: - * VM/CodeBlock.h: - (JSC::CodeBlock::isConstant): - -2008-11-07 Alp Toker <alp@nuanti.com> - - autotools fix. Always use the configured perl binary (which may be - different to the one in $PATH) when generating sources. - - * GNUmakefile.am: - -2008-11-07 Cameron Zwarich <zwarich@apple.com> - - Not reviewed. - - Change grammar.cpp to Grammar.cpp and grammar.h to Grammar.h in several - build scripts. - - * DerivedSources.make: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCoreSources.bkl: - -2008-11-07 Alp Toker <alp@nuanti.com> - - More grammar.cpp -> Grammar.cpp build fixes. - - * AllInOneFile.cpp: - * GNUmakefile.am: - -2008-11-07 Simon Hausmann <hausmann@webkit.org> - - Fix the build on case-sensitive file systems. grammar.y was renamed to - Grammar.y but Lexer.cpp includes grammar.h. The build bots didn't - notice this change because of stale files. - - * parser/Lexer.cpp: - -2008-11-07 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Alexey Proskuryakov. - - Rename the m_nextGlobal, m_nextParameter, and m_nextConstant member - variables of CodeGenerator to m_nextGlobalIndex, m_nextParameterIndex, - and m_nextConstantIndex respectively. This is to distinguish these from - member variables like m_lastConstant, which are actually RefPtrs to - Registers. - - * bytecompiler/CodeGenerator.cpp: - (JSC::CodeGenerator::addGlobalVar): - (JSC::CodeGenerator::allocateConstants): - (JSC::CodeGenerator::CodeGenerator): - (JSC::CodeGenerator::addParameter): - (JSC::CodeGenerator::addConstant): - * bytecompiler/CodeGenerator.h: + * interpreter/Interpreter.cpp: + * interpreter/Interpreter.h: -2008-11-06 Gavin Barraclough barraclough@apple.com +2009-06-29 David Levin <levin@chromium.org> Reviewed by Oliver Hunt. - Do not make a cti_* call to perform an op_call unless either: - (1) The codeblock for the function body has not been generated. - (2) The number of arguments passed does not match the callee arity. - - ~1% progression on sunspider --v8 - - * VM/CTI.cpp: - (JSC::CTI::compileOpCallInitializeCallFrame): - (JSC::CTI::compileOpCall): - (JSC::CTI::privateCompileSlowCases): - * VM/CTI.h: - * VM/Machine.cpp: - (JSC::Machine::cti_op_call_JSFunction): - (JSC::Machine::cti_op_call_arityCheck): - (JSC::Machine::cti_op_construct_JSConstruct): - * VM/Machine.h: - * kjs/nodes.h: - -2008-11-06 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Geoff Garen. - - Move the remaining files in the kjs subdirectory of JavaScriptCore to - a new parser subdirectory, and remove the kjs subdirectory entirely. - - * AllInOneFile.cpp: - * DerivedSources.make: - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - * JavaScriptCore.vcproj/jsc/jsc.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * VM/CodeBlock.h: - * VM/ExceptionHelpers.cpp: - * VM/SamplingTool.h: - * bytecompiler/CodeGenerator.h: - * jsc.pro: - * jscore.bkl: - * kjs: Removed. - * kjs/NodeInfo.h: Removed. - * kjs/Parser.cpp: Removed. - * kjs/Parser.h: Removed. - * kjs/ResultType.h: Removed. - * kjs/SourceCode.h: Removed. - * kjs/SourceProvider.h: Removed. - * kjs/grammar.y: Removed. - * kjs/keywords.table: Removed. - * kjs/lexer.cpp: Removed. - * kjs/lexer.h: Removed. - * kjs/nodes.cpp: Removed. - * kjs/nodes.h: Removed. - * kjs/nodes2string.cpp: Removed. - * parser: Added. - * parser/Grammar.y: Copied from kjs/grammar.y. - * parser/Keywords.table: Copied from kjs/keywords.table. - * parser/Lexer.cpp: Copied from kjs/lexer.cpp. - * parser/Lexer.h: Copied from kjs/lexer.h. - * parser/NodeInfo.h: Copied from kjs/NodeInfo.h. - * parser/Nodes.cpp: Copied from kjs/nodes.cpp. - * parser/Nodes.h: Copied from kjs/nodes.h. - * parser/Parser.cpp: Copied from kjs/Parser.cpp. - * parser/Parser.h: Copied from kjs/Parser.h. - * parser/ResultType.h: Copied from kjs/ResultType.h. - * parser/SourceCode.h: Copied from kjs/SourceCode.h. - * parser/SourceProvider.h: Copied from kjs/SourceProvider.h. - * parser/nodes2string.cpp: Copied from kjs/nodes2string.cpp. - * pcre/pcre.pri: - * pcre/pcre_exec.cpp: - * runtime/FunctionConstructor.cpp: - * runtime/JSActivation.h: - * runtime/JSFunction.h: - * runtime/JSGlobalData.cpp: - * runtime/JSGlobalObjectFunctions.cpp: - * runtime/JSObject.cpp: - (JSC::JSObject::toNumber): - * runtime/RegExp.cpp: - -2008-11-06 Adam Roben <aroben@apple.com> - - Windows build fix after r38196 - - * JavaScriptCore.vcproj/jsc/jsc.vcproj: Added bytecompiler/ to the - include path. - -2008-11-06 Cameron Zwarich <zwarich@apple.com> - - Rubber-stamped by Sam Weinig. - - Create a new bytecompiler subdirectory of JavaScriptCore and move some - relevant files to it. - - * AllInOneFile.cpp: - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * VM/CodeGenerator.cpp: Removed. - * VM/CodeGenerator.h: Removed. - * bytecompiler: Added. - * bytecompiler/CodeGenerator.cpp: Copied from VM/CodeGenerator.cpp. - * bytecompiler/CodeGenerator.h: Copied from VM/CodeGenerator.h. - * bytecompiler/LabelScope.h: Copied from kjs/LabelScope.h. - * jscore.bkl: - * kjs/LabelScope.h: Removed. - -2008-11-06 Adam Roben <aroben@apple.com> - - Windows clean build fix after r38155 - - Rubberstamped by Cameron Zwarich. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Update - the post-build event for the move of create_hash_table out of kjs/. - -2008-11-06 Laszlo Gombos <laszlo.1.gombos@nokia.com> - - Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=22107 - - Bug uncovered during RVCT port in functions not used. get_lt() and - get_gt() takes only one argument - remove second argument where - applicable. - - * wtf/AVLTree.h: - (JSC::AVLTree::remove): Remove second argument of get_lt/get_gt(). - (JSC::AVLTree::subst): Ditto. - -2008-11-06 Alp Toker <alp@nuanti.com> - - Reviewed by Cameron Zwarich. - - https://bugs.webkit.org/show_bug.cgi?id=22033 - [GTK] CTI/Linux r38064 crashes; JIT requires executable memory - - Mark pages allocated by the FastMalloc mmap code path executable with - PROT_EXEC. This fixes crashes seen on CPUs and kernels that enforce - non-executable memory (like ExecShield on Fedora Linux) when the JIT - is enabled. - - This patch does not resolve the issue on debug builds so affected - developers may still need to pass --disable-jit to configure. - - * wtf/TCSystemAlloc.cpp: - (TryMmap): - (TryDevMem): - (TCMalloc_SystemRelease): - -2008-11-06 Peter Gal <galpeter@inf.u-szeged.hu> - - Reviewed by Cameron Zwarich. - - Bug 22099: Make the Qt port build the JSC shell in the correct place - <https://bugs.webkit.org/show_bug.cgi?id=22099> - - Adjust include paths and build destination dir for the 'jsc' executable - in the Qt build. - - * jsc.pro: - -2008-11-06 Kristian Amlie <kristian.amlie@nokia.com> - - Reviewed by Simon Hausmann. - - Implemented the block allocation on Symbian through heap allocation. - - Unfortunately there is no way to allocate virtual memory. The Posix - layer provides mmap() but no anonymous mapping. So this is a very slow - solution but it should work as a start. - - * runtime/Collector.cpp: - (JSC::allocateBlock): - (JSC::freeBlock): - -2008-11-06 Laszlo Gombos <laszlo.1.gombos@nokia.com> - - Reviewed by Simon Hausmann. - - Borrow some math functions from the MSVC port to the build with the - RVCT compiler. - - * wtf/MathExtras.h: - (isinf): - (isnan): - (signbit): - -2008-11-06 Laszlo Gombos <laszlo.1.gombos@nokia.com> - - Reviewed by Simon Hausmann. - - Include strings.h for strncasecmp(). - This is needed for compilation inside Symbian and it is also - confirmed by the man-page on Linux. - - * runtime/DateMath.cpp: - -2008-11-06 Norbert Leser <norbert.leser@nokia.com> - - Reviewed by Simon Hausmann. - - Implemented currentThreadStackBase for Symbian. - - * runtime/Collector.cpp: - (JSC::currentThreadStackBase): - -2008-11-06 Laszlo Gombos <laszlo.1.gombos@nokia.com> - - Reviewed by Simon Hausmann. - - RVCT does not support tm_gmtoff field, so disable that code just like - for MSVC. - - * runtime/DateMath.h: - (JSC::GregorianDateTime::GregorianDateTime): - (JSC::GregorianDateTime::operator tm): - -2008-11-06 Kristian Amlie <kristian.amlie@nokia.com> - - Reviewed by Simon Hausmann. - - Define PLATFORM(UNIX) for S60. Effectively WebKit on S60 is compiled - on top of the Posix layer. - - * wtf/Platform.h: - -2008-11-06 Norbert Leser <norbert.leser@nokia.com> - - Reviewed by Simon Hausmann. - - Added __SYMBIAN32__ condition for defining PLATFORM(SYMBIAN). - - * wtf/Platform.h: - -2008-11-06 Ariya Hidayat <ariya.hidayat@trolltech.com> - - Reviewed by Simon Hausmann. - - Added WINSCW compiler define for Symbian S60. - - * wtf/Platform.h: - -2008-11-06 Kristian Amlie <kristian.amlie@nokia.com> - - Reviewed by Simon Hausmann. - - Use the GCC defines of the WTF_ALIGN* macros for the RVCT and the - MINSCW compiler. + Still seeing occasional leaks from UString::sharedBuffer code + https://bugs.webkit.org/show_bug.cgi?id=26420 - * wtf/Vector.h: - -2008-11-06 Kristian Amlie <kristian.amlie@nokia.com> - - Reviewed by Simon Hausmann. - - Define capabilities of the SYMBIAN platform. Some of the system - headers are actually dependent on RVCT. - - * wtf/Platform.h: - -2008-11-06 Kristian Amlie <kristian.amlie@nokia.com> - - Reviewed by Simon Hausmann. - - Add missing stddef.h header needed for compilation in Symbian. - - * runtime/Collector.h: - -2008-11-06 Kristian Amlie <kristian.amlie@nokia.com> - - Reviewed by Simon Hausmann. - - Added COMPILER(RVCT) to detect the ARM RVCT compiler used in the Symbian environment. - - * wtf/Platform.h: - -2008-11-06 Simon Hausmann <hausmann@webkit.org> - - Fix the Qt build, adjust include paths after move of jsc.pro. - - * jsc.pro: - -2008-11-06 Cameron Zwarich <zwarich@apple.com> + The problem is that the pointer to the memory allocation isn't visible + by "leaks" due to the lower bits being used as flags. The fix is to + make the pointer visible in memory (in debug only). The downside of + this fix that the memory allocated by sharedBuffer will still look like + a leak in non-debug builds when any flags are set. - Rubber-stamped by Sam Weinig. - - Move kjs/Shell.cpp to the top level of the JavaScriptCore directory and - rename it to jsc.cpp to reflect the name of the binary compiled from it. - - * GNUmakefile.am: - * JavaScriptCore.vcproj/jsc/jsc.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * jsc.cpp: Copied from kjs/Shell.cpp. - * jsc.pro: - * jscore.bkl: - * kjs/Shell.cpp: Removed. - -2008-11-06 Cameron Zwarich <zwarich@apple.com> - - Rubber-stamped by Sam Weinig. - - Move create_hash_table and jsc.pro out of the kjs directory and into the - root directory of JavaScriptCore. - - * DerivedSources.make: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * create_hash_table: Copied from kjs/create_hash_table. - * jsc.pro: Copied from kjs/jsc.pro. - * kjs/create_hash_table: Removed. - * kjs/jsc.pro: Removed. - * make-generated-sources.sh: - -2008-11-05 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Maciej Stachowiak. + * wtf/PtrAndFlags.h: + (WTF::PtrAndFlags::set): - https://bugs.webkit.org/show_bug.cgi?id=22094 +2009-06-29 Sam Weinig <sam@webkit.org> - Fix for bug where the callee incorrectly recieves the caller's lexical - global object as this, rather than its own. Implementation closely - follows the spec, passing jsNull, checking in the callee and replacing - with the global object where necessary. + Reviewed by Mark Rowe. - * VM/CTI.cpp: - (JSC::CTI::compileOpCall): - * VM/Machine.cpp: - (JSC::Machine::cti_op_call_NotJSFunction): - (JSC::Machine::cti_op_call_eval): - * runtime/JSCell.h: - (JSC::JSValue::toThisObject): - * runtime/JSImmediate.cpp: - (JSC::JSImmediate::toThisObject): - * runtime/JSImmediate.h: + Remove more unused scons support. -2008-11-05 Kevin Ollivier <kevino@theolliviers.com> + * SConstruct: Removed. - wx build fix after Operations.cpp move. +2009-06-29 Oliver Hunt <oliver@apple.com> - * JavaScriptCoreSources.bkl: + Reviewed by Gavin Barraclough. -2008-11-05 Cameron Zwarich <zwarich@apple.com> + <rdar://problem/7016214> JSON.parse fails to parse valid JSON with most Unicode characters + <https://bugs.webkit.org/show_bug.cgi?id=26802> - Not reviewed. + In the original JSON.parse patch unicode was handled correctly, however in some last + minute "clean up" I oversimplified isSafeStringCharacter. This patch corrects this bug. - Fix the build for case-sensitive build systems and wxWindows. + * runtime/LiteralParser.cpp: + (JSC::isSafeStringCharacter): + (JSC::LiteralParser::Lexer::lexString): - * JavaScriptCoreSources.bkl: - * kjs/create_hash_table: +2009-06-26 Oliver Hunt <oliver@apple.com> -2008-11-05 Cameron Zwarich <zwarich@apple.com> + Reviewed by Dan Bernstein. - Not reviewed. + <rdar://problem/7009684> REGRESSION(r45039): Crashes inside JSEvent::put on PowerPC (26746) + <https://bugs.webkit.org/show_bug.cgi?id=26746> - Fix the build for case-sensitive build systems. + Fix for r45039 incorrectly uncached a get_by_id by converting it to put_by_id. Clearly this + is less than correct. This patch corrects that error. - * JavaScriptCoreSources.bkl: - * kjs/Shell.cpp: - * runtime/Interpreter.cpp: - * runtime/JSArray.cpp: + * interpreter/Interpreter.cpp: + (JSC::Interpreter::tryCacheGetByID): -2008-11-05 Cameron Zwarich <zwarich@apple.com> +2009-06-26 Eric Seidel <eric@webkit.org> - Not reviewed. + No review, only rolling out r45259. - Fix the build for case-sensitive build systems. + Roll out r45259 after crash appeared on the bots: + plugins/undefined-property-crash.html + ASSERTION FAILED: s <= HeapConstants<heapType>::cellSize + (leopard-intel-debug-tests/build/JavaScriptCore/runtime/Collector.cpp:278 + void* JSC::Heap::heapAllocate(size_t) [with JSC::HeapType heapType = PrimaryHeap]) - * API/JSBase.cpp: - * API/JSObjectRef.cpp: - * runtime/CommonIdentifiers.h: + * runtime/DateInstance.cpp: * runtime/Identifier.cpp: - * runtime/InitializeThreading.cpp: - * runtime/InternalFunction.h: - * runtime/JSString.h: * runtime/Lookup.h: - * runtime/PropertyNameArray.h: - * runtime/PropertySlot.h: - * runtime/StructureID.cpp: - * runtime/StructureID.h: - * runtime/UString.cpp: - -2008-11-05 Cameron Zwarich <zwarich@apple.com> - - Rubber-stamped by Sam Weinig. - - Move more files to the runtime subdirectory of JavaScriptCore. - - * API/APICast.h: - * API/JSBase.cpp: - * API/JSCallbackObject.cpp: - * API/JSClassRef.cpp: - * API/JSClassRef.h: - * API/JSStringRefCF.cpp: - * API/JSValueRef.cpp: - * API/OpaqueJSString.cpp: - * API/OpaqueJSString.h: - * AllInOneFile.cpp: - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * VM/CodeBlock.h: - * VM/CodeGenerator.cpp: - * VM/Machine.cpp: - * VM/RegisterFile.h: - * debugger/Debugger.h: - * kjs/SourceProvider.h: - * kjs/TypeInfo.h: Removed. - * kjs/collector.cpp: Removed. - * kjs/collector.h: Removed. - * kjs/completion.h: Removed. - * kjs/create_hash_table: - * kjs/identifier.cpp: Removed. - * kjs/identifier.h: Removed. - * kjs/interpreter.cpp: Removed. - * kjs/interpreter.h: Removed. - * kjs/lexer.cpp: - * kjs/lexer.h: - * kjs/lookup.cpp: Removed. - * kjs/lookup.h: Removed. - * kjs/nodes.cpp: - * kjs/nodes.h: - * kjs/operations.cpp: Removed. - * kjs/operations.h: Removed. - * kjs/protect.h: Removed. - * kjs/regexp.cpp: Removed. - * kjs/regexp.h: Removed. - * kjs/ustring.cpp: Removed. - * kjs/ustring.h: Removed. - * pcre/pcre_exec.cpp: - * profiler/CallIdentifier.h: - * profiler/Profile.h: - * runtime/ArrayConstructor.cpp: - * runtime/ArrayPrototype.cpp: - * runtime/ArrayPrototype.h: - * runtime/Collector.cpp: Copied from kjs/collector.cpp. - * runtime/Collector.h: Copied from kjs/collector.h. - * runtime/CollectorHeapIterator.h: - * runtime/Completion.h: Copied from kjs/completion.h. - * runtime/ErrorPrototype.cpp: - * runtime/Identifier.cpp: Copied from kjs/identifier.cpp. - * runtime/Identifier.h: Copied from kjs/identifier.h. - * runtime/InitializeThreading.cpp: - * runtime/Interpreter.cpp: Copied from kjs/interpreter.cpp. - * runtime/Interpreter.h: Copied from kjs/interpreter.h. - * runtime/JSCell.h: - * runtime/JSGlobalData.cpp: - * runtime/JSGlobalData.h: - * runtime/JSLock.cpp: - * runtime/JSNumberCell.cpp: - * runtime/JSNumberCell.h: - * runtime/JSObject.cpp: - * runtime/JSValue.h: - * runtime/Lookup.cpp: Copied from kjs/lookup.cpp. - * runtime/Lookup.h: Copied from kjs/lookup.h. - * runtime/MathObject.cpp: - * runtime/NativeErrorPrototype.cpp: - * runtime/NumberPrototype.cpp: - * runtime/Operations.cpp: Copied from kjs/operations.cpp. - * runtime/Operations.h: Copied from kjs/operations.h. - * runtime/PropertyMapHashTable.h: - * runtime/Protect.h: Copied from kjs/protect.h. - * runtime/RegExp.cpp: Copied from kjs/regexp.cpp. - * runtime/RegExp.h: Copied from kjs/regexp.h. * runtime/RegExpConstructor.cpp: * runtime/RegExpObject.h: - * runtime/RegExpPrototype.cpp: - * runtime/SmallStrings.h: - * runtime/StringObjectThatMasqueradesAsUndefined.h: - * runtime/StructureID.cpp: - * runtime/StructureID.h: - * runtime/StructureIDTransitionTable.h: - * runtime/SymbolTable.h: - * runtime/TypeInfo.h: Copied from kjs/TypeInfo.h. - * runtime/UString.cpp: Copied from kjs/ustring.cpp. - * runtime/UString.h: Copied from kjs/ustring.h. - * wrec/CharacterClassConstructor.h: - * wrec/WREC.h: - -2008-11-05 Geoffrey Garen <ggaren@apple.com> - - Suggested by Darin Adler. - - Removed two copy constructors that the compiler can generate for us - automatically. - - * VM/LabelID.h: - (JSC::LabelID::setLocation): - (JSC::LabelID::offsetFrom): - (JSC::LabelID::ref): - (JSC::LabelID::refCount): - * kjs/LabelScope.h: - -2008-11-05 Anders Carlsson <andersca@apple.com> - - Fix Snow Leopard build. - - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-11-04 Cameron Zwarich <zwarich@apple.com> - - Rubber-stamped by Steve Falkenburg. - - Move dtoa.cpp and dtoa.h to the WTF Visual Studio project to reflect - their movement in the filesystem. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - -2008-11-04 Cameron Zwarich <zwarich@apple.com> - - Rubber-stamped by Sam Weinig. - - Move kjs/dtoa.h to the wtf subdirectory of JavaScriptCore. - - * AllInOneFile.cpp: - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * kjs/dtoa.cpp: Removed. - * kjs/dtoa.h: Removed. - * wtf/dtoa.cpp: Copied from kjs/dtoa.cpp. - * wtf/dtoa.h: Copied from kjs/dtoa.h. - -2008-11-04 Cameron Zwarich <zwarich@apple.com> - - Rubber-stamped by Sam Weinig. - - Move kjs/config.h to the top level of JavaScriptCore. - - * GNUmakefile.am: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * config.h: Copied from kjs/config.h. - * kjs/config.h: Removed. - -2008-11-04 Darin Adler <darin@apple.com> - - Reviewed by Tim Hatcher. - - * wtf/ThreadingNone.cpp: Tweak formatting. - -2008-11-03 Darin Adler <darin@apple.com> - - Reviewed by Tim Hatcher. - - - https://bugs.webkit.org/show_bug.cgi?id=22061 - create script to check for exit-time destructors - - * JavaScriptCore.exp: Changed to export functions rather than - a global for the atomically initialized static mutex. - - * JavaScriptCore.xcodeproj/project.pbxproj: Added a script - phase that runs the check-for-exit-time-destructors script. - - * wtf/MainThread.cpp: - (WTF::mainThreadFunctionQueueMutex): Changed to leak an object - rather than using an exit time destructor. - (WTF::functionQueue): Ditto. - * wtf/unicode/icu/CollatorICU.cpp: - (WTF::cachedCollatorMutex): Ditto. - - * wtf/Threading.h: Changed other platforms to share the Windows - approach where the mutex is internal and the functions are exported. - * wtf/ThreadingGtk.cpp: - (WTF::lockAtomicallyInitializedStaticMutex): Ditto. - (WTF::unlockAtomicallyInitializedStaticMutex): Ditto. - * wtf/ThreadingNone.cpp: - (WTF::lockAtomicallyInitializedStaticMutex): Ditto. - (WTF::unlockAtomicallyInitializedStaticMutex): Ditto. - * wtf/ThreadingPthreads.cpp: - (WTF::threadMapMutex): Changed to leak an object rather than using - an exit time destructor. - (WTF::lockAtomicallyInitializedStaticMutex): Mutex change. - (WTF::unlockAtomicallyInitializedStaticMutex): Ditto. - (WTF::threadMap): Changed to leak an object rather than using - an exit time destructor. - * wtf/ThreadingQt.cpp: - (WTF::lockAtomicallyInitializedStaticMutex): Mutex change. - (WTF::unlockAtomicallyInitializedStaticMutex): Ditto. - * wtf/ThreadingWin.cpp: - (WTF::lockAtomicallyInitializedStaticMutex): Added an assertion. - -2008-11-04 Adam Roben <aroben@apple.com> - - Windows build fix - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Update - the location of JSStaticScopeObject.{cpp,h}. - -2008-11-04 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Alexey Proskuryakov. - - Move AllInOneFile.cpp to the top level of JavaScriptCore. - - * AllInOneFile.cpp: Copied from kjs/AllInOneFile.cpp. - * GNUmakefile.am: - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/AllInOneFile.cpp: Removed. - -2008-11-04 Cameron Zwarich <zwarich@apple.com> - - Rubber-stamped by Alexey Proskuryakov. - - Add NodeInfo.h to the JavaScriptCore Xcode project. - - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-11-03 Cameron Zwarich <zwarich@apple.com> - - Rubber-stamped by Maciej Stachowiak. - - Move more files into the runtime subdirectory of JavaScriptCore. - - * API/JSBase.cpp: - * API/JSCallbackConstructor.cpp: - * API/JSCallbackFunction.cpp: - * API/JSClassRef.cpp: - * API/OpaqueJSString.cpp: - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * kjs/AllInOneFile.cpp: - * kjs/ArgList.cpp: Removed. - * kjs/ArgList.h: Removed. - * kjs/Arguments.cpp: Removed. - * kjs/Arguments.h: Removed. - * kjs/BatchedTransitionOptimizer.h: Removed. - * kjs/CollectorHeapIterator.h: Removed. - * kjs/CommonIdentifiers.cpp: Removed. - * kjs/CommonIdentifiers.h: Removed. - * kjs/ExecState.cpp: Removed. - * kjs/ExecState.h: Removed. - * kjs/GetterSetter.cpp: Removed. - * kjs/GetterSetter.h: Removed. - * kjs/InitializeThreading.cpp: Removed. - * kjs/InitializeThreading.h: Removed. - * kjs/JSActivation.cpp: Removed. - * kjs/JSActivation.h: Removed. - * kjs/JSGlobalData.cpp: Removed. - * kjs/JSGlobalData.h: Removed. - * kjs/JSLock.cpp: Removed. - * kjs/JSLock.h: Removed. - * kjs/JSStaticScopeObject.cpp: Removed. - * kjs/JSStaticScopeObject.h: Removed. - * kjs/JSType.h: Removed. - * kjs/PropertyNameArray.cpp: Removed. - * kjs/PropertyNameArray.h: Removed. - * kjs/ScopeChain.cpp: Removed. - * kjs/ScopeChain.h: Removed. - * kjs/ScopeChainMark.h: Removed. - * kjs/SymbolTable.h: Removed. - * kjs/Tracing.d: Removed. - * kjs/Tracing.h: Removed. - * runtime/ArgList.cpp: Copied from kjs/ArgList.cpp. - * runtime/ArgList.h: Copied from kjs/ArgList.h. - * runtime/Arguments.cpp: Copied from kjs/Arguments.cpp. - * runtime/Arguments.h: Copied from kjs/Arguments.h. - * runtime/BatchedTransitionOptimizer.h: Copied from kjs/BatchedTransitionOptimizer.h. - * runtime/CollectorHeapIterator.h: Copied from kjs/CollectorHeapIterator.h. - * runtime/CommonIdentifiers.cpp: Copied from kjs/CommonIdentifiers.cpp. - * runtime/CommonIdentifiers.h: Copied from kjs/CommonIdentifiers.h. - * runtime/ExecState.cpp: Copied from kjs/ExecState.cpp. - * runtime/ExecState.h: Copied from kjs/ExecState.h. - * runtime/GetterSetter.cpp: Copied from kjs/GetterSetter.cpp. - * runtime/GetterSetter.h: Copied from kjs/GetterSetter.h. - * runtime/InitializeThreading.cpp: Copied from kjs/InitializeThreading.cpp. - * runtime/InitializeThreading.h: Copied from kjs/InitializeThreading.h. - * runtime/JSActivation.cpp: Copied from kjs/JSActivation.cpp. - * runtime/JSActivation.h: Copied from kjs/JSActivation.h. - * runtime/JSGlobalData.cpp: Copied from kjs/JSGlobalData.cpp. - * runtime/JSGlobalData.h: Copied from kjs/JSGlobalData.h. - * runtime/JSLock.cpp: Copied from kjs/JSLock.cpp. - * runtime/JSLock.h: Copied from kjs/JSLock.h. - * runtime/JSStaticScopeObject.cpp: Copied from kjs/JSStaticScopeObject.cpp. - * runtime/JSStaticScopeObject.h: Copied from kjs/JSStaticScopeObject.h. - * runtime/JSType.h: Copied from kjs/JSType.h. - * runtime/PropertyNameArray.cpp: Copied from kjs/PropertyNameArray.cpp. - * runtime/PropertyNameArray.h: Copied from kjs/PropertyNameArray.h. - * runtime/ScopeChain.cpp: Copied from kjs/ScopeChain.cpp. - * runtime/ScopeChain.h: Copied from kjs/ScopeChain.h. - * runtime/ScopeChainMark.h: Copied from kjs/ScopeChainMark.h. - * runtime/SymbolTable.h: Copied from kjs/SymbolTable.h. - * runtime/Tracing.d: Copied from kjs/Tracing.d. - * runtime/Tracing.h: Copied from kjs/Tracing.h. - -2008-11-03 Sam Weinig <sam@webkit.org> - - Reviewed by Mark Rowe. - - Move #define to turn on dumping StructureID statistics to StructureID.cpp so that - turning it on does not require a full rebuild. - - * runtime/StructureID.cpp: - (JSC::StructureID::dumpStatistics): - * runtime/StructureID.h: - -2008-11-03 Alp Toker <alp@nuanti.com> - - Reviewed by Geoffrey Garen. - - Fix warning when building on Darwin without JSC_MULTIPLE_THREADS - enabled. - - * kjs/InitializeThreading.cpp: - -2008-11-02 Matt Lilek <webkit@mattlilek.com> - - Reviewed by Cameron Zwarich. - - Bug 22042: REGRESSION(r38066): ASSERTION FAILED: source in CodeBlock - <https://bugs.webkit.org/show_bug.cgi?id=22042> - - Rename parameter name to avoid ASSERT. - - * VM/CodeBlock.h: - (JSC::CodeBlock::CodeBlock): - (JSC::ProgramCodeBlock::ProgramCodeBlock): - (JSC::EvalCodeBlock::EvalCodeBlock): - -2008-11-02 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Oliver Hunt. - - Bug 22035: Remove the '_' suffix on constructor parameter names for structs - <https://bugs.webkit.org/show_bug.cgi?id=22035> - - * API/JSCallbackObject.h: - (JSC::JSCallbackObject::JSCallbackObjectData::JSCallbackObjectData): - * VM/CodeBlock.h: - (JSC::CodeBlock::CodeBlock): - (JSC::ProgramCodeBlock::ProgramCodeBlock): - (JSC::EvalCodeBlock::EvalCodeBlock): - * wrec/WREC.h: - (JSC::Quantifier::Quantifier): - -2008-10-31 Cameron Zwarich <zwarich@apple.com> - - Rubber-stamped by Geoff Garen. - - Rename SourceRange.h to SourceCode.h. - - * API/JSBase.cpp: - * GNUmakefile.am: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/CodeBlock.h: - * kjs/SourceCode.h: Copied from kjs/SourceRange.h. - * kjs/SourceRange.h: Removed. - * kjs/grammar.y: - * kjs/lexer.h: - * kjs/nodes.cpp: - (JSC::ForInNode::ForInNode): - * kjs/nodes.h: - (JSC::ThrowableExpressionData::setExceptionSourceCode): - -2008-10-31 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Darin Adler. - - Bug 22019: Move JSC::Interpreter::shouldPrintExceptions() to WebCore::Console - <https://bugs.webkit.org/show_bug.cgi?id=22019> - - The JSC::Interpreter::shouldPrintExceptions() function is not used at - all in JavaScriptCore, so it should be moved to WebCore::Console, its - only user. - - * JavaScriptCore.exp: - * kjs/interpreter.cpp: - * kjs/interpreter.h: - -2008-10-31 Cameron Zwarich <zwarich@apple.com> - - Not reviewed. - - Windows build fix. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2008-10-31 Cameron Zwarich <zwarich@apple.com> - - Rubber-stamped by Sam Weinig. - - Remove the call to Interpreter::setShouldPrintExceptions() from the - GlobalObject constructor in the shell. The shouldPrintExceptions() - information is not used anywhere in JavaScriptCore, only in WebCore. - - * kjs/Shell.cpp: - (GlobalObject::GlobalObject): - -2008-10-31 Kevin Ollivier <kevino@theolliviers.com> - - wxMSW build fix. - - * wtf/Threading.h: - -2008-10-31 Cameron Zwarich <zwarich@apple.com> - - Rubber-stamped by Sam Weinig. - - Move more files from the kjs subdirectory of JavaScriptCore to the - runtime subdirectory. - - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * kjs/AllInOneFile.cpp: - * kjs/RegExpConstructor.cpp: Removed. - * kjs/RegExpConstructor.h: Removed. - * kjs/RegExpMatchesArray.h: Removed. - * kjs/RegExpObject.cpp: Removed. - * kjs/RegExpObject.h: Removed. - * kjs/RegExpPrototype.cpp: Removed. - * kjs/RegExpPrototype.h: Removed. - * runtime/RegExpConstructor.cpp: Copied from kjs/RegExpConstructor.cpp. - * runtime/RegExpConstructor.h: Copied from kjs/RegExpConstructor.h. - * runtime/RegExpMatchesArray.h: Copied from kjs/RegExpMatchesArray.h. - * runtime/RegExpObject.cpp: Copied from kjs/RegExpObject.cpp. - * runtime/RegExpObject.h: Copied from kjs/RegExpObject.h. - * runtime/RegExpPrototype.cpp: Copied from kjs/RegExpPrototype.cpp. - * runtime/RegExpPrototype.h: Copied from kjs/RegExpPrototype.h. - -2008-10-31 Mark Rowe <mrowe@apple.com> - - Revert an incorrect portion of r38034. - - * profiler/ProfilerServer.mm: - -2008-10-31 Mark Rowe <mrowe@apple.com> - - Fix the 64-bit build. - - Disable strict aliasing in ProfilerServer.mm as it leads to the compiler being unhappy - with the common Obj-C idiom self = [super init]; - - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-10-31 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Alexey Proskuryakov. - - Change a header guard to match our coding style. - - * kjs/InitializeThreading.h: - -2008-10-30 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Oliver Hunt. - - Fixed a small bit of https://bugs.webkit.org/show_bug.cgi?id=21962 - AST uses way too much memory - - Removed a word from StatementNode by nixing LabelStack and turning it - into a compile-time data structure managed by CodeGenerator. - - v8 tests and SunSpider, run by Gavin, report no change. - - * GNUmakefile.am: - * JavaScriptCore.order: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/AllInOneFile.cpp: - * JavaScriptCoreSources.bkl: I sure hope this builds! - - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::CodeGenerator): - (JSC::CodeGenerator::newLabelScope): - (JSC::CodeGenerator::breakTarget): - (JSC::CodeGenerator::continueTarget): - * VM/CodeGenerator.h: Nixed the JumpContext system because it depended - on a LabelStack in the AST, and it was a little cumbersome on the client - side. Replaced with LabelScope, which tracks all break / continue - information in the CodeGenerator, just like we track LabelIDs and other - stacks of compile-time data. - - * kjs/LabelScope.h: Added. - (JSC::LabelScope::): - (JSC::LabelScope::LabelScope): - (JSC::LabelScope::ref): - (JSC::LabelScope::deref): - (JSC::LabelScope::refCount): - (JSC::LabelScope::breakTarget): - (JSC::LabelScope::continueTarget): - (JSC::LabelScope::type): - (JSC::LabelScope::name): - (JSC::LabelScope::scopeDepth): Simple abstraction for holding everything - you might want to know about a break-able / continue-able scope. - - * kjs/LabelStack.cpp: Removed. - * kjs/LabelStack.h: Removed. - - * kjs/grammar.y: No need to push labels at parse time -- we don't store - LabelStacks in the AST anymore. - - * kjs/nodes.cpp: - (JSC::DoWhileNode::emitCode): - (JSC::WhileNode::emitCode): - (JSC::ForNode::emitCode): - (JSC::ForInNode::emitCode): - (JSC::ContinueNode::emitCode): - (JSC::BreakNode::emitCode): - (JSC::SwitchNode::emitCode): - (JSC::LabelNode::emitCode): - * kjs/nodes.h: - (JSC::StatementNode::): - (JSC::LabelNode::): Use LabelScope where we used to use JumpContext. - Simplified a bunch of code. Touched up label-related error messages a - bit. - - * kjs/nodes2string.cpp: - (JSC::LabelNode::streamTo): Updated for rename. - -2008-10-31 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Darin Adler. - - Bug 22005: Move StructureIDChain into its own file - <https://bugs.webkit.org/show_bug.cgi?id=22005> - - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * runtime/StructureID.cpp: - * runtime/StructureID.h: - * runtime/StructureIDChain.cpp: Copied from runtime/StructureID.cpp. - * runtime/StructureIDChain.h: Copied from runtime/StructureID.h. - -2008-10-31 Steve Falkenburg <sfalken@apple.com> - - Build fix. - - * JavaScriptCore.vcproj/jsc/jsc.vcproj: - -2008-10-31 Steve Falkenburg <sfalken@apple.com> - - Build fix. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2008-10-31 Darin Adler <darin@apple.com> - - Reviewed by Dan Bernstein. - - - fix storage leak seen on buildbot - - Some other cleanup too. The storage leak was caused by the fact - that HashTraits<CallIdentifier>::needsDestruction was false, so - the call identifier objects didn't get deleted. - - * profiler/CallIdentifier.h: - - Added a default constructor to create empty call identifiers. - - Changed the normal constructor to use const UString& - to avoid extra copying and reference count thrash. - - Removed the explicit copy constructor definition, since it's what - the compiler will automatically generate. (Rule of thumb: Either - you need both a custom copy constructor and a custom assignment - operator, or neither.) - - Moved the CallIdentifier hash function out of the WTF namespace; - there's no reason to put it there. - - Changed the CallIdentifier hash function to be a struct rather than - a specialization of the IntHash struct template. Having it be - a specialization made no sense, since CallIdentifier is not an integer, - and did no good. - - Removed explicit definition of emptyValueIsZero in the hash traits, - since inheriting from GenericHashTraits already makes that false. - - Removed explicit definition of emptyValue, instead relying on the - default constructor and GenericHashTraits. - - Removed explicit definition of needsDestruction, because we want it - to have its default value: true, not false. This fixes the leak! - - Changed constructDeletedValue and isDeletedValue to use a line number - of numeric_limits<unsigned>::max() to indicate a value is deleted. - Previously this used empty strings for the empty value and null strings - for the deleted value, but it's more efficient to use null for both. - -2008-10-31 Timothy Hatcher <timothy@apple.com> - - Emit the WillExecuteStatement debugger hook before the for loop body - when the statement node for the body isn't a block. This allows - breakpoints on those statements in the Web Inspector. - - https://bugs.webkit.org/show_bug.cgi?id=22004 - - Reviewed by Darin Adler. - - * kjs/nodes.cpp: - (JSC::ForNode::emitCode): Emit the WillExecuteStatement - debugger hook before the statement node if isn't a block. - Also emit the WillExecuteStatement debugger hook for the - loop as the first op-code. - (JSC::ForInNode::emitCode): Ditto. - -2008-10-31 Timothy Hatcher <timothy@apple.com> - - Fixes console warnings about not having an autorelease pool. - Also fixes the build for Snow Leopard, by including individual - Foundation headers instead of Foundation.h. - - https://bugs.webkit.org/show_bug.cgi?id=21995 - - Reviewed by Oliver Hunt. - - * profiler/ProfilerServer.mm: - (-[ProfilerServer init]): Create a NSAutoreleasePool and drain it. - -2008-10-31 Cameron Zwarich <zwarich@apple.com> - - Not reviewed. - - Speculative wxWindows build fix. - - * JavaScriptCoreSources.bkl: - * jscore.bkl: - -2008-10-31 Cameron Zwarich <zwarich@apple.com> - - Rubber-stamped by Maciej Stachowiak. - - Move VM/JSPropertyNameIterator.cpp and VM/JSPropertyNameIterator.h to - the runtime directory. - - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * VM/JSPropertyNameIterator.cpp: Removed. - * VM/JSPropertyNameIterator.h: Removed. - * runtime/JSPropertyNameIterator.cpp: Copied from VM/JSPropertyNameIterator.cpp. - * runtime/JSPropertyNameIterator.h: Copied from VM/JSPropertyNameIterator.h. - -2008-10-31 Cameron Zwarich <zwarich@apple.com> - - Not reviewed. - - Speculative wxWindows build fix. - - * jscore.bkl: - -2008-10-30 Mark Rowe <mrowe@apple.com> - - Reviewed by Jon Homeycutt. - - Explicitly default to building for only the native architecture in debug and release builds. - - * Configurations/DebugRelease.xcconfig: - -2008-10-30 Cameron Zwarich <zwarich@apple.com> - - Rubber-stamped by Sam Weinig. - - Create a debugger directory in JavaScriptCore and move the relevant - files to it. - - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/CodeBlock.cpp: - * VM/CodeGenerator.h: - * VM/Machine.cpp: - * debugger: Added. - * debugger/Debugger.cpp: Copied from kjs/debugger.cpp. - * debugger/Debugger.h: Copied from kjs/debugger.h. - * debugger/DebuggerCallFrame.cpp: Copied from kjs/DebuggerCallFrame.cpp. - * debugger/DebuggerCallFrame.h: Copied from kjs/DebuggerCallFrame.h. - * kjs/AllInOneFile.cpp: - * kjs/DebuggerCallFrame.cpp: Removed. - * kjs/DebuggerCallFrame.h: Removed. - * kjs/Parser.cpp: - * kjs/Parser.h: - * kjs/debugger.cpp: Removed. - * kjs/debugger.h: Removed. - * kjs/interpreter.cpp: - * kjs/nodes.cpp: - * runtime/FunctionConstructor.cpp: - * runtime/JSGlobalObject.cpp: - -2008-10-30 Benjamin K. Stuhl <bks24@cornell.edu> - - gcc 4.3.3/linux-x86 generates "suggest parentheses around && within ||" - warnings; add some parentheses to disambiguate things. No functional - changes, so no tests. - - https://bugs.webkit.org/show_bug.cgi?id=21973 - Add parentheses to clean up some gcc warnings - - Reviewed by Dan Bernstein. - - * wtf/ASCIICType.h: - (WTF::isASCIIAlphanumeric): - (WTF::isASCIIHexDigit): - -2008-10-30 Kevin Lindeman <klindeman@apple.com> - - Adds ProfilerServer, which is a distributed notification listener - that allows starting and stopping the profiler remotely for use - in conjunction with the profiler's DTace probes. - - https://bugs.webkit.org/show_bug.cgi?id=21719 - - Reviewed by Timothy Hatcher. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): Calls startProfilerServerIfNeeded. - * profiler/ProfilerServer.h: Added. - * profiler/ProfilerServer.mm: Added. - (+[ProfilerServer sharedProfileServer]): - (-[ProfilerServer init]): - (-[ProfilerServer startProfiling]): - (-[ProfilerServer stopProfiling]): - (JSC::startProfilerServerIfNeeded): - -2008-10-30 Kevin Ollivier <kevino@theolliviers.com> - - wx build fix after PropertyMap and StructureID merge. - - * JavaScriptCoreSources.bkl: - -2008-10-30 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Mark Rowe. - - Change the JavaScriptCore Xcode project to use relative paths for the - PCRE source files. - - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-10-30 Sam Weinig <sam@webkit.org> - - Reviewed by Cameron Zwarich and Geoffrey Garen. - - Fix for https://bugs.webkit.org/show_bug.cgi?id=21989 - Merge PropertyMap and StructureID - - - Move PropertyMap code into StructureID in preparation for lazily - creating the map on gets. - - Make remove with transition explicit by adding removePropertyTransition. - - Make the put/remove without transition explicit. - - Make cache invalidation part of put/remove without transition. - - 1% speedup on SunSpider; 0.5% speedup on v8 suite. - - * GNUmakefile.am: - * JavaScriptCore.exp: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * kjs/AllInOneFile.cpp: - * kjs/identifier.h: - * runtime/JSObject.cpp: - (JSC::JSObject::removeDirect): - * runtime/JSObject.h: - (JSC::JSObject::putDirect): - * runtime/PropertyMap.cpp: Removed. - * runtime/PropertyMap.h: Removed. - * runtime/PropertyMapHashTable.h: Copied from runtime/PropertyMap.h. - * runtime/StructureID.cpp: - (JSC::StructureID::dumpStatistics): - (JSC::StructureID::StructureID): - (JSC::StructureID::~StructureID): - (JSC::StructureID::getEnumerablePropertyNames): - (JSC::StructureID::addPropertyTransition): - (JSC::StructureID::removePropertyTransition): - (JSC::StructureID::toDictionaryTransition): - (JSC::StructureID::changePrototypeTransition): - (JSC::StructureID::getterSetterTransition): - (JSC::StructureID::addPropertyWithoutTransition): - (JSC::StructureID::removePropertyWithoutTransition): - (JSC::PropertyMapStatisticsExitLogger::~PropertyMapStatisticsExitLogger): - (JSC::StructureID::checkConsistency): - (JSC::StructureID::copyPropertyTable): - (JSC::StructureID::get): - (JSC::StructureID::put): - (JSC::StructureID::remove): - (JSC::StructureID::insertIntoPropertyMapHashTable): - (JSC::StructureID::expandPropertyMapHashTable): - (JSC::StructureID::createPropertyMapHashTable): - (JSC::StructureID::rehashPropertyMapHashTable): - (JSC::comparePropertyMapEntryIndices): - (JSC::StructureID::getEnumerablePropertyNamesInternal): - * runtime/StructureID.h: - (JSC::StructureID::propertyStorageSize): - (JSC::StructureID::isEmpty): - (JSC::StructureID::get): - -2008-10-30 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Oliver Hunt. - - Bug 21987: CTI::putDoubleResultToJSNumberCellOrJSImmediate() hardcodes its result register - <https://bugs.webkit.org/show_bug.cgi?id=21987> - - CTI::putDoubleResultToJSNumberCellOrJSImmediate() hardcodes its result - register as ecx, but it should be tempReg1, which is ecx at all of its - callsites. - - * VM/CTI.cpp: - (JSC::CTI::putDoubleResultToJSNumberCellOrJSImmediate): - -2008-10-30 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Sam Weinig. - - Bug 21985: Opcodes should use eax as their destination register whenever possible - <https://bugs.webkit.org/show_bug.cgi?id=21985> - - Change more opcodes to use eax as the register for their final result, - and change calls to emitPutResult() that pass eax to rely on the default - value of eax. - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): - -2008-10-30 Alp Toker <alp@nuanti.com> - - Build fix attempt for older gcc on the trunk-mac-intel build bot - (error: initializer for scalar variable requires one element). - - Modify the initializer syntax slightly with an additional comma. - - * VM/Machine.cpp: - (JSC::Machine::cti_op_call_JSFunction): - (JSC::Machine::cti_op_construct_JSConstruct): - (JSC::Machine::cti_op_resolve_func): - (JSC::Machine::cti_op_post_inc): - (JSC::Machine::cti_op_resolve_with_base): - (JSC::Machine::cti_op_post_dec): - -2008-10-30 Alp Toker <alp@nuanti.com> - - Reviewed by Alexey Proskuryakov. - - https://bugs.webkit.org/show_bug.cgi?id=21571 - VoidPtrPair breaks CTI on Linux - - The VoidPtrPair return change made in r37457 does not work on Linux - since POD structs aren't passed in registers. - - This patch uses a union to vectorize VoidPtrPair to a uint64_t and - matches Darwin/MSVC fixing CTI/WREC on Linux. - - Alexey reports no measurable change in Mac performance with this fix. - - * VM/Machine.cpp: - (JSC::Machine::cti_op_call_JSFunction): - (JSC::Machine::cti_op_construct_JSConstruct): - (JSC::Machine::cti_op_resolve_func): - (JSC::Machine::cti_op_post_inc): - (JSC::Machine::cti_op_resolve_with_base): - (JSC::Machine::cti_op_post_dec): - * VM/Machine.h: - (JSC::): - -2008-10-29 Oliver Hunt <oliver@apple.com> - - Reviewed by Geoff Garen. - - Initial work to reduce cost of JSNumberCell allocation - - This does the initial work needed to bring more of number - allocation into CTI code directly, rather than just falling - back onto the slow paths if we can't guarantee that a number - cell can be reused. - - Initial implementation only used by op_negate to make sure - it all works. In a negate heavy (though not dominated) test - it results in a 10% win in the non-reusable cell case. - - * VM/CTI.cpp: - (JSC::): - (JSC::CTI::emitAllocateNumber): - (JSC::CTI::emitNakedFastCall): - (JSC::CTI::emitArithIntToImmWithJump): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - * VM/CTI.h: - * VM/CodeBlock.cpp: - (JSC::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::emitUnaryOp): - * VM/CodeGenerator.h: - (JSC::CodeGenerator::emitToJSNumber): - (JSC::CodeGenerator::emitTypeOf): - (JSC::CodeGenerator::emitGetPropertyNames): - * VM/Machine.cpp: - (JSC::Machine::privateExecute): - * VM/Machine.h: - * kjs/ResultType.h: - (JSC::ResultType::isReusableNumber): - (JSC::ResultType::toInt): - * kjs/nodes.cpp: - (JSC::UnaryOpNode::emitCode): - (JSC::BinaryOpNode::emitCode): - (JSC::EqualNode::emitCode): - * masm/X86Assembler.h: - (JSC::X86Assembler::): - (JSC::X86Assembler::negl_r): - (JSC::X86Assembler::xorpd_mr): - * runtime/JSNumberCell.h: - (JSC::JSNumberCell::JSNumberCell): - -2008-10-29 Steve Falkenburg <sfalken@apple.com> - - <rdar://problem/6326563> Crash on launch - - For Windows, export explicit functions rather than exporting data for atomicallyInitializedStaticMutex. - - Exporting data from a DLL on Windows requires specifying __declspec(dllimport) in the header used by - callers, but __declspec(dllexport) when defined in the DLL implementation. By instead exporting - the explicit lock/unlock functions, we can avoid this. - - Fixes a crash on launch, since we were previously erroneously exporting atomicallyInitializedStaticMutex as a function. - - Reviewed by Darin Adler. - - * wtf/Threading.h: - (WTF::lockAtomicallyInitializedStaticMutex): - (WTF::unlockAtomicallyInitializedStaticMutex): - * wtf/ThreadingWin.cpp: - (WTF::lockAtomicallyInitializedStaticMutex): - (WTF::unlockAtomicallyInitializedStaticMutex): - -2008-10-29 Sam Weinig <sam@webkit.org> - - Reviewed by Oliver Hunt. - - Remove direct use of PropertyMap. - - * JavaScriptCore.exp: - * runtime/JSObject.cpp: - (JSC::JSObject::mark): - (JSC::JSObject::put): - (JSC::JSObject::deleteProperty): - (JSC::JSObject::getPropertyAttributes): - (JSC::JSObject::removeDirect): - * runtime/JSObject.h: - (JSC::JSObject::getDirect): - (JSC::JSObject::getDirectLocation): - (JSC::JSObject::hasCustomProperties): - (JSC::JSObject::JSObject): - (JSC::JSObject::putDirect): - * runtime/PropertyMap.cpp: - (JSC::PropertyMap::get): - * runtime/PropertyMap.h: - (JSC::PropertyMap::isEmpty): - (JSC::PropertyMap::get): - * runtime/StructureID.cpp: - (JSC::StructureID::dumpStatistics): - * runtime/StructureID.h: - (JSC::StructureID::propertyStorageSize): - (JSC::StructureID::get): - (JSC::StructureID::put): - (JSC::StructureID::remove): - (JSC::StructureID::isEmpty): - -2008-10-29 Sam Weinig <sam@webkit.org> - - Reviewed by Geoffrey Garen. - - Rename and move the StructureID transition table to its own file. - - * GNUmakefile.am: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * runtime/StructureID.cpp: - (JSC::StructureID::addPropertyTransition): - * runtime/StructureID.h: - (JSC::StructureID::): - * runtime/StructureIDTransitionTable.h: Copied from runtime/StructureID.h. - (JSC::StructureIDTransitionTableHash::hash): - (JSC::StructureIDTransitionTableHash::equal): - -2008-10-29 Sam Weinig <sam@webkit.org> - - Reviewed by Cameron Zwarich. - - Fix for https://bugs.webkit.org/show_bug.cgi?id=21958 - Pack bits in StructureID to reduce the size of each StructureID by 2 words. - - * runtime/PropertyMap.h: - (JSC::PropertyMap::propertyMapSize): - * runtime/StructureID.cpp: - (JSC::StructureID::dumpStatistics): Add additional size statistics when dumping. - (JSC::StructureID::StructureID): - * runtime/StructureID.h: - -2008-10-29 Kevin Ollivier <kevino@theolliviers.com> - - wx build fixes after addition of runtime and ImageBuffer changes. - - * JavaScriptCoreSources.bkl: - * jscore.bkl: - -2008-10-29 Timothy Hatcher <timothy@apple.com> - - Emit the WillExecuteStatement debugger hook before the "else" body - when there is no block for the "else" body. This allows breakpoints - on those statements in the Web Inspector. - - https://bugs.webkit.org/show_bug.cgi?id=21944 - - Reviewed by Maciej Stachowiak. - - * kjs/nodes.cpp: - (JSC::IfElseNode::emitCode): Emit the WillExecuteStatement - debugger hook before the else node if isn't a block. - -2008-10-29 Alexey Proskuryakov <ap@webkit.org> - - Build fix. - - * JavaScriptCore.exp: Export HashTable::deleteTable(). - -2008-10-28 Alp Toker <alp@nuanti.com> - - Fix builddir != srcdir builds after kjs -> runtime breakage. Sources - may now be generated in both kjs/ and runtime/. - - Also sort the sources list for readability. - - * GNUmakefile.am: - -2008-10-28 Alp Toker <alp@nuanti.com> - - Reviewed by Cameron Zwarich. - - Build fix attempt after kjs -> runtime rename. - - * GNUmakefile.am: - -2008-10-28 Cameron Zwarich <zwarich@apple.com> - - Not reviewed. - - Remove a duplicate includes directory. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2008-10-28 Cameron Zwarich <zwarich@apple.com> - - Not reviewed. - - Attempt to fix the Windows build. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.vcproj/jsc/jsc.vcproj: - -2008-10-28 Dan Bernstein <mitz@apple.com> - - Reviewed by Mark Rowe. - - - export WTF::atomicallyInitializedStaticMutex - - * JavaScriptCore.exp: - -2008-10-28 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Cameron Zwarich. - - Fixed CodeBlock dumping to accurately report constant register indices. - - * VM/CodeBlock.cpp: - (JSC::CodeBlock::dump): - -2008-10-28 Cameron Zwarich <zwarich@apple.com> - - Not reviewed. - - More Qt build fixes. - - * JavaScriptCore.pri: - -2008-10-28 Cameron Zwarich <zwarich@apple.com> - - Not reviewed. - - Fix the Qt build, hopefully for real this time. - - * JavaScriptCore.pri: - -2008-10-28 Cameron Zwarich <zwarich@apple.com> - - Not reviewed. - - Fix the Qt build. - - * JavaScriptCore.pri: - -2008-10-28 Cameron Zwarich <zwarich@apple.com> - - Not reviewed. - - Fix the Windows build. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2008-10-28 Cameron Zwarich <zwarich@apple.com> - - Rubber-stamped by Sam Weinig. - - Create a runtime directory in JavaScriptCore and begin moving files to - it. This is the first step towards removing the kjs directory and - placing files in more meaningful subdirectories of JavaScriptCore. - - * API/JSBase.cpp: - * API/JSCallbackConstructor.cpp: - * API/JSCallbackConstructor.h: - * API/JSCallbackFunction.cpp: - * API/JSClassRef.cpp: - * API/JSClassRef.h: - * API/JSStringRefCF.cpp: - * API/JSValueRef.cpp: - * API/OpaqueJSString.cpp: - * DerivedSources.make: - * GNUmakefile.am: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/AllInOneFile.cpp: - * kjs/ArrayConstructor.cpp: Removed. - * kjs/ArrayConstructor.h: Removed. - * kjs/ArrayPrototype.cpp: Removed. - * kjs/ArrayPrototype.h: Removed. - * kjs/BooleanConstructor.cpp: Removed. - * kjs/BooleanConstructor.h: Removed. - * kjs/BooleanObject.cpp: Removed. - * kjs/BooleanObject.h: Removed. - * kjs/BooleanPrototype.cpp: Removed. - * kjs/BooleanPrototype.h: Removed. - * kjs/CallData.cpp: Removed. - * kjs/CallData.h: Removed. - * kjs/ClassInfo.h: Removed. - * kjs/ConstructData.cpp: Removed. - * kjs/ConstructData.h: Removed. - * kjs/DateConstructor.cpp: Removed. - * kjs/DateConstructor.h: Removed. - * kjs/DateInstance.cpp: Removed. - * kjs/DateInstance.h: Removed. - * kjs/DateMath.cpp: Removed. - * kjs/DateMath.h: Removed. - * kjs/DatePrototype.cpp: Removed. - * kjs/DatePrototype.h: Removed. - * kjs/Error.cpp: Removed. - * kjs/Error.h: Removed. - * kjs/ErrorConstructor.cpp: Removed. - * kjs/ErrorConstructor.h: Removed. - * kjs/ErrorInstance.cpp: Removed. - * kjs/ErrorInstance.h: Removed. - * kjs/ErrorPrototype.cpp: Removed. - * kjs/ErrorPrototype.h: Removed. - * kjs/FunctionConstructor.cpp: Removed. - * kjs/FunctionConstructor.h: Removed. - * kjs/FunctionPrototype.cpp: Removed. - * kjs/FunctionPrototype.h: Removed. - * kjs/GlobalEvalFunction.cpp: Removed. - * kjs/GlobalEvalFunction.h: Removed. - * kjs/InternalFunction.cpp: Removed. - * kjs/InternalFunction.h: Removed. - * kjs/JSArray.cpp: Removed. - * kjs/JSArray.h: Removed. - * kjs/JSCell.cpp: Removed. - * kjs/JSCell.h: Removed. - * kjs/JSFunction.cpp: Removed. - * kjs/JSFunction.h: Removed. - * kjs/JSGlobalObject.cpp: Removed. - * kjs/JSGlobalObject.h: Removed. - * kjs/JSGlobalObjectFunctions.cpp: Removed. - * kjs/JSGlobalObjectFunctions.h: Removed. - * kjs/JSImmediate.cpp: Removed. - * kjs/JSImmediate.h: Removed. - * kjs/JSNotAnObject.cpp: Removed. - * kjs/JSNotAnObject.h: Removed. - * kjs/JSNumberCell.cpp: Removed. - * kjs/JSNumberCell.h: Removed. - * kjs/JSObject.cpp: Removed. - * kjs/JSObject.h: Removed. - * kjs/JSString.cpp: Removed. - * kjs/JSString.h: Removed. - * kjs/JSValue.cpp: Removed. - * kjs/JSValue.h: Removed. - * kjs/JSVariableObject.cpp: Removed. - * kjs/JSVariableObject.h: Removed. - * kjs/JSWrapperObject.cpp: Removed. - * kjs/JSWrapperObject.h: Removed. - * kjs/MathObject.cpp: Removed. - * kjs/MathObject.h: Removed. - * kjs/NativeErrorConstructor.cpp: Removed. - * kjs/NativeErrorConstructor.h: Removed. - * kjs/NativeErrorPrototype.cpp: Removed. - * kjs/NativeErrorPrototype.h: Removed. - * kjs/NumberConstructor.cpp: Removed. - * kjs/NumberConstructor.h: Removed. - * kjs/NumberObject.cpp: Removed. - * kjs/NumberObject.h: Removed. - * kjs/NumberPrototype.cpp: Removed. - * kjs/NumberPrototype.h: Removed. - * kjs/ObjectConstructor.cpp: Removed. - * kjs/ObjectConstructor.h: Removed. - * kjs/ObjectPrototype.cpp: Removed. - * kjs/ObjectPrototype.h: Removed. - * kjs/PropertyMap.cpp: Removed. - * kjs/PropertyMap.h: Removed. - * kjs/PropertySlot.cpp: Removed. - * kjs/PropertySlot.h: Removed. - * kjs/PrototypeFunction.cpp: Removed. - * kjs/PrototypeFunction.h: Removed. - * kjs/PutPropertySlot.h: Removed. - * kjs/SmallStrings.cpp: Removed. - * kjs/SmallStrings.h: Removed. - * kjs/StringConstructor.cpp: Removed. - * kjs/StringConstructor.h: Removed. - * kjs/StringObject.cpp: Removed. - * kjs/StringObject.h: Removed. - * kjs/StringObjectThatMasqueradesAsUndefined.h: Removed. - * kjs/StringPrototype.cpp: Removed. - * kjs/StringPrototype.h: Removed. - * kjs/StructureID.cpp: Removed. - * kjs/StructureID.h: Removed. - * kjs/completion.h: - * kjs/interpreter.h: - * runtime: Added. - * runtime/ArrayConstructor.cpp: Copied from kjs/ArrayConstructor.cpp. - * runtime/ArrayConstructor.h: Copied from kjs/ArrayConstructor.h. - * runtime/ArrayPrototype.cpp: Copied from kjs/ArrayPrototype.cpp. - * runtime/ArrayPrototype.h: Copied from kjs/ArrayPrototype.h. - * runtime/BooleanConstructor.cpp: Copied from kjs/BooleanConstructor.cpp. - * runtime/BooleanConstructor.h: Copied from kjs/BooleanConstructor.h. - * runtime/BooleanObject.cpp: Copied from kjs/BooleanObject.cpp. - * runtime/BooleanObject.h: Copied from kjs/BooleanObject.h. - * runtime/BooleanPrototype.cpp: Copied from kjs/BooleanPrototype.cpp. - * runtime/BooleanPrototype.h: Copied from kjs/BooleanPrototype.h. - * runtime/CallData.cpp: Copied from kjs/CallData.cpp. - * runtime/CallData.h: Copied from kjs/CallData.h. - * runtime/ClassInfo.h: Copied from kjs/ClassInfo.h. - * runtime/ConstructData.cpp: Copied from kjs/ConstructData.cpp. - * runtime/ConstructData.h: Copied from kjs/ConstructData.h. - * runtime/DateConstructor.cpp: Copied from kjs/DateConstructor.cpp. - * runtime/DateConstructor.h: Copied from kjs/DateConstructor.h. - * runtime/DateInstance.cpp: Copied from kjs/DateInstance.cpp. - * runtime/DateInstance.h: Copied from kjs/DateInstance.h. - * runtime/DateMath.cpp: Copied from kjs/DateMath.cpp. - * runtime/DateMath.h: Copied from kjs/DateMath.h. - * runtime/DatePrototype.cpp: Copied from kjs/DatePrototype.cpp. - * runtime/DatePrototype.h: Copied from kjs/DatePrototype.h. - * runtime/Error.cpp: Copied from kjs/Error.cpp. - * runtime/Error.h: Copied from kjs/Error.h. - * runtime/ErrorConstructor.cpp: Copied from kjs/ErrorConstructor.cpp. - * runtime/ErrorConstructor.h: Copied from kjs/ErrorConstructor.h. - * runtime/ErrorInstance.cpp: Copied from kjs/ErrorInstance.cpp. - * runtime/ErrorInstance.h: Copied from kjs/ErrorInstance.h. - * runtime/ErrorPrototype.cpp: Copied from kjs/ErrorPrototype.cpp. - * runtime/ErrorPrototype.h: Copied from kjs/ErrorPrototype.h. - * runtime/FunctionConstructor.cpp: Copied from kjs/FunctionConstructor.cpp. - * runtime/FunctionConstructor.h: Copied from kjs/FunctionConstructor.h. - * runtime/FunctionPrototype.cpp: Copied from kjs/FunctionPrototype.cpp. - * runtime/FunctionPrototype.h: Copied from kjs/FunctionPrototype.h. - * runtime/GlobalEvalFunction.cpp: Copied from kjs/GlobalEvalFunction.cpp. - * runtime/GlobalEvalFunction.h: Copied from kjs/GlobalEvalFunction.h. - * runtime/InternalFunction.cpp: Copied from kjs/InternalFunction.cpp. - * runtime/InternalFunction.h: Copied from kjs/InternalFunction.h. - * runtime/JSArray.cpp: Copied from kjs/JSArray.cpp. - * runtime/JSArray.h: Copied from kjs/JSArray.h. - * runtime/JSCell.cpp: Copied from kjs/JSCell.cpp. - * runtime/JSCell.h: Copied from kjs/JSCell.h. - * runtime/JSFunction.cpp: Copied from kjs/JSFunction.cpp. - * runtime/JSFunction.h: Copied from kjs/JSFunction.h. - * runtime/JSGlobalObject.cpp: Copied from kjs/JSGlobalObject.cpp. - * runtime/JSGlobalObject.h: Copied from kjs/JSGlobalObject.h. - * runtime/JSGlobalObjectFunctions.cpp: Copied from kjs/JSGlobalObjectFunctions.cpp. - * runtime/JSGlobalObjectFunctions.h: Copied from kjs/JSGlobalObjectFunctions.h. - * runtime/JSImmediate.cpp: Copied from kjs/JSImmediate.cpp. - * runtime/JSImmediate.h: Copied from kjs/JSImmediate.h. - * runtime/JSNotAnObject.cpp: Copied from kjs/JSNotAnObject.cpp. - * runtime/JSNotAnObject.h: Copied from kjs/JSNotAnObject.h. - * runtime/JSNumberCell.cpp: Copied from kjs/JSNumberCell.cpp. - * runtime/JSNumberCell.h: Copied from kjs/JSNumberCell.h. - * runtime/JSObject.cpp: Copied from kjs/JSObject.cpp. - * runtime/JSObject.h: Copied from kjs/JSObject.h. - * runtime/JSString.cpp: Copied from kjs/JSString.cpp. - * runtime/JSString.h: Copied from kjs/JSString.h. - * runtime/JSValue.cpp: Copied from kjs/JSValue.cpp. - * runtime/JSValue.h: Copied from kjs/JSValue.h. - * runtime/JSVariableObject.cpp: Copied from kjs/JSVariableObject.cpp. - * runtime/JSVariableObject.h: Copied from kjs/JSVariableObject.h. - * runtime/JSWrapperObject.cpp: Copied from kjs/JSWrapperObject.cpp. - * runtime/JSWrapperObject.h: Copied from kjs/JSWrapperObject.h. - * runtime/MathObject.cpp: Copied from kjs/MathObject.cpp. - * runtime/MathObject.h: Copied from kjs/MathObject.h. - * runtime/NativeErrorConstructor.cpp: Copied from kjs/NativeErrorConstructor.cpp. - * runtime/NativeErrorConstructor.h: Copied from kjs/NativeErrorConstructor.h. - * runtime/NativeErrorPrototype.cpp: Copied from kjs/NativeErrorPrototype.cpp. - * runtime/NativeErrorPrototype.h: Copied from kjs/NativeErrorPrototype.h. - * runtime/NumberConstructor.cpp: Copied from kjs/NumberConstructor.cpp. - * runtime/NumberConstructor.h: Copied from kjs/NumberConstructor.h. - * runtime/NumberObject.cpp: Copied from kjs/NumberObject.cpp. - * runtime/NumberObject.h: Copied from kjs/NumberObject.h. - * runtime/NumberPrototype.cpp: Copied from kjs/NumberPrototype.cpp. - * runtime/NumberPrototype.h: Copied from kjs/NumberPrototype.h. - * runtime/ObjectConstructor.cpp: Copied from kjs/ObjectConstructor.cpp. - * runtime/ObjectConstructor.h: Copied from kjs/ObjectConstructor.h. - * runtime/ObjectPrototype.cpp: Copied from kjs/ObjectPrototype.cpp. - * runtime/ObjectPrototype.h: Copied from kjs/ObjectPrototype.h. - * runtime/PropertyMap.cpp: Copied from kjs/PropertyMap.cpp. - * runtime/PropertyMap.h: Copied from kjs/PropertyMap.h. - * runtime/PropertySlot.cpp: Copied from kjs/PropertySlot.cpp. - * runtime/PropertySlot.h: Copied from kjs/PropertySlot.h. - * runtime/PrototypeFunction.cpp: Copied from kjs/PrototypeFunction.cpp. - * runtime/PrototypeFunction.h: Copied from kjs/PrototypeFunction.h. - * runtime/PutPropertySlot.h: Copied from kjs/PutPropertySlot.h. - * runtime/SmallStrings.cpp: Copied from kjs/SmallStrings.cpp. - * runtime/SmallStrings.h: Copied from kjs/SmallStrings.h. - * runtime/StringConstructor.cpp: Copied from kjs/StringConstructor.cpp. - * runtime/StringConstructor.h: Copied from kjs/StringConstructor.h. - * runtime/StringObject.cpp: Copied from kjs/StringObject.cpp. - * runtime/StringObject.h: Copied from kjs/StringObject.h. - * runtime/StringObjectThatMasqueradesAsUndefined.h: Copied from kjs/StringObjectThatMasqueradesAsUndefined.h. - * runtime/StringPrototype.cpp: Copied from kjs/StringPrototype.cpp. - * runtime/StringPrototype.h: Copied from kjs/StringPrototype.h. - * runtime/StructureID.cpp: Copied from kjs/StructureID.cpp. - * runtime/StructureID.h: Copied from kjs/StructureID.h. - -2008-10-28 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Fixed https://bugs.webkit.org/show_bug.cgi?id=21919 - Sampler reports bogus time in op_enter during 3d-raytrace.js - - Fixed a bug where we would pass the incorrect Instruction* during some - parts of CTI codegen. - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - * VM/SamplingTool.cpp: - (JSC::SamplingTool::run): - * wtf/Platform.h: + * runtime/ScopeChain.h: + * runtime/UString.h: -2008-10-28 Kevin McCullough <kmccullough@apple.com> +2009-06-26 Jedrzej Nowacki <jedrzej.nowacki@nokia.com> - Reviewed by Dan Bernstein. + Reviewed by Simon Hausmann. - -Removed unused includes. - Apparent .4% speedup in Sunspider + Add support for QDataStream operators to Vector. - * kjs/JSObject.cpp: - * kjs/interpreter.cpp: + * wtf/Vector.h: + (WTF::operator<<): + (WTF::operator>>): -2008-10-28 Alp Toker <alp@nuanti.com> +2009-06-24 Sam Weinig <sam@webkit.org> - Include copyright license files in the autotools dist target. + Reviewed by Gavin Barraclough. - Change suggested by Mike Hommey. + Make the opcode sampler work once again. - * GNUmakefile.am: + * jit/JIT.h: + (JSC::JIT::compileGetByIdProto): + (JSC::JIT::compileGetByIdSelfList): + (JSC::JIT::compileGetByIdProtoList): + (JSC::JIT::compileGetByIdChainList): + (JSC::JIT::compileGetByIdChain): + (JSC::JIT::compilePutByIdTransition): + (JSC::JIT::compileCTIMachineTrampolines): + (JSC::JIT::compilePatchGetArrayLength): + * jit/JITStubCall.h: + (JSC::JITStubCall::call): -2008-10-27 Geoffrey Garen <ggaren@apple.com> +2009-06-24 Zoltan Horvath <hzoltan@inf.u-szeged.hu> Reviewed by Maciej Stachowiak. - - Stop discarding CodeBlock samples that can't be charged to a specific - opcode. Instead, charge the relevant CodeBlock, and provide a footnote - explaining the situation. - - This will help us tell which CodeBlocks are hot, even if we can't - identify specific lines of code within the CodeBlocks. - - * VM/SamplingTool.cpp: - (JSC::ScopeSampleRecord::sample): - (JSC::compareScopeSampleRecords): - (JSC::SamplingTool::dump): - - * VM/SamplingTool.h: - (JSC::ScopeSampleRecord::ScopeSampleRecord): - (JSC::ScopeSampleRecord::~ScopeSampleRecord): - -2008-10-27 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Added a mutex around the SamplingTool's ScopeNode* map, to solve a crash - when sampling the v8 tests. - - * VM/SamplingTool.cpp: - (JSC::SamplingTool::run): - (JSC::SamplingTool::notifyOfScope): - * VM/SamplingTool.h: Since new ScopeNodes can be created after - the SamplingTools has begun sampling, reads and writes to / from the - map need to be synchronized. Shark says this doesn't measurably increase - sampling overhead. - -2008-10-25 Geoffrey Garen <ggaren@apple.com> - - Not reviewed. - - Try to fix Windows build. - * VM/Machine.cpp: - (JSC::Machine::privateExecute): Provide a dummy value to the - HostCallRecord in CTI non-sampling builds, to silence compiler warning. + Extend FastAllocBase.h with 'using WTF::FastAllocBase' to avoid + unnecessary WTF:: usings. + Remove existing unnecessary WTF:: usings. -2008-10-25 Geoffrey Garen <ggaren@apple.com> - - Not reviewed. - - Try to fix Windows build. - - * VM/SamplingTool.h: - (JSC::SamplingTool::encodeSample): Explicitly cast bool to int, to - silence compiler warning. - -2008-10-25 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig, with Gavin Barraclough's help. - - Fixed Sampling Tool: - - Made CodeBlock sampling work with CTI - - Improved accuracy by unifying most sampling data into a single - 32bit word, which can be written / read atomically. - - Split out three different #ifdefs for modularity: OPCODE_SAMPLING; - CODEBLOCK_SAMPLING; OPCODE_STATS. - - Improved reporting clarity - - Refactored for code clarity - - * JavaScriptCore.exp: Exported another symbol. - - * VM/CTI.cpp: - (JSC::CTI::emitCTICall): - (JSC::CTI::compileOpCall): - (JSC::CTI::emitSlowScriptCheck): - (JSC::CTI::compileBinaryArithOpSlowCase): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - (JSC::CTI::privateCompile): - * VM/CTI.h: Updated CTI codegen to use the unified SamplingTool interface - for encoding samples. (This required passing the current vPC to a lot - more functions, since the unified interface samples the current vPC.) - Added hooks for writing the current CodeBlock* on function entry and - after a function call, for the sake of the CodeBlock sampler. Removed - obsolete hook for clearing the current sample inside op_end. Also removed - the custom enum used to differentiate flavors of op_call, since the - OpcodeID enum works just as well. (This was important in an earlier - version of the patch, but now it's just cleanup.) - - * VM/CodeBlock.cpp: - (JSC::CodeBlock::lineNumberForVPC): - * VM/CodeBlock.h: Upated for refactored #ifdefs. Changed lineNumberForVPC - to be robust against vPCs not recorded for exception handling, since - the Sampler may ask for an arbitrary vPC. - - * VM/Machine.cpp: - (JSC::Machine::execute): - (JSC::Machine::privateExecute): - (JSC::Machine::cti_op_call_NotJSFunction): - (JSC::Machine::cti_op_construct_NotJSConstruct): - * VM/Machine.h: - (JSC::Machine::setSampler): - (JSC::Machine::sampler): - (JSC::Machine::jitCodeBuffer): Upated for refactored #ifdefs. Changed - Machine to use SamplingTool helper objects to record movement in and - out of host code. This makes samples a bit more precise. - - * VM/Opcode.cpp: - (JSC::OpcodeStats::~OpcodeStats): - * VM/Opcode.h: Upated for refactored #ifdefs. Added a little more padding, - to accomodate our more verbose opcode names. - - * VM/SamplingTool.cpp: - (JSC::ScopeSampleRecord::sample): Only count a sample toward our total - if we actually record it. This solves cases where a CodeBlock will - claim to have been sampled many times, with reported samples that don't - match. - - (JSC::SamplingTool::run): Read the current sample into a Sample helper - object, to ensure that the data doesn't change while we're analyzing it, - and to help decode the data. Only access the CodeBlock sampling hash - table if CodeBlock sampling has been enabled, so non-CodeBlock sampling - runs can operate with even less overhead. - - (JSC::SamplingTool::dump): I reorganized this code a lot to print the - most important info at the top, print as a table, annotate and document - the stuff I didn't understand when I started, etc. - - * VM/SamplingTool.h: New helper classes, described above. - - * kjs/Parser.h: - * kjs/Shell.cpp: - (runWithScripts): - * kjs/nodes.cpp: - (JSC::ScopeNode::ScopeNode): Updated for new sampling APIs. - - * wtf/Platform.h: Moved sampling #defines here, since our custom is to - put ENABLE #defines into Platform.h. Made explicit the fact that - CODEBLOCK_SAMPLING depends on OPCODE_SAMPLING. - -2008-10-25 Jan Michael Alonzo <jmalonzo@webkit.org> - - JSC Build fix, not reviewed. - - * VM/CTI.cpp: add missing include stdio.h for debug builds - -2008-10-24 Eric Seidel <eric@webkit.org> - - Reviewed by Darin Adler. - - Get rid of a bonus ASSERT when using a null string as a regexp. - Specifically calling: RegularExpression::match() with String::empty() - will hit this ASSERT. - Chromium hits this, but I don't know of any way to make a layout test. - - * pcre/pcre_exec.cpp: - (jsRegExpExecute): - -2008-10-24 Alexey Proskuryakov <ap@webkit.org> - - Suggested and rubber-stamped by Geoff Garen. - - Fix a crash when opening Font Picker. - - The change also hopefully fixes this bug, which I could never reproduce: - https://bugs.webkit.org/show_bug.cgi?id=20241 - <rdar://problem/6290576> Safari crashes at JSValueUnprotect() when fontpicker view close - - * API/JSContextRef.cpp: (JSContextGetGlobalObject): Use lexical global object instead of - dynamic one. - -2008-10-24 Cameron Zwarich <zwarich@apple.com> + * interpreter/Interpreter.h: + * profiler/CallIdentifier.h: + * runtime/ScopeChain.h: + * wtf/FastAllocBase.h: - Reviewed by Geoff Garen. +2009-06-24 David Levin <levin@chromium.org> - Remove ScopeChainNode::bottom() and inline it into its only caller, - ScopeChainnode::globalObject(). + Fix all builds. - * kjs/JSGlobalObject.h: - (JSC::ScopeChainNode::globalObject): - * kjs/ScopeChain.h: - (JSC::ScopeChain::bottom): + * bytecode/CodeBlock.h: + * bytecompiler/BytecodeGenerator.h: + * interpreter/Register.h: -2008-10-24 Cameron Zwarich <zwarich@apple.com> +2009-06-24 Zoltan Horvath <hzoltan@inf.u-szeged.hu> Reviewed by Maciej Stachowiak. - - Bug 21862: Create JSFunction prototype property lazily - <https://bugs.webkit.org/show_bug.cgi?id=21862> - - This is a 1.5% speedup on SunSpider and a 1.4% speedup on the V8 - benchmark suite, including a 3.8% speedup on Earley-Boyer. - - * kjs/JSFunction.cpp: - (JSC::JSFunction::getOwnPropertySlot): - * kjs/nodes.cpp: - (JSC::FuncDeclNode::makeFunction): - (JSC::FuncExprNode::makeFunction): - -2008-10-24 Greg Bolsinga <bolsinga@apple.com> - - Reviewed by Sam Weinig. - - https://bugs.webkit.org/show_bug.cgi?id=21475 - - Provide support for the Geolocation API - - http://dev.w3.org/geo/api/spec-source.html - - * wtf/Platform.h: ENABLE_GEOLOCATION defaults to 0 - -2008-10-24 Darin Adler <darin@apple.com> - - - finish rolling out https://bugs.webkit.org/show_bug.cgi?id=21732 - - * API/APICast.h: - * API/JSCallbackConstructor.h: - * API/JSCallbackFunction.cpp: - * API/JSCallbackFunction.h: - * API/JSCallbackObject.h: - * API/JSCallbackObjectFunctions.h: - * API/JSContextRef.cpp: - * API/JSObjectRef.cpp: - * API/JSValueRef.cpp: - * VM/CTI.cpp: - * VM/CTI.h: - * VM/CodeBlock.cpp: - * VM/CodeBlock.h: - * VM/CodeGenerator.cpp: - * VM/CodeGenerator.h: - * VM/ExceptionHelpers.cpp: - * VM/ExceptionHelpers.h: - * VM/JSPropertyNameIterator.cpp: - * VM/JSPropertyNameIterator.h: - * VM/Machine.cpp: - * VM/Machine.h: - * VM/Register.h: - * kjs/ArgList.cpp: - * kjs/ArgList.h: - * kjs/Arguments.cpp: - * kjs/Arguments.h: - * kjs/ArrayConstructor.cpp: - * kjs/ArrayPrototype.cpp: - * kjs/BooleanConstructor.cpp: - * kjs/BooleanConstructor.h: - * kjs/BooleanObject.h: - * kjs/BooleanPrototype.cpp: - * kjs/CallData.cpp: - * kjs/CallData.h: - * kjs/ConstructData.cpp: - * kjs/ConstructData.h: - * kjs/DateConstructor.cpp: - * kjs/DateInstance.h: - * kjs/DatePrototype.cpp: - * kjs/DatePrototype.h: - * kjs/DebuggerCallFrame.cpp: - * kjs/DebuggerCallFrame.h: - * kjs/ErrorConstructor.cpp: - * kjs/ErrorPrototype.cpp: - * kjs/ExecState.cpp: - * kjs/ExecState.h: - * kjs/FunctionConstructor.cpp: - * kjs/FunctionPrototype.cpp: - * kjs/FunctionPrototype.h: - * kjs/GetterSetter.cpp: - * kjs/GetterSetter.h: - * kjs/InternalFunction.h: - * kjs/JSActivation.cpp: - * kjs/JSActivation.h: - * kjs/JSArray.cpp: - * kjs/JSArray.h: - * kjs/JSCell.cpp: - * kjs/JSCell.h: - * kjs/JSFunction.cpp: - * kjs/JSFunction.h: - * kjs/JSGlobalData.h: - * kjs/JSGlobalObject.cpp: - * kjs/JSGlobalObject.h: - * kjs/JSGlobalObjectFunctions.cpp: - * kjs/JSGlobalObjectFunctions.h: - * kjs/JSImmediate.cpp: - * kjs/JSImmediate.h: - * kjs/JSNotAnObject.cpp: - * kjs/JSNotAnObject.h: - * kjs/JSNumberCell.cpp: - * kjs/JSNumberCell.h: - * kjs/JSObject.cpp: - * kjs/JSObject.h: - * kjs/JSStaticScopeObject.cpp: - * kjs/JSStaticScopeObject.h: - * kjs/JSString.cpp: - * kjs/JSString.h: - * kjs/JSValue.h: - * kjs/JSVariableObject.h: - * kjs/JSWrapperObject.h: - * kjs/MathObject.cpp: - * kjs/MathObject.h: - * kjs/NativeErrorConstructor.cpp: - * kjs/NumberConstructor.cpp: - * kjs/NumberConstructor.h: - * kjs/NumberObject.cpp: - * kjs/NumberObject.h: - * kjs/NumberPrototype.cpp: - * kjs/ObjectConstructor.cpp: - * kjs/ObjectPrototype.cpp: - * kjs/ObjectPrototype.h: - * kjs/PropertyMap.h: - * kjs/PropertySlot.cpp: - * kjs/PropertySlot.h: - * kjs/RegExpConstructor.cpp: - * kjs/RegExpConstructor.h: - * kjs/RegExpMatchesArray.h: - * kjs/RegExpObject.cpp: - * kjs/RegExpObject.h: - * kjs/RegExpPrototype.cpp: - * kjs/Shell.cpp: - * kjs/StringConstructor.cpp: - * kjs/StringObject.cpp: - * kjs/StringObject.h: - * kjs/StringObjectThatMasqueradesAsUndefined.h: - * kjs/StringPrototype.cpp: - * kjs/StructureID.cpp: - * kjs/StructureID.h: - * kjs/collector.cpp: - * kjs/collector.h: - * kjs/completion.h: - * kjs/grammar.y: - * kjs/interpreter.cpp: - * kjs/interpreter.h: - * kjs/lookup.cpp: - * kjs/lookup.h: - * kjs/nodes.h: - * kjs/operations.cpp: - * kjs/operations.h: - * kjs/protect.h: - * profiler/ProfileGenerator.cpp: - * profiler/Profiler.cpp: - * profiler/Profiler.h: - Use JSValue* instead of JSValuePtr. - -2008-10-24 David Kilzer <ddkilzer@apple.com> - - Rolled out r37840. - - * wtf/Platform.h: - -2008-10-23 Greg Bolsinga <bolsinga@apple.com> - - Reviewed by Sam Weinig. - - https://bugs.webkit.org/show_bug.cgi?id=21475 - Provide support for the Geolocation API - - http://dev.w3.org/geo/api/spec-source.html - - * wtf/Platform.h: ENABLE_GEOLOCATION defaults to 0 - -2008-10-23 David Kilzer <ddkilzer@apple.com> + https://bugs.webkit.org/show_bug.cgi?id=26677 - Bug 21832: Fix scripts using 'new File::Temp' for Perl 5.10 + Inherits CodeBlock class from FastAllocBase because it + has been instantiated by 'new' in JavaScriptCore/bytecode/CodeBlock.h:217. - <https://bugs.webkit.org/show_bug.cgi?id=21832> - - Reviewed by Sam Weinig. - - * pcre/dftables: Use imported tempfile() from File::Temp instead of - 'new File::Temp' to make the script work with Perl 5.10. - -2008-10-23 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Fix hideous pathological case performance when looking up repatch info, bug #21727. - - When repatching JIT code to optimize we look up records providing information about - the generated code (also used to track recsources used in linking to be later released). - The lookup was being performed using a linear scan of all such records. - - (1) Split up the different types of reptach information. This means we can search them - separately, and in some cases should reduce their size. - (2) In the case of property accesses, search with a binary chop over the data. - (3) In the case of calls, pass a pointer to the repatch info into the relink function. - - * VM/CTI.cpp: - (JSC::CTI::CTI): - (JSC::CTI::compileOpCall): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - (JSC::CTI::privateCompile): - (JSC::CTI::unlinkCall): - (JSC::CTI::linkCall): - * VM/CTI.h: - * VM/CodeBlock.cpp: - (JSC::CodeBlock::dump): - (JSC::CodeBlock::~CodeBlock): - (JSC::CodeBlock::unlinkCallers): - (JSC::CodeBlock::derefStructureIDs): - * VM/CodeBlock.h: - (JSC::StructureStubInfo::StructureStubInfo): - (JSC::CallLinkInfo::CallLinkInfo): - (JSC::CallLinkInfo::setUnlinked): - (JSC::CallLinkInfo::isLinked): - (JSC::getStructureStubInfoReturnLocation): - (JSC::binaryChop): - (JSC::CodeBlock::addCaller): - (JSC::CodeBlock::getStubInfo): - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::emitResolve): - (JSC::CodeGenerator::emitGetById): - (JSC::CodeGenerator::emitPutById): - (JSC::CodeGenerator::emitCall): - (JSC::CodeGenerator::emitConstruct): - * VM/Machine.cpp: - (JSC::Machine::cti_vm_lazyLinkCall): - -2008-10-23 Peter Kasting <pkasting@google.com> - - Reviewed by Adam Roben. - - https://bugs.webkit.org/show_bug.cgi?id=21833 - Place JavaScript Debugger hooks under #if ENABLE(JAVASCRIPT_DEBUGGER). - - * wtf/Platform.h: - -2008-10-23 David Kilzer <ddkilzer@apple.com> - - Bug 21831: Fix create_hash_table for Perl 5.10 - - <https://bugs.webkit.org/show_bug.cgi?id=21831> - - Reviewed by Sam Weinig. - - * kjs/create_hash_table: Escaped square brackets so that Perl 5.10 - doesn't try to use @nameEntries. - -2008-10-23 Darin Adler <darin@apple.com> - - - roll out https://bugs.webkit.org/show_bug.cgi?id=21732 - to remove the JSValuePtr class, to fix two problems - - 1) slowness under MSVC, since it doesn't handle a - class with a single pointer in it as efficiently - as a pointer - - 2) uninitialized pointers in Vector - - * JavaScriptCore.exp: Updated. + * bytecode/CodeBlock.h: - * API/APICast.h: - (toRef): - * VM/CTI.cpp: - (JSC::CTI::asInteger): - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::addConstant): - * VM/CodeGenerator.h: - (JSC::CodeGenerator::JSValueHashTraits::constructDeletedValue): - (JSC::CodeGenerator::JSValueHashTraits::isDeletedValue): - * VM/Machine.cpp: - (JSC::Machine::cti_op_add): - (JSC::Machine::cti_op_pre_inc): - (JSC::Machine::cti_op_get_by_id): - (JSC::Machine::cti_op_get_by_id_second): - (JSC::Machine::cti_op_get_by_id_generic): - (JSC::Machine::cti_op_get_by_id_fail): - (JSC::Machine::cti_op_instanceof): - (JSC::Machine::cti_op_del_by_id): - (JSC::Machine::cti_op_mul): - (JSC::Machine::cti_op_call_NotJSFunction): - (JSC::Machine::cti_op_resolve): - (JSC::Machine::cti_op_construct_NotJSConstruct): - (JSC::Machine::cti_op_get_by_val): - (JSC::Machine::cti_op_sub): - (JSC::Machine::cti_op_lesseq): - (JSC::Machine::cti_op_negate): - (JSC::Machine::cti_op_resolve_base): - (JSC::Machine::cti_op_resolve_skip): - (JSC::Machine::cti_op_resolve_global): - (JSC::Machine::cti_op_div): - (JSC::Machine::cti_op_pre_dec): - (JSC::Machine::cti_op_not): - (JSC::Machine::cti_op_eq): - (JSC::Machine::cti_op_lshift): - (JSC::Machine::cti_op_bitand): - (JSC::Machine::cti_op_rshift): - (JSC::Machine::cti_op_bitnot): - (JSC::Machine::cti_op_mod): - (JSC::Machine::cti_op_less): - (JSC::Machine::cti_op_neq): - (JSC::Machine::cti_op_urshift): - (JSC::Machine::cti_op_bitxor): - (JSC::Machine::cti_op_bitor): - (JSC::Machine::cti_op_call_eval): - (JSC::Machine::cti_op_throw): - (JSC::Machine::cti_op_next_pname): - (JSC::Machine::cti_op_typeof): - (JSC::Machine::cti_op_is_undefined): - (JSC::Machine::cti_op_is_boolean): - (JSC::Machine::cti_op_is_number): - (JSC::Machine::cti_op_is_string): - (JSC::Machine::cti_op_is_object): - (JSC::Machine::cti_op_is_function): - (JSC::Machine::cti_op_stricteq): - (JSC::Machine::cti_op_nstricteq): - (JSC::Machine::cti_op_to_jsnumber): - (JSC::Machine::cti_op_in): - (JSC::Machine::cti_op_del_by_val): - (JSC::Machine::cti_vm_throw): - Removed calls to payload functions. - - * VM/Register.h: - (JSC::Register::Register): Removed overload for JSCell and call - to payload function. - - * kjs/JSCell.h: Changed JSCell to derive from JSValue again. - Removed JSValuePtr constructor. - (JSC::asCell): Changed cast from reinterpret_cast to static_cast. - - * kjs/JSImmediate.h: Removed JSValuePtr class. Added typedef back. - - * kjs/JSValue.h: - (JSC::JSValue::JSValue): Added empty protected inline constructor back. - (JSC::JSValue::~JSValue): Same for destructor. - Removed == and != operator for JSValuePtr. - - * kjs/PropertySlot.h: - (JSC::PropertySlot::PropertySlot): Chnaged argument to const JSValue* - and added a const_cast. - - * kjs/protect.h: Removed overloads and specialization for JSValuePtr. - -2008-10-22 Oliver Hunt <oliver@apple.com> +2009-06-24 Zoltan Horvath <hzoltan@inf.u-szeged.hu> Reviewed by Maciej Stachowiak. - - Really "fix" CTI mode on windows 2k3. - - This adds new methods fastMallocExecutable and fastFreeExecutable - to wrap allocation for cti code. This still just makes fastMalloc - return executable memory all the time, which will be fixed in a - later patch. - - However in windows debug builds all executable allocations will be - allocated on separate executable pages, which should resolve any - remaining 2k3 issues. Conveniently the 2k3 bot will now also fail - if there are any fastFree vs. fastFreeExecutable errors. - - * ChangeLog: - * VM/CodeBlock.cpp: - (JSC::CodeBlock::~CodeBlock): - * kjs/regexp.cpp: - (JSC::RegExp::~RegExp): - * masm/X86Assembler.h: - (JSC::JITCodeBuffer::copy): - * wtf/FastMalloc.cpp: - (WTF::fastMallocExecutable): - (WTF::fastFreeExecutable): - (WTF::TCMallocStats::fastMallocExecutable): - (WTF::TCMallocStats::fastFreeExecutable): - * wtf/FastMalloc.h: - -2008-10-22 Darin Adler <darin@apple.com> - - Reviewed by Sam Weinig. - - - fix https://bugs.webkit.org/show_bug.cgi?id=21294 - Bug 21294: Devirtualize getOwnPropertySlot() - - A bit over 3% faster on V8 tests. - - * JavascriptCore.exp: Export leak-related functions.. - - * API/JSCallbackConstructor.h: - (JSC::JSCallbackConstructor::createStructureID): Set HasStandardGetOwnPropertySlot - since this class doesn't override getPropertySlot. - * API/JSCallbackFunction.h: - (JSC::JSCallbackFunction::createStructureID): Ditto. - - * VM/ExceptionHelpers.cpp: - (JSC::InterruptedExecutionError::InterruptedExecutionError): Use a structure - that's created just for this class instead of trying to share a single "null - prototype" structure. - - * VM/Machine.cpp: - (JSC::Machine::cti_op_create_arguments_no_params): Rename - Arguments::ArgumentsNoParameters to Arguments::NoParameters. - * kjs/Arguments.h: Rename the enum from Arguments::ArgumentsParameters to - Arguments::NoParametersType and the value from Arguments::ArgumentsNoParameters - to Arguments::NoParameters. - (JSC::Arguments::createStructureID): Added. Returns a structure without - HasStandardGetOwnPropertySlot since this class overrides getOwnPropertySlot. - (JSC::Arguments::Arguments): Added an assertion that there are no parameters. - - * kjs/DatePrototype.h: - (JSC::DatePrototype::createStructureID): Added. Returns a structure without - HasStandardGetOwnPropertySlot since this class overrides getOwnPropertySlot. - - * kjs/FunctionPrototype.h: - (JSC::FunctionPrototype::createStructureID): Set HasStandardGetOwnPropertySlot - since this class doesn't override getPropertySlot. - * kjs/InternalFunction.h: - (JSC::InternalFunction::createStructureID): Ditto. - - * kjs/JSArray.h: - (JSC::JSArray::createStructureID): Added. Returns a structure without - HasStandardGetOwnPropertySlot since this class overrides getOwnPropertySlot. - - * kjs/JSCell.h: Added declaration of fastGetOwnPropertySlot; a non-virtual - version that uses the structure bit to decide whether to call the virtual - version. - - * kjs/JSFunction.h: - (JSC::JSFunction::createStructureID): Added. Returns a structure without - HasStandardGetOwnPropertySlot since this class overrides getOwnPropertySlot. - - * kjs/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): Initialize new structures; removed - nullProtoStructureID. - * kjs/JSGlobalData.h: Added new structures. Removed nullProtoStructureID. - - * kjs/JSGlobalObject.h: - (JSC::JSGlobalObject::createStructureID): Added. Returns a structure without - HasStandardGetOwnPropertySlot since this class overrides getOwnPropertySlot. - - * kjs/JSNotAnObject.h: - (JSC::JSNotAnObjectErrorStub::JSNotAnObjectErrorStub): Use a structure - that's created just for this class instead of trying to share a single "null - prototype" structure. - (JSC::JSNotAnObjectErrorStub::isNotAnObjectErrorStub): Marked this function - virtual for clarity and made it private since no one should call it if they - already have a pointer to this specific type. - (JSC::JSNotAnObject::JSNotAnObject): Use a structure that's created just - for this class instead of trying to share a single "null prototype" structure. - (JSC::JSNotAnObject::createStructureID): Added. Returns a structure without - HasStandardGetOwnPropertySlot since this class overrides getOwnPropertySlot. - - * kjs/JSObject.h: - (JSC::JSObject::createStructureID): Added HasStandardGetOwnPropertySlot. - (JSC::JSObject::inlineGetOwnPropertySlot): Added. Used so we can share code - between getOwnPropertySlot and fastGetOwnPropertySlot. - (JSC::JSObject::getOwnPropertySlot): Moved so that functions are above the - functions that call them. Moved the guts of this function into - inlineGetOwnPropertySlot. - (JSC::JSCell::fastGetOwnPropertySlot): Added. Checks the - HasStandardGetOwnPropertySlot bit and if it's set, calls - inlineGetOwnPropertySlot, otherwise calls getOwnPropertySlot. - (JSC::JSObject::getPropertySlot): Changed to call fastGetOwnPropertySlot. - (JSC::JSValue::get): Changed to call fastGetOwnPropertySlot. - - * kjs/JSWrapperObject.h: Made constructor protected to emphasize that - this class is only a base class and never instantiated. - - * kjs/MathObject.h: - (JSC::MathObject::createStructureID): Added. Returns a structure without - HasStandardGetOwnPropertySlot since this class overrides getOwnPropertySlot. - * kjs/NumberConstructor.h: - (JSC::NumberConstructor::createStructureID): Ditto. - * kjs/RegExpConstructor.h: - (JSC::RegExpConstructor::createStructureID): Ditto. - * kjs/RegExpObject.h: - (JSC::RegExpObject::createStructureID): Ditto. - * kjs/StringObject.h: - (JSC::StringObject::createStructureID): Ditto. - - * kjs/TypeInfo.h: Added HasStandardGetOwnPropertySlot flag and - hasStandardGetOwnPropertySlot accessor function. - -2008-10-22 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Geoff Garen. - - Bug 21803: Fuse op_jfalse with op_eq_null and op_neq_null - <https://bugs.webkit.org/show_bug.cgi?id=21803> - - Fuse op_jfalse with op_eq_null and op_neq_null to make the new opcodes - op_jeq_null and op_jneq_null. - - This is a 2.6% speedup on the V8 Raytrace benchmark, and strangely also - a 4.7% speedup on the V8 Arguments benchmark, even though it uses - neither of the two new opcodes. - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): - * VM/CodeBlock.cpp: - (JSC::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::emitJumpIfTrue): - (JSC::CodeGenerator::emitJumpIfFalse): - * VM/Machine.cpp: - (JSC::Machine::privateExecute): - * VM/Opcode.h: - -2008-10-22 Darin Fisher <darin@chromium.org> - - Reviewed by Eric Seidel. - - Should not define PLATFORM(WIN,MAC,GTK) when PLATFORM(CHROMIUM) is defined - https://bugs.webkit.org/show_bug.cgi?id=21757 - - PLATFORM(CHROMIUM) implies HAVE_ACCESSIBILITY - - * wtf/Platform.h: - -2008-10-22 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Alexey Proskuryakov. - - Correct opcode names in documentation. - - * VM/Machine.cpp: - (JSC::Machine::privateExecute): - -2008-10-21 Oliver Hunt <oliver@apple.com> - - RS=Maciej Stachowiak. - - Force FastMalloc to make all allocated pages executable in - a vague hope this will allow the Win2k3 bot to be able to - run tests. - - Filed Bug 21783: Need more granular control over allocation of executable memory - to cover a more granular version of this patch. - - * wtf/TCSystemAlloc.cpp: - (TryVirtualAlloc): - -2008-10-21 Alexey Proskuryakov <ap@webkit.org> - - Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=21769 - MessagePort should be GC protected if there are messages to be delivered - - * wtf/MessageQueue.h: - (WTF::::isEmpty): Added. Also added a warning for methods that return a snapshot of queue - state, thus likely to cause race conditions. - -2008-10-21 Darin Adler <darin@apple.com> - - Reviewed by Maciej Stachowiak. - - - convert post-increment to pre-increment in a couple more places for speed - - Speeds up V8 benchmarks a little on most computers. (But, strangely, slows - them down a little on my computer.) - - * kjs/nodes.cpp: - (JSC::statementListEmitCode): Removed default argument, since we always want - to specify this explicitly. - (JSC::ForNode::emitCode): Tolerate ignoredResult() as the dst -- means the - same thing as 0. - (JSC::ReturnNode::emitCode): Ditto. - (JSC::ThrowNode::emitCode): Ditto. - (JSC::FunctionBodyNode::emitCode): Pass ignoredResult() so that we know we - don't have to compute the result of function statements. - -2008-10-21 Peter Kasting <pkasting@google.com> - - Reviewed by Maciej Stachowiak. - - Fix an include of a non-public header to use "" instead of <>. - - * API/JSProfilerPrivate.cpp: - -2008-10-20 Sam Weinig <sam@webkit.org> - - Reviewed by Cameron Zwarich. + https://bugs.webkit.org/show_bug.cgi?id=26676 - Fix for https://bugs.webkit.org/show_bug.cgi?id=21766 - REGRESSION: 12 JSC tests fail + Inherits BytecodeGenerator class from FastAllocBase because it has been + instantiated by 'new' in JavaScriptCore/parser/Nodes.cpp:1892. - The JSGlobalObject was mutating the shared nullProtoStructureID when - used in jsc. Instead of using nullProtoStructureID, use a new StructureID. - - * API/JSCallbackObject.h: - * API/JSCallbackObjectFunctions.h: - (JSC::::JSCallbackObject): - * API/JSContextRef.cpp: - (JSGlobalContextCreateInGroup): - * kjs/JSGlobalObject.h: - (JSC::JSGlobalObject::JSGlobalObject): - * kjs/Shell.cpp: - (GlobalObject::GlobalObject): - (jscmain): + * bytecompiler/BytecodeGenerator.h: -2008-10-20 Cameron Zwarich <zwarich@apple.com> +2009-06-24 Zoltan Horvath <hzoltan@inf.u-szeged.hu> Reviewed by Maciej Stachowiak. - - Remove an untaken branch in CodeGenerator::emitJumpIfFalse(). This - function is never called with a backwards target LabelID, and there is - even an assertion to this effect at the top of the function body. - - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::emitJumpIfFalse): - -2008-10-20 Cameron Zwarich <zwarich@apple.com> - - Rubber-stamped by Sam Weinig. - - Add opcode documentation for undocumented opcodes. - - * VM/Machine.cpp: - (JSC::Machine::privateExecute): - -2008-10-16 Sam Weinig <sam@webkit.org> - - Reviewed by Cameron Zwarich. - - Fix for https://bugs.webkit.org/show_bug.cgi?id=21683 - Don't create intermediate StructureIDs for builtin objects - - Second stage in reduce number of StructureIDs created when initializing the - JSGlobalObject. - - - Use putDirectWithoutTransition for the remaining singleton objects to reduce - the number of StructureIDs create for about:blank from 132 to 73. - - * kjs/ArrayConstructor.cpp: - (JSC::ArrayConstructor::ArrayConstructor): - * kjs/BooleanConstructor.cpp: - (JSC::BooleanConstructor::BooleanConstructor): - * kjs/BooleanPrototype.cpp: - (JSC::BooleanPrototype::BooleanPrototype): - * kjs/DateConstructor.cpp: - (JSC::DateConstructor::DateConstructor): - * kjs/ErrorConstructor.cpp: - (JSC::ErrorConstructor::ErrorConstructor): - * kjs/ErrorPrototype.cpp: - (JSC::ErrorPrototype::ErrorPrototype): - * kjs/FunctionConstructor.cpp: - (JSC::FunctionConstructor::FunctionConstructor): - * kjs/FunctionPrototype.cpp: - (JSC::FunctionPrototype::FunctionPrototype): - (JSC::FunctionPrototype::addFunctionProperties): - * kjs/FunctionPrototype.h: - (JSC::FunctionPrototype::createStructureID): - * kjs/InternalFunction.cpp: - * kjs/InternalFunction.h: - (JSC::InternalFunction::InternalFunction): - * kjs/JSGlobalObject.cpp: - (JSC::JSGlobalObject::reset): - * kjs/JSObject.h: - * kjs/MathObject.cpp: - (JSC::MathObject::MathObject): - * kjs/NumberConstructor.cpp: - (JSC::NumberConstructor::NumberConstructor): - * kjs/NumberPrototype.cpp: - (JSC::NumberPrototype::NumberPrototype): - * kjs/ObjectConstructor.cpp: - (JSC::ObjectConstructor::ObjectConstructor): - * kjs/RegExpConstructor.cpp: - (JSC::RegExpConstructor::RegExpConstructor): - * kjs/RegExpPrototype.cpp: - (JSC::RegExpPrototype::RegExpPrototype): - * kjs/StringConstructor.cpp: - (JSC::StringConstructor::StringConstructor): - * kjs/StringPrototype.cpp: - (JSC::StringPrototype::StringPrototype): - * kjs/StructureID.cpp: - (JSC::StructureID::dumpStatistics): - * kjs/StructureID.h: - (JSC::StructureID::setPrototypeWithoutTransition): - -2008-10-20 Alp Toker <alp@nuanti.com> - - Fix autotools dist build target by listing recently added header - files only. Not reviewed. - - * GNUmakefile.am: - -2008-10-20 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Anders Carlsson. - - * VM/Machine.cpp: - (JSC::Machine::tryCacheGetByID): Removed a redundant and sometimes - incorrect cast, which started ASSERTing after Darin's last checkin. - -2008-10-20 Geoffrey Garen <ggaren@apple.com> - - Not reviewed. - Re-enable CTI, which I accidentally disabled while checking in fixes - to bytecode. - - * wtf/Platform.h: - -2008-10-20 Alp Toker <alp@nuanti.com> - - Rubber-stamped by Mark Rowe. - - Typo fix in function name: mimimum -> minimum. - - * kjs/DateMath.cpp: - (JSC::minimumYearForDST): - (JSC::equivalentYearForDST): - -2008-10-20 Alp Toker <alp@nuanti.com> - - Reviewed by Mark Rowe. + https://bugs.webkit.org/show_bug.cgi?id=26675 - Use pthread instead of GThread where possible in the GTK+ port. This - fixes issues with global initialisation, particularly on GTK+/Win32 - where a late g_thread_init() will cause hangs. + Inherits Register class from FastAllocBase because it has been + instantiated by 'new' in JavaScriptCore/runtime/JSVariableObject.h:149. - * GNUmakefile.am: - * wtf/Platform.h: - * wtf/Threading.h: - * wtf/ThreadingGtk.cpp: - * wtf/ThreadingPthreads.cpp: + * interpreter/Register.h: -2008-10-20 Geoffrey Garen <ggaren@apple.com> +2009-06-24 Zoltan Horvath <hzoltan@inf.u-szeged.hu> Reviewed by Darin Adler. - Fixed https://bugs.webkit.org/show_bug.cgi?id=21735 - Emit profiling instrumentation only if the Web Inspector's profiling - feature is enabled - - 22.2% speedup on empty function call benchmark. - 2.9% speedup on v8 benchmark. - 0.7% speedup on SunSpider. - - Lesser but similar speedups in bytecode. - - * VM/CTI.cpp: - (JSC::CTI::compileOpCall): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): Nixed JITed profiler hooks. Profiler - hooks now have their own opcodes. Added support for compiling profiler - hook opcodes. - - (JSC::CodeBlock::dump): Dump support for the new profiling opcodes. - - * VM/CodeGenerator.h: - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::CodeGenerator): - (JSC::CodeGenerator::emitCall): - (JSC::CodeGenerator::emitConstruct): Conditionally emit profiling hooks - around call and construct, at the call site. (It's easier to get things - right this way, if you have profiled code calling non-profiled code. - Also, you get a slightly more accurate profile, since you charge the full - cost of the call / construct operation to the callee.) - - Also, fixed a bug where construct would fetch the ".prototype" property - from the constructor before evaluating the arguments to the constructor, - incorrectly allowing an "invalid constructor" exception to short-circuit - argument evaluation. I encountered this bug when trying to make - constructor exceptions work with profiling. - - * VM/Machine.cpp: - (JSC::Machine::callEval): Removed obsolete profiler hooks. - - (JSC::Machine::throwException): Added a check for an exception thrown - within a call instruction. We didn't need this before because the call - instruction would check for a valid call before involing the profiler. - (JSC::Machine::execute): Added a didExecute hook at the end of top-level - function invocation, since op_ret no longer does this for us. - - (JSC::Machine::privateExecute): Removed obsolete profiler hooks. Added - profiler opcodes. Changed some ++vPC to vPC[x] notation, since the - latter is better for performance, and it makes reasoning about the - current opcode in exception handling much simpler. + https://bugs.webkit.org/show_bug.cgi?id=26674 - (JSC::Machine::cti_op_call_NotJSFunction): Removed obsolete profiler - hooks. + Inherits HashMap class from FastAllocBase because it has been + instantiated by 'new' in JavaScriptCore/runtime/Structure.cpp:458. - (JSC::Machine::cti_op_create_arguments_no_params): Added missing - CTI_STACK_HACK that I noticed when adding CTI_STACK_HACK to the new - profiler opcode functions. - - (JSC::Machine::cti_op_profile_will_call): - (JSC::Machine::cti_op_profile_did_call): The new profiler opcode - functions. - - (JSC::Machine::cti_op_construct_NotJSConstruct): Removed obsolete profiler - hooks. - - * VM/Machine.h: - (JSC::Machine::isCallOpcode): Helper for exception handling. - - * VM/Opcode.h: Declare new opcodes. - - * kjs/JSGlobalObject.h: - (JSC::JSGlobalObject::supportsProfiling): Added virtual interface that - allows WebCore to specify whether the target global object has the Web - Inspector's profiling feature enabled. - - * profiler/Profiler.cpp: - (JSC::Profiler::willExecute): - (JSC::Profiler::didExecute): - (JSC::Profiler::createCallIdentifier): - * profiler/Profiler.h: Added support for invoking the profiler with - an arbitrary JSValue*, and not a known object. We didn't need this - before because the call instruction would check for a valid call before - involing the profiler. - -2008-10-20 Darin Adler <darin@apple.com> - - Reviewed by Geoff Garen. + * wtf/HashMap.h: - - get CTI working on Windows again - - * VM/CTI.cpp: - (JSC::CTI::emitCTICall): Add an overload for functions that - return JSObject*. - * VM/CTI.h: Use JSValue* and JSObject* as return types for - cti_op functions. Apparently, MSVC doesn't handle returning - the JSValuePtr struct in a register. We'll have to look into - this more. - - * VM/Machine.cpp: - (JSC::Machine::cti_op_convert_this): - (JSC::Machine::cti_op_add): - (JSC::Machine::cti_op_pre_inc): - (JSC::Machine::cti_op_new_object): - (JSC::Machine::cti_op_get_by_id): - (JSC::Machine::cti_op_get_by_id_second): - (JSC::Machine::cti_op_get_by_id_generic): - (JSC::Machine::cti_op_get_by_id_fail): - (JSC::Machine::cti_op_instanceof): - (JSC::Machine::cti_op_del_by_id): - (JSC::Machine::cti_op_mul): - (JSC::Machine::cti_op_new_func): - (JSC::Machine::cti_op_push_activation): - (JSC::Machine::cti_op_call_NotJSFunction): - (JSC::Machine::cti_op_new_array): - (JSC::Machine::cti_op_resolve): - (JSC::Machine::cti_op_construct_JSConstructFast): - (JSC::Machine::cti_op_construct_NotJSConstruct): - (JSC::Machine::cti_op_get_by_val): - (JSC::Machine::cti_op_sub): - (JSC::Machine::cti_op_lesseq): - (JSC::Machine::cti_op_negate): - (JSC::Machine::cti_op_resolve_base): - (JSC::Machine::cti_op_resolve_skip): - (JSC::Machine::cti_op_resolve_global): - (JSC::Machine::cti_op_div): - (JSC::Machine::cti_op_pre_dec): - (JSC::Machine::cti_op_not): - (JSC::Machine::cti_op_eq): - (JSC::Machine::cti_op_lshift): - (JSC::Machine::cti_op_bitand): - (JSC::Machine::cti_op_rshift): - (JSC::Machine::cti_op_bitnot): - (JSC::Machine::cti_op_new_func_exp): - (JSC::Machine::cti_op_mod): - (JSC::Machine::cti_op_less): - (JSC::Machine::cti_op_neq): - (JSC::Machine::cti_op_urshift): - (JSC::Machine::cti_op_bitxor): - (JSC::Machine::cti_op_new_regexp): - (JSC::Machine::cti_op_bitor): - (JSC::Machine::cti_op_call_eval): - (JSC::Machine::cti_op_throw): - (JSC::Machine::cti_op_next_pname): - (JSC::Machine::cti_op_typeof): - (JSC::Machine::cti_op_is_undefined): - (JSC::Machine::cti_op_is_boolean): - (JSC::Machine::cti_op_is_number): - (JSC::Machine::cti_op_is_string): - (JSC::Machine::cti_op_is_object): - (JSC::Machine::cti_op_is_function): - (JSC::Machine::cti_op_stricteq): - (JSC::Machine::cti_op_nstricteq): - (JSC::Machine::cti_op_to_jsnumber): - (JSC::Machine::cti_op_in): - (JSC::Machine::cti_op_push_new_scope): - (JSC::Machine::cti_op_del_by_val): - (JSC::Machine::cti_op_new_error): - (JSC::Machine::cti_vm_throw): - Change these functions to return pointer types, and never - JSValuePtr. - * VM/Machine.h: Ditto. - -2008-10-20 Geoffrey Garen <ggaren@apple.com> +2009-06-24 Oliver Hunt <oliver@apple.com> Reviewed by Darin Adler. - - Fixed some recent break-age in bytecode mode. - - * VM/CodeBlock.cpp: - (JSC::CodeBlock::printStructureIDs): Fixed up an ASSERT caused by - Gavin's last checkin. This is a temporary fix so I can keep on moving. - I'll send email about what I think is an underlying problem soon. - - * VM/Machine.cpp: - (JSC::Machine::privateExecute): Removed a redundant and sometimes - incorrect cast, which started ASSERTing after Darin's last checkin. - -2008-10-20 Darin Adler <darin@apple.com> - - - another similar Windows build fix - - * VM/CTI.cpp: Changed return type to JSObject* instead of JSValuePtr. - -2008-10-20 Darin Adler <darin@apple.com> - - - try to fix Windows build - - * VM/CTI.cpp: Use JSValue* instead of JSValuePtr for ctiTrampoline. - * VM/CTI.h: Ditto. - -2008-10-19 Darin Adler <darin@apple.com> - - Reviewed by Cameron Zwarich. - - - finish https://bugs.webkit.org/show_bug.cgi?id=21732 - improve performance by eliminating JSValue as a base class for JSCell - - * VM/Machine.cpp: - (JSC::Machine::cti_op_call_profiler): Use asFunction. - (JSC::Machine::cti_vm_lazyLinkCall): Ditto. - (JSC::Machine::cti_op_construct_JSConstructFast): Use asObject. - - * kjs/JSCell.h: Re-sort friend classes. Eliminate inheritance from - JSValue. Changed cast in asCell from static_cast to reinterpret_cast. - Removed JSValue::getNumber(double&) and one of JSValue::getObject - overloads. - - * kjs/JSValue.h: Made the private constructor and destructor both - non-virtual and also remove the definitions. This class can never - be instantiated or derived. - -2008-10-19 Darin Adler <darin@apple.com> - - Reviewed by Cameron Zwarich. - - - next step of https://bugs.webkit.org/show_bug.cgi?id=21732 - improve performance by eliminating JSValue as a base class for JSCell - - Change JSValuePtr from a typedef into a class. This allows us to support - conversion from JSCell* to JSValuePtr even if JSCell isn't derived from - JSValue. - - * JavaScriptCore.exp: Updated symbols that involve JSValuePtr, since - it's now a distinct type. - - * API/APICast.h: - (toRef): Extract the JSValuePtr payload explicitly since we can't just - cast any more. - * VM/CTI.cpp: - (JSC::CTI::asInteger): Ditto. - - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::addConstant): Get at the payload directly. - (JSC::CodeGenerator::emitLoad): Added an overload of JSCell* because - otherwise classes derived from JSValue end up calling the bool - overload instead of JSValuePtr. - * VM/CodeGenerator.h: Ditto. Also update traits to use JSValue* - and the payload functions. - - * VM/Register.h: Added a JSCell* overload and use of payload functions. - - * kjs/JSCell.h: - (JSC::asCell): Use payload function. - (JSC::JSValue::asCell): Use JSValue* instead of JSValuePtr. - (JSC::JSValuePtr::JSValuePtr): Added. Constructor that takes JSCell* - and creates a JSValuePtr. - - * kjs/JSImmediate.h: Added JSValuePtr class. Also updated makeValue - and makeInt to work with JSValue* and the payload function. - - * kjs/JSValue.h: Added == and != operators for JSValuePtr. Put them - here because eventually all the JSValue functions should go here - except what's needed by JSImmediate. Also fix asValue to use - JSValue* instead of JSValuePtr. - - * kjs/PropertySlot.h: Change constructor to take JSValuePtr. - - * kjs/protect.h: Update gcProtect functions to work with JSCell* - as well as JSValuePtr. Also updated the ProtectedPtr<JSValuePtr> - specialization to work more directly. Also changed all the call - sites to use gcProtectNullTolerant. - -2008-10-19 Darin Adler <darin@apple.com> - - Reviewed by Oliver Hunt. - - - next step of https://bugs.webkit.org/show_bug.cgi?id=21732 - improve performance by eliminating JSValue as a base class for JSCell - - Remove most uses of JSValue, which will be removed in a future patch. - - * VM/Machine.cpp: - (JSC::fastToUInt32): Call toUInt32SlowCase function; no longer a member - of JSValue. - * kjs/JSNumberCell.h: - (JSC::JSNumberCell::toInt32): Ditto. - (JSC::JSNumberCell::toUInt32): Ditto. - - * kjs/JSValue.cpp: - (JSC::toInt32SlowCase): Made a non-member function. - (JSC::JSValue::toInt32SlowCase): Changed to call non-member function. - (JSC::toUInt32SlowCase): More of the same. - (JSC::JSValue::toUInt32SlowCase): Ditto. - - * kjs/JSValue.h: Moved static member function so they are no longer - member functions at all. - - * VM/CTI.h: Removed forward declaration of JSValue. - * VM/ExceptionHelpers.h: Ditto. - * kjs/CallData.h: Ditto. - * kjs/ConstructData.h: Ditto. - * kjs/JSGlobalObjectFunctions.h: Ditto. - * kjs/PropertyMap.h: Ditto. - * kjs/StructureID.h: Ditto. - * kjs/collector.h: Ditto. - * kjs/completion.h: Ditto. - - * kjs/grammar.y: - (JSC::makeBitwiseNotNode): Call new non-member toInt32 function. - (JSC::makeLeftShiftNode): More of the same. - (JSC::makeRightShiftNode): Ditto. - - * kjs/protect.h: Added a specialization for ProtectedPtr<JSValuePtr> - so this can be used with JSValuePtr. - -2008-10-18 Darin Adler <darin@apple.com> - - Reviewed by Oliver Hunt. - - - next step of https://bugs.webkit.org/show_bug.cgi?id=21732 - improve performance by eliminating JSValue as a base class for JSCell - - Tweak a little more to get closer to where we can make JSValuePtr a class. - - * API/APICast.h: - (toJS): Change back to JSValue* here, since we're converting the - pointer type. - * VM/CTI.cpp: - (JSC::CTI::unlinkCall): Call asPointer. - * VM/CTI.h: Cast to JSValue* here, since it's a pointer cast. - * kjs/DebuggerCallFrame.h: - (JSC::DebuggerCallFrame::DebuggerCallFrame): Call noValue. - * kjs/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): Call noValue. - * kjs/JSImmediate.cpp: - (JSC::JSImmediate::toObject): Remove unneeded const_cast. - * kjs/JSWrapperObject.h: - (JSC::JSWrapperObject::JSWrapperObject): Call noValue. - -2008-10-18 Darin Adler <darin@apple.com> - - - fix non-all-in-one build - - * kjs/completion.h: - (JSC::Completion::Completion): Add include of JSValue.h. - -2008-10-18 Darin Adler <darin@apple.com> - - Reviewed by Oliver Hunt. - - - fix assertions I introduced with my casting changes - - These were showing up as failures in the JavaScriptCore tests. - - * VM/Machine.cpp: - (JSC::Machine::cti_op_instanceof): Remove the bogus asCell casting that - was at the top of the function, and instead cast at the point of use. - (JSC::Machine::cti_op_construct_NotJSConstruct): Moved the cast to - object after checking the construct type. - -2008-10-18 Darin Adler <darin@apple.com> - - - fix non-all-in-one build - - * kjs/JSGlobalObjectFunctions.h: Add include of JSImmedate.h (for now). - -2008-10-18 Darin Adler <darin@apple.com> - - - fix build - - * kjs/interpreter.h: Include JSValue.h instead of JSImmediate.h. - -2008-10-18 Darin Adler <darin@apple.com> - - * kjs/interpreter.h: Fix include of JSImmediate.h. - -2008-10-18 Darin Adler <darin@apple.com> - - - fix non-all-in-one build - - * kjs/interpreter.h: Add include of JSImmediate.h. - -2008-10-18 Darin Adler <darin@apple.com> - - - fix non-all-in-one build - - * kjs/ConstructData.h: Add include of JSImmedate.h (for now). - -2008-10-18 Darin Adler <darin@apple.com> - - - try to fix Windows build - - * VM/Machine.cpp: - (JSC::Machine::Machine): Use JSCell* type since MSVC seems to only allow - calling ~JSCell directly if it's a JSCell*. - -2008-10-18 Darin Adler <darin@apple.com> - - Reviewed by Cameron Zwarich. - - - next step on https://bugs.webkit.org/show_bug.cgi?id=21732 - improve performance by eliminating JSValue as a base class for JSCell - - Use JSValuePtr everywhere instead of JSValue*. In the future, we'll be - changing JSValuePtr to be a class, and then eventually renaming it - to JSValue once that's done. - - * JavaScriptCore.exp: Update entry points, since some now take JSValue* - instead of const JSValue*. - - * API/APICast.h: - * API/JSCallbackConstructor.h: - * API/JSCallbackFunction.cpp: - * API/JSCallbackFunction.h: - * API/JSCallbackObject.h: - * API/JSCallbackObjectFunctions.h: - * API/JSContextRef.cpp: - * API/JSObjectRef.cpp: - * API/JSValueRef.cpp: - * VM/CTI.cpp: - * VM/CTI.h: - * VM/CodeBlock.cpp: - * VM/CodeBlock.h: - * VM/CodeGenerator.cpp: - * VM/CodeGenerator.h: - * VM/ExceptionHelpers.cpp: - * VM/ExceptionHelpers.h: - * VM/JSPropertyNameIterator.cpp: - * VM/JSPropertyNameIterator.h: - * VM/Machine.cpp: - * VM/Machine.h: - * VM/Register.h: - * kjs/ArgList.cpp: - * kjs/ArgList.h: - * kjs/Arguments.cpp: - * kjs/Arguments.h: - * kjs/ArrayConstructor.cpp: - * kjs/ArrayPrototype.cpp: - * kjs/BooleanConstructor.cpp: - * kjs/BooleanConstructor.h: - * kjs/BooleanObject.h: - * kjs/BooleanPrototype.cpp: - * kjs/CallData.cpp: - * kjs/CallData.h: - * kjs/ConstructData.cpp: - * kjs/ConstructData.h: - * kjs/DateConstructor.cpp: - * kjs/DateInstance.h: - * kjs/DatePrototype.cpp: - * kjs/DebuggerCallFrame.cpp: - * kjs/DebuggerCallFrame.h: - * kjs/ErrorConstructor.cpp: - * kjs/ErrorPrototype.cpp: - * kjs/ExecState.cpp: - * kjs/ExecState.h: - * kjs/FunctionConstructor.cpp: - * kjs/FunctionPrototype.cpp: - * kjs/GetterSetter.cpp: - * kjs/GetterSetter.h: - * kjs/InternalFunction.h: - * kjs/JSActivation.cpp: - * kjs/JSActivation.h: - * kjs/JSArray.cpp: - * kjs/JSArray.h: - * kjs/JSCell.cpp: - * kjs/JSCell.h: - * kjs/JSFunction.cpp: - * kjs/JSFunction.h: - * kjs/JSGlobalData.h: - * kjs/JSGlobalObject.cpp: - * kjs/JSGlobalObject.h: - * kjs/JSGlobalObjectFunctions.cpp: - * kjs/JSGlobalObjectFunctions.h: - * kjs/JSImmediate.cpp: - * kjs/JSImmediate.h: - * kjs/JSNotAnObject.cpp: - * kjs/JSNotAnObject.h: - * kjs/JSNumberCell.cpp: - * kjs/JSNumberCell.h: - * kjs/JSObject.cpp: - * kjs/JSObject.h: - * kjs/JSStaticScopeObject.cpp: - * kjs/JSStaticScopeObject.h: - * kjs/JSString.cpp: - * kjs/JSString.h: - * kjs/JSValue.h: - * kjs/JSVariableObject.h: - * kjs/JSWrapperObject.h: - * kjs/MathObject.cpp: - * kjs/NativeErrorConstructor.cpp: - * kjs/NumberConstructor.cpp: - * kjs/NumberConstructor.h: - * kjs/NumberObject.cpp: - * kjs/NumberObject.h: - * kjs/NumberPrototype.cpp: - * kjs/ObjectConstructor.cpp: - * kjs/ObjectPrototype.cpp: - * kjs/ObjectPrototype.h: - * kjs/PropertyMap.h: - * kjs/PropertySlot.cpp: - * kjs/PropertySlot.h: - * kjs/RegExpConstructor.cpp: - * kjs/RegExpConstructor.h: - * kjs/RegExpMatchesArray.h: - * kjs/RegExpObject.cpp: - * kjs/RegExpObject.h: - * kjs/RegExpPrototype.cpp: - * kjs/Shell.cpp: - * kjs/StringConstructor.cpp: - * kjs/StringObject.cpp: - * kjs/StringObject.h: - * kjs/StringObjectThatMasqueradesAsUndefined.h: - * kjs/StringPrototype.cpp: - * kjs/StructureID.cpp: - * kjs/StructureID.h: - * kjs/collector.cpp: - * kjs/collector.h: - * kjs/completion.h: - * kjs/grammar.y: - * kjs/interpreter.cpp: - * kjs/interpreter.h: - * kjs/lookup.cpp: - * kjs/lookup.h: - * kjs/nodes.h: - * kjs/operations.cpp: - * kjs/operations.h: - * kjs/protect.h: - * profiler/ProfileGenerator.cpp: - Replace JSValue* with JSValuePtr. - -2008-10-18 Darin Adler <darin@apple.com> - - * VM/Machine.cpp: - (JSC::Machine::cti_op_call_eval): Removed stray parentheses from my - last check-in. - -2008-10-18 Darin Adler <darin@apple.com> - - Reviewed by Oliver Hunt. - - - first step of https://bugs.webkit.org/show_bug.cgi?id=21732 - improve performance by eliminating JSValue as a base class for JSCell - - Remove casts from JSValue* to derived classes, replacing them with - calls to inline casting functions. These functions are also a bit - better than aidrect cast because they also do a runtime assertion. - - Removed use of 0 as for JSValue*, changing call sites to use a - noValue() function instead. - - Move things needed by classes derived from JSValue out of the class, - since the classes won't be deriving from JSValue any more soon. - - I did most of these changes by changing JSValue to not be JSValue* any - more, then fixing a lot of the compilation problems, then rolling out - the JSValue change. - - 1.011x as fast on SunSpider (presumably due to some of the Machine.cpp changes) - - * API/APICast.h: Removed unneeded forward declarations. - - * API/JSCallbackObject.h: Added an asCallbackObject function for casting. - * API/JSCallbackObjectFunctions.h: - (JSC::JSCallbackObject::asCallbackObject): Added. - (JSC::JSCallbackObject::getOwnPropertySlot): Use asObject. - (JSC::JSCallbackObject::call): Use noValue. - (JSC::JSCallbackObject::staticValueGetter): Use asCallbackObject. - (JSC::JSCallbackObject::staticFunctionGetter): Ditto. - (JSC::JSCallbackObject::callbackGetter): Ditto. - - * JavaScriptCore.exp: Updated. - - * JavaScriptCore.xcodeproj/project.pbxproj: Added RegExpMatchesArray.h. - - * VM/CTI.cpp: - (JSC::CTI::asInteger): Added. For use casting a JSValue to an integer. - (JSC::CTI::emitGetArg): Use asInteger. - (JSC::CTI::emitGetPutArg): Ditto. - (JSC::CTI::getConstantImmediateNumericArg): Ditto. Also use noValue. - (JSC::CTI::emitInitRegister): Use asInteger. - (JSC::CTI::getDeTaggedConstantImmediate): Ditto. - (JSC::CTI::compileOpCallInitializeCallFrame): Ditto. - (JSC::CTI::compileOpCall): Ditto. - (JSC::CTI::compileOpStrictEq): Ditto. - (JSC::CTI::privateCompileMainPass): Ditto. - (JSC::CTI::privateCompileGetByIdProto): Ditto. - (JSC::CTI::privateCompileGetByIdChain): Ditto. - (JSC::CTI::privateCompilePutByIdTransition): Ditto. - * VM/CTI.h: Rewrite the ARG-related macros to use C++ casts instead of - C casts and get rid of some extra parentheses. Addd declaration of - asInteger. - - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::emitEqualityOp): Use asString. - (JSC::CodeGenerator::emitLoad): Use noValue. - (JSC::CodeGenerator::findScopedProperty): Change globalObject argument - to JSObject* instead of JSValue*. - (JSC::CodeGenerator::emitResolve): Remove unneeded cast. - (JSC::CodeGenerator::emitGetScopedVar): Use asCell. - (JSC::CodeGenerator::emitPutScopedVar): Ditto. - * VM/CodeGenerator.h: Changed out argument of findScopedProperty. - Also change the JSValueMap to use PtrHash explicitly instead of - getting it from DefaultHash. - - * VM/JSPropertyNameIterator.cpp: - (JSC::JSPropertyNameIterator::toPrimitive): Use noValue. - * VM/JSPropertyNameIterator.h: - (JSC::JSPropertyNameIterator::next): Ditto. - - * VM/Machine.cpp: - (JSC::fastIsNumber): Moved isImmediate check here instead of - checking for 0 inside Heap::isNumber. Use asCell and asNumberCell. - (JSC::fastToInt32): Ditto. - (JSC::fastToUInt32): Ditto. - (JSC::jsLess): Use asString. - (JSC::jsLessEq): Ditto. - (JSC::jsAdd): Ditto. - (JSC::jsTypeStringForValue): Use asObject. - (JSC::jsIsObjectType): Ditto. - (JSC::jsIsFunctionType): Ditto. - (JSC::inlineResolveBase): Use noValue. - (JSC::Machine::callEval): Use asString. Initialize result to - undefined, not 0. - (JSC::Machine::Machine): Remove unneeded casts to JSCell*. - (JSC::Machine::throwException): Use asObject. - (JSC::Machine::debug): Remove explicit calls to the DebuggerCallFrame - constructor. - (JSC::Machine::checkTimeout): Use noValue. - (JSC::cachePrototypeChain): Use asObject. - (JSC::Machine::tryCachePutByID): Use asCell. - (JSC::Machine::tryCacheGetByID): Use aCell and asObject. - (JSC::Machine::privateExecute): Use noValue, asCell, asObject, asString, - asArray, asActivation, asFunction. Changed code that creates call frames - for host functions to pass 0 for the function pointer -- the call frame - needs a JSFunction* and a host function object is not one. This was - caught by the assertions in the casting functions. Also remove some - unneeded casts in cases where two values are compared. - (JSC::Machine::retrieveLastCaller): Use noValue. - (JSC::Machine::tryCTICachePutByID): Use asCell. - (JSC::Machine::tryCTICacheGetByID): Use aCell and asObject. - (JSC::setUpThrowTrampolineReturnAddress): Added this function to restore - the PIC-branch-avoidance that was recently lost. - (JSC::Machine::cti_op_add): Use asString. - (JSC::Machine::cti_op_instanceof): Use asCell and asObject. - (JSC::Machine::cti_op_call_JSFunction): Use asFunction. - (JSC::Machine::cti_op_call_NotJSFunction): Changed code to pass 0 for - the function pointer, since we don't have a JSFunction. Use asObject. - (JSC::Machine::cti_op_tear_off_activation): Use asActivation. - (JSC::Machine::cti_op_construct_JSConstruct): Use asFunction and asObject. - (JSC::Machine::cti_op_construct_NotJSConstruct): use asObject. - (JSC::Machine::cti_op_get_by_val): Use asArray and asString. - (JSC::Machine::cti_op_resolve_func): Use asPointer; this helps prepare - us for a situation where JSValue is not a pointer. - (JSC::Machine::cti_op_put_by_val): Use asArray. - (JSC::Machine::cti_op_put_by_val_array): Ditto. - (JSC::Machine::cti_op_resolve_global): Use asGlobalObject. - (JSC::Machine::cti_op_post_inc): Change VM_CHECK_EXCEPTION_2 to - VM_CHECK_EXCEPTION_AT_END, since there's no observable work done after - that point. Also use asPointer. - (JSC::Machine::cti_op_resolve_with_base): Use asPointer. - (JSC::Machine::cti_op_post_dec): Change VM_CHECK_EXCEPTION_2 to - VM_CHECK_EXCEPTION_AT_END, since there's no observable work done after - that point. Also use asPointer. - (JSC::Machine::cti_op_call_eval): Use asObject, noValue, and change - VM_CHECK_EXCEPTION_ARG to VM_THROW_EXCEPTION_AT_END. - (JSC::Machine::cti_op_throw): Change return value to a JSValue*. - (JSC::Machine::cti_op_in): Use asObject. - (JSC::Machine::cti_op_switch_char): Use asString. - (JSC::Machine::cti_op_switch_string): Ditto. - (JSC::Machine::cti_op_put_getter): Use asObject. - (JSC::Machine::cti_op_put_setter): Ditto. - (JSC::Machine::cti_vm_throw): Change return value to a JSValue*. - Use noValue. - * VM/Machine.h: Change return values of both cti_op_throw and - cti_vm_throw to JSValue*. - - * VM/Register.h: Remove nullJSValue, which is the same thing - as noValue(). Also removed unneeded definition of JSValue. - - * kjs/ArgList.h: Removed unneeded definition of JSValue. - - * kjs/Arguments.h: - (JSC::asArguments): Added. - - * kjs/ArrayPrototype.cpp: - (JSC::getProperty): Use noValue. - (JSC::arrayProtoFuncToString): Use asArray. - (JSC::arrayProtoFuncToLocaleString): Ditto. - (JSC::arrayProtoFuncConcat): Ditto. - (JSC::arrayProtoFuncPop): Ditto. Also removed unneeded initialization - of the result, which is set in both sides of the branch. - (JSC::arrayProtoFuncPush): Ditto. - (JSC::arrayProtoFuncShift): Removed unneeded initialization - of the result, which is set in both sides of the branch. - (JSC::arrayProtoFuncSort): Use asArray. - - * kjs/BooleanObject.h: - (JSC::asBooleanObject): Added. - - * kjs/BooleanPrototype.cpp: - (JSC::booleanProtoFuncToString): Use asBooleanObject. - (JSC::booleanProtoFuncValueOf): Ditto. - - * kjs/CallData.cpp: - (JSC::call): Use asObject and asFunction. - * kjs/ConstructData.cpp: - (JSC::construct): Ditto. - - * kjs/DateConstructor.cpp: - (JSC::constructDate): Use asDateInstance. - - * kjs/DateInstance.h: - (JSC::asDateInstance): Added. - - * kjs/DatePrototype.cpp: - (JSC::dateProtoFuncToString): Use asDateInstance. - (JSC::dateProtoFuncToUTCString): Ditto. - (JSC::dateProtoFuncToDateString): Ditto. - (JSC::dateProtoFuncToTimeString): Ditto. - (JSC::dateProtoFuncToLocaleString): Ditto. - (JSC::dateProtoFuncToLocaleDateString): Ditto. - (JSC::dateProtoFuncToLocaleTimeString): Ditto. - (JSC::dateProtoFuncValueOf): Ditto. - (JSC::dateProtoFuncGetTime): Ditto. - (JSC::dateProtoFuncGetFullYear): Ditto. - (JSC::dateProtoFuncGetUTCFullYear): Ditto. - (JSC::dateProtoFuncToGMTString): Ditto. - (JSC::dateProtoFuncGetMonth): Ditto. - (JSC::dateProtoFuncGetUTCMonth): Ditto. - (JSC::dateProtoFuncGetDate): Ditto. - (JSC::dateProtoFuncGetUTCDate): Ditto. - (JSC::dateProtoFuncGetDay): Ditto. - (JSC::dateProtoFuncGetUTCDay): Ditto. - (JSC::dateProtoFuncGetHours): Ditto. - (JSC::dateProtoFuncGetUTCHours): Ditto. - (JSC::dateProtoFuncGetMinutes): Ditto. - (JSC::dateProtoFuncGetUTCMinutes): Ditto. - (JSC::dateProtoFuncGetSeconds): Ditto. - (JSC::dateProtoFuncGetUTCSeconds): Ditto. - (JSC::dateProtoFuncGetMilliSeconds): Ditto. - (JSC::dateProtoFuncGetUTCMilliseconds): Ditto. - (JSC::dateProtoFuncGetTimezoneOffset): Ditto. - (JSC::dateProtoFuncSetTime): Ditto. - (JSC::setNewValueFromTimeArgs): Ditto. - (JSC::setNewValueFromDateArgs): Ditto. - (JSC::dateProtoFuncSetYear): Ditto. - (JSC::dateProtoFuncGetYear): Ditto. - - * kjs/DebuggerCallFrame.cpp: - (JSC::DebuggerCallFrame::thisObject): Use asObject. - (JSC::DebuggerCallFrame::evaluate): Use noValue. - * kjs/DebuggerCallFrame.h: Added a constructor that - takes only a callFrame. - - * kjs/ExecState.h: - (JSC::ExecState::clearException): Use noValue. - - * kjs/FunctionPrototype.cpp: - (JSC::functionProtoFuncToString): Use asFunction. - (JSC::functionProtoFuncApply): Use asArguments and asArray. - - * kjs/GetterSetter.cpp: - (JSC::GetterSetter::getPrimitiveNumber): Use noValue. - - * kjs/GetterSetter.h: - (JSC::asGetterSetter): Added. - - * kjs/InternalFunction.cpp: - (JSC::InternalFunction::name): Use asString. - - * kjs/InternalFunction.h: - (JSC::asInternalFunction): Added. - - * kjs/JSActivation.cpp: - (JSC::JSActivation::argumentsGetter): Use asActivation. - - * kjs/JSActivation.h: - (JSC::asActivation): Added. - - * kjs/JSArray.cpp: - (JSC::JSArray::putSlowCase): Use noValue. - (JSC::JSArray::deleteProperty): Ditto. - (JSC::JSArray::increaseVectorLength): Ditto. - (JSC::JSArray::setLength): Ditto. - (JSC::JSArray::pop): Ditto. - (JSC::JSArray::sort): Ditto. - (JSC::JSArray::compactForSorting): Ditto. - * kjs/JSArray.h: - (JSC::asArray): Added. - - * kjs/JSCell.cpp: - (JSC::JSCell::getJSNumber): Use noValue. - - * kjs/JSCell.h: - (JSC::asCell): Added. - (JSC::JSValue::asCell): Changed to not preserve const. - Given the wide use of JSValue* and JSCell*, it's not - really useful to use const. - (JSC::JSValue::isNumber): Use asValue. - (JSC::JSValue::isString): Ditto. - (JSC::JSValue::isGetterSetter): Ditto. - (JSC::JSValue::isObject): Ditto. - (JSC::JSValue::getNumber): Ditto. - (JSC::JSValue::getString): Ditto. - (JSC::JSValue::getObject): Ditto. - (JSC::JSValue::getCallData): Ditto. - (JSC::JSValue::getConstructData): Ditto. - (JSC::JSValue::getUInt32): Ditto. - (JSC::JSValue::getTruncatedInt32): Ditto. - (JSC::JSValue::getTruncatedUInt32): Ditto. - (JSC::JSValue::mark): Ditto. - (JSC::JSValue::marked): Ditto. - (JSC::JSValue::toPrimitive): Ditto. - (JSC::JSValue::getPrimitiveNumber): Ditto. - (JSC::JSValue::toBoolean): Ditto. - (JSC::JSValue::toNumber): Ditto. - (JSC::JSValue::toString): Ditto. - (JSC::JSValue::toObject): Ditto. - (JSC::JSValue::toThisObject): Ditto. - (JSC::JSValue::needsThisConversion): Ditto. - (JSC::JSValue::toThisString): Ditto. - (JSC::JSValue::getJSNumber): Ditto. - - * kjs/JSFunction.cpp: - (JSC::JSFunction::argumentsGetter): Use asFunction. - (JSC::JSFunction::callerGetter): Ditto. - (JSC::JSFunction::lengthGetter): Ditto. - (JSC::JSFunction::construct): Use asObject. - - * kjs/JSFunction.h: - (JSC::asFunction): Added. - - * kjs/JSGlobalObject.cpp: - (JSC::lastInPrototypeChain): Use asObject. - - * kjs/JSGlobalObject.h: - (JSC::asGlobalObject): Added. - (JSC::ScopeChainNode::globalObject): Use asGlobalObject. - - * kjs/JSImmediate.h: Added noValue, asPointer, and makeValue - functions. Use rawValue, makeValue, and noValue consistently - instead of doing reinterpret_cast in various functions. - - * kjs/JSNumberCell.h: - (JSC::asNumberCell): Added. - (JSC::JSValue::uncheckedGetNumber): Use asValue and asNumberCell. - (JSC::JSValue::toJSNumber): Use asValue. - - * kjs/JSObject.cpp: - (JSC::JSObject::put): Use asObject and asGetterSetter. - (JSC::callDefaultValueFunction): Use noValue. - (JSC::JSObject::defineGetter): Use asGetterSetter. - (JSC::JSObject::defineSetter): Ditto. - (JSC::JSObject::lookupGetter): Ditto. Also use asObject. - (JSC::JSObject::lookupSetter): Ditto. - (JSC::JSObject::hasInstance): Use asObject. - (JSC::JSObject::fillGetterPropertySlot): Use asGetterSetter. - - * kjs/JSObject.h: - (JSC::JSObject::getDirect): Use noValue. - (JSC::asObject): Added. - (JSC::JSValue::isObject): Use asValue. - (JSC::JSObject::get): Removed unneeded const_cast. - (JSC::JSObject::getPropertySlot): Use asObject. - (JSC::JSValue::get): Removed unneeded const_cast. - Use asValue, asCell, and asObject. - (JSC::JSValue::put): Ditto. - (JSC::JSObject::allocatePropertyStorageInline): Fixed spelling - of "oldPropertStorage". - - * kjs/JSString.cpp: - (JSC::JSString::getOwnPropertySlot): Use asObject. - - * kjs/JSString.h: - (JSC::asString): Added. - (JSC::JSValue::toThisJSString): Use asValue. - - * kjs/JSValue.h: Make PreferredPrimitiveType a top level enum - instead of a member of JSValue. Added an asValue function that - returns this. Removed overload of asCell for const. Use asValue - instead of getting right at this. - - * kjs/ObjectPrototype.cpp: - (JSC::objectProtoFuncIsPrototypeOf): Use asObject. - (JSC::objectProtoFuncDefineGetter): Ditto. - (JSC::objectProtoFuncDefineSetter): Ditto. - - * kjs/PropertySlot.h: - (JSC::PropertySlot::PropertySlot): Take a const JSValue* so the - callers don't have to worry about const. - (JSC::PropertySlot::clearBase): Use noValue. - (JSC::PropertySlot::clearValue): Ditto. - - * kjs/RegExpConstructor.cpp: - (JSC::regExpConstructorDollar1): Use asRegExpConstructor. - (JSC::regExpConstructorDollar2): Ditto. - (JSC::regExpConstructorDollar3): Ditto. - (JSC::regExpConstructorDollar4): Ditto. - (JSC::regExpConstructorDollar5): Ditto. - (JSC::regExpConstructorDollar6): Ditto. - (JSC::regExpConstructorDollar7): Ditto. - (JSC::regExpConstructorDollar8): Ditto. - (JSC::regExpConstructorDollar9): Ditto. - (JSC::regExpConstructorInput): Ditto. - (JSC::regExpConstructorMultiline): Ditto. - (JSC::regExpConstructorLastMatch): Ditto. - (JSC::regExpConstructorLastParen): Ditto. - (JSC::regExpConstructorLeftContext): Ditto. - (JSC::regExpConstructorRightContext): Ditto. - (JSC::setRegExpConstructorInput): Ditto. - (JSC::setRegExpConstructorMultiline): Ditto. - (JSC::constructRegExp): Use asObject. - - * kjs/RegExpConstructor.h: - (JSC::asRegExpConstructor): Added. - - * kjs/RegExpObject.cpp: - (JSC::regExpObjectGlobal): Use asRegExpObject. - (JSC::regExpObjectIgnoreCase): Ditto. - (JSC::regExpObjectMultiline): Ditto. - (JSC::regExpObjectSource): Ditto. - (JSC::regExpObjectLastIndex): Ditto. - (JSC::setRegExpObjectLastIndex): Ditto. - (JSC::callRegExpObject): Ditto. - - * kjs/RegExpObject.h: - (JSC::asRegExpObject): Added. - - * kjs/RegExpPrototype.cpp: - (JSC::regExpProtoFuncTest): Use asRegExpObject. - (JSC::regExpProtoFuncExec): Ditto. - (JSC::regExpProtoFuncCompile): Ditto. - (JSC::regExpProtoFuncToString): Ditto. - - * kjs/StringObject.h: - (JSC::StringObject::internalValue): Use asString. - (JSC::asStringObject): Added. - - * kjs/StringPrototype.cpp: - (JSC::stringProtoFuncReplace): Use asRegExpObject. - (JSC::stringProtoFuncToString): Ue asStringObject. - (JSC::stringProtoFuncMatch): Use asRegExpObject. - (JSC::stringProtoFuncSearch): Ditto. - (JSC::stringProtoFuncSplit): Ditto. - - * kjs/StructureID.cpp: - (JSC::StructureID::getEnumerablePropertyNames): Use asObject. - (JSC::StructureID::createCachedPrototypeChain): Ditto. - (JSC::StructureIDChain::StructureIDChain): Use asCell and asObject. - - * kjs/collector.h: - (JSC::Heap::isNumber): Removed null handling. This can only be called - on valid cells. - (JSC::Heap::cellBlock): Removed overload for const and non-const. - Whether the JSCell* is const or not really should have no effect on - whether you can modify the collector block it's in. - - * kjs/interpreter.cpp: - (JSC::Interpreter::evaluate): Use noValue and noObject. - - * kjs/nodes.cpp: - (JSC::FunctionCallResolveNode::emitCode): Use JSObject for the global - object rather than JSValue. - (JSC::PostfixResolveNode::emitCode): Ditto. - (JSC::PrefixResolveNode::emitCode): Ditto. - (JSC::ReadModifyResolveNode::emitCode): Ditto. - (JSC::AssignResolveNode::emitCode): Ditto. - - * kjs/operations.h: - (JSC::equalSlowCaseInline): Use asString, asCell, asNumberCell, - (JSC::strictEqualSlowCaseInline): Ditto. - -2008-10-18 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Oliver Hunt. - - Bug 21702: Special op_create_activation for the case where there are no named parameters - <https://bugs.webkit.org/show_bug.cgi?id=21702> - - This is a 2.5% speedup on the V8 Raytrace benchmark and a 1.1% speedup - on the V8 Earley-Boyer benchmark. - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): - * VM/Machine.cpp: - (JSC::Machine::cti_op_create_arguments_no_params): - * VM/Machine.h: - * kjs/Arguments.h: - (JSC::Arguments::): - (JSC::Arguments::Arguments): - -2008-10-17 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Cameron Zwarich. - - - in debug builds, alter the stack to avoid blowing out MallocStackLogging - - (In essence, while executing a CTI function we alter the return - address to jscGeneratedNativeCode so that a single consistent - function is on the stack instead of many random functions without - symbols.) - - * VM/CTI.h: - * VM/Machine.cpp: - (JSC::doSetReturnAddress): - (JSC::): - (JSC::StackHack::StackHack): - (JSC::StackHack::~StackHack): - (JSC::Machine::cti_op_convert_this): - (JSC::Machine::cti_op_end): - (JSC::Machine::cti_op_add): - (JSC::Machine::cti_op_pre_inc): - (JSC::Machine::cti_timeout_check): - (JSC::Machine::cti_register_file_check): - (JSC::Machine::cti_op_loop_if_less): - (JSC::Machine::cti_op_loop_if_lesseq): - (JSC::Machine::cti_op_new_object): - (JSC::Machine::cti_op_put_by_id): - (JSC::Machine::cti_op_put_by_id_second): - (JSC::Machine::cti_op_put_by_id_generic): - (JSC::Machine::cti_op_put_by_id_fail): - (JSC::Machine::cti_op_get_by_id): - (JSC::Machine::cti_op_get_by_id_second): - (JSC::Machine::cti_op_get_by_id_generic): - (JSC::Machine::cti_op_get_by_id_fail): - (JSC::Machine::cti_op_instanceof): - (JSC::Machine::cti_op_del_by_id): - (JSC::Machine::cti_op_mul): - (JSC::Machine::cti_op_new_func): - (JSC::Machine::cti_op_call_profiler): - (JSC::Machine::cti_op_call_JSFunction): - (JSC::Machine::cti_vm_lazyLinkCall): - (JSC::Machine::cti_vm_compile): - (JSC::Machine::cti_op_push_activation): - (JSC::Machine::cti_op_call_NotJSFunction): - (JSC::Machine::cti_op_create_arguments): - (JSC::Machine::cti_op_tear_off_activation): - (JSC::Machine::cti_op_tear_off_arguments): - (JSC::Machine::cti_op_ret_profiler): - (JSC::Machine::cti_op_ret_scopeChain): - (JSC::Machine::cti_op_new_array): - (JSC::Machine::cti_op_resolve): - (JSC::Machine::cti_op_construct_JSConstructFast): - (JSC::Machine::cti_op_construct_JSConstruct): - (JSC::Machine::cti_op_construct_NotJSConstruct): - (JSC::Machine::cti_op_get_by_val): - (JSC::Machine::cti_op_resolve_func): - (JSC::Machine::cti_op_sub): - (JSC::Machine::cti_op_put_by_val): - (JSC::Machine::cti_op_put_by_val_array): - (JSC::Machine::cti_op_lesseq): - (JSC::Machine::cti_op_loop_if_true): - (JSC::Machine::cti_op_negate): - (JSC::Machine::cti_op_resolve_base): - (JSC::Machine::cti_op_resolve_skip): - (JSC::Machine::cti_op_resolve_global): - (JSC::Machine::cti_op_div): - (JSC::Machine::cti_op_pre_dec): - (JSC::Machine::cti_op_jless): - (JSC::Machine::cti_op_not): - (JSC::Machine::cti_op_jtrue): - (JSC::Machine::cti_op_post_inc): - (JSC::Machine::cti_op_eq): - (JSC::Machine::cti_op_lshift): - (JSC::Machine::cti_op_bitand): - (JSC::Machine::cti_op_rshift): - (JSC::Machine::cti_op_bitnot): - (JSC::Machine::cti_op_resolve_with_base): - (JSC::Machine::cti_op_new_func_exp): - (JSC::Machine::cti_op_mod): - (JSC::Machine::cti_op_less): - (JSC::Machine::cti_op_neq): - (JSC::Machine::cti_op_post_dec): - (JSC::Machine::cti_op_urshift): - (JSC::Machine::cti_op_bitxor): - (JSC::Machine::cti_op_new_regexp): - (JSC::Machine::cti_op_bitor): - (JSC::Machine::cti_op_call_eval): - (JSC::Machine::cti_op_throw): - (JSC::Machine::cti_op_get_pnames): - (JSC::Machine::cti_op_next_pname): - (JSC::Machine::cti_op_push_scope): - (JSC::Machine::cti_op_pop_scope): - (JSC::Machine::cti_op_typeof): - (JSC::Machine::cti_op_is_undefined): - (JSC::Machine::cti_op_is_boolean): - (JSC::Machine::cti_op_is_number): - (JSC::Machine::cti_op_is_string): - (JSC::Machine::cti_op_is_object): - (JSC::Machine::cti_op_is_function): - (JSC::Machine::cti_op_stricteq): - (JSC::Machine::cti_op_nstricteq): - (JSC::Machine::cti_op_to_jsnumber): - (JSC::Machine::cti_op_in): - (JSC::Machine::cti_op_push_new_scope): - (JSC::Machine::cti_op_jmp_scopes): - (JSC::Machine::cti_op_put_by_index): - (JSC::Machine::cti_op_switch_imm): - (JSC::Machine::cti_op_switch_char): - (JSC::Machine::cti_op_switch_string): - (JSC::Machine::cti_op_del_by_val): - (JSC::Machine::cti_op_put_getter): - (JSC::Machine::cti_op_put_setter): - (JSC::Machine::cti_op_new_error): - (JSC::Machine::cti_op_debug): - (JSC::Machine::cti_vm_throw): - -2008-10-17 Gavin Barraclough <barraclough@apple.com> - - Optimize op_call by allowing call sites to be directly linked to callees. - - For the hot path of op_call, CTI now generates a check (initially for an impossible - value), and the first time the call is executed we attempt to link the call directly - to the callee. We can currently only do so if the arity of the caller and callee - match. The (optimized) setup for the call on the hot path is linked directly to - the ctiCode for the callee, without indirection. - - Two forms of the slow case of the call are generated, the first will be executed the - first time the call is reached. As well as this path attempting to link the call to - a callee, it also relinks the slow case to a second slow case, which will not continue - to attempt relinking the call. (This policy could be changed in future, but for not - this is intended to prevent thrashing). - - If a callee that the caller has been linked to is garbage collected, then the link - in the caller's JIt code will be reset back to a value that cannot match - to prevent - any false positive matches. - - ~20% progression on deltablue & richards, >12% overall reduction in v8-tests - runtime, one or two percent progression on sunspider. - - Reviewed by Oliver Hunt. - - * VM/CTI.cpp: - (JSC::): - (JSC::CTI::emitNakedCall): - (JSC::unreachable): - (JSC::CTI::compileOpCallInitializeCallFrame): - (JSC::CTI::compileOpCallSetupArgs): - (JSC::CTI::compileOpCall): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - (JSC::CTI::privateCompile): - (JSC::CTI::unlinkCall): - (JSC::CTI::linkCall): - * VM/CTI.h: - * VM/CodeBlock.cpp: - (JSC::CodeBlock::~CodeBlock): - (JSC::CodeBlock::unlinkCallers): - (JSC::CodeBlock::derefStructureIDs): - * VM/CodeBlock.h: - (JSC::StructureStubInfo::StructureStubInfo): - (JSC::CallLinkInfo::CallLinkInfo): - (JSC::CodeBlock::addCaller): - (JSC::CodeBlock::removeCaller): - (JSC::CodeBlock::getStubInfo): - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::emitCall): - (JSC::CodeGenerator::emitConstruct): - * VM/Machine.cpp: - (JSC::Machine::cti_op_call_profiler): - (JSC::Machine::cti_op_call_JSFunction): - (JSC::Machine::cti_vm_lazyLinkCall): - (JSC::Machine::cti_op_construct_JSConstructFast): - (JSC::Machine::cti_op_construct_JSConstruct): - (JSC::Machine::cti_op_construct_NotJSConstruct): - * VM/Machine.h: - * kjs/JSFunction.cpp: - (JSC::JSFunction::~JSFunction): - * kjs/JSFunction.h: - * kjs/nodes.h: - (JSC::FunctionBodyNode::): - * masm/X86Assembler.h: - (JSC::X86Assembler::getDifferenceBetweenLabels): -2008-10-17 Maciej Stachowiak <mjs@apple.com> + <rdar://problem/6940519> REGRESSION (Safari 4 Public Beta - TOT): google.com/adplanner shows blank page instead of site details in "basic research' - Reviewed by Geoff Garen. - - - remove ASSERT that makes the leaks buildbot cry - - * kjs/JSFunction.cpp: - (JSC::JSFunction::JSFunction): - -2008-10-17 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Cameron Zwarich - - - don't bother to do arguments tearoff when it will have no effect - - ~1% on v8 raytrace - - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::emitReturn): - -2008-10-17 Marco Barisione <marco.barisione@collabora.co.uk> - - Reviewed by Sam Weinig. Landed by Jan Alonzo. - - https://bugs.webkit.org/show_bug.cgi?id=21603 - [GTK] Minor fixes to GOwnPtr - - * wtf/GOwnPtr.cpp: - (WTF::GError): - (WTF::GList): - (WTF::GCond): - (WTF::GMutex): - (WTF::GPatternSpec): - (WTF::GDir): - * wtf/GOwnPtr.h: - (WTF::freeOwnedGPtr): - (WTF::GOwnPtr::~GOwnPtr): - (WTF::GOwnPtr::outPtr): - (WTF::GOwnPtr::set): - (WTF::GOwnPtr::clear): - * wtf/Threading.h: - -2008-10-17 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Cameron Zwarich. - - - speed up transitions that resize the property storage a fair bit - - ~3% speedup on v8 RayTrace benchmark, ~1% on DeltaBlue - - * VM/CTI.cpp: - (JSC::resizePropertyStorage): renamed from transitionObject, and reduced to just resize - the object's property storage with one inline call. - (JSC::CTI::privateCompilePutByIdTransition): Use a separate function for property storage - resize, but still do all the rest of the work in assembly in that case, and pass the known - compile-time constants of old and new size rather than structureIDs, saving a bunch of - redundant memory access. - * kjs/JSObject.cpp: - (JSC::JSObject::allocatePropertyStorage): Just call the inline version. - * kjs/JSObject.h: - (JSC::JSObject::allocatePropertyStorageInline): Inline version of allocatePropertyStorage - * masm/X86Assembler.h: - (JSC::X86Assembler::): - (JSC::X86Assembler::pushl_i32): Add code to assmeble push of a constant; code originally by Cameron Zwarich. - -2008-10-17 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Maciej Stachowiak. - - Remove some C style casts. - - * masm/X86Assembler.h: - (JSC::JITCodeBuffer::putIntUnchecked): - (JSC::X86Assembler::link): - (JSC::X86Assembler::linkAbsoluteAddress): - (JSC::X86Assembler::getRelocatedAddress): - -2008-10-17 Cameron Zwarich <zwarich@apple.com> - - Rubber-stamped by Maciej Stachowiak. - - Remove some C style casts. - - * VM/CTI.cpp: - (JSC::CTI::patchGetByIdSelf): - (JSC::CTI::patchPutByIdReplace): - * VM/Machine.cpp: - (JSC::Machine::tryCTICachePutByID): - (JSC::Machine::tryCTICacheGetByID): - (JSC::Machine::cti_op_put_by_id): - (JSC::Machine::cti_op_put_by_id_fail): - (JSC::Machine::cti_op_get_by_id): - (JSC::Machine::cti_op_get_by_id_fail): - -2008-10-17 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Cameron Zwarich. - - - Avoid restoring the caller's 'r' value in op_ret - https://bugs.webkit.org/show_bug.cgi?id=21319 - - This patch stops writing the call frame at call and return points; - instead it does so immediately before any CTI call. - - 0.5% speedup or so on the v8 benchmark - - * VM/CTI.cpp: - (JSC::CTI::emitCTICall): - (JSC::CTI::compileOpCall): - (JSC::CTI::emitSlowScriptCheck): - (JSC::CTI::compileBinaryArithOpSlowCase): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - (JSC::CTI::privateCompile): - * VM/CTI.h: - -2008-10-17 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Sam Weinig. - - Make WREC require CTI because it won't actually compile otherwise. - - * wtf/Platform.h: - -2008-10-16 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Geoff Garen. - - - fixed <rdar://problem/5806316> JavaScriptCore should not force building with gcc 4.0 - - use gcc 4.2 when building with Xcode 3.1 or newer on Leopard, even though this is not the default - - This time there is no performance regression; we can avoid having - to use the fastcall calling convention for CTI functions by using - varargs to prevent the compiler from moving things around on the - stack. - - * Configurations/DebugRelease.xcconfig: - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/CTI.cpp: - * VM/Machine.h: - * wtf/Platform.h: - -2008-10-16 Maciej Stachowiak <mjs@apple.com> + The problem was caused by the page returned with a function using a + var declaration list containing around ~3000 variables. The solution + to this is to flatten the comma expression representation and make + codegen comma expressions and initializer lists iterative rather than + recursive. - Reviewed by Oliver Hunt. - - - fix for REGRESSION: r37631 causing crashes on buildbot - https://bugs.webkit.org/show_bug.cgi?id=21682 - - * kjs/collector.cpp: - (JSC::Heap::collect): Avoid crashing when a GC occurs while no global objects are live. + * parser/Grammar.y: + * parser/NodeConstructors.h: + (JSC::CommaNode::CommaNode): + * parser/Nodes.cpp: + (JSC::CommaNode::emitBytecode): + * parser/Nodes.h: + (JSC::ExpressionNode::isCommaNode): + (JSC::CommaNode::isCommaNode): + (JSC::CommaNode::append): -2008-10-16 Sam Weinig <sam@webkit.org> +2009-06-24 Zoltan Horvath <hzoltan@inf.u-szeged.hu> Reviewed by Maciej Stachowiak. - Fix for https://bugs.webkit.org/show_bug.cgi?id=21683 - Don't create intermediate StructureIDs for builtin objects - - First step in reduce number of StructureIDs created when initializing the - JSGlobalObject. + https://bugs.webkit.org/show_bug.cgi?id=26645 - - In order to avoid creating the intermediate StructureIDs use the new putDirectWithoutTransition - and putDirectFunctionWithoutTransition to add properties to JSObjects without transitioning - the StructureID. This patch just implements this strategy for ObjectPrototype but alone - reduces the number of StructureIDs create for about:blank by 10, from 142 to 132. + Inherits ScopeChainNode class from FastAllocBase because it has been + instantiated by 'new' in JavaScriptCore/runtime/ScopeChain.h:95. - * kjs/JSGlobalObject.cpp: - (JSC::JSGlobalObject::reset): - * kjs/JSObject.cpp: - (JSC::JSObject::putDirectFunctionWithoutTransition): - * kjs/JSObject.h: - (JSC::JSObject::putDirectWithoutTransition): - * kjs/ObjectPrototype.cpp: - (JSC::ObjectPrototype::ObjectPrototype): - * kjs/ObjectPrototype.h: - * kjs/StructureID.cpp: - (JSC::StructureID::addPropertyWithoutTransition): - * kjs/StructureID.h: - -2008-10-16 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Cameron Zwarich. - - - fix for: REGRESSION: over 100 StructureIDs leak loading about:blank (result of fix for bug 21633) - - Apparent slight progression (< 0.5%) on v8 benchmarks and SunSpider. - - * kjs/StructureID.cpp: - (JSC::StructureID::~StructureID): Don't deref this object's parent's pointer to - itself from the destructor; that doesn't even make sense. - (JSC::StructureID::addPropertyTransition): Don't refer the single transition; - the rule is that parent StructureIDs are ref'd but child ones are not. Refing - the child creates a cycle. - -2008-10-15 Alexey Proskuryakov <ap@webkit.org> - - Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=21609 - Make MessagePorts protect their peers across heaps - - * JavaScriptCore.exp: - * kjs/JSGlobalObject.cpp: - (JSC::JSGlobalObject::markCrossHeapDependentObjects): - * kjs/JSGlobalObject.h: - * kjs/collector.cpp: - (JSC::Heap::collect): - Before GC sweep phase, a function supplied by global object is now called for all global - objects in the heap, making it possible to implement cross-heap dependencies. + * wtf/RefPtr.h: -2008-10-15 Alexey Proskuryakov <ap@webkit.org> +2009-06-24 Zoltan Horvath <hzoltan@inf.u-szeged.hu> Reviewed by Darin Adler. - https://bugs.webkit.org/show_bug.cgi?id=21610 - run-webkit-threads --threaded crashes in StructureID destructor - - * kjs/StructureID.cpp: - (JSC::StructureID::StructureID): - (JSC::StructureID::~StructureID): - Protect access to a static (debug-only) HashSet with a lock. - -2008-10-15 Sam Weinig <sam@webkit.org> - - Reviewed by Goeffrey Garen. - - Add function to dump statistics for StructureIDs. - - * kjs/StructureID.cpp: - (JSC::StructureID::dumpStatistics): - (JSC::StructureID::StructureID): - (JSC::StructureID::~StructureID): - * kjs/StructureID.h: - -2008-10-15 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Maciej Stachowiak. - - Bug 21633: Avoid using a HashMap when there is only a single transition - <https://bugs.webkit.org/show_bug.cgi?id=21633> - - This is a 0.8% speedup on SunSpider and between a 0.5% and 1.0% speedup - on the V8 benchmark suite, depending on which harness we use. It will - also slightly reduce the memory footprint of a StructureID. - - * kjs/StructureID.cpp: - (JSC::StructureID::StructureID): - (JSC::StructureID::~StructureID): - (JSC::StructureID::addPropertyTransition): - * kjs/StructureID.h: - (JSC::StructureID::): - -2008-10-15 Csaba Osztrogonac <oszi@inf.u-szeged.hu> - - Reviewed by Geoffrey Garen. - - 1.40% speedup on SunSpider, 1.44% speedup on V8. (Linux) - - No change on Mac. - - * VM/Machine.cpp: - (JSC::fastIsNumber): ALWAYS_INLINE modifier added. - -2008-10-15 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Cameron Zwarich. - - Fixed https://bugs.webkit.org/show_bug.cgi?id=21345 - Start the debugger without reloading the inspected page + https://bugs.webkit.org/show_bug.cgi?id=26648 - * JavaScriptCore.exp: New symbols. - * JavaScriptCore.xcodeproj/project.pbxproj: New files. + Inherits Deque class from FastAllocBase because it has been + instantiated by 'new' with DEFINE_STATIC_LOCAL macro in + JavaScriptCore/wtf/MainThread.cpp:62. - * VM/CodeBlock.h: - (JSC::EvalCodeCache::get): Updated for tweak to parsing API. - - * kjs/CollectorHeapIterator.h: Added. An iterator for the object heap, - which we use to find all the live functions and recompile them. - - * kjs/DebuggerCallFrame.cpp: - (JSC::DebuggerCallFrame::evaluate): Updated for tweak to parsing API. - - * kjs/FunctionConstructor.cpp: - (JSC::constructFunction): Updated for tweak to parsing API. - - * kjs/JSFunction.cpp: - (JSC::JSFunction::JSFunction): Try to validate our SourceCode in debug - builds by ASSERTing that it's syntactically valid. This doesn't catch - all SourceCode bugs, but it catches a lot of them. - - * kjs/JSGlobalObjectFunctions.cpp: - (JSC::globalFuncEval): Updated for tweak to parsing API. - - * kjs/Parser.cpp: - (JSC::Parser::parse): - * kjs/Parser.h: - (JSC::Parser::parse): Tweaked the parser to make it possible to parse - without an ExecState, and to allow the client to specify a debugger to - notify (or not) about the source we parse. This allows the inspector - to recompile even though no JavaScript is executing, then notify the - debugger about all source code when it's done. - - * kjs/Shell.cpp: - (prettyPrintScript): Updated for tweak to parsing API. - - * kjs/SourceRange.h: - (JSC::SourceCode::isNull): Added to help with ASSERTs. + * wtf/Deque.h: - * kjs/collector.cpp: - (JSC::Heap::heapAllocate): - (JSC::Heap::sweep): - (JSC::Heap::primaryHeapBegin): - (JSC::Heap::primaryHeapEnd): - * kjs/collector.h: - (JSC::): Moved a bunch of declarations around to enable compilation of - CollectorHeapIterator. - - * kjs/interpreter.cpp: - (JSC::Interpreter::checkSyntax): - (JSC::Interpreter::evaluate): Updated for tweak to parsing API. - - * kjs/lexer.h: - (JSC::Lexer::sourceCode): BUG FIX: Calculate SourceCode ranges relative - to the SourceCode range in which we're lexing, otherwise nested functions - that are compiled individually get SourceCode ranges that don't reflect - their nesting. - - * kjs/nodes.cpp: - (JSC::FunctionBodyNode::FunctionBodyNode): - (JSC::FunctionBodyNode::finishParsing): - (JSC::FunctionBodyNode::create): - (JSC::FunctionBodyNode::copyParameters): - * kjs/nodes.h: - (JSC::ScopeNode::setSource): - (JSC::FunctionBodyNode::parameterCount): Added some helper functions for - copying one FunctionBodyNode's parameters to another. The recompiler uses - these when calling "finishParsing". - -2008-10-15 Joerg Bornemann <joerg.bornemann@trolltech.com> +2009-06-24 Zoltan Horvath <hzoltan@inf.u-szeged.hu> Reviewed by Darin Adler. - - part of https://bugs.webkit.org/show_bug.cgi?id=20746 - Fix compilation on Windows CE. - - str(n)icmp, strdup and vsnprintf are not available on Windows CE, - they are called _str(n)icmp, etc. instead + https://bugs.webkit.org/show_bug.cgi?id=26644 - * wtf/StringExtras.h: Added inline function implementations. + Inherits RefPtr class from FastAllocBase because it has been + instantiated by 'new' in JavaScriptCore/runtime/StructureChain.cpp:41. -2008-10-15 Gabor Loki <loki@inf.u-szeged.hu> - - Reviewed by Cameron Zwarich. - - <https://bugs.webkit.org/show_bug.cgi?id=20912> - Use simple uint32_t multiplication on op_mul if both operands are - immediate number and they are between zero and 0x7FFF. - - * VM/Machine.cpp: - (JSC::Machine::privateExecute): - -2008-10-09 Darin Fisher <darin@chromium.org> - - Reviewed by Sam Weinig. - - Make pan scrolling a platform configurable option. - https://bugs.webkit.org/show_bug.cgi?id=21515 - - * wtf/Platform.h: Add ENABLE_PAN_SCROLLING - -2008-10-14 Maciej Stachowiak <mjs@apple.com> - - Rubber stamped by Sam Weinig. - - - revert r37572 and r37581 for now - - Turns out GCC 4.2 is still a (small) regression, we'll have to do - more work to turn it on. - - * Configurations/DebugRelease.xcconfig: - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/CTI.cpp: - * VM/CTI.h: - * VM/Machine.cpp: - (JSC::Machine::cti_op_convert_this): - (JSC::Machine::cti_op_end): - (JSC::Machine::cti_op_add): - (JSC::Machine::cti_op_pre_inc): - (JSC::Machine::cti_timeout_check): - (JSC::Machine::cti_register_file_check): - (JSC::Machine::cti_op_loop_if_less): - (JSC::Machine::cti_op_loop_if_lesseq): - (JSC::Machine::cti_op_new_object): - (JSC::Machine::cti_op_put_by_id): - (JSC::Machine::cti_op_put_by_id_second): - (JSC::Machine::cti_op_put_by_id_generic): - (JSC::Machine::cti_op_put_by_id_fail): - (JSC::Machine::cti_op_get_by_id): - (JSC::Machine::cti_op_get_by_id_second): - (JSC::Machine::cti_op_get_by_id_generic): - (JSC::Machine::cti_op_get_by_id_fail): - (JSC::Machine::cti_op_instanceof): - (JSC::Machine::cti_op_del_by_id): - (JSC::Machine::cti_op_mul): - (JSC::Machine::cti_op_new_func): - (JSC::Machine::cti_op_call_JSFunction): - (JSC::Machine::cti_vm_compile): - (JSC::Machine::cti_op_push_activation): - (JSC::Machine::cti_op_call_NotJSFunction): - (JSC::Machine::cti_op_create_arguments): - (JSC::Machine::cti_op_tear_off_activation): - (JSC::Machine::cti_op_tear_off_arguments): - (JSC::Machine::cti_op_ret_profiler): - (JSC::Machine::cti_op_ret_scopeChain): - (JSC::Machine::cti_op_new_array): - (JSC::Machine::cti_op_resolve): - (JSC::Machine::cti_op_construct_JSConstruct): - (JSC::Machine::cti_op_construct_NotJSConstruct): - (JSC::Machine::cti_op_get_by_val): - (JSC::Machine::cti_op_resolve_func): - (JSC::Machine::cti_op_sub): - (JSC::Machine::cti_op_put_by_val): - (JSC::Machine::cti_op_put_by_val_array): - (JSC::Machine::cti_op_lesseq): - (JSC::Machine::cti_op_loop_if_true): - (JSC::Machine::cti_op_negate): - (JSC::Machine::cti_op_resolve_base): - (JSC::Machine::cti_op_resolve_skip): - (JSC::Machine::cti_op_resolve_global): - (JSC::Machine::cti_op_div): - (JSC::Machine::cti_op_pre_dec): - (JSC::Machine::cti_op_jless): - (JSC::Machine::cti_op_not): - (JSC::Machine::cti_op_jtrue): - (JSC::Machine::cti_op_post_inc): - (JSC::Machine::cti_op_eq): - (JSC::Machine::cti_op_lshift): - (JSC::Machine::cti_op_bitand): - (JSC::Machine::cti_op_rshift): - (JSC::Machine::cti_op_bitnot): - (JSC::Machine::cti_op_resolve_with_base): - (JSC::Machine::cti_op_new_func_exp): - (JSC::Machine::cti_op_mod): - (JSC::Machine::cti_op_less): - (JSC::Machine::cti_op_neq): - (JSC::Machine::cti_op_post_dec): - (JSC::Machine::cti_op_urshift): - (JSC::Machine::cti_op_bitxor): - (JSC::Machine::cti_op_new_regexp): - (JSC::Machine::cti_op_bitor): - (JSC::Machine::cti_op_call_eval): - (JSC::Machine::cti_op_throw): - (JSC::Machine::cti_op_get_pnames): - (JSC::Machine::cti_op_next_pname): - (JSC::Machine::cti_op_push_scope): - (JSC::Machine::cti_op_pop_scope): - (JSC::Machine::cti_op_typeof): - (JSC::Machine::cti_op_is_undefined): - (JSC::Machine::cti_op_is_boolean): - (JSC::Machine::cti_op_is_number): - (JSC::Machine::cti_op_is_string): - (JSC::Machine::cti_op_is_object): - (JSC::Machine::cti_op_is_function): - (JSC::Machine::cti_op_stricteq): - (JSC::Machine::cti_op_nstricteq): - (JSC::Machine::cti_op_to_jsnumber): - (JSC::Machine::cti_op_in): - (JSC::Machine::cti_op_push_new_scope): - (JSC::Machine::cti_op_jmp_scopes): - (JSC::Machine::cti_op_put_by_index): - (JSC::Machine::cti_op_switch_imm): - (JSC::Machine::cti_op_switch_char): - (JSC::Machine::cti_op_switch_string): - (JSC::Machine::cti_op_del_by_val): - (JSC::Machine::cti_op_put_getter): - (JSC::Machine::cti_op_put_setter): - (JSC::Machine::cti_op_new_error): - (JSC::Machine::cti_op_debug): - (JSC::Machine::cti_vm_throw): - * VM/Machine.h: - * masm/X86Assembler.h: - (JSC::X86Assembler::emitRestoreArgumentReference): - (JSC::X86Assembler::emitRestoreArgumentReferenceForTrampoline): - * wtf/Platform.h: + * wtf/RefPtr.h: -2008-10-14 Alexey Proskuryakov <ap@webkit.org> +2009-06-24 Zoltan Horvath <hzoltan@inf.u-szeged.hu> Reviewed by Darin Adler. - https://bugs.webkit.org/show_bug.cgi?id=20256 - Array.push and other standard methods disappear - - * kjs/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): - (JSC::JSGlobalData::~JSGlobalData): - Don't use static hash tables even on platforms that don't enable JSC_MULTIPLE_THREADS - - these tables reference IdentifierTable, which is always per-GlobalData. - -2008-10-14 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Cameron Zwarich. - - - always use CTI_ARGUMENTS and CTI_ARGUMENTS_FASTCALL - - This is a small regression for GCC 4.0, but simplifies the code - for future improvements and lets us focus on GCC 4.2+ and MSVC. - - * VM/CTI.cpp: - * VM/CTI.h: - * VM/Machine.cpp: - (JSC::Machine::cti_op_convert_this): - (JSC::Machine::cti_op_end): - (JSC::Machine::cti_op_add): - (JSC::Machine::cti_op_pre_inc): - (JSC::Machine::cti_timeout_check): - (JSC::Machine::cti_register_file_check): - (JSC::Machine::cti_op_loop_if_less): - (JSC::Machine::cti_op_loop_if_lesseq): - (JSC::Machine::cti_op_new_object): - (JSC::Machine::cti_op_put_by_id): - (JSC::Machine::cti_op_put_by_id_second): - (JSC::Machine::cti_op_put_by_id_generic): - (JSC::Machine::cti_op_put_by_id_fail): - (JSC::Machine::cti_op_get_by_id): - (JSC::Machine::cti_op_get_by_id_second): - (JSC::Machine::cti_op_get_by_id_generic): - (JSC::Machine::cti_op_get_by_id_fail): - (JSC::Machine::cti_op_instanceof): - (JSC::Machine::cti_op_del_by_id): - (JSC::Machine::cti_op_mul): - (JSC::Machine::cti_op_new_func): - (JSC::Machine::cti_op_call_JSFunction): - (JSC::Machine::cti_vm_compile): - (JSC::Machine::cti_op_push_activation): - (JSC::Machine::cti_op_call_NotJSFunction): - (JSC::Machine::cti_op_create_arguments): - (JSC::Machine::cti_op_tear_off_activation): - (JSC::Machine::cti_op_tear_off_arguments): - (JSC::Machine::cti_op_ret_profiler): - (JSC::Machine::cti_op_ret_scopeChain): - (JSC::Machine::cti_op_new_array): - (JSC::Machine::cti_op_resolve): - (JSC::Machine::cti_op_construct_JSConstruct): - (JSC::Machine::cti_op_construct_NotJSConstruct): - (JSC::Machine::cti_op_get_by_val): - (JSC::Machine::cti_op_resolve_func): - (JSC::Machine::cti_op_sub): - (JSC::Machine::cti_op_put_by_val): - (JSC::Machine::cti_op_put_by_val_array): - (JSC::Machine::cti_op_lesseq): - (JSC::Machine::cti_op_loop_if_true): - (JSC::Machine::cti_op_negate): - (JSC::Machine::cti_op_resolve_base): - (JSC::Machine::cti_op_resolve_skip): - (JSC::Machine::cti_op_resolve_global): - (JSC::Machine::cti_op_div): - (JSC::Machine::cti_op_pre_dec): - (JSC::Machine::cti_op_jless): - (JSC::Machine::cti_op_not): - (JSC::Machine::cti_op_jtrue): - (JSC::Machine::cti_op_post_inc): - (JSC::Machine::cti_op_eq): - (JSC::Machine::cti_op_lshift): - (JSC::Machine::cti_op_bitand): - (JSC::Machine::cti_op_rshift): - (JSC::Machine::cti_op_bitnot): - (JSC::Machine::cti_op_resolve_with_base): - (JSC::Machine::cti_op_new_func_exp): - (JSC::Machine::cti_op_mod): - (JSC::Machine::cti_op_less): - (JSC::Machine::cti_op_neq): - (JSC::Machine::cti_op_post_dec): - (JSC::Machine::cti_op_urshift): - (JSC::Machine::cti_op_bitxor): - (JSC::Machine::cti_op_new_regexp): - (JSC::Machine::cti_op_bitor): - (JSC::Machine::cti_op_call_eval): - (JSC::Machine::cti_op_throw): - (JSC::Machine::cti_op_get_pnames): - (JSC::Machine::cti_op_next_pname): - (JSC::Machine::cti_op_push_scope): - (JSC::Machine::cti_op_pop_scope): - (JSC::Machine::cti_op_typeof): - (JSC::Machine::cti_op_is_undefined): - (JSC::Machine::cti_op_is_boolean): - (JSC::Machine::cti_op_is_number): - (JSC::Machine::cti_op_is_string): - (JSC::Machine::cti_op_is_object): - (JSC::Machine::cti_op_is_function): - (JSC::Machine::cti_op_stricteq): - (JSC::Machine::cti_op_nstricteq): - (JSC::Machine::cti_op_to_jsnumber): - (JSC::Machine::cti_op_in): - (JSC::Machine::cti_op_push_new_scope): - (JSC::Machine::cti_op_jmp_scopes): - (JSC::Machine::cti_op_put_by_index): - (JSC::Machine::cti_op_switch_imm): - (JSC::Machine::cti_op_switch_char): - (JSC::Machine::cti_op_switch_string): - (JSC::Machine::cti_op_del_by_val): - (JSC::Machine::cti_op_put_getter): - (JSC::Machine::cti_op_put_setter): - (JSC::Machine::cti_op_new_error): - (JSC::Machine::cti_op_debug): - (JSC::Machine::cti_vm_throw): - * VM/Machine.h: - * masm/X86Assembler.h: - (JSC::X86Assembler::emitRestoreArgumentReference): - (JSC::X86Assembler::emitRestoreArgumentReferenceForTrampoline): - * wtf/Platform.h: - -2008-10-13 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Cameron Zwarich. - - - make Machine::getArgumentsData an Arguments method and inline it - - ~2% on v8 raytrace - - * VM/Machine.cpp: - * kjs/Arguments.h: - (JSC::Machine::getArgumentsData): - -2008-10-13 Alp Toker <alp@nuanti.com> - - Fix autotools dist build target by listing recently added header - files only. Not reviewed. - - * GNUmakefile.am: - -2008-10-13 Maciej Stachowiak <mjs@apple.com> - - Rubber stamped by Mark Rowe. - - - fixed <rdar://problem/5806316> JavaScriptCore should not force building with gcc 4.0 - - use gcc 4.2 when building with Xcode 3.1 or newer on Leopard, even though this is not the default - - * Configurations/DebugRelease.xcconfig: - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-10-13 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Geoff Garen. - - Bug 21541: Move RegisterFile growth check to callee - <https://bugs.webkit.org/show_bug.cgi?id=21541> - - Move the RegisterFile growth check to the callee in the common case, - where some of the information is known statically at JIT time. There is - still a check in the caller in the case where the caller provides too - few arguments. - - This is a 2.1% speedup on the V8 benchmark, including a 5.1% speedup on - the Richards benchmark, a 4.1% speedup on the DeltaBlue benchmark, and a - 1.4% speedup on the Earley-Boyer benchmark. It is also a 0.5% speedup on - SunSpider. - - * VM/CTI.cpp: - (JSC::CTI::privateCompile): - * VM/Machine.cpp: - (JSC::Machine::cti_register_file_check): - (JSC::Machine::cti_op_call_JSFunction): - (JSC::Machine::cti_op_construct_JSConstruct): - * VM/Machine.h: - * VM/RegisterFile.h: - * masm/X86Assembler.h: - (JSC::X86Assembler::): - (JSC::X86Assembler::cmpl_mr): - (JSC::X86Assembler::emitUnlinkedJg): - -2008-10-13 Sam Weinig <sam@webkit.org> + Inherits HashSet class from FastAllocBase, because it has been + instantiated by 'new' in JavaScriptCore/runtime/Collector.h:116. - Reviewed by Dan Bernstein. - - Fix for https://bugs.webkit.org/show_bug.cgi?id=21577 - 5 false positive StructureID leaks - - - Add leak ignore set to StructureID to selectively ignore leaking some StructureIDs. - - Add create method to JSGlolalData to be used when the data will be intentionally - leaked and ignore all leaks caused the StructureIDs stored in it. - - * JavaScriptCore.exp: - * kjs/JSGlobalData.cpp: - (JSC::JSGlobalData::createLeaked): - * kjs/JSGlobalData.h: - * kjs/StructureID.cpp: - (JSC::StructureID::StructureID): - (JSC::StructureID::~StructureID): - (JSC::StructureID::startIgnoringLeaks): - (JSC::StructureID::stopIgnoringLeaks): - * kjs/StructureID.h: - -2008-10-13 Marco Barisione <marco.barisione@collabora.co.uk> - - Reviewed by Darin Adler. Landed by Jan Alonzo. - - WebKit GTK Port needs a smartpointer to handle g_free (GFreePtr?) - http://bugs.webkit.org/show_bug.cgi?id=20483 - - Add a GOwnPtr smart pointer (similar to OwnPtr) to handle memory - allocated by GLib and start the conversion to use it. + * wtf/HashSet.h: - * GNUmakefile.am: - * wtf/GOwnPtr.cpp: Added. - (WTF::GError): - (WTF::GList): - (WTF::GCond): - (WTF::GMutex): - (WTF::GPatternSpec): - (WTF::GDir): - * wtf/GOwnPtr.h: Added. - (WTF::freeOwnedPtr): - (WTF::GOwnPtr::GOwnPtr): - (WTF::GOwnPtr::~GOwnPtr): - (WTF::GOwnPtr::get): - (WTF::GOwnPtr::release): - (WTF::GOwnPtr::rawPtr): - (WTF::GOwnPtr::set): - (WTF::GOwnPtr::clear): - (WTF::GOwnPtr::operator*): - (WTF::GOwnPtr::operator->): - (WTF::GOwnPtr::operator!): - (WTF::GOwnPtr::operator UnspecifiedBoolType): - (WTF::GOwnPtr::swap): - (WTF::swap): - (WTF::operator==): - (WTF::operator!=): - (WTF::getPtr): - * wtf/Threading.h: - * wtf/ThreadingGtk.cpp: - (WTF::Mutex::~Mutex): - (WTF::Mutex::lock): - (WTF::Mutex::tryLock): - (WTF::Mutex::unlock): - (WTF::ThreadCondition::~ThreadCondition): - (WTF::ThreadCondition::wait): - (WTF::ThreadCondition::timedWait): - (WTF::ThreadCondition::signal): - (WTF::ThreadCondition::broadcast): - -2008-10-12 Gabriella Toth <gtoth@inf.u-szeged.hu> +2009-06-24 Zoltan Horvath <hzoltan@inf.u-szeged.hu> Reviewed by Darin Adler. - - part of https://bugs.webkit.org/show_bug.cgi?id=21055 - Bug 21055: not invoked functions + Inherits Vector class from FastAllocBase because it has been + instantiated by 'new' in JavaScriptCore/runtime/Structure.cpp:633. - * kjs/nodes.cpp: Deleted a function that is not invoked: - statementListInitializeVariableAccessStack. - -2008-10-12 Darin Adler <darin@apple.com> - - Reviewed by Sam Weinig. - - * wtf/unicode/icu/UnicodeIcu.h: Fixed indentation to match WebKit coding style. - * wtf/unicode/qt4/UnicodeQt4.h: Ditto. - -2008-10-12 Darin Adler <darin@apple.com> - - Reviewed by Sam Weinig. - - - https://bugs.webkit.org/show_bug.cgi?id=21556 - Bug 21556: non-ASCII digits are allowed in places where only ASCII should be - - * wtf/unicode/icu/UnicodeIcu.h: Removed isDigit, digitValue, and isFormatChar. - * wtf/unicode/qt4/UnicodeQt4.h: Ditto. - -2008-10-12 Anders Carlsson <andersca@apple.com> - - Reviewed by Darin Adler. - - Make the append method that takes a Vector more strict - it now requires the elements - of the vector to be appended same type as the elements of the Vector they're being appended to. - - This would cause problems when dealing with Vectors containing other Vectors. - * wtf/Vector.h: - (WTF::::append): - -2008-10-11 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Sam Weinig. - - Clean up RegExpMatchesArray.h to match our coding style. - - * kjs/RegExpMatchesArray.h: - (JSC::RegExpMatchesArray::getOwnPropertySlot): - (JSC::RegExpMatchesArray::put): - (JSC::RegExpMatchesArray::deleteProperty): - (JSC::RegExpMatchesArray::getPropertyNames): - -2008-10-11 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Sam Weinig. - Bug 21525: 55 StructureID leaks on Wikitravel's main page - <https://bugs.webkit.org/show_bug.cgi?id=21525> +2009-06-24 Norbert Leser <norbert.leser@nokia.com> - Bug 21533: Simple JavaScript code leaks StructureIDs - <https://bugs.webkit.org/show_bug.cgi?id=21533> + Reviewed by Maciej Stachoviak. - StructureID::getEnumerablePropertyNames() ends up calling back to itself - via JSObject::getPropertyNames(), which causes the PropertyNameArray to - be cached twice. This leads to a memory leak in almost every use of - JSObject::getPropertyNames() on an object. The fix here is based on a - suggestion of Sam Weinig. + The BytecodeGenerator objects were instantiated on stack, which takes up ~38kB per instance + (each instance includes copy of JSC::CodeBlock with large SymbolTable, etc.). + Specifically, since there is nested invocation (e.g., GlobalCode --> FunctionCode), + the stack overflows immediately on Symbian hardware (max. 80 kB). + Proposed change allocates generator objects on heap. + Performance impact (if any) should be negligible and change is proposed as general fix, + rather than ifdef'd for SYMBIAN. - This patch also fixes every StructureID leaks that occurs while running - the Mozilla MemBuster test. - - * kjs/PropertyNameArray.h: - (JSC::PropertyNameArray::PropertyNameArray): - (JSC::PropertyNameArray::setCacheable): - (JSC::PropertyNameArray::cacheable): - * kjs/StructureID.cpp: - (JSC::StructureID::getEnumerablePropertyNames): - -2008-10-10 Oliver Hunt <oliver@apple.com> - - Reviewed by Cameron Zwarich. - - Use fastcall calling convention on GCC > 4.0 - - Results in a 2-3% improvement in GCC 4.2 performance, so - that it is no longer a regression vs. GCC 4.0 - - * VM/CTI.cpp: - * VM/Machine.h: - * wtf/Platform.h: - -2008-10-10 Sam Weinig <sam@webkit.org> - - Reviewed by Darin Adler. - - - Add a workaround for a bug in ceil in Darwin libc. - - Remove old workarounds for JS math functions that are not needed - anymore. - - The math functions are heavily tested by fast/js/math.html. - - * kjs/MathObject.cpp: - (JSC::mathProtoFuncAbs): Remove workaround. - (JSC::mathProtoFuncCeil): Ditto. - (JSC::mathProtoFuncFloor): Ditto. - * wtf/MathExtras.h: - (wtf_ceil): Add ceil workaround for darwin. - -2008-10-10 Sam Weinig <sam@webkit.org> - - Reviewed by Darin Adler - - Add Assertions to JSObject constructor. - - * kjs/JSObject.h: - (JSC::JSObject::JSObject): - -2008-10-10 Sam Weinig <sam@webkit.org> - - Reviewed by Cameron Zwarich. - - Remove now unused m_getterSetterFlag variable from PropertyMap. - - * kjs/PropertyMap.cpp: - (JSC::PropertyMap::operator=): - * kjs/PropertyMap.h: - (JSC::PropertyMap::PropertyMap): - -2008-10-09 Sam Weinig <sam@webkit.org> - - Reviewed by Maciej Stachowiak. - - Add leaks checking to StructureID. - - * kjs/StructureID.cpp: - (JSC::StructureID::StructureID): - (JSC::StructureID::~StructureID): - -2008-10-09 Alp Toker <alp@nuanti.com> - - Reviewed by Mark Rowe. - - https://bugs.webkit.org/show_bug.cgi?id=20760 - Implement support for x86 Linux in CTI - - Prepare to enable CTI/WREC on supported architectures. - - Make it possible to use the CTI_ARGUMENT workaround with GCC as well - as MSVC by fixing some preprocessor conditionals. - - Note that CTI/WREC no longer requires CTI_ARGUMENT on Linux so we - don't actually enable it except when building with MSVC. GCC on Win32 - remains untested. - - Adapt inline ASM code to use the global symbol underscore prefix only - on Darwin and to call the properly mangled Machine::cti_vm_throw - symbol name depending on CTI_ARGUMENT. - - Also avoid global inclusion of the JIT infrastructure headers - throughout WebCore and WebKit causing recompilation of about ~1500 - source files after modification to X86Assembler.h, CTI.h, WREC.h, - which are only used deep inside JavaScriptCore. - - * GNUmakefile.am: - * VM/CTI.cpp: - * VM/CTI.h: - * VM/Machine.cpp: - * VM/Machine.h: - * kjs/regexp.cpp: - (JSC::RegExp::RegExp): - (JSC::RegExp::~RegExp): - (JSC::RegExp::match): - * kjs/regexp.h: - * masm/X86Assembler.h: - (JSC::X86Assembler::emitConvertToFastCall): - (JSC::X86Assembler::emitRestoreArgumentReferenceForTrampoline): - (JSC::X86Assembler::emitRestoreArgumentReference): - -2008-10-09 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Cameron Zwarich. - - Fix for bug #21160, x=0;1/(x*-1) == -Infinity - - * ChangeLog: - * VM/CTI.cpp: - (JSC::CTI::emitFastArithDeTagImmediate): - (JSC::CTI::emitFastArithDeTagImmediateJumpIfZero): - (JSC::CTI::compileBinaryArithOp): - (JSC::CTI::compileBinaryArithOpSlowCase): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - * VM/CTI.h: - * masm/X86Assembler.h: - (JSC::X86Assembler::): - (JSC::X86Assembler::emitUnlinkedJs): - -2008-10-09 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Oliver Hunt. - - Bug 21459: REGRESSION (r37324): Safari crashes inside JavaScriptCore while browsing hulu.com - <https://bugs.webkit.org/show_bug.cgi?id=21459> - - After r37324, an Arguments object does not mark an associated activation - object. This change was made because Arguments no longer directly used - the activation object in any way. However, if an activation is torn off, - then the backing store of Arguments becomes the register array of the - activation object. Arguments directly marks all of the arguments, but - the activation object is being collected, which causes its register - array to be freed and new memory to be allocated in its place. - - Unfortunately, it does not seem possible to reproduce this issue in a - layout test. - - * kjs/Arguments.cpp: - (JSC::Arguments::mark): - * kjs/Arguments.h: - (JSC::Arguments::setActivation): - (JSC::Arguments::Arguments): - (JSC::JSActivation::copyRegisters): - -2008-10-09 Ariya Hidayat <ariya.hidayat@trolltech.com> - - Reviewed by Simon. - - Build fix for MinGW. - - * wtf/AlwaysInline.h: - -2008-10-08 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Maciej Stachowiak. - - Bug 21497: REGRESSION (r37433): Bytecode JSC tests are severely broken - <https://bugs.webkit.org/show_bug.cgi?id=21497> - - Fix a typo in r37433 that causes the failure of a large number of JSC - tests with the bytecode interpreter enabled. - - * VM/Machine.cpp: - (JSC::Machine::privateExecute): - -2008-10-08 Mark Rowe <mrowe@apple.com> - - Windows build fix. - - * VM/CTI.cpp: - (JSC::): Update type of argument to ctiTrampoline. - -2008-10-08 Darin Adler <darin@apple.com> - - Reviewed by Cameron Zwarich. - - - https://bugs.webkit.org/show_bug.cgi?id=21403 - Bug 21403: use new CallFrame class rather than Register* for call frame manipulation - - Add CallFrame as a synonym for ExecState. Arguably, some day we should switch every - client over to the new name. - - Use CallFrame* consistently rather than Register* or ExecState* in low-level code such - as Machine.cpp and CTI.cpp. Similarly, use callFrame rather than r as its name and use - accessor functions to get at things in the frame. - - Eliminate other uses of ExecState* that aren't needed, replacing in some cases with - JSGlobalData* and in other cases eliminating them entirely. - - * API/JSObjectRef.cpp: - (JSObjectMakeFunctionWithCallback): - (JSObjectMakeFunction): - (JSObjectHasProperty): - (JSObjectGetProperty): - (JSObjectSetProperty): - (JSObjectDeleteProperty): - * API/OpaqueJSString.cpp: - * API/OpaqueJSString.h: - * VM/CTI.cpp: - (JSC::CTI::getConstant): - (JSC::CTI::emitGetArg): - (JSC::CTI::emitGetPutArg): - (JSC::CTI::getConstantImmediateNumericArg): - (JSC::CTI::printOpcodeOperandTypes): - (JSC::CTI::CTI): - (JSC::CTI::compileOpCall): - (JSC::CTI::compileBinaryArithOp): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompile): - (JSC::CTI::privateCompileGetByIdProto): - (JSC::CTI::privateCompileGetByIdChain): - (JSC::CTI::compileRegExp): - * VM/CTI.h: - * VM/CodeBlock.h: - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::emitEqualityOp): - (JSC::CodeGenerator::emitLoad): - (JSC::CodeGenerator::emitUnexpectedLoad): - (JSC::CodeGenerator::emitConstruct): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (JSC::jsLess): - (JSC::jsLessEq): - (JSC::jsAddSlowCase): - (JSC::jsAdd): - (JSC::jsTypeStringForValue): - (JSC::Machine::resolve): - (JSC::Machine::resolveSkip): - (JSC::Machine::resolveGlobal): - (JSC::inlineResolveBase): - (JSC::Machine::resolveBase): - (JSC::Machine::resolveBaseAndProperty): - (JSC::Machine::resolveBaseAndFunc): - (JSC::Machine::slideRegisterWindowForCall): - (JSC::isNotObject): - (JSC::Machine::callEval): - (JSC::Machine::dumpCallFrame): - (JSC::Machine::dumpRegisters): - (JSC::Machine::unwindCallFrame): - (JSC::Machine::throwException): - (JSC::DynamicGlobalObjectScope::DynamicGlobalObjectScope): - (JSC::DynamicGlobalObjectScope::~DynamicGlobalObjectScope): - (JSC::Machine::execute): - (JSC::Machine::debug): - (JSC::Machine::createExceptionScope): - (JSC::cachePrototypeChain): - (JSC::Machine::tryCachePutByID): - (JSC::Machine::tryCacheGetByID): - (JSC::Machine::privateExecute): - (JSC::Machine::retrieveArguments): - (JSC::Machine::retrieveCaller): - (JSC::Machine::retrieveLastCaller): - (JSC::Machine::findFunctionCallFrame): - (JSC::Machine::getArgumentsData): - (JSC::Machine::tryCTICachePutByID): - (JSC::Machine::getCTIArrayLengthTrampoline): - (JSC::Machine::getCTIStringLengthTrampoline): - (JSC::Machine::tryCTICacheGetByID): - (JSC::Machine::cti_op_convert_this): - (JSC::Machine::cti_op_end): - (JSC::Machine::cti_op_add): - (JSC::Machine::cti_op_pre_inc): - (JSC::Machine::cti_timeout_check): - (JSC::Machine::cti_op_loop_if_less): - (JSC::Machine::cti_op_loop_if_lesseq): - (JSC::Machine::cti_op_new_object): - (JSC::Machine::cti_op_put_by_id): - (JSC::Machine::cti_op_put_by_id_second): - (JSC::Machine::cti_op_put_by_id_generic): - (JSC::Machine::cti_op_put_by_id_fail): - (JSC::Machine::cti_op_get_by_id): - (JSC::Machine::cti_op_get_by_id_second): - (JSC::Machine::cti_op_get_by_id_generic): - (JSC::Machine::cti_op_get_by_id_fail): - (JSC::Machine::cti_op_instanceof): - (JSC::Machine::cti_op_del_by_id): - (JSC::Machine::cti_op_mul): - (JSC::Machine::cti_op_new_func): - (JSC::Machine::cti_op_call_JSFunction): - (JSC::Machine::cti_vm_compile): - (JSC::Machine::cti_op_push_activation): - (JSC::Machine::cti_op_call_NotJSFunction): - (JSC::Machine::cti_op_create_arguments): - (JSC::Machine::cti_op_tear_off_activation): - (JSC::Machine::cti_op_tear_off_arguments): - (JSC::Machine::cti_op_ret_profiler): - (JSC::Machine::cti_op_ret_scopeChain): - (JSC::Machine::cti_op_new_array): - (JSC::Machine::cti_op_resolve): - (JSC::Machine::cti_op_construct_JSConstruct): - (JSC::Machine::cti_op_construct_NotJSConstruct): - (JSC::Machine::cti_op_get_by_val): - (JSC::Machine::cti_op_resolve_func): - (JSC::Machine::cti_op_sub): - (JSC::Machine::cti_op_put_by_val): - (JSC::Machine::cti_op_put_by_val_array): - (JSC::Machine::cti_op_lesseq): - (JSC::Machine::cti_op_loop_if_true): - (JSC::Machine::cti_op_negate): - (JSC::Machine::cti_op_resolve_base): - (JSC::Machine::cti_op_resolve_skip): - (JSC::Machine::cti_op_resolve_global): - (JSC::Machine::cti_op_div): - (JSC::Machine::cti_op_pre_dec): - (JSC::Machine::cti_op_jless): - (JSC::Machine::cti_op_not): - (JSC::Machine::cti_op_jtrue): - (JSC::Machine::cti_op_post_inc): - (JSC::Machine::cti_op_eq): - (JSC::Machine::cti_op_lshift): - (JSC::Machine::cti_op_bitand): - (JSC::Machine::cti_op_rshift): - (JSC::Machine::cti_op_bitnot): - (JSC::Machine::cti_op_resolve_with_base): - (JSC::Machine::cti_op_new_func_exp): - (JSC::Machine::cti_op_mod): - (JSC::Machine::cti_op_less): - (JSC::Machine::cti_op_neq): - (JSC::Machine::cti_op_post_dec): - (JSC::Machine::cti_op_urshift): - (JSC::Machine::cti_op_bitxor): - (JSC::Machine::cti_op_new_regexp): - (JSC::Machine::cti_op_bitor): - (JSC::Machine::cti_op_call_eval): - (JSC::Machine::cti_op_throw): - (JSC::Machine::cti_op_get_pnames): - (JSC::Machine::cti_op_next_pname): - (JSC::Machine::cti_op_push_scope): - (JSC::Machine::cti_op_pop_scope): - (JSC::Machine::cti_op_typeof): - (JSC::Machine::cti_op_to_jsnumber): - (JSC::Machine::cti_op_in): - (JSC::Machine::cti_op_push_new_scope): - (JSC::Machine::cti_op_jmp_scopes): - (JSC::Machine::cti_op_put_by_index): - (JSC::Machine::cti_op_switch_imm): - (JSC::Machine::cti_op_switch_char): - (JSC::Machine::cti_op_switch_string): - (JSC::Machine::cti_op_del_by_val): - (JSC::Machine::cti_op_put_getter): - (JSC::Machine::cti_op_put_setter): - (JSC::Machine::cti_op_new_error): - (JSC::Machine::cti_op_debug): - (JSC::Machine::cti_vm_throw): - * VM/Machine.h: - * VM/Register.h: - * VM/RegisterFile.h: - * kjs/Arguments.h: - * kjs/DebuggerCallFrame.cpp: - (JSC::DebuggerCallFrame::functionName): - (JSC::DebuggerCallFrame::type): - (JSC::DebuggerCallFrame::thisObject): - (JSC::DebuggerCallFrame::evaluate): - * kjs/DebuggerCallFrame.h: - * kjs/ExecState.cpp: - (JSC::CallFrame::thisValue): - * kjs/ExecState.h: - * kjs/FunctionConstructor.cpp: - (JSC::constructFunction): - * kjs/JSActivation.cpp: - (JSC::JSActivation::JSActivation): - (JSC::JSActivation::argumentsGetter): - * kjs/JSActivation.h: - * kjs/JSGlobalObject.cpp: - (JSC::JSGlobalObject::init): - * kjs/JSGlobalObjectFunctions.cpp: - (JSC::globalFuncEval): - * kjs/JSVariableObject.h: - * kjs/Parser.cpp: - (JSC::Parser::parse): - * kjs/RegExpConstructor.cpp: - (JSC::constructRegExp): - * kjs/RegExpPrototype.cpp: - (JSC::regExpProtoFuncCompile): - * kjs/Shell.cpp: - (prettyPrintScript): - * kjs/StringPrototype.cpp: - (JSC::stringProtoFuncMatch): - (JSC::stringProtoFuncSearch): - * kjs/identifier.cpp: - (JSC::Identifier::checkSameIdentifierTable): - * kjs/interpreter.cpp: - (JSC::Interpreter::checkSyntax): - (JSC::Interpreter::evaluate): - * kjs/nodes.cpp: - (JSC::ThrowableExpressionData::emitThrowError): - (JSC::RegExpNode::emitCode): - (JSC::ArrayNode::emitCode): - (JSC::InstanceOfNode::emitCode): - * kjs/nodes.h: - * kjs/regexp.cpp: - (JSC::RegExp::RegExp): - (JSC::RegExp::create): - * kjs/regexp.h: - * profiler/HeavyProfile.h: - * profiler/Profile.h: - * wrec/WREC.cpp: - * wrec/WREC.h: - -2008-10-08 Mark Rowe <mrowe@apple.com> - - Typed by Maciej Stachowiak, reviewed by Mark Rowe. - - Fix crash in fast/js/constant-folding.html with CTI disabled. - - * VM/Machine.cpp: - (JSC::Machine::privateExecute): - -2008-10-08 Timothy Hatcher <timothy@apple.com> - - Roll out r37427 because it causes an infinite recursion loading about:blank. - - https://bugs.webkit.org/show_bug.cgi?id=21476 - -2008-10-08 Darin Adler <darin@apple.com> - - Reviewed by Cameron Zwarich. - - - https://bugs.webkit.org/show_bug.cgi?id=21403 - Bug 21403: use new CallFrame class rather than Register* for call frame manipulation - - Add CallFrame as a synonym for ExecState. Arguably, some day we should switch every - client over to the new name. - - Use CallFrame* consistently rather than Register* or ExecState* in low-level code such - as Machine.cpp and CTI.cpp. Similarly, use callFrame rather than r as its name and use - accessor functions to get at things in the frame. - - Eliminate other uses of ExecState* that aren't needed, replacing in some cases with - JSGlobalData* and in other cases eliminating them entirely. - - * API/JSObjectRef.cpp: - (JSObjectMakeFunctionWithCallback): - (JSObjectMakeFunction): - (JSObjectHasProperty): - (JSObjectGetProperty): - (JSObjectSetProperty): - (JSObjectDeleteProperty): - * API/OpaqueJSString.cpp: - * API/OpaqueJSString.h: - * VM/CTI.cpp: - (JSC::CTI::getConstant): - (JSC::CTI::emitGetArg): - (JSC::CTI::emitGetPutArg): - (JSC::CTI::getConstantImmediateNumericArg): - (JSC::CTI::printOpcodeOperandTypes): - (JSC::CTI::CTI): - (JSC::CTI::compileOpCall): - (JSC::CTI::compileBinaryArithOp): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompile): - (JSC::CTI::privateCompileGetByIdProto): - (JSC::CTI::privateCompileGetByIdChain): - (JSC::CTI::compileRegExp): - * VM/CTI.h: - * VM/CodeBlock.h: - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::emitEqualityOp): - (JSC::CodeGenerator::emitLoad): - (JSC::CodeGenerator::emitUnexpectedLoad): - (JSC::CodeGenerator::emitConstruct): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (JSC::jsLess): - (JSC::jsLessEq): - (JSC::jsAddSlowCase): - (JSC::jsAdd): - (JSC::jsTypeStringForValue): - (JSC::Machine::resolve): - (JSC::Machine::resolveSkip): - (JSC::Machine::resolveGlobal): - (JSC::inlineResolveBase): - (JSC::Machine::resolveBase): - (JSC::Machine::resolveBaseAndProperty): - (JSC::Machine::resolveBaseAndFunc): - (JSC::Machine::slideRegisterWindowForCall): - (JSC::isNotObject): - (JSC::Machine::callEval): - (JSC::Machine::dumpCallFrame): - (JSC::Machine::dumpRegisters): - (JSC::Machine::unwindCallFrame): - (JSC::Machine::throwException): - (JSC::DynamicGlobalObjectScope::DynamicGlobalObjectScope): - (JSC::DynamicGlobalObjectScope::~DynamicGlobalObjectScope): - (JSC::Machine::execute): - (JSC::Machine::debug): - (JSC::Machine::createExceptionScope): - (JSC::cachePrototypeChain): - (JSC::Machine::tryCachePutByID): - (JSC::Machine::tryCacheGetByID): - (JSC::Machine::privateExecute): - (JSC::Machine::retrieveArguments): - (JSC::Machine::retrieveCaller): - (JSC::Machine::retrieveLastCaller): - (JSC::Machine::findFunctionCallFrame): - (JSC::Machine::getArgumentsData): - (JSC::Machine::tryCTICachePutByID): - (JSC::Machine::getCTIArrayLengthTrampoline): - (JSC::Machine::getCTIStringLengthTrampoline): - (JSC::Machine::tryCTICacheGetByID): - (JSC::Machine::cti_op_convert_this): - (JSC::Machine::cti_op_end): - (JSC::Machine::cti_op_add): - (JSC::Machine::cti_op_pre_inc): - (JSC::Machine::cti_timeout_check): - (JSC::Machine::cti_op_loop_if_less): - (JSC::Machine::cti_op_loop_if_lesseq): - (JSC::Machine::cti_op_new_object): - (JSC::Machine::cti_op_put_by_id): - (JSC::Machine::cti_op_put_by_id_second): - (JSC::Machine::cti_op_put_by_id_generic): - (JSC::Machine::cti_op_put_by_id_fail): - (JSC::Machine::cti_op_get_by_id): - (JSC::Machine::cti_op_get_by_id_second): - (JSC::Machine::cti_op_get_by_id_generic): - (JSC::Machine::cti_op_get_by_id_fail): - (JSC::Machine::cti_op_instanceof): - (JSC::Machine::cti_op_del_by_id): - (JSC::Machine::cti_op_mul): - (JSC::Machine::cti_op_new_func): - (JSC::Machine::cti_op_call_JSFunction): - (JSC::Machine::cti_vm_compile): - (JSC::Machine::cti_op_push_activation): - (JSC::Machine::cti_op_call_NotJSFunction): - (JSC::Machine::cti_op_create_arguments): - (JSC::Machine::cti_op_tear_off_activation): - (JSC::Machine::cti_op_tear_off_arguments): - (JSC::Machine::cti_op_ret_profiler): - (JSC::Machine::cti_op_ret_scopeChain): - (JSC::Machine::cti_op_new_array): - (JSC::Machine::cti_op_resolve): - (JSC::Machine::cti_op_construct_JSConstruct): - (JSC::Machine::cti_op_construct_NotJSConstruct): - (JSC::Machine::cti_op_get_by_val): - (JSC::Machine::cti_op_resolve_func): - (JSC::Machine::cti_op_sub): - (JSC::Machine::cti_op_put_by_val): - (JSC::Machine::cti_op_put_by_val_array): - (JSC::Machine::cti_op_lesseq): - (JSC::Machine::cti_op_loop_if_true): - (JSC::Machine::cti_op_negate): - (JSC::Machine::cti_op_resolve_base): - (JSC::Machine::cti_op_resolve_skip): - (JSC::Machine::cti_op_resolve_global): - (JSC::Machine::cti_op_div): - (JSC::Machine::cti_op_pre_dec): - (JSC::Machine::cti_op_jless): - (JSC::Machine::cti_op_not): - (JSC::Machine::cti_op_jtrue): - (JSC::Machine::cti_op_post_inc): - (JSC::Machine::cti_op_eq): - (JSC::Machine::cti_op_lshift): - (JSC::Machine::cti_op_bitand): - (JSC::Machine::cti_op_rshift): - (JSC::Machine::cti_op_bitnot): - (JSC::Machine::cti_op_resolve_with_base): - (JSC::Machine::cti_op_new_func_exp): - (JSC::Machine::cti_op_mod): - (JSC::Machine::cti_op_less): - (JSC::Machine::cti_op_neq): - (JSC::Machine::cti_op_post_dec): - (JSC::Machine::cti_op_urshift): - (JSC::Machine::cti_op_bitxor): - (JSC::Machine::cti_op_new_regexp): - (JSC::Machine::cti_op_bitor): - (JSC::Machine::cti_op_call_eval): - (JSC::Machine::cti_op_throw): - (JSC::Machine::cti_op_get_pnames): - (JSC::Machine::cti_op_next_pname): - (JSC::Machine::cti_op_push_scope): - (JSC::Machine::cti_op_pop_scope): - (JSC::Machine::cti_op_typeof): - (JSC::Machine::cti_op_to_jsnumber): - (JSC::Machine::cti_op_in): - (JSC::Machine::cti_op_push_new_scope): - (JSC::Machine::cti_op_jmp_scopes): - (JSC::Machine::cti_op_put_by_index): - (JSC::Machine::cti_op_switch_imm): - (JSC::Machine::cti_op_switch_char): - (JSC::Machine::cti_op_switch_string): - (JSC::Machine::cti_op_del_by_val): - (JSC::Machine::cti_op_put_getter): - (JSC::Machine::cti_op_put_setter): - (JSC::Machine::cti_op_new_error): - (JSC::Machine::cti_op_debug): - (JSC::Machine::cti_vm_throw): - * VM/Machine.h: - * VM/Register.h: - * VM/RegisterFile.h: - * kjs/Arguments.h: - * kjs/DebuggerCallFrame.cpp: - (JSC::DebuggerCallFrame::functionName): - (JSC::DebuggerCallFrame::type): - (JSC::DebuggerCallFrame::thisObject): - (JSC::DebuggerCallFrame::evaluate): - * kjs/DebuggerCallFrame.h: - * kjs/ExecState.cpp: - (JSC::CallFrame::thisValue): - * kjs/ExecState.h: - * kjs/FunctionConstructor.cpp: - (JSC::constructFunction): - * kjs/JSActivation.cpp: - (JSC::JSActivation::JSActivation): - (JSC::JSActivation::argumentsGetter): - * kjs/JSActivation.h: - * kjs/JSGlobalObject.cpp: - (JSC::JSGlobalObject::init): - * kjs/JSGlobalObjectFunctions.cpp: - (JSC::globalFuncEval): - * kjs/JSVariableObject.h: - * kjs/Parser.cpp: - (JSC::Parser::parse): - * kjs/RegExpConstructor.cpp: - (JSC::constructRegExp): - * kjs/RegExpPrototype.cpp: - (JSC::regExpProtoFuncCompile): - * kjs/Shell.cpp: - (prettyPrintScript): - * kjs/StringPrototype.cpp: - (JSC::stringProtoFuncMatch): - (JSC::stringProtoFuncSearch): - * kjs/identifier.cpp: - (JSC::Identifier::checkSameIdentifierTable): - * kjs/interpreter.cpp: - (JSC::Interpreter::checkSyntax): - (JSC::Interpreter::evaluate): - * kjs/nodes.cpp: - (JSC::ThrowableExpressionData::emitThrowError): - (JSC::RegExpNode::emitCode): - (JSC::ArrayNode::emitCode): - (JSC::InstanceOfNode::emitCode): - * kjs/nodes.h: - * kjs/regexp.cpp: - (JSC::RegExp::RegExp): - (JSC::RegExp::create): - * kjs/regexp.h: - * profiler/HeavyProfile.h: - * profiler/Profile.h: - * wrec/WREC.cpp: - * wrec/WREC.h: - -2008-10-08 Prasanth Ullattil <pullatti@trolltech.com> - - Reviewed by Oliver Hunt. - - Avoid endless loops when compiling without the computed goto - optimization. - - NEXT_OPCODE expands to "continue", which will not work inside - loops. + * parser/Nodes.cpp: + (JSC::ProgramNode::generateBytecode): + (JSC::EvalNode::generateBytecode): + (JSC::EvalNode::bytecodeForExceptionInfoReparse): + (JSC::FunctionBodyNode::generateBytecode): + (JSC::FunctionBodyNode::bytecodeForExceptionInfoReparse): - * VM/Machine.cpp: - (JSC::Machine::privateExecute): +2009-06-23 Oliver Hunt <oliver@apple.com> -2008-10-08 Maciej Stachowiak <mjs@apple.com> + Reviewed by Gavin Barraclough. - Reviewed by Oliver Hunt. + <rdar://problem/6992806> REGRESSION: Enumeration can skip new properties in cases of prototypes that have more than 64 (26593) + <https://bugs.webkit.org/show_bug.cgi?id=26593> - Re-landing the following fix with the crashing bug in it fixed (r37405): - - - optimize away multiplication by constant 1.0 - - 2.3% speedup on v8 RayTrace benchmark - - Apparently it's not uncommon for JavaScript code to multiply by - constant 1.0 in the mistaken belief that this converts integer to - floating point and that there is any operational difference. - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): Optimize to_jsnumber for - case where parameter is already number. - (JSC::CTI::privateCompileSlowCases): ditto - * VM/Machine.cpp: - (JSC::Machine::privateExecute): ditto - * kjs/grammar.y: - (makeMultNode): Transform as follows: - +FOO * BAR ==> FOO * BAR - FOO * +BAR ==> FOO * BAR - FOO * 1 ==> +FOO - 1 * FOO ==> +FOO - (makeDivNode): Transform as follows: - +FOO / BAR ==> FOO / BAR - FOO / +BAR ==> FOO / BAR - (makeSubNode): Transform as follows: - +FOO - BAR ==> FOO - BAR - FOO - +BAR ==> FOO - BAR - * kjs/nodes.h: - (JSC::ExpressionNode::stripUnaryPlus): Helper for above - grammar.y changes - (JSC::UnaryPlusNode::stripUnaryPlus): ditto - -2008-10-08 Maciej Stachowiak <mjs@apple.com> + Do not attempt to cache structure chains if they contain a dictionary at any level. - Reviewed by Oliver Hunt. - - - correctly handle appending -0 to a string, it should stringify as just 0 + * interpreter/Interpreter.cpp: + (JSC::Interpreter::tryCachePutByID): + (JSC::Interpreter::tryCacheGetByID): + * jit/JITStubs.cpp: + (JSC::JITThunks::tryCachePutByID): + * runtime/Structure.cpp: + (JSC::Structure::getEnumerablePropertyNames): + (JSC::Structure::addPropertyTransition): + * runtime/StructureChain.cpp: + (JSC::StructureChain::isCacheable): + * runtime/StructureChain.h: - * kjs/ustring.cpp: - (JSC::concatenate): +2009-06-23 Yong Li <yong.li@torchmobile.com> -2008-10-08 Prasanth Ullattil <pullatti@trolltech.com> + Reviewed by George Staikos. - Reviewed by Simon. + https://bugs.webkit.org/show_bug.cgi?id=26654 + Add the proper export define for the JavaScriptCore API when building for WINCE. - Fix WebKit compilation with VC2008SP1 + * API/JSBase.h: - Apply the TR1 workaround for JavaScriptCore, too. +2009-06-23 Joe Mason <joe.mason@torchmobile.com> - * JavaScriptCore.pro: + Reviewed by Adam Treat. -2008-10-08 Prasanth Ullattil <pullatti@trolltech.com> + Authors: Yong Li <yong.li@torchmobile.com>, Joe Mason <joe.mason@torchmobile.com> - Reviewed by Simon. + https://bugs.webkit.org/show_bug.cgi?id=26611 + Implement currentThreadStackBase on WINCE by adding a global, + g_stackBase, which must be set to the address of a local variable + by the caller before calling any WebKit function that invokes JSC. - Fix compilation errors on VS2008 64Bit + * runtime/Collector.cpp: + (JSC::isPageWritable): + (JSC::getStackBase): + Starts at the top of the stack and returns the entire range of + consecutive writable pages as an estimate of the actual stack. + This will be much bigger than the actual stack range, so some + dead objects can't be collected, but it guarantees live objects + aren't collected prematurely. - * kjs/collector.cpp: (JSC::currentThreadStackBase): + On WinCE, returns g_stackBase if set or call getStackBase as a + fallback if not. -2008-10-08 André Pönitz <apoenitz@trolltech.com> - - Reviewed by Simon. - - Fix compilation with Qt namespaces. - - * wtf/Threading.h: - -2008-10-07 Sam Weinig <sam@webkit.org> - - Roll out r37405. - -2008-10-07 Oliver Hunt <oliver@apple.com> - - Reviewed by Cameron Zwarich. - - Switch CTI runtime calls to the fastcall calling convention - - Basically this means that we get to store the argument for CTI - calls in the ECX register, which saves a register->memory write - and subsequent memory->register read. - - This is a 1.7% progression in SunSpider and 2.4% on commandline - v8 tests on Windows - - * VM/CTI.cpp: - (JSC::): - (JSC::CTI::privateCompilePutByIdTransition): - (JSC::CTI::privateCompilePatchGetArrayLength): - * VM/CTI.h: - * VM/Machine.h: - * masm/X86Assembler.h: - (JSC::X86Assembler::emitRestoreArgumentReference): - (JSC::X86Assembler::emitRestoreArgumentReferenceForTrampoline): - We need this to correctly reload ecx from inside certain property access - trampolines. - * wtf/Platform.h: - -2008-10-07 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Mark Rowe. - - - optimize away multiplication by constant 1.0 - - 2.3% speedup on v8 RayTrace benchmark - - Apparently it's not uncommon for JavaScript code to multiply by - constant 1.0 in the mistaken belief that this converts integer to - floating point and that there is any operational difference. - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): Optimize to_jsnumber for - case where parameter is already number. - (JSC::CTI::privateCompileSlowCases): ditto - * VM/Machine.cpp: - (JSC::Machine::privateExecute): ditto - * kjs/grammar.y: - (makeMultNode): Transform as follows: - +FOO * BAR ==> FOO * BAR - FOO * +BAR ==> FOO * BAR - FOO * 1 ==> +FOO - 1 * FOO ==> +FOO - (makeDivNode): Transform as follows: - +FOO / BAR ==> FOO / BAR - FOO / +BAR ==> FOO / BAR - (makeSubNode): Transform as follows: - +FOO - BAR ==> FOO - BAR - FOO - +BAR ==> FOO - BAR - * kjs/nodes.h: - (JSC::ExpressionNode::stripUnaryPlus): Helper for above - grammar.y changes - (JSC::UnaryPlusNode::stripUnaryPlus): ditto - -2008-10-07 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Oliver Hunt. - - - make constant folding code more consistent - - Added a makeSubNode to match add, mult and div; use the makeFooNode functions always, - instead of allocating nodes directly in other places in the grammar. - - * kjs/grammar.y: - -2008-10-07 Sam Weinig <sam@webkit.org> - - Reviewed by Cameron Zwarich. - - Move hasGetterSetterProperties flag from PropertyMap to StructureID. - - * kjs/JSObject.cpp: - (JSC::JSObject::put): - (JSC::JSObject::defineGetter): - (JSC::JSObject::defineSetter): - * kjs/JSObject.h: - (JSC::JSObject::hasGetterSetterProperties): - (JSC::JSObject::getOwnPropertySlotForWrite): - (JSC::JSObject::getOwnPropertySlot): - * kjs/PropertyMap.h: - * kjs/StructureID.cpp: - (JSC::StructureID::StructureID): - (JSC::StructureID::addPropertyTransition): - (JSC::StructureID::toDictionaryTransition): - (JSC::StructureID::changePrototypeTransition): - (JSC::StructureID::getterSetterTransition): - * kjs/StructureID.h: - (JSC::StructureID::hasGetterSetterProperties): - (JSC::StructureID::setHasGetterSetterProperties): - -2008-10-07 Sam Weinig <sam@webkit.org> - - Reviewed by Cameron Zwarich. - - Roll r37370 back in with bug fixes. - - - PropertyMap::storageSize() should reflect the number of keys + deletedOffsets - and has nothing to do with the internal deletedSentinel count anymore. - -2008-10-07 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Move callframe initialization into JIT code, again. - - As a part of the restructuring the second result from functions is now - returned in edx, allowing the new value of 'r' to be returned via a - register, and stored to the stack from JIT code, too. - - 4.5% progression on v8-tests. (3% in their harness) - - * VM/CTI.cpp: - (JSC::): - (JSC::CTI::emitCall): - (JSC::CTI::compileOpCall): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - (JSC::CTI::privateCompile): - * VM/CTI.h: - (JSC::CallRecord::CallRecord): - * VM/Machine.cpp: - (JSC::Machine::cti_op_call_JSFunction): - (JSC::Machine::cti_op_construct_JSConstruct): - (JSC::Machine::cti_op_resolve_func): - (JSC::Machine::cti_op_post_inc): - (JSC::Machine::cti_op_resolve_with_base): - (JSC::Machine::cti_op_post_dec): - * VM/Machine.h: - * kjs/JSFunction.h: - * kjs/ScopeChain.h: - -2008-10-07 Mark Rowe <mrowe@apple.com> - - Fix typo in method name. - - * wrec/WREC.cpp: - * wrec/WREC.h: - -2008-10-07 Cameron Zwarich <zwarich@apple.com> - - Rubber-stamped by Mark Rowe. - - Roll out r37370. - -2008-10-06 Sam Weinig <sam@webkit.org> - - Reviewed by Cameron Zwarich. - - Fix for https://bugs.webkit.org/show_bug.cgi?id=21415 - Improve the division between PropertyStorageArray and PropertyMap - - - Rework ProperyMap to store offsets in the value so that they don't - change when rehashing. This allows us not to have to keep the - PropertyStorageArray in sync and thus not have to pass it in. - - Rename PropertyMap::getOffset -> PropertyMap::get since put/remove - now also return offsets. - - A Vector of deleted offsets is now needed since the storage is out of - band. - - 1% win on SunSpider. Wash on V8 suite. - - * JavaScriptCore.exp: - * VM/CTI.cpp: - (JSC::transitionWillNeedStorageRealloc): - * VM/Machine.cpp: - (JSC::Machine::privateExecute): - Transition logic can be greatly simplified by the fact that - the storage capacity is always known, and is correct for the - inline case. - * kjs/JSObject.cpp: - (JSC::JSObject::put): Rename getOffset -> get. - (JSC::JSObject::deleteProperty): Ditto. - (JSC::JSObject::getPropertyAttributes): Ditto. - (JSC::JSObject::removeDirect): Use returned offset to - clear the value in the PropertyNameArray. - (JSC::JSObject::allocatePropertyStorage): Add assert. - * kjs/JSObject.h: - (JSC::JSObject::getDirect): Rename getOffset -> get - (JSC::JSObject::getDirectLocation): Rename getOffset -> get - (JSC::JSObject::putDirect): Use propertyStorageCapacity to determine whether - or not to resize. Also, since put now returns an offset (and thus - addPropertyTransition does also) setting of the PropertyStorageArray is - now done here. - (JSC::JSObject::transitionTo): - * kjs/PropertyMap.cpp: - (JSC::PropertyMap::checkConsistency): PropertyStorageArray is no longer - passed in. - (JSC::PropertyMap::operator=): Copy the delete offsets vector. - (JSC::PropertyMap::put): Instead of setting the PropertyNameArray - explicitly, return the offset where the value should go. - (JSC::PropertyMap::remove): Instead of removing from the PropertyNameArray - explicitly, return the offset where the value should be removed. - (JSC::PropertyMap::get): Switch to using the stored offset, instead - of the implicit one. - (JSC::PropertyMap::insert): - (JSC::PropertyMap::expand): This is never called when m_table is null, - so remove that branch and add it as an assertion. - (JSC::PropertyMap::createTable): Consistency checks no longer take - a PropertyNameArray. - (JSC::PropertyMap::rehash): No need to rehash the PropertyNameArray - now that it is completely out of band. - * kjs/PropertyMap.h: - (JSC::PropertyMapEntry::PropertyMapEntry): Store offset into PropertyNameArray. - (JSC::PropertyMap::get): Switch to using the stored offset, instead - of the implicit one. - * kjs/StructureID.cpp: - (JSC::StructureID::StructureID): Initialize the propertyStorageCapacity to - JSObject::inlineStorageCapacity. - (JSC::StructureID::growPropertyStorageCapacity): Grow the storage capacity as - described below. - (JSC::StructureID::addPropertyTransition): Copy the storage capacity. - (JSC::StructureID::toDictionaryTransition): Ditto. - (JSC::StructureID::changePrototypeTransition): Ditto. - (JSC::StructureID::getterSetterTransition): Ditto. - * kjs/StructureID.h: - (JSC::StructureID::propertyStorageCapacity): Add propertyStorageCapacity - which is the current capacity for the JSObjects PropertyStorageArray. - It starts at the JSObject::inlineStorageCapacity (currently 2), then - when it first needs to be resized moves to the JSObject::nonInlineBaseStorageCapacity - (currently 16), and after that doubles each time. - -2008-10-06 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Oliver Hunt. - - Bug 21396: Remove the OptionalCalleeActivation call frame slot - <https://bugs.webkit.org/show_bug.cgi?id=21396> - - Remove the OptionalCalleeActivation call frame slot. We have to be - careful to store the activation object in a register, because objects - in the scope chain do not get marked. - - This is a 0.3% speedup on both SunSpider and the V8 benchmark. - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): - * VM/CodeBlock.cpp: - (JSC::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::CodeGenerator): - (JSC::CodeGenerator::emitReturn): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (JSC::Machine::dumpRegisters): - (JSC::Machine::unwindCallFrame): - (JSC::Machine::privateExecute): - (JSC::Machine::cti_op_call_JSFunction): - (JSC::Machine::cti_op_push_activation): - (JSC::Machine::cti_op_tear_off_activation): - (JSC::Machine::cti_op_construct_JSConstruct): - * VM/Machine.h: - (JSC::Machine::initializeCallFrame): - * VM/RegisterFile.h: - (JSC::RegisterFile::): - -2008-10-06 Tony Chang <tony@chromium.org> +2009-06-23 Oliver Hunt <oliver@apple.com> Reviewed by Alexey Proskuryakov. - Chromium doesn't use pthreads on windows, so make its use conditional. - - Also convert a WORD to a DWORD to avoid a compiler warning. This - matches the other methods around it. - - * wtf/ThreadingWin.cpp: - (WTF::wtfThreadEntryPoint): - (WTF::ThreadCondition::broadcast): - -2008-10-06 Mark Mentovai <mark@moxienet.com> - - Reviewed by Tim Hatcher. - - Allow ENABLE_DASHBOARD_SUPPORT and ENABLE_MAC_JAVA_BRIDGE to be - disabled on the Mac. - - https://bugs.webkit.org/show_bug.cgi?id=21333 - - * wtf/Platform.h: - -2008-10-06 Steve Falkenburg <sfalken@apple.com> - - https://bugs.webkit.org/show_bug.cgi?id=21416 - Pass 0 for size to VirtualAlloc, as documented by MSDN. - Identified by Application Verifier. - - Reviewed by Darin Adler. - - * kjs/collector.cpp: - (KJS::freeBlock): - -2008-10-06 Kevin McCullough <kmccullough@apple.com> - - Reviewed by Tim Hatcheri and Oliver Hunt. - - https://bugs.webkit.org/show_bug.cgi?id=21412 - Bug 21412: Refactor user initiated profile count to be more stable - - Export UString::from for use with creating the profile title. - - * JavaScriptCore.exp: - -2008-10-06 Maciej Stachowiak <mjs@apple.com> - - Not reviewed. Build fix. - - - revert toBoolean changes (r37333 and r37335); need to make WebCore work with these - - * API/JSValueRef.cpp: - (JSValueToBoolean): - * ChangeLog: - * JavaScriptCore.exp: - * VM/CodeBlock.cpp: - (JSC::CodeBlock::dump): - * VM/Machine.cpp: - (JSC::Machine::privateExecute): - (JSC::Machine::cti_op_loop_if_true): - (JSC::Machine::cti_op_not): - (JSC::Machine::cti_op_jtrue): - * kjs/ArrayPrototype.cpp: - (JSC::arrayProtoFuncFilter): - (JSC::arrayProtoFuncEvery): - (JSC::arrayProtoFuncSome): - * kjs/BooleanConstructor.cpp: - (JSC::constructBoolean): - (JSC::callBooleanConstructor): - * kjs/GetterSetter.h: - * kjs/JSCell.h: - (JSC::JSValue::toBoolean): - * kjs/JSNumberCell.cpp: - (JSC::JSNumberCell::toBoolean): - * kjs/JSNumberCell.h: - * kjs/JSObject.cpp: - (JSC::JSObject::toBoolean): - * kjs/JSObject.h: - * kjs/JSString.cpp: - (JSC::JSString::toBoolean): - * kjs/JSString.h: - * kjs/JSValue.h: - * kjs/RegExpConstructor.cpp: - (JSC::setRegExpConstructorMultiline): - * kjs/RegExpObject.cpp: - (JSC::RegExpObject::match): - * kjs/RegExpPrototype.cpp: - (JSC::regExpProtoFuncToString): - -2008-10-06 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Sam Weinig. - - - optimize op_jtrue, op_loop_if_true and op_not in various ways - https://bugs.webkit.org/show_bug.cgi?id=21404 - - 1) Make JSValue::toBoolean nonvirtual and completely inline by - making use of the StructureID type field. - - 2) Make JSValue::toBoolean not take an ExecState; doesn't need it. - - 3) Make op_not, op_loop_if_true and op_jtrue not read the - ExecState (toBoolean doesn't need it any more) and not check - exceptions (toBoolean can't throw). - - * API/JSValueRef.cpp: - (JSValueToBoolean): - * JavaScriptCore.exp: - * VM/CodeBlock.cpp: - (JSC::CodeBlock::dump): - * VM/Machine.cpp: - (JSC::Machine::privateExecute): - (JSC::Machine::cti_op_loop_if_true): - (JSC::Machine::cti_op_not): - (JSC::Machine::cti_op_jtrue): - * kjs/ArrayPrototype.cpp: - (JSC::arrayProtoFuncFilter): - (JSC::arrayProtoFuncEvery): - (JSC::arrayProtoFuncSome): - * kjs/BooleanConstructor.cpp: - (JSC::constructBoolean): - (JSC::callBooleanConstructor): - * kjs/GetterSetter.h: - * kjs/JSCell.h: - (JSC::JSValue::toBoolean): - * kjs/JSNumberCell.cpp: - * kjs/JSNumberCell.h: - (JSC::JSNumberCell::toBoolean): - * kjs/JSObject.cpp: - * kjs/JSObject.h: - (JSC::JSObject::toBoolean): - (JSC::JSCell::toBoolean): - * kjs/JSString.cpp: - * kjs/JSString.h: - (JSC::JSString::toBoolean): - * kjs/JSValue.h: - * kjs/RegExpConstructor.cpp: - (JSC::setRegExpConstructorMultiline): - * kjs/RegExpObject.cpp: - (JSC::RegExpObject::match): - * kjs/RegExpPrototype.cpp: - (JSC::regExpProtoFuncToString): - -2008-10-06 Ariya Hidayat <ariya.hidayat@trolltech.com> - - Reviewed by Simon. - - Build fix for MinGW. - - * JavaScriptCore.pri: - * kjs/DateMath.cpp: - (JSC::highResUpTime): - -2008-10-05 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Oliver Hunt. - - Remove ScopeNode::containsClosures() now that it is unused. - - * kjs/nodes.h: - (JSC::ScopeNode::containsClosures): - -2008-10-05 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Cameron Zwarich. - - - fix releas-only test failures caused by the fix to bug 21375 - - * VM/Machine.cpp: - (JSC::Machine::unwindCallFrame): Update ExecState while unwinding call frames; - it now matters more to have a still-valid ExecState, since dynamicGlobalObject - will make use of the ExecState's scope chain. - * VM/Machine.h: - -2008-10-05 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Oliver Hunt. - - Bug 21364: Remove the branch in op_ret for OptionalCalleeActivation and OptionalCalleeArguments - <https://bugs.webkit.org/show_bug.cgi?id=21364> - - Use information from the parser to detect whether an activation is - needed or 'arguments' is used, and emit explicit instructions to tear - them off before op_ret. This allows a branch to be removed from op_ret - and simplifies some other code. This does cause a small change in the - behaviour of 'f.arguments'; it is no longer live when 'arguments' is not - mentioned in the lexical scope of the function. - - It should now be easy to remove the OptionaCalleeActivation slot in the - call frame, but this will be done in a later patch. - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): - * VM/CodeBlock.cpp: - (JSC::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::emitReturn): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (JSC::Machine::unwindCallFrame): - (JSC::Machine::privateExecute): - (JSC::Machine::retrieveArguments): - (JSC::Machine::cti_op_create_arguments): - (JSC::Machine::cti_op_tear_off_activation): - (JSC::Machine::cti_op_tear_off_arguments): - * VM/Machine.h: - * VM/Opcode.h: - * kjs/Arguments.cpp: - (JSC::Arguments::mark): - * kjs/Arguments.h: - (JSC::Arguments::isTornOff): - (JSC::Arguments::Arguments): - (JSC::Arguments::copyRegisters): - (JSC::JSActivation::copyRegisters): - * kjs/JSActivation.cpp: - (JSC::JSActivation::argumentsGetter): - * kjs/JSActivation.h: - -2008-10-05 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Oliver Hunt. - - - fixed "REGRESSION (r37297): fast/js/deep-recursion-test takes too long and times out" - https://bugs.webkit.org/show_bug.cgi?id=21375 - - The problem is that dynamicGlobalObject had become O(N) in number - of call frames, but unwinding the stack for an exception called it - for every call frame, resulting in O(N^2) behavior for an - exception thrown from inside deep recursion. - - Instead of doing it that way, stash the dynamic global object in JSGlobalData. - - * JavaScriptCore.exp: - * VM/Machine.cpp: - (JSC::DynamicGlobalObjectScope::DynamicGlobalObjectScope): Helper class to temporarily - store and later restore a dynamicGlobalObject in JSGlobalData. - (JSC::DynamicGlobalObjectScope::~DynamicGlobalObjectScope): - (JSC::Machine::execute): In each version, establish a DynamicGlobalObjectScope. - For ProgramNode, always establish set new dynamicGlobalObject, for FunctionBody and Eval, - only if none is currently set. - * VM/Machine.h: - * kjs/ExecState.h: - * kjs/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): Ininitalize new dynamicGlobalObject field to 0. - * kjs/JSGlobalData.h: - * kjs/JSGlobalObject.h: - (JSC::ExecState::dynamicGlobalObject): Moved here from ExecState for benefit of inlining. - Return lexical global object if this is a globalExec(), otherwise look in JSGlobalData - for the one stashed there. - -2008-10-05 Sam Weinig <sam@webkit.org> - - Reviewed by Maciej Stachowiak. - - Avoid an extra lookup when transitioning to an existing StructureID - by caching the offset of property that caused the transition. - - 1% win on V8 suite. Wash on SunSpider. - - * kjs/PropertyMap.cpp: - (JSC::PropertyMap::put): - * kjs/PropertyMap.h: - * kjs/StructureID.cpp: - (JSC::StructureID::StructureID): - (JSC::StructureID::addPropertyTransition): - * kjs/StructureID.h: - (JSC::StructureID::setCachedTransistionOffset): - (JSC::StructureID::cachedTransistionOffset): - -2008-10-05 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Maciej Stachowiak. - - Bug 21364: Remove the branch in op_ret for OptionalCalleeActivation and OptionalCalleeArguments - <https://bugs.webkit.org/show_bug.cgi?id=21364> - - This patch does not yet remove the branch, but it does a bit of refactoring - so that a CodeGenerator now knows whether the associated CodeBlock will need - a full scope before doing any code generation. This makes it possible to emit - explicit tear-off instructions before every op_ret. - - * VM/CodeBlock.h: - (JSC::CodeBlock::CodeBlock): - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::generate): - (JSC::CodeGenerator::CodeGenerator): - (JSC::CodeGenerator::emitPushScope): - (JSC::CodeGenerator::emitPushNewScope): - * kjs/nodes.h: - (JSC::ScopeNode::needsActivation): - -2008-10-05 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Cameron Zwarich. - - Fix for bug #21387 - using SamplingTool with CTI. - - (1) A repatch offset offset changes due to an additional instruction to update SamplingTool state. - (2) Fix an incusion order problem due to ExecState changes. - (3) Change to a MACHINE_SAMPLING macro, use of exec should now be accessing global data. - - * VM/CTI.h: - (JSC::CTI::execute): - * VM/SamplingTool.h: - (JSC::SamplingTool::privateExecuteReturned): - * kjs/Shell.cpp: - -2008-10-04 Mark Rowe <mrowe@apple.com> - - Reviewed by Tim Hatcher. - - Add a 'Check For Weak VTables' build phase to catch weak vtables as early as possible. - - * JavaScriptCore.xcodeproj/project.pbxproj: + Fix stupid performance problem in the LiteralParser -2008-10-04 Sam Weinig <sam@webkit.org> + The LiteralParser was making a new UString in order to use + toDouble, however UString's toDouble allows a much wider range + of numberic strings than the LiteralParser accepts, and requires + an additional heap allocation or two for the construciton of the + UString. To rectify this we just call WTF::dtoa directly using + a stack allocated buffer to hold the validated numeric literal. - Reviewed by Oliver Hunt. + * runtime/LiteralParser.cpp: + (JSC::LiteralParser::Lexer::lexNumber): + (JSC::LiteralParser::parse): + * runtime/LiteralParser.h: - Fix https://bugs.webkit.org/show_bug.cgi?id=21320 - leaks of PropertyNameArrayData seen on buildbot +2009-06-22 Oliver Hunt <oliver@apple.com> - - Fix RefPtr cycle by making PropertyNameArrayData's pointer back - to the StructureID a weak pointer. + Reviewed by Alexey Proskuryakov. - * kjs/PropertyNameArray.h: - (JSC::PropertyNameArrayData::setCachedStructureID): - (JSC::PropertyNameArrayData::cachedStructureID): - * kjs/StructureID.cpp: - (JSC::StructureID::getEnumerablePropertyNames): - (JSC::StructureID::clearEnumerationCache): - (JSC::StructureID::~StructureID): + Bug 26640: JSON.stringify needs to special case Boolean objects + <https://bugs.webkit.org/show_bug.cgi?id=26640> -2008-10-04 Darin Adler <darin@apple.com> + Add special case handling of the Boolean object so we match current + ES5 errata. - Reviewed by Cameron Zwarich. + * runtime/JSONObject.cpp: + (JSC::unwrapBoxedPrimitive): renamed from unwrapNumberOrString + (JSC::gap): + (JSC::Stringifier::appendStringifiedValue): - - https://bugs.webkit.org/show_bug.cgi?id=21295 - Bug 21295: Replace ExecState with a call frame Register pointer - - 10% faster on Richards; other v8 benchmarks faster too. - A wash on SunSpider. - - This does the minimum necessary to get the speedup. Next step in - cleaning this up is to replace ExecState with a CallFrame class, - and be more judicious about when to pass a call frame and when - to pass a global data pointer, global object pointer, or perhaps - something else entirely. - - * VM/CTI.cpp: Remove the debug-only check of the exception in - ctiVMThrowTrampoline -- already checked in the code the trampoline - jumps to, so not all that useful. Removed the exec argument from - ctiTrampoline. Removed emitDebugExceptionCheck -- no longer needed. - (JSC::CTI::emitCall): Removed code to set ExecState::m_callFrame. - (JSC::CTI::privateCompileMainPass): Removed code in catch to extract - the exception from ExecState::m_exception; instead, the code that - jumps into catch will make sure the exception is already in eax. - * VM/CTI.h: Removed exec from the ctiTrampoline. Also removed the - non-helpful "volatile". Temporarily left ARG_exec in as a synonym - for ARG_r; I'll change that on a future cleanup pass when introducing - more use of the CallFrame type. - (JSC::CTI::execute): Removed the ExecState* argument. - - * VM/ExceptionHelpers.cpp: - (JSC::InterruptedExecutionError::InterruptedExecutionError): Take - JSGlobalData* instead of ExecState*. - (JSC::createInterruptedExecutionException): Ditto. - * VM/ExceptionHelpers.h: Ditto. Also removed an unneeded include. - - * VM/Machine.cpp: - (JSC::slideRegisterWindowForCall): Removed the exec and - exceptionValue arguments. Changed to return 0 when there's a stack - overflow rather than using a separate exception argument to cut - down on memory accesses in the calling convention. - (JSC::Machine::unwindCallFrame): Removed the exec argument when - constructing a DebuggerCallFrame. Also removed code to set - ExecState::m_callFrame. - (JSC::Machine::throwException): Removed the exec argument when - construction a DebuggerCallFrame. - (JSC::Machine::execute): Updated to use the register instead of - ExecState and also removed various uses of ExecState. - (JSC::Machine::debug): - (JSC::Machine::privateExecute): Put globalData into a local - variable so it can be used throughout the interpreter. Changed - the VM_CHECK_EXCEPTION to get the exception in globalData instead - of through ExecState. - (JSC::Machine::retrieveLastCaller): Turn exec into a registers - pointer by calling registers() instead of by getting m_callFrame. - (JSC::Machine::callFrame): Ditto. - Tweaked exception macros. Made new versions for when you know - you have an exception. Get at global exception with ARG_globalData. - Got rid of the need to pass in the return value type. - (JSC::Machine::cti_op_add): Update to use new version of exception - macros. - (JSC::Machine::cti_op_pre_inc): Ditto. - (JSC::Machine::cti_timeout_check): Ditto. - (JSC::Machine::cti_op_instanceof): Ditto. - (JSC::Machine::cti_op_new_func): Ditto. - (JSC::Machine::cti_op_call_JSFunction): Optimized by using the - ARG values directly instead of through local variables -- this gets - rid of code that just shuffles things around in the stack frame. - Also get rid of ExecState and update for the new way exceptions are - handled in slideRegisterWindowForCall. - (JSC::Machine::cti_vm_compile): Update to make exec out of r since - they are both the same thing now. - (JSC::Machine::cti_op_call_NotJSFunction): Ditto. - (JSC::Machine::cti_op_init_arguments): Ditto. - (JSC::Machine::cti_op_resolve): Ditto. - (JSC::Machine::cti_op_construct_JSConstruct): Ditto. - (JSC::Machine::cti_op_construct_NotJSConstruct): Ditto. - (JSC::Machine::cti_op_resolve_func): Ditto. - (JSC::Machine::cti_op_put_by_val): Ditto. - (JSC::Machine::cti_op_put_by_val_array): Ditto. - (JSC::Machine::cti_op_resolve_skip): Ditto. - (JSC::Machine::cti_op_resolve_global): Ditto. - (JSC::Machine::cti_op_post_inc): Ditto. - (JSC::Machine::cti_op_resolve_with_base): Ditto. - (JSC::Machine::cti_op_post_dec): Ditto. - (JSC::Machine::cti_op_call_eval): Ditto. - (JSC::Machine::cti_op_throw): Ditto. Also rearranged to return - the exception value as the return value so it can be used by - op_catch. - (JSC::Machine::cti_op_push_scope): Ditto. - (JSC::Machine::cti_op_in): Ditto. - (JSC::Machine::cti_op_del_by_val): Ditto. - (JSC::Machine::cti_vm_throw): Ditto. Also rearranged to return - the exception value as the return value so it can be used by - op_catch. - - * kjs/DebuggerCallFrame.cpp: - (JSC::DebuggerCallFrame::functionName): Pass globalData. - (JSC::DebuggerCallFrame::evaluate): Eliminated code to make a - new ExecState. - * kjs/DebuggerCallFrame.h: Removed ExecState argument from - constructor. - - * kjs/ExecState.h: Eliminated all data members and made ExecState - inherit privately from Register instead. Also added a typedef to - the future name for this class, which is CallFrame. It's just a - Register* that knows it's a pointer at a call frame. The new class - can't be constructed or copied. Changed all functions to use - the this pointer instead of m_callFrame. Changed exception-related - functions to access an exception in JSGlobalData. Removed functions - used by CTI to pass the return address to the throw machinery -- - this is now done directly with a global in the global data. - - * kjs/FunctionPrototype.cpp: - (JSC::functionProtoFuncToString): Pass globalData instead of exec. - - * kjs/InternalFunction.cpp: - (JSC::InternalFunction::name): Take globalData instead of exec. - * kjs/InternalFunction.h: Ditto. - - * kjs/JSGlobalData.cpp: Initialize the new exception global to 0. - * kjs/JSGlobalData.h: Declare two new globals. One for the current - exception and another for the return address used by CTI to - implement the throw operation. - - * kjs/JSGlobalObject.cpp: - (JSC::JSGlobalObject::init): Removed code to set up globalExec, - which is now the same thing as globalCallFrame. - (JSC::JSGlobalObject::reset): Get globalExec from our globalExec - function so we don't have to repeat the logic twice. - (JSC::JSGlobalObject::mark): Removed code to mark the exception; - the exception is now stored in JSGlobalData and marked there. - (JSC::JSGlobalObject::globalExec): Return a pointer to the end - of the global call frame. - * kjs/JSGlobalObject.h: Removed the globalExec data member. - - * kjs/JSObject.cpp: - (JSC::JSObject::putDirectFunction): Pass globalData instead of exec. - - * kjs/collector.cpp: - (JSC::Heap::collect): Mark the global exception. - - * profiler/ProfileGenerator.cpp: - (JSC::ProfileGenerator::addParentForConsoleStart): Pass globalData - instead of exec to createCallIdentifier. - - * profiler/Profiler.cpp: - (JSC::Profiler::willExecute): Pass globalData instead of exec to - createCallIdentifier. - (JSC::Profiler::didExecute): Ditto. - (JSC::Profiler::createCallIdentifier): Take globalData instead of - exec. - (JSC::createCallIdentifierFromFunctionImp): Ditto. - * profiler/Profiler.h: Change interface to take a JSGlobalData - instead of an ExecState. - -2008-10-04 Cameron Zwarich <zwarich@apple.com> +2009-06-22 Oliver Hunt <oliver@apple.com> Reviewed by Darin Adler. - Bug 21369: Add opcode documentation for all undocumented opcodes - <https://bugs.webkit.org/show_bug.cgi?id=21369> - - This patch adds opcode documentation for all undocumented opcodes, and - it also renames op_init_arguments to op_create_arguments. - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): - * VM/CodeBlock.cpp: - (JSC::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::CodeGenerator): - * VM/Machine.cpp: - (JSC::Machine::privateExecute): - (JSC::Machine::cti_op_create_arguments): - * VM/Machine.h: - * VM/Opcode.h: - -2008-10-03 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Cameron Zwarich. - - - "this" object in methods called on primitives should be wrapper object - https://bugs.webkit.org/show_bug.cgi?id=21362 - - I changed things so that functions which use "this" do a fast - version of toThisObject conversion if needed. Currently we miss - the conversion entirely, at least for primitive types. Using - TypeInfo and the primitive check, I made the fast case bail out - pretty fast. - - This is inexplicably an 1.007x SunSpider speedup (and a wash on V8 benchmarks). - - Also renamed some opcodes for clarity: - - init ==> enter - init_activation ==> enter_with_activation - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - * VM/CodeBlock.cpp: - (JSC::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::generate): - (JSC::CodeGenerator::CodeGenerator): - * VM/Machine.cpp: - (JSC::Machine::privateExecute): - (JSC::Machine::cti_op_convert_this): - * VM/Machine.h: - * VM/Opcode.h: - * kjs/JSActivation.cpp: - (JSC::JSActivation::JSActivation): - * kjs/JSActivation.h: - (JSC::JSActivation::createStructureID): - * kjs/JSCell.h: - (JSC::JSValue::needsThisConversion): - * kjs/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): - * kjs/JSGlobalData.h: - * kjs/JSNumberCell.h: - (JSC::JSNumberCell::createStructureID): - * kjs/JSStaticScopeObject.h: - (JSC::JSStaticScopeObject::JSStaticScopeObject): - (JSC::JSStaticScopeObject::createStructureID): - * kjs/JSString.h: - (JSC::JSString::createStructureID): - * kjs/JSValue.h: - * kjs/TypeInfo.h: - (JSC::TypeInfo::needsThisConversion): - * kjs/nodes.h: - (JSC::ScopeNode::usesThis): - -2008-10-03 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Maciej Stachowiak. - - Bug 21356: The size of the RegisterFile differs depending on 32-bit / 64-bit and Debug / Release - <https://bugs.webkit.org/show_bug.cgi?id=21356> - - The RegisterFile decreases in size (measured in terms of numbers of - Registers) as the size of a Register increases. This causes - - js1_5/Regress/regress-159334.js - - to fail in 64-bit debug builds. This fix makes the RegisterFile on all - platforms the same size that it is in 32-bit Release builds. - - * VM/RegisterFile.h: - (JSC::RegisterFile::RegisterFile): - -2008-10-03 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Cameron Zwarich. - - - Some code cleanup to how we handle code features. - - 1) Rename FeatureInfo typedef to CodeFeatures. - 2) Rename NodeFeatureInfo template to NodeInfo. - 3) Keep CodeFeature bitmask in ScopeNode instead of trying to break it out into individual bools. - 4) Rename misleadingly named "needsClosure" method to "containsClosures", which better describes the meaning - of ClosureFeature. - 5) Make setUsersArguments() not take an argument since it only goes one way. - - * JavaScriptCore.exp: - * VM/CodeBlock.h: - (JSC::CodeBlock::CodeBlock): - * kjs/NodeInfo.h: - * kjs/Parser.cpp: - (JSC::Parser::didFinishParsing): - * kjs/Parser.h: - (JSC::Parser::parse): - * kjs/grammar.y: - * kjs/nodes.cpp: - (JSC::ScopeNode::ScopeNode): - (JSC::ProgramNode::ProgramNode): - (JSC::ProgramNode::create): - (JSC::EvalNode::EvalNode): - (JSC::EvalNode::create): - (JSC::FunctionBodyNode::FunctionBodyNode): - (JSC::FunctionBodyNode::create): - * kjs/nodes.h: - (JSC::ScopeNode::usesEval): - (JSC::ScopeNode::containsClosures): - (JSC::ScopeNode::usesArguments): - (JSC::ScopeNode::setUsesArguments): - -2008-10-03 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Maciej Stachowiak. - - Bug 21343: REGRESSSION (r37160): ecma_3/ExecutionContexts/10.1.3-1.js and js1_4/Functions/function-001.js fail on 64-bit - <https://bugs.webkit.org/show_bug.cgi?id=21343> - - A fix was landed for this issue in r37253, and the ChangeLog assumes - that it is a compiler bug, but it turns out that it is a subtle issue - with mixing signed and unsigned 32-bit values in a 64-bit environment. - In order to properly fix this bug, we should convert our signed offsets - into the register file to use ptrdiff_t. - - This may not be the only instance of this issue, but I will land this - fix first and look for more later. - - * VM/Machine.cpp: - (JSC::Machine::getArgumentsData): - * VM/Machine.h: - * kjs/Arguments.cpp: - (JSC::Arguments::getOwnPropertySlot): - * kjs/Arguments.h: - (JSC::Arguments::init): - -2008-10-03 Darin Adler <darin@apple.com> - - * VM/CTI.cpp: Another Windows build fix. Change the args of ctiTrampoline. - - * kjs/JSNumberCell.h: A build fix for newer versions of gcc. Added - declarations of JSGlobalData overloads of jsNumberCell. - -2008-10-03 Darin Adler <darin@apple.com> - - - try to fix Windows build - - * kjs/ScopeChain.h: Add forward declaration of JSGlobalData. + Bug 26591: Support revivers in JSON.parse + <https://bugs.webkit.org/show_bug.cgi?id=26591> -2008-10-03 Darin Adler <darin@apple.com> + Add reviver support to JSON.parse. This completes the JSON object. - Reviewed by Geoff Garen. - - - next step of https://bugs.webkit.org/show_bug.cgi?id=21295 - Turn ExecState into a call frame pointer. - - Remove m_globalObject and m_globalData from ExecState. - - SunSpider says this is a wash (slightly faster but not statistically - significant); which is good enough since it's a preparation step and - not supposed to be a spedup. - - * API/JSCallbackFunction.cpp: - (JSC::JSCallbackFunction::JSCallbackFunction): - * kjs/ArrayConstructor.cpp: - (JSC::ArrayConstructor::ArrayConstructor): - * kjs/BooleanConstructor.cpp: - (JSC::BooleanConstructor::BooleanConstructor): - * kjs/DateConstructor.cpp: - (JSC::DateConstructor::DateConstructor): - * kjs/ErrorConstructor.cpp: - (JSC::ErrorConstructor::ErrorConstructor): - * kjs/FunctionPrototype.cpp: - (JSC::FunctionPrototype::FunctionPrototype): - * kjs/JSFunction.cpp: - (JSC::JSFunction::JSFunction): - * kjs/NativeErrorConstructor.cpp: - (JSC::NativeErrorConstructor::NativeErrorConstructor): - * kjs/NumberConstructor.cpp: - (JSC::NumberConstructor::NumberConstructor): - * kjs/ObjectConstructor.cpp: - (JSC::ObjectConstructor::ObjectConstructor): - * kjs/PrototypeFunction.cpp: - (JSC::PrototypeFunction::PrototypeFunction): - * kjs/RegExpConstructor.cpp: - (JSC::RegExpConstructor::RegExpConstructor): - * kjs/StringConstructor.cpp: - (JSC::StringConstructor::StringConstructor): - Pass JSGlobalData* instead of ExecState* to the InternalFunction - constructor. - - * API/OpaqueJSString.cpp: Added now-needed include. - - * JavaScriptCore.exp: Updated. - - * VM/CTI.cpp: - (JSC::CTI::emitSlowScriptCheck): Changed to use ARGS_globalData - instead of ARGS_exec. - - * VM/CTI.h: Added a new argument to the CTI, the global data pointer. - While it's possible to get to the global data pointer using the - ExecState pointer, it's slow enough that it's better to just keep - it around in the CTI arguments. - - * VM/CodeBlock.h: Moved the CodeType enum here from ExecState.h. - - * VM/Machine.cpp: - (JSC::Machine::execute): Pass fewer arguments when constructing - ExecState, and pass the global data pointer when invoking CTI. - (JSC::Machine::firstCallFrame): Added. Used to get the dynamic global - object, which is in the scope chain of the first call frame. - (JSC::Machine::cti_op_add): Use globalData instead of exec when - possible, to keep fast cases fast, since it's now more expensive to - get to it through the exec pointer. - (JSC::Machine::cti_timeout_check): Ditto. - (JSC::Machine::cti_op_put_by_id_second): Ditto. - (JSC::Machine::cti_op_get_by_id_second): Ditto. - (JSC::Machine::cti_op_mul): Ditto. - (JSC::Machine::cti_vm_compile): Ditto. - (JSC::Machine::cti_op_get_by_val): Ditto. - (JSC::Machine::cti_op_sub): Ditto. - (JSC::Machine::cti_op_put_by_val): Ditto. - (JSC::Machine::cti_op_put_by_val_array): Ditto. - (JSC::Machine::cti_op_negate): Ditto. - (JSC::Machine::cti_op_div): Ditto. - (JSC::Machine::cti_op_pre_dec): Ditto. - (JSC::Machine::cti_op_post_inc): Ditto. - (JSC::Machine::cti_op_lshift): Ditto. - (JSC::Machine::cti_op_bitand): Ditto. - (JSC::Machine::cti_op_rshift): Ditto. - (JSC::Machine::cti_op_bitnot): Ditto. - (JSC::Machine::cti_op_mod): Ditto. - (JSC::Machine::cti_op_post_dec): Ditto. - (JSC::Machine::cti_op_urshift): Ditto. - (JSC::Machine::cti_op_bitxor): Ditto. - (JSC::Machine::cti_op_bitor): Ditto. - (JSC::Machine::cti_op_call_eval): Ditto. - (JSC::Machine::cti_op_throw): Ditto. - (JSC::Machine::cti_op_is_string): Ditto. - (JSC::Machine::cti_op_debug): Ditto. - (JSC::Machine::cti_vm_throw): Ditto. - - * VM/Machine.h: Added firstCallFrame. - - * kjs/DebuggerCallFrame.cpp: - (JSC::DebuggerCallFrame::evaluate): Pass fewer arguments when - constructing ExecState. - - * kjs/ExecState.cpp: Deleted contents. Later we'll remove the - file altogether. - - * kjs/ExecState.h: Removed m_globalObject and m_globalData. - Moved CodeType into another header. - (JSC::ExecState::ExecState): Take only a single argument, a - call frame pointer. - (JSC::ExecState::dynamicGlobalObject): Get the object from - the first call frame since it's no longer stored. - (JSC::ExecState::globalData): Get the global data from the - scope chain, since we no longer store a pointer to it here. - (JSC::ExecState::identifierTable): Ditto. - (JSC::ExecState::propertyNames): Ditto. - (JSC::ExecState::emptyList): Ditto. - (JSC::ExecState::lexer): Ditto. - (JSC::ExecState::parser): Ditto. - (JSC::ExecState::machine): Ditto. - (JSC::ExecState::arrayTable): Ditto. - (JSC::ExecState::dateTable): Ditto. - (JSC::ExecState::mathTable): Ditto. - (JSC::ExecState::numberTable): Ditto. - (JSC::ExecState::regExpTable): Ditto. - (JSC::ExecState::regExpConstructorTable): Ditto. - (JSC::ExecState::stringTable): Ditto. - (JSC::ExecState::heap): Ditto. - - * kjs/FunctionConstructor.cpp: - (JSC::FunctionConstructor::FunctionConstructor): Pass - JSGlobalData* instead of ExecState* to the InternalFunction - constructor. - (JSC::constructFunction): Pass the global data pointer when - constructing a new scope chain. - - * kjs/InternalFunction.cpp: - (JSC::InternalFunction::InternalFunction): Take a JSGlobalData* - instead of an ExecState*. Later we can change more places to - work this way -- it's more efficient to take the type you need - since the caller might already have it. - * kjs/InternalFunction.h: Ditto. - - * kjs/JSCell.h: - (JSC::JSCell::operator new): Added an overload that takes a - JSGlobalData* so you can construct without an ExecState*. - - * kjs/JSGlobalObject.cpp: - (JSC::JSGlobalObject::init): Moved creation of the global scope - chain in here, since it now requires a pointer to the global data. - Moved the initialization of the call frame in here since it requires - the global scope chain node. Removed the extra argument to ExecState - when creating the global ExecState*. - * kjs/JSGlobalObject.h: Removed initialization of globalScopeChain - and the call frame from the JSGlobalObjectData constructor. Added - a thisValue argument to the init function. - - * kjs/JSNumberCell.cpp: Added versions of jsNumberCell that take - JSGlobalData* rather than ExecState*. - * kjs/JSNumberCell.h: - (JSC::JSNumberCell::operator new): Added a version that takes - JSGlobalData*. - (JSC::JSNumberCell::JSNumberCell): Ditto. - (JSC::jsNumber): Ditto. - * kjs/JSString.cpp: - (JSC::jsString): Ditto. - (JSC::jsSubstring): Ditto. - (JSC::jsOwnedString): Ditto. - * kjs/JSString.h: - (JSC::JSString::JSString): Changed to take JSGlobalData*. - (JSC::jsEmptyString): Added a version that takes JSGlobalData*. - (JSC::jsSingleCharacterString): Ditto. - (JSC::jsSingleCharacterSubstring): Ditto. - (JSC::jsNontrivialString): Ditto. - (JSC::JSString::getIndex): Ditto. - (JSC::jsString): Ditto. - (JSC::jsSubstring): Ditto. - (JSC::jsOwnedString): Ditto. - - * kjs/ScopeChain.h: Added a globalData pointer to each node. - (JSC::ScopeChainNode::ScopeChainNode): Initialize the globalData - pointer. - (JSC::ScopeChainNode::push): Set the global data pointer in the - new node. - (JSC::ScopeChain::ScopeChain): Take a globalData argument. - - * kjs/SmallStrings.cpp: - (JSC::SmallStrings::createEmptyString): Take JSGlobalData* instead of - ExecState*. - (JSC::SmallStrings::createSingleCharacterString): Ditto. - * kjs/SmallStrings.h: - (JSC::SmallStrings::emptyString): Ditto. - (JSC::SmallStrings::singleCharacterString): Ditto. - -2008-10-03 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Geoff Garen. - - Bug 21343: REGRESSSION (r37160): ecma_3/ExecutionContexts/10.1.3-1.js and js1_4/Functions/function-001.js fail on 64-bit - <https://bugs.webkit.org/show_bug.cgi?id=21343> - - Add a workaround for a bug in GCC, which affects GCC 4.0, GCC 4.2, and - llvm-gcc 4.2. I put it in an #ifdef because it was a slight regression - on SunSpider in 32-bit, although that might be entirely random. - - * kjs/Arguments.cpp: - (JSC::Arguments::getOwnPropertySlot): - -2008-10-03 Darin Adler <darin@apple.com> - - Rubber stamped by Alexey Proskuryakov. - - * kjs/Shell.cpp: (main): Don't delete JSGlobalData. Later, we need to change - this tool to use public JavaScriptCore API instead. - -2008-10-03 Darin Adler <darin@apple.com> - - Suggested by Alexey Proskuryakov. - - * kjs/JSGlobalData.cpp: - (JSC::JSGlobalData::~JSGlobalData): Remove call to heap.destroy() because - it's too late to ref the JSGlobalData object once it's already being - destroyed. In practice this is not a problem because WebCore's JSGlobalData - is never destroyed and JSGlobalContextRelease takes care of calling - heap.destroy() in advance. - -2008-10-02 Oliver Hunt <oliver@apple.com> - - Reviewed by Maciej Stachowiak. - - Replace SSE3 check with an SSE2 check, and implement SSE2 check on windows. - - 5.6% win on SunSpider on windows. - - * VM/CTI.cpp: - (JSC::isSSE2Present): - (JSC::CTI::compileBinaryArithOp): - (JSC::CTI::compileBinaryArithOpSlowCase): - -2008-10-03 Maciej Stachowiak <mjs@apple.com> - - Rubber stamped by Cameron Zwarich. - - - fix mistaken change of | to || which caused a big perf regression on EarleyBoyer + * runtime/JSONObject.cpp: + (JSC::Walker::Walker): + (JSC::Walker::callReviver): + (JSC::Walker::walk): + (JSC::JSONProtoFuncParse): - * kjs/grammar.y: - -2008-10-02 Darin Adler <darin@apple.com> - - Reviewed by Geoff Garen. - - - https://bugs.webkit.org/show_bug.cgi?id=21321 - Bug 21321: speed up JavaScriptCore by inlining Heap in JSGlobalData - - 1.019x as fast on SunSpider. - - * API/JSBase.cpp: - (JSEvaluateScript): Use heap. instead of heap-> to work with the heap. - (JSCheckScriptSyntax): Ditto. - (JSGarbageCollect): Ditto. - (JSReportExtraMemoryCost): Ditto. - * API/JSContextRef.cpp: - (JSGlobalContextRetain): Ditto. - (JSGlobalContextRelease): Destroy the heap with the destroy function instead - of the delete operator. - (JSContextGetGlobalObject): Use heap. instead of heap-> to work with the heap. - * API/JSObjectRef.cpp: - (JSObjectMake): Use heap. instead of heap-> to work with the heap. - (JSObjectMakeFunctionWithCallback): Ditto. - (JSObjectMakeConstructor): Ditto. - (JSObjectMakeFunction): Ditto. - (JSObjectMakeArray): Ditto. - (JSObjectMakeDate): Ditto. - (JSObjectMakeError): Ditto. - (JSObjectMakeRegExp): Ditto. - (JSObjectHasProperty): Ditto. - (JSObjectGetProperty): Ditto. - (JSObjectSetProperty): Ditto. - (JSObjectGetPropertyAtIndex): Ditto. - (JSObjectSetPropertyAtIndex): Ditto. - (JSObjectDeleteProperty): Ditto. - (JSObjectCallAsFunction): Ditto. - (JSObjectCallAsConstructor): Ditto. - (JSObjectCopyPropertyNames): Ditto. - (JSPropertyNameAccumulatorAddName): Ditto. - * API/JSValueRef.cpp: - (JSValueIsEqual): Ditto. - (JSValueIsInstanceOfConstructor): Ditto. - (JSValueMakeNumber): Ditto. - (JSValueMakeString): Ditto. - (JSValueToNumber): Ditto. - (JSValueToStringCopy): Ditto. - (JSValueToObject): Ditto. - (JSValueProtect): Ditto. - (JSValueUnprotect): Ditto. - - * kjs/ExecState.h: - (JSC::ExecState::heap): Update to use the & operator. - - * kjs/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): Update to initialize a heap member - instead of calling new to make a heap. - (JSC::JSGlobalData::~JSGlobalData): Destroy the heap with the destroy - function instead of the delete operator. - * kjs/JSGlobalData.h: Change from Heap* to a Heap. - * kjs/JSGlobalObject.cpp: - (JSC::JSGlobalObject::mark): Use the & operator here. - (JSC::JSGlobalObject::operator new): Use heap. instead of heap-> to work - with the heap. - -2008-10-02 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Geoff Garen. - - Bug 21317: Replace RegisterFile size and capacity information with Register pointers - <https://bugs.webkit.org/show_bug.cgi?id=21317> - - This is a 2.3% speedup on the V8 DeltaBlue benchmark, a 3.3% speedup on - the V8 Raytrace benchmark, and a 1.0% speedup on SunSpider. - - * VM/Machine.cpp: - (JSC::slideRegisterWindowForCall): - (JSC::Machine::callEval): - (JSC::Machine::execute): - (JSC::Machine::privateExecute): - (JSC::Machine::cti_op_call_JSFunction): - (JSC::Machine::cti_op_construct_JSConstruct): - * VM/RegisterFile.cpp: - (JSC::RegisterFile::~RegisterFile): - * VM/RegisterFile.h: - (JSC::RegisterFile::RegisterFile): - (JSC::RegisterFile::start): - (JSC::RegisterFile::end): - (JSC::RegisterFile::size): - (JSC::RegisterFile::shrink): - (JSC::RegisterFile::grow): - (JSC::RegisterFile::lastGlobal): - (JSC::RegisterFile::markGlobals): - (JSC::RegisterFile::markCallFrames): - * kjs/JSGlobalObject.cpp: - (JSC::JSGlobalObject::copyGlobalsTo): - -2008-10-02 Cameron Zwarich <zwarich@apple.com> - - Rubber-stamped by Darin Adler. - - Change bitwise operations introduced in r37166 to boolean operations. We - only use bitwise operations over boolean operations for increasing - performance in extremely hot code, but that does not apply to anything - in the parser. - - * kjs/grammar.y: - -2008-10-02 Gavin Barraclough <barraclough@apple.com> +2009-06-21 Oliver Hunt <oliver@apple.com> Reviewed by Darin Adler. - Fix for bug #21232 - should reset m_isPendingDash on flush, - and should allow '\-' as beginning or end of a range (though - not to specifiy a range itself). - - * ChangeLog: - * wrec/CharacterClassConstructor.cpp: - (JSC::CharacterClassConstructor::put): - (JSC::CharacterClassConstructor::flush): - * wrec/CharacterClassConstructor.h: - (JSC::CharacterClassConstructor::flushBeforeEscapedHyphen): - * wrec/WREC.cpp: - (JSC::WRECGenerator::generateDisjunction): - (JSC::WRECParser::parseCharacterClass): - (JSC::WRECParser::parseDisjunction): - * wrec/WREC.h: - -2008-10-02 Darin Adler <darin@apple.com> + Bug 26592: Support standard toJSON functions + <https://bugs.webkit.org/show_bug.cgi?id=26592> - Reviewed by Sam Weinig. - - - remove the "static" from declarations in a header file, since we - don't want them to have internal linkage + Add support for the standard Date.toJSON function. - * VM/Machine.h: Remove the static keyword from the constant and the - three inline functions that Geoff just moved here. + * runtime/DatePrototype.cpp: + (JSC::dateProtoFuncToJSON): -2008-10-02 Geoffrey Garen <ggaren@apple.com> +2009-06-21 Oliver Hunt <oliver@apple.com> Reviewed by Sam Weinig. - - Fixed https://bugs.webkit.org/show_bug.cgi?id=21283. - Profiler Crashes When Started - - * VM/Machine.cpp: - * VM/Machine.h: - (JSC::makeHostCallFramePointer): - (JSC::isHostCallFrame): - (JSC::stripHostCallFrameBit): Moved some things to the header so - JSGlobalObject could use them. - - * kjs/JSGlobalObject.h: - (JSC::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData): Call the - new makeHostCallFramePointer API, since 0 no longer indicates a host - call frame. -2008-10-02 Alexey Proskuryakov <ap@webkit.org> + Bug 26594: JSC needs to support Date.toISOString + <https://bugs.webkit.org/show_bug.cgi?id=26594> - Reviewed by Darin Adler. - - https://bugs.webkit.org/show_bug.cgi?id=21304 - Stop using a static wrapper map for WebCore JS bindings + Add support for Date.toISOString. - * kjs/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): - (JSC::JSGlobalData::~JSGlobalData): - (JSC::JSGlobalData::ClientData::~ClientData): - * kjs/JSGlobalData.h: - Added a client data member to JSGlobalData. WebCore will use it to store bindings-related - global data. + * runtime/DatePrototype.cpp: + (JSC::dateProtoFuncToISOString): - * JavaScriptCore.exp: Export virtual ClientData destructor. +2009-06-21 Oliver Hunt <oliver@apple.com> -2008-10-02 Geoffrey Garen <ggaren@apple.com> + Reviewed by NOBODY (Build fix). - Not reviewed. - - Try to fix Qt build. + Remove dead code. - * kjs/Error.h: + * runtime/LiteralParser.cpp: + (JSC::LiteralParser::parse): -2008-10-01 Geoffrey Garen <ggaren@apple.com> +2009-06-21 Oliver Hunt <oliver@apple.com> Reviewed by Darin Adler and Cameron Zwarich. - Preliminary step toward dynamic recompilation: Standardized and - simplified the parsing interface. - - The main goal in this patch is to make it easy to ask for a duplicate - compilation, and get back a duplicate result -- same source URL, same - debugger / profiler ID, same toString behavior, etc. - - The basic unit of compilation and evaluation is now SourceCode, which - encompasses a SourceProvider, a range in that provider, and a starting - line number. - - A SourceProvider now encompasses a source URL, and *is* a source ID, - since a pointer is a unique identifier. - - * API/JSBase.cpp: - (JSEvaluateScript): - (JSCheckScriptSyntax): Provide a SourceCode to the Interpreter, since - other APIs are no longer supported. - - * VM/CodeBlock.h: - (JSC::EvalCodeCache::get): Provide a SourceCode to the Interpreter, since - other APIs are no longer supported. - (JSC::CodeBlock::CodeBlock): ASSERT something that used to be ASSERTed - by our caller -- this is a better bottleneck. - - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::CodeGenerator): Updated for the fact that - FunctionBodyNode's parameters are no longer a WTF::Vector. - - * kjs/Arguments.cpp: - (JSC::Arguments::Arguments): ditto - - * kjs/DebuggerCallFrame.cpp: - (JSC::DebuggerCallFrame::evaluate): Provide a SourceCode to the Parser, - since other APIs are no longer supported. - - * kjs/FunctionConstructor.cpp: - (JSC::constructFunction): Provide a SourceCode to the Parser, since - other APIs are no longer supported. Adopt FunctionBodyNode's new - "finishParsing" API. - - * kjs/JSFunction.cpp: - (JSC::JSFunction::lengthGetter): - (JSC::JSFunction::getParameterName): Updated for the fact that - FunctionBodyNode's parameters are no longer a wtf::Vector. - - * kjs/JSFunction.h: Nixed some cruft. - - * kjs/JSGlobalObjectFunctions.cpp: - (JSC::globalFuncEval): Provide a SourceCode to the Parser, since - other APIs are no longer supported. - - * kjs/Parser.cpp: - (JSC::Parser::parse): Require a SourceCode argument, instead of a bunch - of broken out parameters. Stop tracking sourceId as an integer, since we - use the SourceProvider pointer for this now. Don't clamp the - startingLineNumber, since SourceCode does that now. - - * kjs/Parser.h: - (JSC::Parser::parse): Standardized the parsing interface to require a - SourceCode. - - * kjs/Shell.cpp: - (functionRun): - (functionLoad): - (prettyPrintScript): - (runWithScripts): - (runInteractive): Provide a SourceCode to the Interpreter, since - other APIs are no longer supported. - - * kjs/SourceProvider.h: - (JSC::SourceProvider::SourceProvider): - (JSC::SourceProvider::url): - (JSC::SourceProvider::asId): - (JSC::UStringSourceProvider::create): - (JSC::UStringSourceProvider::UStringSourceProvider): Added new - responsibilities described above. - - * kjs/SourceRange.h: - (JSC::SourceCode::SourceCode): - (JSC::SourceCode::toString): - (JSC::SourceCode::provider): - (JSC::SourceCode::firstLine): - (JSC::SourceCode::data): - (JSC::SourceCode::length): Added new responsibilities described above. - Renamed SourceRange to SourceCode, based on review feedback. Added - a makeSource function for convenience. - - * kjs/debugger.h: Provide a SourceCode to the client, since other APIs - are no longer supported. - - * kjs/grammar.y: Provide startingLineNumber when creating a SourceCode. - - * kjs/debugger.h: Treat sourceId as intptr_t to avoid loss of precision - on 64bit platforms. - - * kjs/interpreter.cpp: - (JSC::Interpreter::checkSyntax): - (JSC::Interpreter::evaluate): - * kjs/interpreter.h: Require a SourceCode instead of broken out arguments. - - * kjs/lexer.cpp: - (JSC::Lexer::setCode): - * kjs/lexer.h: - (JSC::Lexer::sourceRange): Fold together the SourceProvider and line number - into a SourceCode. Fixed a bug where the Lexer would accidentally keep - alive the last SourceProvider forever. - - * kjs/nodes.cpp: - (JSC::ScopeNode::ScopeNode): - (JSC::ProgramNode::ProgramNode): - (JSC::ProgramNode::create): - (JSC::EvalNode::EvalNode): - (JSC::EvalNode::generateCode): - (JSC::EvalNode::create): - (JSC::FunctionBodyNode::FunctionBodyNode): - (JSC::FunctionBodyNode::finishParsing): - (JSC::FunctionBodyNode::create): - (JSC::FunctionBodyNode::generateCode): - (JSC::ProgramNode::generateCode): - (JSC::FunctionBodyNode::paramString): - * kjs/nodes.h: - (JSC::ScopeNode::): - (JSC::ScopeNode::sourceId): - (JSC::FunctionBodyNode::): - (JSC::FunctionBodyNode::parameterCount): - (JSC::FuncExprNode::): - (JSC::FuncDeclNode::): Store a SourceCode in all ScopeNodes, since - SourceCode is now responsible for tracking URL, ID, etc. Streamlined - some ad hoc FunctionBodyNode fixups into a "finishParsing" function, to - help make clear what you need to do in order to finish parsing a - FunctionBodyNode. - - * wtf/Vector.h: - (WTF::::releaseBuffer): Don't ASSERT that releaseBuffer() is only called - when buffer is not 0, since FunctionBodyNode is more than happy - to get back a 0 buffer, and other functions like RefPtr::release() allow - for 0, too. - -2008-10-01 Cameron Zwarich <zwarich@apple.com> + Bug 26587: Support JSON.parse + <https://bugs.webkit.org/show_bug.cgi?id=26587> - Reviewed by Maciej Stachowiak. + Extend the LiteralParser to support the full strict JSON + grammar, fix a few places where the grammar was incorrectly + lenient. Doesn't yet support the JSON.parse reviver function + but that does not block the JSON.parse functionality itself. - Bug 21289: REGRESSION (r37160): Inspector crashes on load - <https://bugs.webkit.org/show_bug.cgi?id=21289> - - The code in Arguments::mark() in r37160 was wrong. It marks indices in - d->registers, but that makes no sense (they are local variables, not - arguments). It should mark those indices in d->registerArray instead. - - This patch also changes Arguments::copyRegisters() to use d->numParameters - instead of recomputing it. - - * kjs/Arguments.cpp: - (JSC::Arguments::mark): - * kjs/Arguments.h: - (JSC::Arguments::copyRegisters): - -2008-09-30 Darin Adler <darin@apple.com> - - Reviewed by Eric Seidel. - - - https://bugs.webkit.org/show_bug.cgi?id=21214 - work on getting rid of ExecState - - Eliminate some unneeded uses of dynamicGlobalObject. - - * API/JSClassRef.cpp: - (OpaqueJSClass::contextData): Changed to use a map in the global data instead - of on the global object. Also fixed to use only a single hash table lookup. - - * API/JSObjectRef.cpp: - (JSObjectMakeConstructor): Use lexicalGlobalObject rather than dynamicGlobalObject - to get the object prototype. - - * kjs/ArrayPrototype.cpp: - (JSC::arrayProtoFuncToString): Use arrayVisitedElements set in global data rather - than in the global object. - (JSC::arrayProtoFuncToLocaleString): Ditto. - (JSC::arrayProtoFuncJoin): Ditto. - - * kjs/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): Don't initialize opaqueJSClassData, since - it's no longer a pointer. - (JSC::JSGlobalData::~JSGlobalData): We still need to delete all the values, but - we don't need to delete the map since it's no longer a pointer. - - * kjs/JSGlobalData.h: Made opaqueJSClassData a map instead of a pointer to a map. - Also added arrayVisitedElements. - - * kjs/JSGlobalObject.h: Removed arrayVisitedElements. - - * kjs/Shell.cpp: - (functionRun): Use lexicalGlobalObject instead of dynamicGlobalObject. - (functionLoad): Ditto. - -2008-10-01 Cameron Zwarich <zwarich@apple.com> - - Not reviewed. - - Speculative Windows build fix. + * interpreter/Interpreter.cpp: + (JSC::Interpreter::callEval): + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::globalFuncEval): + * runtime/JSONObject.cpp: + (JSC::JSONProtoFuncParse): + * runtime/LiteralParser.cpp: + (JSC::LiteralParser::Lexer::lex): + (JSC::isSafeStringCharacter): + (JSC::LiteralParser::Lexer::lexString): + (JSC::LiteralParser::parse): + * runtime/LiteralParser.h: + (JSC::LiteralParser::LiteralParser): + (JSC::LiteralParser::tryJSONParse): + (JSC::LiteralParser::): + (JSC::LiteralParser::Lexer::Lexer): - * kjs/grammar.y: +2009-06-21 David Levin <levin@chromium.org> -2008-10-01 Cameron Zwarich <zwarich@apple.com> + Reviewed by NOBODY (speculative build fix for windows). - Reviewed by Darin Adler. + Simply removed some whitespace form this file to make windows build wtf and + hopefully copy the new MessageQueque.h so that WebCore picks it up. - Bug 21123: using "arguments" in a function should not force creation of an activation object - <https://bugs.webkit.org/show_bug.cgi?id=21123> - - Make the 'arguments' object not require a JSActivation. We store the - 'arguments' object in the OptionalCalleeArguments call frame slot. We - need to be able to get the original 'arguments' object to tear it off - when returning from a function, but 'arguments' may be assigned to in a - number of ways. - - Therefore, we use the OptionalCalleeArguments slot when we want to get - the original activation or we know that 'arguments' was not assigned a - different value. When 'arguments' may have been assigned a new value, - we use a new local variable that is initialized with 'arguments'. Since - a function parameter named 'arguments' may overwrite the value of - 'arguments', we also need to be careful to look up 'arguments' in the - symbol table, so we get the parameter named 'arguments' instead of the - local variable that we have added for holding the 'arguments' object. - - This is a 19.1% win on the V8 Raytrace benchmark using the SunSpider - harness, and a 20.7% win using the V8 harness. This amounts to a 6.5% - total speedup on the V8 benchmark suite using the V8 harness. - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): - * VM/CodeBlock.h: - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::CodeGenerator): - * VM/Machine.cpp: - (JSC::Machine::unwindCallFrame): - (JSC::Machine::privateExecute): - (JSC::Machine::retrieveArguments): - (JSC::Machine::cti_op_init_arguments): - (JSC::Machine::cti_op_ret_activation_arguments): - * VM/Machine.h: - * VM/RegisterFile.h: - (JSC::RegisterFile::): - * kjs/Arguments.cpp: - (JSC::Arguments::mark): - (JSC::Arguments::fillArgList): - (JSC::Arguments::getOwnPropertySlot): - (JSC::Arguments::put): - * kjs/Arguments.h: - (JSC::Arguments::setRegisters): - (JSC::Arguments::init): - (JSC::Arguments::Arguments): - (JSC::Arguments::copyRegisters): - (JSC::JSActivation::copyRegisters): - * kjs/JSActivation.cpp: - (JSC::JSActivation::argumentsGetter): - * kjs/JSActivation.h: - (JSC::JSActivation::JSActivationData::JSActivationData): - * kjs/grammar.y: - * kjs/nodes.h: - (JSC::ScopeNode::setUsesArguments): - * masm/X86Assembler.h: - (JSC::X86Assembler::): - (JSC::X86Assembler::orl_mr): + * wtf/Assertions.cpp: -2008-10-01 Kevin McCullough <kmccullough@apple.com> +2009-06-21 Drew Wilson <atwilson@google.com> - Rubberstamped by Geoff Garen. + Reviewed by David Levin. - Remove BreakpointCheckStatement because it's not used anymore. - No effect on sunspider or the jsc tests. + <https://bugs.webkit.org/show_bug.cgi?id=25043> + Added support for multi-threaded MessagePorts. - * kjs/nodes.cpp: - * kjs/nodes.h: + * wtf/MessageQueue.h: + (WTF::::appendAndCheckEmpty): + Added API to test whether the queue was empty before adding an element. + +2009-06-20 David D. Kilzer <ddkilzer@webkit.org> -2008-09-30 Oliver Hunt <oliver@apple.com> + Fix namespace comment in SegmentedVector.h - Reviewed by Geoff Garen. + * wtf/SegmentedVector.h: Updated namespace comment to reflect + new namespace after r44897. - Improve performance of CTI on windows. - - Currently on platforms where the compiler doesn't allow us to safely - index relative to the address of a parameter we need to actually - provide a pointer to CTI runtime call arguments. This patch improves - performance in this case by making the CTI logic for restoring this - parameter much less conservative by only resetting it before we actually - make a call, rather than between each and every SF bytecode we generate - code for. - - This results in a 3.6% progression on the v8 benchmark when compiled with MSVC. - - * VM/CTI.cpp: - (JSC::CTI::emitCall): - (JSC::CTI::compileOpCall): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - (JSC::CTI::privateCompilePutByIdTransition): - * VM/CTI.h: - * masm/X86Assembler.h: - * wtf/Platform.h: +2009-06-20 Zoltan Herczeg <zherczeg@inf.u-szeged.hu> -2008-09-30 Maciej Stachowiak <mjs@apple.com> + Bug 24986: ARM JIT port + <https://bugs.webkit.org/show_bug.cgi?id=24986> Reviewed by Oliver Hunt. - - track uses of "this", "with" and "catch" in the parser - - Knowing this up front will be useful for future optimizations. - - Perf and correctness remain the same. - - * kjs/NodeInfo.h: - * kjs/grammar.y: - -2008-09-30 Sam Weinig <sam@webkit.org> - - Reviewed by Mark Rowe. - - Add WebKitAvailability macros for JSObjectMakeArray, JSObjectMakeDate, JSObjectMakeError, - and JSObjectMakeRegExp - - * API/JSObjectRef.h: - -2008-09-30 Darin Adler <darin@apple.com> - - Reviewed by Geoff Garen. - - - https://bugs.webkit.org/show_bug.cgi?id=21214 - work on getting rid of ExecState - - Replaced the m_prev field of ExecState with a bit in the - call frame pointer to indicate "host" call frames. - - * VM/Machine.cpp: - (JSC::makeHostCallFramePointer): Added. Sets low bit. - (JSC::isHostCallFrame): Added. Checks low bit. - (JSC::stripHostCallFrameBit): Added. Clears low bit. - (JSC::Machine::unwindCallFrame): Replaced null check that was - formerly used to detect host call frames with an isHostCallFrame check. - (JSC::Machine::execute): Pass in a host call frame pointer rather than - always passing 0 when starting execution from the host. This allows us - to follow the entire call frame pointer chain when desired, or to stop - at the host calls when that's desired. - (JSC::Machine::privateExecute): Replaced null check that was - formerly used to detect host call frames with an isHostCallFrame check. - (JSC::Machine::retrieveCaller): Ditto. - (JSC::Machine::retrieveLastCaller): Ditto. - (JSC::Machine::callFrame): Removed the code to walk up m_prev pointers - and replaced it with code that uses the caller pointer and uses the - stripHostCallFrameBit function. - - * kjs/ExecState.cpp: Removed m_prev. - * kjs/ExecState.h: Ditto. - -2008-09-30 Cameron Zwarich <zwarich@apple.com> - - Reviewed by Geoff Garen. - - Move all detection of 'arguments' in a lexical scope to the parser, in - preparation for fixing - - Bug 21123: using "arguments" in a function should not force creation of an activation object - <https://bugs.webkit.org/show_bug.cgi?id=21123> - - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::CodeGenerator): - * kjs/NodeInfo.h: - * kjs/grammar.y: - -2008-09-30 Geoffrey Garen <ggaren@apple.com> - - Not reviewed. - - * kjs/Shell.cpp: - (runWithScripts): Fixed indentation. - -2008-09-30 Mark Rowe <mrowe@apple.com> - - Rubber-stamped by Sam Weinig. - - Build fix. Move InternalFunction::classInfo implementation into the .cpp - file to prevent the vtable for InternalFunction being generated as a weak symbol. - Has no effect on SunSpider. - - * kjs/InternalFunction.cpp: - (JSC::InternalFunction::classInfo): - * kjs/InternalFunction.h: - -2008-09-29 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Darin Adler. - - - optimize appending a number to a string - https://bugs.webkit.org/show_bug.cgi?id=21203 - - It's pretty common in real-world code (and on some of the v8 - benchmarks) to append a number to a string, so I made this one of - the fast cases, and also added support to UString to do it - directly without allocating a temporary UString. - - ~1% speedup on v8 benchmark. - - * VM/Machine.cpp: - (JSC::jsAddSlowCase): Make this NEVER_INLINE because somehow otherwise - the change is a regression. - (JSC::jsAdd): Handle number + string special case. - (JSC::Machine::cti_op_add): Integrate much of the logic of jsAdd to - avoid exception check in the str + str, num + num and str + num cases. - * kjs/ustring.cpp: - (JSC::expandedSize): Make this a non-member function, since it needs to be - called in non-member functions but not outside this file. - (JSC::expandCapacity): Ditto. - (JSC::UString::expandCapacity): Call the non-member version. - (JSC::createRep): Helper to make a rep from a char*. - (JSC::UString::UString): Use above helper. - (JSC::concatenate): Guts of concatenating constructor for cases where first - item is a UString::Rep, and second is a UChar* and length, or a char*. - (JSC::UString::append): Implement for cases where first item is a UString::Rep, - and second is an int or double. Sadly duplicates logic of UString::from(int) - and UString::from(double). - * kjs/ustring.h: - -2008-09-29 Darin Adler <darin@apple.com> - - Reviewed by Sam Weinig. - - - https://bugs.webkit.org/show_bug.cgi?id=21214 - work on getting rid of ExecState - - * JavaScriptCore.exp: Updated since JSGlobalObject::init - no longer takes a parameter. - - * VM/Machine.cpp: - (JSC::Machine::execute): Removed m_registerFile argument - for ExecState constructors. - - * kjs/DebuggerCallFrame.cpp: - (JSC::DebuggerCallFrame::evaluate): Removed globalThisValue - argument for ExecState constructor. - - * kjs/ExecState.cpp: - (JSC::ExecState::ExecState): Removed globalThisValue and - registerFile arguments to constructors. - - * kjs/ExecState.h: Removed m_globalThisValue and - m_registerFile data members. - - * kjs/JSGlobalObject.cpp: - (JSC::JSGlobalObject::init): Removed globalThisValue - argument for ExecState constructor. - - * kjs/JSGlobalObject.h: - (JSC::JSGlobalObject::JSGlobalObject): Got rid of parameter - for the init function. - -2008-09-29 Geoffrey Garen <ggaren@apple.com> - - Rubber-stamped by Cameron Zwarich. - - Fixed https://bugs.webkit.org/show_bug.cgi?id=21225 - Machine::retrieveLastCaller should check for a NULL codeBlock - - In order to crash, you would need to call retrieveCaller in a situation - where you had two host call frames in a row in the register file. I - don't know how to make that happen, or if it's even possible, so I don't - have a test case -- but better safe than sorry! - - * VM/Machine.cpp: - (JSC::Machine::retrieveLastCaller): - -2008-09-29 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Cameron Zwarich. - - Store the callee ScopeChain, not the caller ScopeChain, in the call frame - header. Nix the "scopeChain" local variable and ExecState::m_scopeChain, and - access the callee ScopeChain through the call frame header instead. - - Profit: call + return are simpler, because they don't have to update the - "scopeChain" local variable, or ExecState::m_scopeChain. - - Because CTI keeps "r" in a register, reading the callee ScopeChain relative - to "r" can be very fast, in any cases we care to optimize. - - 0% speedup on empty function call benchmark. (5.5% speedup in bytecode.) - 0% speedup on SunSpider. (7.5% speedup on controlflow-recursive.) - 2% speedup on SunSpider --v8. - 2% speedup on v8 benchmark. - - * VM/CTI.cpp: Changed scope chain access to read the scope chain from - the call frame header. Sped up op_ret by changing it not to fuss with - the "scopeChain" local variable or ExecState::m_scopeChain. - - * VM/CTI.h: Updated CTI trampolines not to take a ScopeChainNode* - argument, since that's stored in the call frame header now. - - * VM/Machine.cpp: Access "scopeChain" and "codeBlock" through new helper - functions that read from the call frame header. Updated functions operating - on ExecState::m_callFrame to account for / take advantage of the fact that - Exec:m_callFrame is now never NULL. - - Fixed a bug in op_construct, where it would use the caller's default - object prototype, rather than the callee's, when constructing a new object. - - * VM/Machine.h: Made some helper functions available. Removed - ScopeChainNode* arguments to a lot of functions, since the ScopeChainNode* - is now stored in the call frame header. - - * VM/RegisterFile.h: Renamed "CallerScopeChain" to "ScopeChain", since - that's what it is now. - - * kjs/DebuggerCallFrame.cpp: Updated for change to ExecState signature. - - * kjs/ExecState.cpp: - * kjs/ExecState.h: Nixed ExecState::m_callFrame, along with the unused - isGlobalObject function. - - * kjs/JSGlobalObject.cpp: - * kjs/JSGlobalObject.h: Gave the global object a fake call frame in - which to store the global scope chain, since our code now assumes that - it can always read the scope chain out of the ExecState's call frame. - -2008-09-29 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Sam Weinig. - - Remove the isActivationObject() virtual method on JSObject and use - StructureID information instead. This should be slightly faster, but - isActivationObject() is only used in assertions and unwinding the stack - for exceptions. - - * VM/Machine.cpp: - (JSC::depth): - (JSC::Machine::unwindCallFrame): - (JSC::Machine::privateExecute): - (JSC::Machine::cti_op_ret_activation): - * kjs/JSActivation.cpp: - * kjs/JSActivation.h: - * kjs/JSObject.h: - -2008-09-29 Peter Gal <galpeter@inf.u-szeged.hu> - - Reviewed and tweaked by Darin Adler. - - Fix build for non-all-in-one platforms. - - * kjs/StringPrototype.cpp: Added missing ASCIICType.h include. - -2008-09-29 Bradley T. Hughes <bradley.hughes@nokia.com> - - Reviewed by Simon Hausmann. - - Fix compilation with icpc - - * wtf/HashSet.h: - (WTF::::find): - (WTF::::contains): - -2008-09-29 Thiago Macieira <thiago.macieira@nokia.com> - - Reviewed by Simon Hausmann. - - Changed copyright from Trolltech ASA to Nokia. - - Nokia acquired Trolltech ASA, assets were transferred on September 26th 2008. - - - * wtf/qt/MainThreadQt.cpp: - -2008-09-29 Simon Hausmann <hausmann@webkit.org> - - Reviewed by Lars Knoll. - - Don't accidentially install libJavaScriptCore.a for the build inside - Qt. - - * JavaScriptCore.pro: - -2008-09-28 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Maciej Stachowiak. - - Bug 21200: Allow direct access to 'arguments' without using op_resolve - <https://bugs.webkit.org/show_bug.cgi?id=21200> - - Allow fast access to the 'arguments' object by adding an extra slot to - the callframe to store it. - - This is a 3.0% speedup on the V8 Raytrace benchmark. - - * JavaScriptCore.exp: - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): - * VM/CodeBlock.cpp: - (JSC::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::CodeGenerator): - (JSC::CodeGenerator::registerFor): - * VM/CodeGenerator.h: - (JSC::CodeGenerator::registerFor): - * VM/Machine.cpp: - (JSC::Machine::initializeCallFrame): - (JSC::Machine::dumpRegisters): - (JSC::Machine::privateExecute): - (JSC::Machine::retrieveArguments): - (JSC::Machine::cti_op_call_JSFunction): - (JSC::Machine::cti_op_create_arguments): - (JSC::Machine::cti_op_construct_JSConstruct): - * VM/Machine.h: - * VM/Opcode.h: - * VM/RegisterFile.h: - (JSC::RegisterFile::): - * kjs/JSActivation.cpp: - (JSC::JSActivation::mark): - (JSC::JSActivation::argumentsGetter): - * kjs/JSActivation.h: - (JSC::JSActivation::JSActivationData::JSActivationData): - * kjs/NodeInfo.h: - * kjs/Parser.cpp: - (JSC::Parser::didFinishParsing): - * kjs/Parser.h: - (JSC::Parser::parse): - * kjs/grammar.y: - * kjs/nodes.cpp: - (JSC::ScopeNode::ScopeNode): - (JSC::ProgramNode::ProgramNode): - (JSC::ProgramNode::create): - (JSC::EvalNode::EvalNode): - (JSC::EvalNode::create): - (JSC::FunctionBodyNode::FunctionBodyNode): - (JSC::FunctionBodyNode::create): - * kjs/nodes.h: - (JSC::ScopeNode::usesArguments): - -2008-09-28 Mark Rowe <mrowe@apple.com> - - Reviewed by Sam Weinig. - - Add an ASCII fast-path to toLowerCase and toUpperCase. - - The fast path speeds up the common case of an ASCII-only string by up to 60% while adding a less than 5% penalty - to the less common non-ASCII case. - - This also removes stringProtoFuncToLocaleLowerCase and stringProtoFuncToLocaleUpperCase, which were identical - to the non-locale variants of the functions. toLocaleLowerCase and toLocaleUpperCase now use the non-locale - variants of the functions directly. - - * kjs/StringPrototype.cpp: - (JSC::stringProtoFuncToLowerCase): - (JSC::stringProtoFuncToUpperCase): - -2008-09-28 Mark Rowe <mrowe@apple.com> - - Reviewed by Cameron Zwarich. - - Speed up parseInt and parseFloat. - - Repeatedly indexing into a UString is slow, so retrieve a pointer into the underlying buffer once up front - and use that instead. This is a 7% win on a parseInt/parseFloat micro-benchmark. - - * kjs/JSGlobalObjectFunctions.cpp: - (JSC::parseInt): - (JSC::parseFloat): - -2008-09-28 Simon Hausmann <hausmann@webkit.org> - - Reviewed by David Hyatt. - - In Qt's initializeThreading re-use an existing thread identifier for the main - thread if it exists. - - currentThread() implicitly creates new identifiers and it could be that - it is called before initializeThreading(). - - * wtf/ThreadingQt.cpp: - (WTF::initializeThreading): - -2008-09-27 Keishi Hattori <casey.hattori@gmail.com> - - Added Machine::retrieveCaller to the export list. - - Reviewed by Kevin McCullough and Tim Hatcher. - - * JavaScriptCore.exp: Added Machine::retrieveCaller. - -2008-09-27 Anders Carlsson <andersca@apple.com> - - Fix build. - - * VM/CTI.cpp: - (JSC::): - -2008-09-27 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Cameron Zwarich. - - https://bugs.webkit.org/show_bug.cgi?id=21175 - - Store the callee CodeBlock, not the caller CodeBlock, in the call frame - header. Nix the "codeBlock" local variable, and access the callee - CodeBlock through the call frame header instead. - - Profit: call + return are simpler, because they don't have to update the - "codeBlock" local variable. - - Because CTI keeps "r" in a register, reading the callee CodeBlock relative - to "r" can be very fast, in any cases we care to optimize. Presently, - no such cases seem important. - - Also, stop writing "dst" to the call frame header. CTI doesn't use it. - - 21.6% speedup on empty function call benchmark. - 3.8% speedup on SunSpider --v8. - 2.1% speedup on v8 benchmark. - 0.7% speedup on SunSpider (6% speedup on controlflow-recursive). - - Small regression in bytecode, because currently every op_ret reads the - callee CodeBlock to check needsFullScopeChain, and bytecode does not - keep "r" in a register. On-balance, this is probably OK, since CTI is - our high-performance execution model. Also, this should go away once - we make needsFullScopeChain statically determinable at parse time. - - * VM/CTI.cpp: - (JSC::CTI::compileOpCall): The speedup! - (JSC::CTI::privateCompileSlowCases): ditto - - * VM/CTI.h: - (JSC::): Fixed up magic trampoline constants to account for the nixed - "codeBlock" argument. - (JSC::CTI::execute): Changed trampoline function not to take a "codeBlock" - argument, since codeBlock is now stored in the call frame header. - - * VM/Machine.cpp: Read the callee CodeBlock from the register file. Use - a NULL CallerRegisters in the call frame header to signal a built-in - caller, since CodeBlock is now never NULL. - - * VM/Machine.h: Made some stand-alone functions Machine member functions - so they could call the private codeBlock() accessor in the Register - class, of which Machine is a friend. Renamed "CallerCodeBlock" to - "CodeBlock", since it's no longer the caller's CodeBlock. - - * VM/RegisterFile.h: Marked some methods const to accommodate a - const RegisterFile* being passed around in Machine.cpp. - -2008-09-26 Jan Michael Alonzo <jmalonzo@webkit.org> - - Gtk build fix. Not reviewed. - - Narrow-down the target of the JavaScriptCore .lut.h generator so - it won't try to create the WebCore .lut.hs. - - * GNUmakefile.am: - -2008-09-26 Matt Lilek <webkit@mattlilek.com> - - Reviewed by Tim Hatcher. - - Update FEATURE_DEFINES after ENABLE_CROSS_DOCUMENT_MESSAGING was removed. - - * Configurations/JavaScriptCore.xcconfig: - -2008-09-26 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Rubber-stamped by Anders Carlson. - - Change the name 'sc' to 'scopeChainNode' in a few places. - - * kjs/nodes.cpp: - (JSC::EvalNode::generateCode): - (JSC::FunctionBodyNode::generateCode): - (JSC::ProgramNode::generateCode): - -2008-09-26 Sam Weinig <sam@webkit.org> - - Reviewed by Darin Adler. - - Patch for https://bugs.webkit.org/show_bug.cgi?id=21152 - Speedup static property get/put - - Convert getting/setting static property values to use static functions - instead of storing an integer and switching in getValueProperty/putValueProperty. - - * kjs/JSObject.cpp: - (JSC::JSObject::deleteProperty): - (JSC::JSObject::getPropertyAttributes): - * kjs/MathObject.cpp: - (JSC::MathObject::getOwnPropertySlot): - * kjs/NumberConstructor.cpp: - (JSC::numberConstructorNaNValue): - (JSC::numberConstructorNegInfinity): - (JSC::numberConstructorPosInfinity): - (JSC::numberConstructorMaxValue): - (JSC::numberConstructorMinValue): - * kjs/PropertySlot.h: - (JSC::PropertySlot::): - * kjs/RegExpConstructor.cpp: - (JSC::regExpConstructorDollar1): - (JSC::regExpConstructorDollar2): - (JSC::regExpConstructorDollar3): - (JSC::regExpConstructorDollar4): - (JSC::regExpConstructorDollar5): - (JSC::regExpConstructorDollar6): - (JSC::regExpConstructorDollar7): - (JSC::regExpConstructorDollar8): - (JSC::regExpConstructorDollar9): - (JSC::regExpConstructorInput): - (JSC::regExpConstructorMultiline): - (JSC::regExpConstructorLastMatch): - (JSC::regExpConstructorLastParen): - (JSC::regExpConstructorLeftContext): - (JSC::regExpConstructorRightContext): - (JSC::setRegExpConstructorInput): - (JSC::setRegExpConstructorMultiline): - (JSC::RegExpConstructor::setInput): - (JSC::RegExpConstructor::setMultiline): - (JSC::RegExpConstructor::multiline): - * kjs/RegExpConstructor.h: - * kjs/RegExpObject.cpp: - (JSC::regExpObjectGlobal): - (JSC::regExpObjectIgnoreCase): - (JSC::regExpObjectMultiline): - (JSC::regExpObjectSource): - (JSC::regExpObjectLastIndex): - (JSC::setRegExpObjectLastIndex): - * kjs/RegExpObject.h: - (JSC::RegExpObject::setLastIndex): - (JSC::RegExpObject::lastIndex): - (JSC::RegExpObject::RegExpObjectData::RegExpObjectData): - * kjs/StructureID.cpp: - (JSC::StructureID::getEnumerablePropertyNames): - * kjs/create_hash_table: - * kjs/lexer.cpp: - (JSC::Lexer::lex): - * kjs/lookup.cpp: - (JSC::HashTable::createTable): - (JSC::HashTable::deleteTable): - (JSC::setUpStaticFunctionSlot): - * kjs/lookup.h: - (JSC::HashEntry::initialize): - (JSC::HashEntry::setKey): - (JSC::HashEntry::key): - (JSC::HashEntry::attributes): - (JSC::HashEntry::function): - (JSC::HashEntry::functionLength): - (JSC::HashEntry::propertyGetter): - (JSC::HashEntry::propertyPutter): - (JSC::HashEntry::lexerValue): - (JSC::HashEntry::): - (JSC::HashTable::entry): - (JSC::getStaticPropertySlot): - (JSC::getStaticValueSlot): - (JSC::lookupPut): - -2008-09-26 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Maciej Stachowiak & Oliver Hunt. - - Add support for reusing temporary JSNumberCells. This change is based on the observation - that if the result of certain operations is a JSNumberCell and is consumed by a subsequent - operation that would produce a JSNumberCell, we can reuse the object rather than allocating - a fresh one. E.g. given the expression ((a * b) * c), we can statically determine that - (a * b) will have a numeric result (or else it will have thrown an exception), so the result - will either be a JSNumberCell or a JSImmediate. - - This patch changes three areas of JSC: - * The AST now tracks type information about the result of each node. - * This information is consumed in bytecode compilation, and certain bytecode operations - now carry the statically determined type information about their operands. - * CTI uses the information in a number of fashions: - * Where an operand to certain arithmetic operations is reusable, it will plant code - to try to perform the operation in JIT code & reuse the cell, where appropriate. - * Where it can be statically determined that an operand can only be numeric (typically - the result of another arithmetic operation) the code will not redundantly check that - the JSCell is a JSNumberCell. - * Where either of the operands to an add are non-numeric do not plant an optimized - arithmetic code path, just call straight out to the C function. - - +6% Sunspider (10% progression on 3D, 16% progression on math, 60% progression on access-nbody), - +1% v8-tests (improvements in raytrace & crypto) - - * VM/CTI.cpp: Add optimized code generation with reuse of temporary JSNumberCells. - * VM/CTI.h: - * kjs/JSNumberCell.h: - * masm/X86Assembler.h: - - * VM/CodeBlock.cpp: Add type information to specific bytecodes. - * VM/CodeGenerator.cpp: - * VM/CodeGenerator.h: - * VM/Machine.cpp: - - * kjs/nodes.cpp: Track static type information for nodes. - * kjs/nodes.h: - * kjs/ResultDescriptor.h: (Added) - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-09-26 Yichao Yin <yichao.yin@torchmobile.com.cn> - - Reviewed by George Staikos, Maciej Stachowiak. - - Add utility functions needed for upcoming WML code. - - * wtf/ASCIICType.h: - (WTF::isASCIIPrintable): - -2008-09-26 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Darin Adler. - - Reverted the part of r36614 that used static data because static data - is not thread-safe. - -2008-09-26 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Maciej Stachowiak. - - Removed dynamic check for whether the callee needs an activation object. - Replaced with callee code to create the activation object. - - 0.5% speedup on SunSpider. - No change on v8 benchmark. (Might be a speedup, but it's in range of the - variance.) - - 0.7% speedup on v8 benchmark in bytecode. - 1.3% speedup on empty call benchmark in bytecode. - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): Added support for op_init_activation, - the new opcode that specifies that the callee's initialization should - create an activation object. - (JSC::CTI::privateCompile): Removed previous code that did a similar - thing in an ad-hoc way. - - * VM/CodeBlock.cpp: - (JSC::CodeBlock::dump): Added a case for dumping op_init_activation. - - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::generate): Added fixup code to change op_init to - op_init_activation if necessary. (With a better parser, we would know - which to use from the beginning.) - - * VM/Instruction.h: - (JSC::Instruction::Instruction): - (WTF::): Faster traits for the instruction vector. An earlier version - of this patch relied on inserting at the beginning of the vector, and - depended on this change for speed. - - * VM/Machine.cpp: - (JSC::Machine::execute): Removed clients of setScopeChain, the old - abstraction for dynamically checking for whether an activation object - needed to be created. - (JSC::Machine::privateExecute): ditto + An Iterator added for SegmentedVector. Currently + only the pre ++ operator is supported. - (JSC::Machine::cti_op_push_activation): Renamed this function from - cti_vm_updateScopeChain, and made it faster by removing the call to - setScopeChain. - * VM/Machine.h: + * wtf/SegmentedVector.h: + (WTF::SegmentedVectorIterator::~SegmentedVectorIterator): + (WTF::SegmentedVectorIterator::operator*): + (WTF::SegmentedVectorIterator::operator->): + (WTF::SegmentedVectorIterator::operator++): + (WTF::SegmentedVectorIterator::operator==): + (WTF::SegmentedVectorIterator::operator!=): + (WTF::SegmentedVectorIterator::operator=): + (WTF::SegmentedVectorIterator::SegmentedVectorIterator): + (WTF::SegmentedVector::alloc): + (WTF::SegmentedVector::begin): + (WTF::SegmentedVector::end): - * VM/Opcode.h: Declared op_init_activation. +2009-06-20 Zoltan Herczeg <zherczeg@inf.u-szeged.hu> -2008-09-24 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Maciej Stachowiak. - - Move most of the return code back into the callee, now that the callee - doesn't have to calculate anything dynamically. - - 11.5% speedup on empty function call benchmark. - - SunSpider says 0.3% faster. SunSpider --v8 says no change. - - * VM/CTI.cpp: - (JSC::CTI::compileOpCall): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - -2008-09-24 Sam Weinig <sam@webkit.org> - - Reviewed by Maciej Stachowiak. - - Remove staticFunctionGetter. There is only one remaining user of - staticFunctionGetter and it can be converted to use setUpStaticFunctionSlot. - - * JavaScriptCore.exp: - * kjs/lookup.cpp: - * kjs/lookup.h: - -2008-09-24 Maciej Stachowiak <mjs@apple.com> + Bug 24986: ARM JIT port + <https://bugs.webkit.org/show_bug.cgi?id=24986> Reviewed by Oliver Hunt. - - - inline JIT fast case of op_neq - - remove extra level of function call indirection from slow cases of eq and neq - - 1% speedup on Richards - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - * VM/Machine.cpp: - (JSC::Machine::privateExecute): - (JSC::Machine::cti_op_eq): - (JSC::Machine::cti_op_neq): - * kjs/operations.cpp: - (JSC::equal): - (JSC::equalSlowCase): - * kjs/operations.h: - (JSC::equalSlowCaseInline): - -2008-09-24 Sam Weinig <sam@webkit.org> - - Reviewed by Darin Adler. - - Fix for https://bugs.webkit.org/show_bug.cgi?id=21080 - <rdar://problem/6243534> - Crash below Function.apply when using a runtime array as the argument list - - Test: plugins/bindings-array-apply-crash.html - - * kjs/FunctionPrototype.cpp: - (JSC::functionProtoFuncApply): Revert to the slow case if the object inherits from - JSArray (via ClassInfo) but is not a JSArray. - -2008-09-24 Kevin McCullough <kmccullough@apple.com> - - Style change. - - * kjs/nodes.cpp: - (JSC::statementListEmitCode): - -2008-09-24 Kevin McCullough <kmccullough@apple.com> - Reviewed by Geoff. + Move SegmentedVector to /wtf subdirectory + and change "namespace JSC" to "namespace WTF" - Bug 21031: Breakpoints in the condition of loops only breaks the first - time - - Now when setting breakpoints in the condition of a loop (for, while, - for in, and do while) will successfully break each time throught the - loop. - - For 'for' loops we need a little more complicated behavior that cannot - be accomplished without some more significant changes: - https://bugs.webkit.org/show_bug.cgi?id=21073 + Additional build file updates by David Kilzer. - * kjs/nodes.cpp: - (JSC::statementListEmitCode): We don't want to blindly emit a debug hook - at the first line of loops, instead let the loop emit the debug hooks. - (JSC::DoWhileNode::emitCode): - (JSC::WhileNode::emitCode): - (JSC::ForNode::emitCode): - (JSC::ForInNode::emitCode): - * kjs/nodes.h: - (JSC::StatementNode::): - (JSC::DoWhileNode::): - (JSC::WhileNode::): - (JSC::ForInNode::): - -2008-09-24 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Darin Adler. - - Fixed <rdar://problem/5605532> Need a SPI for telling JS the size of - the objects it retains - - * API/tests/testapi.c: Test the new SPI a little. - - * API/JSSPI.cpp: Add the new SPI. - * API/JSSPI.h: Add the new SPI. - * JavaScriptCore.exp: Add the new SPI. - * JavaScriptCore.xcodeproj/project.pbxproj: Add the new SPI. - -2008-09-24 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Darin Adler. - - * API/JSBase.h: Filled in some missing function names. - -2008-09-24 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Cameron Zwarich. - - Fixed https://bugs.webkit.org/show_bug.cgi?id=21057 - Crash in RegisterID::deref() running fast/canvas/canvas-putImageData.html - - * VM/CodeGenerator.h: Changed declaration order to ensure the - m_lastConstant, which is a RefPtr that points into m_calleeRegisters, - has its destructor called before the destructor for m_calleeRegisters. - -2008-09-24 Darin Adler <darin@apple.com> + * GNUmakefile.am: Updated path to SegmentedVector.h. + * JavaScriptCore.order: Updated SegmentedVector namespace from + JSC to WTF in mangled C++ method name. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + Removed reference to bytecompiler\SegmentedVector.h. + * JavaScriptCore.vcproj/WTF/WTF.vcproj: Added reference to + wtf\SegmentedVector.h. + * JavaScriptCore.xcodeproj/project.pbxproj: Moved + SegmentedVector.h definition from bytecompiler subdirectory to + wtf subdirectory. + * bytecompiler/BytecodeGenerator.h: Updated #include path to + SegmentedVector.h and prepended WTF:: namespace to its use. + * parser/Lexer.h: Ditto. + * wtf/SegmentedVector.h: Renamed from JavaScriptCore/bytecompiler/SegmentedVector.h. + (WTF::SegmentedVector::SegmentedVector): + (WTF::SegmentedVector::~SegmentedVector): + (WTF::SegmentedVector::size): + (WTF::SegmentedVector::at): + (WTF::SegmentedVector::operator[]): + (WTF::SegmentedVector::last): + (WTF::SegmentedVector::append): + (WTF::SegmentedVector::removeLast): + (WTF::SegmentedVector::grow): + (WTF::SegmentedVector::clear): + (WTF::SegmentedVector::deleteAllSegments): + (WTF::SegmentedVector::segmentExistsFor): + (WTF::SegmentedVector::segmentFor): + (WTF::SegmentedVector::subscriptFor): + (WTF::SegmentedVector::ensureSegmentsFor): + (WTF::SegmentedVector::ensureSegment): + +2009-06-19 Gavin Barraclough <barraclough@apple.com> + + Reviewed by NOBODY (build fix take 2 - rename FIELD_OFFSET to something that doesn't conflict with winnt.h). - Reviewed by Sam Weinig. + * jit/JIT.cpp: + (JSC::JIT::privateCompile): + (JSC::JIT::privateCompileCTIMachineTrampolines): + (JSC::JIT::emitGetVariableObjectRegister): + (JSC::JIT::emitPutVariableObjectRegister): + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_rshift): + (JSC::JIT::emitSlow_op_jnless): + (JSC::JIT::emitSlow_op_jnlesseq): + (JSC::JIT::compileBinaryArithOp): + * jit/JITCall.cpp: + (JSC::JIT::compileOpCallInitializeCallFrame): + (JSC::JIT::compileOpCall): + * jit/JITInlineMethods.h: + (JSC::JIT::restoreArgumentReference): + (JSC::JIT::checkStructure): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_instanceof): + (JSC::JIT::emit_op_get_scoped_var): + (JSC::JIT::emit_op_put_scoped_var): + (JSC::JIT::emit_op_construct_verify): + (JSC::JIT::emit_op_resolve_global): + (JSC::JIT::emit_op_jeq_null): + (JSC::JIT::emit_op_jneq_null): + (JSC::JIT::emit_op_to_jsnumber): + (JSC::JIT::emit_op_catch): + (JSC::JIT::emit_op_eq_null): + (JSC::JIT::emit_op_neq_null): + (JSC::JIT::emit_op_convert_this): + (JSC::JIT::emit_op_profile_will_call): + (JSC::JIT::emit_op_profile_did_call): + (JSC::JIT::emitSlow_op_get_by_val): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emit_op_get_by_val): + (JSC::JIT::emit_op_put_by_val): + (JSC::JIT::emit_op_method_check): + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::emit_op_put_by_id): + (JSC::JIT::compilePutDirectOffset): + (JSC::JIT::compileGetDirectOffset): + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::privateCompilePatchGetArrayLength): + * jit/JITStubs.cpp: + (JSC::JITThunks::JITThunks): - - https://bugs.webkit.org/show_bug.cgi?id=21047 - speed up ret_activation with inlining +2009-06-19 Gavin Barraclough <barraclough@apple.com> - About 1% on v8-raytrace. + Reviewed by NOBODY (Windows build fix). - * JavaScriptCore.exp: Removed JSVariableObject::setRegisters. + * jit/JIT.h: + * jit/JITInlineMethods.h: - * kjs/JSActivation.cpp: Moved copyRegisters to the header to make it inline. - * kjs/JSActivation.h: - (JSC::JSActivation::copyRegisters): Moved here. Also removed the registerArraySize - argument to setRegisters, since the object doesn't need to store the number of - registers. +2009-06-19 Gabor Loki <loki@inf.u-szeged.hu> - * kjs/JSGlobalObject.cpp: - (JSC::JSGlobalObject::reset): Removed unnecessary clearing left over from when we - used this on objects that weren't brand new. These days, this function is really - just part of the constructor. + Reviewed by Gavin Barraclough. - * kjs/JSGlobalObject.h: Added registerArraySize to JSGlobalObjectData, since - JSVariableObjectData no longer needs it. Added a setRegisters override here - that handles storing the size. + Reorganize ARM architecture specific macros. + Use PLATFORM_ARM_ARCH(7) instead of PLATFORM(ARM_V7). - * kjs/JSStaticScopeObject.h: Removed code to set registerArraySize, since it - no longer exists. + Bug 24986: ARM JIT port + <https://bugs.webkit.org/show_bug.cgi?id=24986> - * kjs/JSVariableObject.cpp: Moved copyRegisterArray and setRegisters to the - header to make them inline. - * kjs/JSVariableObject.h: Removed registerArraySize from JSVariableObjectData, - since it was only used for the global object. - (JSC::JSVariableObject::copyRegisterArray): Moved here ot make it inline. - (JSC::JSVariableObject::setRegisters): Moved here to make it inline. Also - removed the code to set registerArraySize and changed an if statement into - an assert to save an unnnecessary branch. + * assembler/ARMv7Assembler.h: + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::Imm32::Imm32): + * assembler/MacroAssembler.h: + * assembler/MacroAssemblerCodeRef.h: + (JSC::MacroAssemblerCodePtr::MacroAssemblerCodePtr): + * jit/ExecutableAllocator.h: + (JSC::ExecutableAllocator::cacheFlush): + * jit/JIT.h: + * jit/JITInlineMethods.h: + (JSC::JIT::restoreArgumentReferenceForTrampoline): + * jit/JITStubs.cpp: + * jit/JITStubs.h: + * wtf/Platform.h: + * yarr/RegexJIT.cpp: + (JSC::Yarr::RegexGenerator::generateEnter): + (JSC::Yarr::RegexGenerator::generateReturn): -2008-09-24 Maciej Stachowiak <mjs@apple.com> +2009-06-19 Gavin Barraclough <barraclough@apple.com> Reviewed by Oliver Hunt. - - - inline PropertyMap::getOffset to speed up polymorphic lookups - - ~1.5% speedup on v8 benchmark - no effect on SunSpider - - * JavaScriptCore.exp: - * kjs/PropertyMap.cpp: - * kjs/PropertyMap.h: - (JSC::PropertyMap::getOffset): - -2008-09-24 Jan Michael Alonzo <jmalonzo@webkit.org> - Reviewed by Alp Toker. + Fix armv7 JIT build issues. - https://bugs.webkit.org/show_bug.cgi?id=20992 - Build fails on GTK+ Mac OS + Unfortunate the arm compiler does not like the use of offsetof on JITStackFrame (since it now contains non POD types), + and the FIELD_OFFSET macro does not appear constantish enough for it to be happy with its use in COMPILE_ASSERT macros. - * wtf/ThreadingGtk.cpp: Remove platform ifdef as suggested by - Richard Hult. - (WTF::initializeThreading): + * Replace offsetofs with FIELD_OFFSETs (safe on C++ objects). + * Move COMPILE_ASSERTs defending layout of JITStackFrame structure on armv7 into JITThunks constructor. -2008-09-23 Oliver Hunt <oliver@apple.com> - - Reviewed by Maciej Stachowiak. - - Bug 19968: Slow Script at www.huffingtonpost.com - <https://bugs.webkit.org/show_bug.cgi?id=19968> - - Finally found the cause of this accursed issue. It is triggered - by synchronous creation of a new global object from JS. The new - global object resets the timer state in this execution group's - Machine, taking timerCheckCount to 0. Then when JS returns the - timerCheckCount is decremented making it non-zero. The next time - we execute JS we will start the timeout counter, however the non-zero - timeoutCheckCount means we don't reset the timer information. This - means that the timeout check is now checking the cumulative time - since the creation of the global object rather than the time since - JS was last entered. At this point the slow script dialog is guaranteed - to eventually be displayed incorrectly unless a page is loaded - asynchronously (which will reset everything into a sane state). - - The fix for this is rather trivial -- the JSGlobalObject constructor - should not be resetting the machine timer state. + * jit/JIT.cpp: + * jit/JIT.h: + * jit/JITInlineMethods.h: + (JSC::JIT::restoreArgumentReference): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_catch): + * jit/JITStubs.cpp: + (JSC::JITThunks::JITThunks): - * VM/Machine.cpp: - (JSC::Machine::Machine): - Now that we can't rely on the GlobalObject initialising the timeout - state, we do it in the Machine constructor. +2009-06-19 Adam Treat <adam.treat@torchmobile.com> - * VM/Machine.h: - (JSC::Machine::stopTimeoutCheck): - Add assertions to guard against this happening. + Blind attempt at build fix. - * kjs/JSGlobalObject.cpp: - (JSC::JSGlobalObject::init): - Don't reset the timeout state. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: -2008-09-23 Geoffrey Garen <ggaren@apple.com> +2009-06-19 Zoltan Horvath <hzoltan@inf.u-szeged.hu> Reviewed by Oliver Hunt. - - Fixed https://bugs.webkit.org/show_bug.cgi?id=21038 | <rdar://problem/6240812> - Uncaught exceptions in regex replace callbacks crash webkit - - This was a combination of two problems: - - (1) the replace function would continue execution after an exception - had been thrown. - - (2) In some cases, the Machine would return 0 in the case of an exception, - despite the fact that a few clients dereference the Machine's return - value without first checking for an exception. - - * VM/Machine.cpp: - (JSC::Machine::execute): - - ^ Return jsNull() instead of 0 in the case of an exception, since some - clients depend on using our return value. - - ^ ASSERT that execution does not continue after an exception has been - thrown, to help catch problems like this in the future. - - * kjs/StringPrototype.cpp: - (JSC::stringProtoFuncReplace): - - ^ Stop execution if an exception has been thrown. - -2008-09-23 Geoffrey Garen <ggaren@apple.com> - - Try to fix the windows build. - - * VM/CTI.cpp: - (JSC::CTI::compileOpCall): - (JSC::CTI::privateCompileMainPass): - -2008-09-23 Alp Toker <alp@nuanti.com> - - Build fix. - - * VM/CTI.h: - -2008-09-23 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Darin Adler. - - * wtf/Platform.h: Removed duplicate #if. - -2008-09-23 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Darin Adler. - - Changed the layout of the call frame from - - { header, parameters, locals | constants, temporaries } - - to - - { parameters, header | locals, constants, temporaries } - - This simplifies function entry+exit, and enables a number of future - optimizations. - - 13.5% speedup on empty call benchmark for bytecode; 23.6% speedup on - empty call benchmark for CTI. - - SunSpider says no change. SunSpider --v8 says 1% faster. - - * VM/CTI.cpp: - - Added a bit of abstraction for calculating whether a register is a - constant, since this patch changes that calculation: - (JSC::CTI::isConstant): - (JSC::CTI::getConstant): - (JSC::CTI::emitGetArg): - (JSC::CTI::emitGetPutArg): - (JSC::CTI::getConstantImmediateNumericArg): - - Updated for changes to callframe header location: - (JSC::CTI::emitPutToCallFrameHeader): - (JSC::CTI::emitGetFromCallFrameHeader): - (JSC::CTI::printOpcodeOperandTypes): - - Renamed to spite Oliver: - (JSC::CTI::emitInitRegister): - - Added an abstraction for emitting a call through a register, so that - calls through registers generate exception info, too: - (JSC::CTI::emitCall): - Updated to match the new callframe header layout, and to support calls - through registers, which have no destination address: - (JSC::CTI::compileOpCall): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - (JSC::CTI::privateCompile): + Inherits CallIdentifier struct from FastAllocBase because it has been + instantiated by 'new' in JavaScriptCore/profiler/CallIdentifier.h:86. - * VM/CTI.h: - - More of the above: - (JSC::CallRecord::CallRecord): - - * VM/CodeBlock.cpp: - - Updated for new register layout: - (JSC::registerName): - (JSC::CodeBlock::dump): - - * VM/CodeBlock.h: - - Updated CodeBlock to track slightly different information about the - register frame, and tweaked the style of an ASSERT_NOT_REACHED. - (JSC::CodeBlock::CodeBlock): - (JSC::CodeBlock::getStubInfo): - - * VM/CodeGenerator.cpp: - - Added some abstraction around constant register allocation, since this - patch changes it, changed codegen to account for the new callframe - layout, and added abstraction around register fetching code - that used to assume that all local registers lived at negative indices, - since vars now live at positive indices: - (JSC::CodeGenerator::generate): - (JSC::CodeGenerator::addVar): - (JSC::CodeGenerator::addGlobalVar): - (JSC::CodeGenerator::allocateConstants): - (JSC::CodeGenerator::CodeGenerator): - (JSC::CodeGenerator::addParameter): - (JSC::CodeGenerator::registerFor): - (JSC::CodeGenerator::constRegisterFor): - (JSC::CodeGenerator::newRegister): - (JSC::CodeGenerator::newTemporary): - (JSC::CodeGenerator::highestUsedRegister): - (JSC::CodeGenerator::addConstant): - - ASSERT that our caller referenced the registers it passed to us. - Otherwise, we might overwrite them with parameters: - (JSC::CodeGenerator::emitCall): - (JSC::CodeGenerator::emitConstruct): - - * VM/CodeGenerator.h: - - Added some abstraction for getting a RegisterID for a given index, - since the rules are a little weird: - (JSC::CodeGenerator::registerFor): - - * VM/Machine.cpp: - - Utility function to transform a machine return PC to a virtual machine - return VPC, for the sake of stack unwinding, since both PCs are stored - in the same location now: - (JSC::vPCForPC): - - Tweaked to account for new call frame: - (JSC::Machine::initializeCallFrame): - - Tweaked to account for registerOffset supplied by caller: - (JSC::slideRegisterWindowForCall): - - Tweaked to account for new register layout: - (JSC::scopeChainForCall): - (JSC::Machine::callEval): - (JSC::Machine::dumpRegisters): - (JSC::Machine::unwindCallFrame): - (JSC::Machine::execute): - - Changed op_call and op_construct to implement the new calling convention: - (JSC::Machine::privateExecute): - - Tweaked to account for the new register layout: - (JSC::Machine::retrieveArguments): - (JSC::Machine::retrieveCaller): - (JSC::Machine::retrieveLastCaller): - (JSC::Machine::callFrame): - (JSC::Machine::getArgumentsData): - - Changed CTI call helpers to implement the new calling convention: - (JSC::Machine::cti_op_call_JSFunction): - (JSC::Machine::cti_op_call_NotJSFunction): - (JSC::Machine::cti_op_ret_activation): - (JSC::Machine::cti_op_ret_profiler): - (JSC::Machine::cti_op_construct_JSConstruct): - (JSC::Machine::cti_op_construct_NotJSConstruct): - (JSC::Machine::cti_op_call_eval): - - * VM/Machine.h: - - * VM/Opcode.h: - - Renamed op_initialise_locals to op_init, because this opcode - doesn't initialize all locals, and it doesn't initialize only locals. - Also, to spite Oliver. - - * VM/RegisterFile.h: - - New call frame enumeration values: - (JSC::RegisterFile::): - - Simplified the calculation of whether a RegisterID is a temporary, - since we can no longer assume that all positive non-constant registers - are temporaries: - * VM/RegisterID.h: - (JSC::RegisterID::RegisterID): - (JSC::RegisterID::setTemporary): - (JSC::RegisterID::isTemporary): - - Renamed firstArgumentIndex to firstParameterIndex because the assumption - that this variable pertained to the actual arguments supplied by the - caller caused me to write some buggy code: - * kjs/Arguments.cpp: - (JSC::ArgumentsData::ArgumentsData): - (JSC::Arguments::Arguments): - (JSC::Arguments::fillArgList): - (JSC::Arguments::getOwnPropertySlot): - (JSC::Arguments::put): - - Updated for new call frame layout: - * kjs/DebuggerCallFrame.cpp: - (JSC::DebuggerCallFrame::functionName): - (JSC::DebuggerCallFrame::type): - * kjs/DebuggerCallFrame.h: - - Changed the activation object to account for the fact that a call frame - header now sits between parameters and local variables. This change - requires all variable objects to do their own marking, since they - now use their register storage differently: - * kjs/JSActivation.cpp: - (JSC::JSActivation::mark): - (JSC::JSActivation::copyRegisters): - (JSC::JSActivation::createArgumentsObject): - * kjs/JSActivation.h: - - Updated global object to use the new interfaces required by the change - to JSActivation above: - * kjs/JSGlobalObject.cpp: - (JSC::JSGlobalObject::reset): - (JSC::JSGlobalObject::mark): - (JSC::JSGlobalObject::copyGlobalsFrom): - (JSC::JSGlobalObject::copyGlobalsTo): - * kjs/JSGlobalObject.h: - (JSC::JSGlobalObject::addStaticGlobals): - - Updated static scope object to use the new interfaces required by the - change to JSActivation above: - * kjs/JSStaticScopeObject.cpp: - (JSC::JSStaticScopeObject::mark): - (JSC::JSStaticScopeObject::~JSStaticScopeObject): - * kjs/JSStaticScopeObject.h: - (JSC::JSStaticScopeObject::JSStaticScopeObject): - (JSC::JSStaticScopeObject::d): - - Updated variable object to use the new interfaces required by the - change to JSActivation above: - * kjs/JSVariableObject.cpp: - (JSC::JSVariableObject::copyRegisterArray): - (JSC::JSVariableObject::setRegisters): - * kjs/JSVariableObject.h: - - Changed the bit twiddling in symbol table not to assume that all indices - are negative, since they can be positive now: - * kjs/SymbolTable.h: - (JSC::SymbolTableEntry::SymbolTableEntry): - (JSC::SymbolTableEntry::isNull): - (JSC::SymbolTableEntry::getIndex): - (JSC::SymbolTableEntry::getAttributes): - (JSC::SymbolTableEntry::setAttributes): - (JSC::SymbolTableEntry::isReadOnly): - (JSC::SymbolTableEntry::pack): - (JSC::SymbolTableEntry::isValidIndex): - - Changed call and construct nodes to ref their functions and/or bases, - so that emitCall/emitConstruct doesn't overwrite them with parameters. - Also, updated for rename to registerFor: - * kjs/nodes.cpp: - (JSC::ResolveNode::emitCode): - (JSC::NewExprNode::emitCode): - (JSC::EvalFunctionCallNode::emitCode): - (JSC::FunctionCallValueNode::emitCode): - (JSC::FunctionCallResolveNode::emitCode): - (JSC::FunctionCallBracketNode::emitCode): - (JSC::FunctionCallDotNode::emitCode): - (JSC::PostfixResolveNode::emitCode): - (JSC::DeleteResolveNode::emitCode): - (JSC::TypeOfResolveNode::emitCode): - (JSC::PrefixResolveNode::emitCode): - (JSC::ReadModifyResolveNode::emitCode): - (JSC::AssignResolveNode::emitCode): - (JSC::ConstDeclNode::emitCodeSingle): - (JSC::ForInNode::emitCode): - - Added abstraction for getting exception info out of a call through a - register: - * masm/X86Assembler.h: - (JSC::X86Assembler::emitCall): - - Removed duplicate #if: - * wtf/Platform.h: - -2008-09-23 Kevin McCullough <kmccullough@apple.com> - - Reviewed by Darin. - - Bug 21030: The JS debugger breaks on the do of a do-while not the while - (where the conditional statement is) - https://bugs.webkit.org/show_bug.cgi?id=21030 - Now the statementListEmitCode detects if a do-while node is being - emited and emits the debug hook on the last line instead of the first. - - This change had no effect on sunspider. - - * kjs/nodes.cpp: - (JSC::statementListEmitCode): - * kjs/nodes.h: - (JSC::StatementNode::isDoWhile): - (JSC::DoWhileNode::isDoWhile): - -2008-09-23 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Cameron Zwarich. - - - inline the fast case of instanceof - https://bugs.webkit.org/show_bug.cgi?id=20818 - - ~2% speedup on EarleyBoyer test. - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - * VM/Machine.cpp: - (JSC::Machine::cti_op_instanceof): - -2008-09-23 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Cameron Zwarich. - - - add forgotten slow case logic for !== - - * VM/CTI.cpp: - (JSC::CTI::privateCompileSlowCases): - -2008-09-23 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Cameron Zwarich. - - - inline the fast cases of !==, same as for === - - 2.9% speedup on EarleyBoyer benchmark - - * VM/CTI.cpp: - (JSC::CTI::compileOpStrictEq): Factored stricteq codegen into this function, - and parameterized so it can do the reverse version as well. - (JSC::CTI::privateCompileMainPass): Use the above for stricteq and nstricteq. - * VM/CTI.h: - (JSC::CTI::): Declare above stuff. - * VM/Machine.cpp: - (JSC::Machine::cti_op_nstricteq): Removed fast cases, now handled inline. + * wtf/HashCountedSet.h: -2008-09-23 Cameron Zwarich <cwzwarich@uwaterloo.ca> +2009-06-19 Adam Treat <adam.treat@torchmobile.com> Reviewed by Oliver Hunt. - Bug 20989: Aguments constructor should put 'callee' and 'length' properties in a more efficient way - <https://bugs.webkit.org/show_bug.cgi?id=20989> - - Make special cases for the 'callee' and 'length' properties in the - Arguments object. - - This is somewhere between a 7.8% speedup and a 10% speedup on the V8 - Raytrace benchmark, depending on whether it is run alone or with the - other V8 benchmarks. - - * kjs/Arguments.cpp: - (JSC::ArgumentsData::ArgumentsData): - (JSC::Arguments::Arguments): - (JSC::Arguments::mark): - (JSC::Arguments::getOwnPropertySlot): - (JSC::Arguments::put): - (JSC::Arguments::deleteProperty): - -2008-09-23 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Darin. - - - speed up instanceof some more - https://bugs.webkit.org/show_bug.cgi?id=20818 - - ~2% speedup on EarleyBoyer - - The idea here is to record in the StructureID whether the class - needs a special hasInstance or if it can use the normal logic from - JSObject. - - Based on this I inlined the real work directly into - cti_op_instanceof and put the fastest checks up front and the - error handling at the end (so it should be fairly straightforward - to split off the beginning to be inlined if desired). - - I only did this for CTI, not the bytecode interpreter. - - * API/JSCallbackObject.h: - (JSC::JSCallbackObject::createStructureID): - * ChangeLog: - * VM/Machine.cpp: - (JSC::Machine::cti_op_instanceof): - * kjs/JSImmediate.h: - (JSC::JSImmediate::isAnyImmediate): - * kjs/TypeInfo.h: - (JSC::TypeInfo::overridesHasInstance): - (JSC::TypeInfo::flags): - -2008-09-22 Darin Adler <darin@apple.com> - - Reviewed by Sam Weinig. - - - https://bugs.webkit.org/show_bug.cgi?id=21019 - make FunctionBodyNode::ref/deref fast - - Speeds up v8-raytrace by 7.2%. - - * kjs/nodes.cpp: - (JSC::FunctionBodyNode::FunctionBodyNode): Initialize m_refCount to 0. - * kjs/nodes.h: - (JSC::FunctionBodyNode::ref): Call base class ref once, and thereafter use - m_refCount. - (JSC::FunctionBodyNode::deref): Ditto, but the deref side. - -2008-09-22 Darin Adler <darin@apple.com> - - Pointed out by Sam Weinig. - - * kjs/Arguments.cpp: - (JSC::Arguments::fillArgList): Fix bad copy and paste. Oops! - -2008-09-22 Darin Adler <darin@apple.com> - - Reviewed by Cameron Zwarich. - - - https://bugs.webkit.org/show_bug.cgi?id=20983 - ArgumentsData should have some room to allocate some extra arguments inline - - Speeds up v8-raytrace by 5%. - - * kjs/Arguments.cpp: - (JSC::ArgumentsData::ArgumentsData): Use a fixed buffer if there are 4 or fewer - extra arguments. - (JSC::Arguments::Arguments): Use a fixed buffer if there are 4 or fewer - extra arguments. - (JSC::Arguments::~Arguments): Delete the buffer if necessary. - (JSC::Arguments::mark): Update since extraArguments are now Register. - (JSC::Arguments::fillArgList): Added special case for the only case that's - actually used in the practice, when there are no parameters. There are some - other special cases in there too, but that's the only one that matters. - (JSC::Arguments::getOwnPropertySlot): Updated to use setValueSlot since there's - no operation to get you at the JSValue* inside a Register as a "slot". - -2008-09-22 Sam Weinig <sam@webkit.org> - - Reviewed by Maciej Stachowiak. - - Patch for https://bugs.webkit.org/show_bug.cgi?id=21014 - Speed up for..in by using StructureID to avoid calls to hasProperty - - Speeds up fasta by 8%. - - * VM/JSPropertyNameIterator.cpp: - (JSC::JSPropertyNameIterator::invalidate): - * VM/JSPropertyNameIterator.h: - (JSC::JSPropertyNameIterator::next): - * kjs/PropertyNameArray.h: - (JSC::PropertyNameArrayData::begin): - (JSC::PropertyNameArrayData::end): - (JSC::PropertyNameArrayData::setCachedStructureID): - (JSC::PropertyNameArrayData::cachedStructureID): - * kjs/StructureID.cpp: - (JSC::StructureID::getEnumerablePropertyNames): - (JSC::structureIDChainsAreEqual): - * kjs/StructureID.h: - -2008-09-22 Kelvin Sherlock <ksherlock@gmail.com> - - Updated and tweaked by Sam Weinig. - - Reviewed by Geoffrey Garen. - - Bug 20020: Proposed enhancement to JavaScriptCore API - <https://bugs.webkit.org/show_bug.cgi?id=20020> - - Add JSObjectMakeArray, JSObjectMakeDate, JSObjectMakeError, and JSObjectMakeRegExp - functions to create JavaScript Array, Date, Error, and RegExp objects, respectively. - - * API/JSObjectRef.cpp: The functions - * API/JSObjectRef.h: Function prototype and documentation - * JavaScriptCore.exp: Added functions to exported function list - * API/tests/testapi.c: Added basic functionality tests. - - * kjs/DateConstructor.cpp: - Replaced static JSObject* constructDate(ExecState* exec, JSObject*, const ArgList& args) - with JSObject* constructDate(ExecState* exec, const ArgList& args). - Added static JSObject* constructWithDateConstructor(ExecState* exec, JSObject*, const ArgList& args) function - - * kjs/DateConstructor.h: - added prototype for JSObject* constructDate(ExecState* exec, const ArgList& args) - - * kjs/ErrorConstructor.cpp: - removed static qualifier from ErrorInstance* constructError(ExecState* exec, const ArgList& args) - - * kjs/ErrorConstructor.h: - added prototype for ErrorInstance* constructError(ExecState* exec, const ArgList& args) - - * kjs/RegExpConstructor.cpp: - removed static qualifier from JSObject* constructRegExp(ExecState* exec, const ArgList& args) - - * kjs/RegExpConstructor.h: - added prototype for JSObject* constructRegExp(ExecState* exec, const ArgList& args) - -2008-09-22 Matt Lilek <webkit@mattlilek.com> - - Not reviewed, Windows build fix. - - * kjs/Arguments.cpp: - * kjs/FunctionPrototype.cpp: - -2008-09-22 Sam Weinig <sam@webkit.org> - - Reviewed by Darin Adler. - - Patch for https://bugs.webkit.org/show_bug.cgi?id=20982 - Speed up the apply method of functions by special-casing array and 'arguments' objects - - 1% speedup on v8-raytrace. - - Test: fast/js/function-apply.html - - * kjs/Arguments.cpp: - (JSC::Arguments::fillArgList): - * kjs/Arguments.h: - * kjs/FunctionPrototype.cpp: - (JSC::functionProtoFuncApply): - * kjs/JSArray.cpp: - (JSC::JSArray::fillArgList): - * kjs/JSArray.h: - -2008-09-22 Darin Adler <darin@apple.com> - - Reviewed by Sam Weinig. - - - https://bugs.webkit.org/show_bug.cgi?id=20993 - Array.push/pop need optimized cases for JSArray - - 3% or so speedup on DeltaBlue benchmark. - - * kjs/ArrayPrototype.cpp: - (JSC::arrayProtoFuncPop): Call JSArray::pop when appropriate. - (JSC::arrayProtoFuncPush): Call JSArray::push when appropriate. - - * kjs/JSArray.cpp: - (JSC::JSArray::putSlowCase): Set m_fastAccessCutoff when appropriate, getting - us into the fast code path. - (JSC::JSArray::pop): Added. - (JSC::JSArray::push): Added. - * kjs/JSArray.h: Added push and pop. - - * kjs/operations.cpp: - (JSC::throwOutOfMemoryError): Don't inline this. Helps us avoid PIC branches. - -2008-09-22 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Cameron Zwarich. - - - speed up instanceof operator by replacing implementsHasInstance method with a TypeInfo flag - - Partial work towards <https://bugs.webkit.org/show_bug.cgi?id=20818> - - 2.2% speedup on EarleyBoyer benchmark. - - * API/JSCallbackConstructor.cpp: - * API/JSCallbackConstructor.h: - (JSC::JSCallbackConstructor::createStructureID): - * API/JSCallbackFunction.cpp: - * API/JSCallbackFunction.h: - (JSC::JSCallbackFunction::createStructureID): - * API/JSCallbackObject.h: - (JSC::JSCallbackObject::createStructureID): - * API/JSCallbackObjectFunctions.h: - (JSC::::hasInstance): - * API/JSValueRef.cpp: - (JSValueIsInstanceOfConstructor): - * JavaScriptCore.exp: - * VM/Machine.cpp: - (JSC::Machine::privateExecute): - (JSC::Machine::cti_op_instanceof): - * kjs/InternalFunction.cpp: - * kjs/InternalFunction.h: - (JSC::InternalFunction::createStructureID): - * kjs/JSObject.cpp: - * kjs/JSObject.h: - * kjs/TypeInfo.h: - (JSC::TypeInfo::implementsHasInstance): - -2008-09-22 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Dave Hyatt. - - Based on initial work by Darin Adler. - - - replace masqueradesAsUndefined virtual method with a flag in TypeInfo - - use this to JIT inline code for eq_null and neq_null - https://bugs.webkit.org/show_bug.cgi?id=20823 - - 0.5% speedup on SunSpider - ~4% speedup on Richards benchmark - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): - * VM/Machine.cpp: - (JSC::jsTypeStringForValue): - (JSC::jsIsObjectType): - (JSC::Machine::privateExecute): - (JSC::Machine::cti_op_is_undefined): - * VM/Machine.h: - * kjs/JSCell.h: - * kjs/JSValue.h: - * kjs/StringObjectThatMasqueradesAsUndefined.h: - (JSC::StringObjectThatMasqueradesAsUndefined::create): - (JSC::StringObjectThatMasqueradesAsUndefined::createStructureID): - * kjs/StructureID.h: - (JSC::StructureID::mutableTypeInfo): - * kjs/TypeInfo.h: - (JSC::TypeInfo::TypeInfo): - (JSC::TypeInfo::masqueradesAsUndefined): - * kjs/operations.cpp: - (JSC::equal): - * masm/X86Assembler.h: - (JSC::X86Assembler::): - (JSC::X86Assembler::setne_r): - (JSC::X86Assembler::setnz_r): - (JSC::X86Assembler::testl_i32m): - -2008-09-22 Tor Arne Vestbø <tavestbo@trolltech.com> - - Reviewed by Simon. - - Initialize QCoreApplication in kjs binary/Shell.cpp - - This allows us to use QCoreApplication::instance() to - get the main thread in ThreadingQt.cpp - - * kjs/Shell.cpp: - (main): - * wtf/ThreadingQt.cpp: - (WTF::initializeThreading): - -2008-09-21 Darin Adler <darin@apple.com> - - - blind attempt to fix non-all-in-one builds - - * kjs/JSGlobalObject.cpp: Added includes of Arguments.h and RegExpObject.h. - -2008-09-21 Darin Adler <darin@apple.com> - - - fix debug build - - * kjs/StructureID.cpp: - (JSC::StructureID::addPropertyTransition): Use typeInfo().type() instead of m_type. - (JSC::StructureID::createCachedPrototypeChain): Ditto. - -2008-09-21 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Darin Adler. - - - introduce a TypeInfo class, for holding per-type (in the C++ class sense) date in StructureID - https://bugs.webkit.org/show_bug.cgi?id=20981 - - * JavaScriptCore.exp: - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompilePutByIdTransition): - * VM/Machine.cpp: - (JSC::jsIsObjectType): - (JSC::Machine::Machine): - * kjs/AllInOneFile.cpp: - * kjs/JSCell.h: - (JSC::JSCell::isObject): - (JSC::JSCell::isString): - * kjs/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): - * kjs/JSGlobalObject.cpp: - (JSC::JSGlobalObject::reset): - * kjs/JSGlobalObject.h: - (JSC::StructureID::prototypeForLookup): - * kjs/JSNumberCell.h: - (JSC::JSNumberCell::createStructureID): - * kjs/JSObject.cpp: - (JSC::JSObject::createInheritorID): - * kjs/JSObject.h: - (JSC::JSObject::createStructureID): - * kjs/JSString.h: - (JSC::JSString::createStructureID): - * kjs/NativeErrorConstructor.cpp: - (JSC::NativeErrorConstructor::NativeErrorConstructor): - * kjs/RegExpConstructor.cpp: - * kjs/RegExpMatchesArray.h: Added. - (JSC::RegExpMatchesArray::getOwnPropertySlot): - (JSC::RegExpMatchesArray::put): - (JSC::RegExpMatchesArray::deleteProperty): - (JSC::RegExpMatchesArray::getPropertyNames): - * kjs/StructureID.cpp: - (JSC::StructureID::StructureID): - (JSC::StructureID::addPropertyTransition): - (JSC::StructureID::toDictionaryTransition): - (JSC::StructureID::changePrototypeTransition): - (JSC::StructureID::getterSetterTransition): - * kjs/StructureID.h: - (JSC::StructureID::create): - (JSC::StructureID::typeInfo): - * kjs/TypeInfo.h: Added. - (JSC::TypeInfo::TypeInfo): - (JSC::TypeInfo::type): - -2008-09-21 Darin Adler <darin@apple.com> - - Reviewed by Cameron Zwarich. - - - fix crash logging into Gmail due to recent Arguments change - - * kjs/Arguments.cpp: - (JSC::Arguments::Arguments): Fix window where mark() function could - see d->extraArguments with uninitialized contents. - (JSC::Arguments::mark): Check d->extraArguments for 0 to handle two - cases: 1) Inside the constructor before it's initialized. - 2) numArguments <= numParameters. - -2008-09-21 Darin Adler <darin@apple.com> - - - fix loose end from the "duplicate constant values" patch - - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::emitLoad): Add a special case for values the - hash table can't handle. - -2008-09-21 Mark Rowe <mrowe@apple.com> - - Fix the non-AllInOneFile build. - - * kjs/Arguments.cpp: Add missing #include. - -2008-09-21 Darin Adler <darin@apple.com> - - Reviewed by Cameron Zwarich and Mark Rowe. - - - fix test failure caused by my recent IndexToNameMap patch - - * kjs/Arguments.cpp: - (JSC::Arguments::deleteProperty): Added the accidentally-omitted - check of the boolean result from toArrayIndex. - -2008-09-21 Darin Adler <darin@apple.com> - - Reviewed by Maciej Stachowiak. - - - https://bugs.webkit.org/show_bug.cgi?id=20975 - inline immediate-number case of == - - * VM/CTI.h: Renamed emitJumpSlowCaseIfNotImm to - emitJumpSlowCaseIfNotImmNum, since the old name was incorrect. - - * VM/CTI.cpp: Updated for new name. - (JSC::CTI::privateCompileMainPass): Added op_eq. - (JSC::CTI::privateCompileSlowCases): Added op_eq. - - * VM/Machine.cpp: - (JSC::Machine::cti_op_eq): Removed fast case, since it's now - compiled. - -2008-09-21 Peter Gal <galpter@inf.u-szeged.hu> - - Reviewed by Tim Hatcher and Eric Seidel. - - Fix the QT/Linux JavaScriptCore segmentation fault. - https://bugs.webkit.org/show_bug.cgi?id=20914 - - * wtf/ThreadingQt.cpp: - (WTF::initializeThreading): Use currentThread() if - platform is not a MAC (like in pre 36541 revisions) - -2008-09-21 Darin Adler <darin@apple.com> - - Reviewed by Sam Weinig. - - * kjs/debugger.h: Removed some unneeded includes and declarations. - -2008-09-21 Darin Adler <darin@apple.com> - - Reviewed by Sam Weinig. - - - https://bugs.webkit.org/show_bug.cgi?id=20972 - speed up Arguments further by eliminating the IndexToNameMap - - No change on SunSpider. 1.29x as fast on V8 Raytrace. - - * kjs/Arguments.cpp: Moved ArgumentsData in here. Eliminated the - indexToNameMap and hadDeletes data members. Changed extraArguments into - an OwnArrayPtr and added deletedArguments, another OwnArrayPtr. - Replaced numExtraArguments with numParameters, since that's what's - used more directly in hot code paths. - (JSC::Arguments::Arguments): Pass in argument count instead of ArgList. - Initialize ArgumentsData the new way. - (JSC::Arguments::mark): Updated. - (JSC::Arguments::getOwnPropertySlot): Overload for the integer form so - we don't have to convert integers to identifiers just to get an argument. - Integrated the deleted case with the fast case. - (JSC::Arguments::put): Ditto. - (JSC::Arguments::deleteProperty): Ditto. - - * kjs/Arguments.h: Minimized includes. Made everything private. Added - overloads for the integral property name case. Eliminated mappedIndexSetter. - Moved ArgumentsData into the .cpp file. - - * kjs/IndexToNameMap.cpp: Emptied out and prepared for deletion. - * kjs/IndexToNameMap.h: Ditto. - - * kjs/JSActivation.cpp: - (JSC::JSActivation::createArgumentsObject): Elminated ArgList. - - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * kjs/AllInOneFile.cpp: - Removed IndexToNameMap. - -2008-09-21 Darin Adler <darin@apple.com> + https://bugs.webkit.org/show_bug.cgi?id=26540 + Modify the test shell to add a new function 'checkSyntax' that will + only parse the source instead of executing it. In this way we can test + pure parsing performance against some of the larger scripts in the wild. - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::emitLoad): One more tweak: Wrote this in a slightly - clearer style. - -2008-09-21 Judit Jasz <jasy@inf.u-szeged.hu> - - Reviewed and tweaked by Darin Adler. - - - https://bugs.webkit.org/show_bug.cgi?id=20645 - Elminate duplicate constant values in CodeBlocks. - - Seems to be a wash on SunSpider. - - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::emitLoad): Use m_numberMap and m_stringMap to guarantee - we emit the same JSValue* for identical numbers and strings. - * VM/CodeGenerator.h: Added overload of emitLoad for const Identifier&. - Add NumberMap and IdentifierStringMap types and m_numberMap and m_stringMap. - * kjs/nodes.cpp: - (JSC::StringNode::emitCode): Call the new emitLoad and let it do the - JSString creation. - -2008-09-21 Paul Pedriana <webkit@pedriana.com> - - Reviewed and tweaked by Darin Adler. - - - https://bugs.webkit.org/show_bug.cgi?id=16925 - Fixed lack of Vector buffer alignment for both GCC and MSVC. - Since there's no portable way to do this, for now we don't support - other compilers. - - * wtf/Vector.h: Added WTF_ALIGH_ON, WTF_ALIGNED, AlignedBufferChar, and AlignedBuffer. - Use AlignedBuffer insteadof an array of char in VectorBuffer. - -2008-09-21 Gabor Loki <loki@inf.u-szeged.hu> - - Reviewed by Darin Adler. - - - https://bugs.webkit.org/show_bug.cgi?id=19408 - Add lightweight constant folding to the parser for *, /, + (only for numbers), <<, >>, ~ operators. - - 1.008x as fast on SunSpider. - - * kjs/grammar.y: - (makeNegateNode): Fold if expression is a number > 0. - (makeBitwiseNotNode): Fold if expression is a number. - (makeMultNode): Fold if expressions are both numbers. - (makeDivNode): Fold if expressions are both numbers. - (makeAddNode): Fold if expressions are both numbers. - (makeLeftShiftNode): Fold if expressions are both numbers. - (makeRightShiftNode): Fold if expressions are both numbers. - -2008-09-21 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Oliver. - - - speed up === operator by generating inline machine code for the fast paths - https://bugs.webkit.org/show_bug.cgi?id=20820 - - * VM/CTI.cpp: - (JSC::CTI::emitJumpSlowCaseIfNotImmediateNumber): - (JSC::CTI::emitJumpSlowCaseIfNotImmediateNumbers): - (JSC::CTI::emitJumpSlowCaseIfNotImmediates): - (JSC::CTI::emitTagAsBoolImmediate): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - * VM/CTI.h: - * VM/Machine.cpp: - (JSC::Machine::cti_op_stricteq): - * masm/X86Assembler.h: - (JSC::X86Assembler::): - (JSC::X86Assembler::sete_r): - (JSC::X86Assembler::setz_r): - (JSC::X86Assembler::movzbl_rr): - (JSC::X86Assembler::emitUnlinkedJnz): - -2008-09-21 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Maciej Stachowiak. - - Free memory allocated for extra arguments in the destructor of the - Arguments object. - - * kjs/Arguments.cpp: - (JSC::Arguments::~Arguments): - * kjs/Arguments.h: - -2008-09-21 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Maciej Stachowiak. - - Bug 20815: 'arguments' object creation is non-optimal - <https://bugs.webkit.org/show_bug.cgi?id=20815> - - Fix our inefficient way of creating the arguments object by only - creating named properties for each of the arguments after a use of the - 'delete' statement. This patch also speeds up access to the 'arguments' - object slightly, but it still does not use the array fast path for - indexed access that exists for many opcodes. - - This is about a 20% improvement on the V8 Raytrace benchmark, and a 1.5% - improvement on the Earley-Boyer benchmark, which gives a 4% improvement - overall. - - * kjs/Arguments.cpp: - (JSC::Arguments::Arguments): - (JSC::Arguments::mark): - (JSC::Arguments::getOwnPropertySlot): - (JSC::Arguments::put): - (JSC::Arguments::deleteProperty): - * kjs/Arguments.h: - (JSC::Arguments::ArgumentsData::ArgumentsData): - * kjs/IndexToNameMap.h: - (JSC::IndexToNameMap::size): - * kjs/JSActivation.cpp: - (JSC::JSActivation::createArgumentsObject): - * kjs/JSActivation.h: - (JSC::JSActivation::uncheckedSymbolTableGet): - (JSC::JSActivation::uncheckedSymbolTableGetValue): - (JSC::JSActivation::uncheckedSymbolTablePut): - * kjs/JSFunction.h: - (JSC::JSFunction::numParameters): - -2008-09-20 Darin Adler <darin@apple.com> - - Reviewed by Mark Rowe. - - - fix crash seen on buildbot - - * kjs/JSGlobalObject.cpp: - (JSC::JSGlobalObject::mark): Add back mark of arrayPrototype, - deleted by accident in my recent check-in. - -2008-09-20 Maciej Stachowiak <mjs@apple.com> - - Not reviewed, build fix. - - - speculative fix for non-AllInOne builds - - * kjs/operations.h: - -2008-09-20 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Darin Adler. - - - assorted optimizations to === and !== operators - (work towards <https://bugs.webkit.org/show_bug.cgi?id=20820>) - - 2.5% speedup on earley-boyer test - - * VM/Machine.cpp: - (JSC::Machine::cti_op_stricteq): Use inline version of - strictEqualSlowCase; remove unneeded exception check. - (JSC::Machine::cti_op_nstricteq): ditto - * kjs/operations.cpp: - (JSC::strictEqual): Use strictEqualSlowCaseInline - (JSC::strictEqualSlowCase): ditto - * kjs/operations.h: - (JSC::strictEqualSlowCaseInline): Version of strictEqualSlowCase that can be inlined, - since the extra function call indirection is a lose for CTI. - -2008-09-20 Darin Adler <darin@apple.com> - - Reviewed by Maciej Stachowiak. - - - finish https://bugs.webkit.org/show_bug.cgi?id=20858 - make each distinct C++ class get a distinct JSC::Structure - - This also includes some optimizations that make the change an overall - small speedup. Without those it was a bit of a slowdown. - - * API/JSCallbackConstructor.cpp: - (JSC::JSCallbackConstructor::JSCallbackConstructor): Take a structure. - * API/JSCallbackConstructor.h: Ditto. - * API/JSCallbackFunction.cpp: - (JSC::JSCallbackFunction::JSCallbackFunction): Pass a structure. - * API/JSCallbackObject.h: Take a structure. - * API/JSCallbackObjectFunctions.h: - (JSC::JSCallbackObject::JSCallbackObject): Ditto. - - * API/JSClassRef.cpp: - (OpaqueJSClass::prototype): Pass in a structure. Call setPrototype - if there's a custom prototype involved. - * API/JSObjectRef.cpp: - (JSObjectMake): Ditto. - (JSObjectMakeConstructor): Pass in a structure. - - * JavaScriptCore.exp: Updated. - - * VM/Machine.cpp: - (JSC::jsLess): Added a special case for when both arguments are strings. - This avoids converting both strings to with UString::toDouble. - (JSC::jsLessEq): Ditto. - (JSC::Machine::privateExecute): Pass in a structure. - (JSC::Machine::cti_op_construct_JSConstruct): Ditto. - (JSC::Machine::cti_op_new_regexp): Ditto. - (JSC::Machine::cti_op_is_string): Ditto. - * VM/Machine.h: Made isJSString public so it can be used in the CTI. - - * kjs/Arguments.cpp: - (JSC::Arguments::Arguments): Pass in a structure. - - * kjs/JSCell.h: Mark constructor explicit. - - * kjs/JSGlobalObject.cpp: - (JSC::markIfNeeded): Added an overload for marking structures. - (JSC::JSGlobalObject::reset): Eliminate code to set data members to - zero. We now do that in the constructor, and we no longer use this - anywhere except in the constructor. Added code to create structures. - Pass structures rather than prototypes when creating objects. - (JSC::JSGlobalObject::mark): Mark the structures. - - * kjs/JSGlobalObject.h: Removed unneeded class declarations. - Added initializers for raw pointers in JSGlobalObjectData so - everything starts with a 0. Added structure data and accessor - functions. - - * kjs/JSImmediate.cpp: - (JSC::JSImmediate::nonInlineNaN): Added. - * kjs/JSImmediate.h: - (JSC::JSImmediate::toDouble): Rewrote to avoid PIC branches. - - * kjs/JSNumberCell.cpp: - (JSC::jsNumberCell): Made non-inline to avoid PIC branches - in functions that call this one. - (JSC::jsNaN): Ditto. - * kjs/JSNumberCell.h: Ditto. - - * kjs/JSObject.h: Removed constructor that takes a prototype. - All callers now pass structures. - - * kjs/ArrayConstructor.cpp: - (JSC::ArrayConstructor::ArrayConstructor): - (JSC::constructArrayWithSizeQuirk): - * kjs/ArrayConstructor.h: - * kjs/ArrayPrototype.cpp: - (JSC::ArrayPrototype::ArrayPrototype): - * kjs/ArrayPrototype.h: - * kjs/BooleanConstructor.cpp: - (JSC::BooleanConstructor::BooleanConstructor): - (JSC::constructBoolean): - (JSC::constructBooleanFromImmediateBoolean): - * kjs/BooleanConstructor.h: - * kjs/BooleanObject.cpp: - (JSC::BooleanObject::BooleanObject): - * kjs/BooleanObject.h: - * kjs/BooleanPrototype.cpp: - (JSC::BooleanPrototype::BooleanPrototype): - * kjs/BooleanPrototype.h: - * kjs/DateConstructor.cpp: - (JSC::DateConstructor::DateConstructor): - (JSC::constructDate): - * kjs/DateConstructor.h: - * kjs/DateInstance.cpp: - (JSC::DateInstance::DateInstance): - * kjs/DateInstance.h: - * kjs/DatePrototype.cpp: - (JSC::DatePrototype::DatePrototype): - * kjs/DatePrototype.h: - * kjs/ErrorConstructor.cpp: - (JSC::ErrorConstructor::ErrorConstructor): - (JSC::constructError): - * kjs/ErrorConstructor.h: - * kjs/ErrorInstance.cpp: - (JSC::ErrorInstance::ErrorInstance): - * kjs/ErrorInstance.h: - * kjs/ErrorPrototype.cpp: - (JSC::ErrorPrototype::ErrorPrototype): - * kjs/ErrorPrototype.h: - * kjs/FunctionConstructor.cpp: - (JSC::FunctionConstructor::FunctionConstructor): - * kjs/FunctionConstructor.h: - * kjs/FunctionPrototype.cpp: - (JSC::FunctionPrototype::FunctionPrototype): - (JSC::FunctionPrototype::addFunctionProperties): - * kjs/FunctionPrototype.h: - * kjs/GlobalEvalFunction.cpp: - (JSC::GlobalEvalFunction::GlobalEvalFunction): - * kjs/GlobalEvalFunction.h: - * kjs/InternalFunction.cpp: - (JSC::InternalFunction::InternalFunction): - * kjs/InternalFunction.h: - (JSC::InternalFunction::InternalFunction): - * kjs/JSArray.cpp: - (JSC::JSArray::JSArray): - (JSC::constructEmptyArray): - (JSC::constructArray): - * kjs/JSArray.h: - * kjs/JSFunction.cpp: - (JSC::JSFunction::JSFunction): - (JSC::JSFunction::construct): - * kjs/JSObject.cpp: - (JSC::constructEmptyObject): - * kjs/JSString.cpp: - (JSC::StringObject::create): - * kjs/JSWrapperObject.h: - * kjs/MathObject.cpp: - (JSC::MathObject::MathObject): - * kjs/MathObject.h: - * kjs/NativeErrorConstructor.cpp: - (JSC::NativeErrorConstructor::NativeErrorConstructor): - (JSC::NativeErrorConstructor::construct): - * kjs/NativeErrorConstructor.h: - * kjs/NativeErrorPrototype.cpp: - (JSC::NativeErrorPrototype::NativeErrorPrototype): - * kjs/NativeErrorPrototype.h: - * kjs/NumberConstructor.cpp: - (JSC::NumberConstructor::NumberConstructor): - (JSC::constructWithNumberConstructor): - * kjs/NumberConstructor.h: - * kjs/NumberObject.cpp: - (JSC::NumberObject::NumberObject): - (JSC::constructNumber): - (JSC::constructNumberFromImmediateNumber): - * kjs/NumberObject.h: - * kjs/NumberPrototype.cpp: - (JSC::NumberPrototype::NumberPrototype): - * kjs/NumberPrototype.h: - * kjs/ObjectConstructor.cpp: - (JSC::ObjectConstructor::ObjectConstructor): - (JSC::constructObject): - * kjs/ObjectConstructor.h: - * kjs/ObjectPrototype.cpp: - (JSC::ObjectPrototype::ObjectPrototype): - * kjs/ObjectPrototype.h: - * kjs/PrototypeFunction.cpp: - (JSC::PrototypeFunction::PrototypeFunction): - * kjs/PrototypeFunction.h: - * kjs/RegExpConstructor.cpp: - (JSC::RegExpConstructor::RegExpConstructor): - (JSC::RegExpMatchesArray::RegExpMatchesArray): - (JSC::constructRegExp): - * kjs/RegExpConstructor.h: - * kjs/RegExpObject.cpp: - (JSC::RegExpObject::RegExpObject): - * kjs/RegExpObject.h: - * kjs/RegExpPrototype.cpp: - (JSC::RegExpPrototype::RegExpPrototype): - * kjs/RegExpPrototype.h: - * kjs/Shell.cpp: + * jsc.cpp: (GlobalObject::GlobalObject): - * kjs/StringConstructor.cpp: - (JSC::StringConstructor::StringConstructor): - (JSC::constructWithStringConstructor): - * kjs/StringConstructor.h: - * kjs/StringObject.cpp: - (JSC::StringObject::StringObject): - * kjs/StringObject.h: - * kjs/StringObjectThatMasqueradesAsUndefined.h: - (JSC::StringObjectThatMasqueradesAsUndefined::StringObjectThatMasqueradesAsUndefined): - * kjs/StringPrototype.cpp: - (JSC::StringPrototype::StringPrototype): - * kjs/StringPrototype.h: - Take and pass structures. - -2008-09-19 Alp Toker <alp@nuanti.com> - - Build fix for the 'gold' linker and recent binutils. New behaviour - requires that we link to used libraries explicitly. - - * GNUmakefile.am: - -2008-09-19 Sam Weinig <sam@webkit.org> - - Roll r36694 back in. It did not cause the crash. - - * JavaScriptCore.exp: - * VM/JSPropertyNameIterator.cpp: - (JSC::JSPropertyNameIterator::~JSPropertyNameIterator): - (JSC::JSPropertyNameIterator::invalidate): - * VM/JSPropertyNameIterator.h: - (JSC::JSPropertyNameIterator::JSPropertyNameIterator): - (JSC::JSPropertyNameIterator::create): - * kjs/JSObject.cpp: - (JSC::JSObject::getPropertyNames): - * kjs/PropertyMap.cpp: - (JSC::PropertyMap::getEnumerablePropertyNames): - * kjs/PropertyMap.h: - * kjs/PropertyNameArray.cpp: - (JSC::PropertyNameArray::add): - * kjs/PropertyNameArray.h: - (JSC::PropertyNameArrayData::create): - (JSC::PropertyNameArrayData::propertyNameVector): - (JSC::PropertyNameArrayData::setCachedPrototypeChain): - (JSC::PropertyNameArrayData::cachedPrototypeChain): - (JSC::PropertyNameArrayData::begin): - (JSC::PropertyNameArrayData::end): - (JSC::PropertyNameArrayData::PropertyNameArrayData): - (JSC::PropertyNameArray::PropertyNameArray): - (JSC::PropertyNameArray::addKnownUnique): - (JSC::PropertyNameArray::size): - (JSC::PropertyNameArray::operator[]): - (JSC::PropertyNameArray::begin): - (JSC::PropertyNameArray::end): - (JSC::PropertyNameArray::setData): - (JSC::PropertyNameArray::data): - (JSC::PropertyNameArray::releaseData): - * kjs/StructureID.cpp: - (JSC::structureIDChainsAreEqual): - (JSC::StructureID::getEnumerablePropertyNames): - (JSC::StructureID::clearEnumerationCache): - (JSC::StructureID::createCachedPrototypeChain): - * kjs/StructureID.h: - -2008-09-19 Sam Weinig <sam@webkit.org> - - Roll out r36694. - - * JavaScriptCore.exp: - * VM/JSPropertyNameIterator.cpp: - (JSC::JSPropertyNameIterator::~JSPropertyNameIterator): - (JSC::JSPropertyNameIterator::invalidate): - * VM/JSPropertyNameIterator.h: - (JSC::JSPropertyNameIterator::JSPropertyNameIterator): - (JSC::JSPropertyNameIterator::create): - * kjs/JSObject.cpp: - (JSC::JSObject::getPropertyNames): - * kjs/PropertyMap.cpp: - (JSC::PropertyMap::getEnumerablePropertyNames): - * kjs/PropertyMap.h: - * kjs/PropertyNameArray.cpp: - (JSC::PropertyNameArray::add): - * kjs/PropertyNameArray.h: - (JSC::PropertyNameArray::PropertyNameArray): - (JSC::PropertyNameArray::addKnownUnique): - (JSC::PropertyNameArray::begin): - (JSC::PropertyNameArray::end): - (JSC::PropertyNameArray::size): - (JSC::PropertyNameArray::operator[]): - (JSC::PropertyNameArray::releaseIdentifiers): - * kjs/StructureID.cpp: - (JSC::StructureID::getEnumerablePropertyNames): - * kjs/StructureID.h: - (JSC::StructureID::clearEnumerationCache): - -2008-09-19 Oliver Hunt <oliver@apple.com> - - Reviewed by Maciej Stachowiak. - - Improve peformance of local variable initialisation. - - Pull local and constant initialisation out of slideRegisterWindowForCall - and into its own opcode. This allows the JIT to generate the initialisation - code for a function directly into the instruction stream and so avoids a few - branches on function entry. - - Results a 1% progression in SunSpider, particularly in a number of the bitop - tests where the called functions are very fast. - - * VM/CTI.cpp: - (JSC::CTI::emitInitialiseRegister): - (JSC::CTI::privateCompileMainPass): - * VM/CTI.h: - * VM/CodeBlock.cpp: - (JSC::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::CodeGenerator): - * VM/Machine.cpp: - (JSC::slideRegisterWindowForCall): - (JSC::Machine::privateExecute): - * VM/Opcode.h: - -2008-09-19 Sam Weinig <sam@webkit.org> - - Reviewed by Darin Adler. - - Patch for https://bugs.webkit.org/show_bug.cgi?id=20928 - Speed up JS property enumeration by caching entire PropertyNameArray - - 1.3% speedup on Sunspider, 30% on string-fasta. - - * JavaScriptCore.exp: - * VM/JSPropertyNameIterator.cpp: - (JSC::JSPropertyNameIterator::~JSPropertyNameIterator): - (JSC::JSPropertyNameIterator::invalidate): - * VM/JSPropertyNameIterator.h: - (JSC::JSPropertyNameIterator::JSPropertyNameIterator): - (JSC::JSPropertyNameIterator::create): - * kjs/JSObject.cpp: - (JSC::JSObject::getPropertyNames): - * kjs/PropertyMap.cpp: - (JSC::PropertyMap::getEnumerablePropertyNames): - * kjs/PropertyMap.h: - * kjs/PropertyNameArray.cpp: - (JSC::PropertyNameArray::add): - * kjs/PropertyNameArray.h: - (JSC::PropertyNameArrayData::create): - (JSC::PropertyNameArrayData::propertyNameVector): - (JSC::PropertyNameArrayData::setCachedPrototypeChain): - (JSC::PropertyNameArrayData::cachedPrototypeChain): - (JSC::PropertyNameArrayData::begin): - (JSC::PropertyNameArrayData::end): - (JSC::PropertyNameArrayData::PropertyNameArrayData): - (JSC::PropertyNameArray::PropertyNameArray): - (JSC::PropertyNameArray::addKnownUnique): - (JSC::PropertyNameArray::size): - (JSC::PropertyNameArray::operator[]): - (JSC::PropertyNameArray::begin): - (JSC::PropertyNameArray::end): - (JSC::PropertyNameArray::setData): - (JSC::PropertyNameArray::data): - (JSC::PropertyNameArray::releaseData): - * kjs/ScopeChain.cpp: - (JSC::ScopeChainNode::print): - * kjs/StructureID.cpp: - (JSC::structureIDChainsAreEqual): - (JSC::StructureID::getEnumerablePropertyNames): - (JSC::StructureID::clearEnumerationCache): - (JSC::StructureID::createCachedPrototypeChain): - * kjs/StructureID.h: - -2008-09-19 Holger Hans Peter Freyther <zecke@selfish.org> - - Reviewed by Maciej Stachowiak. - - Fix a mismatched new[]/delete in JSObject::allocatePropertyStorage - - * kjs/JSObject.cpp: - (JSC::JSObject::allocatePropertyStorage): Spotted by valgrind. - -2008-09-19 Darin Adler <darin@apple.com> - - Reviewed by Sam Weinig. - - - part 2 of https://bugs.webkit.org/show_bug.cgi?id=20858 - make each distinct C++ class get a distinct JSC::Structure + (functionCheckSyntax): - * JavaScriptCore.exp: Exported constructEmptyObject for use in WebCore. +2009-06-19 Zoltan Horvath <hzoltan@inf.u-szeged.hu> - * kjs/JSGlobalObject.h: Changed the protected constructor to take a - structure instead of a prototype. - - * kjs/JSVariableObject.h: Removed constructor that takes a prototype. - -2008-09-19 Julien Chaffraix <jchaffraix@pleyo.com> - - Reviewed by Alexey Proskuryakov. - - Use the template hoisting technique on the RefCounted class. This reduces the code bloat due to - non-template methods' code been copied for each instance of the template. - The patch splits RefCounted between a base class that holds non-template methods and attributes - and the template RefCounted class that keeps the same functionnality. - - On my Linux with gcc 4.3 for the Gtk port, this is: - - a ~600KB save on libwebkit.so in release. - - a ~1.6MB save on libwebkit.so in debug. - - It is a wash on Sunspider and a small win on Dromaeo (not sure it is relevant). - On the whole, it should be a small win as we reduce the compiled code size and the only - new function call should be inlined by the compiler. - - * wtf/RefCounted.h: - (WTF::RefCountedBase::ref): Copied from RefCounted. - (WTF::RefCountedBase::hasOneRef): Ditto. - (WTF::RefCountedBase::refCount): Ditto. - (WTF::RefCountedBase::RefCountedBase): Ditto. - (WTF::RefCountedBase::~RefCountedBase): Ditto. - (WTF::RefCountedBase::derefBase): Tweaked from the RefCounted version to remove - template section. - (WTF::RefCounted::RefCounted): - (WTF::RefCounted::deref): Small wrapper around RefCountedBase::derefBase(). - (WTF::RefCounted::~RefCounted): Keep private destructor. - -2008-09-18 Darin Adler <darin@apple.com> - - Reviewed by Maciej Stachowiak. - - - part 1 of https://bugs.webkit.org/show_bug.cgi?id=20858 - make each distinct C++ class get a distinct JSC::Structure - - * kjs/lookup.h: Removed things here that were used only in WebCore: - cacheGlobalObject, JSC_DEFINE_PROTOTYPE, JSC_DEFINE_PROTOTYPE_WITH_PROTOTYPE, - and JSC_IMPLEMENT_PROTOTYPE. - -2008-09-18 Darin Adler <darin@apple.com> - - Reviewed by Maciej Stachowiak. - - - https://bugs.webkit.org/show_bug.cgi?id=20927 - simplify/streamline the code to turn strings into identifiers while parsing - - * kjs/grammar.y: Get rid of string from the union, and use ident for STRING as - well as for IDENT. - - * kjs/lexer.cpp: - (JSC::Lexer::lex): Use makeIdentifier instead of makeUString for String. - * kjs/lexer.h: Remove makeUString. - - * kjs/nodes.h: Changed StringNode to hold an Identifier instead of UString. - - * VM/CodeGenerator.cpp: - (JSC::keyForCharacterSwitch): Updated since StringNode now holds an Identifier. - (JSC::prepareJumpTableForStringSwitch): Ditto. - * kjs/nodes.cpp: - (JSC::StringNode::emitCode): Ditto. The comment from here is now in the lexer. - (JSC::processClauseList): Ditto. - * kjs/nodes2string.cpp: - (JSC::StringNode::streamTo): Ditto. - -2008-09-18 Sam Weinig <sam@webkit.org> - - Fix style. - - * VM/Instruction.h: - (JSC::Instruction::Instruction): - -2008-09-18 Oliver Hunt <oliver@apple.com> - - Reviewed by Maciej Stachowiak. - - Bug 20911: REGRESSION(r36480?): Reproducible assertion failure below derefStructureIDs 64-bit JavaScriptCore - <https://bugs.webkit.org/show_bug.cgi?id=20911> - - The problem was simply caused by the int constructor for Instruction - failing to initialise the full struct in 64bit builds. - - * VM/Instruction.h: - (JSC::Instruction::Instruction): - -2008-09-18 Darin Adler <darin@apple.com> - - - fix release build - - * wtf/RefCountedLeakCounter.cpp: Removed stray "static". - -2008-09-18 Darin Adler <darin@apple.com> - - Reviewed by Sam Weinig. - - * kjs/JSGlobalObject.h: Tiny style guideline tweak. - -2008-09-18 Darin Adler <darin@apple.com> - - Reviewed by Sam Weinig. - - - fix https://bugs.webkit.org/show_bug.cgi?id=20925 - LEAK messages appear every time I quit - - * JavaScriptCore.exp: Updated, and also added an export - needed for future WebCore use of JSC::StructureID. - - * wtf/RefCountedLeakCounter.cpp: - (WTF::RefCountedLeakCounter::suppressMessages): Added. - (WTF::RefCountedLeakCounter::cancelMessageSuppression): Added. - (WTF::RefCountedLeakCounter::RefCountedLeakCounter): Tweaked a bit. - (WTF::RefCountedLeakCounter::~RefCountedLeakCounter): Added code to - log the reason there was no leak checking done. - (WTF::RefCountedLeakCounter::increment): Tweaked a bit. - (WTF::RefCountedLeakCounter::decrement): Ditto. - - * wtf/RefCountedLeakCounter.h: Replaced setLogLeakMessages with two - new functions, suppressMessages and cancelMessageSuppression. Also - added m_ prefixes to the data member names. - -2008-09-18 Holger Hans Peter Freyther <zecke@selfish.org> - - Reviewed by Mark Rowe. - - https://bugs.webkit.org/show_bug.cgi?id=20437 - - Add a proper #define to define which XML Parser implementation to use. Client - code can use #if USE(QXMLSTREAM) to decide if the Qt XML StreamReader - implementation is going to be used. - - * wtf/Platform.h: - -2008-09-18 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Maciej Stachowiak. - - Make a Unicode non-breaking space count as a whitespace character in - PCRE. This change was already made in WREC, and it fixes one of the - Mozilla JS tests. Since it is now fixed in PCRE as well, we can check - in a new set of expected test results. - - * pcre/pcre_internal.h: - (isSpaceChar): - * tests/mozilla/expected.html: - -2008-09-18 Stephanie Lewis <slewis@apple.com> - - Reviewed by Mark Rowe and Maciej Stachowiak. - - add an option use arch to specify which architecture to run. - - * tests/mozilla/jsDriver.pl: - -2008-09-17 Oliver Hunt <oliver@apple.com> - - Correctly restore argument reference prior to SFX runtime calls. - - Reviewed by Steve Falkenburg. - - * VM/CTI.cpp: - (JSC::CTI::privateCompileSlowCases): - (JSC::CTI::privateCompile): - -2008-09-17 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Maciej Stachowiak. - - Bug 20876: REGRESSION (r36417, r36427): fast/js/exception-expression-offset.html fails - <https://bugs.webkit.org/show_bug.cgi?id=20876> - - r36417 and r36427 caused an get_by_id opcode to be emitted before the - instanceof and construct opcodes, in order to enable inline caching of - the prototype property. Unfortunately, this regressed some tests dealing - with exceptions thrown by 'instanceof' and the 'new' operator. We fix - these problems by detecting whether an "is not an object" exception is - thrown before op_instanceof or op_construct, and emit the proper - exception in those cases. - - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::emitConstruct): - * VM/CodeGenerator.h: - * VM/ExceptionHelpers.cpp: - (JSC::createInvalidParamError): - (JSC::createNotAConstructorError): - (JSC::createNotAnObjectError): - * VM/ExceptionHelpers.h: - * VM/Machine.cpp: - (JSC::Machine::getOpcode): - (JSC::Machine::privateExecute): - * VM/Machine.h: - * kjs/nodes.cpp: - (JSC::NewExprNode::emitCode): - (JSC::InstanceOfNode::emitCode): - -2008-09-17 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - JIT generation cti_op_construct_verify. - - Quarter to half percent progression on v8-tests. - Roughly not change on SunSpider (possible minor progression). - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): - * VM/Machine.cpp: - * VM/Machine.h: - -2008-09-15 Steve Falkenburg <sfalken@apple.com> - - Improve timer accuracy for JavaScript Date object on Windows. - - Use a combination of ftime and QueryPerformanceCounter. - ftime returns the information we want, but doesn't have sufficient resolution. - QueryPerformanceCounter has high resolution, but is only usable to measure time intervals. - To combine them, we call ftime and QueryPerformanceCounter initially. Later calls will use - QueryPerformanceCounter by itself, adding the delta to the saved ftime. We re-sync to - correct for drift if the low-res and high-res elapsed time between calls differs by more - than twice the low-resolution timer resolution. - - QueryPerformanceCounter may be inaccurate due to a problems with: - - some PCI bridge chipsets (http://support.microsoft.com/kb/274323) - - BIOS bugs (http://support.microsoft.com/kb/895980/) - - BIOS/HAL bugs on multiprocessor/multicore systems (http://msdn.microsoft.com/en-us/library/ms644904.aspx) - Reviewed by Darin Adler. - - * kjs/DateMath.cpp: - (JSC::highResUpTime): - (JSC::lowResUTCTime): - (JSC::qpcAvailable): - (JSC::getCurrentUTCTimeWithMicroseconds): - -2008-09-17 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. - - Implement JIT generation of CallFrame initialization, for op_call. - - 1% sunspider 2.5% v8-tests. - - * VM/CTI.cpp: - (JSC::CTI::compileOpCall): - * VM/Machine.cpp: - (JSC::Machine::cti_op_call_JSFunction): - (JSC::Machine::cti_op_call_NotJSFunction): - -2008-09-17 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. - - Optimizations for op_call in CTI. Move check for (ctiCode == 0) into JIT code, - move copying of scopeChain for CodeBlocks that needFullScopeChain into head of - functions, instead of checking prior to making the call. - - 3% on v8-tests (4% on richards, 6% in delta-blue) - - * VM/CTI.cpp: - (JSC::CTI::compileOpCall): - (JSC::CTI::privateCompileSlowCases): - (JSC::CTI::privateCompile): - * VM/Machine.cpp: - (JSC::Machine::execute): - (JSC::Machine::cti_op_call_JSFunction): - (JSC::Machine::cti_vm_compile): - (JSC::Machine::cti_vm_updateScopeChain): - (JSC::Machine::cti_op_construct_JSConstruct): - * VM/Machine.h: - -2008-09-17 Tor Arne Vestbø <tavestbo@trolltech.com> - - Fix the QtWebKit/Mac build - - * wtf/ThreadingQt.cpp: - (WTF::initializeThreading): use QCoreApplication to get the main thread - -2008-09-16 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Maciej Stachowiak. - - Bug 20857: REGRESSION (r36427): ASSERTION FAILED: m_refCount >= 0 in RegisterID::deref() - <https://bugs.webkit.org/show_bug.cgi?id=20857> - - Fix a problem stemming from the slightly unsafe behaviour of the - CodeGenerator::finalDestination() method by putting the "func" argument - of the emitConstruct() method in a RefPtr in its caller. Also, add an - assertion guaranteeing that this is always the case. - - CodeGenerator::finalDestination() is still incorrect and can cause - problems with a different allocator; see bug 20340 for more details. - - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::emitConstruct): - * kjs/nodes.cpp: - (JSC::NewExprNode::emitCode): - -2008-09-16 Alice Liu <alice.liu@apple.com> - - build fix. - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): - -2008-09-16 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. - - CTI code generation for op_ret. The majority of the work - (updating variables on the stack & on exec) can be performed - directly in generated code. - - We still need to check, & to call out to C-code to handle - activation records, profiling, and full scope chains. - - +1.5% Sunspider, +5/6% v8 tests. - - * VM/CTI.cpp: - (JSC::CTI::emitPutCTIParam): - (JSC::CTI::compileOpCall): - (JSC::CTI::privateCompileMainPass): - * VM/CTI.h: - * VM/Machine.cpp: - (JSC::Machine::cti_op_ret_activation): - (JSC::Machine::cti_op_ret_profiler): - (JSC::Machine::cti_op_ret_scopeChain): - * VM/Machine.h: - -2008-09-16 Dimitri Glazkov <dglazkov@chromium.org> - - Fix the Windows build. - - Add some extra parentheses to stop MSVC from complaining so much. - - * VM/Machine.cpp: - (JSC::Machine::privateExecute): - (JSC::Machine::cti_op_stricteq): - (JSC::Machine::cti_op_nstricteq): - * kjs/operations.cpp: - (JSC::strictEqual): - -2008-09-15 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Cameron Zwarich. - - - speed up the === and !== operators by choosing the fast cases better - - No effect on SunSpider but speeds up the V8 EarlyBoyer benchmark about 4%. - - * VM/Machine.cpp: - (JSC::Machine::privateExecute): - (JSC::Machine::cti_op_stricteq): - (JSC::Machine::cti_op_nstricteq): - * kjs/JSImmediate.h: - (JSC::JSImmediate::areBothImmediate): - * kjs/operations.cpp: - (JSC::strictEqual): - (JSC::strictEqualSlowCase): - * kjs/operations.h: - -2008-09-15 Oliver Hunt <oliver@apple.com> - - RS=Sam Weinig. - - Coding style cleanup. - - * VM/Machine.cpp: - (JSC::Machine::privateExecute): - -2008-09-15 Oliver Hunt <oliver@apple.com> - - Reviewed by Cameron Zwarich. - - Bug 20874: op_resolve does not do any form of caching - <https://bugs.webkit.org/show_bug.cgi?id=20874> - - This patch adds an op_resolve_global opcode to handle (and cache) - property lookup we can statically determine must occur on the global - object (if at all). - - 3% progression on sunspider, 3.2x improvement to bitops-bitwise-and, and - 10% in math-partial-sums - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): - * VM/CTI.h: - * VM/CodeBlock.cpp: - (JSC::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::findScopedProperty): - (JSC::CodeGenerator::emitResolve): - * VM/Machine.cpp: - (JSC::resolveGlobal): - (JSC::Machine::privateExecute): - (JSC::Machine::cti_op_resolve_global): - * VM/Machine.h: - * VM/Opcode.h: - -2008-09-15 Sam Weinig <sam@webkit.org> - - Roll out r36462. It broke document.all. - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - * VM/CTI.h: - * VM/Machine.cpp: - (JSC::Machine::Machine): - (JSC::Machine::cti_op_eq_null): - (JSC::Machine::cti_op_neq_null): - * VM/Machine.h: - (JSC::Machine::isJSString): - * kjs/JSCell.h: - * kjs/JSWrapperObject.h: - * kjs/StringObject.h: - * kjs/StringObjectThatMasqueradesAsUndefined.h: - -2008-09-15 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Maciej Stachowiak. - - Bug 20863: ASSERTION FAILED: addressOffset < instructions.size() in CodeBlock::getHandlerForVPC - <https://bugs.webkit.org/show_bug.cgi?id=20863> - - r36427 changed the number of arguments to op_construct without changing - the argument index for the vPC in the call to initializeCallFrame() in - the CTI case. This caused a JSC test failure. Correcting the argument - index fixes the test failure. - - * VM/Machine.cpp: - (JSC::Machine::cti_op_construct_JSConstruct): - -2008-09-15 Mark Rowe <mrowe@apple.com> - - Fix GCC 4.2 build. - - * VM/CTI.h: - -2008-09-15 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Maciej Stachowiak. - - Fixed a typo in op_get_by_id_chain that caused it to miss every time - in the interpreter. - - Also, a little cleanup. - - * VM/Machine.cpp: - (JSC::Machine::privateExecute): Set up baseObject before entering the - loop, so we compare against the right values. - -2008-09-15 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Removed the CalledAsConstructor flag from the call frame header. Now, - we use an explicit opcode at the call site to fix up constructor results. - - SunSpider says 0.4% faster. - - cti_op_construct_verify is an out-of-line function call for now, but we - can fix that once StructureID holds type information like isObject. - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): Codegen for the new opcode. - - * VM/CodeBlock.cpp: - (JSC::CodeBlock::dump): - - * VM/CodeGenerator.cpp: Codegen for the new opcode. Also... - (JSC::CodeGenerator::emitCall): ... don't test for known non-zero value. - (JSC::CodeGenerator::emitConstruct): ... ditto. - - * VM/Machine.cpp: No more CalledAsConstructor - (JSC::Machine::privateExecute): Implementation for the new opcode. - (JSC::Machine::cti_op_ret): The speedup: no need to check whether we were - called as a constructor. - (JSC::Machine::cti_op_construct_verify): Implementation for the new opcode. - * VM/Machine.h: - - * VM/Opcode.h: Declare new opcode. - - * VM/RegisterFile.h: - (JSC::RegisterFile::): No more CalledAsConstructor - -2008-09-15 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. - - Inline code generation of eq_null/neq_null for CTI. Uses vptr checking for - StringObjectsThatAreMasqueradingAsBeingUndefined. In the long run, the - masquerading may be handled differently (through the StructureIDs - see bug - #20823). - - >1% on v8-tests. - - * VM/CTI.cpp: - (JSC::CTI::emitJumpSlowCaseIfIsJSCell): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - * VM/CTI.h: - * VM/Machine.cpp: - (JSC::Machine::Machine): - (JSC::Machine::cti_op_eq_null): - (JSC::Machine::cti_op_neq_null): - * VM/Machine.h: - (JSC::Machine::doesMasqueradesAsUndefined): - * kjs/JSWrapperObject.h: - (JSC::JSWrapperObject::): - (JSC::JSWrapperObject::JSWrapperObject): - * kjs/StringObject.h: - (JSC::StringObject::StringObject): - * kjs/StringObjectThatMasqueradesAsUndefined.h: - (JSC::StringObjectThatMasqueradesAsUndefined::StringObjectThatMasqueradesAsUndefined): - -2008-09-15 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Rubber-stamped by Oliver Hunt. - - r36427 broke CodeBlock::dump() by changing the number of arguments to - op_construct without changing the code that prints it. This patch fixes - it by printing the additional argument. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/CodeBlock.cpp: - (JSC::CodeBlock::dump): - -2008-09-15 Adam Roben <aroben@apple.com> - - Build fix - - * kjs/StructureID.cpp: Removed a stray semicolon. - -2008-09-15 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Maciej Stachowiak. - - Fix a crash in fast/js/exception-expression-offset.html caused by not - updating all mentions of the length of op_construct in r36427. - - * VM/Machine.cpp: - (JSC::Machine::cti_op_construct_NotJSConstruct): - -2008-09-15 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Cameron Zwarich. - - - fix layout test failure introduced by fix for 20849 - - (The failing test was fast/js/delete-then-put.html) - - * kjs/JSObject.cpp: - (JSC::JSObject::removeDirect): Clear enumeration cache - in the dictionary case. - * kjs/JSObject.h: - (JSC::JSObject::putDirect): Ditto. - * kjs/StructureID.h: - (JSC::StructureID::clearEnumerationCache): Inline to handle the - clear. - -2008-09-15 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Cameron Zwarich. - - fix JSC test failures introduced by fix for 20849 - - * kjs/PropertyMap.cpp: - (JSC::PropertyMap::getEnumerablePropertyNames): Use the correct count. - -2008-09-15 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Maciej Stachowiak. - - Bug 20851: REGRESSION (r36410): fast/js/kde/GlobalObject.html fails - <https://bugs.webkit.org/show_bug.cgi?id=20851> - - r36410 introduced an optimization for parseInt() that is incorrect when - its argument is larger than the range of a 32-bit integer. If the - argument is a number that is not an immediate integer, then the correct - behaviour is to return the floor of its value, unless it is an infinite - value, in which case the correct behaviour is to return 0. - - * kjs/JSGlobalObjectFunctions.cpp: - (JSC::globalFuncParseInt): - -2008-09-15 Sam Weinig <sam@webkit.org> - - Reviewed by Maciej Stachowiak. - - Patch for https://bugs.webkit.org/show_bug.cgi?id=20849 - Cache property names for getEnumerablePropertyNames in the StructureID. - - ~0.5% speedup on Sunspider overall (9.7% speedup on string-fasta). ~1% speedup - on the v8 test suite. - - * kjs/JSObject.cpp: - (JSC::JSObject::getPropertyNames): - * kjs/PropertyMap.cpp: - (JSC::PropertyMap::getEnumerablePropertyNames): - * kjs/PropertyMap.h: - * kjs/StructureID.cpp: - (JSC::StructureID::StructureID): - (JSC::StructureID::getEnumerablePropertyNames): - * kjs/StructureID.h: - -2008-09-14 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Cameron Zwarich. - - - speed up JS construction by extracting "prototype" lookup so PIC applies. - - ~0.5% speedup on SunSpider - Speeds up some of the V8 tests as well, most notably earley-boyer. - - * VM/CTI.cpp: - (JSC::CTI::compileOpCall): Account for extra arg for prototype. - (JSC::CTI::privateCompileMainPass): Account for increased size of op_construct. - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::emitConstruct): Emit separate lookup to get prototype property. - * VM/Machine.cpp: - (JSC::Machine::privateExecute): Expect prototype arg in op_construct. - (JSC::Machine::cti_op_construct_JSConstruct): ditto - (JSC::Machine::cti_op_construct_NotJSConstruct): ditto - -2008-09-10 Alexey Proskuryakov <ap@webkit.org> - - Reviewed by Eric Seidel. - - Add a protected destructor for RefCounted. - - It is wrong to call its destructor directly, because (1) this should be taken care of by - deref(), and (2) many classes that use RefCounted have non-virtual destructors. - - No change in behavior. - - * wtf/RefCounted.h: (WTF::RefCounted::~RefCounted): - -2008-09-14 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Sam Weinig. - - Accelerated property accesses. - - Inline more of the array access code into the JIT code for get/put_by_val. - Accelerate get/put_by_id by speculatively inlining a disable direct access - into the hot path of the code, and repatch this with the correct StructureID - and property map offset once these are known. In the case of accesses to the - prototype and reading the array-length a trampoline is genertaed, and the - branch to the slow-case is relinked to jump to this. - - By repatching, we mean rewriting the x86 instruction stream. Instructions are - only modified in a simple fasion - altering immediate operands, memory access - deisplacements, and branch offsets. - - For regular get_by_id/put_by_id accesses to an object, a StructureID in an - instruction's immediate operant is updateded, and a memory access operation's - displacement is updated to access the correct field on the object. In the case - of more complex accesses (array length and get_by_id_prototype) the offset on - the branch to slow-case is updated, to now jump to a trampoline. - - +2.8% sunspider, +13% v8-tests - - * VM/CTI.cpp: - (JSC::CTI::emitCall): - (JSC::CTI::emitJumpSlowCaseIfNotJSCell): - (JSC::CTI::CTI): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - (JSC::CTI::privateCompile): - (JSC::CTI::privateCompileGetByIdSelf): - (JSC::CTI::privateCompileGetByIdProto): - (JSC::CTI::privateCompileGetByIdChain): - (JSC::CTI::privateCompilePutByIdReplace): - (JSC::CTI::privateCompilePutByIdTransition): - (JSC::CTI::privateCompileArrayLengthTrampoline): - (JSC::CTI::privateCompileStringLengthTrampoline): - (JSC::CTI::patchGetByIdSelf): - (JSC::CTI::patchPutByIdReplace): - (JSC::CTI::privateCompilePatchGetArrayLength): - (JSC::CTI::privateCompilePatchGetStringLength): - * VM/CTI.h: - (JSC::CTI::compileGetByIdSelf): - (JSC::CTI::compileGetByIdProto): - (JSC::CTI::compileGetByIdChain): - (JSC::CTI::compilePutByIdReplace): - (JSC::CTI::compilePutByIdTransition): - (JSC::CTI::compileArrayLengthTrampoline): - (JSC::CTI::compileStringLengthTrampoline): - (JSC::CTI::compilePatchGetArrayLength): - (JSC::CTI::compilePatchGetStringLength): - * VM/CodeBlock.cpp: - (JSC::CodeBlock::dump): - (JSC::CodeBlock::~CodeBlock): - * VM/CodeBlock.h: - (JSC::StructureStubInfo::StructureStubInfo): - (JSC::CodeBlock::getStubInfo): - * VM/Machine.cpp: - (JSC::Machine::tryCTICachePutByID): - (JSC::Machine::tryCTICacheGetByID): - (JSC::Machine::cti_op_put_by_val_array): - * VM/Machine.h: - * masm/X86Assembler.h: - (JSC::X86Assembler::): - (JSC::X86Assembler::cmpl_i8m): - (JSC::X86Assembler::emitUnlinkedJa): - (JSC::X86Assembler::getRelocatedAddress): - (JSC::X86Assembler::getDifferenceBetweenLabels): - (JSC::X86Assembler::emitModRm_opmsib): - -2008-09-14 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Cameron Zwarich. - - - split the "prototype" lookup for hasInstance into opcode stream so it can be cached - - ~5% speedup on v8 earley-boyer test - - * API/JSCallbackObject.h: Add a parameter for the pre-looked-up prototype. - * API/JSCallbackObjectFunctions.h: - (JSC::::hasInstance): Ditto. - * API/JSValueRef.cpp: - (JSValueIsInstanceOfConstructor): Look up and pass in prototype. - * JavaScriptCore.exp: - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): Pass along prototype. - * VM/CodeBlock.cpp: - (JSC::CodeBlock::dump): Print third arg. - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::emitInstanceOf): Implement this, now that there - is a third argument. - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (JSC::Machine::privateExecute): Pass along the prototype. - (JSC::Machine::cti_op_instanceof): ditto - * kjs/JSObject.cpp: - (JSC::JSObject::hasInstance): Expect to get a pre-looked-up prototype. - * kjs/JSObject.h: - * kjs/nodes.cpp: - (JSC::InstanceOfNode::emitCode): Emit a get_by_id of the prototype - property and pass that register to instanceof. - * kjs/nodes.h: - -2008-09-14 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Sam Weinig. - - Remove unnecessary virtual function call from cti_op_call_JSFunction - - ~5% on richards, ~2.5% on v8-tests, ~0.5% on sunspider. - - * VM/Machine.cpp: - (JSC::Machine::cti_op_call_JSFunction): - -2008-09-14 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Maciej Stachowiak. - - Bug 20827: the 'typeof' operator is slow - <https://bugs.webkit.org/show_bug.cgi?id=20827> - - Optimize the 'typeof' operator when its result is compared to a constant - string. - - This is a 5.5% speedup on the V8 Earley-Boyer test. - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): - * VM/CodeBlock.cpp: - (JSC::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::emitEqualityOp): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (JSC::jsIsObjectType): - (JSC::jsIsFunctionType): - (JSC::Machine::privateExecute): - (JSC::Machine::cti_op_is_undefined): - (JSC::Machine::cti_op_is_boolean): - (JSC::Machine::cti_op_is_number): - (JSC::Machine::cti_op_is_string): - (JSC::Machine::cti_op_is_object): - (JSC::Machine::cti_op_is_function): - * VM/Machine.h: - * VM/Opcode.h: - * kjs/nodes.cpp: - (JSC::BinaryOpNode::emitCode): - (JSC::EqualNode::emitCode): - (JSC::StrictEqualNode::emitCode): - * kjs/nodes.h: - -2008-09-14 Sam Weinig <sam@webkit.org> - - Reviewed by Cameron Zwarich. - - Patch for https://bugs.webkit.org/show_bug.cgi?id=20844 - Speed up parseInt for numbers - - Sunspider reports this as 1.029x as fast overall and 1.37x as fast on string-unpack-code. - No change on the v8 suite. - - * kjs/JSGlobalObjectFunctions.cpp: - (JSC::globalFuncParseInt): Don't convert numbers to strings just to - convert them back to numbers. - -2008-09-14 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Oliver Hunt. - - Bug 20816: op_lesseq should be optimized - <https://bugs.webkit.org/show_bug.cgi?id=20816> - - Add a loop_if_lesseq opcode that is similar to the loop_if_less opcode. - - This is a 9.4% speedup on the V8 Crypto benchmark. - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - * VM/CodeBlock.cpp: - (JSC::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::emitJumpIfTrue): - * VM/Machine.cpp: - (JSC::Machine::privateExecute): - (JSC::Machine::cti_op_loop_if_lesseq): - * VM/Machine.h: - * VM/Opcode.h: - -2008-09-14 Sam Weinig <sam@webkit.org> - - Reviewed by Cameron Zwarich. - - Cleanup Sampling code. - - * VM/CTI.cpp: - (JSC::CTI::emitCall): - (JSC::CTI::privateCompileMainPass): - * VM/CTI.h: - (JSC::CTI::execute): - * VM/SamplingTool.cpp: - (JSC::): - (JSC::SamplingTool::run): - (JSC::SamplingTool::dump): - * VM/SamplingTool.h: - (JSC::SamplingTool::callingHostFunction): - -2008-09-13 Oliver Hunt <oliver@apple.com> - - Reviewed by Cameron Zwarich. - - Bug 20821: Cache property transitions to speed up object initialization - https://bugs.webkit.org/show_bug.cgi?id=20821 - - Implement a transition cache to improve the performance of new properties - being added to objects. This is extremely beneficial in constructors and - shows up as a 34% improvement on access-binary-trees in SunSpider (0.8% - overall) - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): - (JSC::): - (JSC::transitionWillNeedStorageRealloc): - (JSC::CTI::privateCompilePutByIdTransition): - * VM/CTI.h: - (JSC::CTI::compilePutByIdTransition): - * VM/CodeBlock.cpp: - (JSC::printPutByIdOp): - (JSC::CodeBlock::printStructureIDs): - (JSC::CodeBlock::dump): - (JSC::CodeBlock::derefStructureIDs): - (JSC::CodeBlock::refStructureIDs): - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::emitPutById): - * VM/Machine.cpp: - (JSC::cachePrototypeChain): - (JSC::Machine::tryCachePutByID): - (JSC::Machine::tryCacheGetByID): - (JSC::Machine::privateExecute): - (JSC::Machine::tryCTICachePutByID): - (JSC::Machine::tryCTICacheGetByID): - * VM/Machine.h: - * VM/Opcode.h: - * kjs/JSObject.h: - (JSC::JSObject::putDirect): - (JSC::JSObject::transitionTo): - * kjs/PutPropertySlot.h: - (JSC::PutPropertySlot::PutPropertySlot): - (JSC::PutPropertySlot::wasTransition): - (JSC::PutPropertySlot::setWasTransition): - * kjs/StructureID.cpp: - (JSC::StructureID::transitionTo): - (JSC::StructureIDChain::StructureIDChain): - * kjs/StructureID.h: - (JSC::StructureID::previousID): - (JSC::StructureID::setCachedPrototypeChain): - (JSC::StructureID::cachedPrototypeChain): - (JSC::StructureID::propertyMap): - * masm/X86Assembler.h: - (JSC::X86Assembler::addl_i8m): - (JSC::X86Assembler::subl_i8m): - -2008-09-12 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Maciej Stachowiak. - - Bug 20819: JSValue::isObject() is slow - <https://bugs.webkit.org/show_bug.cgi?id=20819> - - Optimize JSCell::isObject() and JSCell::isString() by making them - non-virtual calls that rely on the StructureID type information. - - This is a 0.7% speedup on SunSpider and a 1.0% speedup on the V8 - benchmark suite. - - * JavaScriptCore.exp: - * kjs/JSCell.cpp: - * kjs/JSCell.h: - (JSC::JSCell::isObject): - (JSC::JSCell::isString): - * kjs/JSObject.cpp: - * kjs/JSObject.h: - * kjs/JSString.cpp: - * kjs/JSString.h: - (JSC::JSString::JSString): - * kjs/StructureID.h: - (JSC::StructureID::type): - -2008-09-11 Stephanie Lewis <slewis@apple.com> - - Reviewed by Oliver Hunt. + Inherits HashCountedSet class from FastAllocBase because it has been + instantiated by 'new' in JavaScriptCore/runtime/Collector.cpp:1095. - Turn off PGO Optimization on CTI.cpp -> <rdar://problem/6207709>. Fixes - crash on CNN and on Dromaeo. - Fix Missing close tag in vcproj. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - -2008-09-11 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Not reviewed. - - Correct an SVN problem with the last commit and actually add the new - files. - - * wrec/CharacterClassConstructor.cpp: Added. - (JSC::): - (JSC::getCharacterClassNewline): - (JSC::getCharacterClassDigits): - (JSC::getCharacterClassSpaces): - (JSC::getCharacterClassWordchar): - (JSC::getCharacterClassNondigits): - (JSC::getCharacterClassNonspaces): - (JSC::getCharacterClassNonwordchar): - (JSC::CharacterClassConstructor::addSorted): - (JSC::CharacterClassConstructor::addSortedRange): - (JSC::CharacterClassConstructor::put): - (JSC::CharacterClassConstructor::flush): - (JSC::CharacterClassConstructor::append): - * wrec/CharacterClassConstructor.h: Added. - (JSC::CharacterClassConstructor::CharacterClassConstructor): - (JSC::CharacterClassConstructor::isUpsideDown): - (JSC::CharacterClassConstructor::charClass): - -2008-09-11 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Maciej Stachowiak. - - Bug 20788: Split CharacterClassConstructor into its own file - <https://bugs.webkit.org/show_bug.cgi?id=20788> - - Split CharacterClassConstructor into its own file and clean up some - style issues. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * wrec/CharacterClassConstructor.cpp: Added. - (JSC::): - (JSC::getCharacterClassNewline): - (JSC::getCharacterClassDigits): - (JSC::getCharacterClassSpaces): - (JSC::getCharacterClassWordchar): - (JSC::getCharacterClassNondigits): - (JSC::getCharacterClassNonspaces): - (JSC::getCharacterClassNonwordchar): - (JSC::CharacterClassConstructor::addSorted): - (JSC::CharacterClassConstructor::addSortedRange): - (JSC::CharacterClassConstructor::put): - (JSC::CharacterClassConstructor::flush): - (JSC::CharacterClassConstructor::append): - * wrec/CharacterClassConstructor.h: Added. - (JSC::CharacterClassConstructor::CharacterClassConstructor): - (JSC::CharacterClassConstructor::isUpsideDown): - (JSC::CharacterClassConstructor::charClass): - * wrec/WREC.cpp: - (JSC::WRECParser::parseCharacterClass): - -2008-09-10 Simon Hausmann <hausmann@webkit.org> - - Not reviewed but trivial one-liner for yet unused macro. - - Changed PLATFORM(WINCE) to PLATFORM(WIN_CE) as requested by Mark. - - (part of https://bugs.webkit.org/show_bug.cgi?id=20746) - - * wtf/Platform.h: - -2008-09-10 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Rubber-stamped by Oliver Hunt. - - Fix a typo by renaming the overloaded orl_rr that takes an immediate to - orl_i32r. - - * VM/CTI.cpp: - (JSC::CTI::emitFastArithPotentiallyReTagImmediate): - * masm/X86Assembler.h: - (JSC::X86Assembler::orl_i32r): - * wrec/WREC.cpp: - (JSC::WRECGenerator::generatePatternCharacter): - (JSC::WRECGenerator::generateCharacterClassInverted): - -2008-09-10 Sam Weinig <sam@webkit.org> - - Reviewed by Geoff Garen. - - Add inline property storage for JSObject. - - 1.2% progression on Sunspider. .5% progression on the v8 test suite. - - * JavaScriptCore.exp: - * VM/CTI.cpp: - (JSC::CTI::privateCompileGetByIdProto): - (JSC::CTI::privateCompileGetByIdChain): - * kjs/JSObject.cpp: - (JSC::JSObject::mark): There is no reason to check storageSize now that - we start from 0. - (JSC::JSObject::allocatePropertyStorage): Allocates/reallocates heap storage. - * kjs/JSObject.h: - (JSC::JSObject::offsetForLocation): m_propertyStorage is not an OwnArrayPtr - now so there is no reason to .get() - (JSC::JSObject::usingInlineStorage): - (JSC::JSObject::JSObject): Start with m_propertyStorage pointing to the - inline storage. - (JSC::JSObject::~JSObject): Free the heap storage if not using the inline - storage. - (JSC::JSObject::putDirect): Switch to the heap storage only when we know - we know that we are about to add a property that will overflow the inline - storage. - * kjs/PropertyMap.cpp: - (JSC::PropertyMap::createTable): Don't allocate the propertyStorage, that is - now handled by JSObject. - (JSC::PropertyMap::rehash): PropertyStorage is not a OwnArrayPtr anymore. - * kjs/PropertyMap.h: - (JSC::PropertyMap::storageSize): Rename from markingCount. - * kjs/StructureID.cpp: - (JSC::StructureID::addPropertyTransition): Don't resize the property storage - if we are using inline storage. - * kjs/StructureID.h: - -2008-09-10 Oliver Hunt <oliver@apple.com> - - Reviewed by Geoff Garen. - - Inline immediate number version of op_mul. - - Renamed mull_rr to imull_rr as that's what it's - actually doing, and added imull_i32r for the constant - case immediate multiply. - - 1.1% improvement to SunSpider. - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - * masm/X86Assembler.h: - (JSC::X86Assembler::): - (JSC::X86Assembler::imull_rr): - (JSC::X86Assembler::imull_i32r): + * wtf/HashCountedSet.h: -2008-09-10 Cameron Zwarich <cwzwarich@uwaterloo.ca> +2009-06-19 Yong Li <yong.li@torchmobile.com> - Not reviewed. + Reviewed by George Staikos. - Mac build fix. + https://bugs.webkit.org/show_bug.cgi?id=26558 + Declare these symbols extern for WINCE as they are provided by libce. - * JavaScriptCore.xcodeproj/project.pbxproj: + * runtime/DateConstructor.cpp: + * runtime/DatePrototype.cpp: + (JSC::formatLocaleDate): -2008-09-09 Oliver Hunt <oliver@apple.com> +2009-06-19 Oliver Hunt <oliver@apple.com> Reviewed by Maciej Stachowiak. - Add optimised access to known properties on the global object. - - Improve cross scope access to the global object by emitting - code to access it directly rather than by walking the scope chain. - - This is a 0.8% win in SunSpider and a 1.7% win in the v8 benchmarks. - - * VM/CTI.cpp: - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::emitGetVariableObjectRegister): - (JSC::CTI::emitPutVariableObjectRegister): - * VM/CTI.h: - * VM/CodeBlock.cpp: - (JSC::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (JSC::CodeGenerator::findScopedProperty): - (JSC::CodeGenerator::emitResolve): - (JSC::CodeGenerator::emitGetScopedVar): - (JSC::CodeGenerator::emitPutScopedVar): - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (JSC::Machine::privateExecute): - * VM/Opcode.h: - * kjs/nodes.cpp: - (JSC::FunctionCallResolveNode::emitCode): - (JSC::PostfixResolveNode::emitCode): - (JSC::PrefixResolveNode::emitCode): - (JSC::ReadModifyResolveNode::emitCode): - (JSC::AssignResolveNode::emitCode): - -2008-09-10 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Oliver. - - - enable polymorphic inline caching of properties of primitives - - 1.012x speedup on SunSpider. - - We create special structure IDs for JSString and - JSNumberCell. Unlike normal structure IDs, these cannot hold the - true prototype. Due to JS autoboxing semantics, the prototype used - when looking up string or number properties depends on the lexical - global object of the call site, not the creation site. Thus we - enable StructureIDs to handle this quirk for primitives. - - Everything else should be straightforward. - - * VM/CTI.cpp: - (JSC::CTI::privateCompileGetByIdProto): - (JSC::CTI::privateCompileGetByIdChain): - * VM/CTI.h: - (JSC::CTI::compileGetByIdProto): - (JSC::CTI::compileGetByIdChain): - * VM/JSPropertyNameIterator.h: - (JSC::JSPropertyNameIterator::JSPropertyNameIterator): - * VM/Machine.cpp: - (JSC::Machine::Machine): - (JSC::cachePrototypeChain): - (JSC::Machine::tryCachePutByID): - (JSC::Machine::tryCacheGetByID): - (JSC::Machine::privateExecute): - (JSC::Machine::tryCTICachePutByID): - (JSC::Machine::tryCTICacheGetByID): - * kjs/GetterSetter.h: - (JSC::GetterSetter::GetterSetter): - * kjs/JSCell.h: - * kjs/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): - * kjs/JSGlobalData.h: - * kjs/JSGlobalObject.h: - (JSC::StructureID::prototypeForLookup): - * kjs/JSNumberCell.h: - (JSC::JSNumberCell::JSNumberCell): - (JSC::jsNumberCell): - * kjs/JSObject.h: - (JSC::JSObject::prototype): - * kjs/JSString.cpp: - (JSC::jsString): - (JSC::jsSubstring): - (JSC::jsOwnedString): - * kjs/JSString.h: - (JSC::JSString::JSString): - (JSC::JSString::): - (JSC::jsSingleCharacterString): - (JSC::jsSingleCharacterSubstring): - (JSC::jsNontrivialString): - * kjs/SmallStrings.cpp: - (JSC::SmallStrings::createEmptyString): - (JSC::SmallStrings::createSingleCharacterString): - * kjs/StructureID.cpp: - (JSC::StructureID::StructureID): - (JSC::StructureID::addPropertyTransition): - (JSC::StructureID::getterSetterTransition): - (JSC::StructureIDChain::StructureIDChain): - * kjs/StructureID.h: - (JSC::StructureID::create): - (JSC::StructureID::storedPrototype): - -2008-09-09 Joerg Bornemann <joerg.bornemann@trolltech.com> - - Reviewed by Sam Weinig. - - https://bugs.webkit.org/show_bug.cgi?id=20746 + <rdar://problem/6988973> ScopeChain leak in interpreter builds - Added WINCE platform macro. + Move the Scopechain destruction code in JSFunction outside of the ENABLE(JIT) + path. + * runtime/JSFunction.cpp: + (JSC::JSFunction::~JSFunction): * wtf/Platform.h: -2008-09-09 Sam Weinig <sam@webkit.org> - - Reviewed by Mark Rowe. - - Remove unnecessary override of getOffset. - - Sunspider reports this as a .6% progression. - - * JavaScriptCore.exp: - * kjs/JSObject.h: - (JSC::JSObject::getDirectLocation): - (JSC::JSObject::getOwnPropertySlotForWrite): - (JSC::JSObject::putDirect): - * kjs/PropertyMap.cpp: - * kjs/PropertyMap.h: - -2008-09-09 Cameron Zwarich <cwzwarich@uwaterloo.ca> +2009-06-19 Yong Li <yong.li@torchmobile.com> - Reviewed by Maciej Stachowiak. - - Bug 20759: Remove MacroAssembler - <https://bugs.webkit.org/show_bug.cgi?id=20759> - - Remove MacroAssembler and move its functionality to X86Assembler. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/CTI.cpp: - (JSC::CTI::emitGetArg): - (JSC::CTI::emitGetPutArg): - (JSC::CTI::emitPutArg): - (JSC::CTI::emitPutCTIParam): - (JSC::CTI::emitGetCTIParam): - (JSC::CTI::emitPutToCallFrameHeader): - (JSC::CTI::emitGetFromCallFrameHeader): - (JSC::CTI::emitPutResult): - (JSC::CTI::emitDebugExceptionCheck): - (JSC::CTI::emitJumpSlowCaseIfNotImm): - (JSC::CTI::emitJumpSlowCaseIfNotImms): - (JSC::CTI::emitFastArithDeTagImmediate): - (JSC::CTI::emitFastArithReTagImmediate): - (JSC::CTI::emitFastArithPotentiallyReTagImmediate): - (JSC::CTI::emitFastArithImmToInt): - (JSC::CTI::emitFastArithIntToImmOrSlowCase): - (JSC::CTI::emitFastArithIntToImmNoCheck): - (JSC::CTI::compileOpCall): - (JSC::CTI::emitSlowScriptCheck): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - (JSC::CTI::privateCompile): - (JSC::CTI::privateCompileGetByIdSelf): - (JSC::CTI::privateCompileGetByIdProto): - (JSC::CTI::privateCompileGetByIdChain): - (JSC::CTI::privateCompilePutByIdReplace): - (JSC::CTI::privateArrayLengthTrampoline): - (JSC::CTI::privateStringLengthTrampoline): - (JSC::CTI::compileRegExp): - * VM/CTI.h: - (JSC::CallRecord::CallRecord): - (JSC::JmpTable::JmpTable): - (JSC::SlowCaseEntry::SlowCaseEntry): - (JSC::CTI::JSRInfo::JSRInfo): - * masm/MacroAssembler.h: Removed. - * masm/MacroAssemblerWin.cpp: Removed. - * masm/X86Assembler.h: - (JSC::X86Assembler::emitConvertToFastCall): - (JSC::X86Assembler::emitRestoreArgumentReference): - * wrec/WREC.h: - (JSC::WRECGenerator::WRECGenerator): - (JSC::WRECParser::WRECParser): - -2008-09-09 Sam Weinig <sam@webkit.org> - - Reviewed by Cameron Zwarich. - - Don't waste the first item in the PropertyStorage. - - - Fix typo (makingCount -> markingCount) - - Remove undefined method declaration. - - No change on Sunspider. - - * kjs/JSObject.cpp: - (JSC::JSObject::mark): - * kjs/PropertyMap.cpp: - (JSC::PropertyMap::put): - (JSC::PropertyMap::remove): - (JSC::PropertyMap::getOffset): - (JSC::PropertyMap::insert): - (JSC::PropertyMap::rehash): - (JSC::PropertyMap::resizePropertyStorage): - (JSC::PropertyMap::checkConsistency): - * kjs/PropertyMap.h: - (JSC::PropertyMap::markingCount): Fix typo. - -2008-09-09 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Not reviewed. - - Speculative Windows build fix. - - * masm/MacroAssemblerWin.cpp: - (JSC::MacroAssembler::emitConvertToFastCall): - (JSC::MacroAssembler::emitRestoreArgumentReference): + Reviewed by George Staikos. -2008-09-09 Cameron Zwarich <cwzwarich@uwaterloo.ca> + https://bugs.webkit.org/show_bug.cgi?id=26543 + Windows CE uses 'GetLastError' instead of 'errno.' - Reviewed by Maciej Stachowiak. - - Bug 20755: Create an X86 namespace for register names and other things - <https://bugs.webkit.org/show_bug.cgi?id=20755> - - Create an X86 namespace to put X86 register names. Perhaps I will move - opcode names here later as well. - - * VM/CTI.cpp: - (JSC::CTI::emitGetArg): - (JSC::CTI::emitGetPutArg): - (JSC::CTI::emitPutArg): - (JSC::CTI::emitPutArgConstant): - (JSC::CTI::emitPutCTIParam): - (JSC::CTI::emitGetCTIParam): - (JSC::CTI::emitPutToCallFrameHeader): - (JSC::CTI::emitGetFromCallFrameHeader): - (JSC::CTI::emitPutResult): - (JSC::CTI::emitDebugExceptionCheck): - (JSC::CTI::emitJumpSlowCaseIfNotImms): - (JSC::CTI::compileOpCall): - (JSC::CTI::emitSlowScriptCheck): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - (JSC::CTI::privateCompile): - (JSC::CTI::privateCompileGetByIdSelf): - (JSC::CTI::privateCompileGetByIdProto): - (JSC::CTI::privateCompileGetByIdChain): - (JSC::CTI::privateCompilePutByIdReplace): - (JSC::CTI::privateArrayLengthTrampoline): - (JSC::CTI::privateStringLengthTrampoline): - (JSC::CTI::compileRegExp): - * VM/CTI.h: - * masm/X86Assembler.h: - (JSC::X86::): - (JSC::X86Assembler::emitModRm_rm): - (JSC::X86Assembler::emitModRm_rm_Unchecked): - (JSC::X86Assembler::emitModRm_rmsib): - * wrec/WREC.cpp: - (JSC::WRECGenerator::generateNonGreedyQuantifier): - (JSC::WRECGenerator::generateGreedyQuantifier): - (JSC::WRECGenerator::generateParentheses): - (JSC::WRECGenerator::generateBackreference): - (JSC::WRECGenerator::gernerateDisjunction): - * wrec/WREC.h: - -2008-09-09 Sam Weinig <sam@webkit.org> + * interpreter/RegisterFile.h: + (JSC::RegisterFile::RegisterFile): + (JSC::RegisterFile::grow): - Reviewed by Geoffrey Garen. +2009-06-19 David Levin <levin@chromium.org> - Remove unnecessary friend declaration. + Reviewed by NOBODY (Windows build fix). - * kjs/PropertyMap.h: + Add export for Windows corresponding to OSX export done in r44844. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: -2008-09-09 Sam Weinig <sam@webkit.org> +2009-06-18 Oliver Hunt <oliver@apple.com> - Reviewed by Geoffrey Garen. + Reviewed by Gavin "Viceroy of Venezuela" Barraclough. - Replace uses of PropertyMap::get and PropertyMap::getLocation with - PropertyMap::getOffset. + Bug 26532: Native functions do not correctly unlink from optimised callsites when they're collected + <https://bugs.webkit.org/show_bug.cgi?id=26532> <rdar://problem/6625385> - Sunspider reports this as a .6% improvement. + We need to make sure that each native function instance correctly unlinks any references to it + when it is collected. Allowing this to happen required a few changes: + * Every native function needs a codeblock to track the link information + * To have this codeblock, every function now also needs its own functionbodynode + so we no longer get to have a single shared instance. + * Identifying a host function is now done by looking for CodeBlock::codeType() == NativeCode * JavaScriptCore.exp: - * kjs/JSObject.cpp: - (JSC::JSObject::put): - (JSC::JSObject::deleteProperty): - (JSC::JSObject::getPropertyAttributes): - * kjs/JSObject.h: - (JSC::JSObject::getDirect): - (JSC::JSObject::getDirectLocation): - (JSC::JSObject::locationForOffset): - * kjs/PropertyMap.cpp: - (JSC::PropertyMap::remove): - (JSC::PropertyMap::getOffset): - * kjs/PropertyMap.h: - -2008-09-09 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Sam Weinig. - - Bug 20754: Remove emit prefix from assembler opcode methods - <https://bugs.webkit.org/show_bug.cgi?id=20754> - - * VM/CTI.cpp: - (JSC::CTI::emitGetArg): - (JSC::CTI::emitGetPutArg): - (JSC::CTI::emitPutArg): - (JSC::CTI::emitPutArgConstant): - (JSC::CTI::emitPutCTIParam): - (JSC::CTI::emitGetCTIParam): - (JSC::CTI::emitPutToCallFrameHeader): - (JSC::CTI::emitGetFromCallFrameHeader): - (JSC::CTI::emitPutResult): - (JSC::CTI::emitDebugExceptionCheck): - (JSC::CTI::emitCall): - (JSC::CTI::emitJumpSlowCaseIfNotImm): - (JSC::CTI::emitJumpSlowCaseIfNotImms): - (JSC::CTI::emitFastArithDeTagImmediate): - (JSC::CTI::emitFastArithReTagImmediate): - (JSC::CTI::emitFastArithPotentiallyReTagImmediate): - (JSC::CTI::emitFastArithImmToInt): - (JSC::CTI::emitFastArithIntToImmOrSlowCase): - (JSC::CTI::emitFastArithIntToImmNoCheck): - (JSC::CTI::compileOpCall): - (JSC::CTI::emitSlowScriptCheck): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - (JSC::CTI::privateCompile): - (JSC::CTI::privateCompileGetByIdSelf): - (JSC::CTI::privateCompileGetByIdProto): - (JSC::CTI::privateCompileGetByIdChain): - (JSC::CTI::privateCompilePutByIdReplace): - (JSC::CTI::privateArrayLengthTrampoline): - (JSC::CTI::privateStringLengthTrampoline): - (JSC::CTI::compileRegExp): - * masm/MacroAssemblerWin.cpp: - (JSC::MacroAssembler::emitConvertToFastCall): - (JSC::MacroAssembler::emitRestoreArgumentReference): - * masm/X86Assembler.h: - (JSC::X86Assembler::pushl_r): - (JSC::X86Assembler::pushl_m): - (JSC::X86Assembler::popl_r): - (JSC::X86Assembler::popl_m): - (JSC::X86Assembler::movl_rr): - (JSC::X86Assembler::addl_rr): - (JSC::X86Assembler::addl_i8r): - (JSC::X86Assembler::addl_i32r): - (JSC::X86Assembler::addl_mr): - (JSC::X86Assembler::andl_rr): - (JSC::X86Assembler::andl_i32r): - (JSC::X86Assembler::cmpl_i8r): - (JSC::X86Assembler::cmpl_rr): - (JSC::X86Assembler::cmpl_rm): - (JSC::X86Assembler::cmpl_i32r): - (JSC::X86Assembler::cmpl_i32m): - (JSC::X86Assembler::cmpw_rm): - (JSC::X86Assembler::orl_rr): - (JSC::X86Assembler::subl_rr): - (JSC::X86Assembler::subl_i8r): - (JSC::X86Assembler::subl_i32r): - (JSC::X86Assembler::subl_mr): - (JSC::X86Assembler::testl_i32r): - (JSC::X86Assembler::testl_rr): - (JSC::X86Assembler::xorl_i8r): - (JSC::X86Assembler::xorl_rr): - (JSC::X86Assembler::sarl_i8r): - (JSC::X86Assembler::sarl_CLr): - (JSC::X86Assembler::shl_i8r): - (JSC::X86Assembler::shll_CLr): - (JSC::X86Assembler::mull_rr): - (JSC::X86Assembler::idivl_r): - (JSC::X86Assembler::cdq): - (JSC::X86Assembler::movl_mr): - (JSC::X86Assembler::movzwl_mr): - (JSC::X86Assembler::movl_rm): - (JSC::X86Assembler::movl_i32r): - (JSC::X86Assembler::movl_i32m): - (JSC::X86Assembler::leal_mr): - (JSC::X86Assembler::ret): - (JSC::X86Assembler::jmp_r): - (JSC::X86Assembler::jmp_m): - (JSC::X86Assembler::call_r): - * wrec/WREC.cpp: - (JSC::WRECGenerator::generateBacktrack1): - (JSC::WRECGenerator::generateBacktrackBackreference): - (JSC::WRECGenerator::generateBackreferenceQuantifier): - (JSC::WRECGenerator::generateNonGreedyQuantifier): - (JSC::WRECGenerator::generateGreedyQuantifier): - (JSC::WRECGenerator::generatePatternCharacter): - (JSC::WRECGenerator::generateCharacterClassInvertedRange): - (JSC::WRECGenerator::generateCharacterClassInverted): - (JSC::WRECGenerator::generateCharacterClass): - (JSC::WRECGenerator::generateParentheses): - (JSC::WRECGenerator::gererateParenthesesResetTrampoline): - (JSC::WRECGenerator::generateAssertionBOL): - (JSC::WRECGenerator::generateAssertionEOL): - (JSC::WRECGenerator::generateAssertionWordBoundary): - (JSC::WRECGenerator::generateBackreference): - (JSC::WRECGenerator::gernerateDisjunction): - -2008-09-09 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Maciej Stachowiak. - - Clean up the WREC code some more. - - * VM/CTI.cpp: - (JSC::CTI::compileRegExp): - * wrec/WREC.cpp: - (JSC::getCharacterClassNewline): - (JSC::getCharacterClassDigits): - (JSC::getCharacterClassSpaces): - (JSC::getCharacterClassWordchar): - (JSC::getCharacterClassNondigits): - (JSC::getCharacterClassNonspaces): - (JSC::getCharacterClassNonwordchar): - (JSC::WRECGenerator::generateBacktrack1): - (JSC::WRECGenerator::generateBacktrackBackreference): - (JSC::WRECGenerator::generateBackreferenceQuantifier): - (JSC::WRECGenerator::generateNonGreedyQuantifier): - (JSC::WRECGenerator::generateGreedyQuantifier): - (JSC::WRECGenerator::generatePatternCharacter): - (JSC::WRECGenerator::generateCharacterClassInvertedRange): - (JSC::WRECGenerator::generateCharacterClassInverted): - (JSC::WRECGenerator::generateCharacterClass): - (JSC::WRECGenerator::generateParentheses): - (JSC::WRECGenerator::gererateParenthesesResetTrampoline): - (JSC::WRECGenerator::generateAssertionBOL): - (JSC::WRECGenerator::generateAssertionEOL): - (JSC::WRECGenerator::generateAssertionWordBoundary): - (JSC::WRECGenerator::generateBackreference): - (JSC::WRECGenerator::gernerateDisjunction): - (JSC::WRECParser::parseCharacterClass): - (JSC::WRECParser::parseEscape): - (JSC::WRECParser::parseTerm): - * wrec/WREC.h: - -2008-09-09 Mark Rowe <mrowe@apple.com> - - Build fix, rubber-stamped by Anders Carlsson. - - Silence spurious build warnings about missing format attributes on functions in Assertions.cpp. - - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-09-09 Mark Rowe <mrowe@apple.com> - - Rubber-stamped by Oliver Hunt. - - Fix builds using the "debug" variant. - - This reverts r36130 and tweaks Identifier to export the same symbols for Debug - and Release configurations. - - * Configurations/JavaScriptCore.xcconfig: - * DerivedSources.make: - * JavaScriptCore.Debug.exp: Removed. - * JavaScriptCore.base.exp: Removed. - * JavaScriptCore.exp: Added. - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/identifier.cpp: - (JSC::Identifier::addSlowCase): #ifdef the call to checkSameIdentifierTable so that - there is no overhead in Release builds. - (JSC::Identifier::checkSameIdentifierTable): Add empty functions for Release builds. - * kjs/identifier.h: - (JSC::Identifier::add): #ifdef the calls to checkSameIdentifierTable so that there is - no overhead in Release builds, and remove the inline definitions of checkSameIdentifierTable. - -2008-09-09 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Maciej Stachowiak. - - Clean up WREC a bit to bring it closer to our coding style guidelines. + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::CodeBlock): + Constructor for NativeCode CodeBlock + (JSC::CodeBlock::derefStructures): + (JSC::CodeBlock::refStructures): + (JSC::CodeBlock::reparseForExceptionInfoIfNecessary): + (JSC::CodeBlock::handlerForBytecodeOffset): + (JSC::CodeBlock::lineNumberForBytecodeOffset): + (JSC::CodeBlock::expressionRangeForBytecodeOffset): + (JSC::CodeBlock::getByIdExceptionInfoForBytecodeOffset): + (JSC::CodeBlock::functionRegisterForBytecodeOffset): + (JSC::CodeBlock::hasGlobalResolveInstructionAtBytecodeOffset): + (JSC::CodeBlock::hasGlobalResolveInfoAtBytecodeOffset): + (JSC::CodeBlock::setJITCode): + Add assertions to ensure we don't try and use NativeCode CodeBlocks as + a normal codeblock. - * wrec/WREC.cpp: + * bytecode/CodeBlock.h: (JSC::): - (JSC::getCharacterClass_newline): - (JSC::getCharacterClass_d): - (JSC::getCharacterClass_s): - (JSC::getCharacterClass_w): - (JSC::getCharacterClass_D): - (JSC::getCharacterClass_S): - (JSC::getCharacterClass_W): - (JSC::CharacterClassConstructor::append): - (JSC::WRECGenerator::generateNonGreedyQuantifier): - (JSC::WRECGenerator::generateGreedyQuantifier): - (JSC::WRECGenerator::generateCharacterClassInverted): - (JSC::WRECParser::parseQuantifier): - (JSC::WRECParser::parsePatternCharacterQualifier): - (JSC::WRECParser::parseCharacterClassQuantifier): - (JSC::WRECParser::parseBackreferenceQuantifier): - * wrec/WREC.h: - (JSC::Quantifier::): - (JSC::Quantifier::Quantifier): - -2008-09-09 Jungshik Shin <jungshik.shin@gmail.com> - - Reviewed by Alexey Proskuryakov. - - Try MIME charset names before trying IANA names - ( https://bugs.webkit.org/show_bug.cgi?id=17537 ) - - * wtf/StringExtras.h: (strcasecmp): Added. - -2008-09-09 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Mark Rowe. - - Bug 20719: REGRESSION (r36135-36244): Hangs, then crashes after several seconds - <https://bugs.webkit.org/show_bug.cgi?id=20719> - <rdar://problem/6205787> - - Fix a typo in the case-insensitive matching of character patterns. - - * wrec/WREC.cpp: - (JSC::WRECGenerator::generatePatternCharacter): - -2008-09-09 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Sam Weinig. - - - allow polymorphic inline cache to handle Math object functions and possibly other similar things - - 1.012x speedup on SunSpider. - - * kjs/MathObject.cpp: - (JSC::MathObject::getOwnPropertySlot): - * kjs/lookup.cpp: - (JSC::setUpStaticFunctionSlot): - * kjs/lookup.h: - (JSC::getStaticPropertySlot): - -2008-09-08 Sam Weinig <sam@webkit.org> - - Reviewed by Maciej Stachowiak and Oliver Hunt. - - Split storage of properties out of the PropertyMap and into the JSObject - to allow sharing PropertyMap on the StructureID. In order to get this - function correctly, the StructureID's transition mappings were changed to - transition based on property name and attribute pairs, instead of just - property name. - - - Removes the single property optimization now that the PropertyMap is shared. - This will be replaced by in-lining some values on the JSObject. - - This is a wash on Sunspider and a 6.7% win on the v8 test suite. - - * JavaScriptCore.base.exp: - * VM/CTI.cpp: - (JSC::CTI::privateCompileGetByIdSelf): Get the storage directly off the JSObject. - (JSC::CTI::privateCompileGetByIdProto): Ditto. - (JSC::CTI::privateCompileGetByIdChain): Ditto. - (JSC::CTI::privateCompilePutByIdReplace): Ditto. - * kjs/JSObject.cpp: - (JSC::JSObject::mark): Mark the PropertyStorage. - (JSC::JSObject::put): Update to get the propertyMap of the StructureID. - (JSC::JSObject::deleteProperty): Ditto. - (JSC::JSObject::defineGetter): Return early if the property is already a getter/setter. - (JSC::JSObject::defineSetter): Ditto. - (JSC::JSObject::getPropertyAttributes): Update to get the propertyMap of the StructureID - (JSC::JSObject::getPropertyNames): Ditto. - (JSC::JSObject::removeDirect): Ditto. - * kjs/JSObject.h: Remove PropertyMap and add PropertyStorage. - (JSC::JSObject::propertyStorage): return the PropertyStorage. - (JSC::JSObject::getDirect): Update to get the propertyMap of the StructureID. - (JSC::JSObject::getDirectLocation): Ditto. - (JSC::JSObject::offsetForLocation): Compute location directly. - (JSC::JSObject::hasCustomProperties): Update to get the propertyMap of the StructureID. - (JSC::JSObject::hasGetterSetterProperties): Ditto. - (JSC::JSObject::getDirectOffset): Get by indexing into PropertyStorage. - (JSC::JSObject::putDirectOffset): Put by indexing into PropertyStorage. - (JSC::JSObject::getOwnPropertySlotForWrite): Update to get the propertyMap of the StructureID. - (JSC::JSObject::getOwnPropertySlot): Ditto. - (JSC::JSObject::putDirect): Move putting into the StructureID unless the property already exists. - * kjs/PropertyMap.cpp: Use the propertyStorage as the storage for the JSValues. - (JSC::PropertyMap::checkConsistency): - (JSC::PropertyMap::operator=): - (JSC::PropertyMap::~PropertyMap): - (JSC::PropertyMap::get): - (JSC::PropertyMap::getLocation): - (JSC::PropertyMap::put): - (JSC::PropertyMap::getOffset): - (JSC::PropertyMap::insert): - (JSC::PropertyMap::expand): - (JSC::PropertyMap::rehash): - (JSC::PropertyMap::createTable): - (JSC::PropertyMap::resizePropertyStorage): Resize the storage to match the size of the map - (JSC::PropertyMap::remove): - (JSC::PropertyMap::getEnumerablePropertyNames): - * kjs/PropertyMap.h: - (JSC::PropertyMapEntry::PropertyMapEntry): - (JSC::PropertyMap::isEmpty): - (JSC::PropertyMap::size): - (JSC::PropertyMap::makingCount): - (JSC::PropertyMap::PropertyMap): - - * kjs/StructureID.cpp: - (JSC::StructureID::addPropertyTransition): Transitions now are based off the property name - and attributes. - (JSC::StructureID::toDictionaryTransition): Copy the map. - (JSC::StructureID::changePrototypeTransition): Copy the map. - (JSC::StructureID::getterSetterTransition): Copy the map. - (JSC::StructureID::~StructureID): - * kjs/StructureID.h: - (JSC::TransitionTableHash::hash): Custom hash for transition map. - (JSC::TransitionTableHash::equal): Ditto. - (JSC::TransitionTableHashTraits::emptyValue): Custom traits for transition map - (JSC::TransitionTableHashTraits::constructDeletedValue): Ditto. - (JSC::TransitionTableHashTraits::isDeletedValue): Ditto. - (JSC::StructureID::propertyMap): Added. - -2008-09-08 Oliver Hunt <oliver@apple.com> - - Reviewed by Mark Rowe. - - Bug 20694: Slow Script error pops up when running Dromaeo tests - - Correct error in timeout logic where execution tick count would - be reset to incorrect value due to incorrect offset and indirection. - Codegen for the slow script dialog was factored out into a separate - method (emitSlowScriptCheck) rather than having multiple copies of - the same code. Also added calls to generate slow script checks - for loop_if_less and loop_if_true opcodes. - - * VM/CTI.cpp: - (JSC::CTI::emitSlowScriptCheck): - (JSC::CTI::privateCompileMainPass): - (JSC::CTI::privateCompileSlowCases): - * VM/CTI.h: - -2008-09-08 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Maciej Stachowiak. - - Remove references to the removed WRECompiler class. - - * VM/Machine.h: - * wrec/WREC.h: - -2008-09-08 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Rubber-stamped by Mark Rowe. - - Fix the build with CTI enabled but WREC disabled. - - * VM/CTI.cpp: - * VM/CTI.h: - -2008-09-08 Dan Bernstein <mitz@apple.com> - - - build fix - - * kjs/nodes.h: - (JSC::StatementNode::): - (JSC::BlockNode::): - -2008-09-08 Kevin McCullough <kmccullough@apple.com> - - Reviewed by Geoff. - - <rdar://problem/6134407> Breakpoints in for loops, while loops or - conditions without curly braces don't break. (19306) - -Statement Lists already emit debug hooks but conditionals without - brackets are not lists. - - * kjs/nodes.cpp: - (KJS::IfNode::emitCode): - (KJS::IfElseNode::emitCode): - (KJS::DoWhileNode::emitCode): - (KJS::WhileNode::emitCode): - (KJS::ForNode::emitCode): - (KJS::ForInNode::emitCode): - * kjs/nodes.h: - (KJS::StatementNode::): - (KJS::BlockNode::): - -2008-09-08 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Anders Carlsson. - - - Cache the code generated for eval to speed up SunSpider and web sites - https://bugs.webkit.org/show_bug.cgi?id=20718 - - 1.052x on SunSpider - 2.29x on date-format-tofte - - Lots of real sites seem to get many hits on this cache as well, - including GMail, Google Spreadsheets, Slate and Digg (the last of - these gets over 100 hits on initial page load). - - * VM/CodeBlock.h: - (JSC::EvalCodeCache::get): - * VM/Machine.cpp: - (JSC::Machine::callEval): - (JSC::Machine::privateExecute): - (JSC::Machine::cti_op_call_eval): - * VM/Machine.h: - -2008-09-07 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Oliver Hunt. - - Bug 20711: Change KJS prefix on preprocessor macros to JSC - <https://bugs.webkit.org/show_bug.cgi?id=20711> - - * kjs/CommonIdentifiers.cpp: - (JSC::CommonIdentifiers::CommonIdentifiers): - * kjs/CommonIdentifiers.h: - * kjs/PropertySlot.h: - (JSC::PropertySlot::getValue): - (JSC::PropertySlot::putValue): - (JSC::PropertySlot::setValueSlot): - (JSC::PropertySlot::setValue): - (JSC::PropertySlot::setRegisterSlot): - * kjs/lookup.h: - * kjs/nodes.cpp: - * kjs/nodes.h: - (JSC::Node::): - (JSC::ExpressionNode::): - (JSC::StatementNode::): - (JSC::NullNode::): - (JSC::BooleanNode::): - (JSC::NumberNode::): - (JSC::ImmediateNumberNode::): - (JSC::StringNode::): - (JSC::RegExpNode::): - (JSC::ThisNode::): - (JSC::ResolveNode::): - (JSC::ElementNode::): - (JSC::ArrayNode::): - (JSC::PropertyNode::): - (JSC::PropertyListNode::): - (JSC::ObjectLiteralNode::): - (JSC::BracketAccessorNode::): - (JSC::DotAccessorNode::): - (JSC::ArgumentListNode::): - (JSC::ArgumentsNode::): - (JSC::NewExprNode::): - (JSC::EvalFunctionCallNode::): - (JSC::FunctionCallValueNode::): - (JSC::FunctionCallResolveNode::): - (JSC::FunctionCallBracketNode::): - (JSC::FunctionCallDotNode::): - (JSC::PrePostResolveNode::): - (JSC::PostfixResolveNode::): - (JSC::PostfixBracketNode::): - (JSC::PostfixDotNode::): - (JSC::PostfixErrorNode::): - (JSC::DeleteResolveNode::): - (JSC::DeleteBracketNode::): - (JSC::DeleteDotNode::): - (JSC::DeleteValueNode::): - (JSC::VoidNode::): - (JSC::TypeOfResolveNode::): - (JSC::TypeOfValueNode::): - (JSC::PrefixResolveNode::): - (JSC::PrefixBracketNode::): - (JSC::PrefixDotNode::): - (JSC::PrefixErrorNode::): - (JSC::UnaryPlusNode::): - (JSC::NegateNode::): - (JSC::BitwiseNotNode::): - (JSC::LogicalNotNode::): - (JSC::MultNode::): - (JSC::DivNode::): - (JSC::ModNode::): - (JSC::AddNode::): - (JSC::SubNode::): - (JSC::LeftShiftNode::): - (JSC::RightShiftNode::): - (JSC::UnsignedRightShiftNode::): - (JSC::LessNode::): - (JSC::GreaterNode::): - (JSC::LessEqNode::): - (JSC::GreaterEqNode::): - (JSC::ThrowableBinaryOpNode::): - (JSC::InstanceOfNode::): - (JSC::InNode::): - (JSC::EqualNode::): - (JSC::NotEqualNode::): - (JSC::StrictEqualNode::): - (JSC::NotStrictEqualNode::): - (JSC::BitAndNode::): - (JSC::BitOrNode::): - (JSC::BitXOrNode::): - (JSC::LogicalOpNode::): - (JSC::ConditionalNode::): - (JSC::ReadModifyResolveNode::): - (JSC::AssignResolveNode::): - (JSC::ReadModifyBracketNode::): - (JSC::AssignBracketNode::): - (JSC::AssignDotNode::): - (JSC::ReadModifyDotNode::): - (JSC::AssignErrorNode::): - (JSC::CommaNode::): - (JSC::VarDeclCommaNode::): - (JSC::ConstDeclNode::): - (JSC::ConstStatementNode::): - (JSC::EmptyStatementNode::): - (JSC::DebuggerStatementNode::): - (JSC::ExprStatementNode::): - (JSC::VarStatementNode::): - (JSC::IfNode::): - (JSC::IfElseNode::): - (JSC::DoWhileNode::): - (JSC::WhileNode::): - (JSC::ForNode::): - (JSC::ContinueNode::): - (JSC::BreakNode::): - (JSC::ReturnNode::): - (JSC::WithNode::): - (JSC::LabelNode::): - (JSC::ThrowNode::): - (JSC::TryNode::): - (JSC::ParameterNode::): - (JSC::ScopeNode::): - (JSC::ProgramNode::): - (JSC::EvalNode::): - (JSC::FunctionBodyNode::): - (JSC::FuncExprNode::): - (JSC::FuncDeclNode::): - (JSC::CaseClauseNode::): - (JSC::ClauseListNode::): - (JSC::CaseBlockNode::): - (JSC::SwitchNode::): - -2008-09-07 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Maciej Stachowiak. - - Bug 20704: Replace the KJS namespace - <https://bugs.webkit.org/show_bug.cgi?id=20704> + (JSC::CodeBlock::source): + (JSC::CodeBlock::sourceOffset): + (JSC::CodeBlock::evalCodeCache): + (JSC::CodeBlock::createRareDataIfNecessary): + More assertions. - Rename the KJS namespace to JSC. There are still some uses of KJS in - preprocessor macros and comments, but these will also be changed some - time in the near future. + * jit/JIT.cpp: + (JSC::JIT::privateCompileCTIMachineTrampolines): + (JSC::JIT::linkCall): + Update logic to allow native function caching - * API/APICast.h: - (toJS): - (toRef): - (toGlobalRef): - * API/JSBase.cpp: - * API/JSCallbackConstructor.cpp: - * API/JSCallbackConstructor.h: - * API/JSCallbackFunction.cpp: - * API/JSCallbackFunction.h: - * API/JSCallbackObject.cpp: - * API/JSCallbackObject.h: - * API/JSCallbackObjectFunctions.h: - * API/JSClassRef.cpp: - (OpaqueJSClass::staticValues): - (OpaqueJSClass::staticFunctions): - * API/JSClassRef.h: - * API/JSContextRef.cpp: - * API/JSObjectRef.cpp: - * API/JSProfilerPrivate.cpp: - * API/JSStringRef.cpp: - * API/JSValueRef.cpp: - (JSValueGetType): - * API/OpaqueJSString.cpp: - * API/OpaqueJSString.h: - * JavaScriptCore.Debug.exp: - * JavaScriptCore.base.exp: - * VM/CTI.cpp: - (JSC::): - * VM/CTI.h: - * VM/CodeBlock.cpp: - * VM/CodeBlock.h: - * VM/CodeGenerator.cpp: - * VM/CodeGenerator.h: - * VM/ExceptionHelpers.cpp: - * VM/ExceptionHelpers.h: - * VM/Instruction.h: - * VM/JSPropertyNameIterator.cpp: - * VM/JSPropertyNameIterator.h: - * VM/LabelID.h: - * VM/Machine.cpp: - * VM/Machine.h: - * VM/Opcode.cpp: - * VM/Opcode.h: - * VM/Register.h: - (WTF::): - * VM/RegisterFile.cpp: - * VM/RegisterFile.h: - * VM/RegisterID.h: - (WTF::): - * VM/SamplingTool.cpp: - * VM/SamplingTool.h: - * VM/SegmentedVector.h: - * kjs/ArgList.cpp: - * kjs/ArgList.h: - * kjs/Arguments.cpp: - * kjs/Arguments.h: - * kjs/ArrayConstructor.cpp: - * kjs/ArrayConstructor.h: - * kjs/ArrayPrototype.cpp: - * kjs/ArrayPrototype.h: - * kjs/BatchedTransitionOptimizer.h: - * kjs/BooleanConstructor.cpp: - * kjs/BooleanConstructor.h: - * kjs/BooleanObject.cpp: - * kjs/BooleanObject.h: - * kjs/BooleanPrototype.cpp: - * kjs/BooleanPrototype.h: - * kjs/CallData.cpp: - * kjs/CallData.h: - * kjs/ClassInfo.h: - * kjs/CommonIdentifiers.cpp: - * kjs/CommonIdentifiers.h: - * kjs/ConstructData.cpp: - * kjs/ConstructData.h: - * kjs/DateConstructor.cpp: - * kjs/DateConstructor.h: - * kjs/DateInstance.cpp: - (JSC::DateInstance::msToGregorianDateTime): - * kjs/DateInstance.h: - * kjs/DateMath.cpp: - * kjs/DateMath.h: - * kjs/DatePrototype.cpp: - * kjs/DatePrototype.h: - * kjs/DebuggerCallFrame.cpp: - * kjs/DebuggerCallFrame.h: - * kjs/Error.cpp: - * kjs/Error.h: - * kjs/ErrorConstructor.cpp: - * kjs/ErrorConstructor.h: - * kjs/ErrorInstance.cpp: - * kjs/ErrorInstance.h: - * kjs/ErrorPrototype.cpp: - * kjs/ErrorPrototype.h: - * kjs/ExecState.cpp: - * kjs/ExecState.h: - * kjs/FunctionConstructor.cpp: - * kjs/FunctionConstructor.h: - * kjs/FunctionPrototype.cpp: - * kjs/FunctionPrototype.h: - * kjs/GetterSetter.cpp: - * kjs/GetterSetter.h: - * kjs/GlobalEvalFunction.cpp: - * kjs/GlobalEvalFunction.h: - * kjs/IndexToNameMap.cpp: - * kjs/IndexToNameMap.h: - * kjs/InitializeThreading.cpp: - * kjs/InitializeThreading.h: - * kjs/InternalFunction.cpp: - * kjs/InternalFunction.h: - (JSC::InternalFunction::InternalFunction): - * kjs/JSActivation.cpp: - * kjs/JSActivation.h: - * kjs/JSArray.cpp: - * kjs/JSArray.h: - * kjs/JSCell.cpp: - * kjs/JSCell.h: - * kjs/JSFunction.cpp: - * kjs/JSFunction.h: + * jit/JITStubs.cpp: + * parser/Nodes.cpp: + (JSC::FunctionBodyNode::createNativeThunk): + (JSC::FunctionBodyNode::isHostFunction): + * parser/Nodes.h: + * runtime/JSFunction.cpp: (JSC::JSFunction::JSFunction): - * kjs/JSGlobalData.cpp: - (JSC::JSGlobalData::JSGlobalData): - * kjs/JSGlobalData.h: - * kjs/JSGlobalObject.cpp: - * kjs/JSGlobalObject.h: - * kjs/JSGlobalObjectFunctions.cpp: - * kjs/JSGlobalObjectFunctions.h: - * kjs/JSImmediate.cpp: - * kjs/JSImmediate.h: - * kjs/JSLock.cpp: - * kjs/JSLock.h: - * kjs/JSNotAnObject.cpp: - * kjs/JSNotAnObject.h: - * kjs/JSNumberCell.cpp: - * kjs/JSNumberCell.h: - * kjs/JSObject.cpp: - * kjs/JSObject.h: - * kjs/JSStaticScopeObject.cpp: - * kjs/JSStaticScopeObject.h: - * kjs/JSString.cpp: - * kjs/JSString.h: - * kjs/JSType.h: - * kjs/JSValue.cpp: - * kjs/JSValue.h: - * kjs/JSVariableObject.cpp: - * kjs/JSVariableObject.h: - * kjs/JSWrapperObject.cpp: - * kjs/JSWrapperObject.h: - * kjs/LabelStack.cpp: - * kjs/LabelStack.h: - * kjs/MathObject.cpp: - * kjs/MathObject.h: - * kjs/NativeErrorConstructor.cpp: - * kjs/NativeErrorConstructor.h: - * kjs/NativeErrorPrototype.cpp: - * kjs/NativeErrorPrototype.h: - * kjs/NodeInfo.h: - * kjs/NumberConstructor.cpp: - * kjs/NumberConstructor.h: - * kjs/NumberObject.cpp: - * kjs/NumberObject.h: - * kjs/NumberPrototype.cpp: - * kjs/NumberPrototype.h: - * kjs/ObjectConstructor.cpp: - * kjs/ObjectConstructor.h: - * kjs/ObjectPrototype.cpp: - * kjs/ObjectPrototype.h: - * kjs/Parser.cpp: - * kjs/Parser.h: - * kjs/PropertyMap.cpp: - (JSC::PropertyMapStatisticsExitLogger::~PropertyMapStatisticsExitLogger): - * kjs/PropertyMap.h: - * kjs/PropertyNameArray.cpp: - * kjs/PropertyNameArray.h: - * kjs/PropertySlot.cpp: - * kjs/PropertySlot.h: - * kjs/PrototypeFunction.cpp: - * kjs/PrototypeFunction.h: - * kjs/PutPropertySlot.h: - * kjs/RegExpConstructor.cpp: - * kjs/RegExpConstructor.h: - * kjs/RegExpObject.cpp: - * kjs/RegExpObject.h: - * kjs/RegExpPrototype.cpp: - * kjs/RegExpPrototype.h: - * kjs/ScopeChain.cpp: - * kjs/ScopeChain.h: - * kjs/ScopeChainMark.h: - * kjs/Shell.cpp: - (jscmain): - * kjs/SmallStrings.cpp: - * kjs/SmallStrings.h: - * kjs/SourceProvider.h: - * kjs/SourceRange.h: - * kjs/StringConstructor.cpp: - * kjs/StringConstructor.h: - * kjs/StringObject.cpp: - * kjs/StringObject.h: - * kjs/StringObjectThatMasqueradesAsUndefined.h: - * kjs/StringPrototype.cpp: - * kjs/StringPrototype.h: - * kjs/StructureID.cpp: - * kjs/StructureID.h: - * kjs/SymbolTable.h: - * kjs/collector.cpp: - * kjs/collector.h: - * kjs/completion.h: - * kjs/create_hash_table: - * kjs/debugger.cpp: - * kjs/debugger.h: - * kjs/dtoa.cpp: - * kjs/dtoa.h: - * kjs/grammar.y: - * kjs/identifier.cpp: - * kjs/identifier.h: - (JSC::Identifier::equal): - * kjs/interpreter.cpp: - * kjs/interpreter.h: - * kjs/lexer.cpp: - (JSC::Lexer::Lexer): - (JSC::Lexer::clear): - (JSC::Lexer::makeIdentifier): - * kjs/lexer.h: - * kjs/lookup.cpp: - * kjs/lookup.h: - * kjs/nodes.cpp: - * kjs/nodes.h: - * kjs/nodes2string.cpp: - * kjs/operations.cpp: - * kjs/operations.h: - * kjs/protect.h: - * kjs/regexp.cpp: - * kjs/regexp.h: - * kjs/ustring.cpp: - * kjs/ustring.h: - (JSC::operator!=): - (JSC::IdentifierRepHash::hash): - (WTF::): - * masm/MacroAssembler.h: - * masm/MacroAssemblerWin.cpp: - * masm/X86Assembler.h: - * pcre/pcre_exec.cpp: - * profiler/CallIdentifier.h: - (WTF::): - * 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/TreeProfile.cpp: - * profiler/TreeProfile.h: - * wrec/WREC.cpp: - * wrec/WREC.h: - * wtf/AVLTree.h: - -2008-09-07 Maciej Stachowiak <mjs@apple.com> - - Reviewed by Dan Bernstein. - - - rename IA32MacroAssembler class to X86Assembler - - We otherwise call the platform X86, and also, I don't see any macros. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * masm/IA32MacroAsm.h: Removed. - * masm/MacroAssembler.h: - (KJS::MacroAssembler::MacroAssembler): - * masm/MacroAssemblerWin.cpp: - (KJS::MacroAssembler::emitRestoreArgumentReference): - * masm/X86Assembler.h: Copied from masm/IA32MacroAsm.h. - (KJS::X86Assembler::X86Assembler): - * wrec/WREC.cpp: - (KJS::WRECGenerator::generateNonGreedyQuantifier): - (KJS::WRECGenerator::generateGreedyQuantifier): - (KJS::WRECGenerator::generateParentheses): - (KJS::WRECGenerator::generateBackreference): - (KJS::WRECGenerator::gernerateDisjunction): - * wrec/WREC.h: - -2008-09-07 Cameron Zwarich <cwzwarich@webkit.org> - - Not reviewed. - - Visual C++ seems to have some odd casting rules, so just convert the - offending cast back to a C-style cast for now. - - * kjs/collector.cpp: - (KJS::otherThreadStackPointer): - -2008-09-07 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Mark Rowe. - - Attempt to fix the Windows build by using a const_cast to cast regs.Esp - to a uintptr_t instead of a reinterpret_cast. - - * kjs/collector.cpp: - (KJS::otherThreadStackPointer): - -2008-09-07 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Sam Weinig. - - Remove C-style casts from kjs/collector.cpp. - - * kjs/collector.cpp: - (KJS::Heap::heapAllocate): - (KJS::currentThreadStackBase): - (KJS::Heap::markConservatively): - (KJS::otherThreadStackPointer): - (KJS::Heap::markOtherThreadConservatively): - (KJS::Heap::sweep): - -2008-09-07 Mark Rowe <mrowe@apple.com> - - Build fix for the debug variant. - - * DerivedSources.make: Also use the .Debug.exp exports file when building the debug variant. - -2008-09-07 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Timothy Hatcher. - - Remove C-style casts from the CTI code. - - * VM/CTI.cpp: - (KJS::CTI::emitGetArg): - (KJS::CTI::emitGetPutArg): - (KJS::ctiRepatchCallByReturnAddress): - (KJS::CTI::compileOpCall): - (KJS::CTI::privateCompileMainPass): - (KJS::CTI::privateCompileGetByIdSelf): - (KJS::CTI::privateCompileGetByIdProto): - (KJS::CTI::privateCompileGetByIdChain): - (KJS::CTI::privateCompilePutByIdReplace): - (KJS::CTI::privateArrayLengthTrampoline): - (KJS::CTI::privateStringLengthTrampoline): - -=== End merge of squirrelfish-extreme === - -2008-09-06 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Sam Weinig. Adapted somewhat by Maciej Stachowiak. - - - refactor WREC to share more of the JIT infrastructure with CTI - - * VM/CTI.cpp: - (KJS::CTI::emitGetArg): - (KJS::CTI::emitGetPutArg): - (KJS::CTI::emitPutArg): - (KJS::CTI::emitPutArgConstant): - (KJS::CTI::emitPutCTIParam): - (KJS::CTI::emitGetCTIParam): - (KJS::CTI::emitPutToCallFrameHeader): - (KJS::CTI::emitGetFromCallFrameHeader): - (KJS::CTI::emitPutResult): - (KJS::CTI::emitDebugExceptionCheck): - (KJS::CTI::emitJumpSlowCaseIfNotImm): - (KJS::CTI::emitJumpSlowCaseIfNotImms): - (KJS::CTI::emitFastArithDeTagImmediate): - (KJS::CTI::emitFastArithReTagImmediate): - (KJS::CTI::emitFastArithPotentiallyReTagImmediate): - (KJS::CTI::emitFastArithImmToInt): - (KJS::CTI::emitFastArithIntToImmOrSlowCase): - (KJS::CTI::emitFastArithIntToImmNoCheck): - (KJS::CTI::CTI): - (KJS::CTI::compileOpCall): - (KJS::CTI::privateCompileMainPass): - (KJS::CTI::privateCompileSlowCases): - (KJS::CTI::privateCompile): - (KJS::CTI::privateCompileGetByIdSelf): - (KJS::CTI::privateCompileGetByIdProto): - (KJS::CTI::privateCompileGetByIdChain): - (KJS::CTI::privateCompilePutByIdReplace): - (KJS::CTI::privateArrayLengthTrampoline): - (KJS::CTI::privateStringLengthTrampoline): - (KJS::CTI::compileRegExp): - * VM/CTI.h: - (KJS::CallRecord::CallRecord): - (KJS::JmpTable::JmpTable): - (KJS::SlowCaseEntry::SlowCaseEntry): - (KJS::CTI::JSRInfo::JSRInfo): - * kjs/regexp.cpp: - (KJS::RegExp::RegExp): - * wrec/WREC.cpp: - (KJS::GenerateParenthesesNonGreedyFunctor::GenerateParenthesesNonGreedyFunctor): - (KJS::GeneratePatternCharacterFunctor::generateAtom): - (KJS::GeneratePatternCharacterFunctor::backtrack): - (KJS::GenerateCharacterClassFunctor::generateAtom): - (KJS::GenerateCharacterClassFunctor::backtrack): - (KJS::GenerateBackreferenceFunctor::generateAtom): - (KJS::GenerateBackreferenceFunctor::backtrack): - (KJS::GenerateParenthesesNonGreedyFunctor::generateAtom): - (KJS::GenerateParenthesesNonGreedyFunctor::backtrack): - (KJS::WRECGenerate::generateBacktrack1): - (KJS::WRECGenerate::generateBacktrackBackreference): - (KJS::WRECGenerate::generateBackreferenceQuantifier): - (KJS::WRECGenerate::generateNonGreedyQuantifier): - (KJS::WRECGenerate::generateGreedyQuantifier): - (KJS::WRECGenerate::generatePatternCharacter): - (KJS::WRECGenerate::generateCharacterClassInvertedRange): - (KJS::WRECGenerate::generateCharacterClassInverted): - (KJS::WRECGenerate::generateCharacterClass): - (KJS::WRECGenerate::generateParentheses): - (KJS::WRECGenerate::generateParenthesesNonGreedy): - (KJS::WRECGenerate::gererateParenthesesResetTrampoline): - (KJS::WRECGenerate::generateAssertionBOL): - (KJS::WRECGenerate::generateAssertionEOL): - (KJS::WRECGenerate::generateAssertionWordBoundary): - (KJS::WRECGenerate::generateBackreference): - (KJS::WRECGenerate::gernerateDisjunction): - (KJS::WRECGenerate::terminateDisjunction): - (KJS::WRECParser::parseGreedyQuantifier): - (KJS::WRECParser::parseQuantifier): - (KJS::WRECParser::parsePatternCharacterQualifier): - (KJS::WRECParser::parseCharacterClassQuantifier): - (KJS::WRECParser::parseBackreferenceQuantifier): - (KJS::WRECParser::parseParentheses): - (KJS::WRECParser::parseCharacterClass): - (KJS::WRECParser::parseOctalEscape): - (KJS::WRECParser::parseEscape): - (KJS::WRECParser::parseTerm): - (KJS::WRECParser::parseDisjunction): - * wrec/WREC.h: - (KJS::WRECGenerate::WRECGenerate): - (KJS::WRECParser::): - (KJS::WRECParser::WRECParser): - (KJS::WRECParser::parseAlternative): - (KJS::WRECParser::isEndOfPattern): - -2008-09-06 Oliver Hunt <oliver@apple.com> - - Reviewed by NOBODY (Build fix). - - Fix the sampler build. - - * VM/SamplingTool.h: - -2008-09-06 Oliver Hunt <oliver@apple.com> - - Reviewed by Maciej Stachowiak. - - Jump through the necessary hoops required to make MSVC cooperate with SFX - - We now explicitly declare the calling convention on all cti_op_* cfunctions, - and return int instead of bool where appropriate (despite the cdecl calling - convention seems to state MSVC generates code that returns the result value - through ecx). SFX behaves slightly differently under MSVC, specifically it - stores the base argument address for the cti_op_* functions in the first - argument, and then does the required stack manipulation through that pointer. - This is necessary as MSVC's optimisations assume they have complete control - of the stack, and periodically elide our stack manipulations, or move - values in unexpected ways. MSVC also frequently produces tail calls which may - clobber the first argument, so the MSVC path is slightly less efficient due - to the need to restore it. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/CTI.cpp: - (KJS::): - (KJS::CTI::compileOpCall): - (KJS::CTI::privateCompileMainPass): - (KJS::CTI::privateCompileSlowCases): - * VM/CTI.h: - * VM/Machine.cpp: - * VM/Machine.h: - * masm/MacroAssembler.h: - (KJS::MacroAssembler::emitConvertToFastCall): - * masm/MacroAssemblerIA32GCC.cpp: Removed. - For performance reasons we need these no-op functions to be inlined. - - * masm/MacroAssemblerWin.cpp: - (KJS::MacroAssembler::emitRestoreArgumentReference): - * wtf/Platform.h: - -2008-09-05 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Maciej Stachowiak, or maybe the other way around. - - Added the ability to coalesce JITCode buffer grow operations by first - growing the buffer and then executing unchecked puts to it. - - About a 2% speedup on date-format-tofte. - - * VM/CTI.cpp: - (KJS::CTI::compileOpCall): - * masm/IA32MacroAsm.h: - (KJS::JITCodeBuffer::ensureSpace): - (KJS::JITCodeBuffer::putByteUnchecked): - (KJS::JITCodeBuffer::putByte): - (KJS::JITCodeBuffer::putShortUnchecked): - (KJS::JITCodeBuffer::putShort): - (KJS::JITCodeBuffer::putIntUnchecked): - (KJS::JITCodeBuffer::putInt): - (KJS::IA32MacroAssembler::emitTestl_i32r): - (KJS::IA32MacroAssembler::emitMovl_mr): - (KJS::IA32MacroAssembler::emitMovl_rm): - (KJS::IA32MacroAssembler::emitMovl_i32m): - (KJS::IA32MacroAssembler::emitUnlinkedJe): - (KJS::IA32MacroAssembler::emitModRm_rr): - (KJS::IA32MacroAssembler::emitModRm_rr_Unchecked): - (KJS::IA32MacroAssembler::emitModRm_rm_Unchecked): - (KJS::IA32MacroAssembler::emitModRm_rm): - (KJS::IA32MacroAssembler::emitModRm_opr): - (KJS::IA32MacroAssembler::emitModRm_opr_Unchecked): - (KJS::IA32MacroAssembler::emitModRm_opm_Unchecked): - -2008-09-05 Mark Rowe <mrowe@apple.com> - - Reviewed by Sam Weinig. - - Disable WREC and CTI on platforms that we have not yet had a chance to test with. - - * wtf/Platform.h: - -2008-09-05 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Use jo instead of a mask compare when fetching array.length and - string.length. 4% speedup on array.length / string.length torture - test. - - * VM/CTI.cpp: - (KJS::CTI::privateArrayLengthTrampoline): - (KJS::CTI::privateStringLengthTrampoline): - -2008-09-05 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Removed a CTI compilation pass by recording labels during bytecode - generation. This is more to reduce complexity than it is to improve - performance. - - SunSpider reports no change. - - CodeBlock now keeps a "labels" set, which holds the offsets of all the - instructions that can be jumped to. - - * VM/CTI.cpp: Nixed a pass. - - * VM/CodeBlock.h: Added a "labels" set. - - * VM/LabelID.h: No need for a special LableID for holding jump - destinations, since the CodeBlock now knows all jump destinations. - - * wtf/HashTraits.h: New hash traits to accomodate putting offset 0 in - the set. - - * kjs/nodes.cpp: - (KJS::TryNode::emitCode): Emit a dummy label to record sret targets. - -2008-09-05 Mark Rowe <mrowe@apple.com> - - Reviewed by Oliver Hunt and Gavin Barraclough. - - Move the JITCodeBuffer onto Machine and remove the static variables. - - * VM/CTI.cpp: Initialize m_jit with the Machine's code buffer. - * VM/Machine.cpp: - (KJS::Machine::Machine): Allocate a JITCodeBuffer. - * VM/Machine.h: - * kjs/RegExpConstructor.cpp: - (KJS::constructRegExp): Pass the ExecState through. - * kjs/RegExpPrototype.cpp: - (KJS::regExpProtoFuncCompile): Ditto. - * kjs/StringPrototype.cpp: - (KJS::stringProtoFuncMatch): Ditto. - (KJS::stringProtoFuncSearch): Ditto. - * kjs/nodes.cpp: - (KJS::RegExpNode::emitCode): Compile the pattern at code generation time - so that we have access to an ExecState. - * kjs/nodes.h: - (KJS::RegExpNode::): - * kjs/nodes2string.cpp: - * kjs/regexp.cpp: - (KJS::RegExp::RegExp): Pass the ExecState through. - (KJS::RegExp::create): Ditto. - * kjs/regexp.h: - * masm/IA32MacroAsm.h: - (KJS::IA32MacroAssembler::IA32MacroAssembler): Reset the JITCodeBuffer when we are - constructed. - * wrec/WREC.cpp: - (KJS::WRECompiler::compile): Retrieve the JITCodeBuffer from the Machine. - * wrec/WREC.h: - -2008-09-05 Mark Rowe <mrowe@apple.com> - - Reviewed by Oliver Hunt and Gavin Barraclough. - - Fix the build when CTI is disabled. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::~CodeBlock): - * VM/CodeGenerator.cpp: - (KJS::prepareJumpTableForStringSwitch): - * VM/Machine.cpp: - (KJS::Machine::Machine): - (KJS::Machine::~Machine): - -2008-09-05 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Mark Rowe. - - Fix some windows abi issues. - - * VM/CTI.cpp: - (KJS::CTI::privateCompileMainPass): - (KJS::CTI::privateCompileSlowCases): - * VM/CTI.h: - (KJS::CallRecord::CallRecord): - (KJS::): - * VM/Machine.cpp: - (KJS::Machine::cti_op_resolve_func): - (KJS::Machine::cti_op_post_inc): - (KJS::Machine::cti_op_resolve_with_base): - (KJS::Machine::cti_op_post_dec): - * VM/Machine.h: - -2008-09-05 Mark Rowe <mrowe@apple.com> - - Reviewed by Sam Weinig. - - Fix ecma/FunctionObjects/15.3.5.3.js after I broke it in r93. - - * VM/Machine.cpp: - (KJS::Machine::cti_op_call_NotJSFunction): Restore m_callFrame to the correct value after making the native call. - (KJS::Machine::cti_op_construct_NotJSConstruct): Ditto. - -2008-09-04 Mark Rowe <mrowe@apple.com> - - Reviewed by Sam Weinig. - - Fix fast/dom/Window/console-functions.html. - - The call frame on the ExecState was not being updated on calls into native functions. This meant that functions - such as console.log would use the line number of the last JS function on the call stack. - - * VM/Machine.cpp: - (KJS::Machine::cti_op_call_NotJSFunction): Update the ExecState's call frame before making a native function call, - and restore it when the function is done. - (KJS::Machine::cti_op_construct_NotJSConstruct): Ditto. - -2008-09-05 Oliver Hunt <oliver@apple.com> - - Start bringing up SFX on windows. - - Reviewed by Mark Rowe and Sam Weinig - - Start doing the work to bring up SFX on windows. Initially - just working on WREC, as it does not make any calls so reduces - the amount of code that needs to be corrected. - - Start abstracting the CTI JIT codegen engine. - - * ChangeLog: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/CTI.cpp: - * masm/IA32MacroAsm.h: - * masm/MacroAssembler.h: Added. - (KJS::MacroAssembler::MacroAssembler): - * masm/MacroAssemblerIA32GCC.cpp: Added. - (KJS::MacroAssembler::emitConvertToFastCall): - * masm/MacroAssemblerWin.cpp: Added. - (KJS::MacroAssembler::emitConvertToFastCall): - * wrec/WREC.cpp: - (KJS::WRECompiler::parseGreedyQuantifier): - (KJS::WRECompiler::parseCharacterClass): - (KJS::WRECompiler::parseEscape): - (KJS::WRECompiler::compilePattern): - * wrec/WREC.h: - -2008-09-04 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Sam Weinig. - - Support for slow scripts (timeout checking). - - * VM/CTI.cpp: - (KJS::CTI::privateCompileMainPass): - (KJS::CTI::privateCompile): - * VM/Machine.cpp: - (KJS::slideRegisterWindowForCall): - (KJS::Machine::cti_timeout_check): - (KJS::Machine::cti_vm_throw): - -2008-09-04 Sam Weinig <sam@webkit.org> - - Reviewed by Mark Rowe. - - Third round of style cleanup. - - * VM/CTI.cpp: - * VM/CTI.h: - * VM/CodeBlock.h: - * VM/Machine.cpp: - * VM/Machine.h: - * kjs/ExecState.h: - -2008-09-04 Sam Weinig <sam@webkit.org> - - Reviewed by Jon Honeycutt. - - Second round of style cleanup. - - * VM/CTI.cpp: - * VM/CTI.h: - * wrec/WREC.h: - -2008-09-04 Sam Weinig <sam@webkit.org> - - Reviewed by Mark Rowe. - - First round of style cleanup. - - * VM/CTI.cpp: - * VM/CTI.h: - * masm/IA32MacroAsm.h: - * wrec/WREC.cpp: - * wrec/WREC.h: - -2008-09-04 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Mark Rowe. - - Merged http://trac.webkit.org/changeset/36081 to work with CTI. - - * VM/Machine.cpp: - (KJS::Machine::tryCtiCacheGetByID): - -2008-09-04 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Sam Weinig. - - Enable profiling in CTI. - - * VM/CTI.h: - (KJS::): - (KJS::CTI::execute): - * VM/Machine.cpp: - (KJS::Machine::cti_op_call_JSFunction): - (KJS::Machine::cti_op_call_NotJSFunction): - (KJS::Machine::cti_op_ret): - (KJS::Machine::cti_op_construct_JSConstruct): - (KJS::Machine::cti_op_construct_NotJSConstruct): - -2008-09-04 Victor Hernandez <vhernandez@apple.com> - - Reviewed by Geoffrey Garen. - - Fixed an #if to support using WREC without CTI. - - * kjs/regexp.cpp: - (KJS::RegExp::match): - -2008-09-04 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - The array/string length trampolines are owned by the Machine, not the codeblock that compiled them. - - * VM/CTI.cpp: - (KJS::CTI::privateArrayLengthTrampoline): - (KJS::CTI::privateStringLengthTrampoline): - * VM/Machine.cpp: - (KJS::Machine::~Machine): - * VM/Machine.h: - -2008-09-04 Mark Rowe <mrowe@apple.com> - - Reviewed by Gavin Barraclough and Sam Weinig. - - Fix a crash on launch of jsc when GuardMalloc is enabled. - - * kjs/ScopeChain.h: - (KJS::ScopeChain::ScopeChain): Initialize m_node to 0 when we have no valid scope chain. - (KJS::ScopeChain::~ScopeChain): Null-check m_node before calling deref. - -2008-09-03 Oliver Hunt <oliver@apple.com> - - Reviewed by Gavin Barraclough and Geoff Garen. - - Fix inspector and fast array access so that it bounds - checks correctly. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass2_Main): - * masm/IA32MacroAsm.h: - (KJS::IA32MacroAssembler::): - (KJS::IA32MacroAssembler::emitUnlinkedJb): - (KJS::IA32MacroAssembler::emitUnlinkedJbe): - -2008-09-03 Mark Rowe <mrowe@apple.com> - - Move the assertion after the InitializeAndReturn block, as - that is used even when CTI is enabled. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-09-03 Mark Rowe <mrowe@apple.com> - - Reviewed by Sam Weinig. - - Replace calls to exit with ASSERT_WITH_MESSAGE or ASSERT_NOT_REACHED. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass1_Scan): - (KJS::CTI::privateCompile_pass2_Main): - (KJS::CTI::privateCompile_pass4_SlowCases): - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - (KJS::Machine::cti_vm_throw): - -2008-09-03 Mark Rowe <mrowe@apple.com> - - Reviewed by Sam Weinig. - - Tweak JavaScriptCore to compile on non-x86 platforms. This is achieved - by wrapping more code with ENABLE(CTI), ENABLE(WREC), and PLATFORM(X86) - #if's. - - * VM/CTI.cpp: - * VM/CTI.h: - * VM/CodeBlock.cpp: - (KJS::CodeBlock::printStructureIDs): Use %td as the format specifier for - printing a ptrdiff_t. - * VM/Machine.cpp: - * VM/Machine.h: - * kjs/regexp.cpp: - (KJS::RegExp::RegExp): - (KJS::RegExp::~RegExp): - (KJS::RegExp::match): - * kjs/regexp.h: - * masm/IA32MacroAsm.h: - * wrec/WREC.cpp: - * wrec/WREC.h: - * wtf/Platform.h: Only enable CTI and WREC on x86. Add an extra define to - track whether any MASM-using features are enabled. - -2008-09-03 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Copy Geoff's array/string length optimization for CTI. - - * VM/CTI.cpp: - (KJS::CTI::privateArrayLengthTrampoline): - (KJS::CTI::privateStringLengthTrampoline): - * VM/CTI.h: - (KJS::CTI::compileArrayLengthTrampoline): - (KJS::CTI::compileStringLengthTrampoline): - * VM/Machine.cpp: - (KJS::Machine::Machine): - (KJS::Machine::getCtiArrayLengthTrampoline): - (KJS::Machine::getCtiStringLengthTrampoline): - (KJS::Machine::tryCtiCacheGetByID): - (KJS::Machine::cti_op_get_by_id_second): - * VM/Machine.h: - * kjs/JSString.h: - * kjs/ustring.h: - -2008-09-03 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Implement fast array accesses in CTI - 2-3% progression on sunspider. - - * VM/CTI.cpp: - (KJS::CTI::emitFastArithIntToImmNoCheck): - (KJS::CTI::compileOpCall): - (KJS::CTI::privateCompile_pass2_Main): - (KJS::CTI::privateCompile_pass4_SlowCases): - * VM/CTI.h: - * kjs/JSArray.h: - -2008-09-02 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Enable fast property access support in CTI. - - * VM/CTI.cpp: - (KJS::ctiSetReturnAddress): - (KJS::ctiRepatchCallByReturnAddress): - (KJS::CTI::privateCompile_pass2_Main): - (KJS::CTI::privateCompile): - (KJS::CTI::privateCompileGetByIdSelf): - (KJS::CTI::privateCompileGetByIdProto): - (KJS::CTI::privateCompileGetByIdChain): - (KJS::CTI::privateCompilePutByIdReplace): - * VM/CTI.h: - (KJS::CTI::compileGetByIdSelf): - (KJS::CTI::compileGetByIdProto): - (KJS::CTI::compileGetByIdChain): - (KJS::CTI::compilePutByIdReplace): - * VM/CodeBlock.cpp: - (KJS::CodeBlock::~CodeBlock): - * VM/CodeBlock.h: - * VM/Machine.cpp: - (KJS::doSetReturnAddressVmThrowTrampoline): - (KJS::Machine::tryCtiCachePutByID): - (KJS::Machine::tryCtiCacheGetByID): - (KJS::Machine::cti_op_put_by_id): - (KJS::Machine::cti_op_put_by_id_second): - (KJS::Machine::cti_op_put_by_id_generic): - (KJS::Machine::cti_op_put_by_id_fail): - (KJS::Machine::cti_op_get_by_id): - (KJS::Machine::cti_op_get_by_id_second): - (KJS::Machine::cti_op_get_by_id_generic): - (KJS::Machine::cti_op_get_by_id_fail): - (KJS::Machine::cti_op_throw): - (KJS::Machine::cti_vm_throw): - * VM/Machine.h: - * kjs/JSCell.h: - * kjs/JSObject.h: - * kjs/PropertyMap.h: - * kjs/StructureID.cpp: - (KJS::StructureIDChain::StructureIDChain): - * masm/IA32MacroAsm.h: - (KJS::IA32MacroAssembler::emitCmpl_i32m): - (KJS::IA32MacroAssembler::emitMovl_mr): - (KJS::IA32MacroAssembler::emitMovl_rm): - -2008-09-02 Sam Weinig <sam@webkit.org> - - Reviewed by Gavin Barraclough and Mark Rowe. - - A backslash (\) at the of a RegEx should produce an error. - Fixes fast/regex/test1.html. - - * wrec/WREC.cpp: - (KJS::WRECompiler::parseEscape): - -2008-09-02 Sam Weinig <sam@webkit.org> - - Reviewed by Geoff Garen. - - Link jumps for the slow case of op_loop_if_less. Fixes acid3. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass4_SlowCases): - -2008-09-01 Sam Weinig <sam@webkit.org> - - Rubber-stamped by Maciej Stachowiak. - - Switch WREC on by default. - - * wtf/Platform.h: - -2008-09-01 Sam Weinig <sam@webkit.org> - - Reviewed by Mark Rowe. - - Fix two failures in fast/regex/test1.html - - \- in a character class should be treated as a literal - - - A missing max quantifier needs to be treated differently than - a null max quantifier. - - * wrec/WREC.cpp: - (KJS::WRECompiler::generateNonGreedyQuantifier): - (KJS::WRECompiler::generateGreedyQuantifier): - (KJS::WRECompiler::parseCharacterClass): - * wrec/WREC.h: - (KJS::Quantifier::Quantifier): - -2008-09-01 Sam Weinig <sam@webkit.org> - - Reviewed by Mark Rowe. - - Fix crash in fast/js/kde/evil-n.html - - * kjs/regexp.cpp: Always pass a non-null offset vector to the wrec function. - -2008-09-01 Sam Weinig <sam@webkit.org> - - Reviewed by Gavin Barraclough and Mark Rowe. - - Add pattern length limit fixing one test in fast/js. - - * wrec/WREC.cpp: - (KJS::WRECompiler::compile): - * wrec/WREC.h: - (KJS::WRECompiler::): - -2008-09-01 Sam Weinig <sam@webkit.org> - - Reviewed by Gavin Barraclough and Mark Rowe. - - Make octal escape parsing/back-reference parsing more closely match - prior behavior fixing one test in fast/js. - - * wrec/WREC.cpp: - (KJS::WRECompiler::parseCharacterClass): 8 and 9 should be IdentityEscaped - (KJS::WRECompiler::parseEscape): - * wrec/WREC.h: - (KJS::WRECompiler::peekDigit): - -2008-09-01 Sam Weinig <sam@webkit.org> - - Reviewed by Gavin Barraclough and Mark Rowe. - - Fix one mozilla test. - - * wrec/WREC.cpp: - (KJS::WRECompiler::generateCharacterClassInverted): Fix incorrect not - ascii upper check. - -2008-09-01 Sam Weinig <sam@webkit.org> - - Reviewed by Gavin Barraclough and Mark Rowe. - - Parse octal escapes in character classes fixing one mozilla test. - - * wrec/WREC.cpp: - (KJS::WRECompiler::parseCharacterClass): - (KJS::WRECompiler::parseOctalEscape): - * wrec/WREC.h: - (KJS::WRECompiler::consumeOctal): - -2008-09-01 Sam Weinig <sam@webkit.org> - - Reviewed by Oliver Hunt. - - Fixes two mozilla tests with WREC enabled. - - * wrec/WREC.cpp: - (KJS::CharacterClassConstructor::append): Keep the character class sorted - when appending another character class. - -2008-09-01 Sam Weinig <sam@webkit.org> - - Reviewed by Gavin Barraclough and Mark Rowe. - - Fixes two mozilla tests with WREC enabled. - - * wrec/WREC.cpp: - (KJS::CharacterClassConstructor::addSortedRange): Insert the range at the correct position - instead of appending it to the end. - -2008-09-01 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Move cross-compilation unit call into NEVER_INLINE function. - - * VM/Machine.cpp: - (KJS::doSetReturnAddressVmThrowTrampoline): - -2008-09-01 Sam Weinig <sam@webkit.org> - - Reviewed by Gavin Barraclough and Geoff Garen. - - Fix one test in fast/js. - - * VM/Machine.cpp: - (KJS::Machine::cti_op_construct_NotJSConstruct): Throw a createNotAConstructorError, - instead of a createNotAFunctionError. - -2008-08-31 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Maciej Stachowiak. - - Zero-cost exception handling. This patch takes the exception checking - back of the hot path. When an exception occurs in a Machine::cti* - method, the return address to JIT code is recorded, and is then - overwritten with a pointer to a trampoline routine. When the method - returns the trampoline will cause the cti_vm_throw method to be invoked. - - cti_vm_throw uses the return address preserved above, to discover the - vPC of the bytecode that raised the exception (using a map build during - translation). From the VPC of the faulting bytecode the vPC of a catch - routine may be discovered (unwinding the stack where necesary), and then - a bytecode address for the catch routine is looked up. Final cti_vm_throw - overwrites its return address to JIT code again, to trampoline directly - to the catch routine. - - cti_op_throw is handled in a similar fashion. - - * VM/CTI.cpp: - (KJS::CTI::emitPutCTIParam): - (KJS::CTI::emitPutToCallFrameHeader): - (KJS::CTI::emitGetFromCallFrameHeader): - (KJS::ctiSetReturnAddressForArgs): - (KJS::CTI::emitDebugExceptionCheck): - (KJS::CTI::printOpcodeOperandTypes): - (KJS::CTI::emitCall): - (KJS::CTI::compileOpCall): - (KJS::CTI::privateCompile_pass2_Main): - (KJS::CTI::privateCompile): - * VM/CTI.h: - (KJS::CallRecord::CallRecord): - (KJS::): - (KJS::CTI::execute): - * VM/CodeBlock.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - (KJS::Machine::cti_op_instanceof): - (KJS::Machine::cti_op_call_NotJSFunction): - (KJS::Machine::cti_op_resolve): - (KJS::Machine::cti_op_resolve_func): - (KJS::Machine::cti_op_resolve_skip): - (KJS::Machine::cti_op_resolve_with_base): - (KJS::Machine::cti_op_throw): - (KJS::Machine::cti_op_in): - (KJS::Machine::cti_vm_throw): - * VM/RegisterFile.h: - (KJS::RegisterFile::): - * kjs/ExecState.h: - (KJS::ExecState::setCtiReturnAddress): - (KJS::ExecState::ctiReturnAddress): - * masm/IA32MacroAsm.h: - (KJS::IA32MacroAssembler::): - (KJS::IA32MacroAssembler::emitPushl_m): - (KJS::IA32MacroAssembler::emitPopl_m): - (KJS::IA32MacroAssembler::getRelocatedAddress): - -2008-08-31 Mark Rowe <mrowe@apple.com> - - Reviewed by Oliver Hunt. - - Fall back to PCRE for any regexp containing parentheses until we correctly backtrack within them. - - * wrec/WREC.cpp: - (KJS::WRECompiler::parseParentheses): - * wrec/WREC.h: - (KJS::WRECompiler::): - -2008-08-31 Mark Rowe <mrowe@apple.com> - - Reviewed by Oliver Hunt. - - Fix several issues within ecma_3/RegExp/perlstress-001.js with WREC enabled. - - * wrec/WREC.cpp: - (KJS::WRECompiler::generateNonGreedyQuantifier): Compare with the maximum quantifier count rather than the minimum. - (KJS::WRECompiler::generateAssertionEOL): Do a register-to-register comparison rather than immediate-to-register. - (KJS::WRECompiler::parseCharacterClass): Pass through the correct inversion flag. - -2008-08-30 Mark Rowe <mrowe@apple.com> - - Reviewed by Oliver Hunt. - - Re-fix the six remaining failures in the Mozilla JavaScript tests in a manner that does not kill performance. - This shows up as a 0.6% progression on SunSpider on my machine. - - Grow the JITCodeBuffer's underlying buffer when we run out of space rather than just bailing out. - - * VM/CodeBlock.h: - (KJS::CodeBlock::~CodeBlock): Switch to using fastFree now that JITCodeBuffer::copy uses fastMalloc. - * kjs/regexp.cpp: Ditto. - * masm/IA32MacroAsm.h: - (KJS::JITCodeBuffer::growBuffer): - (KJS::JITCodeBuffer::JITCodeBuffer): - (KJS::JITCodeBuffer::~JITCodeBuffer): - (KJS::JITCodeBuffer::putByte): - (KJS::JITCodeBuffer::putShort): - (KJS::JITCodeBuffer::putInt): - (KJS::JITCodeBuffer::reset): - (KJS::JITCodeBuffer::copy): - -2008-08-29 Oliver Hunt <oliver@apple.com> - - RS=Maciej - - Roll out previous patch as it causes a 5% performance regression - - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/CTI.cpp: - (KJS::getJCB): - (KJS::CTI::privateCompile): - * VM/CodeBlock.h: - (KJS::CodeBlock::~CodeBlock): - * masm/IA32MacroAsm.h: - (KJS::JITCodeBuffer::JITCodeBuffer): - (KJS::JITCodeBuffer::putByte): - (KJS::JITCodeBuffer::putShort): - (KJS::JITCodeBuffer::putInt): - (KJS::JITCodeBuffer::getEIP): - (KJS::JITCodeBuffer::start): - (KJS::JITCodeBuffer::getOffset): - (KJS::JITCodeBuffer::reset): - (KJS::JITCodeBuffer::copy): - (KJS::IA32MacroAssembler::emitModRm_rr): - (KJS::IA32MacroAssembler::emitModRm_rm): - (KJS::IA32MacroAssembler::emitModRm_rmsib): - (KJS::IA32MacroAssembler::IA32MacroAssembler): - (KJS::IA32MacroAssembler::emitInt3): - (KJS::IA32MacroAssembler::emitPushl_r): - (KJS::IA32MacroAssembler::emitPopl_r): - (KJS::IA32MacroAssembler::emitMovl_rr): - (KJS::IA32MacroAssembler::emitAddl_rr): - (KJS::IA32MacroAssembler::emitAddl_i8r): - (KJS::IA32MacroAssembler::emitAddl_i32r): - (KJS::IA32MacroAssembler::emitAddl_mr): - (KJS::IA32MacroAssembler::emitAndl_rr): - (KJS::IA32MacroAssembler::emitAndl_i32r): - (KJS::IA32MacroAssembler::emitCmpl_i8r): - (KJS::IA32MacroAssembler::emitCmpl_rr): - (KJS::IA32MacroAssembler::emitCmpl_rm): - (KJS::IA32MacroAssembler::emitCmpl_i32r): - (KJS::IA32MacroAssembler::emitCmpl_i32m): - (KJS::IA32MacroAssembler::emitCmpw_rm): - (KJS::IA32MacroAssembler::emitOrl_rr): - (KJS::IA32MacroAssembler::emitOrl_i8r): - (KJS::IA32MacroAssembler::emitSubl_rr): - (KJS::IA32MacroAssembler::emitSubl_i8r): - (KJS::IA32MacroAssembler::emitSubl_i32r): - (KJS::IA32MacroAssembler::emitSubl_mr): - (KJS::IA32MacroAssembler::emitTestl_i32r): - (KJS::IA32MacroAssembler::emitTestl_rr): - (KJS::IA32MacroAssembler::emitXorl_i8r): - (KJS::IA32MacroAssembler::emitXorl_rr): - (KJS::IA32MacroAssembler::emitSarl_i8r): - (KJS::IA32MacroAssembler::emitSarl_CLr): - (KJS::IA32MacroAssembler::emitShl_i8r): - (KJS::IA32MacroAssembler::emitShll_CLr): - (KJS::IA32MacroAssembler::emitMull_rr): - (KJS::IA32MacroAssembler::emitIdivl_r): - (KJS::IA32MacroAssembler::emitCdq): - (KJS::IA32MacroAssembler::emitMovl_mr): - (KJS::IA32MacroAssembler::emitMovzwl_mr): - (KJS::IA32MacroAssembler::emitMovl_rm): - (KJS::IA32MacroAssembler::emitMovl_i32r): - (KJS::IA32MacroAssembler::emitMovl_i32m): - (KJS::IA32MacroAssembler::emitLeal_mr): - (KJS::IA32MacroAssembler::emitRet): - (KJS::IA32MacroAssembler::emitJmpN_r): - (KJS::IA32MacroAssembler::emitJmpN_m): - (KJS::IA32MacroAssembler::emitCall): - (KJS::IA32MacroAssembler::label): - (KJS::IA32MacroAssembler::emitUnlinkedJmp): - (KJS::IA32MacroAssembler::emitUnlinkedJne): - (KJS::IA32MacroAssembler::emitUnlinkedJe): - (KJS::IA32MacroAssembler::emitUnlinkedJl): - (KJS::IA32MacroAssembler::emitUnlinkedJle): - (KJS::IA32MacroAssembler::emitUnlinkedJge): - (KJS::IA32MacroAssembler::emitUnlinkedJae): - (KJS::IA32MacroAssembler::emitUnlinkedJo): - (KJS::IA32MacroAssembler::link): - * wrec/WREC.cpp: - (KJS::WRECompiler::compilePattern): - (KJS::WRECompiler::compile): - * wrec/WREC.h: - -2008-08-29 Mark Rowe <mrowe@apple.com> - - Reviewed by Oliver Hunt. - - Have JITCodeBuffer manage a Vector containing the generated code so that it can grow - as needed when generating code for a large function. This fixes all six remaining failures - in Mozilla tests in both debug and release builds. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile): - * VM/CodeBlock.h: - (KJS::CodeBlock::~CodeBlock): - * masm/IA32MacroAsm.h: - (KJS::JITCodeBuffer::putByte): - (KJS::JITCodeBuffer::putShort): - (KJS::JITCodeBuffer::putInt): - (KJS::JITCodeBuffer::getEIP): - (KJS::JITCodeBuffer::start): - (KJS::JITCodeBuffer::getOffset): - (KJS::JITCodeBuffer::getCode): - (KJS::IA32MacroAssembler::emitModRm_rr): - * wrec/WREC.cpp: - (KJS::WRECompiler::compilePattern): - * wrec/WREC.h: - -2008-08-29 Mark Rowe <mrowe@apple.com> - - Reviewed by Oliver Hunt. - - Implement parsing of octal escapes in regular expressions. This fixes three Mozilla tests. - - * wrec/WREC.cpp: - (KJS::WRECompiler::parseOctalEscape): - (KJS::WRECompiler::parseEscape): Parse the escape sequence as an octal escape if it has a leading zero. - Add a FIXME about treating invalid backreferences as octal escapes in the future. - * wrec/WREC.h: - (KJS::WRECompiler::consumeNumber): Multiply by 10 rather than 0 so that we handle numbers with more than - one digit. - * wtf/ASCIICType.h: - (WTF::isASCIIOctalDigit): - -2008-08-29 Sam Weinig <sam@webkit.org> - - Reviewed by Mark Rowe. - - Pass vPC to instanceof method. Fixes 2 mozilla tests in debug. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass2_Main): - * VM/Machine.cpp: - (KJS::Machine::cti_op_instanceof): - -2008-08-29 Sam Weinig <sam@webkit.org> - - Reviewed by Mark Rowe. - - Pass vPCs to resolve methods for correct exception creation. Fixes - 17 mozilla tests in debug. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass2_Main): - * VM/CTI.h: - * VM/Machine.cpp: - (KJS::Machine::cti_op_resolve): - (KJS::Machine::cti_op_resolve_func): - (KJS::Machine::cti_op_resolve_skip): - (KJS::Machine::cti_op_resolve_with_base): - -2008-08-29 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Remembering to actually throw the exception passed to op throw helps. - Regressions 19 -> 6. - - * VM/Machine.cpp: - (KJS::Machine::cti_op_throw): - (KJS::Machine::cti_vm_throw): - -2008-08-29 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Sam Weinig. - - Support for exception unwinding the stack. - - Once upon a time, Sam asked me for a bettr ChangeLog entry. The return address - is now preserved on entry to a JIT code function (if we preserve lazily we need - restore the native return address during exception stack unwind). This takes - the number of regressions down from ~150 to 19. - - * VM/CTI.cpp: - (KJS::getJCB): - (KJS::CTI::emitExceptionCheck): - (KJS::CTI::compileOpCall): - (KJS::CTI::privateCompile_pass2_Main): - (KJS::CTI::privateCompile): - * VM/CTI.h: - (KJS::): - * VM/Machine.cpp: - (KJS::Machine::throwException): - (KJS::Machine::cti_op_call_JSFunction): - (KJS::Machine::cti_op_call_NotJSFunction): - (KJS::Machine::cti_op_construct_JSConstruct): - (KJS::Machine::cti_op_construct_NotJSConstruct): - (KJS::Machine::cti_op_throw): - (KJS::Machine::cti_vm_throw): - -2008-08-29 Mark Rowe <mrowe@apple.com> - - Reviewed by Oliver Hunt. - - Fix js1_2/regexp/word_boundary.js and four other Mozilla tests with WREC enabled. - - * wrec/WREC.cpp: - (KJS::WRECompiler::generateCharacterClassInvertedRange): If none of the exact matches - succeeded, jump to failure. - (KJS::WRECompiler::compilePattern): Restore and increment the current position stored - on the stack to ensure that it will be reset to the correct position after a failed - match has consumed input. - -2008-08-29 Mark Rowe <mrowe@apple.com> - - Reviewed by Oliver Hunt. - - Fix a hang in ecma_3/RegExp/15.10.2-1.js with WREC enabled. - A backreference with a quantifier would get stuck in an infinite - loop if the captured range was empty. - - * wrec/WREC.cpp: - (KJS::WRECompiler::generateBackreferenceQuantifier): If the captured range - was empty, do not attempt to match the backreference. - (KJS::WRECompiler::parseBackreferenceQuantifier): - * wrec/WREC.h: - (KJS::Quantifier::): - -2008-08-28 Sam Weinig <sam@webkit.org> - - Reviewed by Oliver Hunt. - - Implement op_debug. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass1_Scan): - (KJS::CTI::privateCompile_pass2_Main): - * VM/Machine.cpp: - (KJS::Machine::debug): - (KJS::Machine::privateExecute): - (KJS::Machine::cti_op_debug): - * VM/Machine.h: - -2008-08-28 Sam Weinig <sam@webkit.org> - - Reviewed by Gavin Barraclough and Geoff Garen. - - Implement op_switch_string fixing 1 mozilla test and one test in fast/js. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass1_Scan): - (KJS::CTI::privateCompile_pass2_Main): - (KJS::CTI::privateCompile): - * VM/CTI.h: - (KJS::SwitchRecord::): - (KJS::SwitchRecord::SwitchRecord): - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeBlock.h: - (KJS::ExpressionRangeInfo::): - (KJS::StringJumpTable::offsetForValue): - (KJS::StringJumpTable::ctiForValue): - (KJS::SimpleJumpTable::add): - (KJS::SimpleJumpTable::ctiForValue): - * VM/CodeGenerator.cpp: - (KJS::prepareJumpTableForStringSwitch): - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - (KJS::Machine::cti_op_switch_string): - * VM/Machine.h: - -2008-08-28 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Do not recurse on the machine stack when executing op_call. - - * VM/CTI.cpp: - (KJS::CTI::emitGetPutArg): - (KJS::CTI::emitPutArg): - (KJS::CTI::emitPutArgConstant): - (KJS::CTI::compileOpCall): - (KJS::CTI::privateCompile_pass2_Main): - (KJS::CTI::privateCompile): - * VM/CTI.h: - (KJS::): - (KJS::CTI::compile): - (KJS::CTI::execute): - (KJS::CTI::): - * VM/Machine.cpp: - (KJS::Machine::Machine): - (KJS::Machine::execute): - (KJS::Machine::cti_op_call_JSFunction): - (KJS::Machine::cti_op_call_NotJSFunction): - (KJS::Machine::cti_op_ret): - (KJS::Machine::cti_op_construct_JSConstruct): - (KJS::Machine::cti_op_construct_NotJSConstruct): - (KJS::Machine::cti_op_call_eval): - * VM/Machine.h: - * VM/Register.h: - (KJS::Register::Register): - * VM/RegisterFile.h: - (KJS::RegisterFile::): - * kjs/InternalFunction.h: - (KJS::InternalFunction::InternalFunction): - * kjs/JSFunction.h: - (KJS::JSFunction::JSFunction): - * kjs/ScopeChain.h: - (KJS::ScopeChain::ScopeChain): - * masm/IA32MacroAsm.h: - (KJS::IA32MacroAssembler::): - (KJS::IA32MacroAssembler::emitModRm_opm): - (KJS::IA32MacroAssembler::emitCmpl_i32m): - (KJS::IA32MacroAssembler::emitCallN_r): - -2008-08-28 Sam Weinig <sam@webkit.org> - - Reviewed by Mark Rowe. - - Exit instead of crashing in ctiUnsupported and ctiTimedOut. - - * VM/Machine.cpp: - (KJS::ctiUnsupported): - (KJS::ctiTimedOut): - -2008-08-28 Oliver Hunt <oliver@apple.com> - - Reviewed by Maciej Stachowiak. - - Implement codegen for op_jsr and op_sret. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass1_Scan): - (KJS::CTI::privateCompile_pass2_Main): - (KJS::CTI::privateCompile): - * VM/CTI.h: - (KJS::CTI::JSRInfo::JSRInfo): - * masm/IA32MacroAsm.h: - (KJS::IA32MacroAssembler::emitJmpN_m): - (KJS::IA32MacroAssembler::linkAbsoluteAddress): - -2008-08-28 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Initial support for exceptions (throw / catch must occur in same CodeBlock). - - * VM/CTI.cpp: - (KJS::CTI::emitExceptionCheck): - (KJS::CTI::emitCall): - (KJS::CTI::privateCompile_pass2_Main): - (KJS::CTI::privateCompile_pass4_SlowCases): - (KJS::CTI::privateCompile): - * VM/CTI.h: - * VM/CodeBlock.cpp: - (KJS::CodeBlock::nativeExceptionCodeForHandlerVPC): - * VM/CodeBlock.h: - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitCatch): - * VM/Machine.cpp: - (KJS::Machine::throwException): - (KJS::Machine::privateExecute): - (KJS::ctiUnsupported): - (KJS::ctiTimedOut): - (KJS::Machine::cti_op_add): - (KJS::Machine::cti_op_pre_inc): - (KJS::Machine::cti_timeout_check): - (KJS::Machine::cti_op_loop_if_less): - (KJS::Machine::cti_op_put_by_id): - (KJS::Machine::cti_op_get_by_id): - (KJS::Machine::cti_op_instanceof): - (KJS::Machine::cti_op_del_by_id): - (KJS::Machine::cti_op_mul): - (KJS::Machine::cti_op_call): - (KJS::Machine::cti_op_resolve): - (KJS::Machine::cti_op_construct): - (KJS::Machine::cti_op_get_by_val): - (KJS::Machine::cti_op_resolve_func): - (KJS::Machine::cti_op_sub): - (KJS::Machine::cti_op_put_by_val): - (KJS::Machine::cti_op_lesseq): - (KJS::Machine::cti_op_loop_if_true): - (KJS::Machine::cti_op_negate): - (KJS::Machine::cti_op_resolve_skip): - (KJS::Machine::cti_op_div): - (KJS::Machine::cti_op_pre_dec): - (KJS::Machine::cti_op_jless): - (KJS::Machine::cti_op_not): - (KJS::Machine::cti_op_jtrue): - (KJS::Machine::cti_op_post_inc): - (KJS::Machine::cti_op_eq): - (KJS::Machine::cti_op_lshift): - (KJS::Machine::cti_op_bitand): - (KJS::Machine::cti_op_rshift): - (KJS::Machine::cti_op_bitnot): - (KJS::Machine::cti_op_resolve_with_base): - (KJS::Machine::cti_op_mod): - (KJS::Machine::cti_op_less): - (KJS::Machine::cti_op_neq): - (KJS::Machine::cti_op_post_dec): - (KJS::Machine::cti_op_urshift): - (KJS::Machine::cti_op_bitxor): - (KJS::Machine::cti_op_bitor): - (KJS::Machine::cti_op_call_eval): - (KJS::Machine::cti_op_throw): - (KJS::Machine::cti_op_push_scope): - (KJS::Machine::cti_op_stricteq): - (KJS::Machine::cti_op_nstricteq): - (KJS::Machine::cti_op_to_jsnumber): - (KJS::Machine::cti_op_in): - (KJS::Machine::cti_op_del_by_val): - (KJS::Machine::cti_vm_throw): - * VM/Machine.h: - * kjs/ExecState.h: - * masm/IA32MacroAsm.h: - (KJS::IA32MacroAssembler::emitCmpl_i32m): - -2008-08-28 Mark Rowe <mrowe@apple.com> - - Rubber-stamped by Oliver Hunt. - - Print debugging info to stderr so that run-webkit-tests can capture it. - This makes it easy to check whether test failures are due to unimplemented - op codes, missing support for exceptions, etc. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass1_Scan): - (KJS::CTI::printOpcodeOperandTypes): - (KJS::CTI::privateCompile_pass2_Main): - (KJS::CTI::privateCompile_pass4_SlowCases): - (KJS::CTI::privateCompile): - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - (KJS::ctiException): - (KJS::ctiUnsupported): - (KJS::Machine::cti_op_call): - (KJS::Machine::cti_op_resolve): - (KJS::Machine::cti_op_construct): - (KJS::Machine::cti_op_get_by_val): - (KJS::Machine::cti_op_resolve_func): - (KJS::Machine::cti_op_resolve_skip): - (KJS::Machine::cti_op_resolve_with_base): - (KJS::Machine::cti_op_call_eval): - -2008-08-27 Mark Rowe <mrowe@apple.com> - - Reviewed by Gavin Barraclough and Maciej Stachowiak. - - Fix fast/js/bitwise-and-on-undefined.html. - - A temporary value in the slow path of op_bitand was being stored in edx, but was - being clobbered by emitGetPutArg before we used it. To fix this, emitGetPutArg - now takes a third argument that specifies the scratch register to use when loading - from memory. This allows us to avoid clobbering the temporary in op_bitand. - - * VM/CTI.cpp: - (KJS::CTI::emitGetPutArg): - (KJS::CTI::privateCompile_pass2_Main): - (KJS::CTI::privateCompile_pass4_SlowCases): - * VM/CTI.h: - -2008-08-27 Mark Rowe <mrowe@apple.com> - - Rubber-stamped by Oliver Hunt. - - Switch CTI on by default. - - * wtf/Platform.h: - -2008-08-27 Mark Rowe <mrowe@apple.com> - - Reviewed by Oliver Hunt. - - Fix the build of the full WebKit stack. - - * JavaScriptCore.xcodeproj/project.pbxproj: Mark two new headers as private so they can be pulled in from WebCore. - * VM/CTI.h: Fix build issues that show up when compiled with GCC 4.2 as part of WebCore. - * wrec/WREC.h: Ditto. - -2008-08-27 Mark Rowe <mrowe@apple.com> - - Reviewed by Sam Weinig. - - Implement op_new_error. Does not fix any tests as it is always followed by the unimplemented op_throw. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass1_Scan): - (KJS::CTI::privateCompile_pass2_Main): - * VM/Machine.cpp: - (KJS::Machine::cti_op_new_error): - * VM/Machine.h: - -2008-08-27 Sam Weinig <sam@webkit.org> - - Reviewed by Gavin Barraclough and Geoff Garen. - - Implement op_put_getter and op_put_setter. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass1_Scan): - (KJS::CTI::privateCompile_pass2_Main): - * VM/Machine.cpp: - (KJS::Machine::cti_op_put_getter): - (KJS::Machine::cti_op_put_setter): - * VM/Machine.h: - -2008-08-27 Sam Weinig <sam@webkit.org> - - Reviewed by Gavin Barraclough and Geoff Garen. - - Implement op_del_by_val fixing 3 mozilla tests. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass1_Scan): - (KJS::CTI::privateCompile_pass2_Main): - * VM/Machine.cpp: - (KJS::Machine::cti_op_del_by_val): - * VM/Machine.h: - -2008-08-27 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Quick & dirty fix to get SamplingTool sampling op_call. - - * VM/SamplingTool.h: - (KJS::SamplingTool::callingHostFunction): - -2008-08-27 Sam Weinig <sam@webkit.org> - - Reviewed by Gavin Barraclough and Geoff Garen. - - Fix op_put_by_index. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass2_Main): Use emitPutArgConstant instead of emitGetPutArg - for the property value. - * VM/Machine.cpp: - (KJS::Machine::cti_op_put_by_index): Get the property value from the correct argument. - -2008-08-27 Sam Weinig <sam@webkit.org> - - Reviewed by Gavin Barraclough and Geoff Garen. - - Implement op_switch_imm in the CTI fixing 13 mozilla tests. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass1_Scan): - (KJS::CTI::privateCompile_pass2_Main): - * VM/Machine.cpp: - (KJS::Machine::cti_op_switch_imm): - * VM/Machine.h: - -2008-08-27 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - Implement op_switch_char in CTI. - - * VM/CTI.cpp: - (KJS::CTI::emitCall): - (KJS::CTI::privateCompile_pass1_Scan): - (KJS::CTI::privateCompile_pass2_Main): - (KJS::CTI::privateCompile): - * VM/CTI.h: - (KJS::CallRecord::CallRecord): - (KJS::SwitchRecord::SwitchRecord): - * VM/CodeBlock.h: - (KJS::SimpleJumpTable::SimpleJumpTable::ctiForValue): - * VM/Machine.cpp: - (KJS::Machine::cti_op_switch_char): - * VM/Machine.h: - * masm/IA32MacroAsm.h: - (KJS::IA32MacroAssembler::): - (KJS::IA32MacroAssembler::emitJmpN_r): - (KJS::IA32MacroAssembler::getRelocatedAddress): - * wtf/Platform.h: - -2008-08-26 Sam Weinig <sam@webkit.org> - - Reviewed by Mark Rowe. - - Implement op_put_by_index to fix 1 mozilla test. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass1_Scan): - (KJS::CTI::privateCompile_pass2_Main): - * VM/Machine.cpp: - (KJS::Machine::cti_op_put_by_index): - * VM/Machine.h: - -2008-08-26 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. - - More fixes from Geoff's review. - - * VM/CTI.cpp: - (KJS::CTI::emitGetArg): - (KJS::CTI::emitGetPutArg): - (KJS::CTI::emitPutArg): - (KJS::CTI::emitPutArgConstant): - (KJS::CTI::getConstantImmediateNumericArg): - (KJS::CTI::emitGetCTIParam): - (KJS::CTI::emitPutResult): - (KJS::CTI::emitCall): - (KJS::CTI::emitJumpSlowCaseIfNotImm): - (KJS::CTI::emitJumpSlowCaseIfNotImms): - (KJS::CTI::getDeTaggedConstantImmediate): - (KJS::CTI::emitFastArithDeTagImmediate): - (KJS::CTI::emitFastArithReTagImmediate): - (KJS::CTI::emitFastArithPotentiallyReTagImmediate): - (KJS::CTI::emitFastArithImmToInt): - (KJS::CTI::emitFastArithIntToImmOrSlowCase): - (KJS::CTI::privateCompile_pass2_Main): - (KJS::CTI::privateCompile_pass4_SlowCases): - (KJS::CTI::privateCompile): - * VM/CTI.h: - -2008-08-26 Mark Rowe <mrowe@apple.com> - - Reviewed by Gavin Barraclough and Geoff Garen. - - Implement op_jmp_scopes to fix 2 Mozilla tests. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass1_Scan): - (KJS::CTI::privateCompile_pass2_Main): - * VM/Machine.cpp: - (KJS::Machine::cti_op_push_new_scope): Update ExecState::m_scopeChain after calling ARG_setScopeChain. - (KJS::Machine::cti_op_jmp_scopes): - * VM/Machine.h: - -2008-08-26 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Oliver Hunt. - - WebKit Regular Expression Compiler. (set ENABLE_WREC = 1 in Platform.h). - - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/regexp.cpp: - * kjs/regexp.h: - * wrec: Added. - * wrec/WREC.cpp: Added. - * wrec/WREC.h: Added. - * wtf/Platform.h: - -2008-08-26 Sam Weinig <sam@webkit.org> - - Rubber-stamped by Oliver Hunt. - - Remove bogus assertion. - - * VM/Machine.cpp: - (KJS::Machine::cti_op_del_by_id): - -2008-08-26 Mark Rowe <mrowe@apple.com> - - Reviewed by Sam Weinig. - - Implement op_push_new_scope and stub out op_catch. This fixes 11 Mozilla tests. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass1_Scan): - (KJS::CTI::privateCompile_pass2_Main): - * VM/Machine.cpp: - (KJS::Machine::cti_op_push_new_scope): - (KJS::Machine::cti_op_catch): - * VM/Machine.h: - -2008-08-26 Mark Rowe <mrowe@apple.com> - - Reviewed by Sam Weinig. - - Clean up op_resolve_base so that it shares its implementation with the bytecode interpreter. - - * VM/Machine.cpp: - (KJS::inlineResolveBase): - (KJS::resolveBase): - -2008-08-26 Oliver Hunt <oliver@apple.com> - - Reviewed by Sam Weinig. - - Add codegen support for op_instanceof, fixing 15 mozilla tests. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass1_Scan): - (KJS::CTI::privateCompile_pass2_Main): - * VM/Machine.cpp: - (KJS::Machine::cti_op_instanceof): - (KJS::Machine::cti_op_del_by_id): - * VM/Machine.h: - * wtf/Platform.h: - -2008-08-26 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. - - Fixes for initial review comments. - - * VM/CTI.cpp: - (KJS::CTI::ctiCompileGetArg): - (KJS::CTI::ctiCompileGetPutArg): - (KJS::CTI::ctiCompilePutResult): - (KJS::CTI::ctiCompileCall): - (KJS::CTI::CTI): - (KJS::CTI::privateCompile_pass1_Scan): - (KJS::CTI::printOpcodeOperandTypes): - (KJS::CTI::privateCompile_pass2_Main): - (KJS::CTI::privateCompile_pass4_SlowCases): - (KJS::CTI::privateCompile): - * VM/CTI.h: - * VM/Register.h: - * kjs/JSValue.h: - -2008-08-26 Sam Weinig <sam@webkit.org> - - Reviewed by Gavin Barraclough and Geoff Garen. - - Fix up exception checking code. - - * VM/Machine.cpp: - (KJS::Machine::cti_op_call): - (KJS::Machine::cti_op_resolve): - (KJS::Machine::cti_op_construct): - (KJS::Machine::cti_op_resolve_func): - (KJS::Machine::cti_op_resolve_skip): - (KJS::Machine::cti_op_resolve_with_base): - (KJS::Machine::cti_op_call_eval): - -2008-08-26 Sam Weinig <sam@webkit.org> - - Reviewed by Oliver Hunt. - - Fix slowcase for op_post_inc and op_post_dec fixing 2 mozilla tests. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass4_SlowCases): - -2008-08-26 Mark Rowe <mrowe@apple.com> - - Reviewed by Sam Weinig. - - Implement op_in, fixing 8 mozilla tests. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass1_Scan): - (KJS::CTI::privateCompile_pass2_Main): - * VM/Machine.cpp: - (KJS::Machine::cti_op_in): - * VM/Machine.h: - -2008-08-26 Mark Rowe <mrowe@apple.com> - - Rubber-stamped by Oliver Hunt. - - Don't hardcode the size of a Register for op_new_array. Fixes a crash - seen during the Mozilla tests. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass2_Main): - -2008-08-26 Sam Weinig <sam@webkit.org> - - Reviewed by Gavin Barraclough and Geoff Garen. - - Add support for op_push_scope and op_pop_scope, fixing 20 mozilla tests. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass1_Scan): - (KJS::CTI::privateCompile_pass2_Main): - * VM/CTI.h: - * VM/Machine.cpp: - (KJS::Machine::cti_op_push_scope): - (KJS::Machine::cti_op_pop_scope): - * VM/Machine.h: - -2008-08-26 Oliver Hunt <oliver@apple.com> - - Reviewed by Maciej Stachowiak. - - Add codegen support for op_del_by_id, fixing 49 mozilla tests. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass1_Scan): - (KJS::CTI::privateCompile_pass2_Main): - * VM/Machine.cpp: - (KJS::Machine::cti_op_del_by_id): - * VM/Machine.h: - -2008-08-26 Sam Weinig <sam@webkit.org> - - Reviewed by Gavin Barraclough and Geoff Garen. - - Don't hardcode the size of a Register for op_get_scoped_var and op_put_scoped_var - fixing 513 mozilla tests in debug build. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass2_Main): - -2008-08-26 Oliver Hunt <oliver@apple.com> - - Reviewed by Maciej Stachowiak. - - Added code generator support for op_loop, fixing around 60 mozilla tests. - - * VM/CTI.cpp: - (KJS::CTI::privateCompile_pass1_Scan): - (KJS::CTI::privateCompile_pass2_Main): - -2008-08-26 Mark Rowe <mrowe@apple.com> + (JSC::JSFunction::~JSFunction): + (JSC::JSFunction::mark): + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::~JSGlobalData): + * runtime/JSGlobalData.h: - Reviewed by Sam Weinig. +2009-06-18 Gavin Barraclough <barraclough@apple.com> - Set -fomit-frame-pointer in the correct location. + Reviewed by NOBODY (Windows build fix). - * Configurations/JavaScriptCore.xcconfig: - * JavaScriptCore.xcodeproj/project.pbxproj: + * wtf/DateMath.cpp: + (WTF::calculateUTCOffset): -2008-08-26 Gavin Barraclough <barraclough@apple.com> +2009-06-18 Gavin Barraclough <barraclough@apple.com> Reviewed by Geoff Garen. - - Inital cut of CTI, Geoff's review fixes to follow. - - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/CTI.cpp: Added. - (KJS::getJCB): - (KJS::CTI::ctiCompileGetArg): - (KJS::CTI::ctiCompileGetPutArg): - (KJS::CTI::ctiCompilePutArg): - (KJS::CTI::ctiCompilePutArgImm): - (KJS::CTI::ctiImmediateNumericArg): - (KJS::CTI::ctiCompileGetCTIParam): - (KJS::CTI::ctiCompilePutResult): - (KJS::CTI::ctiCompileCall): - (KJS::CTI::slowCaseIfNotImm): - (KJS::CTI::slowCaseIfNotImms): - (KJS::CTI::ctiFastArithDeTagConstImmediate): - (KJS::CTI::ctiFastArithDeTagImmediate): - (KJS::CTI::ctiFastArithReTagImmediate): - (KJS::CTI::ctiFastArithPotentiallyReTagImmediate): - (KJS::CTI::ctiFastArithImmToInt): - (KJS::CTI::ctiFastArithIntToImmOrSlowCase): - (KJS::CTI::CTI): - (KJS::CTI::privateCompile_pass1_Scan): - (KJS::CTI::ctiCompileAdd): - (KJS::CTI::ctiCompileAddImm): - (KJS::CTI::ctiCompileAddImmNotInt): - (KJS::CTI::TEMP_HACK_PRINT_TYPES): - (KJS::CTI::privateCompile_pass2_Main): - (KJS::CTI::privateCompile_pass3_Link): - (KJS::CTI::privateCompile_pass4_SlowCases): - (KJS::CTI::privateCompile): - * VM/CTI.h: Added. - (KJS::CTI2Result::CTI2Result): - (KJS::CallRecord::CallRecord): - (KJS::JmpTable::JmpTable): - (KJS::SlowCaseEntry::SlowCaseEntry): - (KJS::CTI::compile): - (KJS::CTI::LabelInfo::LabelInfo): - * VM/CodeBlock.h: - (KJS::CodeBlock::CodeBlock): - (KJS::CodeBlock::~CodeBlock): - * VM/Machine.cpp: - (KJS::Machine::execute): - (KJS::Machine::privateExecute): - (KJS::ctiException): - (KJS::ctiUnsupported): - (KJS::ctiTimedOut): - (KJS::Machine::cti_op_end): - (KJS::Machine::cti_op_add): - (KJS::Machine::cti_op_pre_inc): - (KJS::Machine::cti_timeout_check): - (KJS::Machine::cti_op_loop_if_less): - (KJS::Machine::cti_op_new_object): - (KJS::Machine::cti_op_put_by_id): - (KJS::Machine::cti_op_get_by_id): - (KJS::Machine::cti_op_mul): - (KJS::Machine::cti_op_new_func): - (KJS::Machine::cti_op_call): - (KJS::Machine::cti_op_ret): - (KJS::Machine::cti_op_new_array): - (KJS::Machine::cti_op_resolve): - (KJS::Machine::cti_op_construct): - (KJS::Machine::cti_op_get_by_val): - (KJS::Machine::cti_op_resolve_func): - (KJS::Machine::cti_op_sub): - (KJS::Machine::cti_op_put_by_val): - (KJS::Machine::cti_op_lesseq): - (KJS::Machine::cti_op_loop_if_true): - (KJS::Machine::cti_op_negate): - (KJS::Machine::cti_op_resolve_base): - (KJS::Machine::cti_op_resolve_skip): - (KJS::Machine::cti_op_div): - (KJS::Machine::cti_op_pre_dec): - (KJS::Machine::cti_op_jless): - (KJS::Machine::cti_op_not): - (KJS::Machine::cti_op_jtrue): - (KJS::Machine::cti_op_post_inc): - (KJS::Machine::cti_op_eq): - (KJS::Machine::cti_op_lshift): - (KJS::Machine::cti_op_bitand): - (KJS::Machine::cti_op_rshift): - (KJS::Machine::cti_op_bitnot): - (KJS::Machine::cti_op_resolve_with_base): - (KJS::Machine::cti_op_new_func_exp): - (KJS::Machine::cti_op_mod): - (KJS::Machine::cti_op_less): - (KJS::Machine::cti_op_neq): - (KJS::Machine::cti_op_post_dec): - (KJS::Machine::cti_op_urshift): - (KJS::Machine::cti_op_bitxor): - (KJS::Machine::cti_op_new_regexp): - (KJS::Machine::cti_op_bitor): - (KJS::Machine::cti_op_call_eval): - (KJS::Machine::cti_op_throw): - (KJS::Machine::cti_op_get_pnames): - (KJS::Machine::cti_op_next_pname): - (KJS::Machine::cti_op_typeof): - (KJS::Machine::cti_op_stricteq): - (KJS::Machine::cti_op_nstricteq): - (KJS::Machine::cti_op_to_jsnumber): - * VM/Machine.h: - * VM/Register.h: - (KJS::Register::jsValue): - (KJS::Register::getJSValue): - (KJS::Register::codeBlock): - (KJS::Register::scopeChain): - (KJS::Register::i): - (KJS::Register::r): - (KJS::Register::vPC): - (KJS::Register::jsPropertyNameIterator): - * VM/SamplingTool.cpp: - (KJS::): - (KJS::SamplingTool::run): - (KJS::SamplingTool::dump): - * VM/SamplingTool.h: - * kjs/JSImmediate.h: - (KJS::JSImmediate::zeroImmediate): - (KJS::JSImmediate::oneImmediate): - * kjs/JSValue.h: - * kjs/JSVariableObject.h: - (KJS::JSVariableObject::JSVariableObjectData::offsetOf_registers): - (KJS::JSVariableObject::offsetOf_d): - (KJS::JSVariableObject::offsetOf_Data_registers): - * masm: Added. - * masm/IA32MacroAsm.h: Added. - (KJS::JITCodeBuffer::JITCodeBuffer): - (KJS::JITCodeBuffer::putByte): - (KJS::JITCodeBuffer::putShort): - (KJS::JITCodeBuffer::putInt): - (KJS::JITCodeBuffer::getEIP): - (KJS::JITCodeBuffer::start): - (KJS::JITCodeBuffer::getOffset): - (KJS::JITCodeBuffer::reset): - (KJS::JITCodeBuffer::copy): - (KJS::IA32MacroAssembler::): - (KJS::IA32MacroAssembler::emitModRm_rr): - (KJS::IA32MacroAssembler::emitModRm_rm): - (KJS::IA32MacroAssembler::emitModRm_rmsib): - (KJS::IA32MacroAssembler::emitModRm_opr): - (KJS::IA32MacroAssembler::emitModRm_opm): - (KJS::IA32MacroAssembler::IA32MacroAssembler): - (KJS::IA32MacroAssembler::emitInt3): - (KJS::IA32MacroAssembler::emitPushl_r): - (KJS::IA32MacroAssembler::emitPopl_r): - (KJS::IA32MacroAssembler::emitMovl_rr): - (KJS::IA32MacroAssembler::emitAddl_rr): - (KJS::IA32MacroAssembler::emitAddl_i8r): - (KJS::IA32MacroAssembler::emitAddl_i32r): - (KJS::IA32MacroAssembler::emitAddl_mr): - (KJS::IA32MacroAssembler::emitAndl_rr): - (KJS::IA32MacroAssembler::emitAndl_i32r): - (KJS::IA32MacroAssembler::emitCmpl_i8r): - (KJS::IA32MacroAssembler::emitCmpl_rr): - (KJS::IA32MacroAssembler::emitCmpl_rm): - (KJS::IA32MacroAssembler::emitCmpl_i32r): - (KJS::IA32MacroAssembler::emitCmpw_rm): - (KJS::IA32MacroAssembler::emitOrl_rr): - (KJS::IA32MacroAssembler::emitOrl_i8r): - (KJS::IA32MacroAssembler::emitSubl_rr): - (KJS::IA32MacroAssembler::emitSubl_i8r): - (KJS::IA32MacroAssembler::emitSubl_i32r): - (KJS::IA32MacroAssembler::emitSubl_mr): - (KJS::IA32MacroAssembler::emitTestl_i32r): - (KJS::IA32MacroAssembler::emitTestl_rr): - (KJS::IA32MacroAssembler::emitXorl_i8r): - (KJS::IA32MacroAssembler::emitXorl_rr): - (KJS::IA32MacroAssembler::emitSarl_i8r): - (KJS::IA32MacroAssembler::emitSarl_CLr): - (KJS::IA32MacroAssembler::emitShl_i8r): - (KJS::IA32MacroAssembler::emitShll_CLr): - (KJS::IA32MacroAssembler::emitMull_rr): - (KJS::IA32MacroAssembler::emitIdivl_r): - (KJS::IA32MacroAssembler::emitCdq): - (KJS::IA32MacroAssembler::emitMovl_mr): - (KJS::IA32MacroAssembler::emitMovzwl_mr): - (KJS::IA32MacroAssembler::emitMovl_rm): - (KJS::IA32MacroAssembler::emitMovl_i32r): - (KJS::IA32MacroAssembler::emitMovl_i32m): - (KJS::IA32MacroAssembler::emitLeal_mr): - (KJS::IA32MacroAssembler::emitRet): - (KJS::IA32MacroAssembler::JmpSrc::JmpSrc): - (KJS::IA32MacroAssembler::JmpDst::JmpDst): - (KJS::IA32MacroAssembler::emitCall): - (KJS::IA32MacroAssembler::label): - (KJS::IA32MacroAssembler::emitUnlinkedJmp): - (KJS::IA32MacroAssembler::emitUnlinkedJne): - (KJS::IA32MacroAssembler::emitUnlinkedJe): - (KJS::IA32MacroAssembler::emitUnlinkedJl): - (KJS::IA32MacroAssembler::emitUnlinkedJle): - (KJS::IA32MacroAssembler::emitUnlinkedJge): - (KJS::IA32MacroAssembler::emitUnlinkedJae): - (KJS::IA32MacroAssembler::emitUnlinkedJo): - (KJS::IA32MacroAssembler::emitPredictionNotTaken): - (KJS::IA32MacroAssembler::link): - (KJS::IA32MacroAssembler::copy): - * wtf/Platform.h: - -2008-08-26 Oliver Hunt <oliver@apple.com> - - RS=Maciej. - - Enabled -fomit-frame-pointer on Release and Production builds, add additional Profiling build config for shark, etc. - - * JavaScriptCore.xcodeproj/project.pbxproj: - -=== Start merge of squirrelfish-extreme === - -2008-09-06 Cameron Zwarich <cwzwarich@uwaterloo.ca> - Reviewed by Maciej Stachowiak. - - Fix the Mac Debug build by adding symbols that are exported only in a - Debug configuration. - - * Configurations/JavaScriptCore.xcconfig: - * DerivedSources.make: - * JavaScriptCore.Debug.exp: Added. - * JavaScriptCore.base.exp: Copied from JavaScriptCore.exp. - * JavaScriptCore.exp: Removed. - * JavaScriptCore.xcodeproj/project.pbxproj: - -2008-09-05 Darin Adler <darin@apple.com> - - Reviewed by Cameron Zwarich. - - - https://bugs.webkit.org/show_bug.cgi?id=20681 - JSPropertyNameIterator functions need to be inlined - - 1.007x as fast on SunSpider overall - 1.081x as fast on SunSpider math-cordic - - * VM/JSPropertyNameIterator.cpp: Moved functions out of here. - * VM/JSPropertyNameIterator.h: - (KJS::JSPropertyNameIterator::JSPropertyNameIterator): Moved - this into the header and marked it inline. - (KJS::JSPropertyNameIterator::create): Ditto. - (KJS::JSPropertyNameIterator::next): Ditto. - -2008-09-05 Darin Adler <darin@apple.com> - - Reviewed by Geoffrey Garen. - - - fix https://bugs.webkit.org/show_bug.cgi?id=20673 - single-character strings are churning in the Identifier table - - 1.007x as fast on SunSpider overall - 1.167x as fast on SunSpider string-fasta - - * JavaScriptCore.exp: Updated. - * kjs/SmallStrings.cpp: - (KJS::SmallStrings::singleCharacterStringRep): Added. - * kjs/SmallStrings.h: Added singleCharacterStringRep for clients that - need just a UString, not a JSString. - * kjs/identifier.cpp: - (KJS::Identifier::add): Added special cases for single character strings - so that the UString::Rep that ends up in the identifier table is the one - from the single-character string optimization; otherwise we end up having - to look it up in the identifier table over and over again. - (KJS::Identifier::addSlowCase): Ditto. - (KJS::Identifier::checkSameIdentifierTable): Made this function an empty - inline in release builds so that callers don't have to put #ifndef NDEBUG - at each call site. - * kjs/identifier.h: - (KJS::Identifier::add): Removed #ifndef NDEBUG around the calls to - checkSameIdentifierTable. - (KJS::Identifier::checkSameIdentifierTable): Added. Empty inline version - for NDEBUG builds. - -2008-09-05 Mark Rowe <mrowe@apple.com> - - Build fix. - - * kjs/JSObject.h: Move the inline virtual destructor after a non-inline - virtual function so that the symbol for the vtable is not marked as a - weakly exported symbol. - -2008-09-05 Darin Adler <darin@apple.com> - - Reviewed by Sam Weinig. - - - fix https://bugs.webkit.org/show_bug.cgi?id=20671 - JavaScriptCore string manipulation spends too much time in memcpy - - 1.011x as fast on SunSpider overall - 1.028x as fast on SunSpider string tests - - For small strings, use a loop rather than calling memcpy. The loop can - be faster because there's no function call overhead, and because it can - assume the pointers are aligned instead of checking that. Currently the - threshold is set at 20 characters, based on some testing on one particular - computer. Later we can tune this for various platforms by setting - USTRING_COPY_CHARS_INLINE_CUTOFF appropriately, but it does no great harm - if not perfectly tuned. - - * kjs/ustring.cpp: - (KJS::overflowIndicator): Removed bogus const. - (KJS::maxUChars): Ditto. - (KJS::copyChars): Added. - (KJS::UString::Rep::createCopying): Call copyChars instead of memcpy. - Also eliminated need for const_cast. - (KJS::UString::expandPreCapacity): Ditto. - (KJS::concatenate): Ditto. - (KJS::UString::spliceSubstringsWithSeparators): Ditto. - (KJS::UString::append): Ditto. - -2008-09-05 Kevin McCullough <kmccullough@apple.com> - - Reviewed by Sam and Alexey. - - Make the profiler work with a null exec state. This will allow other - applications start the profiler to get DTrace probes going without - needing a WebView. - - * ChangeLog: - * profiler/ProfileGenerator.cpp: - (KJS::ProfileGenerator::ProfileGenerator): - (KJS::ProfileGenerator::willExecute): - (KJS::ProfileGenerator::didExecute): - * profiler/Profiler.cpp: - (KJS::Profiler::startProfiling): - (KJS::Profiler::stopProfiling): - (KJS::dispatchFunctionToProfiles): - -2008-09-04 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoffrey Garen. - - Fixed an off-by-one error that would cause the StructureIDChain to - be one object too short. - - Can't construct a test case because other factors make this not crash - (yet!). - - * kjs/StructureID.cpp: - (KJS::StructureIDChain::StructureIDChain): - -2008-09-04 Kevin Ollivier <kevino@theolliviers.com> - - wx build fixes. - - * JavaScriptCoreSources.bkl: - -2008-09-04 Mark Rowe <mrowe@apple.com> - - Reviewed by Eric Seidel. - - Fix https://bugs.webkit.org/show_bug.cgi?id=20639. - Bug 20639: ENABLE_DASHBOARD_SUPPORT does not need to be a FEATURE_DEFINE - - * Configurations/JavaScriptCore.xcconfig: Remove ENABLE_DASHBOARD_SUPPORT from FEATURE_DEFINES. - * wtf/Platform.h: Set ENABLE_DASHBOARD_SUPPORT for PLATFORM(MAC). - -2008-09-04 Adele Peterson <adele@apple.com> - - Build fix. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - * JavaScriptCore.vcproj/jsc/jsc.vcproj: - -2008-09-04 Mark Rowe <mrowe@apple.com> - - Mac build fix. - - * kjs/config.h: Only check the value of HAVE_CONFIG_H if it is defined. - -2008-09-04 Marco Barisione <marco.barisione@collabora.co.uk> - - Reviewed by Eric Seidel. - - http://bugs.webkit.org/show_bug.cgi?id=20380 - [GTK][AUTOTOOLS] Include autotoolsconfig.h from config.h - - * kjs/config.h: Include the configuration header generated by - autotools if available. - -2008-09-04 Tor Arne Vestbø <tavestbo@trolltech.com> - - Reviewed by Simon. - - Fix the QtWebKit build to match changes in r36016 - - * JavaScriptCore.pri: + Timezone calculation incorrect in Venezuela. -2008-09-04 Mark Rowe <mrowe@apple.com> + https://bugs.webkit.org/show_bug.cgi?id=26531 + <rdar://problem/6646169> Time is incorrectly reported to JavaScript in both Safari 3 and Firefox 3 - Fix the 64-bit build. + The problem is that we're calculating the timezone relative to 01/01/2000, + but the VET timezone changed from -4 hours to -4:30 hours on 12/09/2007. + According to the spec, section 15.9.1.9 states "the time since the beginning + of the year", presumably meaning the *current* year. Change the calculation + to be based on whatever the current year is, rather than a canned date. - * VM/CodeBlock.cpp: - (KJS::CodeBlock::printStructureID): Store the instruction offset into an unsigned local - to avoid a warning related to format specifiers. - (KJS::CodeBlock::printStructureIDs): Ditto. - -2008-09-04 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Rubber-stamped by Oliver Hunt. - - Correct the spelling of 'entryIndices'. - - * kjs/PropertyMap.cpp: - (KJS::PropertyMap::get): - (KJS::PropertyMap::getLocation): - (KJS::PropertyMap::put): - (KJS::PropertyMap::insert): - (KJS::PropertyMap::remove): - (KJS::PropertyMap::checkConsistency): - * kjs/PropertyMap.h: - (KJS::PropertyMapHashTable::entries): - (KJS::PropertyMap::getOffset): - (KJS::PropertyMap::putOffset): - (KJS::PropertyMap::offsetForTableLocation): - -2008-09-03 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Cameron Zwarich. - - Fixed <rdar://problem/6193925> REGRESSION: Crash occurs at - KJS::Machine::privateExecute() when attempting to load my Mobile Gallery - (http://www.me.com/gallery/#home) - - also - - https://bugs.webkit.org/show_bug.cgi?id=20633 Crash in privateExecute - @ cs.byu.edu - - The underlying problem was that we would cache prototype properties - even if the prototype was a dictionary. - - The fix is to transition a prototype back from dictionary to normal - status when an opcode caches access to it. (This is better than just - refusing to cache, since a heavily accessed prototype is almost - certainly not a true dictionary.) - - * VM/Machine.cpp: - (KJS::Machine::tryCacheGetByID): - * kjs/JSObject.h: - -2008-09-03 Eric Seidel <eric@webkit.org> - - Reviewed by Sam. - - Clean up Platform.h and add PLATFORM(CHROMIUM), PLATFORM(SKIA) and USE(V8_BINDINGS) - - * Configurations/JavaScriptCore.xcconfig: add missing ENABLE_* - * wtf/ASCIICType.h: include <wtf/Assertions.h> since it depends on it. - * wtf/Platform.h: - -2008-09-03 Kevin McCullough <kmccullough@apple.com> - - Reviewed by Tim. - - Remove the rest of the "zombie" code from the profiler. - - There is no longer a need for the ProfilerClient callback mechanism. - - * API/JSProfilerPrivate.cpp: - (JSStartProfiling): - * JavaScriptCore.exp: - * profiler/HeavyProfile.h: - * profiler/ProfileGenerator.cpp: - (KJS::ProfileGenerator::create): - (KJS::ProfileGenerator::ProfileGenerator): - * profiler/ProfileGenerator.h: - (KJS::ProfileGenerator::profileGroup): - * profiler/Profiler.cpp: - (KJS::Profiler::startProfiling): - (KJS::Profiler::stopProfiling): Immediately return the profile when - stopped instead of using a callback. - * profiler/Profiler.h: - * profiler/TreeProfile.h: - -2008-09-03 Adele Peterson <adele@apple.com> - - Build fix. - - * wtf/win/MainThreadWin.cpp: - -2008-09-02 Kevin McCullough <kmccullough@apple.com> - - Reviewed by Darin and Tim. - - Remove most of the "zombie" mode from the profiler. Next we will need - to remove the client callback mechanism in profiles. - - - This simplifies the code, leverages the recent changes I've made in - getting line numbers from SquirrelFish, and is a slight speed - improvement on SunSpider. - - Also the "zombie" mode was a constant source of odd edge cases and - obscure bugs so it's good to remove since all of its issues may not have - been found. - - * API/JSProfilerPrivate.cpp: No need to call didFinishAllExecution() any - more. - (JSEndProfiling): - * JavaScriptCore.exp: Export the new signature of retrieveLastCaller() - * VM/Machine.cpp: - (KJS::Machine::execute): No need to call didFinishAllExecution() any - more. - (KJS::Machine::retrieveCaller): Now operates on InternalFunctions now - since the RegisterFile is no longer guaranteeded to store only - JSFunctions - (KJS::Machine::retrieveLastCaller): Now also retrieve the function's - name - (KJS::Machine::callFrame): A result of changing retrieveCaller() - * VM/Machine.h: - * VM/Register.h: - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::~JSGlobalObject): - * kjs/nodes.h: - * profiler/ProfileGenerator.cpp: - (KJS::ProfileGenerator::create): Now pass the original exec and get the - global exec and client when necessary. We need the original exec so we - can have the stack frame where profiling started. - (KJS::ProfileGenerator::ProfileGenerator): ditto. - (KJS::ProfileGenerator::addParentForConsoleStart): This is where the - parent to star of the profile is added, if there is one. - (KJS::ProfileGenerator::willExecute): Remove uglyness! - (KJS::ProfileGenerator::didExecute): Ditto! - (KJS::ProfileGenerator::stopProfiling): - (KJS::ProfileGenerator::removeProfileStart): Use a better way to find - and remove the function we are looking for. - (KJS::ProfileGenerator::removeProfileEnd): Ditto. - * profiler/ProfileGenerator.h: - (KJS::ProfileGenerator::client): - * profiler/ProfileNode.cpp: - (KJS::ProfileNode::removeChild): Add a better way to remove a child from - a ProfileNode. - (KJS::ProfileNode::stopProfiling): - (KJS::ProfileNode::debugPrintData): Modified a debug-only diagnostic - function to be sane. - * profiler/ProfileNode.h: - * profiler/Profiler.cpp: Change to pass the original exec state. - (KJS::Profiler::startProfiling): - (KJS::Profiler::stopProfiling): - (KJS::Profiler::willExecute): - (KJS::Profiler::didExecute): - (KJS::Profiler::createCallIdentifier): - * profiler/Profiler.h: - -2008-09-01 Alexey Proskuryakov <ap@webkit.org> - - Reviewed by Darin Adler. - - Implement callOnMainThreadAndWait(). - - This will be useful when a background thread needs to perform UI calls synchronously - (e.g. an openDatabase() call cannot return until the user answers to a confirmation dialog). - - * wtf/MainThread.cpp: - (WTF::FunctionWithContext::FunctionWithContext): Added a ThreadCondition member. When - non-zero, the condition is signalled after the function is called. - (WTF::mainThreadFunctionQueueMutex): Renamed from functionQueueMutex, sinc this is no longer - static. Changed to be initialized from initializeThreading() to avoid lock contention. - (WTF::initializeMainThread): On non-Windows platforms, just call mainThreadFunctionQueueMutex. - (WTF::dispatchFunctionsFromMainThread): Signal synchronous calls when done. - (WTF::callOnMainThread): Updated for functionQueueMutex rename. - (WTF::callOnMainThreadAndWait): Added. - - * wtf/MainThread.h: Added callOnMainThreadAndWait(); initializeMainThread() now exists on - all platforms. - - * wtf/win/MainThreadWin.cpp: (WTF::initializeMainThread): Added a callOnMainThreadAndWait() - call to initialize function queue mutex. - - * wtf/ThreadingGtk.cpp: (WTF::initializeThreading): - * wtf/ThreadingPthreads.cpp: (WTF::initializeThreading): - * wtf/ThreadingQt.cpp: (WTF::initializeThreading): - Only initialize mainThreadIdentifier on non-Darwin platforms. It was not guaranteed to be - accurate on Darwin. - -2008-09-03 Geoffrey Garen <ggaren@apple.com> + No performance impact. - Reviewed by Darin Adler. - - Use isUndefinedOrNull() instead of separate checks for each in op_eq_null - and op_neq_null. + * wtf/DateMath.cpp: + (WTF::calculateUTCOffset): - * VM/Machine.cpp: - (KJS::Machine::privateExecute): +2009-06-18 Gavin Barraclough <barraclough@apple.com> -2008-09-02 Csaba Osztrogonac <oszi@inf.u-szeged.hu> + Rubber Stamped by Mark Rowe (originally reviewed by Sam Weinig). - Reviewed by Darin Adler. + (Reintroducing patch added in r44492, and reverted in r44796.) - Bug 20296: OpcodeStats doesn't build on platforms which don't have mergesort(). - <https://bugs.webkit.org/show_bug.cgi?id=20296> + Change the implementation of op_throw so the stub function always modifies its + return address - if it doesn't find a 'catch' it will switch to a trampoline + to force a return from JIT execution. This saves memory, by avoiding the need + for a unique return for every op_throw. - * VM/Opcode.cpp: - (KJS::OpcodeStats::~OpcodeStats): mergesort() replaced with qsort() + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_throw): + JITStubs::cti_op_throw now always changes its return address, + remove return code generated after the stub call (this is now + handled by ctiOpThrowNotCaught). + * jit/JITStubs.cpp: + (JSC::): + Add ctiOpThrowNotCaught definitions. + (JSC::JITStubs::DEFINE_STUB_FUNCTION): + Change cti_op_throw to always change its return address. + * jit/JITStubs.h: + Add ctiOpThrowNotCaught declaration. -2008-09-02 Geoffrey Garen <ggaren@apple.com> +2009-06-18 Kevin McCullough <kmccullough@apple.com> Reviewed by Oliver Hunt. - - Fast path for array.length and string.length. - - SunSpider says 0.5% faster. - -2008-09-02 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Anders Carlsson. - - Added optimized paths for comparing to null. - - SunSpider says 0.5% faster. - -2008-09-02 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Changed jsDriver.pl to dump the exact text you would need in order to - reproduce a test result. This enables a fast workflow where you copy - and paste a test failure in the terminal. - - * tests/mozilla/jsDriver.pl: - -2008-09-02 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Implemented the rest of Darin's review comments for the 09-01 inline - caching patch. - - SunSpider says 0.5% faster, but that seems like noise. - - * JavaScriptCore.xcodeproj/project.pbxproj: Put PutPropertySlot into - its own file, and added BatchedTransitionOptimizer. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::~CodeBlock): Use array indexing instead of a pointer - iterator. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::CodeGenerator): Used BatchedTransitionOptimizer to - make batched put and remove for declared variables fast, without forever - pessimizing the global object. Removed the old getDirect/removeDirect hack - that tried to do the same in a more limited way. - - * VM/CodeGenerator.h: Moved IdentifierRepHash to the KJS namespace since - it doesn't specialize anything in WTF. - - * VM/Machine.cpp: - (KJS::Machine::Machine): Nixed the DummyConstruct tag because it was - confusingly named. - - (KJS::Machine::execute): Used BatchedTransitionOptimizer, as above. Fixed - up some comments. - - (KJS::cachePrototypeChain): Cast to JSObject*, since it's more specific. - - (KJS::Machine::tryCachePutByID): Use isNull() instead of comparing to - jsNull(), since isNull() leaves more options open for the future. - (KJS::Machine::tryCacheGetByID): ditto - (KJS::Machine::privateExecute): ditto - - * VM/SamplingTool.cpp: - (KJS::SamplingTool::dump): Use C++-style cast, to match our style - guidelines. - - * kjs/BatchedTransitionOptimizer.h: Added. New class that allows host - code to add a batch of properties to an object in an efficient way. - - * kjs/JSActivation.cpp: Use isNull(), as above. - - * kjs/JSArray.cpp: Get rid of DummyConstruct tag, as above. - * kjs/JSArray.h: - - * kjs/JSGlobalData.cpp: Nixed two unused StructureIDs. - * kjs/JSGlobalData.h: - * kjs/JSImmediate.cpp: Use isNull(), as above. + <rdar://problem/6940880> REGRESSION: Breakpoints don't break in 64-bit - * kjs/JSObject.cpp: - (KJS::JSObject::mark): Moved mark tracing code elsewhere, to make this - function more readable. - - (KJS::JSObject::put): Use isNull(), as above. - - (KJS::JSObject::createInheritorID): Return a raw pointer, since the - object is owned by a data member, not necessarily the caller. - * kjs/JSObject.h: - - * kjs/JSString.cpp: Use isNull(), as above. - - * kjs/PropertyMap.h: Updated to use PropertySlot::invalidOffset. - - * kjs/PropertySlot.h: Changed KJS_INVALID_OFFSET to WTF::notFound - because C macros are so 80's. - - * kjs/PutPropertySlot.h: Added. Split out of PropertySlot.h. Also renamed - PutPropertySlot::SlotType to PutPropertySlot::Type, and slotBase to base, - since "slot" was redundant. - - * kjs/StructureID.cpp: Added a new transition *away* from dictionary - status, to support BatchedTransitionOptimizer. - - (KJS::StructureIDChain::StructureIDChain): No need to store m_size as - a data member, so keep it in a local, which might be faster. - * kjs/StructureID.h: - - * kjs/SymbolTable.h: Moved IdentifierRepHash to KJS namespace, as above. - * kjs/ustring.h: - -2008-09-02 Adam Roben <aroben@apple.com> - - Windows build fixes - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Add - StructureID.{cpp,h} to the project. Also let VS reorder this file. - * VM/CodeBlock.cpp: Include StringExtras so that snprintf will be - defined on Windows. - -2008-09-01 Sam Weinig <sam@webkit.org> - - Fix release build. + - Exposed functions now needed by WebCore. * JavaScriptCore.exp: -2008-09-01 Jan Michael Alonzo <jmalonzo@webkit.org> - - Reviewed by Oliver Hunt. - - Gtk buildfix - - * GNUmakefile.am: - * kjs/PropertyMap.cpp: rename Identifier.h to identifier.h - * kjs/StructureID.cpp: include JSObject.h - -2008-09-01 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Darin Adler. - - First cut at inline caching for access to vanilla JavaScript properties. - - SunSpider says 4% faster. Tests heavy on dictionary-like access have - regressed a bit -- we have a lot of room to improve in this area, - but this patch is over-ripe as-is. - - JSCells now have a StructureID that uniquely identifies their layout, - and holds their prototype. - - JSValue::put takes a PropertySlot& argument, so it can fill in details - about where it put a value, for the sake of caching. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::CodeGenerator): Avoid calling removeDirect if we - can, since it disables inline caching in the global object. This can - probably improve in the future. - - * kjs/JSGlobalObject.cpp: Nixed reset(), since it complicates caching, and - wasn't really necessary. - - * kjs/JSObject.cpp: Tweaked getter / setter behavior not to rely on the - IsGetterSetter flag, since the flag was buggy. This is necessary in order - to avoid accidentally accessing a getter / setter as a normal property. - - Also changed getter / setter creation to honor ReadOnly, matching Mozilla. - - * kjs/PropertyMap.cpp: Nixed clear(), since it complicates caching and - isn't necessary. - - * kjs/Shell.cpp: Moved SamplingTool dumping outside the loop. This allows - you to aggregate sampling of multiple files (or the same file repeatedly), - which helped me track down regressions. - - * kjs/ustring.h: Moved IdentifierRepHash here to share it. - -2008-09-01 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Sam Weinig. - - Eagerly allocate the Math object's numeric constants. This avoids - constantly reallocating them in loops, and also ensures that the Math - object will not use the single property optimization, which makes - properties ineligible for caching. - - SunSpider reports a small speedup, in combination with inline caching. - - * kjs/MathObject.cpp: - (KJS::MathObject::MathObject): - (KJS::MathObject::getOwnPropertySlot): - * kjs/MathObject.h: - -2008-09-01 Jan Michael Alonzo <jmalonzo@webkit.org> - - Gtk build fix, not reviewed. - - * GNUmakefile.am: Add SmallStrings.cpp in both release and debug builds - -2008-08-31 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Maciej Stachowiak. - - Bug 20577: REGRESSION (r36006): Gmail is broken - <https://bugs.webkit.org/show_bug.cgi?id=20577> - - r36006 changed stringProtoFuncSubstr() so that it is uses the more - efficient jsSubstring(), rather than using UString::substr() and then - calling jsString(). However, the change did not account for the case - where the start and the length of the substring extend beyond the length - of the original string. This patch corrects that. - - * kjs/StringPrototype.cpp: - (KJS::stringProtoFuncSubstr): - -2008-08-31 Simon Hausmann <hausmann@wekit.org> - - Unreviewed build fix (with gcc 4.3) - - * kjs/ustring.h: Properly forward declare operator== for UString and - the the concatenate functions inside the KJS namespace. - -2008-08-30 Darin Adler <darin@apple.com> - - Reviewed by Maciej. - - - https://bugs.webkit.org/show_bug.cgi?id=20333 - improve JavaScript speed when handling single-character strings - - 1.035x as fast on SunSpider overall. - 1.127x as fast on SunSpider string tests. - 1.910x as fast on SunSpider string-base64 test. - - * API/JSObjectRef.cpp: - (JSObjectMakeFunction): Removed unneeded explicit construction of UString. - - * GNUmakefile.am: Added SmallStrings.h and SmallStrings.cpp. - * JavaScriptCore.pri: Ditto. - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - Ditto. - * JavaScriptCore.xcodeproj/project.pbxproj: Ditto. - * JavaScriptCoreSources.bkl: Ditto. - - * JavaScriptCore.exp: Updated. - - * VM/Machine.cpp: - (KJS::jsAddSlowCase): Changed to use a code path that doesn't involve - a UString constructor. This avoids an extra jump caused by the "in charge" - vs. "not in charge" constructors. - (KJS::jsAdd): Ditto. - (KJS::jsTypeStringForValue): Adopted jsNontrivialString. - - * kjs/ArrayPrototype.cpp: - (KJS::arrayProtoFuncToString): Adopted jsEmptyString. - (KJS::arrayProtoFuncToLocaleString): Ditto. - (KJS::arrayProtoFuncJoin): Ditto. - * kjs/BooleanPrototype.cpp: - (KJS::booleanProtoFuncToString): Adopted jsNontrivialString. - * kjs/DateConstructor.cpp: - (KJS::callDate): Ditto. - * kjs/DatePrototype.cpp: - (KJS::formatLocaleDate): Adopted jsEmptyString and jsNontrivialString. - (KJS::dateProtoFuncToString): Ditto. - (KJS::dateProtoFuncToUTCString): Ditto. - (KJS::dateProtoFuncToDateString): Ditto. - (KJS::dateProtoFuncToTimeString): Ditto. - (KJS::dateProtoFuncToLocaleString): Ditto. - (KJS::dateProtoFuncToLocaleDateString): Ditto. - (KJS::dateProtoFuncToLocaleTimeString): Ditto. - (KJS::dateProtoFuncToGMTString): Ditto. - - * kjs/ErrorPrototype.cpp: - (KJS::ErrorPrototype::ErrorPrototype): Ditto. - (KJS::errorProtoFuncToString): Ditto. - - * kjs/JSGlobalData.h: Added SmallStrings. - - * kjs/JSString.cpp: - (KJS::jsString): Eliminated the overload that takes a const char*. - Added code to use SmallStrings to get strings of small sizes rather - than creating a new JSString every time. - (KJS::jsSubstring): Added. Used when creating a string from a substring - to avoid creating a JSString in cases where the substring will end up - empty or as one character. - (KJS::jsOwnedString): Added the same code as in jsString. - - * kjs/JSString.h: Added new functions jsEmptyString, jsSingleCharacterString, - jsSingleCharacterSubstring, jsSubstring, and jsNontrivialString for various - cases where we want to create JSString, and want special handling for small - strings. - (KJS::JSString::JSString): Added an overload that takes a PassRefPtr of - a UString::Rep so you don't have to construct a UString; PassRefPtr can be - more efficient. - (KJS::jsEmptyString): Added. - (KJS::jsSingleCharacterString): Added. - (KJS::jsSingleCharacterSubstring): Added. - (KJS::jsNontrivialString): Added. - (KJS::JSString::getIndex): Adopted jsSingleCharacterSubstring. - (KJS::JSString::getStringPropertySlot): Ditto. - - * kjs/NumberPrototype.cpp: - (KJS::numberProtoFuncToFixed): Adopted jsNontrivialString. - (KJS::numberProtoFuncToExponential): Ditto. - (KJS::numberProtoFuncToPrecision): Ditto. - - * kjs/ObjectPrototype.cpp: - (KJS::objectProtoFuncToLocaleString): Adopted toThisJSString. - (KJS::objectProtoFuncToString): Adopted jsNontrivialString. - - * kjs/RegExpConstructor.cpp: Separated the lastInput value that's used - with the lastOvector to return matches from the input value that can be - changed via JavaScript. They will be equal in many cases, but not all. - (KJS::RegExpConstructor::performMatch): Set input. - (KJS::RegExpMatchesArray::RegExpMatchesArray): Ditto. - (KJS::RegExpMatchesArray::fillArrayInstance): Adopted jsSubstring. Also, - use input rather than lastInput in the appropriate place. - (KJS::RegExpConstructor::getBackref): Adopted jsSubstring and jsEmptyString. - Added code to handle the case where there is no backref -- before this - depended on range checking in UString::substr which is not present in - jsSubstring. - (KJS::RegExpConstructor::getLastParen): Ditto. - (KJS::RegExpConstructor::getLeftContext): Ditto. - (KJS::RegExpConstructor::getRightContext): Ditto. - (KJS::RegExpConstructor::getValueProperty): Use input rather than lastInput. - Also adopt jsEmptyString. - (KJS::RegExpConstructor::putValueProperty): Ditto. - (KJS::RegExpConstructor::input): Ditto. - - * kjs/RegExpPrototype.cpp: - (KJS::regExpProtoFuncToString): Adopt jsNonTrivialString. Also changed to - use UString::append to append single characters rather than using += and - a C-style string. - - * kjs/SmallStrings.cpp: Added. - (KJS::SmallStringsStorage::SmallStringsStorage): Construct the - buffer and UString::Rep for all 256 single-character strings for - the U+0000 through U+00FF. This covers all the values used in - the base64 test as well as most values seen elsewhere on the web - as well. It's possible that later we might fix this to only work - for U+0000 through U+007F but the others are used quite a bit in - the current version of the base64 test. - (KJS::SmallStringsStorage::~SmallStringsStorage): Free memory. - (KJS::SmallStrings::SmallStrings): Create a set of small strings, - initially not created; created later when they are used. - (KJS::SmallStrings::~SmallStrings): Deallocate. Not left compiler - generated because the SmallStringsStorage class's destructor needs - to be visible. - (KJS::SmallStrings::mark): Mark all the strings. - (KJS::SmallStrings::createEmptyString): Create a cell for the - empty string. Called only the first time. - (KJS::SmallStrings::createSingleCharacterString): Create a cell - for one of the single-character strings. Called only the first time. - * kjs/SmallStrings.h: Added. - - * kjs/StringConstructor.cpp: - (KJS::stringFromCharCodeSlowCase): Factored out of strinFromCharCode. - Only used for cases where the caller does not pass exactly one argument. - (KJS::stringFromCharCode): Adopted jsSingleCharacterString. - (KJS::callStringConstructor): Adopted jsEmptyString. - - * kjs/StringObject.cpp: - (KJS::StringObject::StringObject): Adopted jsEmptyString. - - * kjs/StringPrototype.cpp: - (KJS::stringProtoFuncReplace): Adopted jsSubstring. - (KJS::stringProtoFuncCharAt): Adopted jsEmptyString and - jsSingleCharacterSubstring and also added a special case when the - index is an immediate number to avoid conversion to and from floating - point, since that's the common case. - (KJS::stringProtoFuncCharCodeAt): Ditto. - (KJS::stringProtoFuncMatch): Adopted jsSubstring and jsEmptyString. - (KJS::stringProtoFuncSlice): Adopted jsSubstring and - jsSingleCharacterSubstring. Also got rid of some unneeded locals and - removed unneeded code to set the length property of the array, since it - is automatically updated as values are added to the array. - (KJS::stringProtoFuncSplit): Adopted jsEmptyString. - (KJS::stringProtoFuncSubstr): Adopted jsSubstring. - (KJS::stringProtoFuncSubstring): Ditto. - - * kjs/collector.cpp: - (KJS::Heap::collect): Added a call to mark SmallStrings. - - * kjs/ustring.cpp: - (KJS::UString::expandedSize): Made this a static member function since - it doesn't need to look at any data members. - (KJS::UString::expandCapacity): Use a non-inline function, makeNull, to - set the rep to null in failure cases. This avoids adding a PIC branch for - the normal case when there is no failure. - (KJS::UString::expandPreCapacity): Ditto. - (KJS::UString::UString): Ditto. - (KJS::concatenate): Refactored the concatenation constructor into this - separate function. Calling the concatenation constructor was leading to - an extra branch because of the in-charge vs. not-in-charge versions not - both being inlined, and this was showing up as nearly 1% on Shark. Also - added a special case for when the second string is a single character, - since it's a common idiom to build up a string that way and we can do - things much more quickly, without involving memcpy for example. Also - adopted the non-inline function, nullRep, for the same reason given for - makeNull above. - (KJS::UString::append): Adopted makeNull for failure cases. - (KJS::UString::operator=): Ditto. - (KJS::UString::toDouble): Added a special case for converting single - character strings to numbers. We're doing this a ton of times while - running the base64 test. - (KJS::operator==): Added special cases so we can compare single-character - strings without calling memcmp. Later we might want to special case other - short lengths similarly. - (KJS::UString::makeNull): Added. - (KJS::UString::nullRep): Added. - * kjs/ustring.h: Added declarations for the nullRep and makeNull. Changed - expandedSize to be a static member function. Added a declaration of the - concatenate function. Removed the concatenation constructor. Rewrote - operator+ to use the concatenate function. - -2008-08-29 Anders Carlsson <andersca@apple.com> - - Build fix. - - * VM/Machine.cpp: - (KJS::getCPUTime): - -2008-08-29 Anders Carlsson <andersca@apple.com> - - Reviewed by Darin Adler. - - <rdar://problem/6174667> - When a machine is under heavy load, the Slow Script dialog often comes up many times and just gets in the way - - Instead of using clock time, use the CPU time spent executing the current thread when - determining if the script has been running for too long. - - * VM/Machine.cpp: - (KJS::getCPUTime): - (KJS::Machine::checkTimeout): - -2008-08-28 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Rubber-stamped by Sam Weinig. - - Change 'term' to 'expr' in variable names to standardize terminology. - - * kjs/nodes.cpp: - (KJS::BinaryOpNode::emitCode): - (KJS::ReverseBinaryOpNode::emitCode): - (KJS::ThrowableBinaryOpNode::emitCode): - * kjs/nodes.h: - (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::ThrowableBinaryOpNode::): - (KJS::InstanceOfNode::): - (KJS::InNode::): - (KJS::EqualNode::): - (KJS::NotEqualNode::): - (KJS::StrictEqualNode::): - (KJS::NotStrictEqualNode::): - (KJS::BitAndNode::): - (KJS::BitOrNode::): - (KJS::BitXOrNode::): - * kjs/nodes2string.cpp: - (KJS::MultNode::streamTo): - (KJS::DivNode::streamTo): - (KJS::ModNode::streamTo): - (KJS::AddNode::streamTo): - (KJS::SubNode::streamTo): - (KJS::LeftShiftNode::streamTo): - (KJS::RightShiftNode::streamTo): - (KJS::UnsignedRightShiftNode::streamTo): - (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-08-28 Alp Toker <alp@nuanti.com> - - GTK+ dist/build fix. List newly added header files. - - * GNUmakefile.am: - -2008-08-28 Sam Weinig <sam@webkit.org> +2009-06-17 Darin Adler <darin@apple.com> Reviewed by Oliver Hunt. - Change to throw a ReferenceError at runtime instead of a ParseError - at parse time, when the left hand side expression of a for-in statement - is not an lvalue. + Bug 26429: Make JSON.stringify non-recursive so it can handle objects + of arbitrary complexity + https://bugs.webkit.org/show_bug.cgi?id=26429 - * kjs/grammar.y: - * kjs/nodes.cpp: - (KJS::ForInNode::emitCode): + For marking I decided not to use gcProtect, because this is inside the engine + so it's easy enough to just do marking. And that darned gcProtect does locking! + Oliver tried to convince me to used MarkedArgumentBuffer, but the constructor + for that class says "FIXME: Remove all clients of this API, then remove this API." -2008-08-28 Alexey Proskuryakov <ap@webkit.org> - - Not reviewed, build fix (at least for OpenBSD, posssibly more). - - https://bugs.webkit.org/show_bug.cgi?id=20545 - missing #include <unistd.h> in JavaScriptCore/VM/SamplingTool.cpp - - * VM/SamplingTool.cpp: add the missing include. - -2008-08-26 Kevin McCullough <kmccullough@apple.com> - - Reviewed by Geoff and Cameron. - - <rdar://problem/6174603> Hitting assertion in Register::codeBlock when - loading facebook (20516). - - - This was a result of my line numbers change. After a host function is - called the stack does not get reset correctly. - - Oddly this also appears to be a slight speedup on SunSpider. - - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - -2008-08-26 Alexey Proskuryakov <ap@webkit.org> - - Reviewed by Geoff and Tim. - - Export new API methods. - - * JavaScriptCore.exp: - -2008-08-25 Kevin McCullough <kmccullough@apple.com> - - Reviewed by Geoff, Tim and Mark. + * runtime/Collector.cpp: + (JSC::Heap::collect): Add a call to JSONObject::markStringifiers. - <rdar://problem/6150623> JSProfiler: It would be nice if the profiles - in the console said what file and line number they came from - - Lay the foundation for getting line numbers and other data from the - JavaScript engine. With the cleanup in kjs/ExecState this is actually - a slight performance improvement. + * runtime/CommonIdentifiers.cpp: + (JSC::CommonIdentifiers::CommonIdentifiers): Added emptyIdentifier. + * runtime/CommonIdentifiers.h: Ditto. - * JavaScriptCore.exp: Export retrieveLastCaller() for WebCore. - * JavaScriptCore.xcodeproj/project.pbxproj: - * VM/Machine.cpp: Now Host and JS functions set a call frame on the - exec state, so this and the profiler code were pulled out of the - branches. - (KJS::Machine::privateExecute): - (KJS::Machine::retrieveLastCaller): This get's the lineNumber, sourceID - and sourceURL for the previously called function. - * VM/Machine.h: - * kjs/ExecState.cpp: Remove references to JSFunction since it's not used - anywhere. - * kjs/ExecState.h: - -2008-08-25 Alexey Proskuryakov <ap@webkit.org> + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): Initialize firstStringifierToMark to 0. + * runtime/JSGlobalData.h: Added firstStringifierToMark. + + * runtime/JSONObject.cpp: Cut down the includes to the needed ones only. + (JSC::unwrapNumberOrString): Added. Helper for unwrapping number and string + objects to get their number and string values. + (JSC::ReplacerPropertyName::ReplacerPropertyName): Added. The class is used + to wrap an identifier or integer so we don't have to do any work unless we + actually call a replacer. + (JSC::ReplacerPropertyName::value): Added. + (JSC::gap): Added. Helper function for the Stringifier constructor. + (JSC::PropertyNameForFunctionCall::PropertyNameForFunctionCall): Added. + The class is used to wrap an identifier or integer so we don't have to + allocate a number or string until we actually call toJSON or a replacer. + (JSC::PropertyNameForFunctionCall::asJSValue): Added. + (JSC::Stringifier::Stringifier): Updated and moved out of the class + definition. Added code to hook this into a singly linked list for marking. + (JSC::Stringifier::~Stringifier): Remove from the singly linked list. + (JSC::Stringifier::mark): Mark all the objects in the holder stacks. + (JSC::Stringifier::stringify): Updated. + (JSC::Stringifier::appendQuotedString): Tweaked and streamlined a bit. + (JSC::Stringifier::toJSON): Renamed from toJSONValue. + (JSC::Stringifier::appendStringifiedValue): Renamed from stringify. + Added code to use the m_holderStack to do non-recursive stringify of + objects and arrays. This code also uses the timeout checker since in + pathological cases it could be slow even without calling into the + JavaScript virtual machine. + (JSC::Stringifier::willIndent): Added. + (JSC::Stringifier::indent): Added. + (JSC::Stringifier::unindent): Added. + (JSC::Stringifier::startNewLine): Added. + (JSC::Stringifier::Holder::Holder): Added. + (JSC::Stringifier::Holder::appendNextProperty): Added. This is the + function that handles the format of arrays and objects. + (JSC::JSONObject::getOwnPropertySlot): Moved this down to the bottom + of the file so the JSONObject class is not interleaved with the + Stringifier class. + (JSC::JSONObject::markStringifiers): Added. Calls mark. + (JSC::JSONProtoFuncStringify): Streamlined the code here. The code + to compute the gap string is now a separate function. + + * runtime/JSONObject.h: Made everything private. Added markStringifiers. + +2009-06-17 Oliver Hunt <oliver@apple.com> - Reviewed by Darin Adler. + Reviewed by Gavin Barraclough. - Ensure that JSGlobalContextRelease() performs garbage collection, even if there are other - contexts in the current context's group. + <rdar://problem/6974140> REGRESSION(r43849): Crash in cti_op_call_NotJSFunction when getting directions on maps.google.com - This is only really necessary when the last reference is released, but there is no way to - determine that, and no harm in collecting slightly more often. + Roll out r43849 as it appears that we cannot rely on the address of + an objects property storage being constant even if the structure is + unchanged. - * API/JSContextRef.cpp: (JSGlobalContextRelease): Explicitly collect the heap if it is not - being destroyed. + * jit/JIT.h: + * jit/JITPropertyAccess.cpp: + (JSC::JIT::compileGetDirectOffset): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChainList): + (JSC::JIT::privateCompileGetByIdChain): -2008-08-24 Cameron Zwarich <cwzwarich@uwaterloo.ca> +2009-06-17 Gavin Barraclough <barraclough@apple.com> - Reviewed by Oliver Hunt. + Rubber Stamped by Mark Rowe. - Bug 20093: JSC shell does not clear exceptions after it executes toString on an expression - <https://bugs.webkit.org/show_bug.cgi?id=20093> + Fully revert r44492 & r44748 while we fix a bug they cause on internal builds <rdar://problem/6955963>. - Clear exceptions after evaluating any code in the JSC shell. We do not - report exceptions that are caused by calling toString on the final - valued, but at least we avoid incorrect behaviour. + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_throw): + * jit/JITStubs.cpp: + (JSC::): + (JSC::JITStubs::DEFINE_STUB_FUNCTION): + * jit/JITStubs.h: - Also, print any exceptions that occurred while evaluating code at the - interactive prompt, not just while evaluating code from a file. +2009-06-17 Gavin Barraclough <barraclough@apple.com> - * kjs/Shell.cpp: - (runWithScripts): - (runInteractive): + Reviewed by Mark Rowe. -2008-08-24 Cameron Zwarich <cwzwarich@uwaterloo.ca> + <rdar://problem/6947426> sunspider math-cordic.js exhibits different intermediate results running 32-bit vs. 64-bit - Reviewed by Oliver. + On 64-bit, NaN-encoded values must be detagged before they can be used in rshift. - Remove an unnecessary RefPtr to a RegisterID. + No performance impact. - * kjs/nodes.cpp: - (KJS::DeleteBracketNode::emitCode): + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_rshift): -2008-08-24 Mark Rowe <mrowe@apple.com> +2009-06-17 Adam Treat <adam.treat@torchmobile.com> - Reviewed by Oliver Hunt. + Reviewed by George Staikos. - Use the correct version number for when JSGlobalContextCreate was introduced. + https://bugs.webkit.org/show_bug.cgi?id=23155 + Move WIN_CE -> WINCE as previously discussed with Qt WINCE folks. - * API/JSContextRef.h: + * jsc.cpp: + (main): -2008-08-23 Cameron Zwarich <cwzwarich@uwaterloo.ca> +2009-06-17 George Staikos <george.staikos@torchmobile.com> - Rubber-stamped by Mark Rowe. + Reviewed by Adam Treat. - Remove modelines. + https://bugs.webkit.org/show_bug.cgi?id=23155 + Move WIN_CE -> WINCE as previously discussed with Qt WINCE folks. - * API/APICast.h: - * API/JSBase.cpp: - * 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/JSContextRef.cpp: - * API/JSObjectRef.cpp: - * API/JSProfilerPrivate.cpp: - * API/JSStringRef.cpp: - * API/JSStringRefBSTR.cpp: - * API/JSStringRefCF.cpp: - * API/JSValueRef.cpp: - * API/tests/JSNode.c: - * API/tests/JSNode.h: - * API/tests/JSNodeList.c: - * API/tests/JSNodeList.h: - * API/tests/Node.c: - * API/tests/Node.h: - * API/tests/NodeList.c: - * API/tests/NodeList.h: - * API/tests/minidom.c: - * API/tests/minidom.js: - * API/tests/testapi.c: - * API/tests/testapi.js: - * JavaScriptCore.pro: - * kjs/FunctionConstructor.h: - * kjs/FunctionPrototype.h: - * kjs/JSArray.h: - * kjs/JSString.h: - * kjs/JSWrapperObject.cpp: - * kjs/NumberConstructor.h: - * kjs/NumberObject.h: - * kjs/NumberPrototype.h: - * kjs/lexer.h: - * kjs/lookup.h: + * config.h: + * jsc.cpp: * wtf/Assertions.cpp: * wtf/Assertions.h: - * wtf/HashCountedSet.h: - * wtf/HashFunctions.h: - * wtf/HashIterators.h: - * wtf/HashMap.h: - * wtf/HashSet.h: - * wtf/HashTable.h: - * wtf/HashTraits.h: - * wtf/ListHashSet.h: - * wtf/ListRefPtr.h: - * wtf/Noncopyable.h: - * wtf/OwnArrayPtr.h: - * wtf/OwnPtr.h: - * wtf/PassRefPtr.h: + * wtf/CurrentTime.cpp: + (WTF::lowResUTCTime): + * wtf/DateMath.cpp: + (WTF::getLocalTime): + * wtf/MathExtras.h: * wtf/Platform.h: - * wtf/RefPtr.h: - * wtf/RefPtrHashMap.h: - * wtf/RetainPtr.h: - * wtf/UnusedParam.h: - * wtf/Vector.h: - * wtf/VectorTraits.h: - * wtf/unicode/Unicode.h: - * wtf/unicode/icu/UnicodeIcu.h: - -2008-08-22 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Oliver. - - Some cleanup to match our coding style. - - * VM/CodeGenerator.h: - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * kjs/ExecState.cpp: - * kjs/ExecState.h: - * kjs/completion.h: - * kjs/identifier.cpp: - (KJS::Identifier::equal): - (KJS::CStringTranslator::hash): - (KJS::CStringTranslator::equal): - (KJS::CStringTranslator::translate): - (KJS::UCharBufferTranslator::equal): - (KJS::UCharBufferTranslator::translate): - (KJS::Identifier::remove): - * kjs/operations.h: - -2008-08-20 Alexey Proskuryakov <ap@webkit.org> - - Windows build fix. - - * API/WebKitAvailability.h: Define DEPRECATED_ATTRIBUTE. - -2008-08-19 Alexey Proskuryakov <ap@webkit.org> - - Reviewed by Geoff Garen. - - Bring back shared JSGlobalData and implicit locking, because too many clients rely on it. - - * kjs/JSGlobalData.cpp: - (KJS::JSGlobalData::~JSGlobalData): - (KJS::JSGlobalData::JSGlobalData): Re-add shared instance. - (KJS::JSGlobalData::sharedInstanceExists): Ditto. - (KJS::JSGlobalData::sharedInstance): Ditto. - (KJS::JSGlobalData::sharedInstanceInternal): Ditto. - - * API/JSContextRef.h: Deprecated JSGlobalContextCreate(). Added a very conservative - description of its threading model (nothing is allowed). - - * API/JSContextRef.cpp: - (JSGlobalContextCreate): Use shared JSGlobalData. - (JSGlobalContextCreateInGroup): Support passing NULL group to request a unique one. - (JSGlobalContextRetain): Added back locking. - (JSGlobalContextRelease): Ditto. - (JSContextGetGlobalObject): Ditto. - - * API/tests/minidom.c: (main): - * API/tests/testapi.c: (main): - Switched to JSGlobalContextCreateInGroup() to avoid deprecation warnings. - - * JavaScriptCore.exp: Re-added JSLock methods. Added JSGlobalContextCreateInGroup (d'oh!). - - * 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/JSObjectRef.cpp: - (JSObjectMake): - (JSObjectMakeFunctionWithCallback): - (JSObjectMakeConstructor): - (JSObjectMakeFunction): - (JSObjectHasProperty): - (JSObjectGetProperty): - (JSObjectSetProperty): - (JSObjectGetPropertyAtIndex): - (JSObjectSetPropertyAtIndex): - (JSObjectDeleteProperty): - (JSObjectCallAsFunction): - (JSObjectCallAsConstructor): - (JSObjectCopyPropertyNames): - (JSPropertyNameArrayRelease): - (JSPropertyNameAccumulatorAddName): - * API/JSValueRef.cpp: - (JSValueIsEqual): - (JSValueIsInstanceOfConstructor): - (JSValueMakeNumber): - (JSValueMakeString): - (JSValueToNumber): - (JSValueToStringCopy): - (JSValueToObject): - (JSValueProtect): - (JSValueUnprotect): - * ForwardingHeaders/JavaScriptCore/JSLock.h: Added. - * GNUmakefile.am: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - * kjs/AllInOneFile.cpp: - * kjs/JSGlobalData.h: - * kjs/JSGlobalObject.cpp: - (KJS::JSGlobalObject::~JSGlobalObject): - (KJS::JSGlobalObject::init): - * kjs/JSLock.cpp: Added. - (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: Added. - (KJS::JSLock::JSLock): - (KJS::JSLock::~JSLock): - * 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): - Re-added implicit locking. - -2008-08-19 Kevin McCullough <kmccullough@apple.com> - - Reviewed by Tim and Mark. - - Implement DTrace hooks for dashcode and instruments. - - * API/JSProfilerPrivate.cpp: Added. Expose SPI so that profiling can be - turned on from a client. The DTrace probes were added within the - profiler mechanism for performance reasons so the profiler must be - started to enable tracing. - (JSStartProfiling): - (JSEndProfiling): - * API/JSProfilerPrivate.h: Added. Ditto. - * JavaScriptCore.exp: Exposing the start/stop methods to clients. - * JavaScriptCore.xcodeproj/project.pbxproj: - * kjs/Tracing.d: Define the DTrace probes. - * kjs/Tracing.h: Ditto. - * profiler/ProfileGenerator.cpp: Implement the DTrace probes in the - profiler. - (KJS::ProfileGenerator::willExecute): - (KJS::ProfileGenerator::didExecute): - -2008-08-19 Steve Falkenburg <sfalken@apple.com> - - Build fix. - - * kjs/operations.cpp: - (KJS::equal): - -2008-08-18 Timothy Hatcher <timothy@apple.com> - - Fix an assertion when generating a heavy profile because the - empty value and deleted value of CallIdentifier where equal. - - https://bugs.webkit.org/show_bug.cgi?id=20439 - - Reviewed by Dan Bernstein. - - * profiler/CallIdentifier.h: Make the emptyValue for CallIdentifier - use empty strings for URL and function name. - -2008-08-12 Darin Adler <darin@apple.com> - - Reviewed by Geoff. - - - eliminate JSValue::type() - - This will make it slightly easier to change the JSImmediate design without - having to touch so many call sites. - - SunSpider says this change is a wash (looked like a slight speedup, but not - statistically significant). - - * API/JSStringRef.cpp: Removed include of JSType.h. - * API/JSValueRef.cpp: Removed include of JSType.h. - (JSValueGetType): Replaced use of JSValue::type() with - JSValue::is functions. - - * JavaScriptCore.exp: Updated. - - * VM/JSPropertyNameIterator.cpp: Removed type() implementation. - (KJS::JSPropertyNameIterator::toPrimitive): Changed to take - PreferredPrimitiveType argument instead of JSType. - * VM/JSPropertyNameIterator.h: Ditto. - - * VM/Machine.cpp: - (KJS::fastIsNumber): Updated for name change. - (KJS::fastToInt32): Ditto. - (KJS::fastToUInt32): Ditto. - (KJS::jsAddSlowCase): Updated toPrimitive caller for change from - JSType to PreferredPrimitiveType. - (KJS::jsAdd): Replaced calls to JSValue::type() with calls to - JSValue::isString(). - (KJS::jsTypeStringForValue): Replaced calls to JSValue::type() - with multiple calls to JSValue::is -- we could make this a - virtual function instead if we want to have faster performance. - (KJS::Machine::privateExecute): Renamed JSImmediate::toTruncatedUInt32 - to JSImmediate::getTruncatedUInt32 for consistency with other functions. - Changed two calls of JSValue::type() to JSValue::isString(). - - * kjs/GetterSetter.cpp: - (KJS::GetterSetter::toPrimitive): Changed to take - PreferredPrimitiveType argument instead of JSType. - (KJS::GetterSetter::isGetterSetter): Added. - * kjs/GetterSetter.h: - - * kjs/JSCell.cpp: - (KJS::JSCell::isString): Added. - (KJS::JSCell::isGetterSetter): Added. - (KJS::JSCell::isObject): Added. - - * kjs/JSCell.h: Eliminated type function. Added isGetterSetter. - Made isString and isObject virtual. Changed toPrimitive to take - PreferredPrimitiveType argument instead of JSType. - (KJS::JSCell::isNumber): Use Heap::isNumber for faster performance. - (KJS::JSValue::isGetterSetter): Added. - (KJS::JSValue::toPrimitive): Changed to take - PreferredPrimitiveType argument instead of JSType. - - * kjs/JSImmediate.h: Removed JSValue::type() and replaced - JSValue::toTruncatedUInt32 with JSValue::getTruncatedUInt32. - (KJS::JSImmediate::isEitherImmediate): Added. - - * kjs/JSNotAnObject.cpp: - (KJS::JSNotAnObject::toPrimitive): Changed to take - PreferredPrimitiveType argument instead of JSType. - * kjs/JSNotAnObject.h: Ditto. - * kjs/JSNumberCell.cpp: - (KJS::JSNumberCell::toPrimitive): Ditto. - * kjs/JSNumberCell.h: - (KJS::JSNumberCell::toInt32): Renamed from fastToInt32. There's no - other "slow" version of this once you have a JSNumberCell, so there's - no need for "fast" in the name. It's a feature that this hides the - base class toInt32, which does the same job less efficiently (and has - an additional ExecState argument). - (KJS::JSNumberCell::toUInt32): Ditto. - - * kjs/JSObject.cpp: - (KJS::callDefaultValueFunction): Use isGetterSetter instead of type. - (KJS::JSObject::getPrimitiveNumber): Use PreferredPrimitiveType. - (KJS::JSObject::defaultValue): Ditto. - (KJS::JSObject::defineGetter): Use isGetterSetter. - (KJS::JSObject::defineSetter): Ditto. - (KJS::JSObject::lookupGetter): Ditto. - (KJS::JSObject::lookupSetter): Ditto. - (KJS::JSObject::toNumber): Use PreferredPrimitiveType. - (KJS::JSObject::toString): Ditto. - (KJS::JSObject::isObject): Added. - - * kjs/JSObject.h: - (KJS::JSObject::inherits): Call the isObject from JSCell; it's now - hidden by our override of isObject. - (KJS::JSObject::getOwnPropertySlotForWrite): Use isGetterSetter - instead of type. - (KJS::JSObject::getOwnPropertySlot): Ditto. - (KJS::JSObject::toPrimitive): Use PreferredPrimitiveType. - - * kjs/JSString.cpp: - (KJS::JSString::toPrimitive): Use PreferredPrimitiveType. - (KJS::JSString::isString): Added. - * kjs/JSString.h: Ditto. - - * kjs/JSValue.h: Removed type(), added isGetterSetter(). Added - PreferredPrimitiveType enum and used it as the argument for the - toPrimitive function. - (KJS::JSValue::getBoolean): Simplified a bit an removed a branch. - - * kjs/collector.cpp: - (KJS::typeName): Changed to use JSCell::is functions instead of - calling JSCell::type. - - * kjs/collector.h: - (KJS::Heap::isNumber): Renamed from fastIsNumber. - - * kjs/nodes.h: Added now-needed include of JSType, since the type - is used here to record types of values in the tree. - - * kjs/operations.cpp: - (KJS::equal): Rewrote to no longer depend on type(). - (KJS::strictEqual): Ditto. - -2008-08-18 Kevin McCullough <kmccullough@apple.com> - - Reviewed by Tim. - - If there are no nodes in a profile all the time should be attributed to - (idle) - - * profiler/Profile.cpp: If ther are no nodes make sure we still process - the head. - (KJS::Profile::forEach): - * profiler/ProfileGenerator.cpp: Remove some useless code. - (KJS::ProfileGenerator::stopProfiling): - -2008-08-18 Alexey Proskuryakov <ap@webkit.org> - - Reviewed by Maciej. - - Make JSGlobalContextRetain/Release actually work. - - * API/JSContextRef.cpp: - (JSGlobalContextRetain): - (JSGlobalContextRelease): - Ref/deref global data to give checking for globalData.refCount() some sense. - - * API/tests/testapi.c: (main): Added a test for this bug. - - * kjs/JSGlobalData.cpp: - (KJS::JSGlobalData::~JSGlobalData): - While checking for memory leaks, found that JSGlobalData::emptyList has changed to - a pointer, but it was not destructed, causing a huge leak in run-webkit-tests --threaded. - -2008-08-17 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Maciej. - - Change the counting of constants so that preincrement and predecrement of - const local variables are considered unexpected loads. - - * kjs/nodes.cpp: - (KJS::PrefixResolveNode::emitCode): - * kjs/nodes.h: - (KJS::ScopeNode::neededConstants): - -2008-08-17 Oliver Hunt <oliver@apple.com> - - Reviewed by Cameron Zwarich. - - <rdar://problem/6150322> In Gmail, a crash occurs at KJS::Machine::privateExecute() when applying list styling to text after a quote had been removed - <https://bugs.webkit.org/show_bug.cgi?id=20386> - - This crash was caused by "depth()" incorrectly determining the scope depth - of a 0 depth function without a full scope chain. Because such a function - would not have an activation the depth function would return the scope depth - of the parent frame, thus triggering an incorrect unwind. Any subsequent - look up that walked the scope chain would result in incorrect behaviour, - leading to a crash or incorrect variable resolution. This can only actually - happen in try...finally statements as that's the only path that can result in - the need to unwind the scope chain, but not force the function to need a - full scope chain. - - The fix is simply to check for this case before attempting to walk the scope chain. - - * VM/Machine.cpp: - (KJS::depth): - (KJS::Machine::throwException): - -2008-08-17 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Maciej. - - Bug 20419: Remove op_jless - <https://bugs.webkit.org/show_bug.cgi?id=20419> - - Remove op_jless, which is rarely used now that we have op_loop_if_less. - - * VM/CodeBlock.cpp: - (KJS::CodeBlock::dump): - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::emitJumpIfTrue): - * VM/Machine.cpp: - (KJS::Machine::privateExecute): - * VM/Opcode.h: - -2008-08-17 Cameron Zwarich <cwzwarich@uwaterloo.ca> - - Reviewed by Dan Bernstein. - - Fix a typo in r35807 that is also causing build failures for - non-AllInOne builds. - - * kjs/NumberConstructor.cpp: - -2008-08-17 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Cameron Zwarich. - - Made room for a free word in JSCell. - - SunSpider says no change. - - I changed JSCallbackObjectData, Arguments, JSArray, and RegExpObject to - store auxiliary data in a secondary structure. - - I changed InternalFunction to store the function's name in the property - map. - - I changed JSGlobalObjectData to use a virtual destructor, so WebCore's - JSDOMWindowBaseData could inherit from it safely. (It's a strange design - for JSDOMWindowBase to allocate an object that JSGlobalObject deletes, - but that's really our only option, given the size constraint.) - - I also added a bunch of compile-time ASSERTs, and removed lots of comments - in JSObject.h because they were often out of date, and they got in the - way of reading what was actually going on. - - Also renamed JSArray::getLength to JSArray::length, to match our style - guidelines. - -2008-08-16 Geoffrey Garen <ggaren@apple.com> - - Reviewed by Oliver Hunt. - - Sped up property access for array.length and string.length by adding a - mechanism for returning a temporary value directly instead of returning - a pointer to a function that retrieves the value. - - Also removed some unused cruft from PropertySlot. - - SunSpider says 0.5% - 1.2% faster. - - NOTE: This optimization is not a good idea in general, because it's - actually a pessimization in the case of resolve for assignment, - and it may get in the way of other optimizations in the future. - -2008-08-16 Dan Bernstein <mitz@apple.com> - - Reviewed by Geoffrey Garen. - - Disable dead code stripping in debug builds. - - * Configurations/Base.xcconfig: - * JavaScriptCore.xcodeproj/project.pbxproj: + * wtf/StringExtras.h: + * wtf/Threading.h: + * wtf/win/MainThreadWin.cpp: -2008-08-15 Mark Rowe <mrowe@apple.com> +2009-06-17 Gavin Barraclough <barraclough@apple.com> Reviewed by Oliver Hunt. - <rdar://problem/6143072> FastMallocZone's enumeration code makes assumptions about handling of remote memory regions that overlap - - * wtf/FastMalloc.cpp: - (WTF::TCMalloc_Central_FreeList::enumerateFreeObjects): Don't directly compare pointers mapped into the local process with - a pointer that has not been mapped. Instead, calculate a local address for the pointer and compare with that. - (WTF::TCMallocStats::FreeObjectFinder::findFreeObjects): Pass in the remote address of the central free list so that it can - be used when calculating local addresses. - (WTF::TCMallocStats::FastMallocZone::enumerate): Ditto. - -2008-08-15 Mark Rowe <mrowe@apple.com> - - Rubber-stamped by Geoff Garen. - - <rdar://problem/6139914> Please include a _debug version of JavaScriptCore framework - - * Configurations/Base.xcconfig: Factor out the debug-only settings so that they can shared - between the Debug configuration and debug Production variant. - * JavaScriptCore.xcodeproj/project.pbxproj: Enable the debug variant. - -2008-08-15 Mark Rowe <mrowe@apple.com> - - Fix the 64-bit build. - - Add extra cast to avoid warnings about loss of precision when casting from - JSValue* to an integer type. - - * kjs/JSImmediate.h: - (KJS::JSImmediate::intValue): - (KJS::JSImmediate::uintValue): - -2008-08-15 Alexey Proskuryakov <ap@webkit.org> - - Still fixing Windows build. - - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.make: Added OpaqueJSString - to yet another place. - -2008-08-15 Alexey Proskuryakov <ap@webkit.org> - - Trying to fix non-Apple builds. - - * ForwardingHeaders/JavaScriptCore/OpaqueJSString.h: Added. - -2008-08-15 Gavin Barraclough <barraclough@apple.com> - - Reviewed by Geoff Garen. - - Allow JSImmediate to hold 31 bit signed integer immediate values. The low two bits of a - JSValue* are a tag, with the tag value 00 indicating the JSValue* is a pointer to a - JSCell. Non-zero tag values used to indicate that the JSValue* is not a real pointer, - but instead holds an immediate value encoded within the pointer. This patch changes the - encoding so both the tag values 01 and 11 indicate the value is a signed integer, allowing - a 31 bit value to be stored. All other immediates are tagged with the value 10, and - distinguished by a secondary tag. - - Roughly +2% on SunSpider. - - * kjs/JSImmediate.h: Encoding of JSImmediates has changed - see comment at head of file for - descption of new layout. - -2008-08-15 Alexey Proskuryakov <ap@webkit.org> - - More build fixes. - - * API/OpaqueJSString.h: Add a namespace to friend declaration to appease MSVC. - * API/JSStringRefCF.h: (JSStringCreateWithCFString) Cast UniChar* to UChar* explicitly. - * JavaScriptCore.exp: Added OpaqueJSString::create(const KJS::UString&) to fix WebCore build. - -2008-08-15 Alexey Proskuryakov <ap@webkit.org> - - Build fix. - - * JavaScriptCore.xcodeproj/project.pbxproj: Marked OpaqueJSString as private + <rdar://problem/6974175> ASSERT in JITStubs.cpp at appsaccess.apple.com - * kjs/identifier.cpp: - (KJS::Identifier::checkSameIdentifierTable): - * kjs/identifier.h: - (KJS::Identifier::add): - Since checkSameIdentifierTable is exported for debug build's sake, gcc wants it to be - non-inline in release builds, too. + Remove PropertySlot::putValue - PropertySlots should only be used for getting, + not putting. Rename JSGlobalObject::getOwnPropertySlot to hasOwnPropertyForWrite, + which is what it really was being used to ask, and remove some other getOwnPropertySlot + & getOwnPropertySlotForWrite methods, which were unused and likely to lead to confusion. - * JavaScriptCore.exp: Don't export inline OpaqueJSString destructor. - -2008-08-15 Alexey Proskuryakov <ap@webkit.org> + * runtime/JSGlobalObject.h: + (JSC::JSGlobalObject::hasOwnPropertyForWrite): + * runtime/JSObject.h: + * runtime/JSStaticScopeObject.cpp: + * runtime/JSStaticScopeObject.h: + * runtime/PropertySlot.h: - Reviewed by Geoff Garen. +2009-06-16 Gavin Barraclough <barraclough@apple.com> - JSStringRef is created context-free, but can get linked to one via an identifier table, - breaking an implicit API contract. + Reviewed by Oliver hunt. - Made JSStringRef point to OpaqueJSString, which is a new string object separate from UString. + Temporarily partially disable r44492, since this is causing some problems on internal builds. - * API/APICast.h: Removed toRef/toJS conversions for JSStringRef, as this is no longer a - simple typecast. + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_throw): + * jit/JITStubs.cpp: + (JSC::JITStubs::DEFINE_STUB_FUNCTION): - * kjs/identifier.cpp: - (KJS::Identifier::checkSameIdentifierTable): - * kjs/identifier.h: - (KJS::Identifier::add): - (KJS::UString::checkSameIdentifierTable): - Added assertions to verify that an identifier is not being added to a different JSGlobalData. +2009-06-16 Sam Weinig <sam@webkit.org> - * API/JSObjectRef.cpp: - (OpaqueJSPropertyNameArray::OpaqueJSPropertyNameArray): Changed OpaqueJSPropertyNameArray to - hold JSStringRefs. This is necessary to avoid having to construct (and leak) a new instance - in JSPropertyNameArrayGetNameAtIndex(), now that making a JSStringRef is not just a typecast. - - * API/OpaqueJSString.cpp: Added. - (OpaqueJSString::create): - (OpaqueJSString::ustring): - (OpaqueJSString::identifier): - * API/OpaqueJSString.h: Added. - (OpaqueJSString::create): - (OpaqueJSString::characters): - (OpaqueJSString::length): - (OpaqueJSString::OpaqueJSString): - (OpaqueJSString::~OpaqueJSString): - - * API/JSBase.cpp: - (JSEvaluateScript): - (JSCheckScriptSyntax): - * API/JSCallbackObjectFunctions.h: - (KJS::::getOwnPropertySlot): - (KJS::::put): - (KJS::::deleteProperty): - (KJS::::staticValueGetter): - (KJS::::callbackGetter): - * API/JSStringRef.cpp: - (JSStringCreateWithCharacters): - (JSStringCreateWithUTF8CString): - (JSStringRetain): - (JSStringRelease): - (JSStringGetLength): - (JSStringGetCharactersPtr): - (JSStringGetMaximumUTF8CStringSize): - (JSStringGetUTF8CString): - (JSStringIsEqual): - * API/JSStringRefCF.cpp: - (JSStringCreateWithCFString): - (JSStringCopyCFString): - * API/JSValueRef.cpp: - (JSValueMakeString): - (JSValueToStringCopy): - Updated to use OpaqueJSString. + Fix windows build. - * GNUmakefile.am: - * JavaScriptCore.exp: - * JavaScriptCore.pri: - * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - * JavaScriptCoreSources.bkl: - Added OpaqueJSString. - -2008-08-14 Kevin McCullough <kmccullough@apple.com> - - Reviewed by Tim. - - <rdar://problem/6115819> Notify of profile in console - - Profiles now have a unique ID so that they can be linked to the - console message that announces that a profile completed. - - * profiler/HeavyProfile.cpp: - (KJS::HeavyProfile::HeavyProfile): - * profiler/Profile.cpp: - (KJS::Profile::create): - (KJS::Profile::Profile): - * profiler/Profile.h: - (KJS::Profile::uid): - * profiler/ProfileGenerator.cpp: - (KJS::ProfileGenerator::create): - (KJS::ProfileGenerator::ProfileGenerator): - * profiler/ProfileGenerator.h: - * profiler/Profiler.cpp: - (KJS::Profiler::startProfiling): - * profiler/TreeProfile.cpp: - (KJS::TreeProfile::create): - (KJS::TreeProfile::TreeProfile): - * profiler/TreeProfile.h: + * jit/JIT.cpp: + (JSC::JIT::JIT): -2008-08-13 Geoffrey Garen <ggaren@apple.com> +2009-06-16 Sam Weinig <sam@webkit.org> Reviewed by Oliver Hunt. - - Nixed a PIC branch from JSObject::getOwnPropertySlot, by forcing - fillGetterProperty, which references a global function pointer, - out-of-line. - - .2% SunSpider speedup, 4.3% access-nbody speedup, 8.7% speedup on a - custom property access benchmark for objects with one property. - - * kjs/JSObject.cpp: - (KJS::JSObject::fillGetterPropertySlot): - -2008-08-13 Alp Toker <alp@nuanti.com> - - Reviewed by Eric Seidel. - - https://bugs.webkit.org/show_bug.cgi?id=20349 - WTF::initializeThreading() fails if threading is already initialized - - Fix threading initialization logic to support cases where - g_thread_init() has already been called elsewhere. - - Resolves database-related crashers reported in several applications. - - * wtf/ThreadingGtk.cpp: - (WTF::initializeThreading): - -2008-08-13 Brad Hughes <bhughes@trolltech.com> - - Reviewed by Simon. - - Fix compiling of QtWebKit in release mode with the Intel C++ Compiler for Linux - - The latest upgrade of the intel compiler allows us to compile all of - Qt with optimizations enabled (yay!). - - * JavaScriptCore.pro: - -2008-08-12 Oliver Hunt <oliver@apple.com> - - Reviewed by Geoff Garen. - - Add peephole optimisation to 'op_not... jfalse...' (eg. if(!...) ) - - This is a very slight win in sunspider, and a fairly substantial win - in hot code that does if(!...), etc. - - * VM/CodeGenerator.cpp: - (KJS::CodeGenerator::retrieveLastUnaryOp): - (KJS::CodeGenerator::rewindBinaryOp): - (KJS::CodeGenerator::rewindUnaryOp): - (KJS::CodeGenerator::emitJumpIfFalse): - * VM/CodeGenerator.h: - -2008-08-12 Dan Bernstein <mitz@apple.com> - - JavaScriptCore part of <rdar://problem/6121636> - Make fast*alloc() abort() on failure and add "try" variants that - return NULL on failure. + Initialize m_bytecodeIndex to -1 in JIT, and correctly initialize + it for each type of stub using the return address to find the correct + offset. - Reviewed by Darin Adler. - - * JavaScriptCore.exp: Exported tryFastCalloc(). - * VM/RegisterFile.h: - (KJS::RegisterFile::RegisterFile): Removed an ASSERT(). - * kjs/JSArray.cpp: - (KJS::JSArray::putSlowCase): Changed to use tryFastRealloc(). - (KJS::JSArray::increaseVectorLength): Ditto. - * kjs/ustring.cpp: - (KJS::allocChars): Changed to use tryFastMalloc(). - (KJS::reallocChars): Changed to use tryFastRealloc(). - * wtf/FastMalloc.cpp: - (WTF::fastZeroedMalloc): Removed null checking of fastMalloc()'s result - and removed extra call to InvokeNewHook(). - (WTF::tryFastZeroedMalloc): Added. Uses tryFastMalloc(). - (WTF::tryFastMalloc): Renamed fastMalloc() to this. - (WTF::fastMalloc): Added. This version abort()s if allocation fails. - (WTF::tryFastCalloc): Renamed fastCalloc() to this. - (WTF::fastCalloc): Added. This version abort()s if allocation fails. - (WTF::tryFastRealloc): Renamed fastRealloc() to this. - (WTF::fastRealloc): Added. This version abort()s if allocation fails. - (WTF::do_malloc): Made this a function template. When the abortOnFailure - template parameter is set, the function abort()s on failure to allocate. - Otherwise, it sets errno to ENOMEM and returns zero. - (WTF::TCMallocStats::fastMalloc): Defined to abort() on failure. - (WTF::TCMallocStats::tryFastMalloc): Added. Does not abort() on - failure. - (WTF::TCMallocStats::fastCalloc): Defined to abort() on failure. - (WTF::TCMallocStats::tryFastCalloc): Added. Does not abort() on - failure. - (WTF::TCMallocStats::fastRealloc): Defined to abort() on failure. - (WTF::TCMallocStats::tryFastRealloc): Added. Does not abort() on - failure. - * wtf/FastMalloc.h: Declared the "try" variants. - -2008-08-11 Adam Roben <aroben@apple.com> - - Move WTF::notFound into its own header so that it can be used - independently of Vector - - Rubberstamped by Darin Adler. - - * JavaScriptCore.vcproj/WTF/WTF.vcproj: - * JavaScriptCore.xcodeproj/project.pbxproj: - Added NotFound.h to the project. - * wtf/NotFound.h: Added. Moved the notFound constant here... - * wtf/Vector.h: ...from here. - -2008-08-11 Alexey Proskuryakov <ap@webkit.org> - - Reviewed by Mark Rowe. - - <rdar://problem/6130393> REGRESSION: PhotoBooth hangs after launching under TOT Webkit - - * API/JSContextRef.cpp: (JSGlobalContextRelease): Corrected a comment. - - * kjs/collector.cpp: (KJS::Heap::~Heap): Ensure that JSGlobalData is not deleted while - sweeping the heap. + * jit/JIT.cpp: + (JSC::JIT::JIT): + * jit/JIT.h: + (JSC::JIT::compileGetByIdProto): + (JSC::JIT::compileGetByIdSelfList): + (JSC::JIT::compileGetByIdProtoList): + (JSC::JIT::compileGetByIdChainList): + (JSC::JIT::compileGetByIdChain): + (JSC::JIT::compilePutByIdTransition): + (JSC::JIT::compileCTIMachineTrampolines): + (JSC::JIT::compilePatchGetArrayLength): + * jit/JITStubCall.h: + (JSC::JITStubCall::call): -== Rolled over to ChangeLog-2008-08-10 == +== Rolled over to ChangeLog-2009-06-16 == diff --git a/JavaScriptCore/ChangeLog-2007-10-14 b/JavaScriptCore/ChangeLog-2007-10-14 index a91f1ff..693f966 100644 --- a/JavaScriptCore/ChangeLog-2007-10-14 +++ b/JavaScriptCore/ChangeLog-2007-10-14 @@ -756,7 +756,7 @@ * wtf/Platform.h: Also test if __arm__ is defined. -2007-08-25 Peter Kasting <zerodpx@gmail.org> +2007-08-25 Peter Kasting <pkasting@google.com> Reviewed by Maciej Stachowiak. @@ -766,7 +766,7 @@ * wtf/Vector.h: (WTF::Vector::operator[]): Only provide versions of operator[] that takes a size_t argument. -2007-08-25 Peter Kasting <zerodpx@gmail.org> +2007-08-25 Peter Kasting <pkasting@google.com> Reviewed by Sam Weinig. @@ -786,7 +786,7 @@ * kjs/object.cpp: -2007-08-15 Peter Kasting <zerodpx@gmail.org> +2007-08-15 Peter Kasting <pkasting@google.com> Reviewed by Darin. @@ -4435,7 +4435,7 @@ Interestingly, even the single-threaded testkjs shows a speed gain from removing the pthread_is_threaded_np() short-circuit. Not sure why. -2007-03-04 Don Gibson <dgibson77@gmail.com> +2007-03-04 Peter Kasting <pkasting@google.com> Reviewed by Nikolas Zimmermann. diff --git a/JavaScriptCore/ChangeLog-2009-06-16 b/JavaScriptCore/ChangeLog-2009-06-16 new file mode 100644 index 0000000..52d3c36 --- /dev/null +++ b/JavaScriptCore/ChangeLog-2009-06-16 @@ -0,0 +1,39978 @@ +2009-06-15 Gavin Barraclough <barraclough@apple.com> + + Rubber Stamped by Sam Weinig. + + Rename PatchBuffer to LinkBuffer. Previously our terminology has been a little + mixed up, but we have decided to fix on refering to the process that takes place + at the end of code generation as 'linking', and on any modifications that take + place later (and once the code has potentially already been executed) as 'patching'. + + However, the term 'PatchBuffer' is already in use, and needs to be repurposed. + + To try to minimize confusion, we're going to switch the terminology over in stages, + so for now we'll refer to later modifications as 'repatching'. This means that the + new 'PatchBuffer' has been introduced with the name 'RepatchBuffer' instead. + + This patch renames the old 'PatchBuffer' to 'LinkBuffer'. We'll leave ToT in this + state for a week or so to try to avoid to much overlap of the meaning of the term + 'PatchBuffer', then will come back and rename 'RepatchBuffer'. + + * assembler/ARMv7Assembler.h: + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::LinkBuffer::LinkBuffer): + (JSC::AbstractMacroAssembler::LinkBuffer::~LinkBuffer): + * jit/JIT.cpp: + (JSC::JIT::privateCompile): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::privateCompilePatchGetArrayLength): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdSelfList): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChainList): + (JSC::JIT::privateCompileGetByIdChain): + * yarr/RegexJIT.cpp: + (JSC::Yarr::RegexGenerator::compile): + +2009-06-15 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Sam Weinig. + + Having moved most of their functionality into the RepatchBuffer class, + we can simplify the CodeLocation* classes. + + The CodeLocation* classes are currently a tangle of templatey and friendly + badness, burried in the middle of AbstractMacroAssembler. Having moved + the ability to repatch out into RepatchBufer they are now do-nothing wrappers + on CodePtr (MacroAssemblerCodePtr), that only exist to provide type-safety. + + Simplify the code, and move them off into their own header. + + * JavaScriptCore.xcodeproj/project.pbxproj: + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::PatchBuffer::patch): + * assembler/CodeLocation.h: Copied from assembler/AbstractMacroAssembler.h. + (JSC::CodeLocationCommon::CodeLocationCommon): + (JSC::CodeLocationInstruction::CodeLocationInstruction): + (JSC::CodeLocationLabel::CodeLocationLabel): + (JSC::CodeLocationJump::CodeLocationJump): + (JSC::CodeLocationCall::CodeLocationCall): + (JSC::CodeLocationNearCall::CodeLocationNearCall): + (JSC::CodeLocationDataLabel32::CodeLocationDataLabel32): + (JSC::CodeLocationDataLabelPtr::CodeLocationDataLabelPtr): + (JSC::CodeLocationCommon::instructionAtOffset): + (JSC::CodeLocationCommon::labelAtOffset): + (JSC::CodeLocationCommon::jumpAtOffset): + (JSC::CodeLocationCommon::callAtOffset): + (JSC::CodeLocationCommon::nearCallAtOffset): + (JSC::CodeLocationCommon::dataLabelPtrAtOffset): + (JSC::CodeLocationCommon::dataLabel32AtOffset): + * assembler/MacroAssemblerCodeRef.h: + (JSC::MacroAssemblerCodePtr::operator!): + * bytecode/CodeBlock.h: + (JSC::getStructureStubInfoReturnLocation): + (JSC::getCallLinkInfoReturnLocation): + (JSC::getMethodCallLinkInfoReturnLocation): + * bytecode/Instruction.h: + * bytecode/JumpTable.h: + (JSC::StringJumpTable::ctiForValue): + (JSC::SimpleJumpTable::ctiForValue): + * bytecode/StructureStubInfo.h: + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitCatch): + * jit/JIT.cpp: + (JSC::JIT::privateCompile): + * jit/JITStubs.cpp: + (JSC::JITStubs::DEFINE_STUB_FUNCTION): + (JSC::JITStubs::getPolymorphicAccessStructureListSlot): + +2009-06-15 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Sam Weinig. + + Having introduced the RepatchBuffer, ProcessorReturnAddress is now a do-nothing + wrapper around ReturnAddressPtr. Remove it. In tugging on this piece of string + it made sense to roll out the use of ReturnAddressPtr a little further into + JITStubs (which had always been the intention). + + No performance impact. + + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::RepatchBuffer::relinkCallerToTrampoline): + (JSC::AbstractMacroAssembler::RepatchBuffer::relinkCallerToFunction): + (JSC::AbstractMacroAssembler::RepatchBuffer::relinkNearCallerToTrampoline): + * assembler/MacroAssemblerCodeRef.h: + (JSC::ReturnAddressPtr::ReturnAddressPtr): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::getStubInfo): + (JSC::CodeBlock::getCallLinkInfo): + (JSC::CodeBlock::getMethodCallLinkInfo): + (JSC::CodeBlock::getBytecodeIndex): + * interpreter/Interpreter.cpp: + (JSC::bytecodeOffsetForPC): + * jit/JIT.cpp: + (JSC::ctiPatchNearCallByReturnAddress): + (JSC::ctiPatchCallByReturnAddress): + * jit/JIT.h: + (JSC::JIT::compileGetByIdProto): + (JSC::JIT::compileGetByIdChain): + (JSC::JIT::compilePutByIdTransition): + (JSC::JIT::compilePatchGetArrayLength): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::patchGetByIdSelf): + (JSC::JIT::patchPutByIdReplace): + (JSC::JIT::privateCompilePatchGetArrayLength): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdChain): + * jit/JITStubs.cpp: + (JSC::JITThunks::tryCachePutByID): + (JSC::JITThunks::tryCacheGetByID): + (JSC::StackHack::StackHack): + (JSC::returnToThrowTrampoline): + (JSC::throwStackOverflowError): + (JSC::JITStubs::DEFINE_STUB_FUNCTION): + * jit/JITStubs.h: + (JSC::): + (JSC::JITStackFrame::returnAddressSlot): + * runtime/JSGlobalData.h: + +2009-06-15 Simon Fraser <simon.fraser@apple.com> + + Reviewed by Mark Rowe. + + <rdar://problem/6974857> + + Define ENABLE_3D_RENDERING when building on 10.6, and move ENABLE_3D_RENDERING + switch from config.h to wtf/Platform.h. + + * Configurations/FeatureDefines.xcconfig: + * wtf/Platform.h: + +2009-06-15 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Move repatching methods into a set of methods on a class. This will allow us to + coallesce memory reprotection calls. Really, we want this class to be called + PatchBuffer, we want the class PatchBuffer to be called LinkBuffer, we want both + to be memblers of MacroAssembler rather then AbstractMacroAssembler, we don't + want the CodeLocationFoo types anymore (they are now only really there to provide + type safety, and that is completely undermined by the way we use offsets). Then + the link & patch buffers should delegate the actual patching calls to the + architecture-specific layer of the MacroAssembler. Landing all these changes as a + sequence of patches. + + No performance impact. + + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::CodeLocationCall::CodeLocationCall): + (JSC::AbstractMacroAssembler::CodeLocationNearCall::CodeLocationNearCall): + (JSC::AbstractMacroAssembler::CodeLocationNearCall::calleeReturnAddressValue): + (JSC::AbstractMacroAssembler::RepatchBuffer::RepatchBuffer): + (JSC::AbstractMacroAssembler::RepatchBuffer::relink): + (JSC::AbstractMacroAssembler::RepatchBuffer::repatch): + (JSC::AbstractMacroAssembler::RepatchBuffer::relinkCallerToTrampoline): + (JSC::AbstractMacroAssembler::RepatchBuffer::relinkCallerToFunction): + (JSC::AbstractMacroAssembler::RepatchBuffer::relinkNearCallerToTrampoline): + (JSC::AbstractMacroAssembler::RepatchBuffer::repatchLoadPtrToLEA): + * jit/JIT.cpp: + (JSC::ctiPatchNearCallByReturnAddress): + (JSC::ctiPatchCallByReturnAddress): + (JSC::JIT::unlinkCall): + (JSC::JIT::linkCall): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::patchGetByIdSelf): + (JSC::JIT::patchMethodCallProto): + (JSC::JIT::patchPutByIdReplace): + (JSC::JIT::privateCompilePatchGetArrayLength): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdSelfList): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChainList): + (JSC::JIT::privateCompileGetByIdChain): + +2009-06-15 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Hunt & Oliver Garen. + + We are currently generating two copies of the slow path for op_call for no reason. Stop that. + + Originally op_call used two slow paths since the first set up the pointer to the CallLinkInfo + for use when linking. However this is now looked up using the return address (as we do for + property accesses) so the two paths are now identical. + + No performance impact, reduces memory footprint. + + * bytecode/CodeBlock.h: + * jit/JIT.cpp: + (JSC::JIT::privateCompile): + (JSC::JIT::linkCall): + * jit/JIT.h: + * jit/JITCall.cpp: + (JSC::JIT::compileOpCallSlowCase): + * jit/JITStubs.cpp: + (JSC::JITStubs::DEFINE_STUB_FUNCTION): + +2009-06-12 Dave Hyatt <hyatt@apple.com> + + Reviewed by Anders Carlsson. + + https://bugs.webkit.org/show_bug.cgi?id=26373 + + Add a new class to Threading in wtf called ReadWriteLock that handles single writer/multiple reader locking. + Provide a pthreads-only implementation of the lock for now, as this class is only going to be used + on Snow Leopard at first. + + * wtf/Threading.h: + (WTF::ReadWriteLock::impl): + * wtf/ThreadingPthreads.cpp: + (WTF::ReadWriteLock::ReadWriteLock): + (WTF::ReadWriteLock::~ReadWriteLock): + (WTF::ReadWriteLock::readLock): + (WTF::ReadWriteLock::tryReadLock): + (WTF::ReadWriteLock::writeLock): + (WTF::ReadWriteLock::tryWriteLock): + (WTF::ReadWriteLock::unlock): + +2009-06-12 Oliver Hunt <oliver@apple.com> + + Reviewed by Geoff Garen. + + Make LiteralParser non-recursive + + Convert LiteralParser from using a simple recursive descent parser + to a hand rolled PDA. Relatively simple conversion, but required + modifications to MarkedArgumentBuffer to make it more suitable as + a generic marked vector. I'll refactor and rename MarkedArgumentBuffer + in future as there are many other cases where it will be useful to + have such a class. + + * runtime/ArgList.h: + (JSC::MarkedArgumentBuffer::MarkedArgumentBuffer): + (JSC::MarkedArgumentBuffer::append): + (JSC::MarkedArgumentBuffer::removeLast): + (JSC::MarkedArgumentBuffer::last): + * runtime/LiteralParser.cpp: + (JSC::LiteralParser::parse): + * runtime/LiteralParser.h: + (JSC::LiteralParser::LiteralParser): + (JSC::LiteralParser::tryLiteralParse): + (JSC::LiteralParser::): + +2009-06-12 David Levin <levin@chromium.org> + + Reviewed by NOBODY (build fix for windows). + + Adjust the exports for JSC on Windows like what was done for OSX in + the previous commit. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + +2009-06-12 David Levin <levin@chromium.org> + + Reviewed by Darin Adler. + + UString shouldn't create sharedBuffer for SmallStrings. + https://bugs.webkit.org/show_bug.cgi?id=26360 + + The methods changed are not used by JSC, so there is no JS perf impact. However, + there is a potential DOM perf impact, so I re-ran several of the tests that + I ran previously and ensured that the perf stay the same which caused me to + adjust the minLengthToShare. + + * JavaScriptCore.exp: + * runtime/UString.cpp: + (JSC::UString::Rep::sharedBuffer): + Determines if the buffer being shared is big enough before doing so. + Previously, BaseString::sharedBuffer was called but it would only know + the length of the base string (BaseString::len) which may not be the same + as the string being shared (Rep::len). + (JSC::UString::BaseString::sharedBuffer): + This is now only be used by Rep::sharedBuffer. which does the length check. + * runtime/UString.h: + +2009-06-12 Dimitri Glazkov <dglazkov@chromium.org> + + Reviewed by Eric Seidel. + + https://bugs.webkit.org/show_bug.cgi?id=26191 + Remove xmath include in MathExtras.h, because it is not needed and also + breaks VS2008 builds with TR1 turned on. + + * wtf/MathExtras.h: Removed xmath include. + +2009-06-12 Peter Kasting <pkasting@google.com> + + Reviewed by Eric Seidel. + + * ChangeLog-2007-10-14: Change pseudonym "Don Gibson" to me (was used while Google Chrome was not public); update my email address. + +2009-06-12 Kevin Ollivier <kevino@theolliviers.com> + + wx build fix. Adding JSONObject.cpp to the build. + + * JavaScriptCoreSources.bkl: + +2009-06-12 Laszlo Gombos <laszlo.1.gombos@nokia.com> + + Reviewed by Jan Michael Alonzo. + + [Qt] Fix build break + https://bugs.webkit.org/show_bug.cgi?id=26340 + + * JavaScriptCore.pri: Add JSONObject.cpp to LUT files. + +2009-06-11 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (build fix). + + Lower stringify recursion limit to deal with small windows stack. + + * JavaScriptCore.xcodeproj/project.pbxproj: + * runtime/JSONObject.cpp: + (JSC::Stringifier::): + +2009-06-11 Laszlo Gombos <laszlo.1.gombos@nokia.com> + + Reviewed by Holger Freyther. + + Fix compilation warnings + <https://bugs.webkit.org/show_bug.cgi?id=26015> + + * wtf/ThreadingNone.cpp: + (WTF::ThreadCondition::wait): Fix compilation warning. + (WTF::ThreadCondition::timedWait): Ditto. + +2009-06-10 Brent Fulgham <bfulgham@webkit.org> + + Build fix for Windows target. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + Correct missing </File> tag after @r44550 that prevents the + project from being loaded in the Visual Studio IDE. + +2009-06-09 Gavin Barraclough <barraclough@apple.com> + + Rubber Stamped by Mark Rowe. + + Tidy up a couple of comments. + + * assembler/ARMv7Assembler.h: + Fix date in copyright, neaten up a couple of comments. + * assembler/MacroAssemblerARMv7.h: + Fix date in copyright. + +2009-06-07 Oliver Hunt <oliver@apple.com> + + Reviewed by Sam Weinig. + + Bug 26249: Support JSON.stringify + <https://bugs.webkit.org/show_bug.cgi?id=26249> + + Implement JSON.stringify. This patch handles all the semantics of the ES5 + JSON.stringify function, including replacer functions and arrays and both + string and numeric gap arguments. + + Currently uses a clamped recursive algorithm basically identical to the spec + description but with a few minor tweaks for performance and corrected semantics + discussed in the es-discuss mailing list. + + * DerivedSources.make: + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * interpreter/CallFrame.h: + (JSC::ExecState::jsonTable): + * runtime/CommonIdentifiers.h: + add toJSON to the list of common identifiers + + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + (JSC::JSGlobalData::~JSGlobalData): + * runtime/JSGlobalData.h: + * runtime/JSGlobalObject.cpp: + (JSC::JSGlobalObject::reset): + Add support for the JSON object lookup table + + * runtime/JSONObject.cpp: Added. + (JSC::): + (JSC::JSONObject::getOwnPropertySlot): + (JSC::Stringifier::): + (JSC::Stringifier::Stringifier): + (JSC::Stringifier::stringify): + (JSC::Stringifier::appendString): + + (JSC::Stringifier::StringKeyGenerator::StringKeyGenerator): + (JSC::Stringifier::StringKeyGenerator::getKey): + (JSC::Stringifier::IntKeyGenerator::IntKeyGenerator): + (JSC::Stringifier::IntKeyGenerator::getKey): + These KeyGenerator classes are used to abstract away the lazy evaluation of keys for + toJSON and replacer functions. + + (JSC::Stringifier::toJSONValue): + (JSC::Stringifier::stringifyArray): + (JSC::Stringifier::stringifyObject): + (JSC::JSONProtoFuncStringify): + * runtime/JSONObject.h: Added. + (JSC::JSONObject:::JSObject): + (JSC::JSONObject::classInfo): + (JSC::JSONObject::createStructure): + +2009-06-09 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Enable JIT_OPTIMIZE_CALL & JIT_OPTIMIZE_METHOD_CALLS on ARMv7 platforms. + + These optimizations function correctly with no further changes. + + * wtf/Platform.h: + Change to enable JIT_OPTIMIZE_CALL & JIT_OPTIMIZE_METHOD_CALLS. + +2009-06-09 Gavin Barraclough <barraclough@apple.com> + + Not Reviewed, build fix. + + * assembler/MacroAssemblerARMv7.h: + +2009-06-09 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Enable JIT_OPTIMIZE_ARITHMETIC on ARMv7 platforms. + + Temporarily split support for 'branchTruncateDoubleToInt32' onto its own switch + ('supportsFloatingPointTruncate'). See comment in MacroAssemblerARMv7, we need + to work out wherther we are going to be able to support the current interface on + all platforms, or whether this should be refactored. + + * assembler/MacroAssemblerARMv7.h: + (JSC::MacroAssemblerARMv7::supportsFloatingPoint): + Add implementation of supportsFloatingPointTruncate (returns true). + (JSC::MacroAssemblerARMv7::supportsFloatingPointTruncate): + Add implementation of supportsFloatingPointTruncate (returns false). + (JSC::MacroAssemblerARMv7::loadDouble): + (JSC::MacroAssemblerARMv7::storeDouble): + (JSC::MacroAssemblerARMv7::addDouble): + (JSC::MacroAssemblerARMv7::subDouble): + (JSC::MacroAssemblerARMv7::mulDouble): + (JSC::MacroAssemblerARMv7::convertInt32ToDouble): + (JSC::MacroAssemblerARMv7::branchDouble): + Implement FP code genertion operations. + * assembler/MacroAssemblerX86.h: + (JSC::MacroAssemblerX86::supportsFloatingPointTruncate): + Add implementation of supportsFloatingPointTruncate (returns true). + * assembler/MacroAssemblerX86_64.h: + (JSC::MacroAssemblerX86_64::supportsFloatingPointTruncate): + Add implementation of supportsFloatingPointTruncate (returns true). + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_rshift): + Changed to call supportsFloatingPointTruncate(). + (JSC::JIT::emitSlow_op_rshift): + Changed to call supportsFloatingPointTruncate(). + * wtf/Platform.h: + Change to enable JIT_OPTIMIZE_ARITHMETIC. + +2009-06-09 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Mark Rowe & Geoff Garen. + + Enable JIT_OPTIMIZE_PROPERTY_ACCESS on ARMv7 platforms. + + Firm up interface for planting load intructions that will be repatched by + repatchLoadPtrToLEA(). This method should now no longer be applied to just + any loadPtr instruction. + + * assembler/MacroAssemblerARMv7.h: + (JSC::MacroAssemblerARMv7::loadPtrWithPatchToLEA): + Implement loadPtrWithPatchToLEA interface (plants a load with a fixed width address). + (JSC::MacroAssemblerARMv7::move): + (JSC::MacroAssemblerARMv7::nearCall): + (JSC::MacroAssemblerARMv7::call): + (JSC::MacroAssemblerARMv7::moveWithPatch): + (JSC::MacroAssemblerARMv7::tailRecursiveCall): + Switch to use common method 'moveFixedWidthEncoding()' to perform fixed width (often patchable) loads. + (JSC::MacroAssemblerARMv7::moveFixedWidthEncoding): + Move an immediate to a register, always plants movT3/movt instruction pair. + * assembler/MacroAssemblerX86.h: + (JSC::MacroAssemblerX86::loadPtrWithPatchToLEA): + Implement loadPtrWithPatchToLEA interface (just a regular 32-bit load on x86). + * assembler/MacroAssemblerX86_64.h: + (JSC::MacroAssemblerX86_64::loadPtrWithPatchToLEA): + Implement loadPtrWithPatchToLEA interface (just a regular 64-bit load on x86_64). + * jit/JITPropertyAccess.cpp: + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::emit_op_put_by_id): + * wtf/Platform.h: + Change to enable JIT_OPTIMIZE_PROPERTY_ACCESS. + +2009-06-08 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Enable JS language JIT for ARM thumb2 platforms. Add ARMv7 specific + asm & constants, add appropriate configuration switches to Platform.h. + + Landing this disabled until jump linking is completed (see YARR jit patch). + + * assembler/MacroAssemblerARMv7.h: + (JSC::MacroAssemblerARMv7::load32): + Fix: should load pointer with ImmPtr not Imm32. + (JSC::MacroAssemblerARMv7::store32): + Fix: should load pointer with ImmPtr not Imm32. + (JSC::MacroAssemblerARMv7::move): + Fix: When moving an Imm32 that is actually a pointer, should call movT3() + not mov(), to ensure code generation is repeatable (for exception handling). + * jit/JIT.cpp: + (JSC::JIT::privateCompileCTIMachineTrampolines): + Disable JIT_OPTIMIZE_NATIVE_CALL specific code generation if the optimization is not enabled. + * jit/JIT.h: + Add ARMv7 specific values of constants & register names. + * jit/JITInlineMethods.h: + (JSC::JIT::preverveReturnAddressAfterCall): + (JSC::JIT::restoreReturnAddressBeforeReturn): + (JSC::JIT::restoreArgumentReferenceForTrampoline): + Implement for ARMv7 (move value to/from lr). + * jit/JITStubs.cpp: + Add JIT entry/thow trampolines, add macro to add thunk wrapper around stub routines. + * jit/JITStubs.h: + (JSC::JITStackFrame::returnAddressSlot): + Add ARMv7 stack frame object. + * wtf/Platform.h: + Add changes necessary to allow JIT to build on this platform, disabled. + +2009-06-08 Mark Rowe <mrowe@apple.com> + + Speculative GTK build fix. + + * wtf/DateMath.cpp: + +2009-06-08 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Mark Rowe. + + Previous patch caused a regression. + + Restructure so no new (empty, inline) function calls are added on x86. + + * jit/ExecutableAllocator.h: + (JSC::ExecutableAllocator::makeWritable): + (JSC::ExecutableAllocator::makeExecutable): + (JSC::ExecutableAllocator::reprotectRegion): + (JSC::ExecutableAllocator::cacheFlush): + +2009-06-08 Dimitri Glazkov <dglazkov@chromium.org> + + Unreviewed, GTK build fix (thanks, bdash). + + * GNUmakefile.am: Moved DateMath with all other wtf kin. + +2009-06-08 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Add (incomplete) support to YARR for running with the jit enabled + on Arm thumb2 platforms. Adds new Assembler/MacroAssembler classes, + along with cache flushing support, tweaks to MacroAssemblerCodePtr + to support decorated thumb code pointers, and new enter/exit code + to YARR jit for the platform. + + Support for this platform is still under development - the assembler + currrently only supports planting and linking jumps with a 16Mb range. + As such, initially commiting in a disabled state. + + * JavaScriptCore.xcodeproj/project.pbxproj: + Add new assembler files. + * assembler/ARMv7Assembler.h: Added. + Add new Assembler. + * assembler/AbstractMacroAssembler.h: + Tweaks to ensure sizes of pointer values planted in JIT code do not change. + * assembler/MacroAssembler.h: + On ARMv7 platforms use MacroAssemblerARMv7. + * assembler/MacroAssemblerARMv7.h: Added. + Add new MacroAssembler. + * assembler/MacroAssemblerCodeRef.h: + (JSC::FunctionPtr::FunctionPtr): + Add better ASSERT. + (JSC::ReturnAddressPtr::ReturnAddressPtr): + Add better ASSERT. + (JSC::MacroAssemblerCodePtr::MacroAssemblerCodePtr): + On ARMv7, MacroAssemblerCodePtr's mush be 'decorated' with a low bit set, + to indicate to the processor that the code is thumb code, not traditional + 32-bit ARM. + (JSC::MacroAssemblerCodePtr::dataLocation): + On ARMv7, decoration must be removed. + * jit/ExecutableAllocator.h: + (JSC::ExecutableAllocator::makeWritable): + Reformatted, no change. + (JSC::ExecutableAllocator::makeExecutable): + When marking code executable also cache flush it, where necessary. + (JSC::ExecutableAllocator::MakeWritable::MakeWritable): + Only use the null implementation of this class if both !ASSEMBLER_WX_EXCLUSIVE + and running on x86(_64) - on other platforms we may also need ensure that + makeExecutable is called at the end to flush caches. + (JSC::ExecutableAllocator::reprotectRegion): + Reformatted, no change. + (JSC::ExecutableAllocator::cacheFlush): + Cache flush a region of memory, or platforms where this is necessary. + * wtf/Platform.h: + Add changes necessary to allow YARR jit to build on this platform, disabled. + * yarr/RegexJIT.cpp: + (JSC::Yarr::RegexGenerator::generateEnter): + (JSC::Yarr::RegexGenerator::generateReturn): + Add support to these methods for ARMv7. + +2009-06-08 Dimitri Glazkov <dglazkov@chromium.org> + + Unreviewed, fix my previous fix. + + * runtime/DateInstance.cpp: + (JSC::DateInstance::msToGregorianDateTime): Use WTF namespace qualifier to + disambiguate func signatures. + +2009-06-08 Mark Rowe <mrowe@apple.com> + + Attempt to fix the Tiger build. + + * wtf/Platform.h: Only test the value of the macro once we know it is defined. + +2009-06-08 Dimitri Glazkov <dglazkov@chromium.org> + + Unreviewed, another Windows build fix. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + +2009-06-08 Dimitri Glazkov <dglazkov@chromium.org> + + Unreviewed, projectile-fixing Windows build. + + * runtime/DateConversion.cpp: Added StringExtras include. + * wtf/DateMath.cpp: Replaced math with algorithm include (looking for std::min def for Windows). + +2009-06-08 Dimitri Glazkov <dglazkov@chromium.org> + + Unreviewed, Windows build fix. + + * runtime/DateConstructor.cpp: Changed to use WTF namespace. + * runtime/DateConversion.cpp: Added UString include. + * runtime/DateInstance.cpp: Changed to use WTF namespace. + * wtf/DateMath.cpp: Added math include. + +2009-06-08 Dimitri Glazkov <dglazkov@chromium.org> + + Reviewed by Eric Seidel. + + https://bugs.webkit.org/show_bug.cgi?id=26238 + Move most of runtime/DateMath functions to wtf/DateMath, and split off conversion-related + helpers to DateConversion. + + * AllInOneFile.cpp: Changed DateMath->DateConversion. + * GNUmakefile.am: Ditto and added DateMath. + * JavaScriptCore.exp: Ditto. + * JavaScriptCore.pri: Ditto. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Ditto. + * JavaScriptCore.vcproj/WTF/WTF.vcproj: Added DateMath. + * JavaScriptCore.xcodeproj/project.pbxproj: Ditto. + * JavaScriptCoreSources.bkl: Ditto. + * pcre/pcre_exec.cpp: Changed to use DateMath. + * profiler/ProfileNode.cpp: + (JSC::getCount): Changed to use DateConversion. + * runtime/DateConstructor.cpp: Ditto. + * runtime/DateConversion.cpp: Copied from JavaScriptCore/runtime/DateMath.cpp. + (JSC::parseDate): Refactored to use null-terminated characters as input. + * runtime/DateConversion.h: Copied from JavaScriptCore/runtime/DateMath.h. + * runtime/DateInstance.cpp: Changed to use wtf/DateMath. + * runtime/DateInstance.h: Ditto. + * runtime/DateMath.cpp: Removed. + * runtime/DateMath.h: Removed. + * runtime/DatePrototype.cpp: Ditto. + * runtime/InitializeThreading.cpp: Ditto. + * wtf/DateMath.cpp: Copied from JavaScriptCore/runtime/DateMath.cpp. + * wtf/DateMath.h: Copied from JavaScriptCore/runtime/DateMath.h. + +2009-06-08 Steve Falkenburg <sfalken@apple.com> + + Windows build fix. + + * JavaScriptCore.vcproj/jsc/jscCommon.vsprops: + +2009-06-07 David Kilzer <ddkilzer@apple.com> + + Make JavaScriptCore compile for iPhone and iPhone Simulator + + Reviewed by Gavin Barraclough. + + * Configurations/Base.xcconfig: Split GCC_ENABLE_OBJC_GC on + $(REAL_PLATFORM_NAME). Added $(ARCHS_UNIVERSAL_IPHONE_OS) to + VALID_ARCHS. Added REAL_PLATFORM_NAME_iphoneos, + REAL_PLATFORM_NAME_iphonesimulator, HAVE_DTRACE_iphoneos and + HAVE_DTRACE_iphonesimulator variables. + * Configurations/DebugRelase.xcconfig: Split ARCHS definition on + $(REAL_PLATFORM_NAME). + * Configurations/JavaScriptCore.xcconfig: Added + EXPORTED_SYMBOLS_FILE_armv6 and EXPORTED_SYMBOLS_FILE_armv7 + variables. Split OTHER_LDFLAGS into OTHER_LDFLAGS_BASE and + OTHER_LDFLAGS_$(REAL_PLATFORM_NAME) since CoreServices.framework + is only linked to on Mac OS X. + * JavaScriptCore.xcodeproj/project.pbxproj: Removed references + to CoreServices.framework since it's linked using OTHER_LDFLAGS + in JavaScriptCore.xcconfig. + * profiler/ProfilerServer.mm: Added #import for iPhone + Simulator. + (-[ProfilerServer init]): Conditionalize use of + NSDistributedNotificationCenter to non-iPhone or iPhone + Simulator. + * wtf/FastMalloc.cpp: + (WTF::TCMallocStats::): Build fix for iPhone and iPhone + Simulator. + * wtf/Platform.h: Defined PLATFORM(IPHONE) and + PLATFORM(IPHONE_SIMULATOR). + * wtf/ThreadingPthreads.cpp: + (WTF::setThreadNameInternal): Build fix for iPhone and iPhone + Simulator. + +2009-06-08 Tor Arne Vestbø <tor.arne.vestbo@nokia.com> + + Reviewed by Simon Hausmann. + + [Qt] Use $QMAKE_PATH_SEP instead of hardcoded / to fix Windows build + + * JavaScriptCore.pri: + * JavaScriptCore.pro: + * jsc.pro: + +2009-06-07 Gavin Barraclough <barraclough@apple.com> + + RS by Sam Weinig. + + Remove bonus bogus \n from last commit. + + * jit/JITStubs.cpp: + (JSC::): + +2009-06-07 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Sam Weinig. + + Change the implementation of op_throw so the stub function always modifies its + return address - if it doesn't find a 'catch' it will switch to a trampoline + to force a return from JIT execution. This saves memory, by avoiding the need + for a unique return for every op_throw. + + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_throw): + JITStubs::cti_op_throw now always changes its return address, + remove return code generated after the stub call (this is now + handled by ctiOpThrowNotCaught). + * jit/JITStubs.cpp: + (JSC::): + Add ctiOpThrowNotCaught definitions. + (JSC::JITStubs::DEFINE_STUB_FUNCTION): + Change cti_op_throw to always change its return address. + * jit/JITStubs.h: + Add ctiOpThrowNotCaught declaration. + +2009-06-05 Gavin Barraclough <barraclough@apple.com> + + Rudder stamped by Sam Weinig. + + Add missing ASSERT. + + * assembler/X86Assembler.h: + (JSC::X86Assembler::getRelocatedAddress): + +2009-06-05 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Sam Weinig. + + Switch storePtrWithPatch to take the initial immediate value as an argument. + + * assembler/MacroAssemblerX86.h: + (JSC::MacroAssemblerX86::storePtrWithPatch): + * assembler/MacroAssemblerX86_64.h: + (JSC::MacroAssemblerX86_64::storePtrWithPatch): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_jsr): + +2009-06-05 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Sam Weinig. + + Remove patchLength..tByIdExternalLoadPrefix magic numbers from JIT.h. + + These aren't really suitable values to be tracking within common code + of the JIT, since they are not (and realistically cannot) be checked + by ASSERTs, as the other repatch offsets are. Move this functionality + (skipping the REX prefix when patching load instructions to LEAs on + x86-64) into the X86Assembler. + + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::CodeLocationInstruction::repatchLoadPtrToLEA): + * assembler/X86Assembler.h: + (JSC::X86Assembler::repatchLoadPtrToLEA): + * jit/JIT.h: + * jit/JITPropertyAccess.cpp: + (JSC::JIT::patchGetByIdSelf): + (JSC::JIT::patchPutByIdReplace): + +2009-06-05 Shinichiro Hamaji <hamaji@chromium.org> + + Bug 26160: Compile fails in MacOSX when GNU fileutils are installed + + <https://bugs.webkit.org/show_bug.cgi?id=26160> + + Reviewed by Alexey Proskuryakov. + + Use /bin/ln instead of ln for cases where this command is used with -h option. + As this option is not supported by GNU fileutils, this change helps users + who have GNU fileutils in their PATH. + + * JavaScriptCore.xcodeproj/project.pbxproj: + +2009-06-05 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Remove DoubleNotEqual floating point comparison condition for now - + it is not used, and it is unclear the semantics are correct (I think + this comparison would actually give you not-equal-or-unordered, which + might be what is wanted... we can revisit this interface & get it + right when required). + + Also, fix asserts in branchArith32 ops. All adds & subs can check + for Signed, multiply only sets OF so can only check for overflow. + + * assembler/MacroAssemblerX86Common.h: + (JSC::MacroAssemblerX86Common::): + (JSC::MacroAssemblerX86Common::branchAdd32): + (JSC::MacroAssemblerX86Common::branchMul32): + (JSC::MacroAssemblerX86Common::branchSub32): + +2009-06-05 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Minor tidy up in JITStubs. + + * jit/JITStubs.cpp: + (JSC::StackHack::StackHack): + * jit/JITStubs.h: + +2009-06-05 Koen Kooi <koen@dominion.thruhere.net> + + Reviewed by Xan Lopez. + + Build fix for glib unicode backend. + + * wtf/unicode/glib/UnicodeMacrosFromICU.h: + +2009-06-05 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + 3 tiny cleanups: + + * assembler/MacroAssemblerX86.h: + * assembler/MacroAssemblerX86_64.h: + (JSC::MacroAssemblerX86_64::storePtrWithPatch): + store*() methods should take an ImplicitAddress, rather than an Address. + * assembler/X86Assembler.h: + Make patchPointer private. + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_ret): + Remove empty line at end of function. + +2009-06-05 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Encapsulate many uses of void* in the assembler & jit with types that provide + more semantic information. The new types are: + + * MacroAssemblerCodePtr - this wraps a pointer into JIT generated code. + * FunctionPtr - this wraps a pointer to a C/C++ function in JSC. + * ReturnAddressPtr - this wraps a return address resulting from a 'call' instruction. + + Wrapping these types allows for stronger type-checking than is possible with everything + represented a void*. For example, it is now enforced by the type system that near + calls can only be linked to JIT code and not to C functions in JSC (this was previously + required, but could not be enforced on the interface). + + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::CodeLocationCommon::CodeLocationCommon): + (JSC::AbstractMacroAssembler::CodeLocationCommon::dataLocation): + (JSC::AbstractMacroAssembler::CodeLocationCommon::executableAddress): + (JSC::AbstractMacroAssembler::CodeLocationCommon::reset): + (JSC::AbstractMacroAssembler::CodeLocationInstruction::repatchLoadToLEA): + (JSC::AbstractMacroAssembler::CodeLocationInstruction::CodeLocationInstruction): + (JSC::AbstractMacroAssembler::CodeLocationLabel::addressForSwitch): + (JSC::AbstractMacroAssembler::CodeLocationLabel::addressForExceptionHandler): + (JSC::AbstractMacroAssembler::CodeLocationLabel::addressForJSR): + (JSC::AbstractMacroAssembler::CodeLocationLabel::operator!): + (JSC::AbstractMacroAssembler::CodeLocationLabel::reset): + (JSC::AbstractMacroAssembler::CodeLocationLabel::CodeLocationLabel): + (JSC::AbstractMacroAssembler::CodeLocationLabel::getJumpDestination): + (JSC::AbstractMacroAssembler::CodeLocationJump::relink): + (JSC::AbstractMacroAssembler::CodeLocationJump::CodeLocationJump): + (JSC::AbstractMacroAssembler::CodeLocationCall::relink): + (JSC::AbstractMacroAssembler::CodeLocationCall::calleeReturnAddressValue): + (JSC::AbstractMacroAssembler::CodeLocationCall::CodeLocationCall): + (JSC::AbstractMacroAssembler::CodeLocationNearCall::relink): + (JSC::AbstractMacroAssembler::CodeLocationNearCall::calleeReturnAddressValue): + (JSC::AbstractMacroAssembler::CodeLocationNearCall::CodeLocationNearCall): + (JSC::AbstractMacroAssembler::CodeLocationDataLabel32::repatch): + (JSC::AbstractMacroAssembler::CodeLocationDataLabel32::CodeLocationDataLabel32): + (JSC::AbstractMacroAssembler::CodeLocationDataLabelPtr::repatch): + (JSC::AbstractMacroAssembler::CodeLocationDataLabelPtr::CodeLocationDataLabelPtr): + (JSC::AbstractMacroAssembler::ProcessorReturnAddress::relinkCallerToTrampoline): + (JSC::AbstractMacroAssembler::ProcessorReturnAddress::relinkCallerToFunction): + (JSC::AbstractMacroAssembler::ProcessorReturnAddress::relinkNearCallerToTrampoline): + (JSC::AbstractMacroAssembler::ProcessorReturnAddress::addressForLookup): + (JSC::AbstractMacroAssembler::trampolineAt): + (JSC::AbstractMacroAssembler::PatchBuffer::link): + (JSC::AbstractMacroAssembler::PatchBuffer::performFinalization): + (JSC::::CodeLocationCommon::instructionAtOffset): + (JSC::::CodeLocationCommon::labelAtOffset): + (JSC::::CodeLocationCommon::jumpAtOffset): + (JSC::::CodeLocationCommon::callAtOffset): + (JSC::::CodeLocationCommon::nearCallAtOffset): + (JSC::::CodeLocationCommon::dataLabelPtrAtOffset): + (JSC::::CodeLocationCommon::dataLabel32AtOffset): + * assembler/MacroAssemblerCodeRef.h: + (JSC::FunctionPtr::FunctionPtr): + (JSC::FunctionPtr::value): + (JSC::FunctionPtr::executableAddress): + (JSC::ReturnAddressPtr::ReturnAddressPtr): + (JSC::ReturnAddressPtr::value): + (JSC::MacroAssemblerCodePtr::MacroAssemblerCodePtr): + (JSC::MacroAssemblerCodePtr::executableAddress): + (JSC::MacroAssemblerCodePtr::dataLocation): + (JSC::MacroAssemblerCodeRef::MacroAssemblerCodeRef): + * assembler/X86Assembler.h: + (JSC::X86Assembler::patchPointerForCall): + * jit/JIT.cpp: + (JSC::ctiPatchNearCallByReturnAddress): + (JSC::ctiPatchCallByReturnAddress): + (JSC::JIT::privateCompile): + (JSC::JIT::privateCompileCTIMachineTrampolines): + * jit/JIT.h: + (JSC::JIT::compileCTIMachineTrampolines): + * jit/JITCall.cpp: + (JSC::JIT::compileOpCall): + * jit/JITCode.h: + (JSC::JITCode::operator !): + (JSC::JITCode::addressForCall): + (JSC::JITCode::offsetOf): + (JSC::JITCode::execute): + (JSC::JITCode::size): + (JSC::JITCode::HostFunction): + * jit/JITInlineMethods.h: + (JSC::JIT::emitNakedCall): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::patchGetByIdSelf): + (JSC::JIT::patchPutByIdReplace): + (JSC::JIT::privateCompilePatchGetArrayLength): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdChain): + * jit/JITStubs.cpp: + (JSC::JITThunks::JITThunks): + (JSC::JITThunks::tryCachePutByID): + (JSC::JITThunks::tryCacheGetByID): + (JSC::JITStubs::DEFINE_STUB_FUNCTION): + * jit/JITStubs.h: + (JSC::JITThunks::ctiArrayLengthTrampoline): + (JSC::JITThunks::ctiStringLengthTrampoline): + (JSC::JITThunks::ctiVirtualCallPreLink): + (JSC::JITThunks::ctiVirtualCallLink): + (JSC::JITThunks::ctiVirtualCall): + (JSC::JITThunks::ctiNativeCallThunk): + * yarr/RegexJIT.h: + (JSC::Yarr::RegexCodeBlock::operator!): + (JSC::Yarr::RegexCodeBlock::execute): + +2009-06-05 Antti Koivisto <antti@apple.com> + + Try to unbreak Windows build. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + +2009-06-03 Antti Koivisto <antti@apple.com> + + Reviewed by Dave Kilzer. + + https://bugs.webkit.org/show_bug.cgi?id=13128 + Safari not obeying cache header + + Export JSC::parseDate() + + * JavaScriptCore.exp: + * JavaScriptCore.xcodeproj/project.pbxproj: + +2009-06-04 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + Bug in property caching of getters and setters. + + Make sure that the transition logic accounts for getters and setters. + If we don't we end up screwing up the transition tables so that some + transitions will start incorrectly believing that they need to check + for getters and setters. + + * runtime/JSObject.cpp: + (JSC::JSObject::defineGetter): + (JSC::JSObject::defineSetter): + * runtime/JSObject.h: + (JSC::): + * runtime/Structure.h: + +2009-06-04 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Sam Weinig. + + Minor tweak to PatchBuffer, change it so it no longer holds a CodeRef, and instead + holds a separate code pointer and executable pool. Since it now always holds its + own copy of the code size, and to simplify the construction sequence, it's neater + this way. + + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::PatchBuffer::PatchBuffer): + (JSC::AbstractMacroAssembler::PatchBuffer::finalizeCode): + (JSC::AbstractMacroAssembler::PatchBuffer::code): + (JSC::AbstractMacroAssembler::PatchBuffer::performFinalization): + +2009-06-04 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Remove 'JIT_STUB_ARGUMENT_STACK' this is unused and untested. + + This just leaves JIT_STUB_ARGUMENT_REGISTER and JIT_STUB_ARGUMENT_VA_LIST. + Since JIT_STUB_ARGUMENT_REGISTER is the sensible configuration on most platforms, + remove this define and make this the default behaviour. + Platforms must now define JIT_STUB_ARGUMENT_VA_LIST to get crazy va_list voodoo, + if they so desire. + + (Refactoring of #ifdefs only, no functional change, no performance impact.) + + * jit/JIT.h: + * jit/JITInlineMethods.h: + (JSC::JIT::restoreArgumentReference): + (JSC::JIT::restoreArgumentReferenceForTrampoline): + * jit/JITStubs.cpp: + (JSC::): + * jit/JITStubs.h: + * wtf/Platform.h: + +2009-06-04 Gavin Barraclough <barraclough@apple.com> + + Rubber stamped by Sam Weinig. + + * jit/JITArithmetic.cpp: + Remove some redundant typedefs, unused since arithmetic was added to the MacroAssembler interface. + +2009-06-04 Brent Fulgham <bfulgham@webkit.org> + + Build fix due to header include problem. + + * interpreter/Interpreter.h: Remove wtf from includes so that + compile can find the headers in expected places. + +2009-06-04 Zoltan Horvath <hzoltan@inf.u-szeged.hu> + + Reviewed by Darin Adler. + + HashTable class (JavaScriptCore/wtf/HashTable.h) doesn't instantiated by 'new', so + inheritance was removed. HashTable struct has been instantiated by operator new in + JSGlobalData.cpp:106. + HashTable couldn't inherited from FastAllocBase since struct with inheritance is + no longer POD, so HashTable struct has been instantiated by fastNew, destroyed by + fastDelete. + + * interpreter/Interpreter.h: + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + (JSC::JSGlobalData::~JSGlobalData): + * wtf/HashTable.h: + +2009-06-04 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Wrap the code that plants pushes/pops planted by JIT in explanatorily named + methods; move property storage reallocation into a standard stub function. + + ~No performance impact (possible <1% progression on x86-64, likely just noise). + + * jit/JIT.cpp: + (JSC::JIT::privateCompile): + (JSC::JIT::privateCompileCTIMachineTrampolines): + Wrap calls to push/pop. + * jit/JIT.h: + Declare the new wrapper methods. + * jit/JITInlineMethods.h: + (JSC::JIT::preverveReturnAddressAfterCall): + (JSC::JIT::restoreReturnAddressBeforeReturn): + Define the new wrapper methods. + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_end): + (JSC::JIT::emit_op_ret): + Wrap calls to push/pop. + * jit/JITPropertyAccess.cpp: + (JSC::JIT::privateCompilePutByIdTransition): + Move property storage reallocation into a standard stub function. + * jit/JITStubs.cpp: + (JSC::JITStubs::DEFINE_STUB_FUNCTION): + * jit/JITStubs.h: + (JSC::JITStubs::): + +2009-06-04 Laszlo Gombos <laszlo.1.gombos@nokia.com> + + Reviewed by Ariya Hidayat. + + [Qt] Single-threaded QtWebKit configuration + <https://bugs.webkit.org/show_bug.cgi?id=26015> + + * JavaScriptCore.pri: Use ThreadingNone.cpp instead of + ThreadingQt.cpp and make sure ENABLE_JSC_MULTIPLE_THREADS is turned off + when ENABLE_SINGLE_THREADED is tuned on + * wtf/ThreadingNone.cpp: + (WTF::ThreadCondition::wait): Fix compilation warning. + (WTF::ThreadCondition::timedWait): Ditto. + +2009-06-02 Mark Rowe <mrowe@apple.com> + + Reviewed by Anders Carlsson. + + Remove workaround that was added to address <rdar://problem/5488678> as it no longer affects our Tiger builds. + + * Configurations/Base.xcconfig: + +2009-06-02 Xan Lopez <xlopez@igalia.com> + + Reviewed by Sam Weinig. + + Use C-style comments in Platform.h so it can be included from C + files. + + * wtf/Platform.h: + +2009-06-02 Tor Arne Vestbø <tor.arne.vestbo@nokia.com> + + Rubber-stamped by Simon Hausmann. + + Use File::Spec->tmpdir instead of hardcoded paths for tempfile() dir + + This fixes the Windows-build if the user does not have a /tmp directory. + + * pcre/dftables: + +2009-06-02 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver ">>" Hunt. + + emitSlow_op_rshift is linking the wrong number of slow cases, if !supportsFloatingPoint(). + Fixerate, and refactor/comment the code a little to make it clearer what is going on. + + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_rshift): + (JSC::JIT::emitSlow_op_rshift): + +2009-06-01 Gavin Barraclough <barraclough@apple.com> + + Reviewed by NOBODY - speculative windows build fix (errm, for the other patch!). + + * jit/JITStubs.cpp: + (JSC::): + +2009-06-01 Gavin Barraclough <barraclough@apple.com> + + Reviewed by NOBODY - speculative windows build fix. + + * assembler/AbstractMacroAssembler.h: + (JSC::::CodeLocationCall::CodeLocationCall): + (JSC::::CodeLocationNearCall::CodeLocationNearCall): + +2009-06-01 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Olliej Hunt. + + Change JITStub functions from being static members on the JITStub class to be + global extern "C" functions, and switch their the function signature declaration + in the definition of the functions to be C-macro generated. This makes it easier + to work with the stub functions from assembler code (since the names no longer + require mangling), and by delaring the functions with a macro we can look at + also auto-generating asm thunks to wrap the JITStub functions to perform the + work currently in 'restoreArgumentReference' (as a memory saving). + + Making this change also forces us to be a bit more realistic about what is private + on the Register and CallFrame objects. Presently most everything on these classes + is private, and the classes have plenty of friends. We could befriend all the + global functions to perpetuate the delusion of encapsulation, but using friends is + a bit of a sledgehammer solution here - since friends can poke around with all of + the class's privates, and since all the major classes taht operate on Regsiters are + currently friends, right there is currently in practice very little protection at + all. Better to start removing friend delclarations, and exposing just the parts + that need to be exposed. + + * interpreter/CallFrame.h: + (JSC::ExecState::returnPC): + (JSC::ExecState::setCallerFrame): + (JSC::ExecState::returnValueRegister): + (JSC::ExecState::setArgumentCount): + (JSC::ExecState::setCallee): + (JSC::ExecState::setCodeBlock): + * interpreter/Interpreter.h: + * interpreter/Register.h: + (JSC::Register::Register): + (JSC::Register::i): + * jit/JITStubs.cpp: + (JSC::): + (JSC::JITThunks::JITThunks): + (JSC::JITThunks::tryCachePutByID): + (JSC::JITThunks::tryCacheGetByID): + (JSC::JITStubs::DEFINE_STUB_FUNCTION): + * jit/JITStubs.h: + (JSC::JITStubs::): + * runtime/JSFunction.h: + (JSC::JSFunction::nativeFunction): + (JSC::JSFunction::classInfo): + * runtime/JSGlobalData.h: + +2009-06-01 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + Tidy up the literal parser. + + Make the number lexing in the LiteralParser exactly match the JSON spec, which + makes us cover more cases, but also more strict. Also made string lexing only + allow double-quoted strings. + + * runtime/LiteralParser.cpp: + (JSC::LiteralParser::Lexer::lex): + (JSC::LiteralParser::Lexer::lexString): + (JSC::LiteralParser::Lexer::lexNumber): + +2009-06-01 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Sam "WX" Weinig. + + Allow the JIT to operate without relying on use of RWX memory, on platforms where this is supported. + + This patch adds a switch to Platform.h (ENABLE_ASSEMBLER_WX_EXCLUSIVE) which enables this mode of operation. + When this flag is set, all executable memory will be allocated RX, and switched to RW only whilst being + modified. Upon completion of code generation the protection is switched back to RX to allow execution. + + Further optimization will be required before it is desirable to enable this mode of operation by default; + enabling this presently incurs a 5%-10% regression. + + (Submitting disabled - no performance impact). + + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::CodeLocationInstruction::repatchLoadToLEA): + (JSC::AbstractMacroAssembler::CodeLocationLabel::fromFunctionPointer): + (JSC::AbstractMacroAssembler::CodeLocationJump::relink): + (JSC::AbstractMacroAssembler::CodeLocationCall::relink): + (JSC::AbstractMacroAssembler::CodeLocationNearCall::relink): + (JSC::AbstractMacroAssembler::CodeLocationDataLabel32::repatch): + (JSC::AbstractMacroAssembler::CodeLocationDataLabelPtr::repatch): + (JSC::AbstractMacroAssembler::ProcessorReturnAddress::relinkCallerToTrampoline): + (JSC::AbstractMacroAssembler::ProcessorReturnAddress::relinkCallerToFunction): + (JSC::AbstractMacroAssembler::ProcessorReturnAddress::relinkNearCallerToTrampoline): + (JSC::AbstractMacroAssembler::ProcessorReturnAddress::relinkNearCallerToFunction): + (JSC::AbstractMacroAssembler::PatchBuffer::PatchBuffer): + (JSC::AbstractMacroAssembler::PatchBuffer::~PatchBuffer): + (JSC::AbstractMacroAssembler::PatchBuffer::link): + (JSC::AbstractMacroAssembler::PatchBuffer::patch): + (JSC::AbstractMacroAssembler::PatchBuffer::performFinalization): + (JSC::::CodeLocationCommon::nearCallAtOffset): + (JSC::::CodeLocationCall::CodeLocationCall): + (JSC::::CodeLocationNearCall::CodeLocationNearCall): + * assembler/AssemblerBuffer.h: + (JSC::AssemblerBuffer::executableCopy): + * assembler/X86Assembler.h: + (JSC::CAN_SIGN_EXTEND_U32_64): + (JSC::X86Assembler::linkJump): + (JSC::X86Assembler::linkCall): + (JSC::X86Assembler::patchPointer): + (JSC::X86Assembler::relinkJump): + (JSC::X86Assembler::relinkCall): + (JSC::X86Assembler::repatchInt32): + (JSC::X86Assembler::repatchPointer): + (JSC::X86Assembler::repatchLoadToLEA): + (JSC::X86Assembler::patchInt32): + (JSC::X86Assembler::patchRel32): + * jit/ExecutableAllocator.h: + (JSC::ExecutableAllocator::): + (JSC::ExecutableAllocator::makeWritable): + (JSC::ExecutableAllocator::makeExecutable): + * jit/ExecutableAllocatorFixedVMPool.cpp: + (JSC::FixedVMPoolAllocator::FixedVMPoolAllocator): + * jit/ExecutableAllocatorPosix.cpp: + (JSC::ExecutablePool::systemAlloc): + (JSC::ExecutablePool::systemRelease): + (JSC::ExecutableAllocator::reprotectRegion): + * jit/ExecutableAllocatorWin.cpp: + * jit/JITPropertyAccess.cpp: + (JSC::JIT::patchGetByIdSelf): + (JSC::JIT::patchPutByIdReplace): + * wtf/Platform.h: + +2009-05-29 Zoltan Horvath <hzoltan@inf.u-szeged.hu> + + Reviewed by Darin Adler. + + Inherits Interpreter class from FastAllocBase because it has been + instantiated by 'new' in JavaScriptCore/runtime/JSGlobalData.cpp. + + * interpreter/Interpreter.h: + +2009-06-01 David Levin <levin@chromium.org> + + Reviewed by NOBODY (windows build fix). + + Add exports for windows (corresponding to the JavaScriptCore.exp modification + in the previous change). + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + +2009-06-01 David Levin <levin@chromium.org> + + Reviewed by Darin Alder and Maciej Stachowiak. + + Bug 26057: StringImpl should share buffers with UString. + https://bugs.webkit.org/show_bug.cgi?id=26057 + + * JavaScriptCore.exp: + * runtime/UString.cpp: + (JSC::UString::Rep::create): + (JSC::UString::BaseString::sharedBuffer): Only do the sharing when + the buffer exceeds a certain size. The size was tuned by running + various dom benchmarks with numbers ranging from 20 to 800 and finding + a place that seemed to do the best overall. + * runtime/UString.h: + +2009-05-31 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Olliej "you just need to change NativeFunctionWrapper.h" Hunt. + + Add ENABLE_JIT_OPTIMIZE_NATIVE_CALL switch to allow JIT to operate without native call optimizations. + + * runtime/NativeFunctionWrapper.h: + * wtf/Platform.h: + +2009-05-30 Darin Adler <darin@apple.com> + + Reviewed by Sam Weinig. + + <rdar://problem/6935193> REGRESSION (r42734): Celtic Kane JavaScript benchmark does not run: + "Maximum call stack size exceeded" + + * runtime/ArrayPrototype.cpp: + (JSC::arrayProtoFuncToString): Use the same recursion limit as the other recursion checks. + We need a limit of at least 100 to run the benchmark above. + (JSC::arrayProtoFuncToLocaleString): Ditto. + (JSC::arrayProtoFuncJoin): Ditto. + +2009-05-28 Dirk Schulze <krit@webkit.org> + + Reviewed by Nikolas Zimmermann. + + Added new build flag --filters for Mac. More details in WebCore/ChangeLog. + + * Configurations/FeatureDefines.xcconfig: + +2009-05-27 Oliver Hunt <oliver@apple.com> + + Reviewed by Mark Rowe. + + <rdar://problem/6928025> Stack overflow in JSC::stringProtoFuncReplace() running jsFunFuzz + + We should always check for exceptions after creating a CachedCall, this wasn't being done in + the string replace logic. + + * runtime/StringPrototype.cpp: + (JSC::stringProtoFuncReplace): + +2009-05-27 Gustavo Noronha Silva <gustavo.noronha@collabora.co.uk> + + Unreviewed (make distcheck) build fix; adding missing headers. + + * GNUmakefile.am: + +2009-05-27 Jessie Berlin <jberlin@apple.com> + + Reviewed by Adam Roben + + Fix the Windows build. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + +2009-05-27 Fridrich Strba <fridrich.strba@bluewin.ch> + + Reviewed by Gustavo Noronha. + + When building on Windows, consider Windows specific files. + + * GNUmakefile.am: + +2009-05-27 Fridrich Strba <fridrich.strba@bluewin.ch> + + Reviewed by Maciej Stachowiak. + + When building with MinGW, don't use the __declspec(dl{import,export}) + decorations and rely on the linker to use its nifty auto-import feature. + It is extremely hard to get the decorations right with MinGW in general + and impossible in WebKit, where the resulting shared library is linking + together some static libraries. + + * config.h: + +2009-05-26 Holger Hans Peter Freyther <zecke@selfish.org> + + Reviewed by Xan Lopez. + + https://bugs.webkit.org/show_bug.cgi?id=25613 + + Be able to use GOwnPtr for GHashTable as well. The assumption + is that the hash table has been created with g_hash_table_new_full + and has proper destruction functions. + + * wtf/GOwnPtr.cpp: + (WTF::GHashTable): + * wtf/GOwnPtr.h: + +2009-05-26 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + <rdar://problem/6924033> REGRESSION: Assertion failure due to forward references + + Add a pattern type for forward references to ensure that we don't confuse the + quantifier alternatives assertion. + + * yarr/RegexCompiler.cpp: + (JSC::Yarr::RegexPatternConstructor::atomBackReference): + (JSC::Yarr::RegexPatternConstructor::setupAlternativeOffsets): + * yarr/RegexInterpreter.cpp: + (JSC::Yarr::ByteCompiler::emitDisjunction): + * yarr/RegexJIT.cpp: + (JSC::Yarr::RegexGenerator::generateTerm): + * yarr/RegexPattern.h: + (JSC::Yarr::PatternTerm::): + (JSC::Yarr::PatternTerm::PatternTerm): + (JSC::Yarr::PatternTerm::ForwardReference): + +2009-05-26 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Fix for: <rdar://problem/6918095> REGRESSION: jQuery load() issue (25981), + and also an ASSERT failure on http://ihasahotdog.com/. + + When overwriting a property on a dictionary with a cached specific value, + clear the cache if new value being written is different. + + * JavaScriptCore.exp: + Export the new symbols. + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_op_get_by_id_method_check_second): + Close dictionary prototypes upon caching a method access, as would happen when caching + a regular get_by_id. + * runtime/JSObject.h: + (JSC::JSObject::propertyStorage): + (JSC::JSObject::locationForOffset): + Make these methods private. + (JSC::JSObject::putDirectInternal): + When overwriting a property on a dictionary with a cached specific value, + clear the cache if new value being written is different. + * runtime/Structure.cpp: + (JSC::Structure::despecifyDictionaryFunction): + Reset the specific value field for a given property in a dictionary. + (JSC::Structure::despecifyFunctionTransition): + Rename of 'changeFunctionTransition' (this was already internally refered to as a despecification). + * runtime/Structure.h: + Declare new method. + +2009-05-26 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver "pieces of eight" Hunt. + + When reseting RegexPattern class, should fully reset the class, not just bits of it. + In particular, we delete the cached character classes (for wordchars, etc), but do + not reset the set of pointers to the cached classes. In the case of a repeated parse + due to an illegal back-reference we will continue to use the deleted character class. + + * yarr/RegexPattern.h: + (JSC::Yarr::RegexPattern::reset): + +2009-05-26 Brent Fulgham <bfulgham@webkit.org> + + Build fix to correct r44161. + + * wtf/FastAllocBase.h: + +2009-05-26 Zoltan Horvath <horvath.zoltan.6@stud.u-szeged.hu> + + Reviewed by Maciej Stachowiak. + + Inherite HashTable from FastAllocBase, because it has been instantiated by + 'new' in JavaScriptCore/runtime/JSGlobalData.cpp. + + * wtf/HashTable.h: + * wtf/FastAllocBase.h: Remove 'wtf' path from TypeTraits.h to allow use outside of wtf. + +2009-05-25 David Levin <levin@chromium.org> + + Reviewed by Maciej Stachowiak and Oliver Hunt. + + https://bugs.webkit.org/show_bug.cgi?id=25126 + Allow the buffer underlying UString to be shared. + + In order to not grow the underlying size of any structure, + there is a union in the Rep string which holds + + m_sharedBuffer -- a pointer to the shared ref counted buffer + if the class is BaseString and the buffer is being shared OR + + m_baseString -- the BaseString if the class is only UString::Rep + but not a UString::BaseString + + Ideally, m_sharedBuffer would be a RefPtr, but it cannot be because + it is in a union. + + No change in sunspider perf. + + * JavaScriptCore.vcproj/WTF/WTF.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * runtime/UString.cpp: + (JSC::UString::Rep::share): + (JSC::UString::Rep::destroy): + (JSC::UString::BaseString::sharedBuffer): + (JSC::UString::BaseString::setSharedBuffer): + (JSC::UString::BaseString::slowIsBufferReadOnly): + (JSC::expandCapacity): + (JSC::UString::Rep::reserveCapacity): + (JSC::UString::expandPreCapacity): + (JSC::concatenate): + (JSC::UString::append): + * runtime/UString.h: + (JSC::UString::Rep::Rep): + (JSC::UString::Rep::): + (JSC::UString::BaseString::isShared): + (JSC::UString::BaseString::isBufferReadOnly): + (JSC::UString::Rep::baseString): + * wtf/CrossThreadRefCounted.h: + (WTF::CrossThreadRefCounted::isShared): + * wtf/OwnFastMallocPtr.h: Added. + (WTF::OwnFastMallocPtr::OwnFastMallocPtr): + (WTF::OwnFastMallocPtr::~OwnFastMallocPtr): + (WTF::OwnFastMallocPtr::get): + (WTF::OwnFastMallocPtr::release): + +2009-05-25 Oliver Hunt <oliver@apple.com> + + Reviewed by Maciej Stachowiak. + + Re-add interpreter logic to jit-enabled builds as GCC mysteriously regresses without it + + * wtf/Platform.h: + +2009-05-25 Fridrich Strba <fridrich.strba@bluewin.ch> + + Reviewed by Maciej Stachowiak. + + The functions written in assembly need to have a leading + underscore on Windows too. + + * jit/JITStubs.cpp: + +2009-05-24 Steve Falkenburg <sfalken@apple.com> + + Build fix for experimental PGO Windows target. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + +2009-05-23 David Kilzer <ddkilzer@apple.com> + + Part 1 of 2: Bug 25495: Implement PassOwnPtr and replace uses of std::auto_ptr + + <https://bugs.webkit.org/show_bug.cgi?id=25495> + + Reviewed by Oliver Hunt. + + * GNUmakefile.am: Added OwnPtrCommon.h and PassOwnPtr.h. + * JavaScriptCore.vcproj/WTF/WTF.vcproj: Ditto. + * JavaScriptCore.xcodeproj/project.pbxproj: Ditto. + + * wtf/OwnPtr.h: + (WTF::OwnPtr::OwnPtr): Added constructors that take a + PassOwnPtr. Also added a copy constructor declaration that's + required when assigning a PassOwnPtr to a stack-based OwnPtr. + (WTF::operator=): Added assignment operator methods that take a + PassOwnPtr. + (WTF::swap): Reformatted. + (WTF::operator==): Whitespace changes. + (WTF::operator!=): Ditto. + + * wtf/OwnPtrCommon.h: Added. + (WTF::deleteOwnedPtr): + + * wtf/PassOwnPtr.h: Added. + (WTF::PassOwnPtr::PassOwnPtr): + (WTF::PassOwnPtr::~PassOwnPtr): + (WTF::PassOwnPtr::get): + (WTF::PassOwnPtr::clear): + (WTF::PassOwnPtr::release): + (WTF::PassOwnPtr::operator*): + (WTF::PassOwnPtr::operator->): + (WTF::PassOwnPtr::operator!): + (WTF::PassOwnPtr::operator UnspecifiedBoolType): + (WTF::::operator): + (WTF::operator==): + (WTF::operator!=): + (WTF::static_pointer_cast): + (WTF::const_pointer_cast): + (WTF::getPtr): + +2009-05-23 Oliver Hunt <oliver@apple.com> + + Reviewed by Maciej Stachowiak. + + Remove interpreter specific logic from the JIT builds. + + This saves ~100k in JSC release builds. + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): + * interpreter/Interpreter.h: + * wtf/Platform.h: + +2009-05-22 Mark Rowe <mrowe@apple.com> + + Part two of an attempted Windows build fix. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + +2009-05-22 Mark Rowe <mrowe@apple.com> + + Part one of an attempted Windows build fix. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + +2009-05-21 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + op_method_check + + Optimize method calls, by caching specific function values within the Structure. + The new opcode is used almost like an x86 opcode prefix byte to optimize op_get_by_id, + where the property access is being used to read a function to be passed to op-call (i.e. + 'foo.bar();'). This patch modifies the Structure class such that when a property is + put to an object for the first time we will check if the value is a function. If it is, + we will cache the function value on the Structure. A Structure in such a state guarantees + that not only does a property with the given identifier exist on the object, but also that + its value is unchanged. Upon any further attempt to put a property with the same identifier + (but a different value) to the object, it will transition back to a normal Structure (where + it will guarantee the presence but not the value of the property). + + op_method_check makes use of the new information made available by the Structure, by + augmenting the functionality of op_get_by_id. Upon generating a FunctionCallDotNode a + check will be emitted prior to the property access reading the function value, and the JIT + will generate an extra (initially unlinked but patchable) set of checks prior to the regular + JIT code for get_by_id. The new code will do inline structure and prototype structure check + (unlike a regular get_by_id, which can only handle 'self' accesses inline), and then performs + an immediate load of the function value, rather than using memory accesses to load the value + from the obejct's property storage array. If the method check fails it will revert, or if + the access is polymorphic, the op_get_by_id will continue to operate - and optimize itself - + just as any other regular op_get_by_id would. + + ~2.5% on v8-tests, due to a ~9% progression on richards. + + * API/JSCallbackObjectFunctions.h: + (JSC::::put): + (JSC::::staticFunctionGetter): + * API/JSObjectRef.cpp: + (JSObjectMakeConstructor): + * JavaScriptCore.exp: + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::differenceBetween): + * assembler/MacroAssemblerX86.h: + (JSC::MacroAssemblerX86::moveWithPatch): + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * bytecode/CodeBlock.h: + (JSC::getMethodCallLinkInfoReturnLocation): + (JSC::CodeBlock::getMethodCallLinkInfo): + (JSC::CodeBlock::addMethodCallLinkInfos): + (JSC::CodeBlock::methodCallLinkInfo): + * bytecode/Opcode.h: + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitMethodCheck): + * bytecompiler/BytecodeGenerator.h: + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + (JSC::JIT::privateCompile): + * jit/JIT.h: + (JSC::MethodCallCompilationInfo::MethodCallCompilationInfo): + * jit/JITOpcodes.cpp: + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emit_op_method_check): + (JSC::JIT::emitSlow_op_method_check): + (JSC::JIT::emit_op_get_by_id): + (JSC::JIT::emitSlow_op_get_by_id): + (JSC::JIT::emit_op_put_by_id): + (JSC::JIT::emitSlow_op_put_by_id): + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::compileGetByIdSlowCase): + (JSC::JIT::patchMethodCallProto): + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_op_get_by_id_method_check): + (JSC::JITStubs::cti_op_get_by_id_method_check_second): + * jit/JITStubs.h: + * jsc.cpp: + (GlobalObject::GlobalObject): + * parser/Nodes.cpp: + (JSC::FunctionCallDotNode::emitBytecode): + * runtime/Arguments.cpp: + (JSC::Arguments::put): + * runtime/ArrayConstructor.cpp: + (JSC::ArrayConstructor::ArrayConstructor): + * runtime/BooleanConstructor.cpp: + (JSC::BooleanConstructor::BooleanConstructor): + * runtime/DateConstructor.cpp: + (JSC::DateConstructor::DateConstructor): + * runtime/ErrorConstructor.cpp: + (JSC::ErrorConstructor::ErrorConstructor): + (JSC::constructError): + * runtime/ErrorPrototype.cpp: + (JSC::ErrorPrototype::ErrorPrototype): + * runtime/FunctionConstructor.cpp: + (JSC::FunctionConstructor::FunctionConstructor): + * runtime/FunctionPrototype.cpp: + (JSC::FunctionPrototype::FunctionPrototype): + * runtime/InternalFunction.cpp: + (JSC::InternalFunction::InternalFunction): + * runtime/JSActivation.cpp: + (JSC::JSActivation::put): + (JSC::JSActivation::putWithAttributes): + * runtime/JSByteArray.cpp: + (JSC::JSByteArray::JSByteArray): + * runtime/JSFunction.cpp: + (JSC::JSFunction::JSFunction): + (JSC::JSFunction::getOwnPropertySlot): + * runtime/JSGlobalObject.cpp: + (JSC::JSGlobalObject::putWithAttributes): + (JSC::JSGlobalObject::reset): + (JSC::JSGlobalObject::mark): + * runtime/JSGlobalObject.h: + (JSC::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData): + (JSC::JSGlobalObject::methodCallDummy): + * runtime/JSObject.cpp: + (JSC::JSObject::put): + (JSC::JSObject::putWithAttributes): + (JSC::JSObject::deleteProperty): + (JSC::JSObject::defineGetter): + (JSC::JSObject::defineSetter): + (JSC::JSObject::getPropertyAttributes): + (JSC::JSObject::getPropertySpecificFunction): + (JSC::JSObject::putDirectFunction): + (JSC::JSObject::putDirectFunctionWithoutTransition): + * runtime/JSObject.h: + (JSC::getJSFunction): + (JSC::JSObject::getDirectLocation): + (JSC::JSObject::putDirect): + (JSC::JSObject::putDirectWithoutTransition): + * runtime/LiteralParser.cpp: + (JSC::LiteralParser::parseObject): + * runtime/Lookup.cpp: + (JSC::setUpStaticFunctionSlot): + * runtime/Lookup.h: + (JSC::lookupPut): + * runtime/MathObject.cpp: + (JSC::MathObject::MathObject): + * runtime/NativeErrorConstructor.cpp: + (JSC::NativeErrorConstructor::NativeErrorConstructor): + (JSC::NativeErrorConstructor::construct): + * runtime/NativeErrorPrototype.cpp: + (JSC::NativeErrorPrototype::NativeErrorPrototype): + * runtime/NumberConstructor.cpp: + (JSC::NumberConstructor::NumberConstructor): + * runtime/ObjectConstructor.cpp: + (JSC::ObjectConstructor::ObjectConstructor): + * runtime/PropertyMapHashTable.h: + (JSC::PropertyMapEntry::PropertyMapEntry): + * runtime/PrototypeFunction.cpp: + (JSC::PrototypeFunction::PrototypeFunction): + * runtime/PutPropertySlot.h: + (JSC::PutPropertySlot::): + (JSC::PutPropertySlot::PutPropertySlot): + (JSC::PutPropertySlot::setNewProperty): + (JSC::PutPropertySlot::setDespecifyFunctionProperty): + (JSC::PutPropertySlot::isCacheable): + (JSC::PutPropertySlot::cachedOffset): + * runtime/RegExpConstructor.cpp: + (JSC::RegExpConstructor::RegExpConstructor): + * runtime/StringConstructor.cpp: + (JSC::StringConstructor::StringConstructor): + * runtime/StringPrototype.cpp: + (JSC::StringPrototype::StringPrototype): + * runtime/Structure.cpp: + (JSC::Structure::Structure): + (JSC::Structure::~Structure): + (JSC::Structure::materializePropertyMap): + (JSC::Structure::addPropertyTransitionToExistingStructure): + (JSC::Structure::addPropertyTransition): + (JSC::Structure::changeFunctionTransition): + (JSC::Structure::addPropertyWithoutTransition): + (JSC::Structure::get): + (JSC::Structure::despecifyFunction): + (JSC::Structure::put): + (JSC::Structure::remove): + * runtime/Structure.h: + (JSC::Structure::get): + (JSC::Structure::specificFunction): + * runtime/StructureTransitionTable.h: + (JSC::StructureTransitionTableHashTraits::emptyValue): + * wtf/Platform.h: + +2009-05-22 Brent Fulgham <bfulgham@webkit.org> + + Reviewed by Steve Falkenburg. + + https://bugs.webkit.org/show_bug.cgi?id=25950 + JavaScriptCore Fails to build on Windows (Cairo) due to CoreFoundation + link requirement. + + Modify project to add new Debug_CFLite and Release_CFLite targets. These + use the new JavaScriptCoreCFLite.vsprops to link against CFLite.dll. + Existing projects are changed to use the new JavaScriptCoreCF.vsprops + to link against CoreFoundation.dll. + + The JavaScriptCoreCommon.vsprops is modified to remove the link + against CoreFoundation.dll. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreCF.vsprops: Added. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreCFLite.vsprops: Added. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreCommon.vsprops: + +2009-05-22 Dominik Röttsches <dominik.roettsches@access-company.com> + + Reviewed by Gustavo Noronha. + + https://bugs.webkit.org/show_bug.cgi?id=15914 + [GTK] Implement Unicode functionality using GLib + + Original patch by Jürg Billeter and Naiem Shaik. + Implementing WTF Unicode functionality based on GLib. + + * GNUmakefile.am: + * wtf/unicode/Unicode.h: + * wtf/unicode/glib: Added. + * wtf/unicode/glib/UnicodeGLib.cpp: Added. + (WTF::Unicode::foldCase): + (WTF::Unicode::toLower): + (WTF::Unicode::toUpper): + (WTF::Unicode::direction): + (WTF::Unicode::umemcasecmp): + * wtf/unicode/glib/UnicodeGLib.h: Added. + (WTF::Unicode::): + (WTF::Unicode::toLower): + (WTF::Unicode::toUpper): + (WTF::Unicode::toTitleCase): + (WTF::Unicode::isArabicChar): + (WTF::Unicode::isFormatChar): + (WTF::Unicode::isSeparatorSpace): + (WTF::Unicode::isPrintableChar): + (WTF::Unicode::isDigit): + (WTF::Unicode::isPunct): + (WTF::Unicode::mirroredChar): + (WTF::Unicode::category): + (WTF::Unicode::isLower): + (WTF::Unicode::digitValue): + (WTF::Unicode::combiningClass): + (WTF::Unicode::decompositionType): + * wtf/unicode/glib/UnicodeMacrosFromICU.h: Added. + +2009-05-21 Xan Lopez <xlopez@igalia.com> + + Unreviewed build fix. + + Add MacroAssemblerCodeRef.h to file list. + + * GNUmakefile.am: + +2009-05-21 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Darin Adler. + Addition of MacroAssemblerCodeRef.h rubber stamped by Geoff Garen. + + Refactor JIT code-handle objects. The representation of generated code is currently + a bit of a mess. We have a class JITCode which wraps the pointer to a block of + generated code, but this object does not reference the executable pool meaning that + external events (the pool being derefed) could make the pointer become invalid. + To overcome this both the JIT and Yarr implement further (and similar) objects to + wrap the code pointer with a RefPtr to the pool. To add to the mire, as well as the + CodeBlock containing a handle onto the code the FunctionBodyNode also contains a + copy of the code pointer which is used almost (but not entirely) uniquely to access + the JIT code for a function. + + Rationalization of all this: + + * Add a new type 'MacroAssembler::CodeRef' as a handle for a block of JIT generated code. + * Change the JIT & Yarr to internally handle code using CodeRefs. + * Move the CodeRef (formerly anow defunct JITCodeRef) from CodeBlock to its owner node. + * Remove the (now) redundant code pointer from FunctionBodyNode. + + While tidying this up I've made the PatchBuffer return code in new allocations using a CodeRef, + and have enforced an interface that the PatchBuffer will always be used, and 'finalizeCode()' or + 'finalizeCodeAddendum()' will always be called exactly once on the PatchBuffer to complete code generation. + + This gives us a potentially useful hook ('PatchBuffer::performFinalization()') at the end of generation, + which may have a number of uses. It may be helpful should we wish to switch our generation + model to allow RW/RX exclusive memory, and it may be useful on non-cache-coherent platforms to + give us an oportunity to cache flush as necessary. + + No performance impact. + + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::ProcessorReturnAddress::relinkCallerToTrampoline): + (JSC::AbstractMacroAssembler::CodeRef::CodeRef): + (JSC::AbstractMacroAssembler::CodeRef::trampolineAt): + (JSC::AbstractMacroAssembler::PatchBuffer::PatchBuffer): + (JSC::AbstractMacroAssembler::PatchBuffer::~PatchBuffer): + (JSC::AbstractMacroAssembler::PatchBuffer::link): + (JSC::AbstractMacroAssembler::PatchBuffer::linkTailRecursive): + (JSC::AbstractMacroAssembler::PatchBuffer::patch): + (JSC::AbstractMacroAssembler::PatchBuffer::complete): + (JSC::AbstractMacroAssembler::PatchBuffer::finalize): + (JSC::AbstractMacroAssembler::PatchBuffer::entry): + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::CodeBlock): + (JSC::CodeBlock::reparseForExceptionInfoIfNecessary): + (JSC::CodeBlock::setJITCode): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::getBytecodeIndex): + (JSC::CodeBlock::executablePool): + * interpreter/CallFrameClosure.h: + * interpreter/Interpreter.cpp: + (JSC::Interpreter::execute): + (JSC::Interpreter::prepareForRepeatCall): + * jit/JIT.cpp: + (JSC::JIT::privateCompile): + (JSC::JIT::privateCompileCTIMachineTrampolines): + (JSC::JIT::linkCall): + * jit/JIT.h: + * jit/JITCode.h: + (JSC::JITCode::JITCode): + (JSC::JITCode::operator bool): + (JSC::JITCode::addressForCall): + (JSC::JITCode::offsetOf): + (JSC::JITCode::execute): + (JSC::JITCode::size): + (JSC::JITCode::executablePool): + (JSC::JITCode::HostFunction): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::privateCompilePatchGetArrayLength): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdSelfList): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChainList): + (JSC::JIT::privateCompileGetByIdChain): + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_vm_dontLazyLinkCall): + (JSC::JITStubs::cti_vm_lazyLinkCall): + * parser/Nodes.cpp: + (JSC::ProgramNode::generateJITCode): + (JSC::EvalNode::generateJITCode): + (JSC::FunctionBodyNode::FunctionBodyNode): + (JSC::FunctionBodyNode::createNativeThunk): + (JSC::FunctionBodyNode::generateJITCode): + * parser/Nodes.h: + (JSC::ScopeNode::generatedJITCode): + (JSC::ScopeNode::getExecutablePool): + (JSC::ScopeNode::setJITCode): + (JSC::ProgramNode::jitCode): + (JSC::EvalNode::jitCode): + (JSC::FunctionBodyNode::jitCode): + * runtime/RegExp.cpp: + (JSC::RegExp::match): + * yarr/RegexJIT.cpp: + (JSC::Yarr::RegexGenerator::compile): + (JSC::Yarr::jitCompileRegex): + (JSC::Yarr::executeRegex): + * yarr/RegexJIT.h: + (JSC::Yarr::RegexCodeBlock::RegexCodeBlock): + (JSC::Yarr::RegexCodeBlock::pcreFallback): + (JSC::Yarr::RegexCodeBlock::setFallback): + (JSC::Yarr::RegexCodeBlock::operator bool): + (JSC::Yarr::RegexCodeBlock::set): + (JSC::Yarr::RegexCodeBlock::execute): + +2009-05-21 Oliver Hunt <oliver@apple.com> + + Reviewed by Maciej Stachowiak. + + <rdar://problem/6910264> REGRESSION: Cached DOM global object property access fails in browser (25921) + <https://bugs.webkit.org/show_bug.cgi?id=25921> + + When caching properties on the global object we need to ensure that we're + not attempting to cache through a shell object. + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::resolveGlobal): + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_op_resolve_global): + +2009-05-21 Steve Falkenburg <sfalken@apple.com> + + Windows build fix. + + * JavaScriptCore.vcproj/jsc/jscCommon.vsprops: + +2009-05-21 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Mark Rowe. + + Bug 25945: Add support for MADV_FREE to TCMalloc + <https://bugs.webkit.org/show_bug.cgi?id=25945> + <rdar://problem/6910754> + + Add support for MADV_FREE to TCMalloc_SystemRelease for platforms that + don't also support MADV_FREE_REUSE. The code is identical to the MADV_DONTNEED + case except for the advice passed to madvise(), so combining the two cases + makes the most sense. + + * wtf/Platform.h: Only define HAVE_MADV_FREE when not building on Tiger or + Leopard, because while it is defined on these platforms it actually does + nothing. + * wtf/TCSystemAlloc.cpp: + (TCMalloc_SystemRelease): use MADV_FREE if it is available; otherwise use + MADV_DONTNEED. + +2009-05-21 Mark Rowe <mrowe@apple.com> + + Reviewed by Oliver Hunt. + + Fix <https://bugs.webkit.org/show_bug.cgi?id=25917> / <rdar://problem/6910066>. + Bug 25917: REGRESSION (r43559?): Javascript debugger crashes when pausing page + + The debugger currently retrieves the arguments object from an activation rather than pulling + it from a call frame. This is unreliable to due to the recent optimization to lazily create + the arguments object. In the long-term it should stop doing that (<rdar://problem/6911886>), + but for now we force eager creation of the arguments object when debugging. + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::BytecodeGenerator): + +2009-05-21 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Maciej Stachowiak. + + Bug 25912: Harden NumberPrototype.cpp by removing use of strcpy() + <https://bugs.webkit.org/show_bug.cgi?id=25912> + + This causes no change on SunSpider. + + * runtime/NumberPrototype.cpp: + (JSC::integerPartNoExp): replace strcpy() with memcpy(), ASSERT that the + temporary buffer has sufficient space to store the result, and move the + explicit null-termination closer to the memcpy() for easier visual inspection + of the code. + (JSC::fractionalPartToString): replace strcpy() with memcpy(), and ASSERT + that the temporary buffer has sufficient space to store the result. There + is no explicit null-termination because this is done by the caller. The + same is already true for exponentialPartToString(). + (JSC::numberProtoFuncToExponential): replace strcpy() with memcpy(), explicitly + null-terminate the result, and ASSERT that the temporary buffer has sufficient + space to store the result. + +2009-05-20 Sam Weinig <sam@webkit.org> + + Reviewed by Cameron Zwarich. + + Cleanup the JSGlobalData when exiting early with the usage statement in jsc. + + * jsc.cpp: + (printUsageStatement): + (parseArguments): + (jscmain): + +2009-05-20 Stephanie Lewis <slewis@apple.com> + + Update the order files. <rdar://problem/6881750> Generate new order files. + + * JavaScriptCore.order: + +2009-05-19 Kenneth Rohde Christiansen <kenneth.christiansen@openbossa.org> + + Reviewed by Simon Hausmann. + + Replace WREC with YARR + YARR_JIT for the Qt port. This is only + used when compiled with JIT support for now, so it is a drop-in + replacement for the WREC usage. Still including the wrec headers + as they are being referred from RegExp.h, though the contents of + that header it protected by "#if ENABLE(WREC)". + + * JavaScriptCore.pri: + +2009-05-20 Xan Lopez <xlopez@igalia.com> + + Reviewed by Eric Seidel. + + Fix GTK debug build. + + The function dumpDisjunction, compiled with debug enabled, uses + printf, which needs stdio.h to be included. + + * yarr/RegexInterpreter.cpp: + +2009-05-20 Laszlo Gombos <laszlo.1.gombos@nokia.com> + + Reviewed by George Staikos. + + BUG 25843: [Qt] Remove qt-port build flag + <https://bugs.webkit.org/show_bug.cgi?id=25843> + + * JavaScriptCore.pro: + + +2009-05-19 Geoffrey Garen <ggaren@apple.com> + + Windows build fix. + + * interpreter/RegisterFile.cpp: + (JSC::RegisterFile::releaseExcessCapacity): Copy-paste typo. + +2009-05-19 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Fixed <rdar://problem/6885680> CrashTracer: [USER] 1 crash in Install + Mac OS X at <unknown binary> • 0x9274241c + + (Original patch by Joe Sokol and Ronnie Misra.) + + SunSpider says 1.004x faster. + + * interpreter/RegisterFile.cpp: + (JSC::RegisterFile::releaseExcessCapacity): Instead of doing complicated + math that sometimes used to overflow, just release the full range of the + register file. + + * interpreter/RegisterFile.h: + (JSC::isPageAligned): + (JSC::RegisterFile::RegisterFile): Added ASSERTs to verify that it's + safe to release the full range of the register file. + + (JSC::RegisterFile::shrink): No need to releaseExcessCapacity() if the + new end is not smaller than the old end. (Also, doing so used to cause + numeric overflow, unmapping basically the whole process from memory.) + +2009-05-19 Oliver Hunt <oliver@apple.com> + + RS=Mark Rowe. + + <rdar://problem/6888393> REGRESSION: Start Debugging JavaScript crashes browser (nightly builds only?) + <https://bugs.webkit.org/show_bug.cgi?id=25717> + + Remove JSC_FAST_CALL as it wasn't gaining us anything, and was + resulting in weird bugs in the nightly builds. + + * parser/Nodes.cpp: + * parser/Nodes.h: + (JSC::ExpressionNode::isNumber): + (JSC::ExpressionNode::isString): + (JSC::ExpressionNode::isNull): + (JSC::ExpressionNode::isPure): + (JSC::ExpressionNode::isLocation): + (JSC::ExpressionNode::isResolveNode): + (JSC::ExpressionNode::isBracketAccessorNode): + (JSC::ExpressionNode::isDotAccessorNode): + (JSC::ExpressionNode::isFuncExprNode): + (JSC::ExpressionNode::isSimpleArray): + (JSC::ExpressionNode::isAdd): + (JSC::ExpressionNode::resultDescriptor): + (JSC::StatementNode::firstLine): + (JSC::StatementNode::lastLine): + (JSC::StatementNode::isEmptyStatement): + (JSC::StatementNode::isReturnNode): + (JSC::StatementNode::isExprStatement): + (JSC::StatementNode::isBlock): + (JSC::NullNode::isNull): + (JSC::BooleanNode::isPure): + (JSC::NumberNode::value): + (JSC::NumberNode::setValue): + (JSC::NumberNode::isNumber): + (JSC::NumberNode::isPure): + (JSC::StringNode::isPure): + (JSC::StringNode::isString): + (JSC::ResolveNode::identifier): + (JSC::ResolveNode::isLocation): + (JSC::ResolveNode::isResolveNode): + (JSC::BracketAccessorNode::isLocation): + (JSC::BracketAccessorNode::isBracketAccessorNode): + (JSC::DotAccessorNode::base): + (JSC::DotAccessorNode::identifier): + (JSC::DotAccessorNode::isLocation): + (JSC::DotAccessorNode::isDotAccessorNode): + (JSC::TypeOfResolveNode::identifier): + (JSC::AddNode::isAdd): + (JSC::BlockNode::isBlock): + (JSC::EmptyStatementNode::isEmptyStatement): + (JSC::ExprStatementNode::isExprStatement): + (JSC::ReturnNode::isReturnNode): + (JSC::ScopeNode::sourceURL): + (JSC::ProgramNode::bytecode): + (JSC::EvalNode::bytecode): + (JSC::FunctionBodyNode::parameters): + (JSC::FunctionBodyNode::toSourceString): + (JSC::FunctionBodyNode::bytecode): + (JSC::FuncExprNode::isFuncExprNode): + +2009-05-19 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Gavin Barraclough. + + - speed up string comparison, especially for short strings + + ~1% on SunSpider + + * JavaScriptCore.exp: + * runtime/UString.cpp: + * runtime/UString.h: + (JSC::operator==): Inline UString's operator==, since it is called from + hot places in the runtime. Also, specialize 2-char strings in a similar way to + 1-char, since we're taking the hit of a switch anyway. + +2009-05-18 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Gavin Barraclough. + + - for polymorphic prototype lookups, increase the number of slots from 4 to 8 + + ~4% faster on v8 raytrace benchmark + + * bytecode/Instruction.h: + +2009-05-18 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Oliver Hunt. + + - tighten up the code for the load_varargs stub + + ~1-2% on v8-raytrace + + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_op_load_varargs): Hoist some loop invariants that + the compiler didn't feel like hoisting for us. Remove unneeded exception check. + +2009-05-18 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Geoff Garen. + + - Improve code generation for access to prototype properties + + ~0.4% speedup on SunSpider. + + Based on a suggestion from Geoff Garen. + + * jit/JIT.h: + * jit/JITPropertyAccess.cpp: + (JSC::JIT::compileGetDirectOffset): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChainList): + (JSC::JIT::privateCompileGetByIdChain): + +2009-05-18 Gustavo Noronha Silva <gustavo.noronha@collabora.co.uk> + + Reviewed by Gavin Barraclough. + + Enable YARR, and disable WREC for GTK+. + + * GNUmakefile.am: + * yarr/RegexParser.h: + +2009-05-18 Jan Michael Alonzo <jmalonzo@webkit.org> + + Reviewed by Xan Lopez. + + [Gtk] Various autotools build refactoring and fixes + https://bugs.webkit.org/show_bug.cgi?id=25286 + + Add -no-install and -no-fast-install to programs and tests that we + don't install. Also remove -O2 since this is already handled at + configure time. + + * GNUmakefile.am: + +2009-05-17 Jan Michael Alonzo <jmalonzo@webkit.org> + + Reviewed by Xan Lopez. + + [Gtk] Various autotools build refactoring and fixes + https://bugs.webkit.org/show_bug.cgi?id=25286 + + Add JavaScriptCore/ to JSC include path only since it's not + required when building WebCore. + + * GNUmakefile.am: + +2009-05-17 Steve Falkenburg <sfalken@apple.com> + + Windows build fix + + * JavaScriptCore.vcproj/JavaScriptCore.make: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + +2009-05-15 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Looking like MSVC doesn't like static variables in inline methods? + Make the state of the SSE2 check a static variable on the class + MacroAssemblerX86Common as a speculative build fix for Windows. + + * assembler/MacroAssemblerX86Common.h: + (JSC::MacroAssemblerX86Common::convertInt32ToDouble): + (JSC::MacroAssemblerX86Common::branchDouble): + (JSC::MacroAssemblerX86Common::branchTruncateDoubleToInt32): + (JSC::MacroAssemblerX86Common::isSSE2Present): + (JSC::MacroAssemblerX86Common::): + * jit/JIT.cpp: + +2009-05-15 Adam Roben <aroben@apple.com> + + Add some assembler headers to JavaScriptCore.vcproj + + This is just a convenience for Windows developers. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + +2009-05-15 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Add FP support to the MacroAssembler, port JITArithmetic over to make use of this. Also add + API to determine whether FP support is available 'MacroAssembler::supportsFloatingPoint()', + FP is presently only supported on SSE2 platforms, not x87. On platforms where a suitable + hardware FPU is not available 'supportsFloatingPoint()' may simply return false, and all + other methods ASSERT_NOT_REACHED(). + + * assembler/AbstractMacroAssembler.h: + * assembler/MacroAssemblerX86.h: + (JSC::MacroAssemblerX86::MacroAssemblerX86): + (JSC::MacroAssemblerX86::branch32): + (JSC::MacroAssemblerX86::branchPtrWithPatch): + (JSC::MacroAssemblerX86::supportsFloatingPoint): + * assembler/MacroAssemblerX86Common.h: + (JSC::MacroAssemblerX86Common::): + (JSC::MacroAssemblerX86Common::loadDouble): + (JSC::MacroAssemblerX86Common::storeDouble): + (JSC::MacroAssemblerX86Common::addDouble): + (JSC::MacroAssemblerX86Common::subDouble): + (JSC::MacroAssemblerX86Common::mulDouble): + (JSC::MacroAssemblerX86Common::convertInt32ToDouble): + (JSC::MacroAssemblerX86Common::branchDouble): + (JSC::MacroAssemblerX86Common::branchTruncateDoubleToInt32): + (JSC::MacroAssemblerX86Common::branch32): + (JSC::MacroAssemblerX86Common::branch16): + (JSC::MacroAssemblerX86Common::branchTest32): + (JSC::MacroAssemblerX86Common::branchAdd32): + (JSC::MacroAssemblerX86Common::branchMul32): + (JSC::MacroAssemblerX86Common::branchSub32): + (JSC::MacroAssemblerX86Common::set32): + (JSC::MacroAssemblerX86Common::setTest32): + (JSC::MacroAssemblerX86Common::x86Condition): + (JSC::MacroAssemblerX86Common::isSSE2Present): + * assembler/MacroAssemblerX86_64.h: + (JSC::MacroAssemblerX86_64::movePtrToDouble): + (JSC::MacroAssemblerX86_64::moveDoubleToPtr): + (JSC::MacroAssemblerX86_64::setPtr): + (JSC::MacroAssemblerX86_64::branchPtr): + (JSC::MacroAssemblerX86_64::branchTestPtr): + (JSC::MacroAssemblerX86_64::branchAddPtr): + (JSC::MacroAssemblerX86_64::branchSubPtr): + (JSC::MacroAssemblerX86_64::supportsFloatingPoint): + * assembler/X86Assembler.h: + * jit/JIT.cpp: + (JSC::JIT::JIT): + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_rshift): + (JSC::JIT::emitSlow_op_rshift): + (JSC::JIT::emitSlow_op_jnless): + (JSC::JIT::emitSlow_op_jnlesseq): + (JSC::JIT::compileBinaryArithOp): + (JSC::JIT::compileBinaryArithOpSlowCase): + (JSC::JIT::emit_op_add): + (JSC::JIT::emitSlow_op_add): + (JSC::JIT::emit_op_mul): + (JSC::JIT::emitSlow_op_mul): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::privateCompilePutByIdTransition): + +2009-05-15 Francisco Tolmasky <francisco@280north.com> + + BUG 25467: JavaScript debugger should use function.displayName as the function's name in the call stack + <https://bugs.webkit.org/show_bug.cgi?id=25467> + + Reviewed by Adam Roben. + + * JavaScriptCore.exp: Added calculatedFunctionName + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: Added calculatedFunctionName + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: Added calculatedFunctionName + * debugger/DebuggerCallFrame.cpp: Added calculatedFunctionName to match existing one in ProfileNode. + (JSC::DebuggerCallFrame::calculatedFunctionName): + * debugger/DebuggerCallFrame.h: Added calculatedFunctionName to match existing one in ProfileNode. + +2009-05-14 Gavin Barraclough <barraclough@apple.com> + + Build fix, not reviewed. + + Quick fixes for JIT builds with OPTIMIZE flags disabled. + + * jit/JITCall.cpp: + (JSC::JIT::compileOpCall): + (JSC::JIT::compileOpCallSlowCase): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::compilePutByIdHotPath): + +2009-05-14 Steve Falkenburg <sfalken@apple.com> + + Back out incorrect Windows build fix + + * JavaScriptCore.vcproj/JavaScriptCore.make: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + +2009-05-14 Steve Falkenburg <sfalken@apple.com> + + Windows build fix + + * JavaScriptCore.vcproj/JavaScriptCore.make: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + +2009-05-14 Adam Roben <aroben@apple.com> + + Windows jsc build fix + + r43648 modified jsc.vcproj's post-build event not to try to copy files + that aren't present. Then r43661 mistakenly un-did that modification. + This patch restores the modification from r43648, but puts the code in + jscCommon.vsprops (where it should have been added in r43648). + + * JavaScriptCore.vcproj/jsc/jsc.vcproj: Restored empty + VCPostBuildEventTool tags. + * JavaScriptCore.vcproj/jsc/jscCommon.vsprops: Modified the post-build + event command line to match the one in jsc.vcproj from r43648. + +2009-05-14 Laszlo Gombos <laszlo.1.gombos@nokia.com> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=25325 + + Make sure pthread_self() is declared before it gets called in Collector.cpp + + * runtime/Collector.cpp: Include pthread.h in most Unix-like platforms + (not just for OPENBSD) + +2009-05-14 Mark Rowe <mrowe@apple.com> + + Reviewed by Oliver Hunt. + + Fix <https://bugs.webkit.org/show_bug.cgi?id=25785>. + Bug 25785: Segfault in mark when using JSObjectMakeConstructor + + * API/JSObjectRef.cpp: + (JSObjectMakeConstructor): OpaqueJSClass::prototype can return 0. We need to use the default object prototype when it does. + * API/tests/testapi.c: + (main): Add a test case. + * runtime/JSObject.h: + (JSC::JSObject::putDirect): Add a clearer assertion for a null value. The assertion on the next line does catch this, + but the cause of the failure is not clear from the assertion itself. + +2009-05-14 Mark Rowe <mrowe@apple.com> + + Rubber-stamped by Darin Adler. + + <rdar://problem/6681868> When building with Xcode 3.1.3 should be using gcc 4.2 + + The meaning of XCODE_VERSION_ACTUAL is more sensible in newer versions of Xcode. + Update our logic to select the compiler version to use the more appropriate XCODE_VERSION_MINOR + if the version of Xcode supports it, and fall back to XCODE_VERSION_ACTUAL if not. + + * Configurations/Base.xcconfig: + +2009-05-14 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Checking register file bounds should be a ptr comparison (m_end is a Register*). + Also, the compare should be unsigned, pointers don'ts go negative. + + * jit/JIT.cpp: + (JSC::JIT::privateCompile): + +2009-05-13 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Fix <rdar://problem/6882919> REGRESSION: page at Metroauto site crashes in cti_op_loop_if_less (25730) + + op_loop_if_less (imm < op) was loading op into regT1, but in the slow path spills regT0. + This leads to bad happen. + + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_loop_if_less): + (JSC::JIT::emitSlow_op_loop_if_less): + +2009-05-13 Dmitry Titov <dimich@chromium.org> + + Rubber-stamped by Mark Rowe. + + https://bugs.webkit.org/show_bug.cgi?id=25746 + Revert http://trac.webkit.org/changeset/43507 which caused crash in PPC nightlies with Safari 4. + + * JavaScriptCore.exp: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + * bytecode/SamplingTool.cpp: + (JSC::SamplingThread::start): + (JSC::SamplingThread::stop): + * bytecode/SamplingTool.h: + * wtf/CrossThreadRefCounted.h: + (WTF::CrossThreadRefCounted::CrossThreadRefCounted): + (WTF::::ref): + (WTF::::deref): + * wtf/Threading.h: + * wtf/ThreadingNone.cpp: + * wtf/ThreadingPthreads.cpp: + (WTF::threadMapMutex): + (WTF::initializeThreading): + (WTF::threadMap): + (WTF::identifierByPthreadHandle): + (WTF::establishIdentifierForPthreadHandle): + (WTF::pthreadHandleForIdentifier): + (WTF::clearPthreadHandleForIdentifier): + (WTF::createThreadInternal): + (WTF::waitForThreadCompletion): + (WTF::detachThread): + (WTF::currentThread): + * wtf/ThreadingWin.cpp: + (WTF::threadMapMutex): + (WTF::initializeThreading): + (WTF::threadMap): + (WTF::storeThreadHandleByIdentifier): + (WTF::threadHandleForIdentifier): + (WTF::clearThreadHandleForIdentifier): + (WTF::createThreadInternal): + (WTF::waitForThreadCompletion): + (WTF::detachThread): + (WTF::currentThread): + * wtf/gtk/ThreadingGtk.cpp: + (WTF::threadMapMutex): + (WTF::initializeThreading): + (WTF::threadMap): + (WTF::identifierByGthreadHandle): + (WTF::establishIdentifierForThread): + (WTF::threadForIdentifier): + (WTF::clearThreadForIdentifier): + (WTF::createThreadInternal): + (WTF::waitForThreadCompletion): + (WTF::currentThread): + * wtf/qt/ThreadingQt.cpp: + (WTF::threadMapMutex): + (WTF::threadMap): + (WTF::identifierByQthreadHandle): + (WTF::establishIdentifierForThread): + (WTF::clearThreadForIdentifier): + (WTF::threadForIdentifier): + (WTF::initializeThreading): + (WTF::createThreadInternal): + (WTF::waitForThreadCompletion): + (WTF::currentThread): + +2009-05-13 Darin Adler <darin@apple.com> + + Revert the parser arena change. It was a slowdown, not a speedup. + Better luck next time (I'll break it up into pieces). + +2009-05-13 Darin Adler <darin@apple.com> + + Tiger build fix. + + * parser/Grammar.y: Add back empty code blocks, needed by older + versions of bison on certain rules. + +2009-05-13 Steve Falkenburg <sfalken@apple.com> + + Windows build fix. + + * JavaScriptCore.vcproj/jsc/jsc.vcproj: + +2009-05-13 Adam Roben <aroben@apple.com> + + Windows build fixes after r43642 + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + Updated. + + * debugger/Debugger.cpp: + * runtime/ArrayConstructor.cpp: + * runtime/JSArray.cpp: + * runtime/RegExp.cpp: + * runtime/RegExpConstructor.cpp: + * runtime/RegExpPrototype.cpp: + * runtime/StringPrototype.cpp: + Added missing #includes. + +2009-05-13 Darin Adler <darin@apple.com> + + Reviewed by Cameron Zwarich. + + Bug 25674: syntax tree nodes should use arena allocation + https://bugs.webkit.org/show_bug.cgi?id=25674 + + Step 3: Add some actual arena allocation. About 1% SunSpider speedup. + + * JavaScriptCore.exp: Updated. + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::BytecodeGenerator): Updated since VarStack + contains const Identifier* now. + (JSC::BytecodeGenerator::emitPushNewScope): Updated to take a const + Identifier&. + * bytecompiler/BytecodeGenerator.h: Ditto + + * bytecompiler/SegmentedVector.h: Added isEmpty. + + * debugger/Debugger.cpp: + (JSC::Debugger::recompileAllJSFunctions): Moved this function here from + WebCore so WebCore doesn't need the details of FunctionBodyNode. + * debugger/Debugger.h: Ditto. + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::execute): Updated since VarStack contains const + Identifier* now. + + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_vm_lazyLinkCall): Call isHostFunction on the body + rather than on the function object, since we can't easily have inlined + access to the FunctionBodyNode in JSFunction.h since WebCore needs + access to that header. + (JSC::JITStubs::cti_op_construct_JSConstruct): Ditto. + * profiler/Profiler.cpp: + (JSC::Profiler::createCallIdentifier): Ditto. + + * parser/Grammar.y: Use JSGlobalData* to pass the global data pointer + around whenever possible instead of using void*. Changed + SET_EXCEPTION_LOCATION from a macro to an inline function. Marked + the structure-creating functions inline. Changed the VarStack to use + identifier pointers instead of actual identifiers. This takes + advantage of the fact that all identifier pointers come from the + arena and avoids reference count churn. Changed Identifier* to + const Identifier* to make sure we don't modify any by accident. + Used identifiers for regular expression strings too, using the new + scanRegExp that has out parameters instead of the old one that relied + on side effects in the Lexer. Move the creation of numeric identifiers + out of this file and into the PropertyNode constructor. + + * parser/Lexer.cpp: + (JSC::Lexer::setCode): Pass in ParserArena, used for identifiers. + (JSC::Lexer::makeIdentifier): Changed return type to const Identifier* + and changed to call ParserArena. + (JSC::Lexer::scanRegExp): Added out arguments that are const Identifier* + as well as a prefix character argument so we can handle the /= case + without a string append. + (JSC::Lexer::skipRegExp): Added. Skips a regular expression without + allocating Identifier objects. + (JSC::Lexer::clear): Removed the code to manage m_identifiers, m_pattern, + and m_flags, and added code to set m_arena to 0. + * parser/Lexer.h: Updated for changes above. + + * parser/NodeConstructors.h: + (JSC::ParserArenaFreeable::operator new): Added. Calls allocateFreeable + on the arena. + (JSC::ParserArenaDeletable::operator new): Changed to call the + allocateDeletable function on the arena instead of deleteWithArena. + (JSC::RegExpNode::RegExpNode): Changed arguments to Identifier instead + of UString since these come from the parser which makes identifiers. + (JSC::PropertyNode::PropertyNode): Added new constructor that makes + numeric identifiers. Some day we might want to optimize this for + integers so it doesn't create a string for each one. + (JSC::ContinueNode::ContinueNode): Initialize m_ident to nullIdentifier + since it's now a const Identifier& so it can't be left uninitialized. + (JSC::BreakNode::BreakNode): Ditto. + (JSC::CaseClauseNode::CaseClauseNode): Updated to use SourceElements* + to keep track of the statements rather than a separate statement vector. + (JSC::BlockNode::BlockNode): Ditto. + (JSC::ForInNode::ForInNode): Initialize m_ident to nullIdentifier. + + * parser/Nodes.cpp: Moved the comment explaining emitBytecode in here. + It seemed strangely out of place in the header. + (JSC::ThrowableExpressionData::emitThrowError): Added an overload for + UString as well as Identifier. + (JSC::SourceElements::singleStatement): Added. + (JSC::SourceElements::lastStatement): Added. + (JSC::RegExpNode::emitBytecode): Updated since the pattern and flags + are now Identifier instead of UString. Also changed the throwError code + to use the substitution mechanism instead of doing a string append. + (JSC::SourceElements::emitBytecode): Added. Replaces the old + statementListEmitCode function, since we now keep the SourceElements + objects around. + (JSC::BlockNode::lastStatement): Added. + (JSC::BlockNode::emitBytecode): Changed to use emitBytecode instead of + statementListEmitCode. + (JSC::CaseClauseNode::emitBytecode): Added. + (JSC::CaseBlockNode::emitBytecodeForBlock): Changed to use emitBytecode + instead of statementListEmitCode. + (JSC::ScopeNodeData::ScopeNodeData): Changed to store the + SourceElements* instead of using releaseContentsIntoVector. + (JSC::ScopeNode::emitStatementsBytecode): Added. + (JSC::ScopeNode::singleStatement): Added. + (JSC::ProgramNode::emitBytecode): Call emitStatementsBytecode instead + of statementListEmitCode. + (JSC::EvalNode::emitBytecode): Ditto. + (JSC::EvalNode::generateBytecode): Removed code to clear the children + vector. This optimization is no longer possible since everything is in + a single arena. + (JSC::FunctionBodyNode::emitBytecode): Call emitStatementsBytecode + insetad of statementListEmitCode and check for the return node using + the new functions. + + * parser/Nodes.h: Changed VarStack to store const Identifier* instead + of Identifier and rely on the arena to control lifetime. Added a new + ParserArenaFreeable class. Made ParserArenaDeletable inherit from + FastAllocBase instead of having its own operator new. Base the Node + class on ParserArenaFreeable. Changed the various Node classes + to use const Identifier& instead of Identifier to avoid the need to + call their destructors and allow them to function as "freeable" in the + arena. Removed extraneous JSC_FAST_CALL on definitions of inline functions. + Changed ElementNode, PropertyNode, ArgumentsNode, ParameterNode, + CaseClauseNode, ClauseListNode, and CaseBlockNode to use ParserArenaFreeable + as a base class since they do not descend from Node. Eliminated the + StatementVector type and instead have various classes use SourceElements* + instead of StatementVector. This prevents those classes from having th + use ParserArenaDeletable to make sure the vector destructor is called. + + * parser/Parser.cpp: + (JSC::Parser::parse): Pass the arena to the lexer. + + * parser/Parser.h: Added an include of ParserArena.h, which is no longer + included by Nodes.h. + + * parser/ParserArena.cpp: + (JSC::ParserArena::ParserArena): Added. Initializes the new members, + m_freeableMemory, m_freeablePoolEnd, and m_identifiers. + (JSC::ParserArena::freeablePool): Added. Computes the pool pointer, + since we store only the current pointer and the end of pool pointer. + (JSC::ParserArena::deallocateObjects): Added. Contains the common + memory-deallocation logic used by both the destructor and the + reset function. + (JSC::ParserArena::~ParserArena): Changed to call deallocateObjects. + (JSC::ParserArena::reset): Ditto. Also added code to zero out the + new structures, and switched to use clear() instead of shrink(0) since + we don't really reuse arenas. + (JSC::ParserArena::makeNumericIdentifier): Added. + (JSC::ParserArena::allocateFreeablePool): Added. Used when the pool + is empty. + (JSC::ParserArena::isEmpty): Added. No longer inline, which is fine + since this is used only for assertions at the moment. + + * parser/ParserArena.h: Added an actual arena of "freeable" objects, + ones that don't need destructors to be called. Also added the segmented + vector of identifiers that used to be in the Lexer. + + * runtime/FunctionConstructor.cpp: + (JSC::extractFunctionBody): Use singleStatement function rather than + getting at a StatementVector. + + * runtime/FunctionPrototype.cpp: + (JSC::functionProtoFuncToString): Call isHostFunction on the body + rather than the function object. + + * runtime/JSFunction.cpp: + (JSC::JSFunction::JSFunction): Moved the structure version of this in + here from the header. It's not hot enough that it needs to be inlined. + (JSC::JSFunction::isHostFunction): Moved this in here from the header. + It's now a helper to be used only within the class. + (JSC::JSFunction::setBody): Moved this in here. It's not hot enough that + it needs to be inlined, and we want to be able to compile the header + without the definition of FunctionBodyNode. + + * runtime/JSFunction.h: Eliminated the include of "Nodes.h". This was + exposing too much JavaScriptCore dependency to WebCore. Because of this + change and some changes made to WebCore, we could now export a lot fewer + headers from JavaScriptCore, but I have not done that yet in this check-in. + Made a couple functions non-inline. Removes some isHostFunction() assertions. + + * wtf/FastAllocBase.h: Added the conventional using statements we use in + WTF so we can use identifiers from the WTF namespace without explicit + namespace qualification or namespace directive. This is the usual WTF style, + although it's unconventional in the C++ world. We use the namespace primarily + for link-time disambiguation, not compile-time. + + * wtf/FastMalloc.cpp: Fixed an incorrect comment. + +2009-05-13 Xan Lopez <xlopez@igalia.com> + + Unreviewed build fix: add JITStubCall.h to files list. + + * GNUmakefile.am: + +2009-05-13 Ariya Hidayat <ariya.hidayat@nokia.com> + + Unreviewed build fix, as suggested by Yael Aharon <yael.aharon@nokia.com>. + + * wtf/qt/ThreadingQt.cpp: + (WTF::waitForThreadCompletion): renamed IsValid to isValid. + +2009-05-13 Jan Michael Alonzo <jmalonzo@webkit.org> + + Revert r43562 - [Gtk] WTF_USE_JSC is already defined in + WebCore/config.h. + + * wtf/Platform.h: + +2009-05-12 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Add SamplingCounter tool to provide a simple mechanism for counting events in JSC + (enabled using ENABLE(SAMPLING_COUNTERS)). To count events within a single function + use the class 'SamplingCounter', where the counter may be incremented from multiple + functions 'GlobalSamplingCounter' may be convenient; all other counters (stack or + heap allocated, rather than statically declared) should use the DeletableSamplingCounter. + Further description of these classes is provided alongside their definition in + SamplingTool.h. + + Counters may be incremented from c++ by calling the 'count()' method on the counter, + or may be incremented by JIT code by using the 'emitCount()' method within the JIT. + + This patch also fixes CODEBLOCK_SAMPLING, which was missing a null pointer check. + + * JavaScriptCore.exp: + * assembler/MacroAssemblerX86.h: + (JSC::MacroAssemblerX86::addWithCarry32): + (JSC::MacroAssemblerX86::and32): + (JSC::MacroAssemblerX86::or32): + * assembler/MacroAssemblerX86Common.h: + (JSC::MacroAssemblerX86Common::and32): + (JSC::MacroAssemblerX86Common::or32): + * assembler/MacroAssemblerX86_64.h: + (JSC::MacroAssemblerX86_64::and32): + (JSC::MacroAssemblerX86_64::or32): + (JSC::MacroAssemblerX86_64::addPtr): + * assembler/X86Assembler.h: + (JSC::X86Assembler::): + (JSC::X86Assembler::adcl_im): + (JSC::X86Assembler::addq_im): + (JSC::X86Assembler::andl_im): + (JSC::X86Assembler::orl_im): + * bytecode/SamplingTool.cpp: + (JSC::AbstractSamplingCounter::dump): + * bytecode/SamplingTool.h: + (JSC::AbstractSamplingCounter::count): + (JSC::GlobalSamplingCounter::name): + (JSC::SamplingCounter::SamplingCounter): + * jit/JIT.h: + * jit/JITCall.cpp: + (JSC::): + * jit/JITInlineMethods.h: + (JSC::JIT::setSamplingFlag): + (JSC::JIT::clearSamplingFlag): + (JSC::JIT::emitCount): + * jsc.cpp: + (runWithScripts): + * parser/Nodes.cpp: + (JSC::ScopeNode::ScopeNode): + * wtf/Platform.h: + +2009-05-13 Steve Falkenburg <sfalken@apple.com> + + Windows build fix. + + * JavaScriptCore.vcproj/JavaScriptCore.make: + +2009-05-12 Steve Falkenburg <sfalken@apple.com> + + Windows build fix. + + * JavaScriptCore.vcproj/JavaScriptCore.make: + +2009-05-12 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + <rdar://problem/6881457> Crash occurs at JSC::Interpreter::execute() when loading http://www.sears.com + + We created the arguments objects before an op_push_scope but not + before op_push_new_scope, this meant a null arguments object could + be resolved inside catch blocks. + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitPushNewScope): + +2009-05-12 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + <rdar://problem/6879881> Crash occurs at JSC::JSActivation::mark() when loading http://www.monster.com; http://www.cnet.com + <https://bugs.webkit.org/show_bug.cgi?id=25736> Crash loading www.google.dk/ig (and other igoogle's as well) + + Following on from the lazy arguments creation patch, it's now + possible for an activation to to have a null register in the callframe + so we can't just blindly mark the local registers in an activation, + and must null check first instead. + + * API/tests/testapi.c: + (functionGC): + * API/tests/testapi.js: + (bludgeonArguments.return.g): + (bludgeonArguments): + * runtime/JSActivation.cpp: + (JSC::JSActivation::mark): + +2009-05-12 Gavin Barraclough <barraclough@apple.com> + + Rubber stamped by Geoff Garen. + + WTF_USE_CTI_REPATCH_PIC is no longer used, remove. + + * jit/JIT.h: + * jit/JITStubCall.h: + +2009-05-12 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Maciej Stachowiak. + + We've run into some problems where changing the size of the class JIT leads to + performance fluctuations. Try forcing alignment in an attempt to stabalize this. + + * jit/JIT.h: + +2009-05-12 Kevin Ollivier <kevino@theolliviers.com> + + wx build fix. Add ParserArena.cpp to the build. + + * JavaScriptCoreSources.bkl: + +2009-05-12 Oliver Hunt <oliver@apple.com> + + Reviewed by Geoff Garen. + + Unsigned underflow on 64bit cannot be treated as a negative number + + This code included some placeswhere we deliberately create negative offsets + from unsigned values, on 32bit this is "safe", but in 64bit builds much + badness occurs. Solution is to use signed types as nature intended. + + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_op_load_varargs): + +2009-05-12 Jan Michael Alonzo <jmalonzo@webkit.org> + + Reviewed by Holger Freyther. + + [Gtk] Various autotools build refactoring and fixes + https://bugs.webkit.org/show_bug.cgi?id=25286 + + Define WTF_USE_JSC for the Gtk port. + + * wtf/Platform.h: + +2009-05-12 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Oliver Hunt. + + - allow all of strictEqual to be inlined into cti_op_stricteq once again + + We had this optimization once but accidentally lost it at some point. + + * runtime/Operations.h: + (JSC::JSValue::strictEqualSlowCaseInline): + (JSC::JSValue::strictEqual): + +2009-05-12 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + instanceof should throw if the constructor being tested does not implement + 'HasInstance" (i.e. is a function). Instead we were returning false. + + * interpreter/Interpreter.cpp: + (JSC::isInvalidParamForIn): + (JSC::isInvalidParamForInstanceOf): + (JSC::Interpreter::privateExecute): + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_op_instanceof): + * tests/mozilla/ecma_2/instanceof/instanceof-003.js: + Fix broken test case. + * tests/mozilla/ecma_2/instanceof/regress-7635.js: + Remove broken test case (was an exact duplicate of a test in instanceof-003.js). + +2009-05-12 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + Improve function call forwarding performance + + Make creation of the Arguments object occur lazily, so it + is not necessarily created for every function that references + it. Then add logic to Function.apply to allow it to avoid + allocating the Arguments object at all. Helps a lot with + the function forwarding/binding logic in jQuery, Prototype, + and numerous other JS libraries. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * bytecode/Opcode.h: + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::BytecodeGenerator): + (JSC::BytecodeGenerator::registerFor): + (JSC::BytecodeGenerator::willResolveToArguments): + (JSC::BytecodeGenerator::uncheckedRegisterForArguments): + (JSC::BytecodeGenerator::createArgumentsIfNecessary): + (JSC::BytecodeGenerator::emitCallEval): + (JSC::BytecodeGenerator::emitPushScope): + * bytecompiler/BytecodeGenerator.h: + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): + (JSC::Interpreter::retrieveArguments): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + * jit/JIT.h: + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_create_arguments): + (JSC::JIT::emit_op_init_arguments): + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_op_tear_off_arguments): + (JSC::JITStubs::cti_op_load_varargs): + * parser/Nodes.cpp: + (JSC::ApplyFunctionCallDotNode::emitBytecode): + +2009-05-11 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Enable use of SamplingFlags directly from JIT code. + + * bytecode/SamplingTool.h: + * jit/JIT.h: + (JSC::JIT::sampleCodeBlock): + (JSC::JIT::sampleInstruction): + * jit/JITInlineMethods.h: + (JSC::JIT::setSamplingFlag): + (JSC::JIT::clearSamplingFlag): + +2009-05-11 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Cameron Zwarich. + + Implement JIT generation for instanceof for non-objects (always returns false). + Also fixes the sequencing of the prototype and value isObject checks, to no match the spec. + + 0.5% progression on v8 tests overall, due to 3.5% on early-boyer. + + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + * runtime/JSObject.cpp: + (JSC::JSObject::hasInstance): + * runtime/TypeInfo.h: + (JSC::TypeInfo::TypeInfo): + +2009-05-11 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + A little more JIT refactoring. + + Rearranged code to more clearly indicate what's conditionally compiled + and why. Now, all shared code is at the top of our JIT files, and all + #if'd code is at the bottom. #if'd code is delineated by large comments. + + Moved functions that relate to the JIT but don't explicitly do codegen + into JIT.cpp. Refactored SSE2 check to store its result as a data member + in the JIT. + + * jit/JIT.cpp: + (JSC::isSSE2Present): + (JSC::JIT::JIT): + (JSC::JIT::unlinkCall): + (JSC::JIT::linkCall): + * jit/JIT.h: + (JSC::JIT::isSSE2Present): + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_mod): + (JSC::JIT::emitSlow_op_mod): + * jit/JITCall.cpp: + (JSC::JIT::compileOpCallVarargs): + (JSC::JIT::compileOpCallVarargsSlowCase): + +2009-05-11 Holger Hans Peter Freyther <zecke@selfish.org> + + Build fix. + + * JavaScriptCore.pri: Build the new JITOpcodes.cpp + +2009-05-11 Sam Weinig <sam@webkit.org> + + Reviewed by Geoffrey Garen. + + More re-factoring of JIT code generation. Use a macro to + forward the main switch-statement cases to the helper functions. + + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + +2009-05-11 Sam Weinig <sam@webkit.org> + + Reviewed by Geoffrey Garen. + + More re-factoring of JIT code generation to move opcode generation + to helper functions outside the main switch-statement and gave those + helper functions standardized names. This patch covers the remaining + slow cases. + + * jit/JIT.cpp: + * jit/JIT.h: + * jit/JITOpcodes.cpp: + +2009-05-11 Geoffrey Garen <ggaren@apple.com> + + Build fix. + + * GNUmakefile.am: Added JITOpcodes.cpp and JITStubCall.h to the project. + +2009-05-11 Geoffrey Garen <ggaren@apple.com> + + Build fix. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Added + JITOpcodes.cpp and JITStubCall.h to the project. + +2009-05-11 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Some JIT refactoring. + + Moved JITStubCall* into its own header. + + Modified JITStubCall to ASSERT that its return value is handled correctly. + Also, replaced function template with explicit instantiations to resolve + some confusion. + + Replaced all uses of emit{Get,Put}CTIArgument with explicit peeks, pokes, + and calls to killLastResultRegister(). + + * JavaScriptCore.xcodeproj/project.pbxproj: + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompile): + * jit/JIT.h: + * jit/JITArithmetic.cpp: + * jit/JITCall.cpp: + * jit/JITInlineMethods.h: + (JSC::JIT::restoreArgumentReference): + * jit/JITPropertyAccess.cpp: + * jit/JITStubCall.h: Copied from jit/JIT.h. + (JSC::JITStubCall::JITStubCall): + (JSC::JITStubCall::addArgument): + (JSC::JITStubCall::call): + (JSC::JITStubCall::): + +2009-05-11 Sam Weinig <sam@webkit.org> + + Reviewed by Geoffrey Garen. + + Start re-factoring JIT code generation to move opcode generation + to helper functions outside the main switch-statement and gave those + helper functions standardized names. This patch only covers the main + pass and all the arithmetic opcodes in the slow path. + + * JavaScriptCore.xcodeproj/project.pbxproj: + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + * jit/JIT.h: + * jit/JITArithmetic.cpp: + * jit/JITOpcodes.cpp: Copied from jit/JIT.cpp. + * jit/JITPropertyAccess.cpp: + +2009-05-11 Steve Falkenburg <sfalken@apple.com> + + Re-add experimental PGO configs. + + Reviewed by Adam Roben. + + * JavaScriptCore.vcproj/JavaScriptCore.make: + * JavaScriptCore.vcproj/JavaScriptCore.sln: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.vcproj/JavaScriptCoreSubmit.sln: + * JavaScriptCore.vcproj/jsc/jsc.vcproj: + +2009-05-11 Sam Weinig <sam@webkit.org> + + Reviewed by Geoffrey "1" Garen. + + Rip out the !USE(CTI_REPATCH_PIC) code. It was untested and unused. + + * jit/JIT.h: + (JSC::JIT::compileGetByIdChainList): + (JSC::JIT::compileGetByIdChain): + (JSC::JIT::compileCTIMachineTrampolines): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdChainList): + (JSC::JIT::privateCompileGetByIdChain): + * jit/JITStubs.cpp: + (JSC::JITStubs::tryCachePutByID): + (JSC::JITStubs::tryCacheGetByID): + +2009-05-11 Dmitry Titov <dimich@chromium.org> + + GTK build fix - the deprecated waitForThreadCompletion is not needed on GTK. + + * wtf/ThreadingPthreads.cpp: used #ifdef PLATFORM(DARWIN) around waitForThreadCompletion(). + +2009-05-11 Adam Roben <aroben@apple.com> + + Build fix for newer versions of GCC + + * wtf/ThreadingPthreads.cpp: Added a declaration of + waitForThreadCompletion before its definition to silence a warning. + +2009-05-11 Dmitry Titov <dimich@chromium.org> + + Reviewed by Alexey Proskuryakov and Adam Roben. + + https://bugs.webkit.org/show_bug.cgi?id=25348 + Change WTF::ThreadIdentifier to be an actual (but wrapped) thread id, remove ThreadMap. + + * wtf/Threading.h: + (WTF::ThreadIdentifier::ThreadIdentifier): + (WTF::ThreadIdentifier::isValid): + (WTF::ThreadIdentifier::invalidate): + (WTF::ThreadIdentifier::platformId): + ThreadIdentifier is now a class, containing a PlatformThreadIdentifier and + methods that are used across the code on thread ids: construction, comparisons, + check for 'valid' state etc. '0' is used as invalid id, which happens to just work + with all platform-specific thread id implementations. + + All the following files repeatedly reflect the new ThreadIdentifier for each platform. + We remove ThreadMap and threadMapMutex from all of them, remove the functions that + populated/searched/cleared the map and add platform-specific comparison operators + for ThreadIdentifier. + + There are specific temporary workarounds for Safari 4 beta on OSX and Win32 since the + public build uses WTF threading functions with old type of ThreadingIdentifier. + The next time Safari 4 is rebuilt, it will 'automatically' pick up the new type and new + functions so the deprecated ones can be removed. + + * wtf/gtk/ThreadingGtk.cpp: + (WTF::ThreadIdentifier::operator==): + (WTF::ThreadIdentifier::operator!=): + (WTF::initializeThreading): + (WTF::createThreadInternal): + (WTF::waitForThreadCompletion): + (WTF::currentThread): + + * wtf/ThreadingNone.cpp: + (WTF::ThreadIdentifier::operator==): + (WTF::ThreadIdentifier::operator!=): + + * wtf/ThreadingPthreads.cpp: + (WTF::ThreadIdentifier::operator==): + (WTF::ThreadIdentifier::operator!=): + (WTF::initializeThreading): + (WTF::createThreadInternal): + (WTF::waitForThreadCompletion): + (WTF::detachThread): + (WTF::currentThread): + (WTF::waitForThreadCompletion): This is a workaround for Safari 4 beta on Mac. + Safari 4 is linked against old definition of ThreadIdentifier so it treats it as uint32_t. + This 'old' variant of waitForThreadCompletion takes uint32_t and has the old decorated name, so Safari can + load it from JavaScriptCore library. The other functions (CurrentThread() etc) happen to match their previous + decorated names and, while they return pthread_t now, it is a pointer which round-trips through a uint32_t. + This function will be removed as soon as Safari 4 will release next public build. + + * wtf/qt/ThreadingQt.cpp: + (WTF::ThreadIdentifier::operator==): + (WTF::ThreadIdentifier::operator!=): + (WTF::initializeThreading): + (WTF::createThreadInternal): + (WTF::waitForThreadCompletion): + (WTF::currentThread): + + * wtf/ThreadingWin.cpp: + (WTF::ThreadIdentifier::operator==): + (WTF::ThreadIdentifier::operator!=): + (WTF::initializeThreading): + (WTF::createThreadInternal): All the platforms (except Windows) used a sequential + counter as a thread ID and mapped it into platform ID. Windows was using native thread + id and mapped it into thread handle. Since we can always obtain a thread handle + by thread id, createThread now closes the handle. + (WTF::waitForThreadCompletion): obtains another one using OpenThread(id) API. If can not obtain a handle, + it means the thread already exited. + (WTF::detachThread): + (WTF::currentThread): + (WTF::detachThreadDeprecated): old function, renamed (for Win Safari 4 beta which uses it for now). + (WTF::waitForThreadCompletionDeprecated): same. + (WTF::currentThreadDeprecated): same. + (WTF::createThreadDeprecated): same. + + * bytecode/SamplingTool.h: + * bytecode/SamplingTool.cpp: Use DEFINE_STATIC_LOCAL for a static ThreadIdentifier variable, to avoid static constructor. + + * JavaScriptCore.exp: export lists - updated decorated names of the WTF threading functions + since they now take a different type as a parameter. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: ditto for Windows, plus added "deprecated" functions + that take old parameter type - turns out public beta of Safari 4 uses those, so they need to be kept along for a while. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: ditto. + +2009-05-11 Darin Adler <darin@apple.com> + + Reviewed by Oliver Hunt. + + Bug 25560: REGRESSION (r34821): "string value".__proto__ gets the wrong object. + https://bugs.webkit.org/show_bug.cgi?id=25560 + rdar://problem/6861069 + + I missed this case back a year ago when I sped up handling + of JavaScript wrappers. Easy to fix. + + * runtime/JSObject.h: + (JSC::JSValue::get): Return the prototype itself if the property name + is __proto__. + * runtime/JSString.cpp: + (JSC::JSString::getOwnPropertySlot): Ditto. + +2009-05-09 Oliver Hunt <oliver@apple.com> + + Reviewed by Maciej Stachowiak. + + Rename emitGetFromCallFrameHeader to emitGetFromCallFrameHeaderPtr + + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileCTIMachineTrampolines): + * jit/JIT.h: + * jit/JITInlineMethods.h: + (JSC::JIT::emitGetFromCallFrameHeaderPtr): + (JSC::JIT::emitGetFromCallFrameHeader32): + +2009-05-11 Holger Hans Peter Freyther <zecke@selfish.org> + + Unreviewed build fix. Build ParserAreana.cpp for Qt + + * JavaScriptCore.pri: + +2009-05-11 Norbert Leser <norbert.leser@nokia.com> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=24536 + + Symbian compilers cannot resolve WTF::PassRefPtr<JSC::Profile> + unless Profile.h is included. + + * profiler/ProfileGenerator.h: + +2009-05-11 Csaba Osztrogonac <oszi@inf.u-szeged.hu> + + Reviewed by Holger Freyther. + + https://bugs.webkit.org/show_bug.cgi?id=24284 + + * JavaScriptCore.pri: coding style modified + * jsc.pro: duplicated values removed from INCLUDEPATH, DEFINES + +2009-05-11 Gustavo Noronha Silva <gustavo.noronha@collabora.co.uk> + + Reviewed by NOBODY (build fix). + + Also add ParserArena, in addition to AllInOne, for release builds, + since adding it to AllInOne breaks Mac. + + * GNUmakefile.am: + +2009-05-11 Gustavo Noronha Silva <gustavo.noronha@collabora.co.uk> + + Unreviewed build fix. Adding ParserArena to the autotools build. + + * GNUmakefile.am: + +2009-05-11 Adam Roben <aroben@apple.com> + + More Windows build fixes after r43479 + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + Export ParserArena::reset. + +2009-05-11 Adam Roben <aroben@apple.com> + + Windows build fixes after r43479 + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Added + ParserArena to the project. + + * parser/NodeConstructors.h: Added a missing include. + (JSC::ParserArenaDeletable::operator new): Marked these as inline. + +2009-05-10 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Geoff Garen. + + - fixed REGRESSION(r43432): Many JavaScriptCore tests crash in 64-bit + https://bugs.webkit.org/show_bug.cgi?id=25680 + + Accound for the 64-bit instruction prefix when rewriting mov to lea on 64-bit. + + * jit/JIT.h: + * jit/JITPropertyAccess.cpp: + (JSC::JIT::patchGetByIdSelf): + (JSC::JIT::patchPutByIdReplace): + +2009-05-10 Darin Adler <darin@apple.com> + + Reviewed by Cameron Zwarich. + + Bug 25674: syntax tree nodes should use arena allocation + https://bugs.webkit.org/show_bug.cgi?id=25674 + + Part two: Remove reference counting from most nodes. + + * JavaScriptCore.exp: Updated. + + * JavaScriptCore.xcodeproj/project.pbxproj: Added ParserArena.h and .cpp. + + * parser/Grammar.y: Replaced uses of ParserRefCountedData with uses of + ParserArenaData. Took out now-nonfunctional code that tries to manually + release declaration list. Changed the new calls that create FuncDeclNode + and FuncExprNode so that they use the proper version of operator new for + the reference-counted idiom, not the deletion idiom. + + * parser/NodeConstructors.h: + (JSC::ParserArenaDeletable::operator new): Added. + (JSC::ParserArenaRefCounted::ParserArenaRefCounted): Added. + (JSC::Node::Node): Removed ParserRefCounted initializer. + (JSC::ElementNode::ElementNode): Ditto. + (JSC::PropertyNode::PropertyNode): Ditto. + (JSC::ArgumentsNode::ArgumentsNode): Ditto. + (JSC::SourceElements::SourceElements): Ditto. + (JSC::ParameterNode::ParameterNode): Ditto. + (JSC::FuncExprNode::FuncExprNode): Added ParserArenaRefCounted initializer. + (JSC::FuncDeclNode::FuncDeclNode): Ditto. + (JSC::CaseClauseNode::CaseClauseNode): Removed ParserRefCounted initializer. + (JSC::ClauseListNode::ClauseListNode): Ditto. + (JSC::CaseBlockNode::CaseBlockNode): Ditto. + + * parser/NodeInfo.h: Replaced uses of ParserRefCountedData with uses of + ParserArenaData. + + * parser/Nodes.cpp: + (JSC::ScopeNode::ScopeNode): Added ParserArenaRefCounted initializer. + (JSC::ProgramNode::create): Use the proper version of operator new for + the reference-counted idiom, not the deletion idiom. Use the arena + contains function instead of the vecctor find function. + (JSC::EvalNode::create): Use the proper version of operator new for + the reference-counted idiom, not the deletion idiom. Use the arena + reset function instead of the vector shrink function. + (JSC::FunctionBodyNode::createNativeThunk): Use the proper version + of operator new for the reference-counted idiom, not the deletion idiom. + (JSC::FunctionBodyNode::create): More of the same. + + * parser/Nodes.h: Added ParserArenaDeletable and ParserArenaRefCounted + to replace ParserRefCounted. Fixed inheritance so only the classes that + need reference counting inherit from ParserArenaRefCounted. + + * parser/Parser.cpp: + (JSC::Parser::parse): Set m_sourceElements to 0 since it now starts + uninitialized. Just set it to 0 again in the failure case, since it's + now just a raw pointer, not an owning one. + (JSC::Parser::reparseInPlace): Removed now-unneeded get() function. + (JSC::Parser::didFinishParsing): Replaced uses of ParserRefCountedData + with uses of ParserArenaData. + + * parser/Parser.h: Less RefPtr, more arena. + + * parser/ParserArena.cpp: Added. + * parser/ParserArena.h: Added. + + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::~JSGlobalData): Removed arena-related code, since it's + now in the Parser. + (JSC::JSGlobalData::createLeaked): Removed unneeded #ifndef. + (JSC::JSGlobalData::createNativeThunk): Tweaked #if a bit. + + * runtime/JSGlobalData.h: Removed parserArena, which is now in Parser. + + * wtf/RefCounted.h: Added deletionHasBegun function, for use in + assertions to catch deletion not done by the deref function. + +2009-05-10 David Kilzer <ddkilzer@apple.com> + + Part 2: Try to fix the Windows build by adding a symbol which is really just a re-mangling of a changed method signature + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + +2009-05-10 David Kilzer <ddkilzer@apple.com> + + Try to fix the Windows build by removing an unknown symbol + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + +2009-05-10 David Kilzer <ddkilzer@apple.com> + + Touch Nodes.cpp to try to fix Windows build + + * parser/Nodes.cpp: Removed whitespace. + +2009-05-10 Darin Adler <darin@apple.com> + + Reviewed by Maciej Stachowiak. + + Quick fix for failures seen on buildbot. Maciej plans a better fix later. + + * wtf/dtoa.cpp: Change the hardcoded number of 32-bit words in a BigInt + from 32 to 64. Parsing "1e500", for example, requires more than 32 words. + +2009-05-10 Darin Adler <darin@apple.com> + + Reviewed by Sam Weinig. + + Bug 25674: syntax tree nodes should use arena allocation + Part one: Change lifetimes so we won't have to use reference + counting so much, but don't eliminate the reference counts + entirely yet. + + * JavaScriptCore.exp: Updated. + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::BytecodeGenerator): Update for use of raw pointers + instead of RefPtr. + (JSC::BytecodeGenerator::emitCall): Ditto. + (JSC::BytecodeGenerator::emitConstruct): Ditto. + + * parser/Grammar.y: Update node creating code to use new (JSGlobalData*) + instead of the plain new. At the moment this is just a hook for future + arena allocation; it's inline and JSGlobalData* is not used. + + * parser/NodeConstructors.h: Updated for name change of parserObjects to + parserArena. Also added explicit initialization for raw pointers that used + to be RefPtr. Also removed some uses of get() that aren't needed now that + the pointers are raw pointers. Also eliminated m_parameter from FuncExprNode + and FuncDeclNode. Also changed node-creating code to use new (JSGlobalData*) + as above. + + * parser/Nodes.cpp: Eliminated NodeReleaser and all use of it. + (JSC::ParserRefCounted::ParserRefCounted): Updated for name change of + parserObjects to parserArena. + (JSC::SourceElements::append): Use raw pointers. + (JSC::ArrayNode::emitBytecode): Ditto. + (JSC::ArrayNode::isSimpleArray): Ditto. + (JSC::ArrayNode::toArgumentList): Ditto. + (JSC::ObjectLiteralNode::emitBytecode): Ditto. + (JSC::PropertyListNode::emitBytecode): Ditto. + (JSC::BracketAccessorNode::emitBytecode): Ditto. + (JSC::DotAccessorNode::emitBytecode): Ditto. + (JSC::ArgumentListNode::emitBytecode): Ditto. + (JSC::NewExprNode::emitBytecode): Ditto. + (JSC::EvalFunctionCallNode::emitBytecode): Ditto. + (JSC::FunctionCallValueNode::emitBytecode): Ditto. + (JSC::FunctionCallResolveNode::emitBytecode): Ditto. + (JSC::FunctionCallBracketNode::emitBytecode): Ditto. + (JSC::FunctionCallDotNode::emitBytecode): Ditto. + (JSC::CallFunctionCallDotNode::emitBytecode): Ditto. + (JSC::ApplyFunctionCallDotNode::emitBytecode): Ditto. + (JSC::PostfixBracketNode::emitBytecode): Ditto. + (JSC::PostfixDotNode::emitBytecode): Ditto. + (JSC::DeleteBracketNode::emitBytecode): Ditto. + (JSC::DeleteDotNode::emitBytecode): Ditto. + (JSC::DeleteValueNode::emitBytecode): Ditto. + (JSC::VoidNode::emitBytecode): Ditto. + (JSC::TypeOfValueNode::emitBytecode): Ditto. + (JSC::PrefixBracketNode::emitBytecode): Ditto. + (JSC::PrefixDotNode::emitBytecode): Ditto. + (JSC::UnaryOpNode::emitBytecode): Ditto. + (JSC::BinaryOpNode::emitStrcat): Ditto. + (JSC::BinaryOpNode::emitBytecode): Ditto. + (JSC::EqualNode::emitBytecode): Ditto. + (JSC::StrictEqualNode::emitBytecode): Ditto. + (JSC::ReverseBinaryOpNode::emitBytecode): Ditto. + (JSC::ThrowableBinaryOpNode::emitBytecode): Ditto. + (JSC::InstanceOfNode::emitBytecode): Ditto. + (JSC::LogicalOpNode::emitBytecode): Ditto. + (JSC::ConditionalNode::emitBytecode): Ditto. + (JSC::ReadModifyResolveNode::emitBytecode): Ditto. + (JSC::AssignResolveNode::emitBytecode): Ditto. + (JSC::AssignDotNode::emitBytecode): Ditto. + (JSC::ReadModifyDotNode::emitBytecode): Ditto. + (JSC::AssignBracketNode::emitBytecode): Ditto. + (JSC::ReadModifyBracketNode::emitBytecode): Ditto. + (JSC::CommaNode::emitBytecode): Ditto. + (JSC::ConstDeclNode::emitCodeSingle): Ditto. + (JSC::ConstDeclNode::emitBytecode): Ditto. + (JSC::ConstStatementNode::emitBytecode): Ditto. + (JSC::statementListEmitCode): Ditto. + (JSC::BlockNode::emitBytecode): Ditto. + (JSC::ExprStatementNode::emitBytecode): Ditto. + (JSC::VarStatementNode::emitBytecode): Ditto. + (JSC::IfNode::emitBytecode): Ditto. + (JSC::IfElseNode::emitBytecode): Ditto. + (JSC::DoWhileNode::emitBytecode): Ditto. + (JSC::WhileNode::emitBytecode): Ditto. + (JSC::ForNode::emitBytecode): Ditto. + (JSC::ForInNode::emitBytecode): Ditto. + (JSC::ReturnNode::emitBytecode): Ditto. + (JSC::WithNode::emitBytecode): Ditto. + (JSC::CaseBlockNode::tryOptimizedSwitch): Ditto. + (JSC::CaseBlockNode::emitBytecodeForBlock): Ditto. + (JSC::SwitchNode::emitBytecode): Ditto. + (JSC::LabelNode::emitBytecode): Ditto. + (JSC::ThrowNode::emitBytecode): Ditto. + (JSC::TryNode::emitBytecode): Ditto. + (JSC::ScopeNodeData::ScopeNodeData): Use swap to transfer ownership + of the arena, varStack and functionStack. + (JSC::ScopeNode::ScopeNode): Pass in the arena when creating the + ScopeNodeData. + (JSC::ProgramNode::ProgramNode): Made this inline since it's used + in only one place. + (JSC::ProgramNode::create): Changed this to return a PassRefPtr since + we plan to have the scope nodes be outside the arena, so they will need + some kind of ownership transfer (maybe auto_ptr instead of PassRefPtr + in the future, though). Remove the node from the newly-created arena to + avoid a circular reference. Later we'll keep the node out of the arena + by using a different operator new, but for now it's the ParserRefCounted + constructor that puts the node into the arena, and there's no way to + bypass that. + (JSC::EvalNode::EvalNode): Ditto. + (JSC::EvalNode::create): Ditto. + (JSC::FunctionBodyNode::FunctionBodyNode): Ditto. + (JSC::FunctionBodyNode::createNativeThunk): Moved the code that + reseets the arena here instead of the caller. + (JSC::FunctionBodyNode::create): Same change as the other create + functions above. + (JSC::FunctionBodyNode::emitBytecode): Use raw pointers. + + * parser/Nodes.h: Removed NodeReleaser. Changed FunctionStack to + use raw pointers. Removed the releaseNodes function. Added an override + of operator new that takes a JSGlobalData* to prepare for future arena use. + Use raw pointers instead of RefPtr everywhere possible. + + * parser/Parser.cpp: + (JSC::Parser::reparseInPlace): Pass the arena in. + + * parser/Parser.h: + (JSC::Parser::parse): Updated for name change of parserObjects to parserArena. + (JSC::Parser::reparse): Ditto. + * runtime/FunctionConstructor.cpp: + (JSC::extractFunctionBody): Ditto. + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::~JSGlobalData): Ditto. + (JSC::JSGlobalData::createNativeThunk): Moved arena manipulation into the + FunctionBodyNode::createNativeThunk function. + + * runtime/JSGlobalData.h: Tweaked formatting and renamed parserObjects to + parserArena. + + * wtf/NotFound.h: Added the usual "using WTF" to this header to match the + rest of WTF. + +2009-05-10 Dimitri Glazkov <dglazkov@chromium.org> + + Reviewed by Geoffrey Garen. + + https://bugs.webkit.org/show_bug.cgi?id=25670 + Remove no longer valid chunk of code from dtoa. + + * wtf/dtoa.cpp: + (WTF::dtoa): Removed invalid code. + +2009-05-10 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Geoff Garen. + + "Class const *" is the same as "const Class*", use the latter syntax consistently. + + See <http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.9>. + + * pcre/pcre_compile.cpp: + (calculateCompiledPatternLength): + * runtime/JSObject.h: + (JSC::JSObject::offsetForLocation): + (JSC::JSObject::locationForOffset): + +2009-05-10 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Alexey Proskuryakov. + + - speedup dtoa/strtod + + Added a bunch of inlining, and replaced malloc with stack allocation. + + 0.5% SunSpider speedup (7% on string-tagcloud). + + * runtime/NumberPrototype.cpp: + (JSC::integerPartNoExp): + (JSC::numberProtoFuncToExponential): + * runtime/UString.cpp: + (JSC::concatenate): + (JSC::UString::from): + * wtf/dtoa.cpp: + (WTF::BigInt::BigInt): + (WTF::BigInt::operator=): + (WTF::Balloc): + (WTF::Bfree): + (WTF::multadd): + (WTF::s2b): + (WTF::i2b): + (WTF::mult): + (WTF::pow5mult): + (WTF::lshift): + (WTF::cmp): + (WTF::diff): + (WTF::b2d): + (WTF::d2b): + (WTF::ratio): + (WTF::strtod): + (WTF::quorem): + (WTF::freedtoa): + (WTF::dtoa): + * wtf/dtoa.h: + +2009-05-09 Mike Hommey <glandium@debian.org> + + Reviewed by Geoffrey Garen. Landed by Jan Alonzo. + + Enable JIT on x86-64 gtk+ + https://bugs.webkit.org/show_bug.cgi?id=24724 + + * GNUmakefile.am: + +2009-05-09 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Cameron Zwarich. + + Removed the last non-call-related manually managed JIT stub call. + + * jit/JITArithmetic.cpp: + (JSC::JIT::compileFastArithSlow_op_rshift): Fully use the JITStubCall + abstraction, instead of emitPutJITStubArg. + +2009-05-09 Sebastian Andrzej Siewior <sebastian@breakpoint.cc> + + Reviewed by Gustavo Noronha. + + https://bugs.webkit.org/show_bug.cgi?id=25653 + PLATFORM(X86_64) inherits ia64 + + __ia64__ is defined by gcc in an IA64 arch and has completely + nothing in common with X86-64 exept both are from Intel and have + an 64bit address space. That's it. Since code seems to expect x86 + here, ia64 has to go. + + * wtf/Platform.h: + +2009-05-09 Gustavo Noronha Silva <gns@gnome.org> + + Suggested by Geoffrey Garen. + + Assume SSE2 is present on X86-64 and on MAC X86-32. This fixes a + build breakage on non-Mac X86-64 when JIT is enabled. + + * jit/JITArithmetic.cpp: + +2009-05-09 Gustavo Noronha Silva <gns@gnome.org> + + Build fix, adding missing files to make dist. + + * GNUmakefile.am: + +2009-05-09 Geoffrey Garen <ggaren@apple.com> + + Windows build fix. + + * assembler/X86Assembler.h: + (JSC::X86Assembler::patchLoadToLEA): + +2009-05-09 Geoffrey Garen <ggaren@apple.com> + + Windows build fix. + + * assembler/X86Assembler.h: + (JSC::X86Assembler::patchLoadToLEA): + +2009-05-09 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Gavin Barraclough. + + Original patch by John McCall. Updated by Cameron Zwarich. Further refined by me. + + - Assorted speedups to property access + + ~.3%-1% speedup on SunSpider + + 1) When we know from the structure ID that an object is using inline storage, plant direct + loads and stores against it; no need to indirect through storage pointer. + + 2) Also because of the above, union the property storage pointer with the first inline property + slot and add an extra inline property slot. + + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::CodeLocationInstruction::CodeLocationInstruction): + (JSC::AbstractMacroAssembler::CodeLocationInstruction::patchLoadToLEA): + (JSC::::CodeLocationCommon::instructionAtOffset): + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::storePtr): + * assembler/MacroAssemblerX86.h: + (JSC::MacroAssemblerX86::store32): + * assembler/MacroAssemblerX86_64.h: + (JSC::MacroAssemblerX86_64::storePtr): + * assembler/X86Assembler.h: + (JSC::X86Assembler::movq_EAXm): + (JSC::X86Assembler::movl_rm): + (JSC::X86Assembler::patchLoadToLEA): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + * jit/JIT.h: + * jit/JITPropertyAccess.cpp: + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::compilePutByIdHotPath): + (JSC::JIT::compilePutDirectOffset): + (JSC::JIT::compileGetDirectOffset): + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::patchGetByIdSelf): + (JSC::JIT::patchPutByIdReplace): + (JSC::JIT::privateCompileGetByIdSelf): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdSelfList): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChainList): + (JSC::JIT::privateCompileGetByIdChain): + (JSC::JIT::privateCompilePutByIdReplace): + * runtime/JSObject.cpp: + (JSC::JSObject::mark): + (JSC::JSObject::removeDirect): + * runtime/JSObject.h: + (JSC::JSObject::propertyStorage): + (JSC::JSObject::getDirect): + (JSC::JSObject::getOffset): + (JSC::JSObject::offsetForLocation): + (JSC::JSObject::locationForOffset): + (JSC::JSObject::getDirectOffset): + (JSC::JSObject::putDirectOffset): + (JSC::JSObject::isUsingInlineStorage): + (JSC::JSObject::): + (JSC::JSObject::JSObject): + (JSC::JSObject::~JSObject): + (JSC::Structure::isUsingInlineStorage): + (JSC::JSObject::putDirect): + (JSC::JSObject::putDirectWithoutTransition): + (JSC::JSObject::allocatePropertyStorageInline): + * runtime/Structure.h: + +2009-05-09 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Gavin Barraclough. + + Changed all our JIT stubs so that they return a maximum of 1 JS value or + two non-JS pointers, and do all other value returning through out + parameters, in preparation for 64bit JS values on a 32bit system. + + Stubs that used to return two JSValues now return one JSValue and take + and out parameter specifying where in the register array the second + value should go. + + SunSpider reports no change. + + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + * jit/JITArithmetic.cpp: + (JSC::JIT::compileFastArithSlow_op_post_inc): + (JSC::JIT::compileFastArithSlow_op_post_dec): + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_op_call_arityCheck): + (JSC::JITStubs::cti_op_resolve_func): + (JSC::JITStubs::cti_op_post_inc): + (JSC::JITStubs::cti_op_resolve_with_base): + (JSC::JITStubs::cti_op_post_dec): + * jit/JITStubs.h: + (JSC::): + +2009-05-08 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Cameron Zwarich. + + Fixed <rdar://problem/6634956> CrashTracer: [REGRESSION] >400 crashes + in Safari at com.apple.JavaScriptCore • JSC::BytecodeGenerator::emitComplexJumpScopes + 468 + https://bugs.webkit.org/show_bug.cgi?id=25658 + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitComplexJumpScopes): Guard the whole loop + with a bounds check. The old loop logic would decrement and read topScope + without a bounds check, which could cause crashes on page boundaries. + +2009-05-08 Jan Michael Alonzo <jmalonzo@webkit.org> + + Reviewed by NOBODY (BuildFix). + + Gtk fix: add LiteralParser to the build script per r43424. + + Add LiteralParser to the Qt and Wx build scripts too. + + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCoreSources.bkl: + +2009-05-08 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough and Darin Adler. + + Add a limited literal parser for eval to handle object and array literals fired at eval + + This is a simplified parser and lexer that we can throw at strings passed to eval + in case a site is using eval to parse JSON (eg. json2.js). The lexer is intentionally + limited (in effect it's whitelisting a limited "common" subset of the JSON grammar) + as this decreases the likelihood of us wating time attempting to parse any significant + amount of non-JSON content. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * interpreter/Interpreter.cpp: + (JSC::Interpreter::callEval): + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::globalFuncEval): + * runtime/LiteralParser.cpp: Added. + (JSC::isStringCharacter): + (JSC::LiteralParser::Lexer::lex): + (JSC::LiteralParser::Lexer::lexString): + (JSC::LiteralParser::Lexer::lexNumber): + (JSC::LiteralParser::parseStatement): + (JSC::LiteralParser::parseExpression): + (JSC::LiteralParser::parseArray): + (JSC::LiteralParser::parseObject): + (JSC::LiteralParser::StackGuard::StackGuard): + (JSC::LiteralParser::StackGuard::~StackGuard): + (JSC::LiteralParser::StackGuard::isSafe): + * runtime/LiteralParser.h: Added. + (JSC::LiteralParser::LiteralParser): + (JSC::LiteralParser::attemptJSONParse): + (JSC::LiteralParser::): + (JSC::LiteralParser::Lexer::Lexer): + (JSC::LiteralParser::Lexer::next): + (JSC::LiteralParser::Lexer::currentToken): + (JSC::LiteralParser::abortParse): + +2009-05-08 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Restored a Mozilla JS test I accidentally gutted. + + * tests/mozilla/ecma/Array/15.4.4.2.js: + (getTestCases): + (test): + +2009-05-08 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Gavin Barraclough. + + More abstraction for JITStub calls from JITed code. + + Added a JITStubCall class that automatically handles things like assigning + arguments to different stack slots and storing return values. Deployed + the class in about a billion places. A bunch more places remain to be + fixed up, but this is a good stopping point for now. + + * jit/JIT.cpp: + (JSC::JIT::emitTimeoutCheck): + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + (JSC::JIT::privateCompile): + * jit/JIT.h: + (JSC::JIT::JSRInfo::JSRInfo): + (JSC::JITStubCall::JITStubCall): + (JSC::JITStubCall::addArgument): + (JSC::JITStubCall::call): + (JSC::JITStubCall::): + (JSC::CallEvalJITStub::CallEvalJITStub): + * jit/JITArithmetic.cpp: + (JSC::JIT::compileFastArithSlow_op_lshift): + (JSC::JIT::compileFastArithSlow_op_rshift): + (JSC::JIT::compileFastArithSlow_op_jnless): + (JSC::JIT::compileFastArithSlow_op_bitand): + (JSC::JIT::compileFastArithSlow_op_mod): + (JSC::JIT::compileFastArith_op_mod): + (JSC::JIT::compileFastArithSlow_op_post_inc): + (JSC::JIT::compileFastArithSlow_op_post_dec): + (JSC::JIT::compileFastArithSlow_op_pre_inc): + (JSC::JIT::compileFastArithSlow_op_pre_dec): + (JSC::JIT::compileFastArith_op_add): + (JSC::JIT::compileFastArith_op_mul): + (JSC::JIT::compileFastArith_op_sub): + (JSC::JIT::compileBinaryArithOpSlowCase): + (JSC::JIT::compileFastArithSlow_op_add): + (JSC::JIT::compileFastArithSlow_op_mul): + * jit/JITCall.cpp: + (JSC::JIT::compileOpCall): + (JSC::): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::compilePutByIdHotPath): + (JSC::JIT::compileGetByIdSlowCase): + (JSC::JIT::compilePutByIdSlowCase): + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_op_resolve_func): + (JSC::JITStubs::cti_op_resolve_with_base): + +2009-05-08 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Maciej Stachowiak. + + Add a new opcode jnlesseq, and optimize its compilation in the JIT using + techniques similar to what were used to optimize jnless in r43363. + + This gives a 0.7% speedup on SunSpider, particularly on the tests 3d-cube, + control-flow-recursive, date-format-xparb, and string-base64. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): Add support for dumping op_jnlesseq. + * bytecode/Opcode.h: Add op_jnlesseq to the list of opcodes. + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitJumpIfFalse): Add a peephole optimization + for op_jnlesseq when emitting lesseq followed by a jump. + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): Add case for op_jnlesseq. + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): Add case for op_jnlesseq. + (JSC::JIT::privateCompileSlowCases): Add case for op_jnlesseq. + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::compileFastArith_op_jnlesseq): Added. + (JSC::JIT::compileFastArithSlow_op_jnlesseq): Added. + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_op_jlesseq): Added. + * jit/JITStubs.h: + +2009-05-08 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Cameron Zwarich. + + - fix test failures on 64-bit + + * jit/JITArithmetic.cpp: + (JSC::JIT::compileFastArithSlow_op_jnless): Avoid accidentaly treating an + immediate int as an immediate float in the 64-bit value representation. + +2009-05-08 Gavin Barraclough <barraclough@apple.com> + + Rubber stamped by Oliver Hunt. + + Removing an empty constructor and an uncalled, empty function seems to be a + pretty solid 1% regeression on my machine, so I'm going to put them back. + Um. Yeah, this this pretty pointles and makes no sense at all. I officially + lose the will to live in 3... 2... + + * bytecode/SamplingTool.cpp: + (JSC::SamplingTool::notifyOfScope): + * bytecode/SamplingTool.h: + (JSC::SamplingTool::~SamplingTool): + +2009-05-08 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver "I see lots of ifdefs" Hunt. + + Fix (kinda) for sampling tool breakage. The codeblock sampling tool has become + b0rked due to recent changes in native function calling. The initialization of + a ScopeNode appears to now occur before the sampling tool (or possibly the + interpreter has been brought into existence, wihich leads to crashyness). + + This patch doesn't fix the problem. The crash occurs when tracking a Scope, but + we shouldn't need to track scopes when we're just sampling opcodes, not + codeblocks. Not retaining Scopes when just opcode sampling will reduce sampling + overhead reducing any instrumentation skew, which is a good thing. As a side + benefit this patch also gets the opcode sampling going again, albeit in a bit of + a lame way. Will come back later with a proper fix from codeblock sampling. + + * JavaScriptCore.exp: + * bytecode/SamplingTool.cpp: + (JSC::compareLineCountInfoSampling): + (JSC::SamplingTool::dump): + * bytecode/SamplingTool.h: + (JSC::SamplingTool::SamplingTool): + * parser/Nodes.cpp: + (JSC::ScopeNode::ScopeNode): + +2009-05-07 Mark Rowe <mrowe@apple.com> + + Rubber-stamped by Oliver Hunt. + + Fix <https://bugs.webkit.org/show_bug.cgi?id=25640>. + Bug 25640: Crash on quit in r43384 nightly build on Leopard w/ Safari 4 beta installed + + Roll out r43366 as it removed symbols that Safari 4 Beta uses. + + * JavaScriptCore.exp: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + * bytecode/SamplingTool.cpp: + (JSC::SamplingThread::start): + (JSC::SamplingThread::stop): + * bytecode/SamplingTool.h: + * wtf/CrossThreadRefCounted.h: + (WTF::CrossThreadRefCounted::CrossThreadRefCounted): + (WTF::::ref): + (WTF::::deref): + * wtf/Threading.h: + * wtf/ThreadingNone.cpp: + * wtf/ThreadingPthreads.cpp: + (WTF::threadMapMutex): + (WTF::initializeThreading): + (WTF::threadMap): + (WTF::identifierByPthreadHandle): + (WTF::establishIdentifierForPthreadHandle): + (WTF::pthreadHandleForIdentifier): + (WTF::clearPthreadHandleForIdentifier): + (WTF::createThreadInternal): + (WTF::waitForThreadCompletion): + (WTF::detachThread): + (WTF::currentThread): + * wtf/ThreadingWin.cpp: + (WTF::threadMapMutex): + (WTF::initializeThreading): + (WTF::threadMap): + (WTF::storeThreadHandleByIdentifier): + (WTF::threadHandleForIdentifier): + (WTF::clearThreadHandleForIdentifier): + (WTF::createThreadInternal): + (WTF::waitForThreadCompletion): + (WTF::detachThread): + (WTF::currentThread): + * wtf/gtk/ThreadingGtk.cpp: + (WTF::threadMapMutex): + (WTF::initializeThreading): + (WTF::threadMap): + (WTF::identifierByGthreadHandle): + (WTF::establishIdentifierForThread): + (WTF::threadForIdentifier): + (WTF::clearThreadForIdentifier): + (WTF::createThreadInternal): + (WTF::waitForThreadCompletion): + (WTF::currentThread): + * wtf/qt/ThreadingQt.cpp: + (WTF::threadMapMutex): + (WTF::threadMap): + (WTF::identifierByQthreadHandle): + (WTF::establishIdentifierForThread): + (WTF::clearThreadForIdentifier): + (WTF::threadForIdentifier): + (WTF::initializeThreading): + (WTF::createThreadInternal): + (WTF::waitForThreadCompletion): + (WTF::currentThread): + +2009-05-07 Gustavo Noronha Silva <gns@gnome.org> + + Suggested by Oliver Hunt. + + Also check for Linux for the special-cased calling convention. + + * jit/JIT.cpp: + (JSC::JIT::privateCompileCTIMachineTrampolines): + * wtf/Platform.h: + +2009-05-07 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Maciej Stachowiak. + + Previously, when appending to an existing string and growing the underlying buffer, + we would actually allocate 110% of the required size in order to give us some space + to expand into. Now we treat strings differently based on their size: + + Small Strings (up to 4 pages): + Expand the allocation size to 112.5% of the amount requested. This is largely sicking + to our previous policy, however 112.5% is cheaper to calculate. + + Medium Strings (up to 128 pages): + For pages covering multiple pages over-allocation is less of a concern - any unused + space will not be paged in if it is not used, so this is purely a VM overhead. For + these strings allocate 2x the requested size. + + Large Strings (to infinity and beyond!): + Revert to our 112.5% policy - probably best to limit the amount of unused VM we allow + any individual string be responsible for. + + Additionally, round small allocations up to a multiple of 16 bytes, and medium and + large allocations up to a multiple of page size. + + ~1.5% progression on Sunspider, due to 5% improvement on tagcloud & 15% on validate. + + * runtime/UString.cpp: + (JSC::expandedSize): + +2009-05-07 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Cameron Zwarich. + + Fixed a minor sequencing error introduced by recent Parser speedups. + + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::createNativeThunk): Missed a spot in my last patch. + +2009-05-07 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + * wtf/Platform.h: Reverted an accidental (and performance-catastrophic) + change. + +2009-05-07 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Cameron Zwarich. + + Fixed a minor sequencing error introduced by recent Parser speedups. + + * parser/Parser.cpp: + (JSC::Parser::reparseInPlace): Missed a spot in my last patch. + +2009-05-07 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Cameron Zwarich. + + Fixed a minor sequencing error introduced by recent Parser speedups. + + * parser/Parser.cpp: + (JSC::Parser::parse): + * parser/Parser.h: + (JSC::Parser::parse): + (JSC::Parser::reparse): Shrink the parsedObjects vector after allocating + the root node, to avoid leaving a stray node in the vector, since that's + a slight memory leak, and it causes problems during JSGlobalData teardown. + + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::~JSGlobalData): ASSERT that we're not being torn + down while we think we're still parsing, since that would cause lots of + bad memory references during our destruction. + +2009-05-07 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Cameron Zwarich. + + Replaced two more macros with references to the JITStackFrame structure. + + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + * jit/JITInlineMethods.h: + (JSC::JIT::restoreArgumentReference): + * jit/JITStubs.cpp: + (JSC::): + * jit/JITStubs.h: + +2009-05-07 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + Improve native call performance + + Fix the windows build by adding calling convention declarations everywhere, + chose fastcall as that seemed most sensible given we were having to declare + the convention explicitly. In addition switched to fastcall on mac in the + deluded belief that documented fastcall behavior on windows would match + actual its actual behavior. + + * API/JSCallbackFunction.h: + * API/JSCallbackObject.h: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + * interpreter/CallFrame.h: + (JSC::ExecState::argumentCount): + * jit/JIT.cpp: + (JSC::JIT::privateCompileCTIMachineTrampolines): + * jsc.cpp: + (functionPrint): + (functionDebug): + (functionGC): + (functionVersion): + (functionRun): + (functionLoad): + (functionSetSamplingFlags): + (functionClearSamplingFlags): + (functionReadline): + (functionQuit): + * runtime/ArrayConstructor.cpp: + (JSC::callArrayConstructor): + * runtime/ArrayPrototype.cpp: + (JSC::arrayProtoFuncToString): + (JSC::arrayProtoFuncToLocaleString): + (JSC::arrayProtoFuncJoin): + (JSC::arrayProtoFuncConcat): + (JSC::arrayProtoFuncPop): + (JSC::arrayProtoFuncPush): + (JSC::arrayProtoFuncReverse): + (JSC::arrayProtoFuncShift): + (JSC::arrayProtoFuncSlice): + (JSC::arrayProtoFuncSort): + (JSC::arrayProtoFuncSplice): + (JSC::arrayProtoFuncUnShift): + (JSC::arrayProtoFuncFilter): + (JSC::arrayProtoFuncMap): + (JSC::arrayProtoFuncEvery): + (JSC::arrayProtoFuncForEach): + (JSC::arrayProtoFuncSome): + (JSC::arrayProtoFuncReduce): + (JSC::arrayProtoFuncReduceRight): + (JSC::arrayProtoFuncIndexOf): + (JSC::arrayProtoFuncLastIndexOf): + * runtime/BooleanConstructor.cpp: + (JSC::callBooleanConstructor): + * runtime/BooleanPrototype.cpp: + (JSC::booleanProtoFuncToString): + (JSC::booleanProtoFuncValueOf): + * runtime/CallData.h: + * runtime/DateConstructor.cpp: + (JSC::callDate): + (JSC::dateParse): + (JSC::dateNow): + (JSC::dateUTC): + * runtime/DatePrototype.cpp: + (JSC::dateProtoFuncToString): + (JSC::dateProtoFuncToUTCString): + (JSC::dateProtoFuncToDateString): + (JSC::dateProtoFuncToTimeString): + (JSC::dateProtoFuncToLocaleString): + (JSC::dateProtoFuncToLocaleDateString): + (JSC::dateProtoFuncToLocaleTimeString): + (JSC::dateProtoFuncGetTime): + (JSC::dateProtoFuncGetFullYear): + (JSC::dateProtoFuncGetUTCFullYear): + (JSC::dateProtoFuncToGMTString): + (JSC::dateProtoFuncGetMonth): + (JSC::dateProtoFuncGetUTCMonth): + (JSC::dateProtoFuncGetDate): + (JSC::dateProtoFuncGetUTCDate): + (JSC::dateProtoFuncGetDay): + (JSC::dateProtoFuncGetUTCDay): + (JSC::dateProtoFuncGetHours): + (JSC::dateProtoFuncGetUTCHours): + (JSC::dateProtoFuncGetMinutes): + (JSC::dateProtoFuncGetUTCMinutes): + (JSC::dateProtoFuncGetSeconds): + (JSC::dateProtoFuncGetUTCSeconds): + (JSC::dateProtoFuncGetMilliSeconds): + (JSC::dateProtoFuncGetUTCMilliseconds): + (JSC::dateProtoFuncGetTimezoneOffset): + (JSC::dateProtoFuncSetTime): + (JSC::dateProtoFuncSetMilliSeconds): + (JSC::dateProtoFuncSetUTCMilliseconds): + (JSC::dateProtoFuncSetSeconds): + (JSC::dateProtoFuncSetUTCSeconds): + (JSC::dateProtoFuncSetMinutes): + (JSC::dateProtoFuncSetUTCMinutes): + (JSC::dateProtoFuncSetHours): + (JSC::dateProtoFuncSetUTCHours): + (JSC::dateProtoFuncSetDate): + (JSC::dateProtoFuncSetUTCDate): + (JSC::dateProtoFuncSetMonth): + (JSC::dateProtoFuncSetUTCMonth): + (JSC::dateProtoFuncSetFullYear): + (JSC::dateProtoFuncSetUTCFullYear): + (JSC::dateProtoFuncSetYear): + (JSC::dateProtoFuncGetYear): + * runtime/ErrorConstructor.cpp: + (JSC::callErrorConstructor): + * runtime/ErrorPrototype.cpp: + (JSC::errorProtoFuncToString): + * runtime/FunctionConstructor.cpp: + (JSC::callFunctionConstructor): + * runtime/FunctionPrototype.cpp: + (JSC::callFunctionPrototype): + (JSC::functionProtoFuncToString): + (JSC::functionProtoFuncApply): + (JSC::functionProtoFuncCall): + * runtime/JSFunction.h: + (JSC::JSFunction::nativeFunction): + (JSC::JSFunction::setScopeChain): + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::globalFuncEval): + (JSC::globalFuncParseInt): + (JSC::globalFuncParseFloat): + (JSC::globalFuncIsNaN): + (JSC::globalFuncIsFinite): + (JSC::globalFuncDecodeURI): + (JSC::globalFuncDecodeURIComponent): + (JSC::globalFuncEncodeURI): + (JSC::globalFuncEncodeURIComponent): + (JSC::globalFuncEscape): + (JSC::globalFuncUnescape): + (JSC::globalFuncJSCPrint): + * runtime/JSGlobalObjectFunctions.h: + * runtime/MathObject.cpp: + (JSC::mathProtoFuncAbs): + (JSC::mathProtoFuncACos): + (JSC::mathProtoFuncASin): + (JSC::mathProtoFuncATan): + (JSC::mathProtoFuncATan2): + (JSC::mathProtoFuncCeil): + (JSC::mathProtoFuncCos): + (JSC::mathProtoFuncExp): + (JSC::mathProtoFuncFloor): + (JSC::mathProtoFuncLog): + (JSC::mathProtoFuncMax): + (JSC::mathProtoFuncMin): + (JSC::mathProtoFuncPow): + (JSC::mathProtoFuncRandom): + (JSC::mathProtoFuncRound): + (JSC::mathProtoFuncSin): + (JSC::mathProtoFuncSqrt): + (JSC::mathProtoFuncTan): + * runtime/NativeErrorConstructor.cpp: + (JSC::callNativeErrorConstructor): + * runtime/NativeFunctionWrapper.h: + * runtime/NumberConstructor.cpp: + (JSC::callNumberConstructor): + * runtime/NumberPrototype.cpp: + (JSC::numberProtoFuncToString): + (JSC::numberProtoFuncToLocaleString): + (JSC::numberProtoFuncValueOf): + (JSC::numberProtoFuncToFixed): + (JSC::numberProtoFuncToExponential): + (JSC::numberProtoFuncToPrecision): + * runtime/ObjectConstructor.cpp: + (JSC::callObjectConstructor): + * runtime/ObjectPrototype.cpp: + (JSC::objectProtoFuncValueOf): + (JSC::objectProtoFuncHasOwnProperty): + (JSC::objectProtoFuncIsPrototypeOf): + (JSC::objectProtoFuncDefineGetter): + (JSC::objectProtoFuncDefineSetter): + (JSC::objectProtoFuncLookupGetter): + (JSC::objectProtoFuncLookupSetter): + (JSC::objectProtoFuncPropertyIsEnumerable): + (JSC::objectProtoFuncToLocaleString): + (JSC::objectProtoFuncToString): + * runtime/ObjectPrototype.h: + * runtime/RegExpConstructor.cpp: + (JSC::callRegExpConstructor): + * runtime/RegExpObject.cpp: + (JSC::callRegExpObject): + * runtime/RegExpPrototype.cpp: + (JSC::regExpProtoFuncTest): + (JSC::regExpProtoFuncExec): + (JSC::regExpProtoFuncCompile): + (JSC::regExpProtoFuncToString): + * runtime/StringConstructor.cpp: + (JSC::stringFromCharCode): + (JSC::callStringConstructor): + * runtime/StringPrototype.cpp: + (JSC::stringProtoFuncReplace): + (JSC::stringProtoFuncToString): + (JSC::stringProtoFuncCharAt): + (JSC::stringProtoFuncCharCodeAt): + (JSC::stringProtoFuncConcat): + (JSC::stringProtoFuncIndexOf): + (JSC::stringProtoFuncLastIndexOf): + (JSC::stringProtoFuncMatch): + (JSC::stringProtoFuncSearch): + (JSC::stringProtoFuncSlice): + (JSC::stringProtoFuncSplit): + (JSC::stringProtoFuncSubstr): + (JSC::stringProtoFuncSubstring): + (JSC::stringProtoFuncToLowerCase): + (JSC::stringProtoFuncToUpperCase): + (JSC::stringProtoFuncLocaleCompare): + (JSC::stringProtoFuncBig): + (JSC::stringProtoFuncSmall): + (JSC::stringProtoFuncBlink): + (JSC::stringProtoFuncBold): + (JSC::stringProtoFuncFixed): + (JSC::stringProtoFuncItalics): + (JSC::stringProtoFuncStrike): + (JSC::stringProtoFuncSub): + (JSC::stringProtoFuncSup): + (JSC::stringProtoFuncFontcolor): + (JSC::stringProtoFuncFontsize): + (JSC::stringProtoFuncAnchor): + (JSC::stringProtoFuncLink): + * wtf/Platform.h: + +2009-05-07 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Rolled out a portion of r43352 because it broke 64bit. + + * jit/JITStubs.h: + +2009-05-07 Kevin Ollivier <kevino@theolliviers.com> + + Build fix for functions reaturning ThreadIdentifier. + + * wtf/ThreadingNone.cpp: + (WTF::createThreadInternal): + (WTF::currentThread): + +2009-05-07 Maciej Stachowiak <mjs@apple.com> + + Reviewed by John Honeycutt. + + - enable optimization case im the last patch that I accidentally had disabled. + + * jit/JITArithmetic.cpp: + (JSC::JIT::compileFastArithSlow_op_jnless): + +2009-05-07 Dmitry Titov <dimich@chromium.org> + + Attempt to fix Win build. + + * jit/JITArithmetic.cpp: + (JSC::JIT::compileFastArithSlow_op_jnless): + +2009-05-07 Dmitry Titov <dimich@chromium.org> + + Reviewed by Alexey Proskuryakov and Adam Roben. + + https://bugs.webkit.org/show_bug.cgi?id=25348 + Change WTF::ThreadIdentifier to be an actual (but wrapped) thread id, remove ThreadMap. + + * wtf/Threading.h: + (WTF::ThreadIdentifier::ThreadIdentifier): + (WTF::ThreadIdentifier::isValid): + (WTF::ThreadIdentifier::invalidate): + (WTF::ThreadIdentifier::platformId): + ThreadIdentifier is now a class, containing a PlatformThreadIdentifier and + methods that are used across the code on thread ids: construction, comparisons, + check for 'valid' state etc. '0' is used as invalid id, which happens to just work + with all platform-specific thread id implementations. + + All the following files repeatedly reflect the new ThreadIdentifier for each platform. + We remove ThreadMap and threadMapMutex from all of them, remove the functions that + populated/searched/cleared the map and add platform-specific comparison operators + for ThreadIdentifier. + + * wtf/gtk/ThreadingGtk.cpp: + (WTF::ThreadIdentifier::operator==): + (WTF::ThreadIdentifier::operator!=): + (WTF::initializeThreading): + (WTF::createThreadInternal): + (WTF::waitForThreadCompletion): + (WTF::currentThread): + + * wtf/ThreadingNone.cpp: + (WTF::ThreadIdentifier::operator==): + (WTF::ThreadIdentifier::operator!=): + + * wtf/ThreadingPthreads.cpp: + (WTF::ThreadIdentifier::operator==): + (WTF::ThreadIdentifier::operator!=): + (WTF::initializeThreading): + (WTF::createThreadInternal): + (WTF::waitForThreadCompletion): + (WTF::detachThread): + (WTF::currentThread): + + * wtf/qt/ThreadingQt.cpp: + (WTF::ThreadIdentifier::operator==): + (WTF::ThreadIdentifier::operator!=): + (WTF::initializeThreading): + (WTF::createThreadInternal): + (WTF::waitForThreadCompletion): + (WTF::currentThread): + + * wtf/ThreadingWin.cpp: + (WTF::ThreadIdentifier::operator==): + (WTF::ThreadIdentifier::operator!=): + (WTF::initializeThreading): + (WTF::createThreadInternal): All the platforms (except Windows) used a sequential + counter as a thread ID and mapped it into platform ID. Windows was using native thread + id and mapped it into thread handle. Since we can always obtain a thread handle + by thread id, createThread now closes the handle. + (WTF::waitForThreadCompletion): obtains another one using OpenThread(id) API. If can not obtain a handle, + it means the thread already exited. + (WTF::detachThread): + (WTF::currentThread): + (WTF::detachThreadDeprecated): old function, renamed (for Win Safari 4 beta which uses it for now). + (WTF::waitForThreadCompletionDeprecated): same. + (WTF::currentThreadDeprecated): same. + (WTF::createThreadDeprecated): same. + + * bytecode/SamplingTool.h: + * bytecode/SamplingTool.cpp: Use DEFINE_STATIC_LOCAL for a static ThreadIdentifier variable, to avoid static constructor. + + * JavaScriptCore.exp: export lists - updated the WTF threading functions decorated names + since they now take a different type as a parameter. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: ditto for Windows, plus added "deprecated" functions + that take old parameter type - turns out public beta of Safari 4 uses those, so they need to be kept along for a while. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: ditto. + +2009-05-07 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Sam Weinig. + + - optimize various cases of branch-fused less + + 1% speedup on SunSpider overall + 13% speedup on math-cordic + + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + op_loop_if_less: Optimize case of constant as first operand, just as case of constant as + second operand. + op_jnless: Factored out into compileFastArith_op_jnless. + (JSC::JIT::privateCompileSlowCases): + op_jnless: Factored out into compileFastArithSlow_op_jnless. + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::compileFastArith_op_jnless): Factored out from main compile loop. + - Generate inline code for comparison of constant immediate int as first operand to another + immediate int, as for loop_if_less + + (JSC::JIT::compileFastArithSlow_op_jnless): + - Generate inline code for comparing two floating point numbers. + - Generate code for both cases of comparing a floating point number to a constant immediate + int. + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): Fix dumping of op_jnless (tangentially related bugfix). + +2009-05-07 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Added the return address of a stub function to the JITStackFrame abstraction. + + * jit/JIT.cpp: + * jit/JIT.h: + * jit/JITStubs.cpp: + (JSC::): + (JSC::StackHack::StackHack): + (JSC::StackHack::~StackHack): + (JSC::returnToThrowTrampoline): + (JSC::JITStubs::cti_op_convert_this): + (JSC::JITStubs::cti_op_end): + (JSC::JITStubs::cti_op_add): + (JSC::JITStubs::cti_op_pre_inc): + (JSC::JITStubs::cti_timeout_check): + (JSC::JITStubs::cti_register_file_check): + (JSC::JITStubs::cti_op_loop_if_less): + (JSC::JITStubs::cti_op_loop_if_lesseq): + (JSC::JITStubs::cti_op_new_object): + (JSC::JITStubs::cti_op_put_by_id_generic): + (JSC::JITStubs::cti_op_get_by_id_generic): + (JSC::JITStubs::cti_op_put_by_id): + (JSC::JITStubs::cti_op_put_by_id_second): + (JSC::JITStubs::cti_op_put_by_id_fail): + (JSC::JITStubs::cti_op_get_by_id): + (JSC::JITStubs::cti_op_get_by_id_second): + (JSC::JITStubs::cti_op_get_by_id_self_fail): + (JSC::JITStubs::cti_op_get_by_id_proto_list): + (JSC::JITStubs::cti_op_get_by_id_proto_list_full): + (JSC::JITStubs::cti_op_get_by_id_proto_fail): + (JSC::JITStubs::cti_op_get_by_id_array_fail): + (JSC::JITStubs::cti_op_get_by_id_string_fail): + (JSC::JITStubs::cti_op_instanceof): + (JSC::JITStubs::cti_op_del_by_id): + (JSC::JITStubs::cti_op_mul): + (JSC::JITStubs::cti_op_new_func): + (JSC::JITStubs::cti_op_call_JSFunction): + (JSC::JITStubs::cti_op_call_arityCheck): + (JSC::JITStubs::cti_vm_dontLazyLinkCall): + (JSC::JITStubs::cti_vm_lazyLinkCall): + (JSC::JITStubs::cti_op_push_activation): + (JSC::JITStubs::cti_op_call_NotJSFunction): + (JSC::JITStubs::cti_op_create_arguments): + (JSC::JITStubs::cti_op_create_arguments_no_params): + (JSC::JITStubs::cti_op_tear_off_activation): + (JSC::JITStubs::cti_op_tear_off_arguments): + (JSC::JITStubs::cti_op_profile_will_call): + (JSC::JITStubs::cti_op_profile_did_call): + (JSC::JITStubs::cti_op_ret_scopeChain): + (JSC::JITStubs::cti_op_new_array): + (JSC::JITStubs::cti_op_resolve): + (JSC::JITStubs::cti_op_construct_JSConstruct): + (JSC::JITStubs::cti_op_construct_NotJSConstruct): + (JSC::JITStubs::cti_op_get_by_val): + (JSC::JITStubs::cti_op_get_by_val_string): + (JSC::JITStubs::cti_op_get_by_val_byte_array): + (JSC::JITStubs::cti_op_resolve_func): + (JSC::JITStubs::cti_op_sub): + (JSC::JITStubs::cti_op_put_by_val): + (JSC::JITStubs::cti_op_put_by_val_array): + (JSC::JITStubs::cti_op_put_by_val_byte_array): + (JSC::JITStubs::cti_op_lesseq): + (JSC::JITStubs::cti_op_loop_if_true): + (JSC::JITStubs::cti_op_load_varargs): + (JSC::JITStubs::cti_op_negate): + (JSC::JITStubs::cti_op_resolve_base): + (JSC::JITStubs::cti_op_resolve_skip): + (JSC::JITStubs::cti_op_resolve_global): + (JSC::JITStubs::cti_op_div): + (JSC::JITStubs::cti_op_pre_dec): + (JSC::JITStubs::cti_op_jless): + (JSC::JITStubs::cti_op_not): + (JSC::JITStubs::cti_op_jtrue): + (JSC::JITStubs::cti_op_post_inc): + (JSC::JITStubs::cti_op_eq): + (JSC::JITStubs::cti_op_lshift): + (JSC::JITStubs::cti_op_bitand): + (JSC::JITStubs::cti_op_rshift): + (JSC::JITStubs::cti_op_bitnot): + (JSC::JITStubs::cti_op_resolve_with_base): + (JSC::JITStubs::cti_op_new_func_exp): + (JSC::JITStubs::cti_op_mod): + (JSC::JITStubs::cti_op_less): + (JSC::JITStubs::cti_op_neq): + (JSC::JITStubs::cti_op_post_dec): + (JSC::JITStubs::cti_op_urshift): + (JSC::JITStubs::cti_op_bitxor): + (JSC::JITStubs::cti_op_new_regexp): + (JSC::JITStubs::cti_op_bitor): + (JSC::JITStubs::cti_op_call_eval): + (JSC::JITStubs::cti_op_throw): + (JSC::JITStubs::cti_op_get_pnames): + (JSC::JITStubs::cti_op_next_pname): + (JSC::JITStubs::cti_op_push_scope): + (JSC::JITStubs::cti_op_pop_scope): + (JSC::JITStubs::cti_op_typeof): + (JSC::JITStubs::cti_op_is_undefined): + (JSC::JITStubs::cti_op_is_boolean): + (JSC::JITStubs::cti_op_is_number): + (JSC::JITStubs::cti_op_is_string): + (JSC::JITStubs::cti_op_is_object): + (JSC::JITStubs::cti_op_is_function): + (JSC::JITStubs::cti_op_stricteq): + (JSC::JITStubs::cti_op_to_primitive): + (JSC::JITStubs::cti_op_strcat): + (JSC::JITStubs::cti_op_nstricteq): + (JSC::JITStubs::cti_op_to_jsnumber): + (JSC::JITStubs::cti_op_in): + (JSC::JITStubs::cti_op_push_new_scope): + (JSC::JITStubs::cti_op_jmp_scopes): + (JSC::JITStubs::cti_op_put_by_index): + (JSC::JITStubs::cti_op_switch_imm): + (JSC::JITStubs::cti_op_switch_char): + (JSC::JITStubs::cti_op_switch_string): + (JSC::JITStubs::cti_op_del_by_val): + (JSC::JITStubs::cti_op_put_getter): + (JSC::JITStubs::cti_op_put_setter): + (JSC::JITStubs::cti_op_new_error): + (JSC::JITStubs::cti_op_debug): + (JSC::JITStubs::cti_vm_throw): + * jit/JITStubs.h: + (JSC::JITStackFrame::returnAddressSlot): + +2009-05-07 Darin Adler <darin@apple.com> + + Reviewed by Geoff Garen. + + * parser/Lexer.cpp: + (JSC::Lexer::lex): Fix missing braces. This would make us always + take the slower case for string parsing and Visual Studio correctly + noticed unreachable code. + +2009-05-07 Darin Adler <darin@apple.com> + + Reviewed by Sam Weinig. + + Bug 25589: goto instead of state machine in lexer + https://bugs.webkit.org/show_bug.cgi?id=25589 + + SunSpider is 0.8% faster. + + * parser/Lexer.cpp: + (JSC::Lexer::currentCharacter): Added. + (JSC::Lexer::currentOffset): Changed to call currentCharacter for clarity. + (JSC::Lexer::setCode): Removed code to set now-obsolete m_skipLineEnd. + (JSC::Lexer::shiftLineTerminator): Added. Handles line numbers and the + two-character line terminators. + (JSC::Lexer::makeIdentifier): Changed to take characters and length rather + than a vector, since we now make these directly out of the source buffer + when possible. + (JSC::Lexer::lastTokenWasRestrKeyword): Added. + (JSC::isNonASCIIIdentStart): Broke out the non-inline part. + (JSC::isIdentStart): Moved here. + (JSC::isNonASCIIIdentPart): Broke out the non-inline part. + (JSC::isIdentPart): Moved here. + (JSC::singleEscape): Moved here, and removed some unneeded cases. + (JSC::Lexer::record8): Moved here. + (JSC::Lexer::record16): Moved here. + (JSC::Lexer::lex): Rewrote this whole function to use goto and not use + a state machine. Got rid of most of the local variables. Also rolled the + matchPunctuator function in here. + (JSC::Lexer::scanRegExp): Changed to use the new version of isLineTerminator. + Clear m_buffer16 after using it instead of before. + + * parser/Lexer.h: Removed State enum, setDone function, nextLine function, + lookupKeywordFunction, one of the isLineTerminator functions, m_done data member, + m_skipLineEnd data member, and m_state data member. Added shiftLineTerminator + function, currentCharacter function, and changed the arguments to the makeIdentifier + function. Removed one branch from the isLineTerminator function. + + * runtime/StringPrototype.cpp: + (JSC::stringProtoFuncReplace): Streamlined the case where we don't replace anything. + +2009-05-07 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Gavin Barraclough. + + Removed a few more special constants, and replaced them with uses of + the JITStackFrame struct. + + Removed one of the two possible definitions of VoidPtrPair. The Mac + definition was more elegant, but SunSpider doesn't think it's any + faster, and it's net less elegant to have two ways of doing things. + + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompile): + * jit/JITStubs.h: + (JSC::): + +2009-05-07 Darin Adler <darin@apple.com> + + * runtime/ScopeChain.h: + (JSC::ScopeChainNode::~ScopeChainNode): Tweak formatting. + +2009-05-07 Simon Hausmann <simon.hausmann@nokia.com> + + Reviewed by Tor Arne Vestbø. + + Fix the build thread stack base determination build on Symbian, + by moving the code block before PLATFORM(UNIX), which is also + enabled on Symbian builds. + + * runtime/Collector.cpp: + (JSC::currentThreadStackBase): + +2009-05-07 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + Fix crash due to incorrectly using an invalid scopechain + + stringProtoFuncReplace was checking for an exception on a CachedCall + by asking for the cached callframes exception. Unfortunately this + could crash in certain circumstances as CachedCall does not guarantee + a valid callframe following a call. Even more unfortunately the check + was entirely unnecessary as there is only a single exception slot per + global data, so it was already checked via the initial exec->hadException() + check. + + To make bugs like this more obvious, i've added a debug only destructor + to ScopeChainNode that 0's all of its fields. This exposed a crash in + the standard javascriptcore tests. + + * runtime/ScopeChain.h: + (JSC::ScopeChainNode::~ScopeChainNode): + (JSC::ScopeChain::~ScopeChain): + * runtime/StringPrototype.cpp: + (JSC::stringProtoFuncReplace): + +2009-05-07 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Enable op_strcat across += assignments. This patch allows the lhs of a read/modify node + to be included within the concatenation operation, and also modifies the implementation + of the concatenation to attempt to reuse and cat onto the leftmost string, rather than + always allocating a new empty output string to copy into (as was previously the behaviour). + + ~0.5% progression, due to a 3%-3.5% progression on the string tests (particularly validate). + + * parser/Nodes.cpp: + (JSC::BinaryOpNode::emitStrcat): + (JSC::emitReadModifyAssignment): + (JSC::ReadModifyResolveNode::emitBytecode): + (JSC::ReadModifyDotNode::emitBytecode): + (JSC::ReadModifyBracketNode::emitBytecode): + * parser/Nodes.h: + * runtime/Operations.h: + (JSC::concatenateStrings): + * runtime/UString.cpp: + (JSC::UString::reserveCapacity): + * runtime/UString.h: + +2009-05-07 Simon Hausmann <simon.hausmann@nokia.com> + + Reviewed by Oliver Hunt. + + Fix the build on Windows without JIT: interpreter/RegisterFile.h needs + roundUpAllocationSize, which is protected by #if ENABLED(ASSEMBLER). + Moved the #ifdef down and always offer the function. + + * jit/ExecutableAllocator.h: + +2009-05-06 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Gavin "++" Barraclough. + + Added some abstraction around the JIT stub calling convention by creating + a struct to represent the persistent stack frame JIT code shares with + JIT stubs. + + SunSpider reports no change. + + * jit/JIT.h: + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_op_convert_this): + (JSC::JITStubs::cti_op_end): + (JSC::JITStubs::cti_op_add): + (JSC::JITStubs::cti_op_pre_inc): + (JSC::JITStubs::cti_timeout_check): + (JSC::JITStubs::cti_register_file_check): + (JSC::JITStubs::cti_op_loop_if_less): + (JSC::JITStubs::cti_op_loop_if_lesseq): + (JSC::JITStubs::cti_op_new_object): + (JSC::JITStubs::cti_op_put_by_id_generic): + (JSC::JITStubs::cti_op_get_by_id_generic): + (JSC::JITStubs::cti_op_put_by_id): + (JSC::JITStubs::cti_op_put_by_id_second): + (JSC::JITStubs::cti_op_put_by_id_fail): + (JSC::JITStubs::cti_op_get_by_id): + (JSC::JITStubs::cti_op_get_by_id_second): + (JSC::JITStubs::cti_op_get_by_id_self_fail): + (JSC::JITStubs::cti_op_get_by_id_proto_list): + (JSC::JITStubs::cti_op_get_by_id_proto_list_full): + (JSC::JITStubs::cti_op_get_by_id_proto_fail): + (JSC::JITStubs::cti_op_get_by_id_array_fail): + (JSC::JITStubs::cti_op_get_by_id_string_fail): + (JSC::JITStubs::cti_op_instanceof): + (JSC::JITStubs::cti_op_del_by_id): + (JSC::JITStubs::cti_op_mul): + (JSC::JITStubs::cti_op_new_func): + (JSC::JITStubs::cti_op_call_JSFunction): + (JSC::JITStubs::cti_op_call_arityCheck): + (JSC::JITStubs::cti_vm_dontLazyLinkCall): + (JSC::JITStubs::cti_vm_lazyLinkCall): + (JSC::JITStubs::cti_op_push_activation): + (JSC::JITStubs::cti_op_call_NotJSFunction): + (JSC::JITStubs::cti_op_create_arguments): + (JSC::JITStubs::cti_op_create_arguments_no_params): + (JSC::JITStubs::cti_op_tear_off_activation): + (JSC::JITStubs::cti_op_tear_off_arguments): + (JSC::JITStubs::cti_op_profile_will_call): + (JSC::JITStubs::cti_op_profile_did_call): + (JSC::JITStubs::cti_op_ret_scopeChain): + (JSC::JITStubs::cti_op_new_array): + (JSC::JITStubs::cti_op_resolve): + (JSC::JITStubs::cti_op_construct_JSConstruct): + (JSC::JITStubs::cti_op_construct_NotJSConstruct): + (JSC::JITStubs::cti_op_get_by_val): + (JSC::JITStubs::cti_op_get_by_val_string): + (JSC::JITStubs::cti_op_get_by_val_byte_array): + (JSC::JITStubs::cti_op_resolve_func): + (JSC::JITStubs::cti_op_sub): + (JSC::JITStubs::cti_op_put_by_val): + (JSC::JITStubs::cti_op_put_by_val_array): + (JSC::JITStubs::cti_op_put_by_val_byte_array): + (JSC::JITStubs::cti_op_lesseq): + (JSC::JITStubs::cti_op_loop_if_true): + (JSC::JITStubs::cti_op_load_varargs): + (JSC::JITStubs::cti_op_negate): + (JSC::JITStubs::cti_op_resolve_base): + (JSC::JITStubs::cti_op_resolve_skip): + (JSC::JITStubs::cti_op_resolve_global): + (JSC::JITStubs::cti_op_div): + (JSC::JITStubs::cti_op_pre_dec): + (JSC::JITStubs::cti_op_jless): + (JSC::JITStubs::cti_op_not): + (JSC::JITStubs::cti_op_jtrue): + (JSC::JITStubs::cti_op_post_inc): + (JSC::JITStubs::cti_op_eq): + (JSC::JITStubs::cti_op_lshift): + (JSC::JITStubs::cti_op_bitand): + (JSC::JITStubs::cti_op_rshift): + (JSC::JITStubs::cti_op_bitnot): + (JSC::JITStubs::cti_op_resolve_with_base): + (JSC::JITStubs::cti_op_new_func_exp): + (JSC::JITStubs::cti_op_mod): + (JSC::JITStubs::cti_op_less): + (JSC::JITStubs::cti_op_neq): + (JSC::JITStubs::cti_op_post_dec): + (JSC::JITStubs::cti_op_urshift): + (JSC::JITStubs::cti_op_bitxor): + (JSC::JITStubs::cti_op_new_regexp): + (JSC::JITStubs::cti_op_bitor): + (JSC::JITStubs::cti_op_call_eval): + (JSC::JITStubs::cti_op_throw): + (JSC::JITStubs::cti_op_get_pnames): + (JSC::JITStubs::cti_op_next_pname): + (JSC::JITStubs::cti_op_push_scope): + (JSC::JITStubs::cti_op_pop_scope): + (JSC::JITStubs::cti_op_typeof): + (JSC::JITStubs::cti_op_is_undefined): + (JSC::JITStubs::cti_op_is_boolean): + (JSC::JITStubs::cti_op_is_number): + (JSC::JITStubs::cti_op_is_string): + (JSC::JITStubs::cti_op_is_object): + (JSC::JITStubs::cti_op_is_function): + (JSC::JITStubs::cti_op_stricteq): + (JSC::JITStubs::cti_op_to_primitive): + (JSC::JITStubs::cti_op_strcat): + (JSC::JITStubs::cti_op_nstricteq): + (JSC::JITStubs::cti_op_to_jsnumber): + (JSC::JITStubs::cti_op_in): + (JSC::JITStubs::cti_op_push_new_scope): + (JSC::JITStubs::cti_op_jmp_scopes): + (JSC::JITStubs::cti_op_put_by_index): + (JSC::JITStubs::cti_op_switch_imm): + (JSC::JITStubs::cti_op_switch_char): + (JSC::JITStubs::cti_op_switch_string): + (JSC::JITStubs::cti_op_del_by_val): + (JSC::JITStubs::cti_op_put_getter): + (JSC::JITStubs::cti_op_put_setter): + (JSC::JITStubs::cti_op_new_error): + (JSC::JITStubs::cti_op_debug): + (JSC::JITStubs::cti_vm_throw): + * jit/JITStubs.h: + (JSC::): + +2009-05-06 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Maciej Stachowiak & Darin Adler. + + Improve string concatenation (as coded in JS as a sequence of adds). + + Detect patterns corresponding to string concatenation, and change the bytecode + generation to emit a new op_strcat instruction. By handling the full set of + additions within a single function we do not need allocate JSString wrappers + for intermediate results, and we can calculate the size of the output string + prior to allocating storage, in order to prevent reallocation of the buffer. + + 1.5%-2% progression on Sunspider, largely due to a 30% progression on date-format-xparb. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): + Add new opcodes. + * bytecode/Opcode.h: + Add new opcodes. + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitStrcat): + (JSC::BytecodeGenerator::emitToPrimitive): + Add generation of new opcodes. + * bytecompiler/BytecodeGenerator.h: + Add generation of new opcodes. + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): + Add implmentation of new opcodes. + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + Add implmentation of new opcodes. + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_op_to_primitive): + (JSC::JITStubs::cti_op_strcat): + Add implmentation of new opcodes. + * jit/JITStubs.h: + Add implmentation of new opcodes. + * parser/Nodes.cpp: + (JSC::BinaryOpNode::emitStrcat): + (JSC::BinaryOpNode::emitBytecode): + (JSC::ReadModifyResolveNode::emitBytecode): + Add generation of new opcodes. + * parser/Nodes.h: + (JSC::ExpressionNode::): + (JSC::AddNode::): + Add methods to allow identification of add nodes. + * parser/ResultType.h: + (JSC::ResultType::definitelyIsString): + (JSC::ResultType::forAdd): + Fix error in detection of adds that will produce string results. + * runtime/Operations.h: + (JSC::concatenateStrings): + Add implmentation of new opcodes. + * runtime/UString.cpp: + (JSC::UString::appendNumeric): + Add methods to append numbers to an existing string. + * runtime/UString.h: + (JSC::UString::Rep::createEmptyBuffer): + (JSC::UString::BaseString::BaseString): + Add support for creating an empty string with a non-zero capacity available in the BaseString. + +2009-05-06 Darin Adler <darin@apple.com> + + Reviewed by Sam Weinig. + + Made RefCounted::m_refCount private. + + * runtime/Structure.h: Removed addressOfCount. + * wtf/RefCounted.h: Made m_refCount private. + Added addressOfCount. + +2009-05-06 Darin Adler <darin@apple.com> + + Fixed assertion seen a lot! + + * parser/Nodes.cpp: + (JSC::FunctionBodyNode::~FunctionBodyNode): Removed now-bogus assertion. + +2009-05-06 Darin Adler <darin@apple.com> + + Working with Sam Weinig. + + Redo parse tree constructor optimization without breaking the Windows + build the way I did yesterday. The previous try broke the build by adding + an include of Lexer.h and all its dependencies that had to work outside + the JavaScriptCore project. + + * GNUmakefile.am: Added NodeConstructors.h. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Ditto. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreCommon.vsprops: + Removed byteocde directory -- we no longer are trying to include Lexer.h + outside JavaScriptCore. + + * JavaScriptCore.xcodeproj/project.pbxproj: Change SegmentedVector.h + and Lexer.h back to internal files. Added NodeConstructors.h. + + * parser/Grammar.y: Added include of NodeConstructors.h. + Changed use of ConstDeclNode to use public functions. + + * parser/NodeConstructors.h: Copied from parser/Nodes.h. + Just contains the inlined constructors now. + + * parser/Nodes.cpp: Added include of NodeConstructors.h. + Moved node constructors into the header. + (JSC::FunctionBodyNode::FunctionBodyNode): Removed m_refCount + initialization. + + * parser/Nodes.h: Removed all the constructor definitions, and also + removed the JSC_FAST_CALL from them since these are all inlined, so the + calling convention is irrelevant. Made more things private. Used a data + member for operator opcodes instead of a virtual function. Removed the + special FunctionBodyNode::ref/deref functions since the default functions + are now just as fast. + + * runtime/FunctionConstructor.cpp: + (JSC::extractFunctionBody): Fixed types here so we don't typecast until + after we do type checking. + +2009-05-06 Simon Hausmann <simon.hausmann@nokia.com> + + Reviewed by Ariya Hidayat. + + Fix the Qt build on Windows. + + * JavaScriptCore.pri: Define BUILDING_JavaScriptCore/WTF to get the meaning + of the JS_EXPORTDATA macros correct + +2009-05-06 Simon Hausmann <simon.hausmann@nokia.com> + + Reviewed by Ariya Hidayat. + + Enable the JIT for the Qt build on Windows. + + * JavaScriptCore.pri: + +2009-05-06 Simon Hausmann <simon.hausmann@nokia.com> + + Reviewed by Tor Arne Vestbø. + + Tweak JavaScriptCore.pri for being able to override the generated sources dir for the + generated_files target. + + * JavaScriptCore.pri: + +2009-05-06 Tor Arne Vestbø <tor.arne.vestbo@nokia.com> + + Reviewed by Simon Hausmann. + + Build QtWebKit as a framework on Mac + + This implies both debug and release build by default, unless + one of the --debug or --release config options are passed to + the build-webkit script. + + Frameworks can be disabled by passing CONFIG+=webkit_no_framework + to the build-webkit script. + + To be able to build both debug and release targets in parallel + we have to use separate output directories for the generated + sources, which is not optimal, but required to avoid race conditions. + + An optimization would be to only require this spit-up on Mac. + + * JavaScriptCore.pri: + * JavaScriptCore.pro: + * jsc.pro: + +2009-05-06 Tor Arne Vestbø <tor.arne.vestbo@nokia.com> + + Reviewed by Simon Hausmann. + + [Qt] Use $$GENERATED_SOURCES_DIR as output when running bison + + A couple of the generators left the bison output file in the source + tree, and then moved it into $$GENERATED_SOURCES_DIR, which did not + work well when building release and debug configurations in parallel. + + * JavaScriptCore.pri: + +2009-05-05 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Maciej Stachowiak. + + Simplified a bit of codegen. + + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + +2009-05-05 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Cameron Zwarich. + + Moved all the JIT stub related code into one place. + + * jit/JIT.cpp: + * jit/JIT.h: + * jit/JITCode.h: + * jit/JITStubs.cpp: + (JSC::): + * jit/JITStubs.h: + +2009-05-05 Sam Weinig <sam@webkit.org> + + Try to fix Windows build. + + Move Node constructor to the .cpp file. + + * parser/Nodes.cpp: + * parser/Nodes.h: + +2009-05-05 Darin Adler <darin@apple.com> + + Try to fix Windows build. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + + Try to fix Mac build. + + * JavaScriptCore.xcodeproj/project.pbxproj: Made SegmentedVector.h private. + +2009-05-05 Darin Adler <darin@apple.com> + + Try to fix Mac build. + + * JavaScriptCore.xcodeproj/project.pbxproj: Made Lexer.h private. + +2009-05-05 Darin Adler <darin@apple.com> + + Reviewed by Sam Weinig. + + Bug 25569: make ParserRefCounted use conventional reference counting + https://bugs.webkit.org/show_bug.cgi?id=25569 + + SunSpider speedup of about 1.6%. + + * JavaScriptCore.exp: Updated. + + * parser/Nodes.cpp: + (JSC::NodeReleaser::releaseAllNodes): ALWAYS_INLINE. + (JSC::NodeReleaser::adopt): Ditto. + (JSC::ParserRefCounted::ParserRefCounted): Removed most of the code. + Add the object to a Vector<RefPtr> that gets cleared after parsing. + (JSC::ParserRefCounted::~ParserRefCounted): Removed most of the code. + + * parser/Nodes.h: Made ParserRefCounted inherit from RefCounted and + made inline versions of the constructor and destructor. Made the + Node constructor inline. + + * parser/Parser.cpp: + (JSC::Parser::parse): Call globalData->parserObjects.shrink(0) after + parsing, where it used to call ParserRefCounted::deleteNewObjects. + + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): Eliminated code to manage the + newParserObjects and parserObjectExtraRefCounts. + (JSC::JSGlobalData::~JSGlobalData): Ditto. + + * runtime/JSGlobalData.h: Replaced the HashSet and HashCountedSet + with a Vector. + + * wtf/PassRefPtr.h: + (WTF::PassRefPtr::~PassRefPtr): The most common thing to do with a + PassRefPtr in hot code is to pass it and then destroy it once it's + set to zero. Help the optimizer by telling it that's true. + +2009-05-05 Xan Lopez <xlopez@igalia.com> and Gustavo Noronha Silva <gustavo.noronha@collabora.co.uk> + + Reviewed by Oliver Hunt. + + Disable the NativeFunctionWrapper for all non-Mac ports for now, + as it is also crashing on Linux/x86. + + * runtime/NativeFunctionWrapper.h: + +2009-05-05 Steve Falkenburg <sfalken@apple.com> + + Fix build. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + +2009-05-05 Oliver Hunt <oliver@apple.com> + + Reviewed by Maciej Stachowiak. + + Expose toThisObject for the DOM Window + + * JavaScriptCore.exp: + +2009-05-05 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Make windows go again until i work out the + accursed calling convention). + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * jit/JIT.cpp: + * runtime/NativeFunctionWrapper.h: + +2009-05-05 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Fix windows debug builds). + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + +2009-05-05 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Hopefully the last fix). + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + +2009-05-05 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Fix the build fix caused by a different build fix). + + * parser/Nodes.cpp: + * parser/Nodes.h: + +2009-05-05 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (No idea how my changes could have broken these). + + * runtime/DatePrototype.cpp: + * runtime/RegExpObject.cpp: + +2009-05-05 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Why should i expect msvc to list all the errors in a file?). + + * parser/Nodes.cpp: + +2009-05-05 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Fix warning, and another missing include). + + * jit/JIT.cpp: + * parser/Nodes.h: + +2009-05-05 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (More build fixes). + + * runtime/ErrorPrototype.cpp: + * runtime/JSGlobalObject.cpp: + * runtime/NumberPrototype.cpp: + * runtime/ObjectPrototype.cpp: + * runtime/StringConstructor.cpp: + +2009-05-05 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Will the fixes never end?). + + * runtime/FunctionPrototype.h: + * runtime/Lookup.cpp: + +2009-05-05 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (More build fixes). + + * jit/JIT.cpp: + +2009-05-05 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (More build fixing). + + * runtime/CallData.h: + +2009-05-05 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Build fix). + + * runtime/ArrayConstructor.cpp: + * runtime/BooleanPrototype.cpp: + * runtime/DateConstructor.cpp: + * runtime/Error.cpp: + * runtime/ObjectConstructor.cpp: + * runtime/RegExpPrototype.cpp: + +2009-05-05 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Buildfix). + + Add missing file + + * runtime/NativeFunctionWrapper.h: Copied from JavaScriptCore/jit/ExecutableAllocator.cpp. + +2009-05-05 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + Bug 25559: Improve native function call performance + <https://bugs.webkit.org/show_bug.cgi?id=25559> + + In order to cache calls to native functions we now make the standard + prototype functions use a small assembly thunk that converts the JS + calling convention into the native calling convention. As this is + only beneficial in the JIT we use the NativeFunctionWrapper typedef + to alternate between PrototypeFunction and JSFunction to keep the + code sane. This change from PrototypeFunction to NativeFunctionWrapper + is the bulk of this patch. + + * JavaScriptCore.exp: + * JavaScriptCore.xcodeproj/project.pbxproj: + * assembler/MacroAssemblerX86Common.h: + (JSC::MacroAssemblerX86Common::call): + * assembler/MacroAssemblerX86_64.h: + (JSC::MacroAssemblerX86_64::addPtr): + * assembler/X86Assembler.h: + (JSC::X86Assembler::leaq_mr): + (JSC::X86Assembler::call_m): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::execute): + (JSC::Interpreter::prepareForRepeatCall): + * jit/JIT.cpp: + (JSC::JIT::privateCompileCTIMachineTrampolines): + * jit/JIT.h: + (JSC::JIT::compileCTIMachineTrampolines): + * jit/JITCall.cpp: + (JSC::JIT::linkCall): + (JSC::JIT::compileOpCallInitializeCallFrame): + (JSC::JIT::compileOpCall): + * jit/JITCode.h: + (JSC::JITCode::operator bool): + * jit/JITInlineMethods.h: + (JSC::JIT::emitGetFromCallFrameHeader): + (JSC::JIT::emitGetFromCallFrameHeader32): + * jit/JITStubs.cpp: + (JSC::JITStubs::JITStubs): + (JSC::JITStubs::cti_op_call_JSFunction): + (JSC::JITStubs::cti_vm_dontLazyLinkCall): + (JSC::JITStubs::cti_vm_lazyLinkCall): + (JSC::JITStubs::cti_op_construct_JSConstruct): + * jit/JITStubs.h: + (JSC::JITStubs::ctiNativeCallThunk): + * jsc.cpp: + (GlobalObject::GlobalObject): + * parser/Nodes.cpp: + (JSC::FunctionBodyNode::FunctionBodyNode): + (JSC::FunctionBodyNode::createNativeThunk): + (JSC::FunctionBodyNode::generateJITCode): + * parser/Nodes.h: + (JSC::FunctionBodyNode::): + (JSC::FunctionBodyNode::generatedJITCode): + (JSC::FunctionBodyNode::jitCode): + * profiler/Profiler.cpp: + (JSC::Profiler::createCallIdentifier): + * runtime/ArgList.h: + * runtime/ArrayPrototype.cpp: + (JSC::isNumericCompareFunction): + * runtime/BooleanPrototype.cpp: + (JSC::BooleanPrototype::BooleanPrototype): + * runtime/DateConstructor.cpp: + (JSC::DateConstructor::DateConstructor): + * runtime/ErrorPrototype.cpp: + (JSC::ErrorPrototype::ErrorPrototype): + * runtime/FunctionPrototype.cpp: + (JSC::FunctionPrototype::addFunctionProperties): + (JSC::functionProtoFuncToString): + * runtime/FunctionPrototype.h: + * runtime/JSFunction.cpp: + (JSC::JSFunction::JSFunction): + (JSC::JSFunction::~JSFunction): + (JSC::JSFunction::mark): + (JSC::JSFunction::getCallData): + (JSC::JSFunction::call): + (JSC::JSFunction::argumentsGetter): + (JSC::JSFunction::callerGetter): + (JSC::JSFunction::lengthGetter): + (JSC::JSFunction::getOwnPropertySlot): + (JSC::JSFunction::put): + (JSC::JSFunction::deleteProperty): + (JSC::JSFunction::getConstructData): + (JSC::JSFunction::construct): + * runtime/JSFunction.h: + (JSC::JSFunction::JSFunction): + (JSC::JSFunction::setScope): + (JSC::JSFunction::scope): + (JSC::JSFunction::isHostFunction): + (JSC::JSFunction::scopeChain): + (JSC::JSFunction::clearScopeChain): + (JSC::JSFunction::setScopeChain): + (JSC::JSFunction::nativeFunction): + (JSC::JSFunction::setNativeFunction): + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::~JSGlobalData): + (JSC::JSGlobalData::createNativeThunk): + * runtime/JSGlobalData.h: + (JSC::JSGlobalData::nativeFunctionThunk): + * runtime/JSGlobalObject.cpp: + (JSC::JSGlobalObject::reset): + * runtime/JSGlobalObject.h: + * runtime/Lookup.cpp: + (JSC::setUpStaticFunctionSlot): + * runtime/Lookup.h: + * runtime/NumberPrototype.cpp: + (JSC::NumberPrototype::NumberPrototype): + * runtime/ObjectPrototype.cpp: + (JSC::ObjectPrototype::ObjectPrototype): + * runtime/RegExpPrototype.cpp: + (JSC::RegExpPrototype::RegExpPrototype): + * runtime/StringConstructor.cpp: + (JSC::StringConstructor::StringConstructor): + +2009-05-05 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + For convenience, let the sampling flags tool clear multiple flags at once. + + * jsc.cpp: + (GlobalObject::GlobalObject): + (functionSetSamplingFlags): + (functionClearSamplingFlags): + +2009-05-04 Maciej Stachowiak <mjs@apple.com> + + Rubber stamped by Gavin. + + - inline Vector::resize for a ~1.5% speedup on string-tagcloud + + * wtf/Vector.h: + (WTF::Vector::resize): Inline + +2009-05-03 Steve Falkenburg <sfalken@apple.com> + + Windows build fix. + + * JavaScriptCore.vcproj/JavaScriptCoreSubmit.sln: + +2009-05-03 Mark Rowe <mrowe@apple.com> + + Fix the 64-bit build. + + * API/APICast.h: + (toJS): + (toRef): + * runtime/JSNumberCell.cpp: + (JSC::jsAPIMangledNumber): + * runtime/JSNumberCell.h: + +2009-05-02 Sam Weinig <sam@webkit.org> + + Roll JSC API number marshaling back in one last time (I hope). + +2009-05-03 Sam Weinig <sam@webkit.org> + + Roll JSC API number marshaling back out. It still breaks windows. + +2009-05-03 Sam Weinig <sam@webkit.org> + + Roll JSC API number marshaling back in. + +2009-05-02 Darin Adler <darin@apple.com> + + Reviewed by Maciej Stachowiak. + + Bug 25519: streamline lexer by handling BOMs differently + https://bugs.webkit.org/show_bug.cgi?id=25519 + + Roughly 1% faster SunSpider. + + * parser/Grammar.y: Tweak formatting a bit. + + * parser/Lexer.cpp: + (JSC::Lexer::Lexer): Remove unnnecessary initialization of data members + that are set up by setCode. + (JSC::Lexer::currentOffset): Added. Used where the old code would look at + m_currentOffset. + (JSC::Lexer::shift1): Replaces the old shift function. No longer does anything + to handle BOM characters. + (JSC::Lexer::shift2): Ditto. + (JSC::Lexer::shift3): Ditto. + (JSC::Lexer::shift4): Ditto. + (JSC::Lexer::setCode): Updated for name change from yylineno to m_line. + Removed now-unused m_eatNextIdentifier, m_stackToken, and m_restrKeyword. + Replaced m_skipLF and m_skipCR with m_skipLineEnd. Replaced the old + m_length with m_codeEnd and m_currentOffset with m_codeStart. Added code + to scan for a BOM character and call copyCodeWithoutBOMs() if we find any. + (JSC::Lexer::copyCodeWithoutBOMs): Added. + (JSC::Lexer::nextLine): Updated for name change from yylineno to m_line. + (JSC::Lexer::makeIdentifier): Moved up higher in the file. + (JSC::Lexer::matchPunctuator): Moved up higher in the file and changed to + use a switch statement instead of just if statements. + (JSC::Lexer::isLineTerminator): Moved up higher in the file and changed to + have fewer branches. + (JSC::Lexer::lastTokenWasRestrKeyword): Added. This replaces the old + m_restrKeyword boolean. + (JSC::Lexer::isIdentStart): Moved up higher in the file. Changed to use + fewer branches in the ASCII but not identifier case. + (JSC::Lexer::isIdentPart): Ditto. + (JSC::Lexer::singleEscape): Moved up higher in the file. + (JSC::Lexer::convertOctal): Moved up higher in the file. + (JSC::Lexer::convertHex): Moved up higher in the file. Changed to use + toASCIIHexValue instead of rolling our own here. + (JSC::Lexer::convertUnicode): Ditto. + (JSC::Lexer::record8): Moved up higher in the file. + (JSC::Lexer::record16): Moved up higher in the file. + (JSC::Lexer::lex): Changed type of stringType to int. Replaced m_skipLF + and m_skipCR with m_skipLineEnd, which requires fewer branches in the + main lexer loop. Use currentOffset instead of m_currentOffset. Removed + unneeded m_stackToken. Use isASCIIDigit instead of isDecimalDigit. + Split out the two cases for InIdentifierOrKeyword and InIdentifier. + Added special case tight loops for identifiers and other simple states. + Removed a branch from the code that sets m_atLineStart to false using goto. + Streamlined the number-handling code so we don't check for the same types + twice for non-numeric cases and don't add a null to m_buffer8 when it's + not being used. Removed m_eatNextIdentifier, which wasn't working anyway, + and m_restrKeyword, which is redundant with m_lastToken. Set the + m_delimited flag without using a branch. + (JSC::Lexer::scanRegExp): Tweaked style a bit. + (JSC::Lexer::clear): Clear m_codeWithoutBOMs so we don't use memory after + parsing. Clear out UString objects in the more conventional way. + (JSC::Lexer::sourceCode): Made this no-longer inline since it has more + work to do in the case where we stripped BOMs. + + * parser/Lexer.h: Renamed yylineno to m_lineNumber. Removed convertHex + function, which is the same as toASCIIHexValue. Removed isHexDigit + function, which is the same as isASCIIHedDigit. Replaced shift with four + separate shift functions. Removed isWhiteSpace function that passes + m_current, instead just passing m_current explicitly. Removed isOctalDigit, + which is the same as isASCIIOctalDigit. Eliminated unused arguments from + matchPunctuator. Added copyCoodeWithoutBOMs and currentOffset. Moved the + makeIdentifier function out of the header. Added lastTokenWasRestrKeyword + function. Added new constants for m_skipLineEnd. Removed unused yycolumn, + m_restrKeyword, m_skipLF, m_skipCR, m_eatNextIdentifier, m_stackToken, + m_position, m_length, m_currentOffset, m_nextOffset1, m_nextOffset2, + m_nextOffset3. Added m_skipLineEnd, m_codeStart, m_codeEnd, and + m_codeWithoutBOMs. + + * parser/SourceProvider.h: Added hasBOMs function. In the future this can + be used to tell the lexer about strings known not to have BOMs. + + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::globalFuncUnescape): Changed to use isASCIIHexDigit. + + * wtf/ASCIICType.h: Added using statements to match the design of the + other WTF headers. + +2009-05-02 Ada Chan <adachan@apple.com> + + Fix windows build (when doing a clean build) + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + +2009-05-02 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Simplified null-ish JSValues. + + Replaced calls to noValue() with calls to JSValue() (which is what + noValue() returned). Removed noValue(). + + Replaced almost all uses of jsImpossibleValue() with uses of JSValue(). + Its one remaining use is for construction of hash table deleted values. + For that specific task, I made a new, private constructor with a special + tag. Removed jsImpossibleValue(). + + Removed "JSValue()" initialiazers, since default construction happens... + by default. + + * API/JSCallbackObjectFunctions.h: + (JSC::::call): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitLoad): + * bytecompiler/BytecodeGenerator.h: + * debugger/DebuggerCallFrame.cpp: + (JSC::DebuggerCallFrame::evaluate): + * debugger/DebuggerCallFrame.h: + (JSC::DebuggerCallFrame::DebuggerCallFrame): + * interpreter/CallFrame.h: + (JSC::ExecState::clearException): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): + (JSC::Interpreter::retrieveLastCaller): + * interpreter/Register.h: + (JSC::Register::Register): + * jit/JITCall.cpp: + (JSC::JIT::unlinkCall): + (JSC::JIT::compileOpCallInitializeCallFrame): + (JSC::JIT::compileOpCall): + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_op_call_eval): + (JSC::JITStubs::cti_vm_throw): + * profiler/Profiler.cpp: + (JSC::Profiler::willExecute): + (JSC::Profiler::didExecute): + * runtime/ArrayPrototype.cpp: + (JSC::getProperty): + * runtime/Completion.cpp: + (JSC::evaluate): + * runtime/Completion.h: + (JSC::Completion::Completion): + * runtime/GetterSetter.cpp: + (JSC::GetterSetter::getPrimitiveNumber): + * runtime/JSArray.cpp: + (JSC::JSArray::putSlowCase): + (JSC::JSArray::deleteProperty): + (JSC::JSArray::increaseVectorLength): + (JSC::JSArray::setLength): + (JSC::JSArray::pop): + (JSC::JSArray::sort): + (JSC::JSArray::compactForSorting): + * runtime/JSCell.cpp: + (JSC::JSCell::getJSNumber): + * runtime/JSCell.h: + (JSC::JSValue::getJSNumber): + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + * runtime/JSImmediate.h: + (JSC::JSImmediate::fromNumberOutsideIntegerRange): + (JSC::JSImmediate::from): + * runtime/JSNumberCell.cpp: + (JSC::jsNumberCell): + * runtime/JSObject.cpp: + (JSC::callDefaultValueFunction): + * runtime/JSObject.h: + (JSC::JSObject::getDirect): + * runtime/JSPropertyNameIterator.cpp: + (JSC::JSPropertyNameIterator::toPrimitive): + * runtime/JSPropertyNameIterator.h: + (JSC::JSPropertyNameIterator::next): + * runtime/JSValue.h: + (JSC::JSValue::): + (JSC::JSValueHashTraits::constructDeletedValue): + (JSC::JSValueHashTraits::isDeletedValue): + (JSC::JSValue::JSValue): + * runtime/JSWrapperObject.h: + (JSC::JSWrapperObject::JSWrapperObject): + * runtime/Operations.h: + (JSC::resolveBase): + * runtime/PropertySlot.h: + (JSC::PropertySlot::clearBase): + (JSC::PropertySlot::clearValue): + +2009-05-02 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Cameron Zwarich. + + - speed up the lexer in various ways + + ~2% command-line SunSpider speedup + + * parser/Lexer.cpp: + (JSC::Lexer::setCode): Moved below shift() so it can inline. + (JSC::Lexer::scanRegExp): Use resize(0) instead of clear() on Vectors, since the intent + here is not to free the underlying buffer. + (JSC::Lexer::lex): ditto; also, change the loop logic a bit for the main lexing loop + to avoid branching on !m_done twice per iteration. Now we only check it once. + (JSC::Lexer::shift): Make this ALWAYS_INLINE and tag an unusual branch as UNLIKELY + * parser/Lexer.h: + (JSC::Lexer::makeIdentifier): force to be ALWAYS_INLINE + * wtf/Vector.h: + (WTF::::append): force to be ALWAYS_INLINE (may have helped in ways other than parsing but it wasn't + getting inlined in a hot code path in the lexer) + +2009-05-01 Steve Falkenburg <sfalken@apple.com> + + Windows build fix. + + * JavaScriptCore.vcproj/JavaScriptCore.make: + +2009-05-01 Sam Weinig <sam@webkit.org> + + Fix 64bit build. + + * runtime/JSNumberCell.h: + (JSC::JSValue::JSValue): + * runtime/JSValue.h: + (JSC::jsNumber): + +2009-05-01 Sam Weinig <sam@webkit.org> + + Roll out JavaScriptCore API number marshaling. + + * API/APICast.h: + (toJS): + (toRef): + * API/JSBase.cpp: + (JSEvaluateScript): + (JSCheckScriptSyntax): + * API/JSCallbackConstructor.cpp: + (JSC::constructJSCallback): + * API/JSCallbackFunction.cpp: + (JSC::JSCallbackFunction::call): + * API/JSCallbackObjectFunctions.h: + (JSC::::getOwnPropertySlot): + (JSC::::put): + (JSC::::deleteProperty): + (JSC::::construct): + (JSC::::hasInstance): + (JSC::::call): + (JSC::::toNumber): + (JSC::::toString): + (JSC::::staticValueGetter): + (JSC::::callbackGetter): + * API/JSObjectRef.cpp: + (JSObjectMakeFunction): + (JSObjectMakeArray): + (JSObjectMakeDate): + (JSObjectMakeError): + (JSObjectMakeRegExp): + (JSObjectGetPrototype): + (JSObjectSetPrototype): + (JSObjectGetProperty): + (JSObjectSetProperty): + (JSObjectGetPropertyAtIndex): + (JSObjectSetPropertyAtIndex): + (JSObjectDeleteProperty): + (JSObjectCallAsFunction): + (JSObjectCallAsConstructor): + * API/JSValueRef.cpp: + (JSValueGetType): + (JSValueIsUndefined): + (JSValueIsNull): + (JSValueIsBoolean): + (JSValueIsNumber): + (JSValueIsString): + (JSValueIsObject): + (JSValueIsObjectOfClass): + (JSValueIsEqual): + (JSValueIsStrictEqual): + (JSValueIsInstanceOfConstructor): + (JSValueMakeUndefined): + (JSValueMakeNull): + (JSValueMakeBoolean): + (JSValueMakeNumber): + (JSValueMakeString): + (JSValueToBoolean): + (JSValueToNumber): + (JSValueToStringCopy): + (JSValueToObject): + (JSValueProtect): + (JSValueUnprotect): + * JavaScriptCore.exp: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + * runtime/JSNumberCell.cpp: + * runtime/JSNumberCell.h: + * runtime/JSValue.h: + +2009-05-01 Sam Weinig <sam@webkit.org> + + Fix windows build. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + +2009-05-01 Sam Weinig <sam@webkit.org> + + Fix the build. + + * JavaScriptCore.exp: + +2009-05-01 Sam Weinig <sam@webkit.org> + + Reviewed by Geoffrey "Too Far!" Garen. + + Move JS number construction into JSValue. + + * runtime/JSImmediate.h: + * runtime/JSNumberCell.h: + (JSC::JSValue::JSValue): + * runtime/JSValue.h: + (JSC::jsNumber): + +2009-05-01 Sam Weinig <sam@webkit.org> + + Reviewed by Geoff "The Minneapolis" Garen. + + Add mechanism to vend heap allocated JS numbers to JavaScriptCore API clients with a + representation that is independent of the number representation in the VM. + - Numbers leaving the interpreter are converted to a tagged JSNumberCell. + - The numbers coming into the interpreter (asserted to be the tagged JSNumberCell) are + converted back to the VM's internal number representation. + + * API/APICast.h: + (toJS): + (toRef): + * API/JSBase.cpp: + (JSEvaluateScript): + (JSCheckScriptSyntax): + * API/JSCallbackConstructor.cpp: + (JSC::constructJSCallback): + * API/JSCallbackFunction.cpp: + (JSC::JSCallbackFunction::call): + * API/JSCallbackObjectFunctions.h: + (JSC::::getOwnPropertySlot): + (JSC::::put): + (JSC::::deleteProperty): + (JSC::::construct): + (JSC::::hasInstance): + (JSC::::call): + (JSC::::toNumber): + (JSC::::toString): + (JSC::::staticValueGetter): + (JSC::::callbackGetter): + * API/JSObjectRef.cpp: + (JSObjectMakeFunction): + (JSObjectMakeArray): + (JSObjectMakeDate): + (JSObjectMakeError): + (JSObjectMakeRegExp): + (JSObjectGetPrototype): + (JSObjectSetPrototype): + (JSObjectGetProperty): + (JSObjectSetProperty): + (JSObjectGetPropertyAtIndex): + (JSObjectSetPropertyAtIndex): + (JSObjectDeleteProperty): + (JSObjectCallAsFunction): + (JSObjectCallAsConstructor): + * API/JSValueRef.cpp: + (JSValueGetType): + (JSValueIsUndefined): + (JSValueIsNull): + (JSValueIsBoolean): + (JSValueIsNumber): + (JSValueIsString): + (JSValueIsObject): + (JSValueIsObjectOfClass): + (JSValueIsEqual): + (JSValueIsStrictEqual): + (JSValueIsInstanceOfConstructor): + (JSValueMakeUndefined): + (JSValueMakeNull): + (JSValueMakeBoolean): + (JSValueMakeNumber): + (JSValueMakeString): + (JSValueToBoolean): + (JSValueToNumber): + (JSValueToStringCopy): + (JSValueToObject): + (JSValueProtect): + (JSValueUnprotect): + * runtime/JSNumberCell.cpp: + (JSC::jsAPIMangledNumber): + * runtime/JSNumberCell.h: + (JSC::JSNumberCell::isAPIMangledNumber): + (JSC::JSNumberCell::): + (JSC::JSNumberCell::JSNumberCell): + (JSC::JSValue::isAPIMangledNumber): + * runtime/JSValue.h: + +2009-05-01 Geoffrey Garen <ggaren@apple.com> + + Windows build fix take 6. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + +2009-05-01 Geoffrey Garen <ggaren@apple.com> + + Windows build fix take 5. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + +2009-05-01 Geoffrey Garen <ggaren@apple.com> + + Windows build fix take 4. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + +2009-05-01 Geoffrey Garen <ggaren@apple.com> + + Windows build fix take 3. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + +2009-05-01 Geoffrey Garen <ggaren@apple.com> + + Windows build fix take 2. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + +2009-05-01 Geoffrey Garen <ggaren@apple.com> + + Windows build fix take 1. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + +2009-05-01 Geoffrey Garen <ggaren@apple.com> + + Rubber Stamped by Sam Weinig. + + Renamed JSValuePtr => JSValue. + + * API/APICast.h: + (toJS): + (toRef): + * API/JSCallbackConstructor.h: + (JSC::JSCallbackConstructor::createStructure): + * API/JSCallbackFunction.cpp: + (JSC::JSCallbackFunction::call): + * API/JSCallbackFunction.h: + (JSC::JSCallbackFunction::createStructure): + * API/JSCallbackObject.h: + (JSC::JSCallbackObject::createStructure): + * API/JSCallbackObjectFunctions.h: + (JSC::::asCallbackObject): + (JSC::::put): + (JSC::::hasInstance): + (JSC::::call): + (JSC::::staticValueGetter): + (JSC::::staticFunctionGetter): + (JSC::::callbackGetter): + * API/JSContextRef.cpp: + * API/JSObjectRef.cpp: + (JSObjectMakeConstructor): + (JSObjectSetPrototype): + (JSObjectGetProperty): + (JSObjectSetProperty): + (JSObjectGetPropertyAtIndex): + (JSObjectSetPropertyAtIndex): + * API/JSValueRef.cpp: + (JSValueGetType): + (JSValueIsUndefined): + (JSValueIsNull): + (JSValueIsBoolean): + (JSValueIsNumber): + (JSValueIsString): + (JSValueIsObject): + (JSValueIsObjectOfClass): + (JSValueIsEqual): + (JSValueIsStrictEqual): + (JSValueIsInstanceOfConstructor): + (JSValueToBoolean): + (JSValueToNumber): + (JSValueToStringCopy): + (JSValueToObject): + (JSValueProtect): + (JSValueUnprotect): + * JavaScriptCore.exp: + * bytecode/CodeBlock.cpp: + (JSC::valueToSourceString): + (JSC::constantName): + (JSC::CodeBlock::dump): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::getConstant): + (JSC::CodeBlock::addUnexpectedConstant): + (JSC::CodeBlock::unexpectedConstant): + * bytecode/EvalCodeCache.h: + (JSC::EvalCodeCache::get): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::addConstant): + (JSC::BytecodeGenerator::addUnexpectedConstant): + (JSC::BytecodeGenerator::emitLoad): + (JSC::BytecodeGenerator::emitGetScopedVar): + (JSC::BytecodeGenerator::emitPutScopedVar): + (JSC::BytecodeGenerator::emitNewError): + (JSC::keyForImmediateSwitch): + * bytecompiler/BytecodeGenerator.h: + (JSC::BytecodeGenerator::JSValueHashTraits::constructDeletedValue): + (JSC::BytecodeGenerator::JSValueHashTraits::isDeletedValue): + * debugger/Debugger.cpp: + (JSC::evaluateInGlobalCallFrame): + * debugger/Debugger.h: + * debugger/DebuggerActivation.cpp: + (JSC::DebuggerActivation::put): + (JSC::DebuggerActivation::putWithAttributes): + (JSC::DebuggerActivation::lookupGetter): + (JSC::DebuggerActivation::lookupSetter): + * debugger/DebuggerActivation.h: + (JSC::DebuggerActivation::createStructure): + * debugger/DebuggerCallFrame.cpp: + (JSC::DebuggerCallFrame::evaluate): + * debugger/DebuggerCallFrame.h: + (JSC::DebuggerCallFrame::DebuggerCallFrame): + (JSC::DebuggerCallFrame::exception): + * interpreter/CachedCall.h: + (JSC::CachedCall::CachedCall): + (JSC::CachedCall::call): + (JSC::CachedCall::setThis): + (JSC::CachedCall::setArgument): + * interpreter/CallFrame.cpp: + (JSC::CallFrame::thisValue): + (JSC::CallFrame::dumpCaller): + * interpreter/CallFrame.h: + (JSC::ExecState::setException): + (JSC::ExecState::exception): + (JSC::ExecState::exceptionSlot): + * interpreter/CallFrameClosure.h: + (JSC::CallFrameClosure::setArgument): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::resolve): + (JSC::Interpreter::resolveSkip): + (JSC::Interpreter::resolveGlobal): + (JSC::Interpreter::resolveBase): + (JSC::Interpreter::resolveBaseAndProperty): + (JSC::Interpreter::resolveBaseAndFunc): + (JSC::isNotObject): + (JSC::Interpreter::callEval): + (JSC::Interpreter::unwindCallFrame): + (JSC::Interpreter::throwException): + (JSC::Interpreter::execute): + (JSC::Interpreter::prepareForRepeatCall): + (JSC::Interpreter::createExceptionScope): + (JSC::Interpreter::tryCachePutByID): + (JSC::Interpreter::tryCacheGetByID): + (JSC::Interpreter::privateExecute): + (JSC::Interpreter::retrieveArguments): + (JSC::Interpreter::retrieveCaller): + (JSC::Interpreter::retrieveLastCaller): + * interpreter/Interpreter.h: + * interpreter/Register.h: + (JSC::Register::): + (JSC::Register::Register): + (JSC::Register::jsValue): + * jit/JIT.cpp: + (JSC::): + (JSC::JIT::privateCompileMainPass): + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::compileFastArith_op_mod): + * jit/JITCall.cpp: + (JSC::JIT::unlinkCall): + (JSC::JIT::compileOpCallInitializeCallFrame): + (JSC::JIT::compileOpCall): + * jit/JITCode.h: + (JSC::): + (JSC::JITCode::execute): + * jit/JITInlineMethods.h: + (JSC::JIT::emitGetVirtualRegister): + (JSC::JIT::getConstantOperand): + (JSC::JIT::emitPutJITStubArgFromVirtualRegister): + (JSC::JIT::emitInitRegister): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::patchGetByIdSelf): + (JSC::JIT::patchPutByIdReplace): + (JSC::JIT::privateCompileGetByIdSelf): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdSelfList): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChainList): + (JSC::JIT::privateCompileGetByIdChain): + (JSC::JIT::privateCompilePutByIdReplace): + * jit/JITStubs.cpp: + (JSC::JITStubs::tryCachePutByID): + (JSC::JITStubs::tryCacheGetByID): + (JSC::JITStubs::cti_op_convert_this): + (JSC::JITStubs::cti_op_add): + (JSC::JITStubs::cti_op_pre_inc): + (JSC::JITStubs::cti_op_loop_if_less): + (JSC::JITStubs::cti_op_loop_if_lesseq): + (JSC::JITStubs::cti_op_get_by_id_generic): + (JSC::JITStubs::cti_op_get_by_id): + (JSC::JITStubs::cti_op_get_by_id_second): + (JSC::JITStubs::cti_op_get_by_id_self_fail): + (JSC::JITStubs::cti_op_get_by_id_proto_list): + (JSC::JITStubs::cti_op_get_by_id_proto_list_full): + (JSC::JITStubs::cti_op_get_by_id_proto_fail): + (JSC::JITStubs::cti_op_get_by_id_array_fail): + (JSC::JITStubs::cti_op_get_by_id_string_fail): + (JSC::JITStubs::cti_op_instanceof): + (JSC::JITStubs::cti_op_del_by_id): + (JSC::JITStubs::cti_op_mul): + (JSC::JITStubs::cti_op_call_NotJSFunction): + (JSC::JITStubs::cti_op_resolve): + (JSC::JITStubs::cti_op_construct_NotJSConstruct): + (JSC::JITStubs::cti_op_get_by_val): + (JSC::JITStubs::cti_op_get_by_val_string): + (JSC::JITStubs::cti_op_get_by_val_byte_array): + (JSC::JITStubs::cti_op_resolve_func): + (JSC::JITStubs::cti_op_sub): + (JSC::JITStubs::cti_op_put_by_val): + (JSC::JITStubs::cti_op_put_by_val_array): + (JSC::JITStubs::cti_op_put_by_val_byte_array): + (JSC::JITStubs::cti_op_lesseq): + (JSC::JITStubs::cti_op_loop_if_true): + (JSC::JITStubs::cti_op_load_varargs): + (JSC::JITStubs::cti_op_negate): + (JSC::JITStubs::cti_op_resolve_base): + (JSC::JITStubs::cti_op_resolve_skip): + (JSC::JITStubs::cti_op_resolve_global): + (JSC::JITStubs::cti_op_div): + (JSC::JITStubs::cti_op_pre_dec): + (JSC::JITStubs::cti_op_jless): + (JSC::JITStubs::cti_op_not): + (JSC::JITStubs::cti_op_jtrue): + (JSC::JITStubs::cti_op_post_inc): + (JSC::JITStubs::cti_op_eq): + (JSC::JITStubs::cti_op_lshift): + (JSC::JITStubs::cti_op_bitand): + (JSC::JITStubs::cti_op_rshift): + (JSC::JITStubs::cti_op_bitnot): + (JSC::JITStubs::cti_op_resolve_with_base): + (JSC::JITStubs::cti_op_mod): + (JSC::JITStubs::cti_op_less): + (JSC::JITStubs::cti_op_neq): + (JSC::JITStubs::cti_op_post_dec): + (JSC::JITStubs::cti_op_urshift): + (JSC::JITStubs::cti_op_bitxor): + (JSC::JITStubs::cti_op_bitor): + (JSC::JITStubs::cti_op_call_eval): + (JSC::JITStubs::cti_op_throw): + (JSC::JITStubs::cti_op_next_pname): + (JSC::JITStubs::cti_op_typeof): + (JSC::JITStubs::cti_op_is_undefined): + (JSC::JITStubs::cti_op_is_boolean): + (JSC::JITStubs::cti_op_is_number): + (JSC::JITStubs::cti_op_is_string): + (JSC::JITStubs::cti_op_is_object): + (JSC::JITStubs::cti_op_is_function): + (JSC::JITStubs::cti_op_stricteq): + (JSC::JITStubs::cti_op_nstricteq): + (JSC::JITStubs::cti_op_to_jsnumber): + (JSC::JITStubs::cti_op_in): + (JSC::JITStubs::cti_op_switch_imm): + (JSC::JITStubs::cti_op_switch_char): + (JSC::JITStubs::cti_op_switch_string): + (JSC::JITStubs::cti_op_del_by_val): + (JSC::JITStubs::cti_op_new_error): + (JSC::JITStubs::cti_vm_throw): + * jit/JITStubs.h: + * jsc.cpp: + (functionPrint): + (functionDebug): + (functionGC): + (functionVersion): + (functionRun): + (functionLoad): + (functionSetSamplingFlag): + (functionClearSamplingFlag): + (functionReadline): + (functionQuit): + * parser/Nodes.cpp: + (JSC::processClauseList): + * profiler/ProfileGenerator.cpp: + (JSC::ProfileGenerator::addParentForConsoleStart): + * profiler/Profiler.cpp: + (JSC::Profiler::willExecute): + (JSC::Profiler::didExecute): + (JSC::Profiler::createCallIdentifier): + * profiler/Profiler.h: + * runtime/ArgList.cpp: + (JSC::MarkedArgumentBuffer::slowAppend): + * runtime/ArgList.h: + (JSC::MarkedArgumentBuffer::at): + (JSC::MarkedArgumentBuffer::append): + (JSC::ArgList::ArgList): + (JSC::ArgList::at): + * runtime/Arguments.cpp: + (JSC::Arguments::put): + * runtime/Arguments.h: + (JSC::Arguments::createStructure): + (JSC::asArguments): + * runtime/ArrayConstructor.cpp: + (JSC::callArrayConstructor): + * runtime/ArrayPrototype.cpp: + (JSC::getProperty): + (JSC::putProperty): + (JSC::arrayProtoFuncToString): + (JSC::arrayProtoFuncToLocaleString): + (JSC::arrayProtoFuncJoin): + (JSC::arrayProtoFuncConcat): + (JSC::arrayProtoFuncPop): + (JSC::arrayProtoFuncPush): + (JSC::arrayProtoFuncReverse): + (JSC::arrayProtoFuncShift): + (JSC::arrayProtoFuncSlice): + (JSC::arrayProtoFuncSort): + (JSC::arrayProtoFuncSplice): + (JSC::arrayProtoFuncUnShift): + (JSC::arrayProtoFuncFilter): + (JSC::arrayProtoFuncMap): + (JSC::arrayProtoFuncEvery): + (JSC::arrayProtoFuncForEach): + (JSC::arrayProtoFuncSome): + (JSC::arrayProtoFuncReduce): + (JSC::arrayProtoFuncReduceRight): + (JSC::arrayProtoFuncIndexOf): + (JSC::arrayProtoFuncLastIndexOf): + * runtime/BooleanConstructor.cpp: + (JSC::callBooleanConstructor): + (JSC::constructBooleanFromImmediateBoolean): + * runtime/BooleanConstructor.h: + * runtime/BooleanObject.h: + (JSC::asBooleanObject): + * runtime/BooleanPrototype.cpp: + (JSC::booleanProtoFuncToString): + (JSC::booleanProtoFuncValueOf): + * runtime/CallData.cpp: + (JSC::call): + * runtime/CallData.h: + * runtime/Collector.cpp: + (JSC::Heap::protect): + (JSC::Heap::unprotect): + (JSC::Heap::heap): + * runtime/Collector.h: + * runtime/Completion.cpp: + (JSC::evaluate): + * runtime/Completion.h: + (JSC::Completion::Completion): + (JSC::Completion::value): + (JSC::Completion::setValue): + * runtime/ConstructData.cpp: + (JSC::construct): + * runtime/ConstructData.h: + * runtime/DateConstructor.cpp: + (JSC::constructDate): + (JSC::callDate): + (JSC::dateParse): + (JSC::dateNow): + (JSC::dateUTC): + * runtime/DateInstance.h: + (JSC::asDateInstance): + * runtime/DatePrototype.cpp: + (JSC::dateProtoFuncToString): + (JSC::dateProtoFuncToUTCString): + (JSC::dateProtoFuncToDateString): + (JSC::dateProtoFuncToTimeString): + (JSC::dateProtoFuncToLocaleString): + (JSC::dateProtoFuncToLocaleDateString): + (JSC::dateProtoFuncToLocaleTimeString): + (JSC::dateProtoFuncGetTime): + (JSC::dateProtoFuncGetFullYear): + (JSC::dateProtoFuncGetUTCFullYear): + (JSC::dateProtoFuncToGMTString): + (JSC::dateProtoFuncGetMonth): + (JSC::dateProtoFuncGetUTCMonth): + (JSC::dateProtoFuncGetDate): + (JSC::dateProtoFuncGetUTCDate): + (JSC::dateProtoFuncGetDay): + (JSC::dateProtoFuncGetUTCDay): + (JSC::dateProtoFuncGetHours): + (JSC::dateProtoFuncGetUTCHours): + (JSC::dateProtoFuncGetMinutes): + (JSC::dateProtoFuncGetUTCMinutes): + (JSC::dateProtoFuncGetSeconds): + (JSC::dateProtoFuncGetUTCSeconds): + (JSC::dateProtoFuncGetMilliSeconds): + (JSC::dateProtoFuncGetUTCMilliseconds): + (JSC::dateProtoFuncGetTimezoneOffset): + (JSC::dateProtoFuncSetTime): + (JSC::setNewValueFromTimeArgs): + (JSC::setNewValueFromDateArgs): + (JSC::dateProtoFuncSetMilliSeconds): + (JSC::dateProtoFuncSetUTCMilliseconds): + (JSC::dateProtoFuncSetSeconds): + (JSC::dateProtoFuncSetUTCSeconds): + (JSC::dateProtoFuncSetMinutes): + (JSC::dateProtoFuncSetUTCMinutes): + (JSC::dateProtoFuncSetHours): + (JSC::dateProtoFuncSetUTCHours): + (JSC::dateProtoFuncSetDate): + (JSC::dateProtoFuncSetUTCDate): + (JSC::dateProtoFuncSetMonth): + (JSC::dateProtoFuncSetUTCMonth): + (JSC::dateProtoFuncSetFullYear): + (JSC::dateProtoFuncSetUTCFullYear): + (JSC::dateProtoFuncSetYear): + (JSC::dateProtoFuncGetYear): + * runtime/DatePrototype.h: + (JSC::DatePrototype::createStructure): + * runtime/ErrorConstructor.cpp: + (JSC::callErrorConstructor): + * runtime/ErrorPrototype.cpp: + (JSC::errorProtoFuncToString): + * runtime/ExceptionHelpers.cpp: + (JSC::createInterruptedExecutionException): + (JSC::createError): + (JSC::createStackOverflowError): + (JSC::createUndefinedVariableError): + (JSC::createErrorMessage): + (JSC::createInvalidParamError): + (JSC::createNotAConstructorError): + (JSC::createNotAFunctionError): + * runtime/ExceptionHelpers.h: + * runtime/FunctionConstructor.cpp: + (JSC::callFunctionConstructor): + * runtime/FunctionPrototype.cpp: + (JSC::callFunctionPrototype): + (JSC::functionProtoFuncToString): + (JSC::functionProtoFuncApply): + (JSC::functionProtoFuncCall): + * runtime/FunctionPrototype.h: + (JSC::FunctionPrototype::createStructure): + * runtime/GetterSetter.cpp: + (JSC::GetterSetter::toPrimitive): + (JSC::GetterSetter::getPrimitiveNumber): + * runtime/GetterSetter.h: + (JSC::asGetterSetter): + * runtime/InternalFunction.cpp: + (JSC::InternalFunction::displayName): + * runtime/InternalFunction.h: + (JSC::InternalFunction::createStructure): + (JSC::asInternalFunction): + * runtime/JSActivation.cpp: + (JSC::JSActivation::getOwnPropertySlot): + (JSC::JSActivation::put): + (JSC::JSActivation::putWithAttributes): + (JSC::JSActivation::argumentsGetter): + * runtime/JSActivation.h: + (JSC::JSActivation::createStructure): + (JSC::asActivation): + * runtime/JSArray.cpp: + (JSC::storageSize): + (JSC::JSArray::JSArray): + (JSC::JSArray::getOwnPropertySlot): + (JSC::JSArray::put): + (JSC::JSArray::putSlowCase): + (JSC::JSArray::deleteProperty): + (JSC::JSArray::setLength): + (JSC::JSArray::pop): + (JSC::JSArray::push): + (JSC::JSArray::mark): + (JSC::compareNumbersForQSort): + (JSC::JSArray::sortNumeric): + (JSC::JSArray::sort): + (JSC::JSArray::compactForSorting): + (JSC::JSArray::checkConsistency): + (JSC::constructArray): + * runtime/JSArray.h: + (JSC::JSArray::getIndex): + (JSC::JSArray::setIndex): + (JSC::JSArray::createStructure): + (JSC::asArray): + (JSC::isJSArray): + * runtime/JSByteArray.cpp: + (JSC::JSByteArray::createStructure): + (JSC::JSByteArray::put): + * runtime/JSByteArray.h: + (JSC::JSByteArray::getIndex): + (JSC::JSByteArray::setIndex): + (JSC::asByteArray): + (JSC::isJSByteArray): + * runtime/JSCell.cpp: + (JSC::JSCell::put): + (JSC::JSCell::getJSNumber): + * runtime/JSCell.h: + (JSC::asCell): + (JSC::JSValue::asCell): + (JSC::JSValue::isString): + (JSC::JSValue::isGetterSetter): + (JSC::JSValue::isObject): + (JSC::JSValue::getString): + (JSC::JSValue::getObject): + (JSC::JSValue::getCallData): + (JSC::JSValue::getConstructData): + (JSC::JSValue::getUInt32): + (JSC::JSValue::getTruncatedInt32): + (JSC::JSValue::getTruncatedUInt32): + (JSC::JSValue::mark): + (JSC::JSValue::marked): + (JSC::JSValue::toPrimitive): + (JSC::JSValue::getPrimitiveNumber): + (JSC::JSValue::toBoolean): + (JSC::JSValue::toNumber): + (JSC::JSValue::toString): + (JSC::JSValue::toObject): + (JSC::JSValue::toThisObject): + (JSC::JSValue::needsThisConversion): + (JSC::JSValue::toThisString): + (JSC::JSValue::getJSNumber): + * runtime/JSFunction.cpp: + (JSC::JSFunction::call): + (JSC::JSFunction::argumentsGetter): + (JSC::JSFunction::callerGetter): + (JSC::JSFunction::lengthGetter): + (JSC::JSFunction::getOwnPropertySlot): + (JSC::JSFunction::put): + (JSC::JSFunction::construct): + * runtime/JSFunction.h: + (JSC::JSFunction::createStructure): + (JSC::asFunction): + * runtime/JSGlobalData.h: + * runtime/JSGlobalObject.cpp: + (JSC::markIfNeeded): + (JSC::JSGlobalObject::put): + (JSC::JSGlobalObject::putWithAttributes): + (JSC::JSGlobalObject::reset): + (JSC::JSGlobalObject::resetPrototype): + * runtime/JSGlobalObject.h: + (JSC::JSGlobalObject::createStructure): + (JSC::JSGlobalObject::GlobalPropertyInfo::GlobalPropertyInfo): + (JSC::asGlobalObject): + (JSC::Structure::prototypeForLookup): + (JSC::Structure::prototypeChain): + (JSC::Structure::isValid): + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::encode): + (JSC::decode): + (JSC::globalFuncEval): + (JSC::globalFuncParseInt): + (JSC::globalFuncParseFloat): + (JSC::globalFuncIsNaN): + (JSC::globalFuncIsFinite): + (JSC::globalFuncDecodeURI): + (JSC::globalFuncDecodeURIComponent): + (JSC::globalFuncEncodeURI): + (JSC::globalFuncEncodeURIComponent): + (JSC::globalFuncEscape): + (JSC::globalFuncUnescape): + (JSC::globalFuncJSCPrint): + * runtime/JSGlobalObjectFunctions.h: + * runtime/JSImmediate.cpp: + (JSC::JSImmediate::toThisObject): + (JSC::JSImmediate::toObject): + (JSC::JSImmediate::prototype): + (JSC::JSImmediate::toString): + * runtime/JSImmediate.h: + (JSC::JSImmediate::isImmediate): + (JSC::JSImmediate::isNumber): + (JSC::JSImmediate::isIntegerNumber): + (JSC::JSImmediate::isDoubleNumber): + (JSC::JSImmediate::isPositiveIntegerNumber): + (JSC::JSImmediate::isBoolean): + (JSC::JSImmediate::isUndefinedOrNull): + (JSC::JSImmediate::isEitherImmediate): + (JSC::JSImmediate::areBothImmediate): + (JSC::JSImmediate::areBothImmediateIntegerNumbers): + (JSC::JSImmediate::makeValue): + (JSC::JSImmediate::makeInt): + (JSC::JSImmediate::makeDouble): + (JSC::JSImmediate::makeBool): + (JSC::JSImmediate::makeUndefined): + (JSC::JSImmediate::makeNull): + (JSC::JSImmediate::doubleValue): + (JSC::JSImmediate::intValue): + (JSC::JSImmediate::uintValue): + (JSC::JSImmediate::boolValue): + (JSC::JSImmediate::rawValue): + (JSC::JSImmediate::trueImmediate): + (JSC::JSImmediate::falseImmediate): + (JSC::JSImmediate::undefinedImmediate): + (JSC::JSImmediate::nullImmediate): + (JSC::JSImmediate::zeroImmediate): + (JSC::JSImmediate::oneImmediate): + (JSC::JSImmediate::impossibleValue): + (JSC::JSImmediate::toBoolean): + (JSC::JSImmediate::getTruncatedUInt32): + (JSC::JSImmediate::fromNumberOutsideIntegerRange): + (JSC::JSImmediate::from): + (JSC::JSImmediate::getTruncatedInt32): + (JSC::JSImmediate::toDouble): + (JSC::JSImmediate::getUInt32): + (JSC::JSValue::JSValue): + (JSC::JSValue::isUndefinedOrNull): + (JSC::JSValue::isBoolean): + (JSC::JSValue::getBoolean): + (JSC::JSValue::toInt32): + (JSC::JSValue::toUInt32): + (JSC::JSValue::isCell): + (JSC::JSValue::isInt32Fast): + (JSC::JSValue::getInt32Fast): + (JSC::JSValue::isUInt32Fast): + (JSC::JSValue::getUInt32Fast): + (JSC::JSValue::makeInt32Fast): + (JSC::JSValue::areBothInt32Fast): + (JSC::JSFastMath::canDoFastBitwiseOperations): + (JSC::JSFastMath::equal): + (JSC::JSFastMath::notEqual): + (JSC::JSFastMath::andImmediateNumbers): + (JSC::JSFastMath::xorImmediateNumbers): + (JSC::JSFastMath::orImmediateNumbers): + (JSC::JSFastMath::canDoFastRshift): + (JSC::JSFastMath::canDoFastUrshift): + (JSC::JSFastMath::rightShiftImmediateNumbers): + (JSC::JSFastMath::canDoFastAdditiveOperations): + (JSC::JSFastMath::addImmediateNumbers): + (JSC::JSFastMath::subImmediateNumbers): + (JSC::JSFastMath::incImmediateNumber): + (JSC::JSFastMath::decImmediateNumber): + * runtime/JSNotAnObject.cpp: + (JSC::JSNotAnObject::toPrimitive): + (JSC::JSNotAnObject::getPrimitiveNumber): + (JSC::JSNotAnObject::put): + * runtime/JSNotAnObject.h: + (JSC::JSNotAnObject::createStructure): + * runtime/JSNumberCell.cpp: + (JSC::JSNumberCell::toPrimitive): + (JSC::JSNumberCell::getPrimitiveNumber): + (JSC::JSNumberCell::getJSNumber): + (JSC::jsNumberCell): + * runtime/JSNumberCell.h: + (JSC::JSNumberCell::createStructure): + (JSC::isNumberCell): + (JSC::asNumberCell): + (JSC::jsNumber): + (JSC::JSValue::isDoubleNumber): + (JSC::JSValue::getDoubleNumber): + (JSC::JSValue::isNumber): + (JSC::JSValue::uncheckedGetNumber): + (JSC::jsNaN): + (JSC::JSValue::toJSNumber): + (JSC::JSValue::getNumber): + (JSC::JSValue::numberToInt32): + (JSC::JSValue::numberToUInt32): + * runtime/JSObject.cpp: + (JSC::JSObject::mark): + (JSC::JSObject::put): + (JSC::JSObject::putWithAttributes): + (JSC::callDefaultValueFunction): + (JSC::JSObject::getPrimitiveNumber): + (JSC::JSObject::defaultValue): + (JSC::JSObject::defineGetter): + (JSC::JSObject::defineSetter): + (JSC::JSObject::lookupGetter): + (JSC::JSObject::lookupSetter): + (JSC::JSObject::hasInstance): + (JSC::JSObject::toNumber): + (JSC::JSObject::toString): + (JSC::JSObject::fillGetterPropertySlot): + * runtime/JSObject.h: + (JSC::JSObject::getDirect): + (JSC::JSObject::getDirectLocation): + (JSC::JSObject::offsetForLocation): + (JSC::JSObject::locationForOffset): + (JSC::JSObject::getDirectOffset): + (JSC::JSObject::putDirectOffset): + (JSC::JSObject::createStructure): + (JSC::asObject): + (JSC::JSObject::prototype): + (JSC::JSObject::setPrototype): + (JSC::JSValue::isObject): + (JSC::JSObject::inlineGetOwnPropertySlot): + (JSC::JSObject::getOwnPropertySlotForWrite): + (JSC::JSObject::getPropertySlot): + (JSC::JSObject::get): + (JSC::JSObject::putDirect): + (JSC::JSObject::putDirectWithoutTransition): + (JSC::JSObject::toPrimitive): + (JSC::JSValue::get): + (JSC::JSValue::put): + (JSC::JSObject::allocatePropertyStorageInline): + * runtime/JSPropertyNameIterator.cpp: + (JSC::JSPropertyNameIterator::toPrimitive): + (JSC::JSPropertyNameIterator::getPrimitiveNumber): + * runtime/JSPropertyNameIterator.h: + (JSC::JSPropertyNameIterator::create): + (JSC::JSPropertyNameIterator::next): + * runtime/JSStaticScopeObject.cpp: + (JSC::JSStaticScopeObject::put): + (JSC::JSStaticScopeObject::putWithAttributes): + * runtime/JSStaticScopeObject.h: + (JSC::JSStaticScopeObject::JSStaticScopeObject): + (JSC::JSStaticScopeObject::createStructure): + * runtime/JSString.cpp: + (JSC::JSString::toPrimitive): + (JSC::JSString::getPrimitiveNumber): + (JSC::JSString::getOwnPropertySlot): + * runtime/JSString.h: + (JSC::JSString::createStructure): + (JSC::asString): + (JSC::isJSString): + (JSC::JSValue::toThisJSString): + * runtime/JSValue.cpp: + (JSC::JSValue::toInteger): + (JSC::JSValue::toIntegerPreserveNaN): + * runtime/JSValue.h: + (JSC::JSValue::makeImmediate): + (JSC::JSValue::asValue): + (JSC::noValue): + (JSC::jsImpossibleValue): + (JSC::jsNull): + (JSC::jsUndefined): + (JSC::jsBoolean): + (JSC::operator==): + (JSC::operator!=): + (JSC::JSValue::encode): + (JSC::JSValue::decode): + (JSC::JSValue::JSValue): + (JSC::JSValue::operator bool): + (JSC::JSValue::operator==): + (JSC::JSValue::operator!=): + (JSC::JSValue::isUndefined): + (JSC::JSValue::isNull): + * runtime/JSVariableObject.h: + (JSC::JSVariableObject::symbolTablePut): + (JSC::JSVariableObject::symbolTablePutWithAttributes): + * runtime/JSWrapperObject.h: + (JSC::JSWrapperObject::internalValue): + (JSC::JSWrapperObject::setInternalValue): + * runtime/Lookup.cpp: + (JSC::setUpStaticFunctionSlot): + * runtime/Lookup.h: + (JSC::lookupPut): + * runtime/MathObject.cpp: + (JSC::mathProtoFuncAbs): + (JSC::mathProtoFuncACos): + (JSC::mathProtoFuncASin): + (JSC::mathProtoFuncATan): + (JSC::mathProtoFuncATan2): + (JSC::mathProtoFuncCeil): + (JSC::mathProtoFuncCos): + (JSC::mathProtoFuncExp): + (JSC::mathProtoFuncFloor): + (JSC::mathProtoFuncLog): + (JSC::mathProtoFuncMax): + (JSC::mathProtoFuncMin): + (JSC::mathProtoFuncPow): + (JSC::mathProtoFuncRandom): + (JSC::mathProtoFuncRound): + (JSC::mathProtoFuncSin): + (JSC::mathProtoFuncSqrt): + (JSC::mathProtoFuncTan): + * runtime/MathObject.h: + (JSC::MathObject::createStructure): + * runtime/NativeErrorConstructor.cpp: + (JSC::callNativeErrorConstructor): + * runtime/NumberConstructor.cpp: + (JSC::numberConstructorNaNValue): + (JSC::numberConstructorNegInfinity): + (JSC::numberConstructorPosInfinity): + (JSC::numberConstructorMaxValue): + (JSC::numberConstructorMinValue): + (JSC::callNumberConstructor): + * runtime/NumberConstructor.h: + (JSC::NumberConstructor::createStructure): + * runtime/NumberObject.cpp: + (JSC::NumberObject::getJSNumber): + (JSC::constructNumber): + * runtime/NumberObject.h: + * runtime/NumberPrototype.cpp: + (JSC::numberProtoFuncToString): + (JSC::numberProtoFuncToLocaleString): + (JSC::numberProtoFuncValueOf): + (JSC::numberProtoFuncToFixed): + (JSC::numberProtoFuncToExponential): + (JSC::numberProtoFuncToPrecision): + * runtime/ObjectConstructor.cpp: + (JSC::constructObject): + (JSC::callObjectConstructor): + * runtime/ObjectPrototype.cpp: + (JSC::objectProtoFuncValueOf): + (JSC::objectProtoFuncHasOwnProperty): + (JSC::objectProtoFuncIsPrototypeOf): + (JSC::objectProtoFuncDefineGetter): + (JSC::objectProtoFuncDefineSetter): + (JSC::objectProtoFuncLookupGetter): + (JSC::objectProtoFuncLookupSetter): + (JSC::objectProtoFuncPropertyIsEnumerable): + (JSC::objectProtoFuncToLocaleString): + (JSC::objectProtoFuncToString): + * runtime/ObjectPrototype.h: + * runtime/Operations.cpp: + (JSC::JSValue::equalSlowCase): + (JSC::JSValue::strictEqualSlowCase): + (JSC::throwOutOfMemoryError): + (JSC::jsAddSlowCase): + (JSC::jsTypeStringForValue): + (JSC::jsIsObjectType): + (JSC::jsIsFunctionType): + * runtime/Operations.h: + (JSC::JSValue::equal): + (JSC::JSValue::equalSlowCaseInline): + (JSC::JSValue::strictEqual): + (JSC::JSValue::strictEqualSlowCaseInline): + (JSC::jsLess): + (JSC::jsLessEq): + (JSC::jsAdd): + (JSC::countPrototypeChainEntriesAndCheckForProxies): + (JSC::resolveBase): + * runtime/PropertySlot.cpp: + (JSC::PropertySlot::functionGetter): + * runtime/PropertySlot.h: + (JSC::PropertySlot::PropertySlot): + (JSC::PropertySlot::getValue): + (JSC::PropertySlot::putValue): + (JSC::PropertySlot::setValueSlot): + (JSC::PropertySlot::setValue): + (JSC::PropertySlot::setCustom): + (JSC::PropertySlot::setCustomIndex): + (JSC::PropertySlot::slotBase): + (JSC::PropertySlot::setBase): + (JSC::PropertySlot::): + * runtime/Protect.h: + (JSC::gcProtect): + (JSC::gcUnprotect): + (JSC::ProtectedPtr::operator JSValue): + (JSC::ProtectedJSValue::ProtectedJSValue): + (JSC::ProtectedJSValue::get): + (JSC::ProtectedJSValue::operator JSValue): + (JSC::ProtectedJSValue::operator->): + (JSC::ProtectedJSValue::~ProtectedJSValue): + (JSC::ProtectedJSValue::operator=): + (JSC::operator==): + (JSC::operator!=): + * runtime/RegExpConstructor.cpp: + (JSC::RegExpConstructor::getBackref): + (JSC::RegExpConstructor::getLastParen): + (JSC::RegExpConstructor::getLeftContext): + (JSC::RegExpConstructor::getRightContext): + (JSC::regExpConstructorDollar1): + (JSC::regExpConstructorDollar2): + (JSC::regExpConstructorDollar3): + (JSC::regExpConstructorDollar4): + (JSC::regExpConstructorDollar5): + (JSC::regExpConstructorDollar6): + (JSC::regExpConstructorDollar7): + (JSC::regExpConstructorDollar8): + (JSC::regExpConstructorDollar9): + (JSC::regExpConstructorInput): + (JSC::regExpConstructorMultiline): + (JSC::regExpConstructorLastMatch): + (JSC::regExpConstructorLastParen): + (JSC::regExpConstructorLeftContext): + (JSC::regExpConstructorRightContext): + (JSC::RegExpConstructor::put): + (JSC::setRegExpConstructorInput): + (JSC::setRegExpConstructorMultiline): + (JSC::constructRegExp): + (JSC::callRegExpConstructor): + * runtime/RegExpConstructor.h: + (JSC::RegExpConstructor::createStructure): + (JSC::asRegExpConstructor): + * runtime/RegExpMatchesArray.h: + (JSC::RegExpMatchesArray::put): + * runtime/RegExpObject.cpp: + (JSC::regExpObjectGlobal): + (JSC::regExpObjectIgnoreCase): + (JSC::regExpObjectMultiline): + (JSC::regExpObjectSource): + (JSC::regExpObjectLastIndex): + (JSC::RegExpObject::put): + (JSC::setRegExpObjectLastIndex): + (JSC::RegExpObject::test): + (JSC::RegExpObject::exec): + (JSC::callRegExpObject): + * runtime/RegExpObject.h: + (JSC::RegExpObject::createStructure): + (JSC::asRegExpObject): + * runtime/RegExpPrototype.cpp: + (JSC::regExpProtoFuncTest): + (JSC::regExpProtoFuncExec): + (JSC::regExpProtoFuncCompile): + (JSC::regExpProtoFuncToString): + * runtime/StringConstructor.cpp: + (JSC::stringFromCharCodeSlowCase): + (JSC::stringFromCharCode): + (JSC::callStringConstructor): + * runtime/StringObject.cpp: + (JSC::StringObject::put): + * runtime/StringObject.h: + (JSC::StringObject::createStructure): + (JSC::asStringObject): + * runtime/StringObjectThatMasqueradesAsUndefined.h: + (JSC::StringObjectThatMasqueradesAsUndefined::createStructure): + * runtime/StringPrototype.cpp: + (JSC::stringProtoFuncReplace): + (JSC::stringProtoFuncToString): + (JSC::stringProtoFuncCharAt): + (JSC::stringProtoFuncCharCodeAt): + (JSC::stringProtoFuncConcat): + (JSC::stringProtoFuncIndexOf): + (JSC::stringProtoFuncLastIndexOf): + (JSC::stringProtoFuncMatch): + (JSC::stringProtoFuncSearch): + (JSC::stringProtoFuncSlice): + (JSC::stringProtoFuncSplit): + (JSC::stringProtoFuncSubstr): + (JSC::stringProtoFuncSubstring): + (JSC::stringProtoFuncToLowerCase): + (JSC::stringProtoFuncToUpperCase): + (JSC::stringProtoFuncLocaleCompare): + (JSC::stringProtoFuncBig): + (JSC::stringProtoFuncSmall): + (JSC::stringProtoFuncBlink): + (JSC::stringProtoFuncBold): + (JSC::stringProtoFuncFixed): + (JSC::stringProtoFuncItalics): + (JSC::stringProtoFuncStrike): + (JSC::stringProtoFuncSub): + (JSC::stringProtoFuncSup): + (JSC::stringProtoFuncFontcolor): + (JSC::stringProtoFuncFontsize): + (JSC::stringProtoFuncAnchor): + (JSC::stringProtoFuncLink): + * runtime/Structure.cpp: + (JSC::Structure::Structure): + (JSC::Structure::changePrototypeTransition): + * runtime/Structure.h: + (JSC::Structure::create): + (JSC::Structure::setPrototypeWithoutTransition): + (JSC::Structure::storedPrototype): + +2009-05-01 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam "That doesn't look like what I thought it looks like" Weinig. + + Beefed up the JSValuePtr class and removed some non-JSValuePtr dependencies + on JSImmediate, in prepapration for making JSImmediate an implementation + detail of JSValuePtr. + + SunSpider reports no change. + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + * jit/JITArithmetic.cpp: + (JSC::JIT::compileFastArith_op_mod): + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::globalFuncParseInt): Updated for interface changes. + + * runtime/JSImmediate.h: + (JSC::JSValuePtr::JSValuePtr): + * runtime/JSValue.h: + (JSC::JSValuePtr::): + (JSC::jsImpossibleValue): + (JSC::jsNull): + (JSC::jsUndefined): + (JSC::jsBoolean): + (JSC::JSValuePtr::encode): + (JSC::JSValuePtr::decode): + (JSC::JSValuePtr::JSValuePtr): + (JSC::JSValuePtr::operator bool): + (JSC::JSValuePtr::operator==): + (JSC::JSValuePtr::operator!=): + (JSC::JSValuePtr::isUndefined): + (JSC::JSValuePtr::isNull): Changed jsImpossibleValue(), jsNull(), + jsUndefined(), and jsBoolean() to operate in terms of JSValuePtr instead + of JSImmediate. + + * wtf/StdLibExtras.h: + (WTF::bitwise_cast): Fixed up for clarity. + +2009-04-30 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Bug fix for rdar:/6845379. If a case-insensitive regex contains + a character class containing a range with an upper bound of \uFFFF + the parser will infinite-loop whist adding other-case characters + for characters in the range that do have another case. + + * yarr/RegexCompiler.cpp: + (JSC::Yarr::CharacterClassConstructor::putRange): + +2009-04-30 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + OPCODE_SAMPLING without CODEBLOCK_SAMPLING is currently broken, + since SamplingTool::Sample::isNull() checks the m_codeBlock + member (which is always null without CODEBLOCK_SAMPLING). + + Restructure the checks so make this work again. + + * bytecode/SamplingTool.cpp: + (JSC::SamplingTool::doRun): + * bytecode/SamplingTool.h: + (JSC::SamplingTool::Sample::isNull): + +2009-04-30 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Gavin Barraclough. + + - Concatenate final three strings in simple replace case at one go + + ~0.2% SunSpider speedup + + * runtime/StringPrototype.cpp: + (JSC::stringProtoFuncReplace): Use new replaceRange helper instead of + taking substrings and concatenating three strings. + * runtime/UString.cpp: + (JSC::UString::replaceRange): New helper function. + * runtime/UString.h: + +2009-04-30 Geoffrey Garen <ggaren@apple.com> + + Rubber Stamped by Gavin Barraclough. + + Changed JSValueEncodedAsPtr* => EncodedJSValuePtr to support a non-pointer + encoding for JSValuePtrs. + + * API/APICast.h: + (toJS): + * bytecompiler/BytecodeGenerator.h: + (JSC::BytecodeGenerator::JSValueHashTraits::constructDeletedValue): + (JSC::BytecodeGenerator::JSValueHashTraits::isDeletedValue): + * interpreter/Register.h: + (JSC::Register::): + * jit/JIT.cpp: + (JSC::): + * jit/JIT.h: + * jit/JITCode.h: + (JSC::): + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_op_add): + (JSC::JITStubs::cti_op_pre_inc): + (JSC::JITStubs::cti_op_get_by_id_generic): + (JSC::JITStubs::cti_op_get_by_id): + (JSC::JITStubs::cti_op_get_by_id_second): + (JSC::JITStubs::cti_op_get_by_id_self_fail): + (JSC::JITStubs::cti_op_get_by_id_proto_list): + (JSC::JITStubs::cti_op_get_by_id_proto_list_full): + (JSC::JITStubs::cti_op_get_by_id_proto_fail): + (JSC::JITStubs::cti_op_get_by_id_array_fail): + (JSC::JITStubs::cti_op_get_by_id_string_fail): + (JSC::JITStubs::cti_op_instanceof): + (JSC::JITStubs::cti_op_del_by_id): + (JSC::JITStubs::cti_op_mul): + (JSC::JITStubs::cti_op_call_NotJSFunction): + (JSC::JITStubs::cti_op_resolve): + (JSC::JITStubs::cti_op_construct_NotJSConstruct): + (JSC::JITStubs::cti_op_get_by_val): + (JSC::JITStubs::cti_op_get_by_val_string): + (JSC::JITStubs::cti_op_get_by_val_byte_array): + (JSC::JITStubs::cti_op_sub): + (JSC::JITStubs::cti_op_lesseq): + (JSC::JITStubs::cti_op_negate): + (JSC::JITStubs::cti_op_resolve_base): + (JSC::JITStubs::cti_op_resolve_skip): + (JSC::JITStubs::cti_op_resolve_global): + (JSC::JITStubs::cti_op_div): + (JSC::JITStubs::cti_op_pre_dec): + (JSC::JITStubs::cti_op_not): + (JSC::JITStubs::cti_op_eq): + (JSC::JITStubs::cti_op_lshift): + (JSC::JITStubs::cti_op_bitand): + (JSC::JITStubs::cti_op_rshift): + (JSC::JITStubs::cti_op_bitnot): + (JSC::JITStubs::cti_op_mod): + (JSC::JITStubs::cti_op_less): + (JSC::JITStubs::cti_op_neq): + (JSC::JITStubs::cti_op_urshift): + (JSC::JITStubs::cti_op_bitxor): + (JSC::JITStubs::cti_op_bitor): + (JSC::JITStubs::cti_op_call_eval): + (JSC::JITStubs::cti_op_throw): + (JSC::JITStubs::cti_op_next_pname): + (JSC::JITStubs::cti_op_typeof): + (JSC::JITStubs::cti_op_is_undefined): + (JSC::JITStubs::cti_op_is_boolean): + (JSC::JITStubs::cti_op_is_number): + (JSC::JITStubs::cti_op_is_string): + (JSC::JITStubs::cti_op_is_object): + (JSC::JITStubs::cti_op_is_function): + (JSC::JITStubs::cti_op_stricteq): + (JSC::JITStubs::cti_op_nstricteq): + (JSC::JITStubs::cti_op_to_jsnumber): + (JSC::JITStubs::cti_op_in): + (JSC::JITStubs::cti_op_del_by_val): + (JSC::JITStubs::cti_vm_throw): + * jit/JITStubs.h: + * runtime/JSValue.h: + (JSC::JSValuePtr::encode): + (JSC::JSValuePtr::decode): + +2009-04-30 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver "Abandon Ship!" Hunt. + + Fix a leak in Yarr. + + All Disjunctions should be recorded in RegexPattern::m_disjunctions, + so that they can be freed at the end of compilation - copyDisjunction + is failing to do so. + + * yarr/RegexCompiler.cpp: + (JSC::Yarr::RegexPatternConstructor::copyDisjunction): + +2009-04-30 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + Add function to CallFrame for dumping the current JS caller + + Added debug only method CallFrame::dumpCaller() that provide the call location + of the deepest currently executing JS function. + + * interpreter/CallFrame.cpp: + (JSC::CallFrame::dumpCaller): + * interpreter/CallFrame.h: + +2009-04-30 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Geoff Garen. + + - make BaseStrings have themselves as a base, instead of nothing, to remove common branches + + ~0.7% SunSpider speedup + + * runtime/UString.h: + (JSC::UString::Rep::Rep): For the constructor without a base, set self as base instead of null. + (JSC::UString::Rep::baseString): Just read m_baseString - no more branching. + +2009-04-30 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Two quick improvements to SamplingFlags mechanism. + + SamplingFlags::ScopedFlag class to provide support for automagically + clearing a flag as it goes out of scope, and add a little more detail + to the output generated by the tool. + + * bytecode/SamplingTool.cpp: + (JSC::SamplingFlags::stop): + * bytecode/SamplingTool.h: + (JSC::SamplingFlags::ScopedFlag::ScopedFlag): + (JSC::SamplingFlags::ScopedFlag::~ScopedFlag): + +2009-04-30 Adam Roben <aroben@apple.com> + + Restore build event steps that were truncated in r43082 + + Rubber-stamped by Steve Falkenburg. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreCommon.vsprops: + * JavaScriptCore.vcproj/jsc/jscCommon.vsprops: + * JavaScriptCore.vcproj/testapi/testapiCommon.vsprops: + Re-copied the command lines for the build events from the pre-r43082 + .vcproj files. + + * JavaScriptCore.vcproj/jsc/jsc.vcproj: Removed an unnecessary + attribute. + +2009-04-30 Adam Roben <aroben@apple.com> + + Move settings from .vcproj files to .vsprops files within the + JavaScriptCore directory + + Moving the settings to a .vsprops file means that we will only have to + change a single setting to affect all configurations, instead of one + setting per configuration. + + Reviewed by Steve Falkenburg. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.vcproj/WTF/WTF.vcproj: + * JavaScriptCore.vcproj/jsc/jsc.vcproj: + * JavaScriptCore.vcproj/testapi/testapi.vcproj: + Moved settings from these files to the new .vsprops files. Note that + testapi.vcproj had a lot of overrides of default settings that were + the same as the defaults, which I've removed. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreCommon.vsprops: Added. + * JavaScriptCore.vcproj/WTF/WTFCommon.vsprops: Added. + * JavaScriptCore.vcproj/jsc/jscCommon.vsprops: Added. + * JavaScriptCore.vcproj/testapi/testapiCommon.vsprops: Added. + +2009-04-30 Dimitri Glazkov <dglazkov@chromium.org> + + Reviewed by Timothy Hatcher. + + https://bugs.webkit.org/show_bug.cgi?id=25470 + Extend the cover of ENABLE_JAVASCRIPT_DEBUGGER to profiler. + + * Configurations/FeatureDefines.xcconfig: Added ENABLE_JAVASCRIPT_DEBUGGER define. + +2009-04-30 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Alexey Proskuryakov. + + - speed up string concatenation by reorganizing some simple cases + + 0.7% SunSpider speedup + + * runtime/UString.cpp: + (JSC::concatenate): Put fast case for appending a single character + before the empty string special cases; streamline code a bit to + delay computing values that are not needed in the fast path. + +2009-04-30 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Maciej Stachowiak. + + Add SamplingFlags mechanism. + + This mechanism allows fine-grained JSC and JavaScript program aware + performance measurement. The mechanism provides a set of 32 flags, + numbered #1..#32. Flag #16 is initially set, and all other flags + are cleared. Flags may be set and cleared from within + + Enable by setting ENABLE_SAMPLING_FLAGS to 1 in wtf/Platform.h. + Disabled by default, no performance impact. Flags may be modified + by calling SamplingFlags::setFlag() and SamplingFlags::clearFlag() + from within JSC implementation, or by calling setSamplingFlag() and + clearSamplingFlag() from JavaScript. + + The flags are sampled with a frequency of 10000Hz, and the highest + set flag in recorded, allowing multiple events to be measured (with + the highest flag number representing the highest priority). + + Disabled by default; no performance impact. + + * JavaScriptCore.exp: + * bytecode/SamplingTool.cpp: + (JSC::SamplingFlags::sample): + (JSC::SamplingFlags::start): + (JSC::SamplingFlags::stop): + (JSC::SamplingThread::threadStartFunc): + (JSC::SamplingThread::start): + (JSC::SamplingThread::stop): + (JSC::ScopeSampleRecord::sample): + (JSC::SamplingTool::doRun): + (JSC::SamplingTool::sample): + (JSC::SamplingTool::start): + (JSC::SamplingTool::stop): + * bytecode/SamplingTool.h: + (JSC::SamplingFlags::setFlag): + (JSC::SamplingFlags::clearFlag): + (JSC::SamplingTool::SamplingTool): + * jsc.cpp: + (GlobalObject::GlobalObject): + (functionSetSamplingFlag): + (functionClearSamplingFlag): + (runWithScripts): + * wtf/Platform.h: + +2009-04-29 Sam Weinig <sam@webkit.org> + + Another attempt to fix the windows build. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + +2009-04-29 Sam Weinig <sam@webkit.org> + + Try and fix the windows build. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + +2009-04-29 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver "Peg-Leg" Hunt. + + Coallesce input checking and reduce futzing with the index position + between alternatives and iterations of the main loop of a regex, + when run in YARR. + + Consider the following regex: /foo|bar/ + + Prior to this patch, this will be implemented something like this pseudo-code description: + + loop: + check_for_available_input(3) // this increments the index by 3, for the first alterantive. + if (available) { test "foo" } + decrement_index(3) + check_for_available_input(3) // this increments the index by 3, for the second alterantive. + if (available) { test "bar" } + decrement_index(3) + check_for_available_input(1) // can we loop again? + if (available) { goto loop } + + With these changes it will look more like this: + + check_for_available_input(3) // this increments the index by 3, for the first alterantive. + if (!available) { goto fail } + loop: + test "foo" + test "bar" + check_for_available_input(1) // can we loop again? + if (available) { goto loop } + fail: + + + This gives about a 5% gain on v8-regex, no change on Sunspider. + + * yarr/RegexJIT.cpp: + (JSC::Yarr::RegexGenerator::TermGenerationState::linkAlternativeBacktracksTo): + (JSC::Yarr::RegexGenerator::generateDisjunction): + +2009-04-29 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + Clean up ArgList to be a trivial type + + Separate out old ArgList logic to handle buffering and marking arguments + into a distinct MarkedArgumentBuffer type. ArgList becomes a trivial + struct of a pointer and length. + + * API/JSObjectRef.cpp: + (JSObjectMakeFunction): + (JSObjectMakeArray): + (JSObjectMakeDate): + (JSObjectMakeError): + (JSObjectMakeRegExp): + (JSObjectCallAsFunction): + (JSObjectCallAsConstructor): + * JavaScriptCore.exp: + * interpreter/CallFrame.h: + (JSC::ExecState::emptyList): + * runtime/ArgList.cpp: + (JSC::ArgList::getSlice): + (JSC::MarkedArgumentBuffer::markLists): + (JSC::MarkedArgumentBuffer::slowAppend): + * runtime/ArgList.h: + (JSC::MarkedArgumentBuffer::MarkedArgumentBuffer): + (JSC::MarkedArgumentBuffer::~MarkedArgumentBuffer): + (JSC::ArgList::ArgList): + (JSC::ArgList::at): + (JSC::ArgList::isEmpty): + (JSC::ArgList::size): + (JSC::ArgList::begin): + (JSC::ArgList::end): + * runtime/Arguments.cpp: + (JSC::Arguments::fillArgList): + * runtime/Arguments.h: + * runtime/ArrayPrototype.cpp: + (JSC::arrayProtoFuncConcat): + (JSC::arrayProtoFuncPush): + (JSC::arrayProtoFuncSort): + (JSC::arrayProtoFuncFilter): + (JSC::arrayProtoFuncMap): + (JSC::arrayProtoFuncEvery): + (JSC::arrayProtoFuncForEach): + (JSC::arrayProtoFuncSome): + (JSC::arrayProtoFuncReduce): + (JSC::arrayProtoFuncReduceRight): + * runtime/Collector.cpp: + (JSC::Heap::collect): + * runtime/Collector.h: + (JSC::Heap::markListSet): + * runtime/CommonIdentifiers.h: + * runtime/Error.cpp: + (JSC::Error::create): + * runtime/FunctionPrototype.cpp: + (JSC::functionProtoFuncApply): + * runtime/JSArray.cpp: + (JSC::JSArray::JSArray): + (JSC::AVLTreeAbstractorForArrayCompare::compare_key_key): + (JSC::JSArray::fillArgList): + (JSC::constructArray): + * runtime/JSArray.h: + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + * runtime/JSGlobalData.h: + * runtime/JSObject.cpp: + (JSC::JSObject::put): + * runtime/StringConstructor.cpp: + (JSC::stringFromCharCodeSlowCase): + * runtime/StringPrototype.cpp: + (JSC::stringProtoFuncReplace): + (JSC::stringProtoFuncConcat): + (JSC::stringProtoFuncMatch): + +2009-04-29 Laszlo Gombos <laszlo.1.gombos@nokia.com> + + Reviewed by Sam Weinig. + + https://bugs.webkit.org/show_bug.cgi?id=25334 + + Fix Qt build when ENABLE_JIT is explicitly set to 1 + to overrule defaults. + + * JavaScriptCore.pri: + +2009-04-29 Oliver Hunt <oliver@apple.com> + + Reviewed by Steve Falkenburg. + + Crash in profiler due to incorrect assuming displayName would be a string. + + Fixed by adding a type guard. + + * runtime/InternalFunction.cpp: + (JSC::InternalFunction::displayName): + +2009-04-28 Geoffrey Garen <ggaren@apple.com> + + Rubber stamped by Beth Dakin. + + Removed scaffolding supporting dynamically converting between 32bit and + 64bit value representations. + + * API/JSCallbackConstructor.cpp: + (JSC::constructJSCallback): + * API/JSCallbackFunction.cpp: + (JSC::JSCallbackFunction::call): + * API/JSCallbackObjectFunctions.h: + (JSC::::construct): + (JSC::::call): + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::getConstant): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitEqualityOp): + * interpreter/CallFrame.cpp: + (JSC::CallFrame::thisValue): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::callEval): + (JSC::Interpreter::throwException): + (JSC::Interpreter::createExceptionScope): + (JSC::Interpreter::privateExecute): + (JSC::Interpreter::retrieveArguments): + * interpreter/Register.h: + (JSC::Register::): + (JSC::Register::Register): + (JSC::Register::jsValue): + (JSC::Register::marked): + (JSC::Register::mark): + (JSC::Register::i): + (JSC::Register::activation): + (JSC::Register::arguments): + (JSC::Register::callFrame): + (JSC::Register::codeBlock): + (JSC::Register::function): + (JSC::Register::propertyNameIterator): + (JSC::Register::scopeChain): + (JSC::Register::vPC): + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_op_call_NotJSFunction): + (JSC::JITStubs::cti_op_load_varargs): + (JSC::JITStubs::cti_op_call_eval): + * jsc.cpp: + (functionPrint): + (functionDebug): + (functionRun): + (functionLoad): + * runtime/ArgList.h: + (JSC::ArgList::at): + * runtime/Arguments.cpp: + (JSC::Arguments::copyToRegisters): + (JSC::Arguments::fillArgList): + (JSC::Arguments::getOwnPropertySlot): + * runtime/ArrayConstructor.cpp: + (JSC::constructArrayWithSizeQuirk): + * runtime/ArrayPrototype.cpp: + (JSC::arrayProtoFuncJoin): + (JSC::arrayProtoFuncConcat): + (JSC::arrayProtoFuncPush): + (JSC::arrayProtoFuncSlice): + (JSC::arrayProtoFuncSort): + (JSC::arrayProtoFuncSplice): + (JSC::arrayProtoFuncUnShift): + (JSC::arrayProtoFuncFilter): + (JSC::arrayProtoFuncMap): + (JSC::arrayProtoFuncEvery): + (JSC::arrayProtoFuncForEach): + (JSC::arrayProtoFuncSome): + (JSC::arrayProtoFuncReduce): + (JSC::arrayProtoFuncReduceRight): + (JSC::arrayProtoFuncIndexOf): + (JSC::arrayProtoFuncLastIndexOf): + * runtime/BooleanConstructor.cpp: + (JSC::constructBoolean): + (JSC::callBooleanConstructor): + * runtime/DateConstructor.cpp: + (JSC::constructDate): + (JSC::dateParse): + (JSC::dateUTC): + * runtime/DatePrototype.cpp: + (JSC::formatLocaleDate): + (JSC::fillStructuresUsingTimeArgs): + (JSC::fillStructuresUsingDateArgs): + (JSC::dateProtoFuncSetTime): + (JSC::dateProtoFuncSetYear): + * runtime/ErrorConstructor.cpp: + (JSC::constructError): + * runtime/FunctionConstructor.cpp: + (JSC::constructFunction): + * runtime/FunctionPrototype.cpp: + (JSC::functionProtoFuncApply): + (JSC::functionProtoFuncCall): + * runtime/JSArray.cpp: + (JSC::JSArray::JSArray): + (JSC::constructArray): + * runtime/JSArray.h: + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::encode): + (JSC::decode): + (JSC::globalFuncEval): + (JSC::globalFuncParseInt): + (JSC::globalFuncParseFloat): + (JSC::globalFuncIsNaN): + (JSC::globalFuncIsFinite): + (JSC::globalFuncEscape): + (JSC::globalFuncUnescape): + (JSC::globalFuncJSCPrint): + * runtime/MathObject.cpp: + (JSC::mathProtoFuncAbs): + (JSC::mathProtoFuncACos): + (JSC::mathProtoFuncASin): + (JSC::mathProtoFuncATan): + (JSC::mathProtoFuncATan2): + (JSC::mathProtoFuncCeil): + (JSC::mathProtoFuncCos): + (JSC::mathProtoFuncExp): + (JSC::mathProtoFuncFloor): + (JSC::mathProtoFuncLog): + (JSC::mathProtoFuncMax): + (JSC::mathProtoFuncMin): + (JSC::mathProtoFuncPow): + (JSC::mathProtoFuncRound): + (JSC::mathProtoFuncSin): + (JSC::mathProtoFuncSqrt): + (JSC::mathProtoFuncTan): + * runtime/NativeErrorConstructor.cpp: + (JSC::NativeErrorConstructor::construct): + * runtime/NumberConstructor.cpp: + (JSC::constructWithNumberConstructor): + (JSC::callNumberConstructor): + * runtime/NumberPrototype.cpp: + (JSC::numberProtoFuncToString): + (JSC::numberProtoFuncToFixed): + (JSC::numberProtoFuncToExponential): + (JSC::numberProtoFuncToPrecision): + * runtime/ObjectConstructor.cpp: + (JSC::constructObject): + * runtime/ObjectPrototype.cpp: + (JSC::objectProtoFuncHasOwnProperty): + (JSC::objectProtoFuncIsPrototypeOf): + (JSC::objectProtoFuncDefineGetter): + (JSC::objectProtoFuncDefineSetter): + (JSC::objectProtoFuncLookupGetter): + (JSC::objectProtoFuncLookupSetter): + (JSC::objectProtoFuncPropertyIsEnumerable): + * runtime/PropertySlot.h: + (JSC::PropertySlot::getValue): + * runtime/RegExpConstructor.cpp: + (JSC::constructRegExp): + * runtime/RegExpObject.cpp: + (JSC::RegExpObject::match): + * runtime/RegExpPrototype.cpp: + (JSC::regExpProtoFuncCompile): + * runtime/StringConstructor.cpp: + (JSC::stringFromCharCodeSlowCase): + (JSC::stringFromCharCode): + (JSC::constructWithStringConstructor): + (JSC::callStringConstructor): + * runtime/StringPrototype.cpp: + (JSC::stringProtoFuncReplace): + (JSC::stringProtoFuncCharAt): + (JSC::stringProtoFuncCharCodeAt): + (JSC::stringProtoFuncConcat): + (JSC::stringProtoFuncIndexOf): + (JSC::stringProtoFuncLastIndexOf): + (JSC::stringProtoFuncMatch): + (JSC::stringProtoFuncSearch): + (JSC::stringProtoFuncSlice): + (JSC::stringProtoFuncSplit): + (JSC::stringProtoFuncSubstr): + (JSC::stringProtoFuncSubstring): + (JSC::stringProtoFuncLocaleCompare): + (JSC::stringProtoFuncFontcolor): + (JSC::stringProtoFuncFontsize): + (JSC::stringProtoFuncAnchor): + (JSC::stringProtoFuncLink): + +2009-04-28 David Kilzer <ddkilzer@apple.com> + + A little more hardening for UString + + Reviewed by Maciej Stachowiak. + + Revised fix for <rdar://problem/5861045> in r42644. + + * runtime/UString.cpp: + (JSC::newCapacityWithOverflowCheck): Added. + (JSC::concatenate): Used newCapacityWithOverflowCheck(). + (JSC::UString::append): Ditto. + +2009-04-28 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + Bring back r42969, this time with correct codegen + + Add logic to the codegen for right shift to avoid jumping to a helper function + when shifting a small floating point value. + + * jit/JITArithmetic.cpp: + (isSSE2Present): + (JSC::JIT::compileFastArith_op_rshift): + (JSC::JIT::compileFastArithSlow_op_rshift): + +2009-04-28 Kevin Ollivier <kevino@theolliviers.com> + + wxMSW build fix. Switch JSCore build back to static. + + * API/JSBase.h: + * config.h: + * jscore.bkl: + +2009-04-28 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Build fix). + + Roll out r42969, due to hangs in build bot. + + * jit/JITArithmetic.cpp: + (JSC::JIT::compileFastArith_op_rshift): + (JSC::JIT::compileFastArithSlow_op_rshift): + (JSC::isSSE2Present): + +2009-04-28 Xan Lopez <xlopez@igalia.com> + + Unreviewed: fix distcheck build, add (even more) missing files to list. + + * GNUmakefile.am: + +2009-04-28 Oliver Hunt <oliver@apple.com> + + Reviewed by Geoff Garen. + + Improve performance of string indexing + + Add a cti_get_by_val_string function to specialise indexing into a string object. + This gives us a slight performance win on a number of string tests. + + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_op_get_by_val): + (JSC::JITStubs::cti_op_get_by_val_string): + * jit/JITStubs.h: + +2009-04-28 Oliver Hunt <oliver@apple.com> + + Reviewed by Geoff Garen. + + Improve performance of right shifts of large or otherwise floating point values. + + Add logic to the codegen for right shift to avoid jumping to a helper function + when shifting a small floating point value. + + * jit/JITArithmetic.cpp: + (isSSE2Present): Moved to the head of file. + (JSC::JIT::compileFastArith_op_rshift): + (JSC::JIT::compileFastArithSlow_op_rshift): + +2009-04-28 Xan Lopez <xlopez@igalia.com> + + Unreviewed: fix distcheck build, add (more) missing files to list. + + * GNUmakefile.am: + +2009-04-28 Xan Lopez <xlopez@igalia.com> + + Unreviewed: fix distcheck build, add missing header to file list. + + * GNUmakefile.am: + +2009-04-28 Gavin Barraclough <barraclough@apple.com> + + Rubber stamped by Maciej "Henry Morgan" Stachowiak. + + Enable YARR. + (Again.) + + * wtf/Platform.h: + +2009-04-27 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Maciej Stachowiak. + + Tweak a loop condition to keep GCC happy, + some GCCs seem to be having issues with this. :-/ + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::breakTarget): + * wtf/Platform.h: + +2009-04-27 Adam Roben <aroben@apple.com> + + Windows Debug build fix + + Not sure why the buildbots weren't affected by this problem. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Let VS + re-order the file list, and added JavaScriptCore[_debug].def to the + project. This was not necessary for the fix, but made making the fix + easier. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + Removed a function that no longer exists. + +2009-04-26 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Weinig Sam. + + Fix for https://bugs.webkit.org/show_bug.cgi?id=25416 + "Cached prototype accesses unsafely hoist property storage load above structure checks." + + Do not hoist the load of the pointer to the property storage array. + + No performance impact. + + * jit/JITPropertyAccess.cpp: + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdProtoList): + +2009-04-26 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoffrey "Gaffe or energy?" Garen. + + Randomize address requested by ExecutableAllocatorFixedVMPool. + + * jit/ExecutableAllocatorFixedVMPool.cpp: + (JSC::FixedVMPoolAllocator::FixedVMPoolAllocator): + +2009-04-26 Sam Weinig <sam@webkit.org> + + Reviewed by Eric Seidel. + + Remove scons-based build system. + + * JavaScriptCore.scons: Removed. + +2009-04-25 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Buildfix). + + Make HAVE_MADV_FREE darwin only for now + + * wtf/Platform.h: + +2009-04-25 Jan Michael Alonzo <jmalonzo@webkit.org> + + Reviewed by Oliver Hunt. + + Gtk build fix - check if we have MADV_FREE before using it. + + * interpreter/RegisterFile.cpp: + (JSC::RegisterFile::releaseExcessCapacity): + * wtf/Platform.h: + +2009-04-24 Kevin Ollivier <kevino@theolliviers.com> + + wx build fix. Switching JSCore from a static lib to a dynamic lib + to match the Apple build and fix symbol exports. + + * jscore.bkl: + +2009-04-24 Laszlo Gombos <laszlo.1.gombos@nokia.com> + + Rubber-stamped by Mark Rowe. + + https://bugs.webkit.org/show_bug.cgi?id=25337 + Move ThreadingQt.cpp under the qt directory. + + * JavaScriptCore.pri: + * wtf/ThreadingQt.cpp: Removed. + * wtf/qt/ThreadingQt.cpp: Copied from JavaScriptCore/wtf/ThreadingQt.cpp. + +2009-04-24 Laszlo Gombos <laszlo.1.gombos@nokia.com> + + Rubber-stamped by Mark Rowe. + + https://bugs.webkit.org/show_bug.cgi?id=25338 + Move ThreadingGtk.cpp under the gtk directory. + + * GNUmakefile.am: + * wtf/ThreadingGtk.cpp: Removed. + * wtf/gtk/ThreadingGtk.cpp: Copied from JavaScriptCore/wtf/ThreadingGtk.cpp. + +2009-04-24 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Sam "Wesley" Weinig. + + Improve performance to YARR interpreter. + (From about 3x slower than PCRE on regex-dna to about 30% slower). + + * yarr/RegexCompiler.cpp: + (JSC::Yarr::RegexPatternConstructor::setupAlternativeOffsets): + * yarr/RegexInterpreter.cpp: + (JSC::Yarr::Interpreter::checkCharacter): + (JSC::Yarr::Interpreter::checkCasedCharacter): + (JSC::Yarr::Interpreter::backtrackPatternCharacter): + (JSC::Yarr::Interpreter::backtrackPatternCasedCharacter): + (JSC::Yarr::Interpreter::matchParentheticalAssertionBegin): + (JSC::Yarr::Interpreter::matchParentheticalAssertionEnd): + (JSC::Yarr::Interpreter::backtrackParentheticalAssertionBegin): + (JSC::Yarr::Interpreter::backtrackParentheticalAssertionEnd): + (JSC::Yarr::Interpreter::matchDisjunction): + (JSC::Yarr::Interpreter::interpret): + (JSC::Yarr::ByteCompiler::atomPatternCharacter): + (JSC::Yarr::ByteCompiler::atomParenthesesSubpatternBegin): + (JSC::Yarr::ByteCompiler::atomParentheticalAssertionBegin): + (JSC::Yarr::ByteCompiler::closeAlternative): + (JSC::Yarr::ByteCompiler::closeBodyAlternative): + (JSC::Yarr::ByteCompiler::atomParenthesesEnd): + (JSC::Yarr::ByteCompiler::regexBegin): + (JSC::Yarr::ByteCompiler::regexEnd): + (JSC::Yarr::ByteCompiler::alterantiveBodyDisjunction): + (JSC::Yarr::ByteCompiler::alterantiveDisjunction): + (JSC::Yarr::ByteCompiler::emitDisjunction): + * yarr/RegexInterpreter.h: + (JSC::Yarr::ByteTerm::): + (JSC::Yarr::ByteTerm::ByteTerm): + (JSC::Yarr::ByteTerm::BodyAlternativeBegin): + (JSC::Yarr::ByteTerm::BodyAlternativeDisjunction): + (JSC::Yarr::ByteTerm::BodyAlternativeEnd): + (JSC::Yarr::ByteTerm::AlternativeBegin): + (JSC::Yarr::ByteTerm::AlternativeDisjunction): + (JSC::Yarr::ByteTerm::AlternativeEnd): + (JSC::Yarr::ByteTerm::SubpatternBegin): + (JSC::Yarr::ByteTerm::SubpatternEnd): + * yarr/RegexJIT.cpp: + (JSC::Yarr::RegexGenerator::generateParentheticalAssertion): + * yarr/RegexPattern.h: + +2009-04-24 Rob Raguet-Schofield <ragfield@gmail.com> + + Rubber-stamped by Mark Rowe. + + * wtf/CurrentTime.h: Fix a typo in a comment. + +2009-04-24 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Build fix). + + Add reinterpret_cast + + * interpreter/RegisterFile.cpp: + (JSC::RegisterFile::releaseExcessCapacity): + +2009-04-23 Oliver Hunt <oliver@apple.com> + + Reviewed by Geoff Garen. + + <rdar://problem/6050421> JavaScript register file should remap to release physical pages accumulated during deep recursion + + We now track the maximum extent of the RegisterFile, and when we reach the final + return from JS (so the stack portion of the registerfile becomes empty) we see + if that extent is greater than maxExcessCapacity. If it is we use madvise or + VirtualFree to release the physical pages that were backing the excess. + + * interpreter/RegisterFile.cpp: + (JSC::RegisterFile::releaseExcessCapacity): + * interpreter/RegisterFile.h: + (JSC::RegisterFile::RegisterFile): + (JSC::RegisterFile::shrink): + (JSC::RegisterFile::grow): + +2009-04-23 Mark Rowe <mrowe@apple.com> + + With great sadness and a heavy heart I switch us back from YARR to WREC in + order to restore greenness to the world once more. + + * wtf/Platform.h: + +2009-04-23 Mark Rowe <mrowe@apple.com> + + More Windows build fixage. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def: + +2009-04-23 Mark Rowe <mrowe@apple.com> + + Attempt to fix the Windows build. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: Remove a symbol that no longer exists. + +2009-04-23 Francisco Tolmasky <francisco@280north.com> + + BUG 24604: WebKit profiler reports incorrect total times + <https://bugs.webkit.org/show_bug.cgi?id=24604> + + Reviewed by Timothy Hatcher and Kevin McCullough. + + * JavaScriptCore.exp: + * JavaScriptCore.xcodeproj/project.pbxproj: + * profiler/CallIdentifier.h: + (JSC::CallIdentifier::Hash::hash): + (JSC::CallIdentifier::Hash::equal): + (JSC::CallIdentifier::hash): + (WTF::): + * profiler/HeavyProfile.cpp: Removed. + * profiler/HeavyProfile.h: Removed. + * profiler/Profile.cpp: No more need for TreeProfile/HeavyProfile + (JSC::Profile::create): + * profiler/Profile.h: + * profiler/ProfileNode.cpp: + * profiler/ProfileNode.h: + * profiler/TreeProfile.cpp: Removed. + * profiler/TreeProfile.h: Removed. + +2009-04-23 Gavin Barraclough <barraclough@apple.com> + + Not Reviewed. + + Speculative Windows build fix II. + + * yarr/RegexInterpreter.cpp: + +2009-04-23 Gavin Barraclough <barraclough@apple.com> + + Not Reviewed. + + Speculative Windows build fix. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * runtime/RegExp.cpp: + +2009-04-23 Gavin Barraclough <barraclough@apple.com> + + Rubber stamped by salty sea dogs Sam & Geoff. + + Enable YARR_JIT by default (where supported), replacing WREC. + + * wtf/Platform.h: + +2009-04-23 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff "Dread Pirate Roberts" Garen. + + Various small fixes to YARR JIT, in preparation for enabling it by default. + + * Correctly index into the callframe when storing restart addresses for + nested alternatives. + * Allow backtracking back into matched alternatives of parentheses. + * Fix callframe offset calculation for parenthetical assertions. + * When a set of parenthese are quantified with a fixed and variable portion, + and the variable portion is quantified once, this should not reset the + pattern match on failure to match (the last match from the firxed portion + should be preserved). + * Up the pattern size limit to match PCRE's new limit. + * Unlclosed parentheses should be reported with the message "missing )". + + * wtf/Platform.h: + * yarr/RegexCompiler.cpp: + (JSC::Yarr::RegexPatternConstructor::quantifyAtom): + (JSC::Yarr::RegexPatternConstructor::setupAlternativeOffsets): + * yarr/RegexInterpreter.cpp: + (JSC::Yarr::Interpreter::matchParentheses): + (JSC::Yarr::Interpreter::backtrackParentheses): + (JSC::Yarr::ByteCompiler::emitDisjunction): + * yarr/RegexJIT.cpp: + (JSC::Yarr::RegexGenerator::loadFromFrameAndJump): + (JSC::Yarr::RegexGenerator::generateParenthesesDisjunction): + (JSC::Yarr::RegexGenerator::generateParentheticalAssertion): + (JSC::Yarr::RegexGenerator::generateTerm): + (JSC::Yarr::executeRegex): + * yarr/RegexParser.h: + (JSC::Yarr::Parser::): + (JSC::Yarr::Parser::parseTokens): + (JSC::Yarr::Parser::parse): + * yarr/RegexPattern.h: + (JSC::Yarr::PatternTerm::): + (JSC::Yarr::PatternTerm::PatternTerm): + +2009-04-22 Mark Rowe <mrowe@apple.com> + + Rubber-stamped by Gavin Barraclough. + + Add the m_ prefix on FixedVMPoolAllocator's member variables, and fix typos in a few comments. + + * jit/ExecutableAllocatorFixedVMPool.cpp: + (JSC::FixedVMPoolAllocator::addToFreeList): + (JSC::FixedVMPoolAllocator::coalesceFreeSpace): + (JSC::FixedVMPoolAllocator::FixedVMPoolAllocator): + (JSC::FixedVMPoolAllocator::alloc): + (JSC::FixedVMPoolAllocator::free): + (JSC::FixedVMPoolAllocator::isWithinVMPool): + +2009-04-22 Mark Rowe <mrowe@apple.com> + + Rubber-stamped by Gavin Barraclough. + + Add some assertions to FixedVMPoolAllocator to guard against cases where we + attempt to free memory that didn't originate from the pool, or we attempt to + hand out a bogus address from alloc. + + * jit/ExecutableAllocatorFixedVMPool.cpp: + (JSC::FixedVMPoolAllocator::release): + (JSC::FixedVMPoolAllocator::FixedVMPoolAllocator): + (JSC::FixedVMPoolAllocator::alloc): + (JSC::FixedVMPoolAllocator::free): + (JSC::FixedVMPoolAllocator::isWithinVMPool): + +2009-04-22 Gavin Barraclough <barraclough@apple.com> + + Rubber stamped by Sam "Blackbeard" Weinig. + + Although pirates do spell the word 'generate' as 'genertate', + webkit developers do not. Fixertate. + + * yarr/RegexJIT.cpp: + (JSC::Yarr::RegexGenerator::generateAssertionBOL): + (JSC::Yarr::RegexGenerator::generateAssertionEOL): + (JSC::Yarr::RegexGenerator::generateAssertionWordBoundary): + (JSC::Yarr::RegexGenerator::generatePatternCharacterSingle): + (JSC::Yarr::RegexGenerator::generatePatternCharacterPair): + (JSC::Yarr::RegexGenerator::generatePatternCharacterFixed): + (JSC::Yarr::RegexGenerator::generatePatternCharacterGreedy): + (JSC::Yarr::RegexGenerator::generatePatternCharacterNonGreedy): + (JSC::Yarr::RegexGenerator::generateCharacterClassSingle): + (JSC::Yarr::RegexGenerator::generateCharacterClassFixed): + (JSC::Yarr::RegexGenerator::generateCharacterClassGreedy): + (JSC::Yarr::RegexGenerator::generateCharacterClassNonGreedy): + (JSC::Yarr::RegexGenerator::generateTerm): + +2009-04-22 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Sam "Blackbeard" Weinig. + + Improvements to YARR JIT. This patch expands support in three key areas: + * Add (temporary) support for falling back to PCRE for expressions not supported. + * Add support for x86_64 and Windows. + * Add support for singly quantified parentheses (? and ??), alternatives within + parentheses, and parenthetical assertions. + + * runtime/RegExp.cpp: + (JSC::RegExp::match): + * yarr/RegexJIT.cpp: + (JSC::Yarr::RegexGenerator::storeToFrame): + (JSC::Yarr::RegexGenerator::storeToFrameWithPatch): + (JSC::Yarr::RegexGenerator::loadFromFrameAndJump): + (JSC::Yarr::RegexGenerator::AlternativeBacktrackRecord::AlternativeBacktrackRecord): + (JSC::Yarr::RegexGenerator::TermGenerationState::resetAlternative): + (JSC::Yarr::RegexGenerator::TermGenerationState::resetTerm): + (JSC::Yarr::RegexGenerator::TermGenerationState::jumpToBacktrack): + (JSC::Yarr::RegexGenerator::TermGenerationState::plantJumpToBacktrackIfExists): + (JSC::Yarr::RegexGenerator::TermGenerationState::addBacktrackJump): + (JSC::Yarr::RegexGenerator::TermGenerationState::linkAlternativeBacktracks): + (JSC::Yarr::RegexGenerator::TermGenerationState::propagateBacktrackingFrom): + (JSC::Yarr::RegexGenerator::genertateAssertionBOL): + (JSC::Yarr::RegexGenerator::genertateAssertionEOL): + (JSC::Yarr::RegexGenerator::matchAssertionWordchar): + (JSC::Yarr::RegexGenerator::genertateAssertionWordBoundary): + (JSC::Yarr::RegexGenerator::genertatePatternCharacterSingle): + (JSC::Yarr::RegexGenerator::genertatePatternCharacterPair): + (JSC::Yarr::RegexGenerator::genertatePatternCharacterFixed): + (JSC::Yarr::RegexGenerator::genertatePatternCharacterGreedy): + (JSC::Yarr::RegexGenerator::genertatePatternCharacterNonGreedy): + (JSC::Yarr::RegexGenerator::genertateCharacterClassSingle): + (JSC::Yarr::RegexGenerator::genertateCharacterClassFixed): + (JSC::Yarr::RegexGenerator::genertateCharacterClassGreedy): + (JSC::Yarr::RegexGenerator::genertateCharacterClassNonGreedy): + (JSC::Yarr::RegexGenerator::generateParenthesesDisjunction): + (JSC::Yarr::RegexGenerator::generateParenthesesSingle): + (JSC::Yarr::RegexGenerator::generateParentheticalAssertion): + (JSC::Yarr::RegexGenerator::generateTerm): + (JSC::Yarr::RegexGenerator::generateDisjunction): + (JSC::Yarr::RegexGenerator::generateEnter): + (JSC::Yarr::RegexGenerator::generateReturn): + (JSC::Yarr::RegexGenerator::RegexGenerator): + (JSC::Yarr::RegexGenerator::generate): + (JSC::Yarr::RegexGenerator::compile): + (JSC::Yarr::RegexGenerator::generationFailed): + (JSC::Yarr::jitCompileRegex): + (JSC::Yarr::executeRegex): + * yarr/RegexJIT.h: + (JSC::Yarr::RegexCodeBlock::RegexCodeBlock): + (JSC::Yarr::RegexCodeBlock::~RegexCodeBlock): + +2009-04-22 Sam Weinig <sam@webkit.org> + + Rubber-stamped by Darin Adler. + + Fix for <rdar://problem/6816957> + Turn off Geolocation by default + + * Configurations/FeatureDefines.xcconfig: + +2009-04-22 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Buildfix). + + * interpreter/CachedCall.h: + +2009-04-21 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Build fix). + + * runtime/StringPrototype.cpp: + +2009-04-21 Oliver Hunt <oliver@apple.com> + + Reviewed by Maciej Stachowiak. + + Improve String.replace performance slightly + + Apply our vm reentry caching logic to String.replace with global + regexes. + + * runtime/StringPrototype.cpp: + (JSC::stringProtoFuncReplace): + +2009-04-21 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Cameron Zwarich and Oliver Hunt. + + Re-Fixed <rdar://problem/6406045> REGRESSION: Stack overflow on PowerPC on + fast/workers/use-machine-stack.html (22531) + + SunSpider reports no change. + + Use a larger recursion limit on the main thread (because we can, and + there's some evidence that it may improve compatibility), and a smaller + recursion limit on secondary threads (because they tend to have smaller + stacks). + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::execute): + (JSC::Interpreter::prepareForRepeatCall): + * interpreter/Interpreter.h: + (JSC::): Ditto. I wrote the recursion test slightly funny, so that the + common case remains a simple compare to constant. + + * runtime/ArrayPrototype.cpp: + (JSC::arrayProtoFuncToString): + (JSC::arrayProtoFuncToLocaleString): + (JSC::arrayProtoFuncJoin): Conservatively, set the array recursion limits + to the lower, secondary thread limit. We can do something fancier if + compatibility moves us, but this seems sufficient for now. + +2009-04-21 Geoffrey Garen <ggaren@apple.com> + + Rubber-stamped by Adam Roben. + + Disabled one more Mozilla JS test because it fails intermittently on Windows. + (See https://bugs.webkit.org/show_bug.cgi?id=25160.) + + * tests/mozilla/expected.html: + +2009-04-21 Adam Roben <aroben@apple.com> + + Rename JavaScriptCore_debug.dll to JavaScriptCore.dll in the Debug + configuration + + This matches the naming scheme for WebKit.dll, and will be necessary + once Safari links against JavaScriptCore.dll. This change also causes + run-safari not to fail (because the launcher printed by FindSafari was + always looking for JavaScriptCore.dll, never + JavaScriptCore_debug.dll). + + Part of Bug 25305: can't run safari or drt on windows + <https://bugs.webkit.org/show_bug.cgi?id=25305> + + Reviewed by Steve Falkenburg and Sam Weinig. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.vcproj/jsc/jsc.vcproj: + * JavaScriptCore.vcproj/testapi/testapi.vcproj: + Use $(WebKitDLLConfigSuffix) for naming JavaScriptCore.{dll,lib}. + +2009-04-21 Adam Roben <aroben@apple.com> + + Fix JavaScriptCore build on VC++ Express + + Reviewed by Steve Falkenburg and Sam Weinig. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Link + explicitly against gdi32.lib and oleaut32.lib. + +2009-04-21 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Mark Rowe. + + Tiger crash fix: Put VM tags in their own header file, and fixed up the + #ifdefs so they're not used on Tiger. + + * JavaScriptCore.xcodeproj/project.pbxproj: + * interpreter/RegisterFile.h: + (JSC::RegisterFile::RegisterFile): + * jit/ExecutableAllocatorFixedVMPool.cpp: + (JSC::FixedVMPoolAllocator::FixedVMPoolAllocator): + * jit/ExecutableAllocatorPosix.cpp: + (JSC::ExecutablePool::systemAlloc): + * runtime/Collector.cpp: + (JSC::allocateBlock): + * wtf/VMTags.h: Added. + +2009-04-20 Steve Falkenburg <sfalken@apple.com> + + More Windows build fixes. + + * JavaScriptCore.vcproj/JavaScriptCore.make: Copy DLLs, PDBs. + * JavaScriptCore.vcproj/JavaScriptCore.resources: Added. + * JavaScriptCore.vcproj/JavaScriptCore.resources/Info.plist: Added. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.rc: Added. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Add version stamping, resource copying. + +2009-04-20 Steve Falkenburg <sfalken@apple.com> + + Separate JavaScriptCore.dll from WebKit.dll. + Slight performance improvement or no change on benchmarks. + + Allows us to break a circular dependency between CFNetwork and WebKit on Windows, + and simplifies standalone JavaScriptCore builds. + + Reviewed by Oliver Hunt. + + * API/JSBase.h: Export symbols with JS_EXPORT when using MSVC. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.vcproj/WTF/WTF.vcproj: Build JavaScriptCore as a DLL instead of a static library. + * config.h: Specify __declspec(dllexport/dllimport) appropriately when exporting data. + * runtime/InternalFunction.h: Specify JS_EXPORTDATA on exported data. + * runtime/JSArray.h: Specify JS_EXPORTDATA on exported data. + * runtime/JSFunction.h: Specify JS_EXPORTDATA on exported data. + * runtime/StringObject.h: Specify JS_EXPORTDATA on exported data. + * runtime/UString.h: Specify JS_EXPORTDATA on exported data. + +2009-04-20 Sam Weinig <sam@webkit.org> + + Reviewed by Kevin McCullough. + + Always tag mmaped memory on darwin and clean up #defines + now that they are a little bigger. + + * interpreter/RegisterFile.h: + (JSC::RegisterFile::RegisterFile): + * jit/ExecutableAllocatorFixedVMPool.cpp: + (JSC::FixedVMPoolAllocator::FixedVMPoolAllocator): + * jit/ExecutableAllocatorPosix.cpp: + (JSC::ExecutablePool::systemAlloc): + * runtime/Collector.cpp: + (JSC::allocateBlock): + +2009-04-20 Sam Weinig <sam@webkit.org> + + Rubber-stamped by Tim Hatcher. + + Add licenses for xcconfig files. + + * Configurations/Base.xcconfig: + * Configurations/DebugRelease.xcconfig: + * Configurations/FeatureDefines.xcconfig: + * Configurations/JavaScriptCore.xcconfig: + * Configurations/Version.xcconfig: + +2009-04-20 Ariya Hidayat <ariya.hidayat@nokia.com> + + Build fix for Qt port (after r42646). Not reviewed. + + * wtf/unicode/qt4/UnicodeQt4.h: Added U16_PREV. + +2009-04-19 Sam Weinig <sam@webkit.org> + + Reviewed by Darin Adler. + + Better fix for JSStringCreateWithCFString hardening. + + * API/JSStringRefCF.cpp: + (JSStringCreateWithCFString): + +2009-04-19 Sam Weinig <sam@webkit.org> + + Reviewed by Dan Bernstein. + + Fix for <rdar://problem/5860954> + Harden JSStringCreateWithCFString against malformed CFStringRefs. + + * API/JSStringRefCF.cpp: + (JSStringCreateWithCFString): + +2009-04-19 David Kilzer <ddkilzer@apple.com> + + Make FEATURE_DEFINES completely dynamic + + Reviewed by Darin Adler. + + Make FEATURE_DEFINES depend on individual ENABLE_FEATURE_NAME + variables for each feature, making it possible to remove all + knowledge of FEATURE_DEFINES from build-webkit. + + * Configurations/FeatureDefines.xcconfig: Extract a variable + from FEATURE_DEFINES for each feature setting. + +2009-04-18 Sam Weinig <sam@webkit.org> + + Reviewed by Dan Bernstein. + + Fix typo. s/VM_MEMORY_JAVASCRIPT_JIT_REGISTER_FILE/VM_MEMORY_JAVASCRIPT_CORE/ + + * runtime/Collector.cpp: + (JSC::allocateBlock): Fix bozo typo. + +2009-04-18 Sam Weinig <sam@webkit.org> + + Reviewed by Anders Carlsson. + + Fix for <rdar://problem/6801555> Tag JavaScript memory on SnowLeopard + + * interpreter/RegisterFile.h: + (JSC::RegisterFile::RegisterFile): + * jit/ExecutableAllocatorFixedVMPool.cpp: + (JSC::FixedVMPoolAllocator::FixedVMPoolAllocator): + * jit/ExecutableAllocatorPosix.cpp: + (JSC::ExecutablePool::systemAlloc): + * runtime/Collector.cpp: + (JSC::allocateBlock): + +2009-04-18 Drew Wilson <amw@apple.com> + + <rdar://problem/6781407> VisiblePosition.characterAfter should return UChar32 + + Reviewed by Dan Bernstein. + + * wtf/unicode/icu/UnicodeIcu.h: + (WTF::Unicode::hasLineBreakingPropertyComplexContextOrIdeographic): Added. + +2009-04-18 Sam Weinig <sam@webkit.org> + + Reviewed by Mark Rowe. + + Fix for <rdar://problem/5861045> + A little bit of hardening for UString. + + * runtime/UString.cpp: + (JSC::concatenate): + (JSC::UString::append): + +2009-04-18 Sam Weinig <sam@webkit.org> + + Reviewed by Mark Rowe and Dan Bernstein. + + Fix for <rdar://problem/5861188> + A little bit of hardening for Vector. + + * wtf/Vector.h: + (WTF::Vector<T, inlineCapacity>::append): + (WTF::Vector<T, inlineCapacity>::insert): + +2009-04-17 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + On x86_64, make all JIT-code allocations from a new heap, managed + by FixedVMPoolAllocator. This class allocates a single large (2Gb) + pool of virtual memory from which all further allocations take place. + Since all JIT code is allocated from this pool, we can continue to + safely assume (as is already asserted) that it will always be possible + to link any JIT-code to JIT-code jumps and calls. + + * JavaScriptCore.xcodeproj/project.pbxproj: + Add new file. + * jit/ExecutableAllocatorFixedVMPool.cpp: Added. + (JSC::FreeListEntry::FreeListEntry): + (JSC::AVLTreeAbstractorForFreeList::get_less): + (JSC::AVLTreeAbstractorForFreeList::set_less): + (JSC::AVLTreeAbstractorForFreeList::get_greater): + (JSC::AVLTreeAbstractorForFreeList::set_greater): + (JSC::AVLTreeAbstractorForFreeList::get_balance_factor): + (JSC::AVLTreeAbstractorForFreeList::set_balance_factor): + (JSC::AVLTreeAbstractorForFreeList::null): + (JSC::AVLTreeAbstractorForFreeList::compare_key_key): + (JSC::AVLTreeAbstractorForFreeList::compare_key_node): + (JSC::AVLTreeAbstractorForFreeList::compare_node_node): + (JSC::sortFreeListEntriesByPointer): + (JSC::sortCommonSizedAllocations): + (JSC::FixedVMPoolAllocator::release): + (JSC::FixedVMPoolAllocator::reuse): + (JSC::FixedVMPoolAllocator::addToFreeList): + (JSC::FixedVMPoolAllocator::coalesceFreeSpace): + (JSC::FixedVMPoolAllocator::FixedVMPoolAllocator): + (JSC::FixedVMPoolAllocator::alloc): + (JSC::FixedVMPoolAllocator::free): + (JSC::ExecutableAllocator::intializePageSize): + (JSC::ExecutablePool::systemAlloc): + (JSC::ExecutablePool::systemRelease): + The new 2Gb heap class! + * jit/ExecutableAllocatorPosix.cpp: + Disable use of this implementation on x86_64. + * wtf/AVLTree.h: + Add missing variable initialization. + (WTF::::remove): + +2009-04-17 Oliver Hunt <oliver@apple.com> + + Reviewed by Darin Adler. + + Fix bug where the VM reentry cache would not correctly unroll the cached callframe + + Fix a check that was intended to mark a cached call as invalid when the callframe could + not be constructed. Instead it was just checking that there was a place to put the + exception. This eventually results in a non-recoverable RegisterFile starvation. + + * interpreter/CachedCall.h: + (JSC::CachedCall::CachedCall): + (JSC::CachedCall::call): add assertion to ensure we don't use a bad callframe + +2009-04-17 David Kilzer <ddkilzer@apple.com> + + Simplify FEATURE_DEFINES definition + + Reviewed by Darin Adler. + + This moves FEATURE_DEFINES and its related ENABLE_FEATURE_NAME + variables to their own FeatureDefines.xcconfig file. It also + extracts a new ENABLE_GEOLOCATION variable so that + FEATURE_DEFINES only needs to be defined once. + + * Configurations/FeatureDefines.xcconfig: Added. + * Configurations/JavaScriptCore.xcconfig: Removed definition of + ENABLE_SVG_DOM_OBJC_BINDINGS and FEATURE_DEFINES. Added include + of FeatureDefines.xcconfig. + * JavaScriptCore.xcodeproj/project.pbxproj: Added + FeatureDefines.xcconfig file. + +2009-04-08 Mihnea Ovidenie <mihnea@adobe.com> + + Reviewed by Oliver Hunt. + + Bug 25027: JavaScript parseInt wrong on negative numbers + <https://bugs.webkit.org/show_bug.cgi?id=25027> + + When dealing with negative numbers, parseInt should use ceil instead of floor. + + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::globalFuncParseInt): + +2009-04-16 Stephanie Lewis <slewis@apple.com> + + Reviewed by Oliver Hunt. + + <rdar://problem/6744652> 32-bit to 64-bit: Javascript hash tables double in size + + Remove perfect hash optimization which removes 1 MB of overhead on 32-bit and almost 2 MB on 64-bit. Removing the optimization was not a regression on SunSpider and the acid 3 test still passes. + + * create_hash_table: + * runtime/Lookup.cpp: + (JSC::HashTable::createTable): + (JSC::HashTable::deleteTable): + * runtime/Lookup.h: + (JSC::HashEntry::initialize): + (JSC::HashEntry::next): + (JSC::HashTable::entry): + * runtime/Structure.cpp: + (JSC::Structure::getEnumerableNamesFromClassInfoTable): + +2009-04-16 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + Fix subtle error in optimised VM reentry in Array.sort + + Basically to ensure we don't accidentally invalidate the cached callframe + we should be using the cached callframe rather than our own exec state. + While the old behaviour was wrong i have been unable to actually create a + test case where anything actually ends up going wrong. + + * interpreter/CachedCall.h: + (JSC::CachedCall::newCallFrame): + * runtime/JSArray.cpp: + (JSC::AVLTreeAbstractorForArrayCompare::compare_key_key): + +2009-04-16 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + Optimise op_resolve_base + + If we can statically find a property we are trying to resolve + the base of, the base is guaranteed to be the global object. + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitResolveBase): + +2009-04-16 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + Improve performance of read-write-modify operators + + Implement cross scope optimisation for read-write-modify + operators, to avoid unnecessary calls to property resolve + helper functions. + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::BytecodeGenerator): + (JSC::BytecodeGenerator::emitLoadGlobalObject): + (JSC::BytecodeGenerator::emitResolveWithBase): + * bytecompiler/BytecodeGenerator.h: + +2009-04-16 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + Improve performance of remaining array enumeration functions + + Make use of function entry cache for remaining Array enumeration functions. + + * runtime/ArrayPrototype.cpp: + (JSC::arrayProtoFuncMap): + (JSC::arrayProtoFuncEvery): + (JSC::arrayProtoFuncForEach): + (JSC::arrayProtoFuncSome): + +2009-04-15 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + Improve performance of Array.sort + + Cache the VM entry for Array.sort when using a JS comparison function. + + * runtime/JSArray.cpp: + (JSC::AVLTreeAbstractorForArrayCompare::compare_key_key): + (JSC::JSArray::sort): + +2009-04-15 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + Bug 25229: Need support for Array.prototype.reduceRight + <https://bugs.webkit.org/show_bug.cgi?id=25229> + + Implement Array.reduceRight + + * runtime/ArrayPrototype.cpp: + (JSC::arrayProtoFuncReduceRight): + +2009-04-15 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + Bug 25227: Array.filter triggers an assertion when the target array shrinks while being filtered + <https://bugs.webkit.org/show_bug.cgi?id=25227> + + We correct this simply by making the fast array path fall back on the slow path if + we ever discover the fast access is unsafe. + + * runtime/ArrayPrototype.cpp: + (JSC::arrayProtoFuncFilter): + +2009-04-13 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + Bug 25159: Support Array.prototype.reduce + <https://bugs.webkit.org/show_bug.cgi?id=25159> + + Implement Array.prototype.reduce + + * runtime/ArrayPrototype.cpp: + (JSC::arrayProtoFuncReduce): + +2009-04-15 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Build fix). + + Move CallFrameClosure from inside the Interpreter class to its own file. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * interpreter/CachedCall.h: + * interpreter/CallFrameClosure.h: Copied from JavaScriptCore/yarr/RegexJIT.h. + (JSC::CallFrameClosure::setArgument): + (JSC::CallFrameClosure::resetCallFrame): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::prepareForRepeatCall): + * interpreter/Interpreter.h: + +2009-04-14 Oliver Hunt <oliver@apple.com> + + Reviewed by Cameron Zwarich. + + Bug 25202: Improve performance of repeated callbacks into the VM + + Add the concept of a CachedCall to native code for use in Array + prototype and similar functions where a single callback function + is called repeatedly with the same number of arguments. + + Used Array.prototype.filter as the test function and got a 50% win + over a naive non-caching specialised version. This makes the native + implementation of Array.prototype.filter faster than the JS one once + more. + + * JavaScriptCore.vcproj/JavaScriptCore.sln: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * interpreter/CachedCall.h: Added. + (JSC::CachedCall::CachedCall): + (JSC::CachedCall::call): + (JSC::CachedCall::setThis): + (JSC::CachedCall::setArgument): + (JSC::CachedCall::~CachedCall): + CachedCall is a wrapper that automates the calling and teardown + for a CallFrameClosure + * interpreter/CallFrame.h: + * interpreter/Interpreter.cpp: + (JSC::Interpreter::prepareForRepeatCall): + Create the basic entry closure for a function + (JSC::Interpreter::execute): + A new ::execute method to enter the interpreter from a closure + (JSC::Interpreter::endRepeatCall): + Clear the entry closure + * interpreter/Interpreter.h: + (JSC::Interpreter::CallFrameClosure::setArgument): + (JSC::Interpreter::CallFrameClosure::resetCallFrame): + Helper functions to simplify setting up the closure's callframe + * runtime/ArrayPrototype.cpp: + (JSC::arrayProtoFuncFilter): + +2009-04-14 Xan Lopez <xlopez@igalia.com> + + Fix the build. + + Add the yarr headers (and only the headers) to the build, so that + RegExp.cpp can compile. The headers are ifdefed out with yarr + disabled, so we don't need anything else for now. + + * GNUmakefile.am: + +2009-04-14 Adam Roben <aroben@apple.com> + + Remove support for profile-guided optimization on Windows + + Rubber-stamped by Steve Falkenburg. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Removed + the Release_PGO configuration. Also let VS re-order the source files + list. + +2009-04-14 Xan Lopez <xlopez@igalia.com> + + Unreviewed build fix. + + * GNUmakefile.am: + +2009-04-14 Jan Michael Alonzo <jmalonzo@webkit.org> + + Gtk build fix when building minidom. Not reviewed. + + Use C-style comment instead of C++ style since autotools builds + minidom using gcc and not g++. + + * wtf/Platform.h: + +2009-04-14 Gavin Barraclough <barraclough@apple.com> + + Reviewed by NOBODY - speculative build fix. + + * runtime/RegExp.h: + +2009-04-13 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Cap'n Geoff Garen. + + Yarr! + (Yet another regex runtime). + + Currently disabled by default since the interpreter, whilst awesomely + functional, has not been optimized and is likely slower than PCRE, and + the JIT, whilst faster than WREC, is presently incomplete and does not + fallback to using an interpreter for the cases it cannot handle. + + * JavaScriptCore.xcodeproj/project.pbxproj: + * assembler/MacroAssemblerX86Common.h: + (JSC::MacroAssemblerX86Common::move): + (JSC::MacroAssemblerX86Common::swap): + (JSC::MacroAssemblerX86Common::signExtend32ToPtr): + (JSC::MacroAssemblerX86Common::zeroExtend32ToPtr): + (JSC::MacroAssemblerX86Common::branch32): + (JSC::MacroAssemblerX86Common::branch16): + * assembler/X86Assembler.h: + (JSC::X86Assembler::cmpw_im): + (JSC::X86Assembler::testw_rr): + (JSC::X86Assembler::X86InstructionFormatter::immediate16): + * runtime/RegExp.cpp: + (JSC::RegExp::RegExp): + (JSC::RegExp::~RegExp): + (JSC::RegExp::create): + (JSC::RegExp::compile): + (JSC::RegExp::match): + * runtime/RegExp.h: + * wtf/Platform.h: + * yarr: Added. + * yarr/RegexCompiler.cpp: Added. + (JSC::Yarr::CharacterClassConstructor::CharacterClassConstructor): + (JSC::Yarr::CharacterClassConstructor::reset): + (JSC::Yarr::CharacterClassConstructor::append): + (JSC::Yarr::CharacterClassConstructor::putChar): + (JSC::Yarr::CharacterClassConstructor::isUnicodeUpper): + (JSC::Yarr::CharacterClassConstructor::isUnicodeLower): + (JSC::Yarr::CharacterClassConstructor::putRange): + (JSC::Yarr::CharacterClassConstructor::charClass): + (JSC::Yarr::CharacterClassConstructor::addSorted): + (JSC::Yarr::CharacterClassConstructor::addSortedRange): + (JSC::Yarr::newlineCreate): + (JSC::Yarr::digitsCreate): + (JSC::Yarr::spacesCreate): + (JSC::Yarr::wordcharCreate): + (JSC::Yarr::nondigitsCreate): + (JSC::Yarr::nonspacesCreate): + (JSC::Yarr::nonwordcharCreate): + (JSC::Yarr::RegexPatternConstructor::RegexPatternConstructor): + (JSC::Yarr::RegexPatternConstructor::~RegexPatternConstructor): + (JSC::Yarr::RegexPatternConstructor::reset): + (JSC::Yarr::RegexPatternConstructor::assertionBOL): + (JSC::Yarr::RegexPatternConstructor::assertionEOL): + (JSC::Yarr::RegexPatternConstructor::assertionWordBoundary): + (JSC::Yarr::RegexPatternConstructor::atomPatternCharacter): + (JSC::Yarr::RegexPatternConstructor::atomBuiltInCharacterClass): + (JSC::Yarr::RegexPatternConstructor::atomCharacterClassBegin): + (JSC::Yarr::RegexPatternConstructor::atomCharacterClassAtom): + (JSC::Yarr::RegexPatternConstructor::atomCharacterClassRange): + (JSC::Yarr::RegexPatternConstructor::atomCharacterClassBuiltIn): + (JSC::Yarr::RegexPatternConstructor::atomCharacterClassEnd): + (JSC::Yarr::RegexPatternConstructor::atomParenthesesSubpatternBegin): + (JSC::Yarr::RegexPatternConstructor::atomParentheticalAssertionBegin): + (JSC::Yarr::RegexPatternConstructor::atomParenthesesEnd): + (JSC::Yarr::RegexPatternConstructor::atomBackReference): + (JSC::Yarr::RegexPatternConstructor::copyDisjunction): + (JSC::Yarr::RegexPatternConstructor::copyTerm): + (JSC::Yarr::RegexPatternConstructor::quantifyAtom): + (JSC::Yarr::RegexPatternConstructor::disjunction): + (JSC::Yarr::RegexPatternConstructor::regexBegin): + (JSC::Yarr::RegexPatternConstructor::regexEnd): + (JSC::Yarr::RegexPatternConstructor::regexError): + (JSC::Yarr::RegexPatternConstructor::setupAlternativeOffsets): + (JSC::Yarr::RegexPatternConstructor::setupDisjunctionOffsets): + (JSC::Yarr::RegexPatternConstructor::setupOffsets): + (JSC::Yarr::compileRegex): + * yarr/RegexCompiler.h: Added. + * yarr/RegexInterpreter.cpp: Added. + (JSC::Yarr::Interpreter::appendParenthesesDisjunctionContext): + (JSC::Yarr::Interpreter::popParenthesesDisjunctionContext): + (JSC::Yarr::Interpreter::DisjunctionContext::DisjunctionContext): + (JSC::Yarr::Interpreter::DisjunctionContext::operator new): + (JSC::Yarr::Interpreter::allocDisjunctionContext): + (JSC::Yarr::Interpreter::freeDisjunctionContext): + (JSC::Yarr::Interpreter::ParenthesesDisjunctionContext::ParenthesesDisjunctionContext): + (JSC::Yarr::Interpreter::ParenthesesDisjunctionContext::operator new): + (JSC::Yarr::Interpreter::ParenthesesDisjunctionContext::restoreOutput): + (JSC::Yarr::Interpreter::ParenthesesDisjunctionContext::getDisjunctionContext): + (JSC::Yarr::Interpreter::allocParenthesesDisjunctionContext): + (JSC::Yarr::Interpreter::freeParenthesesDisjunctionContext): + (JSC::Yarr::Interpreter::InputStream::InputStream): + (JSC::Yarr::Interpreter::InputStream::next): + (JSC::Yarr::Interpreter::InputStream::rewind): + (JSC::Yarr::Interpreter::InputStream::read): + (JSC::Yarr::Interpreter::InputStream::readChecked): + (JSC::Yarr::Interpreter::InputStream::reread): + (JSC::Yarr::Interpreter::InputStream::prev): + (JSC::Yarr::Interpreter::InputStream::getPos): + (JSC::Yarr::Interpreter::InputStream::setPos): + (JSC::Yarr::Interpreter::InputStream::atStart): + (JSC::Yarr::Interpreter::InputStream::atEnd): + (JSC::Yarr::Interpreter::InputStream::checkInput): + (JSC::Yarr::Interpreter::InputStream::uncheckInput): + (JSC::Yarr::Interpreter::testCharacterClass): + (JSC::Yarr::Interpreter::tryConsumeCharacter): + (JSC::Yarr::Interpreter::checkCharacter): + (JSC::Yarr::Interpreter::tryConsumeCharacterClass): + (JSC::Yarr::Interpreter::checkCharacterClass): + (JSC::Yarr::Interpreter::tryConsumeBackReference): + (JSC::Yarr::Interpreter::matchAssertionBOL): + (JSC::Yarr::Interpreter::matchAssertionEOL): + (JSC::Yarr::Interpreter::matchAssertionWordBoundary): + (JSC::Yarr::Interpreter::matchPatternCharacter): + (JSC::Yarr::Interpreter::backtrackPatternCharacter): + (JSC::Yarr::Interpreter::matchCharacterClass): + (JSC::Yarr::Interpreter::backtrackCharacterClass): + (JSC::Yarr::Interpreter::matchBackReference): + (JSC::Yarr::Interpreter::backtrackBackReference): + (JSC::Yarr::Interpreter::recordParenthesesMatch): + (JSC::Yarr::Interpreter::resetMatches): + (JSC::Yarr::Interpreter::resetAssertionMatches): + (JSC::Yarr::Interpreter::parenthesesDoBacktrack): + (JSC::Yarr::Interpreter::matchParenthesesOnceBegin): + (JSC::Yarr::Interpreter::matchParenthesesOnceEnd): + (JSC::Yarr::Interpreter::backtrackParenthesesOnceBegin): + (JSC::Yarr::Interpreter::backtrackParenthesesOnceEnd): + (JSC::Yarr::Interpreter::matchParentheticalAssertionOnceBegin): + (JSC::Yarr::Interpreter::matchParentheticalAssertionOnceEnd): + (JSC::Yarr::Interpreter::backtrackParentheticalAssertionOnceBegin): + (JSC::Yarr::Interpreter::backtrackParentheticalAssertionOnceEnd): + (JSC::Yarr::Interpreter::matchParentheses): + (JSC::Yarr::Interpreter::backtrackParentheses): + (JSC::Yarr::Interpreter::matchTerm): + (JSC::Yarr::Interpreter::backtrackTerm): + (JSC::Yarr::Interpreter::matchAlternative): + (JSC::Yarr::Interpreter::matchDisjunction): + (JSC::Yarr::Interpreter::matchNonZeroDisjunction): + (JSC::Yarr::Interpreter::interpret): + (JSC::Yarr::Interpreter::Interpreter): + (JSC::Yarr::ByteCompiler::ParenthesesStackEntry::ParenthesesStackEntry): + (JSC::Yarr::ByteCompiler::ByteCompiler): + (JSC::Yarr::ByteCompiler::compile): + (JSC::Yarr::ByteCompiler::checkInput): + (JSC::Yarr::ByteCompiler::assertionBOL): + (JSC::Yarr::ByteCompiler::assertionEOL): + (JSC::Yarr::ByteCompiler::assertionWordBoundary): + (JSC::Yarr::ByteCompiler::atomPatternCharacter): + (JSC::Yarr::ByteCompiler::atomCharacterClass): + (JSC::Yarr::ByteCompiler::atomBackReference): + (JSC::Yarr::ByteCompiler::atomParenthesesSubpatternBegin): + (JSC::Yarr::ByteCompiler::atomParentheticalAssertionBegin): + (JSC::Yarr::ByteCompiler::popParenthesesStack): + (JSC::Yarr::ByteCompiler::dumpDisjunction): + (JSC::Yarr::ByteCompiler::closeAlternative): + (JSC::Yarr::ByteCompiler::atomParenthesesEnd): + (JSC::Yarr::ByteCompiler::regexBegin): + (JSC::Yarr::ByteCompiler::regexEnd): + (JSC::Yarr::ByteCompiler::alterantiveDisjunction): + (JSC::Yarr::ByteCompiler::emitDisjunction): + (JSC::Yarr::byteCompileRegex): + (JSC::Yarr::interpretRegex): + * yarr/RegexInterpreter.h: Added. + (JSC::Yarr::ByteTerm::): + (JSC::Yarr::ByteTerm::ByteTerm): + (JSC::Yarr::ByteTerm::BOL): + (JSC::Yarr::ByteTerm::CheckInput): + (JSC::Yarr::ByteTerm::EOL): + (JSC::Yarr::ByteTerm::WordBoundary): + (JSC::Yarr::ByteTerm::BackReference): + (JSC::Yarr::ByteTerm::AlternativeBegin): + (JSC::Yarr::ByteTerm::AlternativeDisjunction): + (JSC::Yarr::ByteTerm::AlternativeEnd): + (JSC::Yarr::ByteTerm::PatternEnd): + (JSC::Yarr::ByteTerm::invert): + (JSC::Yarr::ByteTerm::capture): + (JSC::Yarr::ByteDisjunction::ByteDisjunction): + (JSC::Yarr::BytecodePattern::BytecodePattern): + (JSC::Yarr::BytecodePattern::~BytecodePattern): + * yarr/RegexJIT.cpp: Added. + (JSC::Yarr::RegexGenerator::optimizeAlternative): + (JSC::Yarr::RegexGenerator::matchCharacterClassRange): + (JSC::Yarr::RegexGenerator::matchCharacterClass): + (JSC::Yarr::RegexGenerator::jumpIfNoAvailableInput): + (JSC::Yarr::RegexGenerator::jumpIfAvailableInput): + (JSC::Yarr::RegexGenerator::checkInput): + (JSC::Yarr::RegexGenerator::atEndOfInput): + (JSC::Yarr::RegexGenerator::notAtEndOfInput): + (JSC::Yarr::RegexGenerator::jumpIfCharEquals): + (JSC::Yarr::RegexGenerator::jumpIfCharNotEquals): + (JSC::Yarr::RegexGenerator::readCharacter): + (JSC::Yarr::RegexGenerator::storeToFrame): + (JSC::Yarr::RegexGenerator::loadFromFrame): + (JSC::Yarr::RegexGenerator::TermGenerationState::TermGenerationState): + (JSC::Yarr::RegexGenerator::TermGenerationState::resetAlternative): + (JSC::Yarr::RegexGenerator::TermGenerationState::alternativeValid): + (JSC::Yarr::RegexGenerator::TermGenerationState::nextAlternative): + (JSC::Yarr::RegexGenerator::TermGenerationState::alternative): + (JSC::Yarr::RegexGenerator::TermGenerationState::resetTerm): + (JSC::Yarr::RegexGenerator::TermGenerationState::termValid): + (JSC::Yarr::RegexGenerator::TermGenerationState::nextTerm): + (JSC::Yarr::RegexGenerator::TermGenerationState::term): + (JSC::Yarr::RegexGenerator::TermGenerationState::lookaheadTerm): + (JSC::Yarr::RegexGenerator::TermGenerationState::isSinglePatternCharacterLookaheadTerm): + (JSC::Yarr::RegexGenerator::TermGenerationState::inputOffset): + (JSC::Yarr::RegexGenerator::TermGenerationState::jumpToBacktrack): + (JSC::Yarr::RegexGenerator::TermGenerationState::setBacktrackGenerated): + (JSC::Yarr::RegexGenerator::jumpToBacktrackCheckEmitPending): + (JSC::Yarr::RegexGenerator::genertateAssertionBOL): + (JSC::Yarr::RegexGenerator::genertateAssertionEOL): + (JSC::Yarr::RegexGenerator::matchAssertionWordchar): + (JSC::Yarr::RegexGenerator::genertateAssertionWordBoundary): + (JSC::Yarr::RegexGenerator::genertatePatternCharacterSingle): + (JSC::Yarr::RegexGenerator::genertatePatternCharacterPair): + (JSC::Yarr::RegexGenerator::genertatePatternCharacterFixed): + (JSC::Yarr::RegexGenerator::genertatePatternCharacterGreedy): + (JSC::Yarr::RegexGenerator::genertatePatternCharacterNonGreedy): + (JSC::Yarr::RegexGenerator::genertateCharacterClassSingle): + (JSC::Yarr::RegexGenerator::genertateCharacterClassFixed): + (JSC::Yarr::RegexGenerator::genertateCharacterClassGreedy): + (JSC::Yarr::RegexGenerator::genertateCharacterClassNonGreedy): + (JSC::Yarr::RegexGenerator::generateParenthesesSingleDisjunctionOneAlternative): + (JSC::Yarr::RegexGenerator::generateParenthesesSingle): + (JSC::Yarr::RegexGenerator::generateTerm): + (JSC::Yarr::RegexGenerator::generateDisjunction): + (JSC::Yarr::RegexGenerator::RegexGenerator): + (JSC::Yarr::RegexGenerator::generate): + (JSC::Yarr::jitCompileRegex): + (JSC::Yarr::executeRegex): + * yarr/RegexJIT.h: Added. + (JSC::Yarr::RegexCodeBlock::RegexCodeBlock): + * yarr/RegexParser.h: Added. + (JSC::Yarr::): + (JSC::Yarr::Parser::): + (JSC::Yarr::Parser::CharacterClassParserDelegate::CharacterClassParserDelegate): + (JSC::Yarr::Parser::CharacterClassParserDelegate::begin): + (JSC::Yarr::Parser::CharacterClassParserDelegate::atomPatternCharacterUnescaped): + (JSC::Yarr::Parser::CharacterClassParserDelegate::atomPatternCharacter): + (JSC::Yarr::Parser::CharacterClassParserDelegate::atomBuiltInCharacterClass): + (JSC::Yarr::Parser::CharacterClassParserDelegate::end): + (JSC::Yarr::Parser::CharacterClassParserDelegate::assertionWordBoundary): + (JSC::Yarr::Parser::CharacterClassParserDelegate::atomBackReference): + (JSC::Yarr::Parser::CharacterClassParserDelegate::flush): + (JSC::Yarr::Parser::CharacterClassParserDelegate::): + (JSC::Yarr::Parser::Parser): + (JSC::Yarr::Parser::parseEscape): + (JSC::Yarr::Parser::parseAtomEscape): + (JSC::Yarr::Parser::parseCharacterClassEscape): + (JSC::Yarr::Parser::parseCharacterClass): + (JSC::Yarr::Parser::parseParenthesesBegin): + (JSC::Yarr::Parser::parseParenthesesEnd): + (JSC::Yarr::Parser::parseQuantifier): + (JSC::Yarr::Parser::parseTokens): + (JSC::Yarr::Parser::parse): + (JSC::Yarr::Parser::saveState): + (JSC::Yarr::Parser::restoreState): + (JSC::Yarr::Parser::atEndOfPattern): + (JSC::Yarr::Parser::peek): + (JSC::Yarr::Parser::peekIsDigit): + (JSC::Yarr::Parser::peekDigit): + (JSC::Yarr::Parser::consume): + (JSC::Yarr::Parser::consumeDigit): + (JSC::Yarr::Parser::consumeNumber): + (JSC::Yarr::Parser::consumeOctal): + (JSC::Yarr::Parser::tryConsume): + (JSC::Yarr::Parser::tryConsumeHex): + (JSC::Yarr::parse): + * yarr/RegexPattern.h: Added. + (JSC::Yarr::CharacterRange::CharacterRange): + (JSC::Yarr::): + (JSC::Yarr::PatternTerm::): + (JSC::Yarr::PatternTerm::PatternTerm): + (JSC::Yarr::PatternTerm::BOL): + (JSC::Yarr::PatternTerm::EOL): + (JSC::Yarr::PatternTerm::WordBoundary): + (JSC::Yarr::PatternTerm::invert): + (JSC::Yarr::PatternTerm::capture): + (JSC::Yarr::PatternTerm::quantify): + (JSC::Yarr::PatternAlternative::PatternAlternative): + (JSC::Yarr::PatternAlternative::lastTerm): + (JSC::Yarr::PatternAlternative::removeLastTerm): + (JSC::Yarr::PatternDisjunction::PatternDisjunction): + (JSC::Yarr::PatternDisjunction::~PatternDisjunction): + (JSC::Yarr::PatternDisjunction::addNewAlternative): + (JSC::Yarr::RegexPattern::RegexPattern): + (JSC::Yarr::RegexPattern::~RegexPattern): + (JSC::Yarr::RegexPattern::reset): + (JSC::Yarr::RegexPattern::containsIllegalBackReference): + (JSC::Yarr::RegexPattern::newlineCharacterClass): + (JSC::Yarr::RegexPattern::digitsCharacterClass): + (JSC::Yarr::RegexPattern::spacesCharacterClass): + (JSC::Yarr::RegexPattern::wordcharCharacterClass): + (JSC::Yarr::RegexPattern::nondigitsCharacterClass): + (JSC::Yarr::RegexPattern::nonspacesCharacterClass): + (JSC::Yarr::RegexPattern::nonwordcharCharacterClass): + +2009-04-13 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Missed code from last patch). + + * runtime/InternalFunction.cpp: + (JSC::InternalFunction::displayName): + (JSC::InternalFunction::calculatedDisplayName): + * runtime/InternalFunction.h: + +2009-04-13 Francisco Tolmasky <francisco@280north.com> + + Reviewed by Oliver Hunt. + + BUG 25171: It should be possible to manually set the name of an anonymous function + <https://bugs.webkit.org/show_bug.cgi?id=25171> + + This change adds the displayName property to functions, which when set overrides the + normal name when appearing in the console. + + * profiler/Profiler.cpp: + (JSC::createCallIdentifierFromFunctionImp): Changed call to InternalFunction::name to InternalFunction::calculatedDisplayName + * runtime/CommonIdentifiers.h: Added displayName common identifier. + * runtime/InternalFunction.cpp: + (JSC::InternalFunction::displayName): Access to user settable displayName property + (JSC::InternalFunction::calculatedDisplayName): Returns displayName if it exists, if not then the natural name + +2009-04-13 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Disabled another JavaScriptCore test because it fails on Windows but + not Mac, so it makes the bots red. + + * tests/mozilla/expected.html: + +2009-04-13 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Disabled two JavaScriptCore tests because they fail on Window or Mac but + not both, so they make the bots red. + + * tests/mozilla/expected.html: Updated expected results. + +2009-04-09 Ben Murdoch <benm@google.com> + + Reviewed by Alexey Proskuryakov. + + https://bugs.webkit.org/show_bug.cgi?id=25091 + The Android platform requires threads to be registered with the VM. + This patch implements this behaviour inside ThreadingPthreads.cpp. + + * wtf/ThreadingPthreads.cpp: Add a level above threadEntryPoint that takes care of (un)registering threads with the VM. + (WTF::runThreadWithRegistration): register the thread and run entryPoint. Unregister the thread afterwards. + (WTF::createThreadInternal): call runThreadWithRegistration instead of entryPoint directly. + +2009-04-09 David Kilzer <ddkilzer@apple.com> + + Reinstating <rdar://problem/6718589> Option to turn off SVG DOM Objective-C bindings + + Rolled r42345 back in. The build failure was caused by an + internal script which had not been updated the same way that + build-webkit was updated. + + * Configurations/JavaScriptCore.xcconfig: + +2009-04-09 Alexey Proskuryakov <ap@webkit.org> + + Reverting <rdar://problem/6718589> Option to turn off SVG DOM Objective-C bindings. + It broke Mac build, and I don't know how to fix it. + + * Configurations/JavaScriptCore.xcconfig: + +2009-04-09 Xan Lopez <xlopez@igalia.com> + + Unreviewed build fix. + + Checking for __GLIBCXX__ being bigger than some date is not enough + to get std::tr1, C++0x has to be in use too. Add another check for + __GXX_EXPERIMENTAL_CXX0X__. + + * wtf/TypeTraits.h: + +2009-04-08 Oliver Hunt <oliver@apple.com> + + Reviewed by Adam Roben. + + Fix assertion failure in function.apply + + The result of excess arguments to function.apply is irrelevant + so we don't need to provide a result register. We were providing + temporary result register but not ref'ing it resulting in an + assertion failure. + + * parser/Nodes.cpp: + (JSC::ApplyFunctionCallDotNode::emitBytecode): + +2009-04-08 David Kilzer <ddkilzer@apple.com> + + <rdar://problem/6718589> Option to turn off SVG DOM Objective-C bindings + + Reviewed by Darin Adler and Maciej Stachowiak. + + Introduce the ENABLE_SVG_DOM_OBJC_BINDINGS feature define so + that SVG DOM Objective-C bindings may be optionally disabled. + + * Configurations/JavaScriptCore.xcconfig: Added + ENABLE_SVG_DOM_OBJC_BINDINGS variable and use it in + FEATURE_DEFINES. + +2009-04-08 Paul Pedriana <ppedriana@ea.com> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=20422 + Allow custom memory allocation control. + + * wtf/FastAllocBase.h: + New added file. Implements allocation base class. + * wtf/TypeTraits.h: + Augments existing type traits support as needed by FastAllocBase. + * wtf/FastMalloc.h: + Changed to support FastMalloc match validation. + * wtf/FastMalloc.cpp: + Changed to support FastMalloc match validation. + * wtf/Platform.h: + Added ENABLE_FAST_MALLOC_MATCH_VALIDATION; defaults to 0. + * GNUmakefile.am: + Updated to include added FastAllocBase.h. + * JavaScriptCore.xcodeproj/project.pbxproj: + Updated to include added FastAllocBase.h. + * JavaScriptCore.vcproj/WTF/WTF.vcproj: + Updated to include added FastAllocBase.h. + +2009-04-07 Oliver Hunt <oliver@apple.com> + + Reviewed by Geoff Garen. + + Improve function.apply performance + + Jump through a few hoops to improve performance of function.apply in the general case. + + In the case of zero or one arguments, or if there are only two arguments and the + second is an array literal we treat function.apply as function.call. + + Otherwise we use the new opcodes op_load_varargs and op_call_varargs to do the .apply call + without re-entering the virtual machine. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * bytecode/Opcode.h: + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitJumpIfNotFunctionApply): + (JSC::BytecodeGenerator::emitLoadVarargs): + (JSC::BytecodeGenerator::emitCallVarargs): + * bytecompiler/BytecodeGenerator.h: + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + * jit/JIT.h: + * jit/JITCall.cpp: + (JSC::JIT::compileOpCallSetupArgs): + (JSC::JIT::compileOpCallVarargsSetupArgs): + (JSC::JIT::compileOpCallVarargs): + (JSC::JIT::compileOpCallVarargsSlowCase): + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_op_load_varargs): + * jit/JITStubs.h: + * parser/Grammar.y: + * parser/Nodes.cpp: + (JSC::ArrayNode::isSimpleArray): + (JSC::ArrayNode::toArgumentList): + (JSC::CallFunctionCallDotNode::emitBytecode): + (JSC::ApplyFunctionCallDotNode::emitBytecode): + * parser/Nodes.h: + (JSC::ExpressionNode::): + (JSC::ApplyFunctionCallDotNode::): + * runtime/Arguments.cpp: + (JSC::Arguments::copyToRegisters): + (JSC::Arguments::fillArgList): + * runtime/Arguments.h: + (JSC::Arguments::numProvidedArguments): + * runtime/FunctionPrototype.cpp: + (JSC::FunctionPrototype::addFunctionProperties): + * runtime/FunctionPrototype.h: + * runtime/JSArray.cpp: + (JSC::JSArray::copyToRegisters): + * runtime/JSArray.h: + * runtime/JSGlobalObject.cpp: + (JSC::JSGlobalObject::reset): + (JSC::JSGlobalObject::mark): + * runtime/JSGlobalObject.h: + +2009-04-08 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=25073 + JavaScriptCore tests don't run if time zone is not PST + + * API/tests/testapi.c: + (timeZoneIsPST): Added a function that checks whether the time zone is PST, using the same + method as functions in DateMath.cpp do for formatting the result. + (main): Skip date string format test if the time zone is not PST. + +2009-04-07 David Levin <levin@chromium.org> + + Reviewed by Sam Weinig and Geoff Garen. + + https://bugs.webkit.org/show_bug.cgi?id=25039 + UString refactoring to support UChar* sharing. + + No change in sunspider perf. + + * runtime/SmallStrings.cpp: + (JSC::SmallStringsStorage::SmallStringsStorage): + * runtime/UString.cpp: + (JSC::initializeStaticBaseString): + (JSC::initializeUString): + (JSC::UString::BaseString::isShared): + Encapsulate the meaning behind the refcount == 1 checks because + this needs to do slightly more when sharing is added. + (JSC::concatenate): + (JSC::UString::append): + (JSC::UString::operator=): + * runtime/UString.h: + Make m_baseString part of a union to get rid of casts, but make it protected because + it is tricky to use it correctly since it is only valid when the Rep is not a BaseString. + The void* will be filled in when sharing is added. + + Add constructors due to the making members protected and it make ensuring proper + initialization work better (like in SmallStringsStorage). + (JSC::UString::Rep::create): + (JSC::UString::Rep::Rep): + (JSC::UString::Rep::): + (JSC::UString::BaseString::BaseString): + (JSC::UString::Rep::setBaseString): + (JSC::UString::Rep::baseString): + +2009-04-04 Xan Lopez <xlopez@igalia.com> + + Reviewed by Alexey Proskuryakov. + + https://bugs.webkit.org/show_bug.cgi?id=25033 + dtoa.cpp segfaults with g++ 4.4.0 + + g++ 4.4.0 seems to be more strict about aliasing rules, so it + produces incorrect code if dtoa.cpp is compiled with + -fstrict-aliasing (it also emits a ton of warnings, so fair enough + I guess). The problem was that we were only casting variables to + union types in order to do type punning, but GCC and the C + standard require that we actually use a union to store the value. + + This patch does just that, the code is mostly copied from the dtoa + version in GCC: + http://gcc.gnu.org/viewcvs/trunk/libjava/classpath/native/fdlibm/dtoa.c?view=markup. + + * wtf/dtoa.cpp: + (WTF::ulp): + (WTF::b2d): + (WTF::ratio): + (WTF::hexnan): + (WTF::strtod): + (WTF::dtoa): + +2009-04-04 Kevin Ollivier <kevino@theolliviers.com> + + wx build fix for Win port. Build the assembler sources to get missing functions. + + * JavaScriptCoreSources.bkl: + * jscore.bkl: + * wtf/Platform.h: + +2009-04-02 Darin Adler <darin@apple.com> + + Reviewed by Kevin Decker. + + <rdar://problem/6744471> crash in GC due to uninitialized callFunction pointer + + * runtime/JSGlobalObject.h: + (JSC::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData): Initialize + callFunction as we do the other data members that are used in the mark function. + +2009-04-02 Yael Aharon <yael.aharon@nokia.com> + + Reviewed by Simon Hausmann + + https://bugs.webkit.org/show_bug.cgi?id=24490 + + Implement WTF::ThreadSpecific in the Qt build using + QThreadStorage. + + * wtf/ThreadSpecific.h: + +2009-04-01 Greg Bolsinga <bolsinga@apple.com> + + Reviewed by Mark Rowe. + + https://bugs.webkit.org/show_bug.cgi?id=24990 + Put SECTORDER_FLAGS into xcconfig files. + + * Configurations/Base.xcconfig: + * Configurations/DebugRelease.xcconfig: + * JavaScriptCore.xcodeproj/project.pbxproj: + +2009-03-27 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Build fix). + + Fix non-AllInOneFile builds. + + * bytecompiler/BytecodeGenerator.cpp: + +2009-03-27 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + Improve performance of Function.prototype.call + <https://bugs.webkit.org/show_bug.cgi?id=24907> + + Optimistically assume that expression.call(..) is going to be a call to + Function.prototype.call, and handle it specially to attempt to reduce the + degree of VM reentrancy. + + When everything goes right this removes the vm reentry improving .call() + by around a factor of 10. + + * JavaScriptCore.xcodeproj/project.pbxproj: + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * bytecode/Opcode.h: + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitJumpIfNotFunctionCall): + * bytecompiler/BytecodeGenerator.h: + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + * parser/Grammar.y: + * parser/Nodes.cpp: + (JSC::CallFunctionCallDotNode::emitBytecode): + * parser/Nodes.h: + (JSC::CallFunctionCallDotNode::): + * runtime/FunctionPrototype.cpp: + (JSC::FunctionPrototype::addFunctionProperties): + * runtime/FunctionPrototype.h: + * runtime/JSGlobalObject.cpp: + (JSC::JSGlobalObject::reset): + (JSC::JSGlobalObject::mark): + * runtime/JSGlobalObject.h: + +2009-03-27 Laszlo Gombos <laszlo.1.gombos@nokia.com> + + Reviewed by Darin Adler. + + Bug 24884: Include strings.h for strcasecmp() + https://bugs.webkit.org/show_bug.cgi?id=24884 + + * runtime/DateMath.cpp: Reversed previous change including strings.h + * wtf/StringExtras.h: Include strings.h here is available + +2009-03-26 Adam Roben <aroben@apple.com> + + Copy testapi.js to $WebKitOutputDir on Windows + + Part of Bug 24856: run-javascriptcore-tests should run testapi on + Windows + <https://bugs.webkit.org/show_bug.cgi?id=24856> + + This matches what Mac does, which will help once we enable running + testapi from run-javascriptcore-tests on Windows. + + Reviewed by Steve Falkenburg. + + * JavaScriptCore.vcproj/testapi/testapi.vcproj: Copy testapi.js next + to testapi.exe. + +2009-03-25 Oliver Hunt <oliver@apple.com> + + Reviewed by Geoff Garen. + + Fix exception handling for instanceof in the interpreter. + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): + +2009-03-25 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Cameron Zwarich. + + Fixed <rdar://problem/6724011> Write to freed memory in JSC::Label::deref + when reloading http://helpme.att.net/speedtest/ + + * bytecompiler/BytecodeGenerator.h: Reversed the declaration order for + m_labelScopes and m_labels to reverse their destruction order. + m_labelScopes has references to memory within m_labels, so its destructor + needs to run first. + +2009-03-24 Eli Fidler <eli.fidler@torchmobile.com> + + Reviewed by George Staikos. + + Correct warnings which in some environments are treated as errors. + + * wtf/dtoa.cpp: + (WTF::b2d): + (WTF::d2b): + (WTF::strtod): + (WTF::dtoa): + +2009-03-24 Kevin Ollivier <kevino@theolliviers.com> + + Reviewed by Darin Adler. + + Explicitly define HAVE_LANGINFO_H on Darwin. Fixes the wx build bot jscore + test failure. + + https://bugs.webkit.org/show_bug.cgi?id=24780 + + * wtf/Platform.h: + +2009-03-23 Oliver Hunt <oliver@apple.com> + + Reviewed by Cameron Zwarich. + + Fix className() for API defined class + + * API/JSCallbackObjectFunctions.h: + (JSC::::className): + * API/tests/testapi.c: + (EmptyObject_class): + (main): + * API/tests/testapi.js: + +2009-03-23 Oliver Hunt <oliver@apple.com> + + Reviewed by Geoff Garen. + + Make testapi assertions run in release builds, so that testapi actually + works in a release build. + + Many of the testapi assertions have side effects that are necessary, and + given testapi is a testing program, perf impact of an assertion is not + important, so it makes sense to apply the assertions in release builds + anyway. + + * API/tests/testapi.c: + (EvilExceptionObject_hasInstance): + +2009-03-23 David Kilzer <ddkilzer@apple.com> + + Provide JavaScript exception information after slow script timeout + + Reviewed by Oliver Hunt. + + * runtime/Completion.cpp: + (JSC::evaluate): Set the exception object as the Completion + object's value for slow script timeouts. This is used in + WebCore when reporting the exception. + * runtime/ExceptionHelpers.cpp: + (JSC::InterruptedExecutionError::toString): Added. Provides a + description message for the exception when it is reported. + +2009-03-23 Gustavo Noronha Silva <gns@gnome.org> and Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com> + + Reviewed by Adam Roben. + + https://bugs.webkit.org/show_bug.cgi?id=24674 + Crashes in !PLATFORM(MAC)'s formatLocaleDate, in very specific situations + + Make sure strftime never returns 2-digits years to avoid ambiguity + and a crash. We wrap this new code option in HAVE_LANGINFO_H, + since it is apparently not available in all platforms. + + * runtime/DatePrototype.cpp: + (JSC::formatLocaleDate): + * wtf/Platform.h: + +2009-03-22 Oliver Hunt <oliver@apple.com> + + Reviewed by Cameron Zwarich. + + Fix exception handling in API + + We can't just use the ExecState exception slot for returning exceptions + from class introspection functions provided through the API as many JSC + functions will explicitly clear the ExecState exception when returning. + + * API/JSCallbackObjectFunctions.h: + (JSC::JSCallbackObject<Base>::getOwnPropertySlot): + (JSC::JSCallbackObject<Base>::put): + (JSC::JSCallbackObject<Base>::deleteProperty): + (JSC::JSCallbackObject<Base>::construct): + (JSC::JSCallbackObject<Base>::hasInstance): + (JSC::JSCallbackObject<Base>::call): + (JSC::JSCallbackObject<Base>::toNumber): + (JSC::JSCallbackObject<Base>::toString): + (JSC::JSCallbackObject<Base>::staticValueGetter): + (JSC::JSCallbackObject<Base>::callbackGetter): + * API/tests/testapi.c: + (MyObject_hasProperty): + (MyObject_getProperty): + (MyObject_setProperty): + (MyObject_deleteProperty): + (MyObject_callAsFunction): + (MyObject_callAsConstructor): + (MyObject_hasInstance): + (EvilExceptionObject_hasInstance): + (EvilExceptionObject_convertToType): + (EvilExceptionObject_class): + (main): + * API/tests/testapi.js: + (EvilExceptionObject.hasInstance): + (EvilExceptionObject.toNumber): + (EvilExceptionObject.toStringExplicit): + +2009-03-21 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Oliver Hunt. + + Bug 20049: testapi failure: MyObject - 0 should be NaN but instead is 1. + <https://bugs.webkit.org/show_bug.cgi?id=20049> + <rdar://problem/6079127> + + In this case, the test is wrong. According to the ECMA spec, subtraction + uses ToNumber, not ToPrimitive. Change the test to match the spec. + + * API/tests/testapi.js: + +2009-03-21 Oliver Hunt <oliver@apple.com> + + Reviewed by Cameron Zwarich. + + Ensure that JSObjectMakeFunction doesn't produce incorrect line numbers. + + Also make test api correctly propagate failures. + + * API/tests/testapi.c: + (main): + * runtime/FunctionConstructor.cpp: + (JSC::constructFunction): + +2009-03-21 Oliver Hunt <oliver@apple.com> + + Reviewed by Mark Rowe. + + Improve testapi by making it report failures in a way we can pick up + from our test scripts. + + * API/tests/testapi.c: + (assertEqualsAsBoolean): + (assertEqualsAsNumber): + (assertEqualsAsUTF8String): + (assertEqualsAsCharactersPtr): + (main): + * API/tests/testapi.js: + (pass): + (fail): + (shouldBe): + (shouldThrow): + +2009-03-20 Norbert Leser <norbert.leser@nokia.com> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=24535 + + Fixes missing line terminator character (;) after macro call. + It is common practice to add the trailing ";" where macros are substituted + and not where they are defined with #define. + This change is consistent with other macro declarations across webkit, + and it also solves compilation failure with symbian compilers. + + * runtime/UString.cpp: + * wtf/Assertions.h: + +2009-03-20 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Darin Adler. + + Fixed a JavaScriptCore crash on the Windows buildbot. + + * bytecompiler/BytecodeGenerator.h: Reduced the AST recursion limit. + Apparently, Windows has small stacks. + +2009-03-20 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Oliver Hunt. + + A little cleanup in the RegisterFile code. + + Moved large inline functions out of the class declaration, to make it + more readable. + + Switched over to using the roundUpAllocationSize function to avoid + duplicate code and subtle bugs. + + Renamed m_maxCommitted to m_commitEnd, to match m_end. + + Renamed allocationSize to commitSize because it's the chunk size for + committing memory, not allocating memory. + + SunSpider reports no change. + + * interpreter/RegisterFile.h: + (JSC::RegisterFile::RegisterFile): + (JSC::RegisterFile::shrink): + (JSC::RegisterFile::grow): + * jit/ExecutableAllocator.h: + (JSC::roundUpAllocationSize): + +2009-03-19 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Oliver Hunt. + + Fixed <rdar://problem/6033712> -- a little bit of hardening in the Collector. + + SunSpider reports no change. I also verified in the disassembly that + we end up with a single compare to constant. + + * runtime/Collector.cpp: + (JSC::Heap::heapAllocate): + +2009-03-19 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Cameron Zwarich and Oliver Hunt. + + Fixed <rdar://problem/6406045> REGRESSION: Stack overflow on PowerPC on + fast/workers/use-machine-stack.html (22531) + + Dialed down the re-entry allowance to 64 (from 128). + + On a 512K stack, this leaves about 64K for other code on the stack while + JavaScript is running. Not perfect, but it solves our crash on PPC. + + Different platforms may want to dial this down even more. + + Also, substantially shrunk BytecodeGenerator. Since we allocate one on + the stack in order to throw a stack overflow exception -- well, let's + just say the old code had an appreciation for irony. + + SunSpider reports no change. + + * bytecompiler/BytecodeGenerator.h: + * interpreter/Interpreter.h: + (JSC::): + +2009-03-19 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Oliver Hunt. + + Bug 24350: REGRESSION: Safari 4 breaks SPAW wysiwyg editor multiple instances + <https://bugs.webkit.org/show_bug.cgi?id=24350> + <rdar://problem/6674182> + + The SPAW editor's JavaScript assumes that toString() on a function + constructed with the Function constructor produces a function with + a newline after the opening brace. + + * runtime/FunctionConstructor.cpp: + (JSC::constructFunction): Add a newline after the opening brace of the + function's source code. + +2009-03-19 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Geoff Garen. + + Bug 23771: REGRESSION (r36016): JSObjectHasProperty freezes on global class without kJSClassAttributeNoAutomaticPrototype + <https://bugs.webkit.org/show_bug.cgi?id=23771> + <rdar://problem/6561016> + + * API/tests/testapi.c: + (main): Add a test for this bug. + * runtime/JSGlobalObject.cpp: + (JSC::JSGlobalObject::resetPrototype): Don't set the prototype of the + last object in the prototype chain to the object prototype when the + object prototype is already the last object in the prototype chain. + +2009-03-19 Timothy Hatcher <timothy@apple.com> + + <rdar://problem/6687342> -[WebView scheduleInRunLoop:forMode:] has no affect on timers + + Reviewed by Darin Adler. + + * wtf/Platform.h: Added HAVE_RUNLOOP_TIMER for PLATFORM(MAC). + +2009-03-19 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Oliver Hunt. + + Fixed <rdar://problem/6279213> Regular expression run-time complexity + limit too low for long inputs (21485) + + I raised PCRE's "matchLimit" (limit on backtracking) by an order of + magnitude. This fixes all the reported examples of timing out on legitimate + regular expression matches. + + In my testing on a Core Duo MacBook Pro, the longest you can get stuck + trying to match a string is still under 1s, so this seems like a safe change. + + I can think of a number of better solutions that are more complicated, + but this is a good improvement for now. + + * pcre/pcre_exec.cpp: + +2009-03-19 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Fixed <rdar://problem/6603562> REGRESSION (Safari 4): regular expression + pattern size limit lower than Safari 3.2, other browsers, breaks SAP (14873) + + Bumped the pattern size limit to 1MB, and standardized it between PCRE + and WREC. (Empirical testing says that we can easily compile a 1MB regular + expression without risking a hang. Other browsers support bigger regular + expressions, but also hang.) + + SunSpider reports no change. + + I started with a patch posted to Bugzilla by Erik Corry (erikcorry@google.com). + + * pcre/pcre_internal.h: + (put3ByteValue): + (get3ByteValue): + (put3ByteValueAndAdvance): + (putLinkValueAllowZero): + (getLinkValueAllowZero): Made PCRE's "LINK_SIZE" (the number of bytes + used to record jumps between bytecodes) 3, to accomodate larger potential + jumps. Bumped PCRE's "MAX_PATTERN_SIZE" to 1MB. (Technically, at this + LINK_SIZE, we can support even larger patterns, but we risk a hang during + compilation, and it's not clear that such large patterns are important + on the web.) + + * wrec/WREC.cpp: + (JSC::WREC::Generator::compileRegExp): Match PCRE's maximum pattern size, + to avoid quirks between platforms. + +2009-03-18 Ada Chan <adachan@apple.com> + + Rolling out r41818 since it broke the windows build. + Error: ..\..\runtime\DatePrototype.cpp(30) : fatal error C1083: Cannot open include file: 'langinfo.h': No such file or directory + + * runtime/DatePrototype.cpp: + (JSC::formatLocaleDate): + +2009-03-17 Oliver Hunt <oliver@apple.com> + + Reviewed by Cameron Zwarich. + + <rdar://problem/6692138> REGRESSION (Safari 4): Incorrect function return value when using IE "try ... finally" memory leak work-around (24654) + <https://bugs.webkit.org/show_bug.cgi?id=24654> + + If the return value for a function is in a local register we need + to copy it before executing any finalisers, otherwise it is possible + for the finaliser to clobber the result. + + * bytecompiler/BytecodeGenerator.h: + (JSC::BytecodeGenerator::hasFinaliser): + * parser/Nodes.cpp: + (JSC::ReturnNode::emitBytecode): + +2009-03-17 Kevin Ollivier <kevino@theolliviers.com> + + Reviewed by Mark Rowe. + + Move BUILDING_ON_* defines into Platform.h to make them available to other ports. + Also tweak the defines so that they work with the default values set by + AvailabilityMacros.h. + + https://bugs.webkit.org/show_bug.cgi?id=24630 + + * JavaScriptCorePrefix.h: + * wtf/Platform.h: + +2009-03-15 Simon Fraser <simon.fraser@apple.com> + + Revert r41718 because it broke DumpRenderTree on Tiger. + + * JavaScriptCorePrefix.h: + * wtf/Platform.h: + +2009-03-15 Kevin Ollivier <kevino@theolliviers.com> + + Non-Apple Mac ports build fix. Move defines for the BUILDING_ON_ macros into + Platform.h so that they're defined for all ports building on Mac, and tweak + the definitions of those macros based on Mark Rowe's suggestions to accomodate + cases where the values may not be <= to the .0 release for that version. + + * JavaScriptCorePrefix.h: + * wtf/Platform.h: + +2009-03-13 Mark Rowe <mrowe@apple.com> + + Rubber-stamped by Dan Bernstein. + + Take advantage of the ability of recent versions of Xcode to easily switch the active + architecture. + + * Configurations/DebugRelease.xcconfig: + +2009-03-13 Mark Rowe <mrowe@apple.com> + + Reviewed by David Kilzer. + + Prevent AllInOneFile.cpp and ProfileGenerator.cpp from rebuilding unnecessarily when + switching between building in Xcode and via build-webkit. + + build-webkit passes FEATURE_DEFINES to xcodebuild, resulting in it being present in the + Derived Sources build settings. When building in Xcode, this setting isn't present so + Xcode reruns the script build phases. This results in a new version of TracingDtrace.h + being generated, and the files that include it being rebuilt. + + * JavaScriptCore.xcodeproj/project.pbxproj: Don't regenerate TracingDtrace.h if it is + already newer than the input file. + +2009-03-13 Norbert Leser <norbert.leser@nokia.com> + + Reviewed by Darin Adler. + + Resolved name conflict with globally defined tzname in Symbian. + Replaced with different name instead of using namespace qualifier + (appeared to be less clumsy). + + * runtime/DateMath.cpp: + +2009-03-12 Mark Rowe <mrowe@apple.com> + + Reviewed by Darin Adler. + + <rdar://problem/6548446> TCMalloc_SystemRelease should use madvise rather than re-mmaping span of pages + + * wtf/FastMalloc.cpp: + (WTF::mergeDecommittedStates): If either of the spans has been released to the system, release the other + span as well so that the flag in the merged span is accurate. + * wtf/Platform.h: + * wtf/TCSystemAlloc.cpp: Track decommitted spans when using MADV_FREE_REUSABLE / MADV_FREE_REUSE. + (TCMalloc_SystemRelease): Use madvise with MADV_FREE_REUSABLE when it is available. + (TCMalloc_SystemCommit): Use madvise with MADV_FREE_REUSE when it is available. + * wtf/TCSystemAlloc.h: + +2009-03-12 Adam Treat <adam.treat@torchmobile.com> + + Reviewed by NOBODY (Build fix). + + Include string.h for strlen usage. + + * wtf/Threading.cpp: + +2009-03-12 David Kilzer <ddkilzer@apple.com> + + Add NO_RETURN attribute to runInteractive() when not using readline + + Reviewed by Darin Adler. + + * jsc.cpp: + (runInteractive): If the readline library is not used, this method + will never return, thus the NO_RETURN attribute is needed to prevent + a gcc warning. + +2009-03-12 Adam Roben <aroben@apple.com> + + Adopt setThreadNameInternal on Windows + + Also changed a Windows-only assertion about thread name length to an + all-platform log message. + + Reviewed by Adam Treat. + + * wtf/Threading.cpp: + (WTF::createThread): Warn if the thread name is longer than 31 + characters, as Visual Studio will truncate names longer than that + length. + + * wtf/ThreadingWin.cpp: + (WTF::setThreadNameInternal): Renamed from setThreadName and changed + to always operate on the current thread. + (WTF::initializeThreading): Changed to use setThreadNameInternal. + (WTF::createThreadInternal): Removed call to setThreadName. This is + now handled by threadEntryPoint and setThreadNameInternal. + +2009-03-11 David Kilzer <ddkilzer@apple.com> + + Clarify comments regarding order of FEATURE_DEFINES + + Rubber-stamped by Mark Rowe. + + * Configurations/JavaScriptCore.xcconfig: Added warning about + the consequences when FEATURE_DEFINES are not kept in sync. + +2009-03-11 Dan Bernstein <mitz@apple.com> + + Reviewed by Darin Adler. + + - WTF support for fixing <rdar://problem/3919124> Thai text selection + in Safari is incorrect + + * wtf/unicode/icu/UnicodeIcu.h: + (WTF::Unicode::hasLineBreakingPropertyComplexContext): Added. Returns + whether the character has Unicode line breaking property value SA + ("Complex Context"). + * wtf/unicode/qt4/UnicodeQt4.h: + (WTF::Unicode::hasLineBreakingPropertyComplexContext): Added an + implementation that always returns false. + +2009-03-11 Darin Adler <darin@apple.com> + + Reviewed by Mark Rowe. + + Give threads names on platforms with pthread_setname_np. + + * wtf/Threading.cpp: + (WTF::NewThreadContext::NewThreadContext): Initialize thread name. + (WTF::threadEntryPoint): Call setThreadNameInternal. + (WTF::createThread): Pass thread name. + + * wtf/Threading.h: Added new comments, setThreadNameInternal. + + * wtf/ThreadingGtk.cpp: + (WTF::setThreadNameInternal): Added. Empty. + * wtf/ThreadingNone.cpp: + (WTF::setThreadNameInternal): Added. Empty. + * wtf/ThreadingPthreads.cpp: + (WTF::setThreadNameInternal): Call pthread_setname_np when available. + * wtf/ThreadingQt.cpp: + (WTF::setThreadNameInternal): Added. Empty. + * wtf/ThreadingWin.cpp: + (WTF::setThreadNameInternal): Added. Empty. + +2009-03-11 Adam Roben <aroben@apple.com> + + Change the Windows implementation of ThreadSpecific to use functions + instead of extern globals + + This will make it easier to export ThreadSpecific from WebKit. + + Reviewed by John Sullivan. + + * API/JSBase.cpp: + (JSEvaluateScript): + Touched this file to force ThreadSpecific.h to be copied into + $WebKitOutputDir. + + * wtf/ThreadSpecific.h: Replaced g_tls_key_count with tlsKeyCount() + and g_tls_keys with tlsKeys(). + + (WTF::::ThreadSpecific): + (WTF::::~ThreadSpecific): + (WTF::::get): + (WTF::::set): + (WTF::::destroy): + Updated to use the new functions. + + * wtf/ThreadSpecificWin.cpp: + (WTF::tlsKeyCount): + (WTF::tlsKeys): + Added. + + (WTF::ThreadSpecificThreadExit): Changed to use the new functions. + +2009-03-10 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Geoff Garen. + + Bug 24291: REGRESSION (r38635): Single line JavaScript comment prevents HTML button click handler execution + <https://bugs.webkit.org/show_bug.cgi?id=24291> + <rdar://problem/6663472> + + Add an extra newline to the end of the body of the program text constructed + by the Function constructor for parsing. This allows single line comments to + be handled correctly by the parser. + + * runtime/FunctionConstructor.cpp: + (JSC::constructFunction): + +2009-03-09 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + Bug 24447: REGRESSION (r41508): Google Maps does not complete initialization + <rdar://problem/6657774> + + r41508 actually exposed a pre-existing bug where we were not invalidating the result + register cache at jump targets. This causes problems when condition loads occur in an + expression -- namely through the ?: and || operators. This patch corrects these issues + by marking the target of all forward jumps as being a jump target, and then clears the + result register cache when ever it starts generating code for a targeted instruction. + + I do not believe it is possible to cause this class of failure outside of a single + expression, and expressions only provide forward branches, so this should resolve this + entire class of bug. That said i've included a test case that gets as close as possible + to hitting this bug with a back branch, to hopefully prevent anyone from introducing the + problem in future. + + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::Label::isUsed): + (JSC::AbstractMacroAssembler::Label::used): + * assembler/X86Assembler.h: + (JSC::X86Assembler::JmpDst::JmpDst): + (JSC::X86Assembler::JmpDst::isUsed): + (JSC::X86Assembler::JmpDst::used): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + +2009-03-09 David Levin <levin@chromium.org> + + Reviewed by Darin Adler. + + Bug 23175: String and UString should be able to share a UChar* buffer. + <https://bugs.webkit.org/show_bug.cgi?id=23175> + + Add CrossThreadRefCounted. + + * wtf/CrossThreadRefCounted.h: Added. + (WTF::CrossThreadRefCounted::create): + (WTF::CrossThreadRefCounted::isShared): + (WTF::CrossThreadRefCounted::dataAccessMustBeThreadSafe): + (WTF::CrossThreadRefCounted::mayBePassedToAnotherThread): + (WTF::CrossThreadRefCounted::CrossThreadRefCounted): + (WTF::CrossThreadRefCounted::~CrossThreadRefCounted): + (WTF::CrossThreadRefCounted::ref): + (WTF::CrossThreadRefCounted::deref): + (WTF::CrossThreadRefCounted::release): + (WTF::CrossThreadRefCounted::copy): + (WTF::CrossThreadRefCounted::threadSafeDeref): + * wtf/RefCounted.h: + * wtf/Threading.h: + (WTF::ThreadSafeSharedBase::ThreadSafeSharedBase): + (WTF::ThreadSafeSharedBase::derefBase): + (WTF::ThreadSafeShared::ThreadSafeShared): + (WTF::ThreadSafeShared::deref): + +2009-03-09 Laszlo Gombos <laszlo.1.gombos@nokia.com> + + Reviewed by George Staikos. + + https://bugs.webkit.org/show_bug.cgi?id=24353 + Allow to overrule default build options for Qt build. + + * JavaScriptCore.pri: Allow to overrule ENABLE_JIT + +2009-03-08 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (build fix). + + Build fix. + + * runtime/ArrayPrototype.cpp: + (JSC::arrayProtoFuncConcat): + +2009-03-01 Oliver Hunt <oliver@apple.com> + + Reviewed by Cameron Zwarich. + + Bug 24268: RuntimeArray is not a fully implemented JSArray + <https://bugs.webkit.org/show_bug.cgi?id=24268> + + Don't cast a type to JSArray, just because it reportsArray as a supertype + in the JS type system. Doesn't appear feasible to create a testcase + unfortunately as setting up the failure conditions requires internal access + to JSC not present in DRT. + + * runtime/ArrayPrototype.cpp: + (JSC::arrayProtoFuncConcat): + +2009-03-06 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + When preforming an op_mov, preserve any existing register mapping. + + ~0.5% progression on v8 tests x86-64. + + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + +2009-03-05 Simone Fiorentino <simone.fiorentino@consulenti.fastweb.it> + + Bug 24382: request to add SH4 platform + + <https://bugs.webkit.org/show_bug.cgi?id=24382> + + Reviewed by David Kilzer. + + * wtf/Platform.h: Added support for SH4 platform. + +2009-03-05 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Writes of constant values to SF registers should be made with direct memory + writes where possible, rather than moving the value via a hardware register. + + ~3% win on SunSpider tests on x86, ~1.5% win on v8 tests on x86-64. + + * assembler/MacroAssemblerX86_64.h: + (JSC::MacroAssemblerX86_64::storePtr): + * assembler/X86Assembler.h: + (JSC::X86Assembler::movq_i32m): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + +2009-03-05 Mark Rowe <mrowe@apple.com> + + Fix the build. + + Sprinkle "static" around NumberConstructor.cpp in order to please the compiler. + + * runtime/NumberConstructor.cpp: + (JSC::numberConstructorNaNValue): + (JSC::numberConstructorNegInfinity): + (JSC::numberConstructorPosInfinity): + (JSC::numberConstructorMaxValue): + (JSC::numberConstructorMinValue): + +2009-03-04 Mark Rowe <mrowe@apple.com> + + Reviewed by Oliver Hunt. + + <rdar://problem/6354858> FastMallocZone's enumeration code reports fragmented administration space + + The handling of MALLOC_ADMIN_REGION_RANGE_TYPE in FastMalloc's zone was incorrect. It was attempting + to record the memory containing and individual span as an administrative region, when all memory + allocated via MetaDataAlloc should in fact be recorded. This was causing memory regions allocated + via MetaDataAlloc to appear as "VM_ALLOCATE ?" in vmmap output. They are now correctly reported as + "MALLOC_OTHER" regions associated with the JavaScriptCore FastMalloc zone. + + Memory is allocated via MetaDataAlloc from two locations: PageHeapAllocator, and TCMalloc_PageMap{2,3}. + These two cases are handled differently. + + PageHeapAllocator is extended to keep a linked list of memory regions that it has allocated. The + first object in an allocated region contains the link to the previously allocated region. To record + the administrative regions of a PageHeapAllocator we can simply walk the linked list and record + each allocated region we encounter. + + TCMalloc_PageMaps allocate memory via MetaDataAlloc to store each level of the radix tree. To record + the administrative regions of a TCMalloc_PageMap we walk the tree and record the storage used for nodes + at each position rather than the nodes themselves. + + A small performance improvement is achieved by coalescing adjacent memory regions inside the PageMapMemoryUsageRecorder + so that fewer calls in to the range recorder are necessary. We further reduce the number of calls to the + range recorder by aggregating the in-use ranges of a given memory region into a local buffer before recording + them with a single call. A similar approach is also used by AdminRegionRecorder. + + * wtf/FastMalloc.cpp: + (WTF::PageHeapAllocator::Init): + (WTF::PageHeapAllocator::New): + (WTF::PageHeapAllocator::recordAdministrativeRegions): + (WTF::TCMallocStats::FreeObjectFinder::isFreeObject): + (WTF::TCMallocStats::PageMapMemoryUsageRecorder::~PageMapMemoryUsageRecorder): + (WTF::TCMallocStats::PageMapMemoryUsageRecorder::recordPendingRegions): + (WTF::TCMallocStats::PageMapMemoryUsageRecorder::visit): + (WTF::TCMallocStats::AdminRegionRecorder::AdminRegionRecorder): + (WTF::TCMallocStats::AdminRegionRecorder::recordRegion): + (WTF::TCMallocStats::AdminRegionRecorder::visit): + (WTF::TCMallocStats::AdminRegionRecorder::recordPendingRegions): + (WTF::TCMallocStats::AdminRegionRecorder::~AdminRegionRecorder): + (WTF::TCMallocStats::FastMallocZone::enumerate): + (WTF::TCMallocStats::FastMallocZone::FastMallocZone): + (WTF::TCMallocStats::FastMallocZone::init): + * wtf/TCPageMap.h: + (TCMalloc_PageMap2::visitValues): + (TCMalloc_PageMap2::visitAllocations): + (TCMalloc_PageMap3::visitValues): + (TCMalloc_PageMap3::visitAllocations): + +2009-03-04 Antti Koivisto <antti@apple.com> + + Reviewed by Dave Hyatt. + + https://bugs.webkit.org/show_bug.cgi?id=24359 + Repaint throttling mechanism + + Set ENABLE_REPAINT_THROTTLING to 0 by default. + + * wtf/Platform.h: + +2009-03-03 David Kilzer <ddkilzer@apple.com> + + <rdar://problem/6581203> WebCore and WebKit should install the same set of headers during installhdrs phase as build phase + + Reviewed by Mark Rowe. + + * Configurations/Base.xcconfig: Defined REAL_PLATFORM_NAME based + on PLATFORM_NAME to work around the missing definition on Tiger. + Updated HAVE_DTRACE to use REAL_PLATFORM_NAME. + +2009-03-03 Kevin McCullough <kmccullough@apple.com> + + Reviewed by Oliver Hunt. + + <rdar://problem/6639110> console.profile() doesn't work without a title + + * profiler/Profiler.cpp: + (JSC::Profiler::startProfiling): assert if there is not title to ensure + we don't start profiling without one. + +2009-03-02 Sam Weinig <sam@webkit.org> + + Reviewed by Mark Rowe. + + Enable Geolocation (except on Tiger and Leopard). + + * Configurations/JavaScriptCore.xcconfig: + +2009-03-01 David Kilzer <ddkilzer@apple.com> + + <rdar://problem/6635688> Move HAVE_DTRACE check to Base.xcconfig + + Reviewed by Mark Rowe. + + * Configurations/Base.xcconfig: Set HAVE_DTRACE Xcode variable + based on PLATFORM_NAME and MAC_OS_X_VERSION_MAJOR. Also define + it as a preprocessor macro by modifying + GCC_PREPROCESSOR_DEFINITIONS. + * JavaScriptCore.xcodeproj/project.pbxproj: Changed "Generate + DTrace header" script phase to check for HAVE_DTRACE instead of + MACOSX_DEPLOYMENT_TARGET. + * wtf/Platform.h: Removed definition of HAVE_DTRACE macro since + it's defined in Base.xcconfig now. + +2009-03-01 Horia Olaru <olaru@adobe.com> + + By looking in grammar.y there are only a few types of statement nodes + on which the debugger should stop. + + Removed isBlock and isLoop virtual calls. No need to emit debug hooks in + the "statementListEmitCode" method as long as the necessary hooks can be + added in each "emitCode". + + https://bugs.webkit.org/show_bug.cgi?id=21073 + + Reviewed by Kevin McCullough. + + * parser/Nodes.cpp: + (JSC::ConstStatementNode::emitBytecode): + (JSC::statementListEmitCode): + (JSC::EmptyStatementNode::emitBytecode): + (JSC::ExprStatementNode::emitBytecode): + (JSC::VarStatementNode::emitBytecode): + (JSC::IfNode::emitBytecode): + (JSC::IfElseNode::emitBytecode): + (JSC::DoWhileNode::emitBytecode): + (JSC::WhileNode::emitBytecode): + (JSC::ForNode::emitBytecode): + (JSC::ForInNode::emitBytecode): + (JSC::ContinueNode::emitBytecode): + (JSC::BreakNode::emitBytecode): + (JSC::ReturnNode::emitBytecode): + (JSC::WithNode::emitBytecode): + (JSC::SwitchNode::emitBytecode): + (JSC::LabelNode::emitBytecode): + (JSC::ThrowNode::emitBytecode): + (JSC::TryNode::emitBytecode): + * parser/Nodes.h: + +2009-02-26 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Fix bug #23614. Switches on double precision values were incorrectly + truncating the scrutinee value. E.g.: + + switch (1.1) { case 1: print("FAIL"); } + + Was resulting in FAIL. + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): + * jit/JITStubs.cpp: + (JSC::JITStubs::cti_op_switch_imm): + +2009-02-26 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Integer Immediate representation need not be canonical in x86 JIT code. + On x86-64 we already have loosened the requirement that the int immediate + representation in canonical, we should bring x86 into line. + + This patch is a minor (~0.5%) improvement on sunspider & v8-tests, and + should reduce memory footoprint (reduces JIT code size). + + * jit/JIT.cpp: + (JSC::JIT::compileOpStrictEq): + (JSC::JIT::privateCompileSlowCases): + * jit/JIT.h: + (JSC::JIT::emitJumpIfImmediateNumber): + (JSC::JIT::emitJumpIfNotImmediateNumber): + * jit/JITArithmetic.cpp: + (JSC::JIT::putDoubleResultToJSNumberCellOrJSImmediate): + (JSC::JIT::compileBinaryArithOp): + +2009-02-26 Carol Szabo <carol.szabo@nokia.com> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=24099 + ARM Compiler Warnings in pcre_exec.cpp + + * pcre/pcre_exec.cpp: + (match): + +2009-02-25 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Gavin Barraclough. + + Bug 24086: Regression (r40993): WebKit crashes after logging in to lists.zenbe + <https://bugs.webkit.org/show_bug.cgi?id=24086> + <rdar://problem/6625111> + + The numeric sort optimization in r40993 generated bytecode for a function + without generating JIT code. This breaks an assumption in some parts of + the JIT's function calling logic that the presence of a CodeBlock implies + the existence of JIT code. + + In order to fix this, we simply generate JIT code whenever we check whether + a function is a numeric sort function. This only incurs an additional cost + in the case when the function is a numeric sort function, in which case it + is not expensive to generate JIT code for it. + + * runtime/ArrayPrototype.cpp: + (JSC::isNumericCompareFunction): + +2009-02-25 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Maciej Stachowiak. + + Fixed <rdar://problem/6611174> REGRESSION (r36701): Unable to select + messages on hotmail (24052) + + The bug was that for-in enumeration used a cached prototype chain without + validating that it was up-to-date. + + This led me to refactor prototype chain caching so it was easier to work + with and harder to get wrong. + + After a bit of inlining, this patch is performance-neutral on SunSpider + and the v8 benchmarks. + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::tryCachePutByID): + (JSC::Interpreter::tryCacheGetByID): + * jit/JITStubs.cpp: + (JSC::JITStubs::tryCachePutByID): + (JSC::JITStubs::tryCacheGetByID): + (JSC::JITStubs::cti_op_get_by_id_proto_list): Use the new refactored goodness. See + lines beginning with "-" and smile. + + * runtime/JSGlobalObject.h: + (JSC::Structure::prototypeForLookup): A shout out to const. + + * runtime/JSPropertyNameIterator.h: + (JSC::JSPropertyNameIterator::next): We can use a pointer comparison to + see if our cached structure chain is equal to the object's structure chain, + since in the case of a cache hit, we share references to the same structure + chain. + + * runtime/Operations.h: + (JSC::countPrototypeChainEntriesAndCheckForProxies): Use the new refactored + goodness. + + * runtime/PropertyNameArray.h: + (JSC::PropertyNameArray::PropertyNameArray): + (JSC::PropertyNameArray::setShouldCache): + (JSC::PropertyNameArray::shouldCache): Renamed "cacheable" to "shouldCache" + to communicate that the client is specifying a recommendation, not a + capability. + + * runtime/Structure.cpp: + (JSC::Structure::Structure): No need to initialize a RefPtr. + (JSC::Structure::getEnumerablePropertyNames): Moved some code into helper + functions. + + (JSC::Structure::prototypeChain): New centralized accessor for a prototype + chain. Revalidates on every access, since the objects in the prototype + chain may have mutated. + + (JSC::Structure::isValid): Helper function for revalidating a cached + prototype chain. + + (JSC::Structure::getEnumerableNamesFromPropertyTable): + (JSC::Structure::getEnumerableNamesFromClassInfoTable): Factored out of + getEnumerablePropertyNames. + + * runtime/Structure.h: + + * runtime/StructureChain.cpp: + (JSC::StructureChain::StructureChain): + * runtime/StructureChain.h: + (JSC::StructureChain::create): No need for structureChainsAreEqual, since + we use pointer equality now. Refactored StructureChain to make a little + more sense and eliminate special cases for null prototypes. + +2009-02-25 Steve Falkenburg <sfalken@apple.com> + + Use timeBeginPeriod to enable timing resolution greater than 16ms in command line jsc for Windows. + Allows more accurate reporting of benchmark times via command line jsc.exe. Doesn't affect WebKit's use of JavaScriptCore. + + Reviewed by Adam Roben. + + * jsc.cpp: + (main): + +2009-02-24 Geoffrey Garen <ggaren@apple.com> + + Build fix? + + * GNUmakefile.am: + +2009-02-24 Mark Rowe <mrowe@apple.com> + + Reviewed by Oliver Hunt. + + <rdar://problem/6259220> Rename AVAILABLE_AFTER_WEBKIT_VERSION_3_1 (etc.) to match the other macros + + * API/JSBasePrivate.h: + * API/JSContextRef.h: + * API/JSObjectRef.h: + * API/WebKitAvailability.h: + +2009-02-23 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Next step in splitting JIT functionality out of the Interpreter class: + Moved vptr storage from Interpreter to JSGlobalData, so it could be shared + between Interpreter and JITStubs, and moved the *Trampoline JIT stubs + into the JITStubs class. Also added a VPtrSet class to encapsulate vptr + hacks during JSGlobalData initialization. + + SunSpider says 0.4% faster. Meh. + + * JavaScriptCore.exp: + * JavaScriptCore.xcodeproj/project.pbxproj: + * interpreter/Interpreter.cpp: + (JSC::Interpreter::Interpreter): + (JSC::Interpreter::tryCacheGetByID): + (JSC::Interpreter::privateExecute): + * interpreter/Interpreter.h: + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompile): + (JSC::JIT::privateCompileCTIMachineTrampolines): + * jit/JIT.h: + (JSC::JIT::compileCTIMachineTrampolines): + * jit/JITCall.cpp: + (JSC::JIT::compileOpCall): + (JSC::JIT::compileOpCallSlowCase): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::privateCompilePatchGetArrayLength): + * jit/JITStubs.cpp: + (JSC::JITStubs::JITStubs): + (JSC::JITStubs::tryCacheGetByID): + (JSC::JITStubs::cti_vm_dontLazyLinkCall): + (JSC::JITStubs::cti_op_get_by_val): + (JSC::JITStubs::cti_op_get_by_val_byte_array): + (JSC::JITStubs::cti_op_put_by_val): + (JSC::JITStubs::cti_op_put_by_val_array): + (JSC::JITStubs::cti_op_put_by_val_byte_array): + (JSC::JITStubs::cti_op_is_string): + * jit/JITStubs.h: + (JSC::JITStubs::ctiArrayLengthTrampoline): + (JSC::JITStubs::ctiStringLengthTrampoline): + (JSC::JITStubs::ctiVirtualCallPreLink): + (JSC::JITStubs::ctiVirtualCallLink): + (JSC::JITStubs::ctiVirtualCall): + * runtime/ArrayPrototype.cpp: + (JSC::arrayProtoFuncPop): + (JSC::arrayProtoFuncPush): + * runtime/FunctionPrototype.cpp: + (JSC::functionProtoFuncApply): + * runtime/JSArray.h: + (JSC::isJSArray): + * runtime/JSByteArray.h: + (JSC::asByteArray): + (JSC::isJSByteArray): + * runtime/JSCell.h: + * runtime/JSFunction.h: + * runtime/JSGlobalData.cpp: + (JSC::VPtrSet::VPtrSet): + (JSC::JSGlobalData::JSGlobalData): + (JSC::JSGlobalData::create): + (JSC::JSGlobalData::sharedInstance): + * runtime/JSGlobalData.h: + * runtime/JSString.h: + (JSC::isJSString): + * runtime/Operations.h: + (JSC::jsLess): + (JSC::jsLessEq): + * wrec/WREC.cpp: + (JSC::WREC::Generator::compileRegExp): + +2009-02-23 Csaba Osztrogonac <oszi@inf.u-szeged.hu> + + Reviewed by Oliver Hunt. + + Bug 23787: Allow JIT to generate SSE2 code if using GCC + <https://bugs.webkit.org/show_bug.cgi?id=23787> + + GCC version of the cpuid check. + + * jit/JITArithmetic.cpp: + (JSC::isSSE2Present): previous assembly code fixed. + +2009-02-23 David Levin <levin@chromium.org> + + Reviewed by Alexey Proskuryakov. + + Bug 24047: Need to simplify nested if's in WorkerRunLoop::runInMode + <https://bugs.webkit.org/show_bug.cgi?id=24047> + + * wtf/MessageQueue.h: + (WTF::MessageQueue::infiniteTime): + Allows for one to call waitForMessageFilteredWithTimeout and wait forever. + + (WTF::MessageQueue::alwaysTruePredicate): + (WTF::MessageQueue::waitForMessage): + Made waitForMessage call waitForMessageFilteredWithTimeout, so that there is less + duplicate code. + + (WTF::MessageQueue::waitForMessageFilteredWithTimeout): + + * wtf/ThreadingQt.cpp: + (WTF::ThreadCondition::timedWait): + * wtf/ThreadingWin.cpp: + (WTF::ThreadCondition::timedWait): + Made these two implementations consistent with the pthread and gtk implementations. + Currently, the time calculations would overflow when passed large values. + +2009-02-23 Jeremy Moskovich <jeremy@chromium.org> + + Reviewed by Adam Roben. + + https://bugs.webkit.org/show_bug.cgi?id=24096 + PLATFORM(MAC)->PLATFORM(CF) since we want to use the CF functions in Chrome on OS X. + + * wtf/CurrentTime.cpp: + +2009-02-22 Geoffrey Garen <ggaren@apple.com> + + Build fix? + + * GNUmakefile.am: + +2009-02-22 Geoffrey Garen <ggaren@apple.com> + + Build fix. + + * GNUmakefile.am: + +2009-02-22 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Next step in splitting JIT functionality out of the Interpreter class: + Created a JITStubs class and renamed Interpreter::cti_* to JITStubs::cti_*. + + Also, moved timeout checking into its own class, located in JSGlobalData, + so both the Interpreter and the JIT could have access to it. + + * JavaScriptCore.exp: + * JavaScriptCore.pri: + * JavaScriptCore.scons: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + * interpreter/CallFrame.h: + * interpreter/Interpreter.cpp: + (JSC::Interpreter::Interpreter): + (JSC::Interpreter::privateExecute): + * interpreter/Interpreter.h: + * interpreter/Register.h: + * jit/JIT.cpp: + (JSC::): + (JSC::JIT::emitTimeoutCheck): + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + (JSC::JIT::privateCompile): + (JSC::JIT::privateCompileCTIMachineTrampolines): + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::compileFastArithSlow_op_lshift): + (JSC::JIT::compileFastArithSlow_op_rshift): + (JSC::JIT::compileFastArithSlow_op_bitand): + (JSC::JIT::compileFastArithSlow_op_mod): + (JSC::JIT::compileFastArith_op_mod): + (JSC::JIT::compileFastArithSlow_op_post_inc): + (JSC::JIT::compileFastArithSlow_op_post_dec): + (JSC::JIT::compileFastArithSlow_op_pre_inc): + (JSC::JIT::compileFastArithSlow_op_pre_dec): + (JSC::JIT::compileFastArith_op_add): + (JSC::JIT::compileFastArith_op_mul): + (JSC::JIT::compileFastArith_op_sub): + (JSC::JIT::compileBinaryArithOpSlowCase): + (JSC::JIT::compileFastArithSlow_op_add): + (JSC::JIT::compileFastArithSlow_op_mul): + * jit/JITCall.cpp: + (JSC::JIT::compileOpCall): + (JSC::JIT::compileOpCallSlowCase): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::compilePutByIdHotPath): + (JSC::JIT::compileGetByIdSlowCase): + (JSC::JIT::compilePutByIdSlowCase): + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::patchGetByIdSelf): + (JSC::JIT::patchPutByIdReplace): + (JSC::JIT::privateCompilePatchGetArrayLength): + (JSC::JIT::privateCompileGetByIdSelf): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdChain): + (JSC::JIT::privateCompilePutByIdReplace): + * jit/JITStubs.cpp: + (JSC::JITStubs::tryCachePutByID): + (JSC::JITStubs::tryCacheGetByID): + (JSC::JITStubs::cti_op_convert_this): + (JSC::JITStubs::cti_op_end): + (JSC::JITStubs::cti_op_add): + (JSC::JITStubs::cti_op_pre_inc): + (JSC::JITStubs::cti_timeout_check): + (JSC::JITStubs::cti_register_file_check): + (JSC::JITStubs::cti_op_loop_if_less): + (JSC::JITStubs::cti_op_loop_if_lesseq): + (JSC::JITStubs::cti_op_new_object): + (JSC::JITStubs::cti_op_put_by_id_generic): + (JSC::JITStubs::cti_op_get_by_id_generic): + (JSC::JITStubs::cti_op_put_by_id): + (JSC::JITStubs::cti_op_put_by_id_second): + (JSC::JITStubs::cti_op_put_by_id_fail): + (JSC::JITStubs::cti_op_get_by_id): + (JSC::JITStubs::cti_op_get_by_id_second): + (JSC::JITStubs::cti_op_get_by_id_self_fail): + (JSC::JITStubs::cti_op_get_by_id_proto_list): + (JSC::JITStubs::cti_op_get_by_id_proto_list_full): + (JSC::JITStubs::cti_op_get_by_id_proto_fail): + (JSC::JITStubs::cti_op_get_by_id_array_fail): + (JSC::JITStubs::cti_op_get_by_id_string_fail): + (JSC::JITStubs::cti_op_instanceof): + (JSC::JITStubs::cti_op_del_by_id): + (JSC::JITStubs::cti_op_mul): + (JSC::JITStubs::cti_op_new_func): + (JSC::JITStubs::cti_op_call_JSFunction): + (JSC::JITStubs::cti_op_call_arityCheck): + (JSC::JITStubs::cti_vm_dontLazyLinkCall): + (JSC::JITStubs::cti_vm_lazyLinkCall): + (JSC::JITStubs::cti_op_push_activation): + (JSC::JITStubs::cti_op_call_NotJSFunction): + (JSC::JITStubs::cti_op_create_arguments): + (JSC::JITStubs::cti_op_create_arguments_no_params): + (JSC::JITStubs::cti_op_tear_off_activation): + (JSC::JITStubs::cti_op_tear_off_arguments): + (JSC::JITStubs::cti_op_profile_will_call): + (JSC::JITStubs::cti_op_profile_did_call): + (JSC::JITStubs::cti_op_ret_scopeChain): + (JSC::JITStubs::cti_op_new_array): + (JSC::JITStubs::cti_op_resolve): + (JSC::JITStubs::cti_op_construct_JSConstruct): + (JSC::JITStubs::cti_op_construct_NotJSConstruct): + (JSC::JITStubs::cti_op_get_by_val): + (JSC::JITStubs::cti_op_get_by_val_byte_array): + (JSC::JITStubs::cti_op_resolve_func): + (JSC::JITStubs::cti_op_sub): + (JSC::JITStubs::cti_op_put_by_val): + (JSC::JITStubs::cti_op_put_by_val_array): + (JSC::JITStubs::cti_op_put_by_val_byte_array): + (JSC::JITStubs::cti_op_lesseq): + (JSC::JITStubs::cti_op_loop_if_true): + (JSC::JITStubs::cti_op_negate): + (JSC::JITStubs::cti_op_resolve_base): + (JSC::JITStubs::cti_op_resolve_skip): + (JSC::JITStubs::cti_op_resolve_global): + (JSC::JITStubs::cti_op_div): + (JSC::JITStubs::cti_op_pre_dec): + (JSC::JITStubs::cti_op_jless): + (JSC::JITStubs::cti_op_not): + (JSC::JITStubs::cti_op_jtrue): + (JSC::JITStubs::cti_op_post_inc): + (JSC::JITStubs::cti_op_eq): + (JSC::JITStubs::cti_op_lshift): + (JSC::JITStubs::cti_op_bitand): + (JSC::JITStubs::cti_op_rshift): + (JSC::JITStubs::cti_op_bitnot): + (JSC::JITStubs::cti_op_resolve_with_base): + (JSC::JITStubs::cti_op_new_func_exp): + (JSC::JITStubs::cti_op_mod): + (JSC::JITStubs::cti_op_less): + (JSC::JITStubs::cti_op_neq): + (JSC::JITStubs::cti_op_post_dec): + (JSC::JITStubs::cti_op_urshift): + (JSC::JITStubs::cti_op_bitxor): + (JSC::JITStubs::cti_op_new_regexp): + (JSC::JITStubs::cti_op_bitor): + (JSC::JITStubs::cti_op_call_eval): + (JSC::JITStubs::cti_op_throw): + (JSC::JITStubs::cti_op_get_pnames): + (JSC::JITStubs::cti_op_next_pname): + (JSC::JITStubs::cti_op_push_scope): + (JSC::JITStubs::cti_op_pop_scope): + (JSC::JITStubs::cti_op_typeof): + (JSC::JITStubs::cti_op_is_undefined): + (JSC::JITStubs::cti_op_is_boolean): + (JSC::JITStubs::cti_op_is_number): + (JSC::JITStubs::cti_op_is_string): + (JSC::JITStubs::cti_op_is_object): + (JSC::JITStubs::cti_op_is_function): + (JSC::JITStubs::cti_op_stricteq): + (JSC::JITStubs::cti_op_nstricteq): + (JSC::JITStubs::cti_op_to_jsnumber): + (JSC::JITStubs::cti_op_in): + (JSC::JITStubs::cti_op_push_new_scope): + (JSC::JITStubs::cti_op_jmp_scopes): + (JSC::JITStubs::cti_op_put_by_index): + (JSC::JITStubs::cti_op_switch_imm): + (JSC::JITStubs::cti_op_switch_char): + (JSC::JITStubs::cti_op_switch_string): + (JSC::JITStubs::cti_op_del_by_val): + (JSC::JITStubs::cti_op_put_getter): + (JSC::JITStubs::cti_op_put_setter): + (JSC::JITStubs::cti_op_new_error): + (JSC::JITStubs::cti_op_debug): + (JSC::JITStubs::cti_vm_throw): + * jit/JITStubs.h: + (JSC::): + * runtime/JSFunction.h: + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + * runtime/JSGlobalData.h: + * runtime/JSGlobalObject.cpp: + * runtime/JSGlobalObject.h: + * runtime/TimeoutChecker.cpp: Copied from interpreter/Interpreter.cpp. + (JSC::TimeoutChecker::TimeoutChecker): + (JSC::TimeoutChecker::reset): + (JSC::TimeoutChecker::didTimeOut): + * runtime/TimeoutChecker.h: Copied from interpreter/Interpreter.h. + (JSC::TimeoutChecker::setTimeoutInterval): + (JSC::TimeoutChecker::ticksUntilNextCheck): + (JSC::TimeoutChecker::start): + (JSC::TimeoutChecker::stop): + +2009-02-20 Gustavo Noronha Silva <gns@gnome.org> + + Unreviewed build fix after r41100. + + * GNUmakefile.am: + +2009-02-20 Oliver Hunt <oliver@apple.com> + + Reviewed by Mark Rowe. + + <rdar://problem/6606660> 2==null returns true in 64bit jit + + Code for op_eq_null and op_neq_null was incorrectly performing + a 32bit compare, which truncated the type tag from an integer + immediate, leading to incorrect behaviour. + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::setPtr): + * assembler/MacroAssemblerX86_64.h: + (JSC::MacroAssemblerX86_64::setPtr): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + +2009-02-19 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Gavin Barraclough. + + First step in splitting JIT functionality out of the Interpreter class: + Created JITStubs.h/.cpp, and moved Interpreter::cti_* into JITStubs.cpp. + + Functions that the Interpreter and JITStubs share moved to Operations.h/.cpp. + + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * interpreter/Interpreter.cpp: + (JSC::Interpreter::resolveBase): + (JSC::Interpreter::checkTimeout): + (JSC::Interpreter::privateExecute): + * interpreter/Interpreter.h: + * jit/JITStubs.cpp: Copied from interpreter/Interpreter.cpp. + (JSC::Interpreter::cti_op_resolve_base): + * jit/JITStubs.h: Copied from interpreter/Interpreter.h. + * runtime/Operations.cpp: + (JSC::jsAddSlowCase): + (JSC::jsTypeStringForValue): + (JSC::jsIsObjectType): + (JSC::jsIsFunctionType): + * runtime/Operations.h: + (JSC::jsLess): + (JSC::jsLessEq): + (JSC::jsAdd): + (JSC::cachePrototypeChain): + (JSC::countPrototypeChainEntriesAndCheckForProxies): + (JSC::resolveBase): + +2009-02-19 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Fix for x86-64. Where the JavaScriptCore text segment lies outside + a 2gb range of the heap containing JIT generated code, callbacks + from JIT code to the stub functions in Interpreter will be incorrectly + linked. + + No performance impact on Sunspider, 1% regression on v8-tests, + due to a 3% regression on richards. + + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::Call::Call): + (JSC::AbstractMacroAssembler::Jump::link): + (JSC::AbstractMacroAssembler::Jump::linkTo): + (JSC::AbstractMacroAssembler::CodeLocationJump::relink): + (JSC::AbstractMacroAssembler::CodeLocationCall::relink): + (JSC::AbstractMacroAssembler::ProcessorReturnAddress::relinkCallerToFunction): + (JSC::AbstractMacroAssembler::PatchBuffer::link): + (JSC::AbstractMacroAssembler::PatchBuffer::linkTailRecursive): + (JSC::AbstractMacroAssembler::differenceBetween): + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::tailRecursiveCall): + (JSC::MacroAssembler::makeTailRecursiveCall): + * assembler/MacroAssemblerX86.h: + (JSC::MacroAssemblerX86::call): + * assembler/MacroAssemblerX86Common.h: + * assembler/MacroAssemblerX86_64.h: + (JSC::MacroAssemblerX86_64::call): + (JSC::MacroAssemblerX86_64::moveWithPatch): + (JSC::MacroAssemblerX86_64::branchPtrWithPatch): + (JSC::MacroAssemblerX86_64::storePtrWithPatch): + * assembler/X86Assembler.h: + (JSC::X86Assembler::jmp_r): + (JSC::X86Assembler::linkJump): + (JSC::X86Assembler::patchJump): + (JSC::X86Assembler::patchCall): + (JSC::X86Assembler::linkCall): + (JSC::X86Assembler::patchAddress): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::tryCTICachePutByID): + * jit/JIT.cpp: + (JSC::JIT::privateCompile): + (JSC::JIT::privateCompileCTIMachineTrampolines): + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::putDoubleResultToJSNumberCellOrJSImmediate): + (JSC::JIT::compileBinaryArithOp): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::privateCompileGetByIdSelf): + (JSC::JIT::privateCompilePutByIdReplace): + +2009-02-18 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Oliver Hunt. + + Simplified .call and .apply in preparation for optimizing them. Also, + a little cleanup. + + * runtime/FunctionPrototype.cpp: + (JSC::functionProtoFuncApply): + (JSC::functionProtoFuncCall): No need to do any specific conversion on + 'this' -- op_convert_this will do it if necessary. + + * runtime/JSImmediate.cpp: + (JSC::JSImmediate::toThisObject): Slightly relaxed the rules on + toThisObject to allow for 'undefined', which can be passed through + .call and .apply. + +2009-02-19 David Levin <levin@chromium.org> + + Reviewed by Alexey Proskuryakov. + + Bug 23976: MessageQueue needs a way to wait for a message that satisfies an arbitrary criteria. + <https://bugs.webkit.org/show_bug.cgi?id=23976> + + * wtf/Deque.h: + (WTF::Deque<T>::findIf): + * wtf/MessageQueue.h: + (WTF::MessageQueue<T>::waitForMessageFiltered): + +2009-02-18 David Levin <levin@chromium.org> + + Reviewed by Alexey Proskuryakov. + + Bug 23974: Deque::Remove would be a useful method. + <https://bugs.webkit.org/show_bug.cgi?id=23974> + + Add Deque::remove and DequeIteratorBase<T>::operator=. + + Why was operator= added? Every concrete iterator (DequeIterator..DequeConstReverseIterator) + was calling DequeIteratorBase::assign(), which called Base::operator=(). Base::operator=() + was not implemented. This went unnoticed because the iterator copy code has been unused. + + * wtf/Deque.h: + (WTF::Deque<T>::remove): + (WTF::DequeIteratorBase<T>::removeFromIteratorsList): + (WTF::DequeIteratorBase<T>::operator=): + (WTF::DequeIteratorBase<T>::~DequeIteratorBase): + +2009-02-18 Gustavo Noronha Silva <gns@gnome.org> + + Reviewed by Holger Freyther. + + Fix symbols.filter location, and add other missing files to the + autotools build, so that make dist works. + + * GNUmakefile.am: + +2009-02-17 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Fixed failure in js1_5/Regress/regress-168347.js, as seen on the Oliver + bot. + + Technically, both behaviors are OK, but we might as well keep this test + passing. + + * runtime/FunctionPrototype.cpp: + (JSC::insertSemicolonIfNeeded): No need to add a trailing semicolon + after a trailing '}', since '}' ends a block, indicating the end of a + statement. + +2009-02-17 Geoffrey Garen <ggaren@apple.com> + + Build fix. + + * runtime/FunctionPrototype.cpp: + +2009-02-17 Oliver Hunt <oliver@apple.com> + + Reviewed by Geoff Garen. + + Add assertion to guard against oversized pc relative calls. + + * assembler/X86Assembler.h: + (JSC::X86Assembler::link): + +2009-02-17 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Fixed <rdar://problem/6595040> REGRESSION: http://www.amnestyusa.org/ + fails to load. + + amnestyusa.org uses the Optimist JavaScript library, which adds event + listeners by concatenating string-ified functions. This is only sure to + be syntactically valid if the string-ified functions end in semicolons. + + * parser/Lexer.cpp: + (JSC::Lexer::isWhiteSpace): + * parser/Lexer.h: + (JSC::Lexer::isWhiteSpace): + (JSC::Lexer::isLineTerminator): Added some helper functions for examining + whitespace. + + * runtime/FunctionPrototype.cpp: + (JSC::appendSemicolonIfNeeded): + (JSC::functionProtoFuncToString): When string-ifying a function, insert + a semicolon in the last non-whitespace position, if one doesn't already exist. + +2009-02-16 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Build fix). + + Roll out r41022 as it breaks qt and gtk builds + + * jit/JITArithmetic.cpp: + (JSC::isSSE2Present): + +2009-02-16 Sam Weinig <sam@webkit.org> + + Reviewed by Geoffrey Garen. + + Fix for <rdar://problem/6468156> + REGRESSION (r36779): Adding link, images, flash in TinyMCE blocks entire page (21382) + + No performance regression. + + * runtime/Arguments.cpp: + (JSC::Arguments::fillArgList): Add codepath for when the "length" property has been + overridden. + +2009-02-16 Mark Rowe <mrowe@apple.com> + + Build fix. + + * wtf/FastMalloc.cpp: + (WTF::TCMallocStats::): + (WTF::TCMallocStats::FastMallocZone::FastMallocZone): + +2009-02-16 Csaba Osztrogonac <oszi@inf.u-szeged.hu> + + Reviewed by Oliver Hunt. + + Bug 23787: Allow JIT to generate SSE2 code if using GCC + <https://bugs.webkit.org/show_bug.cgi?id=23787> + + GCC version of the cpuid check. + + * jit/JITArithmetic.cpp: + (JSC::isSSE2Present): GCC assembly code added. + 6.6% progression on x86 Linux with JIT and WREC on SunSpider if using SSE2 capable machine. + +2009-02-13 Adam Treat <adam.treat@torchmobile.com> + + Reviewed by George Staikos. + + https://bugs.webkit.org/show_bug.cgi?id=23960 + Crash Fix. + + Don't depend on 'initializeThreading()' to come before a call to 'isMainThread()' + as QtWebKit only calls 'initializeThreading()' during QWebPage construction. + + A client app may well make a call to QWebSettings::iconForUrl() for instance + before creating a QWebPage and that call to QWebSettings triggers an + ASSERT(isMainThread()) deep within WebCore. + + * wtf/ThreadingQt.cpp: + (WTF::isMainThread): + +2009-02-13 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Darin Adler. + + Some data in the instruction stream is potentially uninitialized - fix this. + + Change the OperandTypes constructor so that uninitialized memory in the int + is zeroed, and modify the Instruction constructor taking an Opcode so that + if !HAVE(COMPUTED_GOTO) (i.e. when Opcode is an enum, and is potentially only + a byte) it zeros the Instruction first before writing the opcode. + + * bytecode/Instruction.h: + (JSC::Instruction::Instruction): + * parser/ResultType.h: + (JSC::OperandTypes::OperandTypes): + +2009-02-13 Geoffrey Garen <ggaren@apple.com> + + Build fix for non_JIT platforms. + + * bytecode/CodeBlock.h: + (JSC::CodeBlock::setIsNumericCompareFunction): + (JSC::CodeBlock::isNumericCompareFunction): + +2009-02-13 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Darin Adler. + + Fixed <rdar://problem/6584057> Optimize sort by JS numeric comparison + function not to run the comparison function + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::CodeBlock): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::setIsNumericCompareFunction): + (JSC::CodeBlock::isNumericCompareFunction): Added the ability to track + whether a CodeBlock performs a sort-like numeric comparison. + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::generate): Set the isNumericCompareFunction bit + after compiling. + + * parser/Nodes.cpp: + (JSC::FunctionBodyNode::emitBytecode): Fixed a bug that caused us to + codegen an extra return at the end of all functions (eek!), since this + made it harder / weirder to detect the numeric comparison pattern in + bytecode. + + * runtime/ArrayPrototype.cpp: + (JSC::arrayProtoFuncSort): Use the isNumericCompareFunction bit to do + a faster sort if we can. + + * runtime/FunctionConstructor.cpp: + (JSC::extractFunctionBody): + (JSC::constructFunction): + * runtime/FunctionConstructor.h: Renamed and exported extractFunctionBody for + use in initializing lazyNumericCompareFunction. + + * runtime/JSArray.cpp: + (JSC::compareNumbersForQSort): + (JSC::compareByStringPairForQSort): + (JSC::JSArray::sortNumeric): + (JSC::JSArray::sort): + * runtime/JSArray.h: Added a fast numeric sort. Renamed ArrayQSortPair + to be more specific since we do different kinds of qsort now. + + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + (JSC::JSGlobalData::numericCompareFunction): + (JSC::JSGlobalData::ClientData::~ClientData): + * runtime/JSGlobalData.h: Added helper data for computing the + isNumericCompareFunction bit. + +2009-02-13 Darin Adler <darin@apple.com> + + * Configurations/JavaScriptCore.xcconfig: Undo accidental commit of this file. + +2009-02-12 Darin Adler <darin@apple.com> + + Reviewed by Oliver Hunt and Alexey Proskuryakov. + + Speed up a couple string functions. + + * runtime/StringPrototype.cpp: + (JSC::stringProtoFuncIndexOf): Added a fast path for cases where the second + argument is either missing or an integer. + (JSC::stringProtoFuncBig): Use jsNontrivialString since the string is guaranteed + to be 2 or more characters long. + (JSC::stringProtoFuncSmall): Ditto. + (JSC::stringProtoFuncBlink): Ditto. + (JSC::stringProtoFuncBold): Ditto. + (JSC::stringProtoFuncItalics): Ditto. + (JSC::stringProtoFuncStrike): Ditto. + (JSC::stringProtoFuncSub): Ditto. + (JSC::stringProtoFuncSup): Ditto. + (JSC::stringProtoFuncFontcolor): Ditto. + (JSC::stringProtoFuncFontsize): Make the fast path Sam recently added even faster + by avoiding all but the minimum memory allocation. + (JSC::stringProtoFuncAnchor): Use jsNontrivialString. + (JSC::stringProtoFuncLink): Added a fast path. + + * runtime/UString.cpp: + (JSC::UString::find): Added a fast path for single-character search strings. + +2009-02-13 David Levin <levin@chromium.org> + + Reviewed by Darin Adler. + + Bug 23926: Race condition in callOnMainThreadAndWait + <https://bugs.webkit.org/show_bug.cgi?id=23926> + + * wtf/MainThread.cpp: + Removed callOnMainThreadAndWait since it isn't used. + +2009-02-13 Oliver Hunt <oliver@apple.com> + + Reviewed by Jon Honeycutt. + + Math.random is really slow on windows. + + Math.random calls WTF::randomNumber which is implemented as + the secure rand_s on windows. Unfortunately rand_s is an order + of magnitude slower than arc4random. For this reason I've + added "weakRandomNumber" for use by JavaScript's Math Object. + In the long term we should look at using our own secure PRNG + in place of the system, but this will do for now. + + 30% win on SunSpider on Windows, resolving most of the remaining + disparity vs. Mac. + + * runtime/MathObject.cpp: + (JSC::MathObject::MathObject): + (JSC::mathProtoFuncRandom): + * wtf/RandomNumber.cpp: + (WTF::weakRandomNumber): + (WTF::randomNumber): + * wtf/RandomNumber.h: + * wtf/RandomNumberSeed.h: + (WTF::initializeWeakRandomNumberGenerator): + +2009-02-12 Mark Rowe <mrowe@apple.com> + + Fix the build for other platforms. + + * wtf/RandomNumber.cpp: + (WTF::randomNumber): + +2009-02-12 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Sam Weinig. + + Remove (/reduce) use of hard-wired register names from the JIT. + Currently there is no abstraction of registers used in the JIT, + which has a number of negative consequences. Hard-wiring x86 + register names makes the JIT less portable to other platforms, + and prevents us from performing dynamic register allocation to + attempt to maintain more temporary values in machine registers. + (The latter will be more important on x86-64, where we have more + registers to make use of). + + Also, remove MacroAssembler::mod32. This was not providing a + useful abstraction, and was not in keeping with the rest of the + MacroAssembler interface, in having specific register requirements. + + * assembler/MacroAssemblerX86Common.h: + * jit/JIT.cpp: + (JSC::JIT::compileOpStrictEq): + (JSC::JIT::emitSlowScriptCheck): + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + (JSC::JIT::privateCompile): + (JSC::JIT::privateCompileCTIMachineTrampolines): + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::compileFastArith_op_lshift): + (JSC::JIT::compileFastArithSlow_op_lshift): + (JSC::JIT::compileFastArith_op_rshift): + (JSC::JIT::compileFastArithSlow_op_rshift): + (JSC::JIT::compileFastArith_op_bitand): + (JSC::JIT::compileFastArithSlow_op_bitand): + (JSC::JIT::compileFastArith_op_mod): + (JSC::JIT::compileFastArithSlow_op_mod): + (JSC::JIT::compileFastArith_op_post_inc): + (JSC::JIT::compileFastArithSlow_op_post_inc): + (JSC::JIT::compileFastArith_op_post_dec): + (JSC::JIT::compileFastArithSlow_op_post_dec): + (JSC::JIT::compileFastArith_op_pre_inc): + (JSC::JIT::compileFastArithSlow_op_pre_inc): + (JSC::JIT::compileFastArith_op_pre_dec): + (JSC::JIT::compileFastArithSlow_op_pre_dec): + (JSC::JIT::compileFastArith_op_add): + (JSC::JIT::compileFastArith_op_mul): + (JSC::JIT::compileFastArith_op_sub): + (JSC::JIT::compileBinaryArithOp): + * jit/JITCall.cpp: + (JSC::JIT::compileOpCallInitializeCallFrame): + (JSC::JIT::compileOpCallSetupArgs): + (JSC::JIT::compileOpCallEvalSetupArgs): + (JSC::JIT::compileOpConstructSetupArgs): + (JSC::JIT::compileOpCall): + (JSC::JIT::compileOpCallSlowCase): + * jit/JITInlineMethods.h: + (JSC::JIT::emitGetVirtualRegister): + (JSC::JIT::emitPutVirtualRegister): + (JSC::JIT::emitNakedCall): + (JSC::JIT::restoreArgumentReference): + (JSC::JIT::restoreArgumentReferenceForTrampoline): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::compilePutByIdHotPath): + (JSC::JIT::compileGetByIdSlowCase): + (JSC::JIT::compilePutByIdSlowCase): + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::privateCompilePatchGetArrayLength): + (JSC::JIT::privateCompileGetByIdSelf): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdSelfList): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChainList): + (JSC::JIT::privateCompileGetByIdChain): + (JSC::JIT::privateCompilePutByIdReplace): + +2009-02-12 Horia Olaru <olaru@adobe.com> + + Reviewed by Oliver Hunt. + + https://bugs.webkit.org/show_bug.cgi?id=23400 + + When throwing an exception within an eval argument string, the dst parameter was + modified in the functions below and the return value for eval was altered. Changed + the emitNode call in JSC::ThrowNode::emitBytecode to use a temporary register + to store its results instead of dst. The JSC::FunctionCallResolveNode::emitBytecode + would load the function within the dst registry, also altering the result returned + by eval. Replaced it with another temporary. + + * parser/Nodes.cpp: + (JSC::FunctionCallResolveNode::emitBytecode): + (JSC::ThrowNode::emitBytecode): + +2009-02-12 Sam Weinig <sam@webkit.org> + + Reviewed by Geoffrey Garen. + + Speed up String.prototype.fontsize. + + * runtime/StringPrototype.cpp: + (JSC::stringProtoFuncFontsize): Specialize for defined/commonly used values. + +2009-02-12 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Correctness fix. + + * wtf/RandomNumber.cpp: + (WTF::randomNumber): Divide by the maximum representable value, which + is different on each platform now, to get values between 0 and 1. + +2009-02-12 Geoffrey Garen <ggaren@apple.com> + + Build fix. + + * wtf/RandomNumber.cpp: + (WTF::randomNumber): + +2009-02-12 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Fixed <rdar://problem/6582048>. + + * wtf/RandomNumber.cpp: + (WTF::randomNumber): Make only one call to the random number generator + on platforms where the generator is cryptographically secure. The value + of randomness over and above cryptographically secure randomness is not + clear, and it caused some performance problems. + +2009-02-12 Adam Roben <aroben@apple.com> + + Fix lots of Perl warnings when building JavaScriptCoreGenerated on + Windows + + Reviewed by John Sullivan. + + * JavaScriptCore.vcproj/JavaScriptCore/build-generated-files.sh: + Create the docs/ directory so that we can write bytecode.html into it. + This matches what JavaScriptCore.xcodeproj does. + +2009-02-12 Simon Hausmann <simon.hausmann@nokia.com> + + Rubber-stamped by Lars. + + Re-enable the JIT in the Qt build with -fno-stack-protector on Linux. + + * JavaScriptCore.pri: + +2009-02-11 Dmitry Titov <dimich@chromium.org> + + Reviewed by Alexey Proskuryakov. + + https://bugs.webkit.org/show_bug.cgi?id=23705 + Fix the UI freeze caused by Worker generating a flood of messages. + Measure time we spend in executing posted work items. If too much time is spent + without returning to the run loop, exit and reschedule. + + * wtf/MainThread.h: + Added initializeMainThreadPlatform() to initialize low-level mechanism for posting + work items from thread to thread. This removes #ifdefs for WIN and CHROMIUM from platform-independent code. + + * wtf/MainThread.cpp: + (WTF::initializeMainThread): + (WTF::dispatchFunctionsFromMainThread): + Instead of dispatching all work items in the queue, dispatch them one by one + and measure elapsed time. After a threshold, reschedule and quit. + + (WTF::callOnMainThread): + (WTF::callOnMainThreadAndWait): + Only schedule dispatch if the queue was empty - to avoid many posted messages in the run loop queue. + + * wtf/mac/MainThreadMac.mm: + (WTF::scheduleDispatchFunctionsOnMainThread): + Use static instance of the mainThreadCaller instead of allocating and releasing it each time. + (WTF::initializeMainThreadPlatform): + * wtf/gtk/MainThreadChromium.cpp: + (WTF::initializeMainThreadPlatform): + * wtf/gtk/MainThreadGtk.cpp: + (WTF::initializeMainThreadPlatform): + * wtf/qt/MainThreadQt.cpp: + (WTF::initializeMainThreadPlatform): + * wtf/win/MainThreadWin.cpp: + (WTF::initializeMainThreadPlatform): + * wtf/wx/MainThreadWx.cpp: + (WTF::initializeMainThreadPlatform): + +2009-02-11 Sam Weinig <sam@webkit.org> + + Reviewed by Gavin Barraclough. + + Style cleanup. + + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::CodeLocationCommon::CodeLocationCommon): + (JSC::AbstractMacroAssembler::CodeLocationCommon::operator bool): + (JSC::AbstractMacroAssembler::CodeLocationCommon::reset): + (JSC::AbstractMacroAssembler::CodeLocationLabel::addressForSwitch): + (JSC::AbstractMacroAssembler::CodeLocationLabel::addressForExceptionHandler): + (JSC::AbstractMacroAssembler::CodeLocationLabel::addressForJSR): + (JSC::AbstractMacroAssembler::CodeLocationLabel::getJumpDestination): + (JSC::AbstractMacroAssembler::CodeLocationJump::relink): + (JSC::AbstractMacroAssembler::CodeLocationJump::CodeLocationJump): + (JSC::AbstractMacroAssembler::CodeLocationCall::relink): + (JSC::AbstractMacroAssembler::CodeLocationCall::calleeReturnAddressValue): + (JSC::AbstractMacroAssembler::CodeLocationCall::CodeLocationCall): + (JSC::AbstractMacroAssembler::CodeLocationDataLabel32::repatch): + (JSC::AbstractMacroAssembler::CodeLocationDataLabel32::CodeLocationDataLabel32): + (JSC::AbstractMacroAssembler::CodeLocationDataLabelPtr::repatch): + (JSC::AbstractMacroAssembler::CodeLocationDataLabelPtr::CodeLocationDataLabelPtr): + (JSC::AbstractMacroAssembler::ProcessorReturnAddress::ProcessorReturnAddress): + (JSC::AbstractMacroAssembler::ProcessorReturnAddress::relinkCallerToFunction): + (JSC::AbstractMacroAssembler::ProcessorReturnAddress::operator void*): + (JSC::AbstractMacroAssembler::PatchBuffer::link): + (JSC::::CodeLocationCommon::labelAtOffset): + (JSC::::CodeLocationCommon::jumpAtOffset): + (JSC::::CodeLocationCommon::callAtOffset): + (JSC::::CodeLocationCommon::dataLabelPtrAtOffset): + (JSC::::CodeLocationCommon::dataLabel32AtOffset): + +2009-02-11 Sam Weinig <sam@webkit.org> + + Reviewed by Gavin Barraclough. + + * assembler/AbstractMacroAssembler.h: Fix comments. + +2009-02-11 Alexey Proskuryakov <ap@webkit.org> + + Trying to fix wx build. + + * bytecode/JumpTable.h: Include "MacroAssembler.h", not <MacroAssembler.h>. + * jscore.bkl: Added assembler directory to search paths. + +2009-02-10 Gavin Barraclough <barraclough@apple.com> + + Build + fix. + (Narrow + changelog + for + dhyatt). + + * bytecode/Instruction.h: + (JSC::PolymorphicAccessStructureList::PolymorphicStubInfo::set): + (JSC::PolymorphicAccessStructureList::PolymorphicAccessStructureList): + +2009-02-10 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Reduce use of void* / reinterpret_cast in JIT repatching code, + add strong types for Calls and for the various types of pointers + we retain into the JIT generated instruction stream. + + No performance impact. + + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::ImmPtr::ImmPtr): + (JSC::AbstractMacroAssembler::ImmPtr::asIntptr): + (JSC::AbstractMacroAssembler::Imm32::Imm32): + (JSC::AbstractMacroAssembler::Label::Label): + (JSC::AbstractMacroAssembler::DataLabelPtr::DataLabelPtr): + (JSC::AbstractMacroAssembler::Call::Call): + (JSC::AbstractMacroAssembler::Call::link): + (JSC::AbstractMacroAssembler::Call::linkTo): + (JSC::AbstractMacroAssembler::Jump::Jump): + (JSC::AbstractMacroAssembler::Jump::linkTo): + (JSC::AbstractMacroAssembler::CodeLocationCommon::CodeLocationCommon): + (JSC::AbstractMacroAssembler::CodeLocationCommon::operator bool): + (JSC::AbstractMacroAssembler::CodeLocationCommon::reset): + (JSC::AbstractMacroAssembler::CodeLocationLabel::CodeLocationLabel): + (JSC::AbstractMacroAssembler::CodeLocationLabel::addressForSwitch): + (JSC::AbstractMacroAssembler::CodeLocationLabel::addressForExceptionHandler): + (JSC::AbstractMacroAssembler::CodeLocationLabel::addressForJSR): + (JSC::AbstractMacroAssembler::CodeLocationLabel::getJumpDestination): + (JSC::AbstractMacroAssembler::CodeLocationJump::CodeLocationJump): + (JSC::AbstractMacroAssembler::CodeLocationJump::relink): + (JSC::AbstractMacroAssembler::CodeLocationCall::CodeLocationCall): + (JSC::AbstractMacroAssembler::CodeLocationCall::relink): + (JSC::AbstractMacroAssembler::CodeLocationCall::calleeReturnAddressValue): + (JSC::AbstractMacroAssembler::CodeLocationDataLabel32::CodeLocationDataLabel32): + (JSC::AbstractMacroAssembler::CodeLocationDataLabel32::repatch): + (JSC::AbstractMacroAssembler::CodeLocationDataLabelPtr::CodeLocationDataLabelPtr): + (JSC::AbstractMacroAssembler::CodeLocationDataLabelPtr::repatch): + (JSC::AbstractMacroAssembler::ProcessorReturnAddress::ProcessorReturnAddress): + (JSC::AbstractMacroAssembler::ProcessorReturnAddress::relinkCallerToFunction): + (JSC::AbstractMacroAssembler::ProcessorReturnAddress::operator void*): + (JSC::AbstractMacroAssembler::PatchBuffer::entry): + (JSC::AbstractMacroAssembler::PatchBuffer::trampolineAt): + (JSC::AbstractMacroAssembler::PatchBuffer::link): + (JSC::AbstractMacroAssembler::PatchBuffer::linkTailRecursive): + (JSC::AbstractMacroAssembler::PatchBuffer::patch): + (JSC::AbstractMacroAssembler::PatchBuffer::locationOf): + (JSC::AbstractMacroAssembler::PatchBuffer::returnAddressOffset): + (JSC::AbstractMacroAssembler::differenceBetween): + (JSC::::CodeLocationCommon::labelAtOffset): + (JSC::::CodeLocationCommon::jumpAtOffset): + (JSC::::CodeLocationCommon::callAtOffset): + (JSC::::CodeLocationCommon::dataLabelPtrAtOffset): + (JSC::::CodeLocationCommon::dataLabel32AtOffset): + * assembler/MacroAssemblerX86Common.h: + (JSC::MacroAssemblerX86Common::call): + * assembler/X86Assembler.h: + (JSC::X86Assembler::getCallReturnOffset): + * bytecode/CodeBlock.h: + (JSC::CallLinkInfo::CallLinkInfo): + (JSC::getStructureStubInfoReturnLocation): + (JSC::getCallLinkInfoReturnLocation): + * bytecode/Instruction.h: + (JSC::PolymorphicAccessStructureList::PolymorphicStubInfo::set): + (JSC::PolymorphicAccessStructureList::PolymorphicAccessStructureList): + * bytecode/JumpTable.h: + (JSC::StringJumpTable::ctiForValue): + (JSC::SimpleJumpTable::ctiForValue): + * bytecode/StructureStubInfo.h: + (JSC::StructureStubInfo::StructureStubInfo): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitCatch): + (JSC::prepareJumpTableForStringSwitch): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::cti_op_get_by_id_self_fail): + (JSC::getPolymorphicAccessStructureListSlot): + (JSC::Interpreter::cti_op_throw): + (JSC::Interpreter::cti_op_switch_imm): + (JSC::Interpreter::cti_op_switch_char): + (JSC::Interpreter::cti_op_switch_string): + (JSC::Interpreter::cti_vm_throw): + * jit/JIT.cpp: + (JSC::ctiSetReturnAddress): + (JSC::ctiPatchCallByReturnAddress): + (JSC::JIT::privateCompile): + (JSC::JIT::privateCompileCTIMachineTrampolines): + * jit/JIT.h: + (JSC::CallRecord::CallRecord): + (JSC::JIT::compileGetByIdSelf): + (JSC::JIT::compileGetByIdProto): + (JSC::JIT::compileGetByIdChain): + (JSC::JIT::compilePutByIdReplace): + (JSC::JIT::compilePutByIdTransition): + (JSC::JIT::compilePatchGetArrayLength): + (JSC::JIT::emitCTICall): + * jit/JITCall.cpp: + (JSC::JIT::unlinkCall): + (JSC::JIT::linkCall): + * jit/JITInlineMethods.h: + (JSC::JIT::emitNakedCall): + (JSC::JIT::emitCTICall_internal): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::compileGetByIdSlowCase): + (JSC::JIT::compilePutByIdSlowCase): + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::patchGetByIdSelf): + (JSC::JIT::patchPutByIdReplace): + (JSC::JIT::privateCompilePatchGetArrayLength): + (JSC::JIT::privateCompileGetByIdSelf): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdSelfList): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChainList): + (JSC::JIT::privateCompileGetByIdChain): + (JSC::JIT::privateCompilePutByIdReplace): + +2009-02-10 Adam Roben <aroben@apple.com> + + Windows build fix after r40813 + + * JavaScriptCore.vcproj/jsc/jsc.vcproj: Added profiler/ to the include + path so that Profiler.h can be found. + +2009-02-09 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Provide a class type for a generated block of JIT code. + Also changes the return address -> bytecode index map to + track the return addess as an unsigned offset into the code + instead of a ptrdiff_t in terms of void**s - the latter is + equal to the actual offset / sizeof(void*), making it a + potentially lossy representation. + + * JavaScriptCore.xcodeproj/project.pbxproj: + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::PatchBuffer::returnAddressOffset): + * assembler/X86Assembler.h: + (JSC::X86Assembler::getCallReturnOffset): + * bytecode/CodeBlock.h: + (JSC::CallReturnOffsetToBytecodeIndex::CallReturnOffsetToBytecodeIndex): + (JSC::getCallReturnOffset): + (JSC::CodeBlock::getBytecodeIndex): + (JSC::CodeBlock::jitCode): + (JSC::CodeBlock::callReturnIndexVector): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::execute): + (JSC::Interpreter::cti_vm_dontLazyLinkCall): + (JSC::Interpreter::cti_vm_lazyLinkCall): + * jit/JIT.cpp: + (JSC::JIT::privateCompile): + * jit/JIT.h: + (JSC::): + * jit/JITCall.cpp: + (JSC::JIT::linkCall): + * jit/JITCode.h: Added. + (JSC::): + (JSC::JITCode::JITCode): + (JSC::JITCode::operator bool): + (JSC::JITCode::addressForCall): + (JSC::JITCode::offsetOf): + (JSC::JITCode::execute): + +2009-02-09 John Grabowski <jrg@chromium.org> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=23856 + Change the definition of "main thread" for Chromium on OSX. + It does not match the DARWIN definition. + + * wtf/ThreadingPthreads.cpp: + (WTF::initializeThreading): + (WTF::isMainThread): + +2009-02-09 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Minor bugfix, incorrect check meant that subtraction causing integer overflow + would be missed on x86-64 JIT. + + * jit/JITArithmetic.cpp: + (JSC::JIT::compileBinaryArithOp): + +2009-02-09 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + A more sensible register allocation for x86-64. + + When WREC was ported to x86-64 it stuck with the same register allocation as x86. + This requires registers to be reordered on entry into WREC generated code, since + argument passing is different on x86-64 and x86 (regparm(3)). This patch switches + x86-64 to use a native register allocation, that does not require argument registers + to be reordered. + + * wrec/WRECGenerator.cpp: + (JSC::WREC::Generator::generateEnter): + (JSC::WREC::Generator::generateReturnSuccess): + (JSC::WREC::Generator::generateReturnFailure): + * wrec/WRECGenerator.h: + +2009-02-05 Adam Roben <aroben@apple.com> + + Build fix + + Rubberstamped by Sam Weinig. + + * wtf/TypeTraits.h: Include Platform.h, since this header uses macros + defined there. + +2009-02-05 Dimitri Glazkov <dglazkov@chromium.org> + + Reviewed by Eric Seidel. + + https://bugs.webkit.org/show_bug.cgi?id=23747 + Add Chromium threading-related files. + + * wtf/MainThread.cpp: Added platform guard to initializeMainThread. + * wtf/chromium/ChromiumThreading.h: Added. + * wtf/chromium/MainThreadChromium.cpp: Added. + (WTF::initializeMainThread): + (WTF::scheduleDispatchFunctionsOnMainThread): + +2009-02-05 David Levin <levin@chromium.org> + + Reviewed by Darin Adler. + + Bug 23713: COMPILE_ASSERTS should be moved out of TypeTraits.h and into .cpp file + <https://bugs.webkit.org/show_bug.cgi?id=23713> + + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.scons: + * JavaScriptCore.vcproj/WTF/WTF.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + + * wtf/HashTraits.h: + Remove unnecessary header file that I missed when moving out the type traits form this file. + + * wtf/TypeTraits.cpp: Added. + (WTF::): + * wtf/TypeTraits.h: + Moved the compile asserts into TypeTraits.cpp file. + +2009-02-04 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver 'the nun' Hunt. + + Add -e switch to jsc to enable evaluation of scripts passed on the command line. + + * jsc.cpp: + (Script::Script): + (runWithScripts): + (printUsageStatement): + (parseArguments): + (jscmain): + +2009-02-04 Gavin Barraclough <barraclough@apple.com> + + Rubber stamped by Sam 'Big Mac' Weinig. + + * assembler/AbstractMacroAssembler.h: Copied from assembler/MacroAssembler.h. + * assembler/MacroAssemblerX86.h: Copied from assembler/MacroAssembler.h. + * assembler/MacroAssemblerX86Common.h: Copied from assembler/MacroAssembler.h. + * assembler/MacroAssemblerX86_64.h: Copied from assembler/MacroAssembler.h. + +2009-02-04 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Sam Weinig. + + This patch tidies up the MacroAssembler, cleaning up the code and refactoring out the + platform-specific parts. The MacroAssembler gets split up like a beef burger, with the + platform-agnostic data types being the lower bun (in the form of the class AbstractMacroAssembler), + the plaform-specific code generation forming a big meaty patty of methods like 'add32', + 'branch32', etc (MacroAssemblerX86), and finally topped off with the bun-lid of the + MacroAssembler class itself, providing covenience methods such as the stack peek & poke, + and backwards branch methods, all of which can be described in a platform independent + way using methods from the base class. The AbstractMacroAssembler is templated on the + type of the assembler class that will be used for code generation, and the three layers + are held together with the cocktail stick of inheritance. + + The above description is a slight simplification since the MacroAssemblerX86 is actually + formed from two layers (in effect giving us a kind on bacon double cheeseburger) - with the + bulk of methods that are common between x86 & x86-64 implemented in MacroAssemblerX86Common, + which forms a base class for MacroAssemblerX86 and MacroAssemblerX86_64 (which add the methods + specific to the given platform). + + I'm landing these changes first without splitting the classes across multiple files, + I will follow up with a second patch to split up the file MacroAssembler.h. + + * assembler/MacroAssembler.h: + (JSC::AbstractMacroAssembler::): + (JSC::AbstractMacroAssembler::DataLabelPtr::DataLabelPtr): + (JSC::AbstractMacroAssembler::DataLabelPtr::patch): + (JSC::AbstractMacroAssembler::DataLabel32::DataLabel32): + (JSC::AbstractMacroAssembler::DataLabel32::patch): + (JSC::AbstractMacroAssembler::Label::Label): + (JSC::AbstractMacroAssembler::Jump::Jump): + (JSC::AbstractMacroAssembler::Jump::link): + (JSC::AbstractMacroAssembler::Jump::linkTo): + (JSC::AbstractMacroAssembler::Jump::patch): + (JSC::AbstractMacroAssembler::JumpList::link): + (JSC::AbstractMacroAssembler::JumpList::linkTo): + (JSC::AbstractMacroAssembler::PatchBuffer::link): + (JSC::AbstractMacroAssembler::PatchBuffer::addressOf): + (JSC::AbstractMacroAssembler::PatchBuffer::setPtr): + (JSC::AbstractMacroAssembler::size): + (JSC::AbstractMacroAssembler::copyCode): + (JSC::AbstractMacroAssembler::label): + (JSC::AbstractMacroAssembler::align): + (JSC::AbstractMacroAssembler::differenceBetween): + (JSC::MacroAssemblerX86Common::xor32): + (JSC::MacroAssemblerX86Common::load32WithAddressOffsetPatch): + (JSC::MacroAssemblerX86Common::store32WithAddressOffsetPatch): + (JSC::MacroAssemblerX86Common::move): + (JSC::MacroAssemblerX86Common::swap): + (JSC::MacroAssemblerX86Common::signExtend32ToPtr): + (JSC::MacroAssemblerX86Common::zeroExtend32ToPtr): + (JSC::MacroAssemblerX86Common::branch32): + (JSC::MacroAssemblerX86Common::jump): + (JSC::MacroAssemblerX86_64::add32): + (JSC::MacroAssemblerX86_64::sub32): + (JSC::MacroAssemblerX86_64::load32): + (JSC::MacroAssemblerX86_64::store32): + (JSC::MacroAssemblerX86_64::addPtr): + (JSC::MacroAssemblerX86_64::andPtr): + (JSC::MacroAssemblerX86_64::orPtr): + (JSC::MacroAssemblerX86_64::rshiftPtr): + (JSC::MacroAssemblerX86_64::subPtr): + (JSC::MacroAssemblerX86_64::xorPtr): + (JSC::MacroAssemblerX86_64::loadPtr): + (JSC::MacroAssemblerX86_64::loadPtrWithAddressOffsetPatch): + (JSC::MacroAssemblerX86_64::storePtr): + (JSC::MacroAssemblerX86_64::storePtrWithAddressOffsetPatch): + (JSC::MacroAssemblerX86_64::branchPtr): + (JSC::MacroAssemblerX86_64::branchTestPtr): + (JSC::MacroAssemblerX86_64::branchAddPtr): + (JSC::MacroAssemblerX86_64::branchSubPtr): + (JSC::MacroAssemblerX86_64::branchPtrWithPatch): + (JSC::MacroAssemblerX86_64::storePtrWithPatch): + (JSC::MacroAssemblerX86::add32): + (JSC::MacroAssemblerX86::sub32): + (JSC::MacroAssemblerX86::load32): + (JSC::MacroAssemblerX86::store32): + (JSC::MacroAssemblerX86::branch32): + (JSC::MacroAssemblerX86::branchPtrWithPatch): + (JSC::MacroAssemblerX86::storePtrWithPatch): + (JSC::MacroAssembler::pop): + (JSC::MacroAssembler::peek): + (JSC::MacroAssembler::poke): + (JSC::MacroAssembler::branchPtr): + (JSC::MacroAssembler::branch32): + (JSC::MacroAssembler::branch16): + (JSC::MacroAssembler::branchTestPtr): + (JSC::MacroAssembler::addPtr): + (JSC::MacroAssembler::andPtr): + (JSC::MacroAssembler::orPtr): + (JSC::MacroAssembler::rshiftPtr): + (JSC::MacroAssembler::subPtr): + (JSC::MacroAssembler::xorPtr): + (JSC::MacroAssembler::loadPtr): + (JSC::MacroAssembler::loadPtrWithAddressOffsetPatch): + (JSC::MacroAssembler::storePtr): + (JSC::MacroAssembler::storePtrWithAddressOffsetPatch): + (JSC::MacroAssembler::branchAddPtr): + (JSC::MacroAssembler::branchSubPtr): + * jit/JITArithmetic.cpp: + (JSC::JIT::compileBinaryArithOp): + +2009-02-04 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Sam Weinig. + + https://bugs.webkit.org/show_bug.cgi?id=23681 + Worker tests crash in debug builds if run --singly + + The crash happened because worker threads continued running while debug-only static objects + were already being destroyed on main thread. + + * runtime/Structure.cpp: Create static debug-only sets in heap, so that they don't get + destroyed. + + * wtf/ThreadingPthreads.cpp: Changed assertions to conventional form. + +2009-02-03 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + https://bugs.webkit.org/show_bug.cgi?id=23715 + + Simplify MacroAssembler interface, by combining comparison methods. + Seprate operations are combined as follows: + jz32/jnz32/jzPtr/jnzPtr -> branchTest32/branchTestPtr, + j*(Add|Mul|Sub)32/j*(Add|Mul|Sub)Ptr -> branch(Add|Mul|Sub)32/branch(Add|Mul|Sub)Ptr + j*32/j*Ptr (all other two op combparisons) -> branch32/brnachPtr + set*32 -> set32 + + Also, represent the Scale of BaseIndex addresses as a plain enum (0,1,2,3), + instead of as multiplicands (1,2,4,8). + + This patch singificantly reduces replication of code, and increases functionality supported + by the MacroAssembler. No performance impact. + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::): + (JSC::MacroAssembler::branchPtr): + (JSC::MacroAssembler::branchPtrWithPatch): + (JSC::MacroAssembler::branch32): + (JSC::MacroAssembler::branch16): + (JSC::MacroAssembler::branchTestPtr): + (JSC::MacroAssembler::branchTest32): + (JSC::MacroAssembler::branchAddPtr): + (JSC::MacroAssembler::branchAdd32): + (JSC::MacroAssembler::branchMul32): + (JSC::MacroAssembler::branchSubPtr): + (JSC::MacroAssembler::branchSub32): + (JSC::MacroAssembler::set32): + (JSC::MacroAssembler::setTest32): + * assembler/X86Assembler.h: + (JSC::X86Assembler::): + (JSC::X86Assembler::jccRel32): + (JSC::X86Assembler::setccOpcode): + (JSC::X86Assembler::cmpq_mr): + (JSC::X86Assembler::setcc_r): + (JSC::X86Assembler::sete_r): + (JSC::X86Assembler::setne_r): + (JSC::X86Assembler::jne): + (JSC::X86Assembler::je): + (JSC::X86Assembler::jl): + (JSC::X86Assembler::jb): + (JSC::X86Assembler::jle): + (JSC::X86Assembler::jbe): + (JSC::X86Assembler::jge): + (JSC::X86Assembler::jg): + (JSC::X86Assembler::ja): + (JSC::X86Assembler::jae): + (JSC::X86Assembler::jo): + (JSC::X86Assembler::jp): + (JSC::X86Assembler::js): + (JSC::X86Assembler::jcc): + (JSC::X86Assembler::X86InstructionFormatter::putModRmSib): + * jit/JIT.cpp: + (JSC::JIT::compileOpStrictEq): + (JSC::JIT::emitSlowScriptCheck): + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + (JSC::JIT::privateCompile): + (JSC::JIT::privateCompileCTIMachineTrampolines): + * jit/JITArithmetic.cpp: + (JSC::JIT::compileFastArith_op_lshift): + (JSC::JIT::compileFastArith_op_mod): + (JSC::JIT::compileFastArith_op_post_inc): + (JSC::JIT::compileFastArith_op_post_dec): + (JSC::JIT::compileFastArith_op_pre_inc): + (JSC::JIT::compileFastArith_op_pre_dec): + (JSC::JIT::compileBinaryArithOp): + (JSC::JIT::compileFastArith_op_add): + (JSC::JIT::compileFastArith_op_mul): + * jit/JITCall.cpp: + (JSC::JIT::compileOpCall): + (JSC::JIT::compileOpCallSlowCase): + * jit/JITInlineMethods.h: + (JSC::JIT::checkStructure): + (JSC::JIT::emitJumpIfJSCell): + (JSC::JIT::emitJumpIfNotJSCell): + (JSC::JIT::emitJumpIfImmediateNumber): + (JSC::JIT::emitJumpIfNotImmediateNumber): + (JSC::JIT::emitJumpIfImmediateInteger): + (JSC::JIT::emitJumpIfNotImmediateInteger): + (JSC::JIT::emitFastArithDeTagImmediateJumpIfZero): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::compilePutByIdHotPath): + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::privateCompilePatchGetArrayLength): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChainList): + (JSC::JIT::privateCompileGetByIdChain): + * runtime/RegExp.cpp: + (JSC::RegExp::match): + * wrec/WRECGenerator.cpp: + (JSC::WREC::Generator::generateEnter): + (JSC::WREC::Generator::generateIncrementIndex): + (JSC::WREC::Generator::generateLoadCharacter): + (JSC::WREC::Generator::generateJumpIfNotEndOfInput): + (JSC::WREC::Generator::generateBackreferenceQuantifier): + (JSC::WREC::Generator::generateNonGreedyQuantifier): + (JSC::WREC::Generator::generateGreedyQuantifier): + (JSC::WREC::Generator::generatePatternCharacterPair): + (JSC::WREC::Generator::generatePatternCharacter): + (JSC::WREC::Generator::generateCharacterClassInvertedRange): + (JSC::WREC::Generator::generateCharacterClassInverted): + (JSC::WREC::Generator::generateAssertionBOL): + (JSC::WREC::Generator::generateAssertionEOL): + (JSC::WREC::Generator::generateAssertionWordBoundary): + (JSC::WREC::Generator::generateBackreference): + +2009-02-03 David Hyatt <hyatt@apple.com> + + Fix a bug in Vector's shrinkCapacity method. It did not properly copy elements into the inline buffer + when shrinking down from a size that was greater than the inline capacity. + + Reviewed by Maciej + + * wtf/Vector.h: + (WTF::VectorBuffer::VectorBuffer): + (WTF::VectorBuffer::allocateBuffer): + +2009-02-03 Simon Hausmann <simon.hausmann@nokia.com> + + Reviewed by Tor Arne Vestbø. + + Added accessor for JSByteArray storage. + + * runtime/JSByteArray.h: + (JSC::JSByteArray::storage): + +2009-02-03 Dmitry Titov <dimich@chromium.org> + + Reviewed by Alexey Proskuryakov. + + https://bugs.webkit.org/show_bug.cgi?id=23560 + Implement SharedTimer on WorkerRunLoop + + * JavaScriptCore.exp: + Forgot to expose ThreadCondition::timedWait() in one of previous patches. + +2009-02-02 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + <https://bugs.webkit.org/show_bug.cgi?id=21414> REGRESSION: Regular Expressions and character classes, shorthands and ranges + <rdar://problem/6543487> + + In certain circumstances when WREC::Generator::generateCharacterClassInvertedRange invokes + itself recursively, it will incorrectly emit (and thus consume) the next single character + match in the current character class. As WREC uses a binary search this out of sequence + codegen could result in a character match being missed and so cause the regex to produce + incorrect results. + + * wrec/WRECGenerator.cpp: + (JSC::WREC::Generator::generateCharacterClassInvertedRange): + +2009-02-02 Darin Adler <darin@apple.com> + + Reviewed by Dave Hyatt. + + Bug 23676: Speed up uses of reserveCapacity on new vectors by adding a new reserveInitialCapacity + https://bugs.webkit.org/show_bug.cgi?id=23676 + + * API/JSObjectRef.cpp: + (JSObjectCopyPropertyNames): Use reserveInitialCapacity. + * parser/Lexer.cpp: + (JSC::Lexer::Lexer): Ditto. + (JSC::Lexer::clear): Ditto. + + * wtf/Vector.h: Added reserveInitialCapacity, a more efficient version of + reserveCapacity for use when the vector is brand new (still size 0 with no + capacity other than the inline capacity). + +2009-01-30 Mark Rowe <mrowe@apple.com> + + Rubber-stamped by Oliver Hunt. + + <rdar://problem/6391501> Enable the JIT on Mac OS X x86_64 as it passes all tests. + + * wtf/Platform.h: + +2009-01-30 Oliver Hunt <oliver@apple.com> + + Reviewed by Mark Rowe and Sam Weinig. + + Finally fix load() to propagate exceptions correctly. + + * jsc.cpp: + (functionLoad): + +2009-01-30 David Levin <levin@chromium.org> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=23618 + Templated worker tasks should be more error proof to use. + Fix Chromium build. + + * wtf/TypeTraits.h: + (WTF::IsConvertibleToInteger::IsConvertibleToDouble): + Avoid "possible loss of data" warning when using Microsoft's C++ compiler + by avoiding an implicit conversion of int types to doubles. + +2009-01-30 Laszlo Gombos <laszlo.1.gombos@nokia.com> + + Reviewed by Simon Hausmann. + + Bug 23580: GNU mode RVCT compilation support + <https://bugs.webkit.org/show_bug.cgi?id=23580> + + * pcre/pcre_exec.cpp: Use COMPILER(GCC) instead of __GNUC__. + * wtf/FastMalloc.cpp: Ditto. + (WTF::TCMallocStats::): + * wtf/Platform.h: Don't define COMPILER(GCC) with RVCT --gnu. + +2009-01-30 David Levin <levin@chromium.org> + + Reviewed by Alexey Proskuryakov. + + Bug 23618: Templated worker tasks should be more error proof to use + <https://bugs.webkit.org/show_bug.cgi?id=23618> + + Add the type traits needed for the generic worker tasks + and compile asserts for them. + + Add a summary header to the TypeTraits.h file to explain what is in there. + + Add a note to explain IsPod's deficiencies. + + * wtf/TypeTraits.h: + +2009-01-30 David Levin <levin@chromium.org> + + Reviewed by Alexey Proskuryakov. + + Bug 23616: Various "template helpers" should be consolidated from isolated files in JavaScriptCore. + <https://bugs.webkit.org/show_bug.cgi?id=23616> + + * wtf/TypeTraits.h: Moved RemovePointer, IsPod, IsInteger to this file. + + * wtf/OwnPtr.h: Use RemovePointer from TypeTraits.h. + * wtf/RetainPtr.h: Ditto. + + * wtf/HashTraits.h: Use IsInteger from TypeTraits.h. + + * wtf/VectorTraits.h: Use IsPod from TypeTraits.h. + + * GNUmakefile.am: + * JavaScriptCore.vcproj/WTF/WTF.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + Added TypeTraits.h. + +2009-01-29 Stephanie Lewis <slewis@apple.com> + + RS by Oliver Hunt. + + Update the order files. + + * JavaScriptCore.order: + +2009-01-29 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Oliver Hunt. + + Bug 23551: Crash on page load with profiler enabled and running + <https://bugs.webkit.org/show_bug.cgi?id=23551> + <rdar://problem/6529521> + + Interpreter::execute(FunctionBodyNode*, ...) calls Profiler::didExecute() + with a stale CallFrame. If some part of the scope chain has already been + freed, Profiler::didExecute() will crash when attempting to get the lexical + global object. The fix is to make the didExecute() call use the caller's + CallFrame, not the one made for the function call. In this case, the + willExecute() call should also be changed to match. + + Since this occurs in the actual inspector JS, it is difficult to reduce. + I couldn't make a layout test. + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::execute): + +2009-01-28 Sam Weinig <sam@webkit.org> + + Reviewed by Gavin Barraclough. + + Fix for <rdar://problem/6525537> + Hang occurs when closing Installer window (iTunes, Aperture) + + * JavaScriptCore.exp: Export JSGlobalData::sharedInstance. + +2009-01-28 Sam Weinig <sam@webkit.org> + + Reviewed by Geoff Garen. + + Initial patch by Mark Rowe. + + <rdar://problem/6519356> + REGRESSION (r36006): "out of memory" alert running dromaeo on Windows + + Report the cost of the ArrayStorage vector more accurately/often. + + * runtime/JSArray.cpp: + (JSC::JSArray::JSArray): Report the extra cost even for a filled array + because JSString using the single character optimization and immediates + wont increase the cost themselves. + (JSC::JSArray::putSlowCase): Update the cost when increasing the size of + the array. + (JSC::JSArray::increaseVectorLength): Ditto. + +2009-01-28 Sam Weinig <sam@webkit.org> + + Reviewed by Geoff Garen. + + Fix for <rdar://problem/6129678> + REGRESSION (Safari 3-4): Local variable not accessible from Dashcode console or variables view + + Iterating the properties of activation objects accessed through the WebKit debugging + APIs was broken by forced conversion of JSActivation to the global object. To fix this, + we use a proxy activation object that acts more like a normal JSObject. + + * debugger/DebuggerActivation.cpp: Added. + (JSC::DebuggerActivation::DebuggerActivation): + (JSC::DebuggerActivation::mark): + (JSC::DebuggerActivation::className): + (JSC::DebuggerActivation::getOwnPropertySlot): + (JSC::DebuggerActivation::put): + (JSC::DebuggerActivation::putWithAttributes): + (JSC::DebuggerActivation::deleteProperty): + (JSC::DebuggerActivation::getPropertyNames): + (JSC::DebuggerActivation::getPropertyAttributes): + (JSC::DebuggerActivation::defineGetter): + (JSC::DebuggerActivation::defineSetter): + (JSC::DebuggerActivation::lookupGetter): + (JSC::DebuggerActivation::lookupSetter): + * debugger/DebuggerActivation.h: Added. + Proxy JSActivation object for Debugging. + + * runtime/JSActivation.h: + (JSC::JSActivation::isActivationObject): Added. + * runtime/JSObject.h: + (JSC::JSObject::isActivationObject): Added. + +2009-01-28 David Kilzer <ddkilzer@apple.com> + + Bug 23490: Remove initialRefCount argument from RefCounted class + + <https://bugs.webkit.org/show_bug.cgi?id=23490> + + Reviewed by Darin Adler. + + RefCountedBase now always starts with a ref count of 1, so there + is no need to pass the initialRefCount into the class anymore. + + * wtf/ByteArray.h: + (WTF::ByteArray::ByteArray): Removed call to RefCounted(1). + * wtf/RefCounted.h: + (WTF::RefCountedBase::RefCountedBase): Changed to start with a + ref count of 1. + (WTF::RefCounted::RefCounted): Removed initialRefCount argument + and removed call to RefCounted(1). + +2009-01-26 Adele Peterson <adele@apple.com> + + Build fix. + + * debugger/Debugger.cpp: + +2009-01-26 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Darin Adler. + + Fixes for eq null & neq null, on 64-bit JIT. + https://bugs.webkit.org/show_bug.cgi?id=23559 + + This patch degrades 64-bit JIT performance on some benchmarks, + due to the whole not-being-incorrect thing. + + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + +2009-01-26 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Gavin Barraclough. + + Bug 23552: Dashcode evaluator no longer works after making ExecStates actual call frames + <https://bugs.webkit.org/show_bug.cgi?id=23552> + <rdar://problem/6398839> + + * JavaScriptCore.exp: + * debugger/Debugger.cpp: + (JSC::evaluateInGlobalCallFrame): Added so that WebScriptCallFrame can + evaluate JS starting from a global call frame. + * debugger/Debugger.h: + +2009-01-25 Mark Rowe <mrowe@apple.com> + + Rubber-stamped by Dan Bernstein. + + Improve the consistency of settings in our .xcconfig files. + + * Configurations/Base.xcconfig: Enable GCC_OBJC_CALL_CXX_CDTORS to match other projects. + +2009-01-25 Darin Adler <darin@apple.com> + + Reviewed by Mark Rowe. + + Bug 23352: Turn on more compiler warnings in the Mac build + https://bugs.webkit.org/show_bug.cgi?id=23352 + + Turn on the following warnings: + + -Wcast-qual + -Wextra-tokens + -Wformat=2 + -Winit-self + -Wmissing-noreturn + -Wpacked + -Wrendundant-decls + + * Configurations/Base.xcconfig: Added the new warnings. Switched to -Wextra instead of + -W for clarity since we don't have to support the older versions of gcc that require the + old -W syntax. Since we now use -Wformat=2, removed -Wformat-security. Also removed + -Wno-format-y2k since we can have that one on now. + +2009-01-25 Judit Jasz <jasy@inf.u-szeged.hu> + + Reviewed by Darin Adler. + + Compilation problem fixing + http://bugs.webkit.org/show_bug.cgi?id=23497 + + * jit/JITCall.cpp: + (JSC::JIT::compileOpCall): Use JSValuePtr::encode. + +2009-01-25 Darin Adler <darin@apple.com> + + Reviewed by Sam Weinig. + + Bug 23352: Turn on more compiler warnings in the Mac build + https://bugs.webkit.org/show_bug.cgi?id=23352 + + Fourth patch: Deal with the last few stray warnings. + + * parser/Parser.cpp: Only declare jscyyparse if it's not already declared. + This makes both separate compilation and all-in-one compilation work with the + -Wredundant-decls warning. + +2009-01-25 Darin Adler <darin@apple.com> + + Reviewed by Sam Weinig. + + Bug 23352: Turn on more compiler warnings in the Mac build + https://bugs.webkit.org/show_bug.cgi?id=23352 + + Third patch: Use the noreturn attribute on functions that don't + return to prepare for the use of the -Wmissing-noreturn warning. + + * jit/JITCall.cpp: + (JSC::unreachable): Added NO_RETURN. + * jsc.cpp: + (functionQuit): Ditto. + (printUsageStatement): Ditto. + * wtf/AlwaysInline.h: Added definition of NO_RETURN. + +2009-01-24 Oliver Hunt <oliver@apple.com> + + Reviewed by Maciej Stachowiak. + + Force inlining of Lexer::matchPunctuator + + 2.2% win when parsing jQuery, Mootools, Prototype, etc + + * parser/Lexer.h: + +2009-01-23 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Fix for <rdar://problem/6126212> + Ensure that callbacks out from the JSC interface are only allowed + to return in reverse-chronological order to that in which they were + made. If we allow earlier callbacks to return first, then this may + result in setions of the RegisterFile in use by another thread + being trampled. + + See uber-comment in JSLock.h for details. + + * runtime/JSLock.cpp: + (JSC::JSLock::DropAllLocks::DropAllLocks): + (JSC::JSLock::DropAllLocks::~DropAllLocks): + +2009-01-23 Darin Adler <darin@apple.com> + + Try to fix WX build. + + * runtime/JSGlobalObjectFunctions.h: Include <wtf/unicode/Unicode.h> + for the definition of UChar. + +2009-01-23 Anders Carlsson <andersca@apple.com> + + * Configurations/Base.xcconfig: + GCC 4.0 build fix. + + * runtime/JSNumberCell.h: + 64-bit build fix. + +2009-01-23 Anders Carlsson <andersca@apple.com> + + Reviewed by Sam Weinig. + + Turn on -Wmissing-prototypes and fix the warnings. + + * API/JSClassRef.cpp: + (clearReferenceToPrototype): + * Configurations/Base.xcconfig: + * runtime/Collector.cpp: + (JSC::getPlatformThreadRegisters): + * runtime/ExceptionHelpers.cpp: + (JSC::createError): + * runtime/JSGlobalObjectFunctions.h: + * runtime/JSNumberCell.h: + * runtime/UString.cpp: + (JSC::initializeStaticBaseString): + (JSC::createRep): + * wtf/FastMalloc.cpp: + * wtf/Threading.cpp: + +2009-01-22 Mark Rowe <mrowe@apple.com> + + Rubber-stamped by Anders Carlsson. + + Disable GCC_WARN_ABOUT_MISSING_PROTOTYPES temporarily. + + Current versions of Xcode only respect it for C and Objective-C files, + and our code doesn't currently compile if it is applied to C++ and + Objective-C++ files. + + * Configurations/Base.xcconfig: + +2009-01-22 Steve Falkenburg <sfalken@apple.com> + + https://bugs.webkit.org/show_bug.cgi?id=23489 + + Return currentTime() in correct units for the two early return cases. + + Reviewed by Mark Rowe. + + * wtf/CurrentTime.cpp: + (WTF::currentTime): + +2009-01-22 Sam Weinig <sam@webkit.org> + + Reviewed by Mark Rowe. + + Fix for <rdar://problem/6439247> + FastMalloc allocating an extra 4MB of meta-data on 64-bit + + Rely on the fact that on all known x86-64 platforms only use 48 bits of + address space to shrink the initial size of the PageMap from ~4MB to 120K. + For 64-bit we still use a 3-level radix tree, but now each level is only 12 + bits wide. + + No performance change. + + * wtf/FastMalloc.cpp: + (WTF::MapSelector): Add specialization for 64 bit that takes into account the + 16 bits of unused address space on x86-64. + +2009-01-22 Beth Dakin <bdakin@apple.com> + + Reviewed by Sam Weinig. + + Fix for https://bugs.webkit.org/show_bug.cgi?id=23461 LayoutTests/ + fast/js/numeric-conversion.html is broken, and corresponding + <rdar://problem/6514842> + + The basic problem here is that parseInt(Infinity) should be NaN, + but we were returning 0. NaN matches Safari 3.2.1 and Firefox. + + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::globalFuncParseInt): + +2009-01-22 Oliver Hunt <oliver@apple.com> + + Reviewed by Geoff Garen. + + <rdar://problem/6516853> (r39682-r39736) JSFunFuzz: crash on "(function(){({ x2: x }), })()" + <https://bugs.webkit.org/show_bug.cgi?id=23479> + + Automatic semicolon insertion was resulting in this being accepted in the initial + nodeless parsing, but subsequent reparsing for code generation would fail, leading + to a crash. The solution is to ensure that reparsing a function performs parsing + in the same state as the initial parse. We do this by modifying the saved source + ranges to include rather than exclude the opening and closing braces. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::reparseForExceptionInfoIfNecessary): add an assertion for successful recompile + * parser/Lexer.h: + (JSC::Lexer::sourceCode): include rather than exclude braces. + * parser/Nodes.h: + (JSC::FunctionBodyNode::toSourceString): No need to append braces anymore. + +2009-01-22 Dmitry Titov <dimich@chromium.org> + + Reviewed by Alexey Proskuryakov. + + https://bugs.webkit.org/show_bug.cgi?id=23373 + + Implement ThreadCondition::timedWait(). + Since we borrow the code for condition variables from other sources, + I did the same for timedWait(). See comments in ThreadingWin.cpp for + rationale and more info. + + * wtf/CONTRIBUTORS.pthreads-win32: + Added. A list of Pthreads-win32 contributors mentioned in their license. The license itself + is included into wtf/ThreadingWin32.cpp. + + * wtf/Threading.h: + * wtf/ThreadingWin.cpp: + Additional info and Pthreads-win32 license at the beginning. + (WTF::PlatformCondition::timedWait): new method, derived from Pthreads-win32. + (WTF::PlatformCondition::signal): same + (WTF::ThreadCondition::ThreadCondition): + (WTF::ThreadCondition::~ThreadCondition): + (WTF::ThreadCondition::wait): this now calls PlatformCondition::timedWait. + (WTF::ThreadCondition::timedWait): same + (WTF::ThreadCondition::signal): this now calls PlatformCondition::signal. + (WTF::ThreadCondition::broadcast): same + +2009-01-21 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Fix for https://bugs.webkit.org/show_bug.cgi?id=23469. + + We need to check all numbers in integer switches, not just those + represented as integer JSImmediates. + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): + (JSC::Interpreter::cti_op_switch_imm): + +2009-01-21 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Fix for https://bugs.webkit.org/show_bug.cgi?id=23468. + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): + +2009-01-21 Alexey Proskuryakov <ap@webkit.org> + + Suggested by Oliver Hunt. Reviewed by Oliver Hunt. + + https://bugs.webkit.org/show_bug.cgi?id=23456 + Function argument names leak + + * parser/Nodes.cpp: (JSC::FunctionBodyNode::~FunctionBodyNode): Destruct parameter names. + +2009-01-20 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Build fix). + + Windows build fix + + * JavaScriptCore.vcproj/WTF/WTF.vcproj: + +2009-01-20 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Mark Rowe. + + Structure property table deleted offset maps are being leaked. + Probably shouldn't be doing that. + + https://bugs.webkit.org/show_bug.cgi?id=23442 + + * runtime/Structure.cpp: + (JSC::Structure::~Structure): + +2009-01-20 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (build fix). + + Attempt to fix gtk build + + * GNUmakefile.am: + +2009-01-20 Darin Adler <darin@apple.com> + + * runtime/StringPrototype.cpp: + (JSC::substituteBackreferences): Add back the initialization to fix the build. + +2009-01-20 Darin Adler <darin@apple.com> + + Reviewed by Mark Rowe. + + Bug 23352: Turn on more compiler warnings in the Mac build + https://bugs.webkit.org/show_bug.cgi?id=23352 + + First patch: Fix some simple cases of various warnings. + + * pcre/pcre_compile.cpp: + (jsRegExpCompile): Use const_cast to change const-ness. + + * runtime/StringPrototype.cpp: + (JSC::substituteBackreferences): Remove unneeded initialization and + use UChar instead of unsigned short for UTF-16 values. + + * wtf/dtoa.cpp: + (WTF::strtod): Use const_cast to change const-ness. + +2009-01-20 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (build fix). + + Whoops, remove runtime/ByteArray references from .pri and .scons builds, update .bkl + + * JavaScriptCore.pri: + * JavaScriptCore.scons: + * JavaScriptCoreSources.bkl: + +2009-01-20 Oliver Hunt <oliver@apple.com> + + RS=Dan Bernstein. + + Move runtime/ByteArray to wtf/ByteArray + + * GNUmakefile.am: + * JavaScriptCore.exp: + * JavaScriptCore.pri: + * JavaScriptCore.scons: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.vcproj/WTF/WTF.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * runtime/JSByteArray.cpp: + * runtime/JSByteArray.h: + * wtf/ByteArray.cpp: Renamed from JavaScriptCore/runtime/ByteArray.cpp. + (WTF::ByteArray::create): + * wtf/ByteArray.h: Renamed from JavaScriptCore/runtime/ByteArray.h. + (WTF::ByteArray::length): + (WTF::ByteArray::set): + (WTF::ByteArray::get): + (WTF::ByteArray::data): + (WTF::ByteArray::deref): + (WTF::ByteArray::ByteArray): + +2009-01-19 Sam Weinig <sam@webkit.org> + + Rubber-stamped by Gavin Barraclough. + + Remove temporary operator-> from JSValuePtr. + + * API/JSCallbackFunction.cpp: + (JSC::JSCallbackFunction::call): + * API/JSCallbackObjectFunctions.h: + (JSC::::call): + (JSC::::toNumber): + (JSC::::toString): + * API/JSObjectRef.cpp: + (JSObjectSetPrototype): + * API/JSValueRef.cpp: + (JSValueGetType): + (JSValueIsUndefined): + (JSValueIsNull): + (JSValueIsBoolean): + (JSValueIsNumber): + (JSValueIsString): + (JSValueIsObject): + (JSValueIsObjectOfClass): + (JSValueToBoolean): + (JSValueToNumber): + (JSValueToStringCopy): + (JSValueToObject): + * bytecode/CodeBlock.cpp: + (JSC::valueToSourceString): + (JSC::CodeBlock::mark): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::isKnownNotImmediate): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitEqualityOp): + (JSC::keyForImmediateSwitch): + * interpreter/Interpreter.cpp: + (JSC::jsLess): + (JSC::jsLessEq): + (JSC::jsAddSlowCase): + (JSC::jsAdd): + (JSC::jsTypeStringForValue): + (JSC::jsIsObjectType): + (JSC::jsIsFunctionType): + (JSC::isNotObject): + (JSC::Interpreter::callEval): + (JSC::Interpreter::throwException): + (JSC::cachePrototypeChain): + (JSC::Interpreter::tryCachePutByID): + (JSC::countPrototypeChainEntriesAndCheckForProxies): + (JSC::Interpreter::tryCacheGetByID): + (JSC::Interpreter::privateExecute): + (JSC::Interpreter::tryCTICachePutByID): + (JSC::Interpreter::tryCTICacheGetByID): + (JSC::Interpreter::cti_op_convert_this): + (JSC::Interpreter::cti_op_add): + (JSC::Interpreter::cti_op_pre_inc): + (JSC::Interpreter::cti_op_put_by_id_generic): + (JSC::Interpreter::cti_op_get_by_id_generic): + (JSC::Interpreter::cti_op_put_by_id): + (JSC::Interpreter::cti_op_put_by_id_second): + (JSC::Interpreter::cti_op_put_by_id_fail): + (JSC::Interpreter::cti_op_get_by_id): + (JSC::Interpreter::cti_op_get_by_id_second): + (JSC::Interpreter::cti_op_get_by_id_self_fail): + (JSC::Interpreter::cti_op_get_by_id_proto_list): + (JSC::Interpreter::cti_op_get_by_id_proto_list_full): + (JSC::Interpreter::cti_op_get_by_id_proto_fail): + (JSC::Interpreter::cti_op_get_by_id_array_fail): + (JSC::Interpreter::cti_op_get_by_id_string_fail): + (JSC::Interpreter::cti_op_instanceof): + (JSC::Interpreter::cti_op_del_by_id): + (JSC::Interpreter::cti_op_mul): + (JSC::Interpreter::cti_op_call_JSFunction): + (JSC::Interpreter::cti_op_call_NotJSFunction): + (JSC::Interpreter::cti_op_construct_JSConstruct): + (JSC::Interpreter::cti_op_construct_NotJSConstruct): + (JSC::Interpreter::cti_op_get_by_val): + (JSC::Interpreter::cti_op_get_by_val_byte_array): + (JSC::Interpreter::cti_op_sub): + (JSC::Interpreter::cti_op_put_by_val): + (JSC::Interpreter::cti_op_put_by_val_array): + (JSC::Interpreter::cti_op_put_by_val_byte_array): + (JSC::Interpreter::cti_op_loop_if_true): + (JSC::Interpreter::cti_op_negate): + (JSC::Interpreter::cti_op_div): + (JSC::Interpreter::cti_op_pre_dec): + (JSC::Interpreter::cti_op_not): + (JSC::Interpreter::cti_op_jtrue): + (JSC::Interpreter::cti_op_post_inc): + (JSC::Interpreter::cti_op_lshift): + (JSC::Interpreter::cti_op_bitand): + (JSC::Interpreter::cti_op_rshift): + (JSC::Interpreter::cti_op_bitnot): + (JSC::Interpreter::cti_op_mod): + (JSC::Interpreter::cti_op_post_dec): + (JSC::Interpreter::cti_op_urshift): + (JSC::Interpreter::cti_op_bitxor): + (JSC::Interpreter::cti_op_bitor): + (JSC::Interpreter::cti_op_push_scope): + (JSC::Interpreter::cti_op_is_undefined): + (JSC::Interpreter::cti_op_is_boolean): + (JSC::Interpreter::cti_op_is_number): + (JSC::Interpreter::cti_op_to_jsnumber): + (JSC::Interpreter::cti_op_in): + (JSC::Interpreter::cti_op_put_by_index): + (JSC::Interpreter::cti_op_switch_imm): + (JSC::Interpreter::cti_op_switch_char): + (JSC::Interpreter::cti_op_switch_string): + (JSC::Interpreter::cti_op_del_by_val): + (JSC::Interpreter::cti_op_put_getter): + (JSC::Interpreter::cti_op_put_setter): + (JSC::Interpreter::cti_op_new_error): + * interpreter/Interpreter.h: + (JSC::Interpreter::isJSArray): + (JSC::Interpreter::isJSString): + (JSC::Interpreter::isJSByteArray): + * interpreter/Register.h: + (JSC::Register::marked): + (JSC::Register::mark): + * jit/JITInlineMethods.h: + (JSC::JIT::getConstantOperandImmediateInt): + (JSC::JIT::isOperandConstantImmediateInt): + * jsc.cpp: + (functionPrint): + (functionDebug): + (functionRun): + (functionLoad): + (runWithScripts): + (runInteractive): + * parser/Nodes.cpp: + (JSC::processClauseList): + * profiler/ProfileGenerator.cpp: + (JSC::ProfileGenerator::addParentForConsoleStart): + * profiler/Profiler.cpp: + (JSC::Profiler::createCallIdentifier): + * runtime/ArrayConstructor.cpp: + (JSC::constructArrayWithSizeQuirk): + * runtime/ArrayPrototype.cpp: + (JSC::arrayProtoFuncToString): + (JSC::arrayProtoFuncToLocaleString): + (JSC::arrayProtoFuncJoin): + (JSC::arrayProtoFuncConcat): + (JSC::arrayProtoFuncPop): + (JSC::arrayProtoFuncPush): + (JSC::arrayProtoFuncReverse): + (JSC::arrayProtoFuncShift): + (JSC::arrayProtoFuncSlice): + (JSC::arrayProtoFuncSort): + (JSC::arrayProtoFuncSplice): + (JSC::arrayProtoFuncUnShift): + (JSC::arrayProtoFuncFilter): + (JSC::arrayProtoFuncMap): + (JSC::arrayProtoFuncEvery): + (JSC::arrayProtoFuncForEach): + (JSC::arrayProtoFuncSome): + (JSC::arrayProtoFuncIndexOf): + (JSC::arrayProtoFuncLastIndexOf): + * runtime/BooleanConstructor.cpp: + (JSC::constructBoolean): + (JSC::callBooleanConstructor): + * runtime/BooleanPrototype.cpp: + (JSC::booleanProtoFuncToString): + (JSC::booleanProtoFuncValueOf): + * runtime/Collector.cpp: + (JSC::Heap::protect): + (JSC::Heap::unprotect): + (JSC::Heap::heap): + (JSC::Heap::collect): + (JSC::typeName): + * runtime/Completion.cpp: + (JSC::evaluate): + * runtime/DateConstructor.cpp: + (JSC::constructDate): + (JSC::dateParse): + (JSC::dateUTC): + * runtime/DateInstance.h: + (JSC::DateInstance::internalNumber): + * runtime/DatePrototype.cpp: + (JSC::formatLocaleDate): + (JSC::fillStructuresUsingTimeArgs): + (JSC::fillStructuresUsingDateArgs): + (JSC::dateProtoFuncToString): + (JSC::dateProtoFuncToUTCString): + (JSC::dateProtoFuncToDateString): + (JSC::dateProtoFuncToTimeString): + (JSC::dateProtoFuncToLocaleString): + (JSC::dateProtoFuncToLocaleDateString): + (JSC::dateProtoFuncToLocaleTimeString): + (JSC::dateProtoFuncGetTime): + (JSC::dateProtoFuncGetFullYear): + (JSC::dateProtoFuncGetUTCFullYear): + (JSC::dateProtoFuncToGMTString): + (JSC::dateProtoFuncGetMonth): + (JSC::dateProtoFuncGetUTCMonth): + (JSC::dateProtoFuncGetDate): + (JSC::dateProtoFuncGetUTCDate): + (JSC::dateProtoFuncGetDay): + (JSC::dateProtoFuncGetUTCDay): + (JSC::dateProtoFuncGetHours): + (JSC::dateProtoFuncGetUTCHours): + (JSC::dateProtoFuncGetMinutes): + (JSC::dateProtoFuncGetUTCMinutes): + (JSC::dateProtoFuncGetSeconds): + (JSC::dateProtoFuncGetUTCSeconds): + (JSC::dateProtoFuncGetMilliSeconds): + (JSC::dateProtoFuncGetUTCMilliseconds): + (JSC::dateProtoFuncGetTimezoneOffset): + (JSC::dateProtoFuncSetTime): + (JSC::setNewValueFromTimeArgs): + (JSC::setNewValueFromDateArgs): + (JSC::dateProtoFuncSetYear): + (JSC::dateProtoFuncGetYear): + * runtime/ErrorConstructor.cpp: + (JSC::constructError): + * runtime/ErrorPrototype.cpp: + (JSC::errorProtoFuncToString): + * runtime/ExceptionHelpers.cpp: + (JSC::createError): + (JSC::createErrorMessage): + * runtime/FunctionConstructor.cpp: + (JSC::constructFunction): + * runtime/FunctionPrototype.cpp: + (JSC::functionProtoFuncToString): + (JSC::functionProtoFuncApply): + (JSC::functionProtoFuncCall): + * runtime/GetterSetter.cpp: + (JSC::GetterSetter::toObject): + * runtime/JSActivation.cpp: + (JSC::JSActivation::getOwnPropertySlot): + * runtime/JSArray.cpp: + (JSC::JSArray::put): + (JSC::JSArray::mark): + (JSC::JSArray::sort): + (JSC::AVLTreeAbstractorForArrayCompare::compare_key_key): + (JSC::JSArray::compactForSorting): + * runtime/JSByteArray.h: + (JSC::JSByteArray::setIndex): + * runtime/JSCell.h: + (JSC::asCell): + * runtime/JSFunction.cpp: + (JSC::JSFunction::call): + (JSC::JSFunction::construct): + * runtime/JSGlobalObject.cpp: + (JSC::markIfNeeded): + (JSC::lastInPrototypeChain): + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::encode): + (JSC::decode): + (JSC::globalFuncEval): + (JSC::globalFuncParseInt): + (JSC::globalFuncParseFloat): + (JSC::globalFuncIsNaN): + (JSC::globalFuncIsFinite): + (JSC::globalFuncEscape): + (JSC::globalFuncUnescape): + (JSC::globalFuncJSCPrint): + * runtime/JSImmediate.cpp: + (JSC::JSImmediate::toThisObject): + (JSC::JSImmediate::toObject): + (JSC::JSImmediate::prototype): + (JSC::JSImmediate::toString): + * runtime/JSImmediate.h: + * runtime/JSObject.cpp: + (JSC::JSObject::mark): + (JSC::JSObject::put): + (JSC::callDefaultValueFunction): + (JSC::JSObject::getPrimitiveNumber): + (JSC::JSObject::defineGetter): + (JSC::JSObject::defineSetter): + (JSC::JSObject::lookupGetter): + (JSC::JSObject::lookupSetter): + (JSC::JSObject::hasInstance): + (JSC::JSObject::toNumber): + (JSC::JSObject::toString): + * runtime/JSObject.h: + (JSC::JSObject::JSObject): + (JSC::JSObject::inlineGetOwnPropertySlot): + (JSC::JSObject::getOwnPropertySlotForWrite): + (JSC::JSObject::getPropertySlot): + (JSC::JSValuePtr::get): + * runtime/JSPropertyNameIterator.h: + (JSC::JSPropertyNameIterator::create): + * runtime/JSString.cpp: + (JSC::JSString::getOwnPropertySlot): + * runtime/JSValue.h: + * runtime/JSWrapperObject.cpp: + (JSC::JSWrapperObject::mark): + * runtime/JSWrapperObject.h: + (JSC::JSWrapperObject::setInternalValue): + * runtime/MathObject.cpp: + (JSC::mathProtoFuncAbs): + (JSC::mathProtoFuncACos): + (JSC::mathProtoFuncASin): + (JSC::mathProtoFuncATan): + (JSC::mathProtoFuncATan2): + (JSC::mathProtoFuncCeil): + (JSC::mathProtoFuncCos): + (JSC::mathProtoFuncExp): + (JSC::mathProtoFuncFloor): + (JSC::mathProtoFuncLog): + (JSC::mathProtoFuncMax): + (JSC::mathProtoFuncMin): + (JSC::mathProtoFuncPow): + (JSC::mathProtoFuncRound): + (JSC::mathProtoFuncSin): + (JSC::mathProtoFuncSqrt): + (JSC::mathProtoFuncTan): + * runtime/NativeErrorConstructor.cpp: + (JSC::NativeErrorConstructor::NativeErrorConstructor): + (JSC::NativeErrorConstructor::construct): + * runtime/NumberConstructor.cpp: + (JSC::constructWithNumberConstructor): + (JSC::callNumberConstructor): + * runtime/NumberPrototype.cpp: + (JSC::numberProtoFuncToString): + (JSC::numberProtoFuncToLocaleString): + (JSC::numberProtoFuncValueOf): + (JSC::numberProtoFuncToFixed): + (JSC::numberProtoFuncToExponential): + (JSC::numberProtoFuncToPrecision): + * runtime/ObjectConstructor.cpp: + (JSC::constructObject): + * runtime/ObjectPrototype.cpp: + (JSC::objectProtoFuncValueOf): + (JSC::objectProtoFuncHasOwnProperty): + (JSC::objectProtoFuncIsPrototypeOf): + (JSC::objectProtoFuncDefineGetter): + (JSC::objectProtoFuncDefineSetter): + (JSC::objectProtoFuncLookupGetter): + (JSC::objectProtoFuncLookupSetter): + (JSC::objectProtoFuncPropertyIsEnumerable): + (JSC::objectProtoFuncToLocaleString): + (JSC::objectProtoFuncToString): + * runtime/Operations.h: + (JSC::JSValuePtr::equalSlowCaseInline): + (JSC::JSValuePtr::strictEqual): + (JSC::JSValuePtr::strictEqualSlowCaseInline): + * runtime/Protect.h: + (JSC::gcProtect): + (JSC::gcUnprotect): + * runtime/RegExpConstructor.cpp: + (JSC::setRegExpConstructorInput): + (JSC::setRegExpConstructorMultiline): + (JSC::constructRegExp): + * runtime/RegExpObject.cpp: + (JSC::setRegExpObjectLastIndex): + (JSC::RegExpObject::match): + * runtime/RegExpPrototype.cpp: + (JSC::regExpProtoFuncTest): + (JSC::regExpProtoFuncExec): + (JSC::regExpProtoFuncCompile): + (JSC::regExpProtoFuncToString): + * runtime/StringConstructor.cpp: + (JSC::stringFromCharCodeSlowCase): + (JSC::stringFromCharCode): + (JSC::constructWithStringConstructor): + (JSC::callStringConstructor): + * runtime/StringPrototype.cpp: + (JSC::stringProtoFuncReplace): + (JSC::stringProtoFuncToString): + (JSC::stringProtoFuncCharAt): + (JSC::stringProtoFuncCharCodeAt): + (JSC::stringProtoFuncConcat): + (JSC::stringProtoFuncIndexOf): + (JSC::stringProtoFuncLastIndexOf): + (JSC::stringProtoFuncMatch): + (JSC::stringProtoFuncSearch): + (JSC::stringProtoFuncSlice): + (JSC::stringProtoFuncSplit): + (JSC::stringProtoFuncSubstr): + (JSC::stringProtoFuncSubstring): + (JSC::stringProtoFuncToLowerCase): + (JSC::stringProtoFuncToUpperCase): + (JSC::stringProtoFuncLocaleCompare): + (JSC::stringProtoFuncBig): + (JSC::stringProtoFuncSmall): + (JSC::stringProtoFuncBlink): + (JSC::stringProtoFuncBold): + (JSC::stringProtoFuncFixed): + (JSC::stringProtoFuncItalics): + (JSC::stringProtoFuncStrike): + (JSC::stringProtoFuncSub): + (JSC::stringProtoFuncSup): + (JSC::stringProtoFuncFontcolor): + (JSC::stringProtoFuncFontsize): + (JSC::stringProtoFuncAnchor): + (JSC::stringProtoFuncLink): + * runtime/Structure.cpp: + (JSC::Structure::Structure): + (JSC::Structure::getEnumerablePropertyNames): + (JSC::Structure::createCachedPrototypeChain): + * runtime/Structure.h: + (JSC::Structure::mark): + * runtime/StructureChain.cpp: + (JSC::StructureChain::StructureChain): + +2009-01-19 Darin Adler <darin@apple.com> + + Reviewed by Sam Weinig. + + Bug 23409: REGRESSION: RegExp 'replace()' function improperly processes '$$' + <https://bugs.webkit.org/show_bug.cgi?id=23409> + <rdar://problem/6505723> + + Test: fast/js/string-replace-3.html + + * runtime/StringPrototype.cpp: + (JSC::substituteBackreferences): Remove code that adds an extra $ -- not sure + how this ever worked. + +2009-01-16 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + On x86-64 jit, cache JSImmedate::TagMask & JSImmedate::TagTypeNumber in + registers, save reloading them every time they're used. + + Draws x86-64 jit performance close to that of i386 jit. + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::subPtr): + (JSC::MacroAssembler::jnzPtr): + (JSC::MacroAssembler::jzPtr): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::compileBinaryArithOpSlowCase): + * jit/JITInlineMethods.h: + (JSC::JIT::emitJumpIfJSCell): + (JSC::JIT::emitJumpIfNotJSCell): + (JSC::JIT::emitJumpIfImmediateNumber): + (JSC::JIT::emitJumpIfNotImmediateNumber): + (JSC::JIT::emitJumpIfImmediateInteger): + (JSC::JIT::emitJumpIfNotImmediateInteger): + (JSC::JIT::emitFastArithIntToImmNoCheck): + +2009-01-16 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Add support to x86-64 JIT for inline double precision arithmetic ops. + +5/6% on x86-64, JIT enabled, sunspider. + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::addPtr): + * assembler/X86Assembler.h: + (JSC::X86Assembler::movq_rr): + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::compileFastArith_op_pre_inc): + (JSC::JIT::compileBinaryArithOp): + (JSC::JIT::compileBinaryArithOpSlowCase): + (JSC::JIT::compileFastArith_op_add): + (JSC::JIT::compileFastArithSlow_op_add): + (JSC::JIT::compileFastArith_op_mul): + (JSC::JIT::compileFastArithSlow_op_mul): + (JSC::JIT::compileFastArith_op_sub): + (JSC::JIT::compileFastArithSlow_op_sub): + * parser/ResultType.h: + (JSC::ResultType::isReusable): + (JSC::ResultType::isInt32): + (JSC::ResultType::definitelyIsNumber): + (JSC::ResultType::mightBeNumber): + (JSC::ResultType::isNotNumber): + (JSC::ResultType::unknownType): + +2009-01-16 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Fixes for SamplingTool. + + https://bugs.webkit.org/show_bug.cgi?id=23390 + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::storePtr): + * bytecode/SamplingTool.cpp: + (JSC::SamplingTool::run): + (JSC::SamplingTool::dump): + * bytecode/SamplingTool.h: + (JSC::SamplingTool::encodeSample): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompile): + * jit/JIT.h: + (JSC::JIT::samplingToolTrackCodeBlock): + * jit/JITCall.cpp: + (JSC::JIT::compileOpCall): + (JSC::JIT::compileOpCallSlowCase): + * jit/JITInlineMethods.h: + (JSC::JIT::emitCTICall_internal): + +2009-01-16 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Darin Adler. + + Fixed <rdar://problem/6452301> REGRESSION: Latest WebKit nightlies + turn "c" into "" when stripping \\c_ character + + * wrec/WRECParser.cpp: + (JSC::WREC::Parser::consumeEscape): Mimic a Firefox quirk when parsing + control escapes inside character classes. + +2009-01-16 Adam Roben <aroben@apple.com> + + Windows build fix + + * wrec/WRECParser.cpp: + (JSC::WREC::Parser::parseParentheses): Removed unreachable code. + +2009-01-15 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Cameron Zwarich. + + Fixed <rdar://problem/6471394> REGRESSION (r39164): Discarding quantifier + on assertion gives incorrect result (23075) + + https://bugs.webkit.org/show_bug.cgi?id=23075 + + * pcre/pcre_compile.cpp: + (compileBranch): Throw away an assertion if it's followed by a quantifier + with a 0 minimum, to match SpiderMonkey, v8, and the ECMA spec. + + * wrec/WRECParser.cpp: + (JSC::WREC::Parser::parseParentheses): Fall back on PCRE for the rare + case of an assertion with a quantifier with a 0 minimum, since we + don't handle quantified subexpressions yet, and in this special case, + we can't just throw away the quantifier. + +2009-01-15 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Add support in ResultType to track that the results of bitops + are always of type int32_t. + + * parser/Nodes.cpp: + (JSC::ReadModifyResolveNode::emitBytecode): + (JSC::ReadModifyDotNode::emitBytecode): + (JSC::ReadModifyBracketNode::emitBytecode): + * parser/Nodes.h: + (JSC::ExpressionNode::): + (JSC::BooleanNode::): + (JSC::NumberNode::): + (JSC::StringNode::): + (JSC::PrePostResolveNode::): + (JSC::TypeOfResolveNode::): + (JSC::TypeOfValueNode::): + (JSC::UnaryPlusNode::): + (JSC::NegateNode::): + (JSC::BitwiseNotNode::): + (JSC::LogicalNotNode::): + (JSC::MultNode::): + (JSC::DivNode::): + (JSC::ModNode::): + (JSC::SubNode::): + (JSC::LeftShiftNode::): + (JSC::RightShiftNode::): + (JSC::UnsignedRightShiftNode::): + (JSC::LessNode::): + (JSC::GreaterNode::): + (JSC::LessEqNode::): + (JSC::GreaterEqNode::): + (JSC::InstanceOfNode::): + (JSC::EqualNode::): + (JSC::NotEqualNode::): + (JSC::StrictEqualNode::): + (JSC::NotStrictEqualNode::): + (JSC::BitAndNode::): + (JSC::BitOrNode::): + (JSC::BitXOrNode::): + (JSC::LogicalOpNode::): + * parser/ResultType.h: + (JSC::ResultType::isInt32): + (JSC::ResultType::isNotNumber): + (JSC::ResultType::booleanType): + (JSC::ResultType::numberType): + (JSC::ResultType::numberTypeCanReuse): + (JSC::ResultType::numberTypeCanReuseIsInt32): + (JSC::ResultType::stringOrNumberTypeCanReuse): + (JSC::ResultType::stringType): + (JSC::ResultType::unknownType): + (JSC::ResultType::forAdd): + (JSC::ResultType::forBitOp): + (JSC::OperandTypes::OperandTypes): + +2009-01-15 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Add support for integer addition, subtraction and multiplication + in JIT code on x86-64. + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::mul32): + (JSC::MacroAssembler::sub32): + (JSC::MacroAssembler::joMul32): + (JSC::MacroAssembler::joSub32): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::compileFastArith_op_add): + (JSC::JIT::compileFastArithSlow_op_add): + (JSC::JIT::compileFastArith_op_mul): + (JSC::JIT::compileFastArithSlow_op_mul): + (JSC::JIT::compileFastArith_op_sub): + (JSC::JIT::compileFastArithSlow_op_sub): + +2009-01-15 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + On x86-64 allow JSImmediate to encode 64-bit double precision values. + This patch only affects builds that set USE(ALTERNATE_JSIMMEDIATE). + Updates the implementation of JSValuePtr:: and JSImmediate:: methods + that operate on neumeric values to be be aware of the new representation. + When this representation is in use, the class JSNumberCell is redundant + and is compiled out. + + The format of the new immediate representation is documented in JSImmediate.h. + + * JavaScriptCore.exp: + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::subPtr): + * assembler/X86Assembler.h: + (JSC::X86Assembler::): + (JSC::X86Assembler::subq_rr): + (JSC::X86Assembler::movq_rr): + (JSC::X86Assembler::ucomisd_rr): + (JSC::X86Assembler::X86InstructionFormatter::twoByteOp64): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::cti_op_stricteq): + (JSC::Interpreter::cti_op_nstricteq): + * jit/JIT.cpp: + (JSC::JIT::compileOpStrictEq): + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::compileFastArith_op_lshift): + (JSC::JIT::compileFastArith_op_rshift): + (JSC::JIT::compileFastArith_op_bitand): + (JSC::JIT::compileFastArith_op_mod): + (JSC::JIT::compileFastArith_op_add): + (JSC::JIT::compileFastArith_op_mul): + (JSC::JIT::compileFastArith_op_post_inc): + (JSC::JIT::compileFastArith_op_post_dec): + (JSC::JIT::compileFastArith_op_pre_inc): + (JSC::JIT::compileFastArith_op_pre_dec): + (JSC::JIT::putDoubleResultToJSNumberCellOrJSImmediate): + (JSC::JIT::compileBinaryArithOp): + * jit/JITInlineMethods.h: + (JSC::JIT::emitJumpIfBothJSCells): + (JSC::JIT::emitJumpIfEitherNumber): + (JSC::JIT::emitJumpIfNotEitherNumber): + (JSC::JIT::emitJumpIfImmediateIntegerNumber): + (JSC::JIT::emitJumpIfNotImmediateIntegerNumber): + (JSC::JIT::emitJumpIfNotImmediateIntegerNumbers): + (JSC::JIT::emitJumpSlowCaseIfNotImmediateIntegerNumber): + (JSC::JIT::emitJumpSlowCaseIfNotImmediateIntegerNumbers): + (JSC::JIT::emitFastArithDeTagImmediate): + (JSC::JIT::emitFastArithDeTagImmediateJumpIfZero): + (JSC::JIT::emitFastArithReTagImmediate): + (JSC::JIT::emitFastArithIntToImmNoCheck): + * runtime/JSCell.h: + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + * runtime/JSImmediate.cpp: + (JSC::JSImmediate::toThisObject): + (JSC::JSImmediate::toObject): + (JSC::JSImmediate::toString): + * runtime/JSImmediate.h: + (JSC::wtf_reinterpret_cast): + (JSC::JSImmediate::isNumber): + (JSC::JSImmediate::isIntegerNumber): + (JSC::JSImmediate::isDoubleNumber): + (JSC::JSImmediate::isPositiveIntegerNumber): + (JSC::JSImmediate::areBothImmediateIntegerNumbers): + (JSC::JSImmediate::makeInt): + (JSC::JSImmediate::makeDouble): + (JSC::JSImmediate::doubleValue): + (JSC::doubleToBoolean): + (JSC::JSImmediate::toBoolean): + (JSC::JSImmediate::getTruncatedUInt32): + (JSC::JSImmediate::makeOutOfIntegerRange): + (JSC::JSImmediate::from): + (JSC::JSImmediate::getTruncatedInt32): + (JSC::JSImmediate::toDouble): + (JSC::JSImmediate::getUInt32): + (JSC::JSValuePtr::isInt32Fast): + (JSC::JSValuePtr::isUInt32Fast): + (JSC::JSValuePtr::areBothInt32Fast): + (JSC::JSFastMath::canDoFastBitwiseOperations): + (JSC::JSFastMath::xorImmediateNumbers): + (JSC::JSFastMath::canDoFastRshift): + (JSC::JSFastMath::canDoFastUrshift): + (JSC::JSFastMath::rightShiftImmediateNumbers): + (JSC::JSFastMath::canDoFastAdditiveOperations): + (JSC::JSFastMath::addImmediateNumbers): + (JSC::JSFastMath::subImmediateNumbers): + * runtime/JSNumberCell.cpp: + (JSC::jsNumberCell): + * runtime/JSNumberCell.h: + (JSC::createNumberStructure): + (JSC::isNumberCell): + (JSC::asNumberCell): + (JSC::jsNumber): + (JSC::JSValuePtr::isDoubleNumber): + (JSC::JSValuePtr::getDoubleNumber): + (JSC::JSValuePtr::isNumber): + (JSC::JSValuePtr::uncheckedGetNumber): + (JSC::jsNaN): + (JSC::JSValuePtr::getNumber): + (JSC::JSValuePtr::numberToInt32): + (JSC::JSValuePtr::numberToUInt32): + * runtime/JSValue.h: + * runtime/NumberConstructor.cpp: + (JSC::numberConstructorNegInfinity): + (JSC::numberConstructorPosInfinity): + (JSC::numberConstructorMaxValue): + (JSC::numberConstructorMinValue): + * runtime/NumberObject.cpp: + (JSC::constructNumber): + * runtime/NumberObject.h: + * runtime/Operations.h: + (JSC::JSValuePtr::equal): + (JSC::JSValuePtr::equalSlowCaseInline): + (JSC::JSValuePtr::strictEqual): + (JSC::JSValuePtr::strictEqualSlowCaseInline): + * wtf/Platform.h: + +2009-01-15 Sam Weinig <sam@webkit.org> + + Reviewed by Geoffrey Garen. + + <rdar://problem/6045018> + REGRESSION (r34838): JavaScript objects appear to be leaked after loading google.com + + Subtract the number of JSStrings cached in SmallStrings when calculating the + number of live JSObjects. + + * runtime/Collector.cpp: + (JSC::Heap::objectCount): + * runtime/SmallStrings.cpp: + (JSC::SmallStrings::count): + * runtime/SmallStrings.h: + +2009-01-15 Sam Weinig <sam@webkit.org> + + Fix Qt build. + + * runtime/Collector.cpp: + +2009-01-15 Sam Weinig <sam@webkit.org> + + Reviewed by Gavin Barraclough. + + Fix crash seen running fast/canvas. + + Make sure to mark the ScopeNode and CodeBlock being created + in the re-parse for exception information. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::reparseForExceptionInfoIfNecessary): + * parser/Nodes.h: + (JSC::ScopeNode::mark): + * runtime/Collector.cpp: + (JSC::Heap::collect): + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + * runtime/JSGlobalData.h: + +2009-01-15 Craig Schlenter <craig.schlenter@gmail.com> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=23347 + Compilation of JavaScriptCore/wtf/ThreadingPthreads.cpp fails on Linux + + * wtf/ThreadingPthreads.cpp: included limits.h as INT_MAX is defined there. + +2009-01-15 Oliver Hunt <oliver@apple.com> + + Reviewed by Geoff Garen. + + Bug 23225: REGRESSION: Assertion failure in reparseInPlace() (m_sourceElements) at sfgate.com + <https://bugs.webkit.org/show_bug.cgi?id=23225> <rdar://problem/6487432> + + Character position for open and closing brace was incorrectly referencing m_position to + record their position in a source document, however this is unsafe as BOMs may lead to + m_position being an arbitrary position from the real position of the current character. + + * parser/Lexer.cpp: + (JSC::Lexer::matchPunctuator): + +2009-01-14 David Kilzer <ddkilzer@apple.com> + + Bug 23153: JSC build always touches JavaScriptCore/docs/bytecode.html + + <https://bugs.webkit.org/show_bug.cgi?id=23153> + + Reviewed by Darin Adler. + + Instead of building bytecode.html into ${SRCROOT}/docs/bytecode.html, build it + into ${BUILT_PRODUCTS_DIR}/DerivedSources/JavaScriptCore/docs/bytecode.html. + + Also fixes make-bytecode-docs.pl to actually generate documentation. + + * DerivedSources.make: Changed bytecode.html to be built into local docs + directory in ${BUILT_PRODUCTS_DIR}/DerivedSources/JavaScriptCore. + * JavaScriptCore.xcodeproj/project.pbxproj: Added "/docs" to the end of the + "mkdir -p" command so that the docs subdirectory is automatically created. + * docs/make-bytecode-docs.pl: Changed BEGIN_OPCODE to DEFINE_OPCODE so that + documentation is actually generated. + +2009-01-14 Adam Treat <adam.treat@torchmobile.com> + + Build fix for Qt from Dmitry Titov. + + * wtf/ThreadingQt.cpp: + (WTF::ThreadCondition::timedWait): + +2009-01-14 Oliver Hunt <oliver@apple.com> + + Reviewed by Cameron Zwarich. + + Bug 22903: REGRESSION (r36267): visiting this site reliably crashes WebKit nightly + + EvalCodeBlock's do not reference the functions that are declared inside the eval + code, this means that simply marking the EvalCodeBlock through the global object + is insufficient to mark the declared functions. This patch corrects this by + explicitly marking the CodeBlocks of all the functions declared in the cached + EvalNode. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::mark): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::hasFunctions): + * bytecode/EvalCodeCache.h: + (JSC::EvalCodeCache::mark): + * parser/Nodes.cpp: + (JSC::ScopeNodeData::mark): + (JSC::EvalNode::mark): + * parser/Nodes.h: + +2009-01-14 Dmitry Titov <dimich@chromium.org> + + Reviewed by Alexey Proskuryakov. + + https://bugs.webkit.org/show_bug.cgi?id=23312 + Implement MessageQueue::waitForMessageTimed() + Also fixed ThreadCondition::timedWait() to take absolute time, as discussed on webkit-dev. + Win32 version of timedWait still has to be implemented. + + * wtf/MessageQueue.h: + (WTF::MessageQueueWaitResult: new enum for the result of MessageQueue::waitForMessageTimed. + (WTF::MessageQueue::waitForMessage): + (WTF::MessageQueue::waitForMessageTimed): New method. + * wtf/Threading.h: + * wtf/ThreadingGtk.cpp: + (WTF::ThreadCondition::timedWait): changed to use absolute time instead of interval. + * wtf/ThreadingNone.cpp: + (WTF::ThreadCondition::timedWait): ditto. + * wtf/ThreadingPthreads.cpp: + (WTF::ThreadCondition::timedWait): ditto. + * wtf/ThreadingQt.cpp: + (WTF::ThreadCondition::timedWait): ditto. + * wtf/ThreadingWin.cpp: + (WTF::ThreadCondition::timedWait): ditto. The actual Win32 code is still to be implemented. + +2009-01-14 Dean McNamee <deanm@chromium.org> + + Reviewed by Darin Adler and Oliver hunt. + + Correctly match allocation functions by implementing a custom deref(). + + https://bugs.webkit.org/show_bug.cgi?id=23315 + + * runtime/ByteArray.h: + (JSC::ByteArray::deref): + (JSC::ByteArray::ByteArray): + +2009-01-14 Dan Bernstein <mitz@apple.com> + + Reviewed by John Sullivan. + + - update copyright + + * Info.plist: + +2009-01-13 Beth Dakin <bdakin@apple.com> + + Reviewed by Darin Adler and Oliver Hunt. + + <rdar://problem/6489314> REGRESSION: Business widget's front side + fails to render correctly when flipping widget + + The problem here is that parseInt was parsing NaN as 0. This patch + corrects that by parsing NaN as NaN. This matches our old behavior + and Firefox. + + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::globalFuncParseInt): + +2009-01-13 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Fix for: https://bugs.webkit.org/show_bug.cgi?id=23292 + + Implementation of two argument canDoFastAdditiveOperations does not correlate well with reality. + + * runtime/JSImmediate.h: + (JSC::JSFastMath::canDoFastAdditiveOperations): + +2009-01-13 Zalan Bujtas <zbujtas@gmail.com> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=23290 + Fix JSImmediate::isImmediate(src) to !src->isCell() + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): + +2009-01-13 Dmitry Titov <dimich@chromium.org> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=23281 + Fix the Chromium Win build. + Need to use PLATFORM(WIN_OS) instead of PLATFORM(WIN). + Moved GTK and WX up in #if sequence because they could come with WIN_OS too, + while they have their own implementation even on Windows. + + * wtf/CurrentTime.cpp: + (WTF::currentTime): + +2009-01-12 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Make the JSImmediate interface private. + + All manipulation of JS values should be through the JSValuePtr class, not by using JSImmediate + directly. The key missing methods on JSValuePtr are: + + * isCell() - check for values that are JSCell*s, and as such where asCell() may be used. + * isInt32Fast() getInt32Fast() - fast check/access for integer immediates. + * isUInt32Fast() getUInt32Fast() - ditto for unsigned integer immediates. + + The JIT is allowed full access to JSImmediate, since it needs to be able to directly + manipulate JSValuePtrs. The Interpreter is provided access to perform operations directly + on JSValuePtrs through the new JSFastMath interface. + + No performance impact. + + * API/JSCallbackObjectFunctions.h: + (JSC::::toNumber): + * API/JSValueRef.cpp: + (JSValueIsEqual): + (JSValueIsStrictEqual): + * JavaScriptCore.exp: + * bytecode/CodeBlock.h: + (JSC::CodeBlock::isKnownNotImmediate): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::keyForImmediateSwitch): + * bytecompiler/BytecodeGenerator.h: + (JSC::BytecodeGenerator::JSValueHashTraits::constructDeletedValue): + (JSC::BytecodeGenerator::JSValueHashTraits::isDeletedValue): + * interpreter/Interpreter.cpp: + (JSC::jsLess): + (JSC::jsLessEq): + (JSC::jsAdd): + (JSC::jsIsObjectType): + (JSC::cachePrototypeChain): + (JSC::Interpreter::tryCachePutByID): + (JSC::Interpreter::tryCacheGetByID): + (JSC::Interpreter::privateExecute): + (JSC::Interpreter::tryCTICachePutByID): + (JSC::Interpreter::tryCTICacheGetByID): + (JSC::Interpreter::cti_op_add): + (JSC::Interpreter::cti_op_get_by_id_self_fail): + (JSC::Interpreter::cti_op_get_by_id_proto_list): + (JSC::Interpreter::cti_op_instanceof): + (JSC::Interpreter::cti_op_mul): + (JSC::Interpreter::cti_op_get_by_val): + (JSC::Interpreter::cti_op_get_by_val_byte_array): + (JSC::Interpreter::cti_op_sub): + (JSC::Interpreter::cti_op_put_by_val): + (JSC::Interpreter::cti_op_put_by_val_array): + (JSC::Interpreter::cti_op_put_by_val_byte_array): + (JSC::Interpreter::cti_op_negate): + (JSC::Interpreter::cti_op_div): + (JSC::Interpreter::cti_op_eq): + (JSC::Interpreter::cti_op_lshift): + (JSC::Interpreter::cti_op_bitand): + (JSC::Interpreter::cti_op_rshift): + (JSC::Interpreter::cti_op_bitnot): + (JSC::Interpreter::cti_op_neq): + (JSC::Interpreter::cti_op_urshift): + (JSC::Interpreter::cti_op_call_eval): + (JSC::Interpreter::cti_op_throw): + (JSC::Interpreter::cti_op_is_undefined): + (JSC::Interpreter::cti_op_stricteq): + (JSC::Interpreter::cti_op_nstricteq): + (JSC::Interpreter::cti_op_switch_imm): + (JSC::Interpreter::cti_vm_throw): + * interpreter/Interpreter.h: + (JSC::Interpreter::isJSArray): + (JSC::Interpreter::isJSString): + (JSC::Interpreter::isJSByteArray): + * jit/JIT.cpp: + (JSC::JIT::compileOpStrictEq): + (JSC::JIT::privateCompileMainPass): + * jit/JIT.h: + (JSC::JIT::isStrictEqCaseHandledInJITCode): + * jit/JITArithmetic.cpp: + (JSC::JIT::compileFastArith_op_rshift): + (JSC::JIT::compileFastArith_op_bitand): + (JSC::JIT::compileFastArith_op_mod): + * jit/JITCall.cpp: + (JSC::JIT::unlinkCall): + (JSC::JIT::compileOpCall): + * jit/JITInlineMethods.h: + (JSC::JIT::getConstantOperandImmediateInt): + (JSC::JIT::isOperandConstantImmediateInt): + * parser/Nodes.cpp: + (JSC::processClauseList): + * runtime/ArrayPrototype.cpp: + (JSC::arrayProtoFuncIndexOf): + (JSC::arrayProtoFuncLastIndexOf): + * runtime/BooleanPrototype.cpp: + (JSC::booleanProtoFuncValueOf): + * runtime/Collector.cpp: + (JSC::Heap::protect): + (JSC::Heap::unprotect): + (JSC::Heap::heap): + * runtime/JSByteArray.cpp: + (JSC::JSByteArray::getOwnPropertySlot): + * runtime/JSByteArray.h: + (JSC::JSByteArray::getIndex): + * runtime/JSCell.cpp: + * runtime/JSCell.h: + (JSC::JSValuePtr::isNumberCell): + (JSC::JSValuePtr::asCell): + (JSC::JSValuePtr::isNumber): + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::globalFuncParseInt): + * runtime/JSImmediate.h: + (JSC::js0): + (JSC::jsImpossibleValue): + (JSC::JSValuePtr::toInt32): + (JSC::JSValuePtr::toUInt32): + (JSC::JSValuePtr::isCell): + (JSC::JSValuePtr::isInt32Fast): + (JSC::JSValuePtr::getInt32Fast): + (JSC::JSValuePtr::isUInt32Fast): + (JSC::JSValuePtr::getUInt32Fast): + (JSC::JSValuePtr::makeInt32Fast): + (JSC::JSValuePtr::areBothInt32Fast): + (JSC::JSFastMath::canDoFastBitwiseOperations): + (JSC::JSFastMath::equal): + (JSC::JSFastMath::notEqual): + (JSC::JSFastMath::andImmediateNumbers): + (JSC::JSFastMath::xorImmediateNumbers): + (JSC::JSFastMath::orImmediateNumbers): + (JSC::JSFastMath::canDoFastRshift): + (JSC::JSFastMath::canDoFastUrshift): + (JSC::JSFastMath::rightShiftImmediateNumbers): + (JSC::JSFastMath::canDoFastAdditiveOperations): + (JSC::JSFastMath::addImmediateNumbers): + (JSC::JSFastMath::subImmediateNumbers): + (JSC::JSFastMath::incImmediateNumber): + (JSC::JSFastMath::decImmediateNumber): + * runtime/JSNumberCell.h: + (JSC::JSValuePtr::asNumberCell): + (JSC::jsNumber): + (JSC::JSValuePtr::uncheckedGetNumber): + (JSC::JSNumberCell::toInt32): + (JSC::JSNumberCell::toUInt32): + (JSC::JSValuePtr::toJSNumber): + (JSC::JSValuePtr::getNumber): + (JSC::JSValuePtr::numberToInt32): + (JSC::JSValuePtr::numberToUInt32): + * runtime/JSObject.h: + (JSC::JSValuePtr::isObject): + (JSC::JSValuePtr::get): + (JSC::JSValuePtr::put): + * runtime/JSValue.cpp: + (JSC::JSValuePtr::toInteger): + (JSC::JSValuePtr::toIntegerPreserveNaN): + * runtime/JSValue.h: + * runtime/Operations.cpp: + (JSC::JSValuePtr::equalSlowCase): + (JSC::JSValuePtr::strictEqualSlowCase): + * runtime/Operations.h: + (JSC::JSValuePtr::equal): + (JSC::JSValuePtr::equalSlowCaseInline): + (JSC::JSValuePtr::strictEqual): + (JSC::JSValuePtr::strictEqualSlowCaseInline): + * runtime/Protect.h: + (JSC::gcProtect): + (JSC::gcUnprotect): + * runtime/StringPrototype.cpp: + (JSC::stringProtoFuncCharAt): + (JSC::stringProtoFuncCharCodeAt): + * runtime/Structure.cpp: + (JSC::Structure::createCachedPrototypeChain): + +2009-01-12 Kevin Ollivier <kevino@theolliviers.com> + + Since date time functions have moved here, now the wx port JSC + needs to depend on wx. + + * jscore.bkl: + +2009-01-11 David Levin <levin@chromium.org> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=23245 + + Add initializeThreading to key places in JS API to ensure that + UString is properly initialized. + + * API/JSContextRef.cpp: + (JSContextGroupCreate): + (JSGlobalContextCreate): + * API/JSObjectRef.cpp: + (JSClassCreate): + * API/JSStringRef.cpp: + (JSStringCreateWithCharacters): + (JSStringCreateWithUTF8CString): + * API/JSStringRefCF.cpp: + (JSStringCreateWithCFString): + +2009-01-11 David Levin <levin@chromium.org> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=23175 + + Separate out BaseString information from UString::Rep and make all baseString access go through + a member function, so that it may be used for something else (in the future) in the BaseString + case. + + * runtime/SmallStrings.cpp: + (JSC::SmallStringsStorage::rep): + (JSC::SmallStringsStorage::SmallStringsStorage): + (JSC::SmallStrings::SmallStrings): + (JSC::SmallStrings::mark): + Adjust to account for the changes in UString and put the UString in place in + SmallStringsStorage to aid in locality of reference among the UChar[] and UString::Rep's. + + * runtime/SmallStrings.h: + * runtime/UString.cpp: + (JSC::initializeStaticBaseString): + (JSC::initializeUString): + (JSC::UString::Rep::create): + (JSC::UString::Rep::destroy): + (JSC::UString::Rep::checkConsistency): + (JSC::expandCapacity): + (JSC::UString::expandPreCapacity): + (JSC::concatenate): + (JSC::UString::append): + (JSC::UString::operator=): + * runtime/UString.h: + (JSC::UString::Rep::baseIsSelf): + (JSC::UString::Rep::setBaseString): + (JSC::UString::Rep::baseString): + (JSC::UString::Rep::): + (JSC::UString::Rep::null): + (JSC::UString::Rep::empty): + (JSC::UString::Rep::data): + (JSC::UString::cost): + Separate out the items out used by base strings from those used in Rep's that only + point to base strings. (This potentially saves 24 bytes per Rep.) + +2009-01-11 Darin Adler <darin@apple.com> + + Reviewed by Dan Bernstein. + + Bug 23239: improve handling of unused arguments in JavaScriptCore + https://bugs.webkit.org/show_bug.cgi?id=23239 + + * runtime/DatePrototype.cpp: Moved LocaleDateTimeFormat enum outside #if + so we can use this on all platforms. Changed valueOf to share the same + function with getTime, since the contents of the two are identical. Removed + a FIXME since the idea isn't really specific enough or helpful enough to + need to sit here in the source code. + (JSC::formatLocaleDate): Changed the Mac version of this function to take + the same arguments as the non-Mac version so the caller doesn't have to + special-case the two platforms. Also made the formatString array be const; + before the characters were, but the array was a modifiable global variable. + (JSC::dateProtoFuncToLocaleString): Changed to call the new unified + version of formatLocaleDate and remove the ifdef. + (JSC::dateProtoFuncToLocaleDateString): Ditto. + (JSC::dateProtoFuncToLocaleTimeString): Ditto. + + * runtime/JSNotAnObject.cpp: + (JSC::JSNotAnObject::toObject): Use the new ASSERT_UNUSED instead of the + old UNUSED_PARAM. + + * runtime/RegExp.cpp: + (JSC::RegExp::RegExp): Changed to only use UNUSED_PARAM when the parameter + is actually unused. + + * wtf/TCSystemAlloc.cpp: + (TCMalloc_SystemRelease): Changed to only use UNUSED_PARAM when the parameter + is actually unused. + (TCMalloc_SystemCommit): Changed to omit the argument names instead of using + UNUSED_PARAM. + +2009-01-11 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Build fix). + + Fix the build (whoops) + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::cti_op_get_by_val): + +2009-01-11 Oliver Hunt <oliver@apple.com> + + Reviewed by Darin Adler and Anders Carlsson + + Bug 23128: get/put_by_val need to respecialise in the face of ByteArray + + Restructure the code slightly, and add comments per Darin's suggestions + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::cti_op_get_by_val): + (JSC::Interpreter::cti_op_get_by_val_byte_array): + (JSC::Interpreter::cti_op_put_by_val): + (JSC::Interpreter::cti_op_put_by_val_byte_array): + +2009-01-11 Oliver Hunt <oliver@apple.com> + + Reviewed by Anders Carlsson. + + Whoops, I accidentally removed an exception check from fast the + fast path for string indexing when i originally landed the + byte array logic. + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::cti_op_get_by_val): + +2009-01-11 Oliver Hunt <oliver@apple.com> + + Reviewed by Anders Carlsson. + + Bug 23128: get/put_by_val need to respecialise in the face of ByteArray + <https://bugs.webkit.org/show_bug.cgi?id=23128> + + Fairly simple patch, add specialised versions of cti_op_get/put_by_val + that assume ByteArray, thus avoiding a few branches in the case of bytearray + manipulation. + + No effect on SunSpider. 15% win on the original testcase. + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::cti_op_get_by_val): + (JSC::Interpreter::cti_op_get_by_val_byte_array): + (JSC::Interpreter::cti_op_put_by_val): + (JSC::Interpreter::cti_op_put_by_val_byte_array): + * interpreter/Interpreter.h: + +2009-01-11 Alexey Proskuryakov <ap@webkit.org> + + Try to fix Windows build. + + * wtf/CurrentTime.cpp: Added a definition of msPerSecond (previously, this code was in + DateMath.cpp, with constant definition in DateTime.h) + +2009-01-11 Alexey Proskuryakov <ap@webkit.org> + + Try to fix Windows build. + + * wtf/CurrentTime.cpp: Include <sys/types.h> and <sys/timeb.h>, as MSDN says to. + +2009-01-11 Dmitry Titov <dimich@chromium.org> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=23207 + Moved currentTime() to from WebCore to WTF. + + * GNUmakefile.am: + * JavaScriptCore.exp: added export for WTF::currentTime() + * JavaScriptCore.pri: + * JavaScriptCore.scons: + * JavaScriptCore.vcproj/WTF/WTF.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + * runtime/DateMath.cpp: + (JSC::getCurrentUTCTimeWithMicroseconds): This function had another implementation of currentTime(), essentially. Now uses WTF version. + * wtf/CurrentTime.cpp: Added. + (WTF::currentTime): + (WTF::highResUpTime): + (WTF::lowResUTCTime): + (WTF::qpcAvailable): + * wtf/CurrentTime.h: Added. + +2009-01-09 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Stage two of converting JSValue from a pointer to a class type. + Remove the class JSValue. The functionallity has been transitioned + into the wrapper class type JSValuePtr. + + The last stage will be to rename JSValuePtr to JSValue, remove the + overloaded -> operator, and switch operations on JSValuePtrs from + using '->' to use '.' instead. + + * API/APICast.h: + * JavaScriptCore.exp: + * runtime/JSCell.h: + (JSC::asCell): + (JSC::JSValuePtr::asCell): + (JSC::JSValuePtr::isNumber): + (JSC::JSValuePtr::isString): + (JSC::JSValuePtr::isGetterSetter): + (JSC::JSValuePtr::isObject): + (JSC::JSValuePtr::getNumber): + (JSC::JSValuePtr::getString): + (JSC::JSValuePtr::getObject): + (JSC::JSValuePtr::getCallData): + (JSC::JSValuePtr::getConstructData): + (JSC::JSValuePtr::getUInt32): + (JSC::JSValuePtr::getTruncatedInt32): + (JSC::JSValuePtr::getTruncatedUInt32): + (JSC::JSValuePtr::mark): + (JSC::JSValuePtr::marked): + (JSC::JSValuePtr::toPrimitive): + (JSC::JSValuePtr::getPrimitiveNumber): + (JSC::JSValuePtr::toBoolean): + (JSC::JSValuePtr::toNumber): + (JSC::JSValuePtr::toString): + (JSC::JSValuePtr::toObject): + (JSC::JSValuePtr::toThisObject): + (JSC::JSValuePtr::needsThisConversion): + (JSC::JSValuePtr::toThisString): + (JSC::JSValuePtr::getJSNumber): + * runtime/JSImmediate.h: + (JSC::JSValuePtr::isUndefined): + (JSC::JSValuePtr::isNull): + (JSC::JSValuePtr::isUndefinedOrNull): + (JSC::JSValuePtr::isBoolean): + (JSC::JSValuePtr::getBoolean): + (JSC::JSValuePtr::toInt32): + (JSC::JSValuePtr::toUInt32): + * runtime/JSNumberCell.h: + (JSC::JSValuePtr::uncheckedGetNumber): + (JSC::JSValuePtr::toJSNumber): + * runtime/JSObject.h: + (JSC::JSValuePtr::isObject): + (JSC::JSValuePtr::get): + (JSC::JSValuePtr::put): + * runtime/JSString.h: + (JSC::JSValuePtr::toThisJSString): + * runtime/JSValue.cpp: + (JSC::JSValuePtr::toInteger): + (JSC::JSValuePtr::toIntegerPreserveNaN): + (JSC::JSValuePtr::toInt32SlowCase): + (JSC::JSValuePtr::toUInt32SlowCase): + * runtime/JSValue.h: + (JSC::JSValuePtr::makeImmediate): + (JSC::JSValuePtr::immediateValue): + (JSC::JSValuePtr::JSValuePtr): + (JSC::JSValuePtr::operator->): + (JSC::JSValuePtr::operator bool): + (JSC::JSValuePtr::operator==): + (JSC::JSValuePtr::operator!=): + (JSC::JSValuePtr::encode): + (JSC::JSValuePtr::decode): + (JSC::JSValuePtr::toFloat): + (JSC::JSValuePtr::asValue): + (JSC::operator==): + (JSC::operator!=): + +2009-01-09 David Levin <levin@chromium.org> + + Reviewed by Oliver Hunt. + + https://bugs.webkit.org/show_bug.cgi?id=23175 + + Adjustment to previous patch. Remove call to initilizeThreading from JSGlobalCreate + and fix jsc.cpp instead. + + * jsc.cpp: + (main): + (jscmain): + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::create): + +2009-01-09 Sam Weinig <sam@webkit.org> + + Roll r39720 back in with a working interpreted mode. + +2009-01-09 David Levin <levin@chromium.org> + + Reviewed by Oliver Hunt. + + https://bugs.webkit.org/show_bug.cgi?id=23175 + + Added a template to make the pointer and flags combination + in UString more readable and less error prone. + + * GNUmakefile.am: + * JavaScriptCore.exp: + * JavaScriptCore.vcproj/WTF/WTF.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + Added PtrAndFlags.h (and sorted the xcode project file). + + * runtime/Identifier.cpp: + (JSC::Identifier::add): + (JSC::Identifier::addSlowCase): + * runtime/InitializeThreading.cpp: + (JSC::initializeThreadingOnce): + Made the init threading initialize the UString globals. Before + these were initilized using {} but that became harder due to the + addition of this tempalte class. + + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::create): + * runtime/PropertyNameArray.cpp: + (JSC::PropertyNameArray::add): + * runtime/UString.cpp: + (JSC::initializeStaticBaseString): + (JSC::initializeUString): + (JSC::UString::Rep::create): + (JSC::UString::Rep::createFromUTF8): + (JSC::createRep): + (JSC::UString::UString): + (JSC::concatenate): + (JSC::UString::operator=): + (JSC::UString::makeNull): + (JSC::UString::nullRep): + * runtime/UString.h: + (JSC::UString::Rep::identifierTable): + (JSC::UString::Rep::setIdentifierTable): + (JSC::UString::Rep::isStatic): + (JSC::UString::Rep::setStatic): + (JSC::UString::Rep::): + (JSC::UString::Rep::null): + (JSC::UString::Rep::empty): + (JSC::UString::isNull): + (JSC::UString::null): + (JSC::UString::UString): + + * wtf/PtrAndFlags.h: Added. + (WTF::PtrAndFlags::PtrAndFlags): + (WTF::PtrAndFlags::isFlagSet): + (WTF::PtrAndFlags::setFlag): + (WTF::PtrAndFlags::clearFlag): + (WTF::PtrAndFlags::get): + (WTF::PtrAndFlags::set): + A simple way to layer together a pointer and 2 flags. It relies on the pointer being 4 byte aligned, + which should happen for all allocators (due to aligning pointers, int's, etc. on 4 byte boundaries). + +2009-01-08 Gavin Barraclough <barraclough@apple.com> + + Reviewed by -O-l-i-v-e-r- -H-u-n-t- Sam Weinig (sorry, Sam!). + + Encode immediates in the low word of JSValuePtrs, on x86-64. + + On 32-bit platforms a JSValuePtr may represent a 31-bit signed integer. + On 64-bit platforms, if USE(ALTERNATE_JSIMMEDIATE) is defined, a full + 32-bit integer may be stored in an immediate. + + Presently USE(ALTERNATE_JSIMMEDIATE) uses the same encoding as the default + immediate format - the value is left shifted by one, so a one bit tag can + be added to indicate the value is an immediate. However this means that + values must be commonly be detagged (by right shifting by one) before + arithmetic operations can be performed on immediates. This patch modifies + the formattting so the the high bits of the immediate mark values as being + integer. + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::not32): + (JSC::MacroAssembler::orPtr): + (JSC::MacroAssembler::zeroExtend32ToPtr): + (JSC::MacroAssembler::jaePtr): + (JSC::MacroAssembler::jbPtr): + (JSC::MacroAssembler::jnzPtr): + (JSC::MacroAssembler::jzPtr): + * assembler/X86Assembler.h: + (JSC::X86Assembler::): + (JSC::X86Assembler::notl_r): + (JSC::X86Assembler::testq_i32r): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + (JSC::JIT::privateCompileCTIMachineTrampolines): + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::compileFastArith_op_lshift): + (JSC::JIT::compileFastArith_op_rshift): + (JSC::JIT::compileFastArith_op_bitand): + (JSC::JIT::compileFastArithSlow_op_bitand): + (JSC::JIT::compileFastArith_op_mod): + (JSC::JIT::compileFastArithSlow_op_mod): + (JSC::JIT::compileFastArith_op_add): + (JSC::JIT::compileFastArith_op_mul): + (JSC::JIT::compileFastArith_op_post_inc): + (JSC::JIT::compileFastArith_op_post_dec): + (JSC::JIT::compileFastArith_op_pre_inc): + (JSC::JIT::compileFastArith_op_pre_dec): + (JSC::JIT::putDoubleResultToJSNumberCellOrJSImmediate): + (JSC::JIT::compileBinaryArithOp): + * jit/JITCall.cpp: + (JSC::JIT::compileOpCallSlowCase): + * jit/JITInlineMethods.h: + (JSC::JIT::emitJumpIfJSCell): + (JSC::JIT::emitJumpIfNotJSCell): + (JSC::JIT::emitJumpIfImmNum): + (JSC::JIT::emitJumpSlowCaseIfNotImmNum): + (JSC::JIT::emitJumpSlowCaseIfNotImmNums): + (JSC::JIT::emitFastArithDeTagImmediate): + (JSC::JIT::emitFastArithDeTagImmediateJumpIfZero): + (JSC::JIT::emitFastArithReTagImmediate): + (JSC::JIT::emitFastArithImmToInt): + (JSC::JIT::emitFastArithIntToImmNoCheck): + (JSC::JIT::emitTagAsBoolImmediate): + * jit/JITPropertyAccess.cpp: + (JSC::resizePropertyStorage): + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::privateCompilePatchGetArrayLength): + (JSC::JIT::privateCompileGetByIdSelf): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdChain): + (JSC::JIT::privateCompilePutByIdReplace): + * runtime/JSImmediate.h: + (JSC::JSImmediate::isNumber): + (JSC::JSImmediate::isPositiveNumber): + (JSC::JSImmediate::areBothImmediateNumbers): + (JSC::JSImmediate::xorImmediateNumbers): + (JSC::JSImmediate::rightShiftImmediateNumbers): + (JSC::JSImmediate::canDoFastAdditiveOperations): + (JSC::JSImmediate::addImmediateNumbers): + (JSC::JSImmediate::subImmediateNumbers): + (JSC::JSImmediate::makeInt): + (JSC::JSImmediate::toBoolean): + * wtf/Platform.h: + +2009-01-08 Sam Weinig <sam@webkit.org> + + Revert r39720. It broke Interpreted mode. + +2009-01-08 Sam Weinig <sam@webkit.org> + + Reviewed by Oliver Hunt. + + Fix for https://bugs.webkit.org/show_bug.cgi?id=23197 + Delay creating the PCVector until an exception is thrown + Part of <rdar://problem/6469060> + Don't store exception information for a CodeBlock until first exception is thrown + + - Change the process for re-parsing/re-generating bytecode for exception information + to use data from the original CodeBlock (offsets of GlobalResolve instructions) to + aid in creating an identical instruction stream on re-parse, instead of padding + interchangeable opcodes, which would result in different JITed code. + - Fix bug where the wrong ScopeChainNode was used when re-parsing/regenerating from + within some odd modified scope chains. + - Lazily create the pcVector by re-JITing the regenerated CodeBlock and stealing the + the pcVector from it. + + Saves ~2MB on Membuster head. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): + (JSC::CodeBlock::reparseForExceptionInfoIfNecessary): + (JSC::CodeBlock::hasGlobalResolveInstructionAtBytecodeOffset): + (JSC::CodeBlock::hasGlobalResolveInfoAtBytecodeOffset): + * bytecode/CodeBlock.h: + (JSC::JITCodeRef::JITCodeRef): + (JSC::GlobalResolveInfo::GlobalResolveInfo): + (JSC::CodeBlock::getBytecodeIndex): + (JSC::CodeBlock::addGlobalResolveInstruction): + (JSC::CodeBlock::addGlobalResolveInfo): + (JSC::CodeBlock::addFunctionRegisterInfo): + (JSC::CodeBlock::hasExceptionInfo): + (JSC::CodeBlock::pcVector): + (JSC::EvalCodeBlock::EvalCodeBlock): + (JSC::EvalCodeBlock::baseScopeDepth): + * bytecode/Opcode.h: + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::BytecodeGenerator): + (JSC::BytecodeGenerator::emitResolve): + (JSC::BytecodeGenerator::emitGetScopedVar): + * bytecompiler/BytecodeGenerator.h: + (JSC::BytecodeGenerator::setRegeneratingForExceptionInfo): + * interpreter/Interpreter.cpp: + (JSC::bytecodeOffsetForPC): + (JSC::Interpreter::unwindCallFrame): + (JSC::Interpreter::privateExecute): + (JSC::Interpreter::retrieveLastCaller): + (JSC::Interpreter::cti_op_instanceof): + (JSC::Interpreter::cti_op_call_NotJSFunction): + (JSC::Interpreter::cti_op_resolve): + (JSC::Interpreter::cti_op_construct_NotJSConstruct): + (JSC::Interpreter::cti_op_resolve_func): + (JSC::Interpreter::cti_op_resolve_skip): + (JSC::Interpreter::cti_op_resolve_global): + (JSC::Interpreter::cti_op_resolve_with_base): + (JSC::Interpreter::cti_op_throw): + (JSC::Interpreter::cti_op_in): + (JSC::Interpreter::cti_vm_throw): + * jit/JIT.cpp: + (JSC::JIT::privateCompile): + * parser/Nodes.cpp: + (JSC::EvalNode::generateBytecode): + (JSC::EvalNode::bytecodeForExceptionInfoReparse): + (JSC::FunctionBodyNode::bytecodeForExceptionInfoReparse): + * parser/Nodes.h: + +2009-01-08 Jian Li <jianli@chromium.org> + + Reviewed by Alexey Proskuryakov. + + Add Win32 implementation of ThreadSpecific. + https://bugs.webkit.org/show_bug.cgi?id=22614 + + * JavaScriptCore.vcproj/WTF/WTF.vcproj: + * wtf/ThreadSpecific.h: + (WTF::ThreadSpecific::ThreadSpecific): + (WTF::ThreadSpecific::~ThreadSpecific): + (WTF::ThreadSpecific::get): + (WTF::ThreadSpecific::set): + (WTF::ThreadSpecific::destroy): + * wtf/ThreadSpecificWin.cpp: Added. + (WTF::ThreadSpecificThreadExit): + * wtf/ThreadingWin.cpp: + (WTF::wtfThreadEntryPoint): + +2009-01-08 Justin McPherson <justin.mcpherson@nokia.com> + + Reviewed by Simon Hausmann. + + Fix compilation with Qt on NetBSD. + + * runtime/Collector.cpp: + (JSC::currentThreadStackBase): Use PLATFORM(NETBSD) to enter the + code path to retrieve the stack base using pthread_attr_get_np. + The PTHREAD_NP_H define is not used because the header file does + not exist on NetBSD, but the function is declared nevertheless. + * wtf/Platform.h: Introduce WTF_PLATFORM_NETBSD. + +2009-01-07 Sam Weinig <sam@webkit.org> + + Reviewed by Geoffrey Garen. + + <rdar://problem/6469060> Don't store exception information for a CodeBlock until first exception is thrown + + Don't initially store exception information (lineNumber/expressionRange/getByIdExcecptionInfo) + in CodeBlocks blocks. Instead, re-parse for the data on demand and cache it then. + + One important change that was needed to make this work was to pad op_get_global_var with nops to + be the same length as op_resolve_global, since one could be replaced for the other on re-parsing, + and we want to keep the offsets bytecode offsets the same. + + 1.3MB improvement on Membuster head. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): Update op_get_global_var to account for the padding. + (JSC::CodeBlock::dumpStatistics): Add more statistic dumping. + (JSC::CodeBlock::CodeBlock): Initialize m_exceptionInfo. + (JSC::CodeBlock::reparseForExceptionInfoIfNecessary): Re-parses the CodeBlocks + associated SourceCode and steals the ExceptionInfo from it. + (JSC::CodeBlock::lineNumberForBytecodeOffset): Creates the exception info on demand. + (JSC::CodeBlock::expressionRangeForBytecodeOffset): Ditto. + (JSC::CodeBlock::getByIdExceptionInfoForBytecodeOffset): Ditto. + * bytecode/CodeBlock.h: + (JSC::CodeBlock::numberOfExceptionHandlers): Updated to account for m_exceptionInfo indirection. + (JSC::CodeBlock::addExceptionHandler): Ditto. + (JSC::CodeBlock::exceptionHandler): Ditto. + (JSC::CodeBlock::clearExceptionInfo): Ditto. + (JSC::CodeBlock::addExpressionInfo): Ditto. + (JSC::CodeBlock::addGetByIdExceptionInfo): Ditto. + (JSC::CodeBlock::numberOfLineInfos): Ditto. + (JSC::CodeBlock::addLineInfo): Ditto. + (JSC::CodeBlock::lastLineInfo): Ditto. + + * bytecode/Opcode.h: Change length of op_get_global_var to match op_resolve_global. + + * bytecode/SamplingTool.cpp: + (JSC::SamplingTool::dump): Add comment indicating why it is okay not to pass a CallFrame. + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::generate): Clear the exception info after generation for Function and Eval + Code when not in regenerate for exception info mode. + (JSC::BytecodeGenerator::BytecodeGenerator): Initialize m_regeneratingForExceptionInfo to false. + (JSC::BytecodeGenerator::emitGetScopedVar): Pad op_get_global_var with 2 nops. + * bytecompiler/BytecodeGenerator.h: + (JSC::BytecodeGenerator::setRegeneratingForExcpeptionInfo): Added. + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::throwException): Pass the CallFrame to exception info accessors. + (JSC::Interpreter::privateExecute): Ditto. + (JSC::Interpreter::retrieveLastCaller): Ditto. + (JSC::Interpreter::cti_op_new_error): Ditto. + + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): Pass the current bytecode offset instead of hard coding the + line number, the stub will do the accessing if it gets called. + + * parser/Nodes.cpp: + (JSC::ProgramNode::emitBytecode): Moved. + (JSC::ProgramNode::generateBytecode): Moved. + (JSC::EvalNode::create): Moved. + (JSC::EvalNode::bytecodeForExceptionInfoReparse): Added. + (JSC::FunctionBodyNode::generateBytecode): Rename reparse to reparseInPlace. + (JSC::FunctionBodyNode::bytecodeForExceptionInfoReparse): Addded. + + * parser/Nodes.h: + (JSC::ScopeNode::features): Added getter. + * parser/Parser.cpp: + (JSC::Parser::reparseInPlace): Renamed from reparse. + * parser/Parser.h: + (JSC::Parser::reparse): Added. Re-parses the passed in Node into + a new Node. + * runtime/ExceptionHelpers.cpp: + (JSC::createUndefinedVariableError): Pass along CallFrame. + (JSC::createInvalidParamError): Ditto. + (JSC::createNotAConstructorError): Ditto. + (JSC::createNotAFunctionError): Ditto. + (JSC::createNotAnObjectError): Ditto. + +2009-01-06 Gavin Barraclough <baraclough@apple.com> + + Reviewed by Maciej Stachowiak. + + Replace accidentally removed references in BytecodeGenerator, deleting these + will be hindering the sharing of constant numbers and strings. + + The code to add a new constant (either number or string) to their respective + map works by attempting to add a null entry, then checking the result of the + add for null. The first time, this should return the null (or noValue). + The code checks for null (to see if this is the initial add), and then allocates + a new number / string object. This code relies on the result returned from + the add to the map being stored as a reference, such that the allocated object + will be stored in the map, and will be resused if the same constant is encountered + again. By failing to use a reference we will be leaking GC object for each + additional entry added to the map. As GC objects they should be clollected, + be we should no be allocatin them in the first place. + + https://bugs.webkit.org/show_bug.cgi?id=23158 + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitLoad): + +2009-01-06 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + <rdar://problem/6040850> JavaScript register file should use VirtualAlloc on Windows + + Fairly simple, just reserve 4Mb of address space for the + register file, and then commit one section at a time. We + don't release committed memory as we drop back, but then + mac doesn't either so this probably not too much of a + problem. + + * interpreter/RegisterFile.cpp: + (JSC::RegisterFile::~RegisterFile): + * interpreter/RegisterFile.h: + (JSC::RegisterFile::RegisterFile): + (JSC::RegisterFile::grow): + +2009-01-06 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=23142 + ThreadGlobalData leaks seen on buildbot + + * wtf/ThreadSpecific.h: (WTF::ThreadSpecific::destroy): Temporarily reset the thread + specific value to make getter work on Mac OS X. + + * wtf/Platform.h: Touch this file again to make sure all Windows builds use the most recent + version of ThreadSpecific.h. + +2009-01-05 Gavin Barraclough <baraclough@apple.com> + + Reviewed by Oliver Hunt. + + Replace all uses of JSValue* with a new smart pointer type, JSValuePtr. + + A JavaScript value may be a heap object or boxed primitive, represented by a + pointer, or may be an unboxed immediate value, such as an integer. Since a + value may dynamically need to contain either a pointer value or an immediate, + we encode immediates as pointer values (since all valid JSCell pointers are + allocated at alligned addesses, unaligned addresses are available to encode + immediates). As such all JavaScript values are represented using a JSValue*. + + This implementation is encumbered by a number of constraints. It ties the + JSValue representation to the size of pointer on the platform, which, for + example, means that we currently can represent different ranges of integers + as immediates on x86 and x86-64. It also prevents us from overloading the + to-boolean conversion used to test for noValue() - effectively forcing us + to represent noValue() as 0. This would potentially be problematic were we + to wish to encode integer values differently (e.g. were we to use the v8 + encoding, where pointers are tagged with 1 and integers with 0, then the + immediate integer 0 would conflict with noValue()). + + This patch replaces all usage of JSValue* with a new class, JSValuePtr, + which encapsulates the pointer. JSValuePtr maintains the same interface as + JSValue*, overloading operator-> and operator bool such that previous + operations in the code on variables of type JSValue* are still supported. + + In order to provide a ProtectPtr<> type with support for the new value + representation (without using the internal JSValue type directly), a new + ProtectJSValuePtr type has been added, equivalent to the previous type + ProtectPtr<JSValue>. + + This patch is likely the first in a sequence of three changes. With the + value now encapsulated it will likely make sense to migrate the functionality + from JSValue into JSValuePtr, such that the internal pointer representation + need not be exposed. Through migrating the functionality to the wrapper + class the existing JSValue should be rendered redundant, and the class is + likely to be removed (the JSValuePtr now wrapping a pointer to a JSCell). + At this stage it will likely make sense to rename JSValuePtr to JSValue. + + https://bugs.webkit.org/show_bug.cgi?id=23114 + + * API/APICast.h: + (toJS): + (toRef): + * API/JSBase.cpp: + (JSEvaluateScript): + * API/JSCallbackConstructor.h: + (JSC::JSCallbackConstructor::createStructure): + * API/JSCallbackFunction.cpp: + (JSC::JSCallbackFunction::call): + * API/JSCallbackFunction.h: + (JSC::JSCallbackFunction::createStructure): + * API/JSCallbackObject.h: + (JSC::JSCallbackObject::createStructure): + * API/JSCallbackObjectFunctions.h: + (JSC::::asCallbackObject): + (JSC::::put): + (JSC::::hasInstance): + (JSC::::call): + (JSC::::staticValueGetter): + (JSC::::staticFunctionGetter): + (JSC::::callbackGetter): + * API/JSContextRef.cpp: + * API/JSObjectRef.cpp: + (JSObjectMakeConstructor): + (JSObjectSetPrototype): + (JSObjectGetProperty): + (JSObjectSetProperty): + (JSObjectGetPropertyAtIndex): + (JSObjectSetPropertyAtIndex): + * API/JSValueRef.cpp: + (JSValueGetType): + (JSValueIsUndefined): + (JSValueIsNull): + (JSValueIsBoolean): + (JSValueIsNumber): + (JSValueIsString): + (JSValueIsObject): + (JSValueIsObjectOfClass): + (JSValueIsEqual): + (JSValueIsStrictEqual): + (JSValueIsInstanceOfConstructor): + (JSValueToBoolean): + (JSValueToNumber): + (JSValueToStringCopy): + (JSValueToObject): + (JSValueProtect): + (JSValueUnprotect): + * JavaScriptCore.exp: + * bytecode/CodeBlock.cpp: + (JSC::valueToSourceString): + (JSC::constantName): + (JSC::CodeBlock::dump): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::getConstant): + (JSC::CodeBlock::addUnexpectedConstant): + (JSC::CodeBlock::unexpectedConstant): + * bytecode/EvalCodeCache.h: + (JSC::EvalCodeCache::get): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::BytecodeGenerator): + (JSC::BytecodeGenerator::addConstant): + (JSC::BytecodeGenerator::addUnexpectedConstant): + (JSC::BytecodeGenerator::emitLoad): + (JSC::BytecodeGenerator::emitLoadJSV): + (JSC::BytecodeGenerator::emitGetScopedVar): + (JSC::BytecodeGenerator::emitPutScopedVar): + (JSC::BytecodeGenerator::emitNewError): + (JSC::keyForImmediateSwitch): + * bytecompiler/BytecodeGenerator.h: + (JSC::BytecodeGenerator::JSValueHashTraits::constructDeletedValue): + (JSC::BytecodeGenerator::JSValueHashTraits::isDeletedValue): + * debugger/DebuggerCallFrame.cpp: + (JSC::DebuggerCallFrame::evaluate): + * debugger/DebuggerCallFrame.h: + (JSC::DebuggerCallFrame::DebuggerCallFrame): + (JSC::DebuggerCallFrame::exception): + * interpreter/CallFrame.cpp: + (JSC::CallFrame::thisValue): + * interpreter/CallFrame.h: + (JSC::ExecState::setException): + (JSC::ExecState::exception): + (JSC::ExecState::exceptionSlot): + (JSC::ExecState::hadException): + * interpreter/Interpreter.cpp: + (JSC::fastIsNumber): + (JSC::fastToInt32): + (JSC::fastToUInt32): + (JSC::jsLess): + (JSC::jsLessEq): + (JSC::jsAddSlowCase): + (JSC::jsAdd): + (JSC::jsTypeStringForValue): + (JSC::jsIsObjectType): + (JSC::jsIsFunctionType): + (JSC::Interpreter::resolve): + (JSC::Interpreter::resolveSkip): + (JSC::Interpreter::resolveGlobal): + (JSC::inlineResolveBase): + (JSC::Interpreter::resolveBase): + (JSC::Interpreter::resolveBaseAndProperty): + (JSC::Interpreter::resolveBaseAndFunc): + (JSC::isNotObject): + (JSC::Interpreter::callEval): + (JSC::Interpreter::unwindCallFrame): + (JSC::Interpreter::throwException): + (JSC::Interpreter::execute): + (JSC::Interpreter::checkTimeout): + (JSC::Interpreter::createExceptionScope): + (JSC::cachePrototypeChain): + (JSC::Interpreter::tryCachePutByID): + (JSC::countPrototypeChainEntriesAndCheckForProxies): + (JSC::Interpreter::tryCacheGetByID): + (JSC::Interpreter::privateExecute): + (JSC::Interpreter::retrieveArguments): + (JSC::Interpreter::retrieveCaller): + (JSC::Interpreter::retrieveLastCaller): + (JSC::Interpreter::tryCTICachePutByID): + (JSC::Interpreter::tryCTICacheGetByID): + (JSC::returnToThrowTrampoline): + (JSC::Interpreter::cti_op_convert_this): + (JSC::Interpreter::cti_op_add): + (JSC::Interpreter::cti_op_pre_inc): + (JSC::Interpreter::cti_op_loop_if_less): + (JSC::Interpreter::cti_op_loop_if_lesseq): + (JSC::Interpreter::cti_op_get_by_id_generic): + (JSC::Interpreter::cti_op_get_by_id): + (JSC::Interpreter::cti_op_get_by_id_second): + (JSC::Interpreter::cti_op_get_by_id_self_fail): + (JSC::Interpreter::cti_op_get_by_id_proto_list): + (JSC::Interpreter::cti_op_get_by_id_proto_list_full): + (JSC::Interpreter::cti_op_get_by_id_proto_fail): + (JSC::Interpreter::cti_op_get_by_id_array_fail): + (JSC::Interpreter::cti_op_get_by_id_string_fail): + (JSC::Interpreter::cti_op_instanceof): + (JSC::Interpreter::cti_op_del_by_id): + (JSC::Interpreter::cti_op_mul): + (JSC::Interpreter::cti_op_call_NotJSFunction): + (JSC::Interpreter::cti_op_resolve): + (JSC::Interpreter::cti_op_construct_NotJSConstruct): + (JSC::Interpreter::cti_op_get_by_val): + (JSC::Interpreter::cti_op_resolve_func): + (JSC::Interpreter::cti_op_sub): + (JSC::Interpreter::cti_op_put_by_val): + (JSC::Interpreter::cti_op_put_by_val_array): + (JSC::Interpreter::cti_op_lesseq): + (JSC::Interpreter::cti_op_loop_if_true): + (JSC::Interpreter::cti_op_negate): + (JSC::Interpreter::cti_op_resolve_base): + (JSC::Interpreter::cti_op_resolve_skip): + (JSC::Interpreter::cti_op_resolve_global): + (JSC::Interpreter::cti_op_div): + (JSC::Interpreter::cti_op_pre_dec): + (JSC::Interpreter::cti_op_jless): + (JSC::Interpreter::cti_op_not): + (JSC::Interpreter::cti_op_jtrue): + (JSC::Interpreter::cti_op_post_inc): + (JSC::Interpreter::cti_op_eq): + (JSC::Interpreter::cti_op_lshift): + (JSC::Interpreter::cti_op_bitand): + (JSC::Interpreter::cti_op_rshift): + (JSC::Interpreter::cti_op_bitnot): + (JSC::Interpreter::cti_op_resolve_with_base): + (JSC::Interpreter::cti_op_mod): + (JSC::Interpreter::cti_op_less): + (JSC::Interpreter::cti_op_neq): + (JSC::Interpreter::cti_op_post_dec): + (JSC::Interpreter::cti_op_urshift): + (JSC::Interpreter::cti_op_bitxor): + (JSC::Interpreter::cti_op_bitor): + (JSC::Interpreter::cti_op_call_eval): + (JSC::Interpreter::cti_op_throw): + (JSC::Interpreter::cti_op_next_pname): + (JSC::Interpreter::cti_op_typeof): + (JSC::Interpreter::cti_op_is_undefined): + (JSC::Interpreter::cti_op_is_boolean): + (JSC::Interpreter::cti_op_is_number): + (JSC::Interpreter::cti_op_is_string): + (JSC::Interpreter::cti_op_is_object): + (JSC::Interpreter::cti_op_is_function): + (JSC::Interpreter::cti_op_stricteq): + (JSC::Interpreter::cti_op_nstricteq): + (JSC::Interpreter::cti_op_to_jsnumber): + (JSC::Interpreter::cti_op_in): + (JSC::Interpreter::cti_op_switch_imm): + (JSC::Interpreter::cti_op_switch_char): + (JSC::Interpreter::cti_op_switch_string): + (JSC::Interpreter::cti_op_del_by_val): + (JSC::Interpreter::cti_op_new_error): + (JSC::Interpreter::cti_vm_throw): + * interpreter/Interpreter.h: + (JSC::Interpreter::isJSArray): + (JSC::Interpreter::isJSString): + * interpreter/Register.h: + (JSC::Register::): + (JSC::Register::Register): + (JSC::Register::jsValue): + (JSC::Register::getJSValue): + * jit/JIT.cpp: + (JSC::): + (JSC::JIT::compileOpStrictEq): + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + * jit/JIT.h: + (JSC::): + (JSC::JIT::execute): + * jit/JITArithmetic.cpp: + (JSC::JIT::compileFastArith_op_rshift): + (JSC::JIT::compileFastArithSlow_op_rshift): + * jit/JITCall.cpp: + (JSC::JIT::unlinkCall): + (JSC::JIT::compileOpCallInitializeCallFrame): + (JSC::JIT::compileOpCall): + * jit/JITInlineMethods.h: + (JSC::JIT::emitGetVirtualRegister): + (JSC::JIT::getConstantOperand): + (JSC::JIT::isOperandConstant31BitImmediateInt): + (JSC::JIT::emitPutJITStubArgFromVirtualRegister): + (JSC::JIT::emitInitRegister): + * jit/JITPropertyAccess.cpp: + (JSC::resizePropertyStorage): + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::patchGetByIdSelf): + (JSC::JIT::patchPutByIdReplace): + (JSC::JIT::privateCompileGetByIdSelf): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdSelfList): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChainList): + (JSC::JIT::privateCompileGetByIdChain): + (JSC::JIT::privateCompilePutByIdReplace): + * jsc.cpp: + (functionPrint): + (functionDebug): + (functionGC): + (functionVersion): + (functionRun): + (functionLoad): + (functionReadline): + (functionQuit): + * parser/Nodes.cpp: + (JSC::NullNode::emitBytecode): + (JSC::ArrayNode::emitBytecode): + (JSC::FunctionCallValueNode::emitBytecode): + (JSC::FunctionCallResolveNode::emitBytecode): + (JSC::VoidNode::emitBytecode): + (JSC::ConstDeclNode::emitCodeSingle): + (JSC::ReturnNode::emitBytecode): + (JSC::processClauseList): + (JSC::EvalNode::emitBytecode): + (JSC::FunctionBodyNode::emitBytecode): + (JSC::ProgramNode::emitBytecode): + * profiler/ProfileGenerator.cpp: + (JSC::ProfileGenerator::addParentForConsoleStart): + * profiler/Profiler.cpp: + (JSC::Profiler::willExecute): + (JSC::Profiler::didExecute): + (JSC::Profiler::createCallIdentifier): + * profiler/Profiler.h: + * runtime/ArgList.cpp: + (JSC::ArgList::slowAppend): + * runtime/ArgList.h: + (JSC::ArgList::at): + (JSC::ArgList::append): + * runtime/Arguments.cpp: + (JSC::Arguments::put): + * runtime/Arguments.h: + (JSC::Arguments::createStructure): + (JSC::asArguments): + * runtime/ArrayConstructor.cpp: + (JSC::callArrayConstructor): + * runtime/ArrayPrototype.cpp: + (JSC::getProperty): + (JSC::putProperty): + (JSC::arrayProtoFuncToString): + (JSC::arrayProtoFuncToLocaleString): + (JSC::arrayProtoFuncJoin): + (JSC::arrayProtoFuncConcat): + (JSC::arrayProtoFuncPop): + (JSC::arrayProtoFuncPush): + (JSC::arrayProtoFuncReverse): + (JSC::arrayProtoFuncShift): + (JSC::arrayProtoFuncSlice): + (JSC::arrayProtoFuncSort): + (JSC::arrayProtoFuncSplice): + (JSC::arrayProtoFuncUnShift): + (JSC::arrayProtoFuncFilter): + (JSC::arrayProtoFuncMap): + (JSC::arrayProtoFuncEvery): + (JSC::arrayProtoFuncForEach): + (JSC::arrayProtoFuncSome): + (JSC::arrayProtoFuncIndexOf): + (JSC::arrayProtoFuncLastIndexOf): + * runtime/BooleanConstructor.cpp: + (JSC::callBooleanConstructor): + (JSC::constructBooleanFromImmediateBoolean): + * runtime/BooleanConstructor.h: + * runtime/BooleanObject.h: + (JSC::asBooleanObject): + * runtime/BooleanPrototype.cpp: + (JSC::booleanProtoFuncToString): + (JSC::booleanProtoFuncValueOf): + * runtime/CallData.cpp: + (JSC::call): + * runtime/CallData.h: + * runtime/Collector.cpp: + (JSC::Heap::protect): + (JSC::Heap::unprotect): + (JSC::Heap::heap): + (JSC::Heap::collect): + * runtime/Collector.h: + * runtime/Completion.cpp: + (JSC::evaluate): + * runtime/Completion.h: + (JSC::Completion::Completion): + (JSC::Completion::value): + (JSC::Completion::setValue): + (JSC::Completion::isValueCompletion): + * runtime/ConstructData.cpp: + (JSC::construct): + * runtime/ConstructData.h: + * runtime/DateConstructor.cpp: + (JSC::constructDate): + (JSC::callDate): + (JSC::dateParse): + (JSC::dateNow): + (JSC::dateUTC): + * runtime/DateInstance.h: + (JSC::asDateInstance): + * runtime/DatePrototype.cpp: + (JSC::dateProtoFuncToString): + (JSC::dateProtoFuncToUTCString): + (JSC::dateProtoFuncToDateString): + (JSC::dateProtoFuncToTimeString): + (JSC::dateProtoFuncToLocaleString): + (JSC::dateProtoFuncToLocaleDateString): + (JSC::dateProtoFuncToLocaleTimeString): + (JSC::dateProtoFuncValueOf): + (JSC::dateProtoFuncGetTime): + (JSC::dateProtoFuncGetFullYear): + (JSC::dateProtoFuncGetUTCFullYear): + (JSC::dateProtoFuncToGMTString): + (JSC::dateProtoFuncGetMonth): + (JSC::dateProtoFuncGetUTCMonth): + (JSC::dateProtoFuncGetDate): + (JSC::dateProtoFuncGetUTCDate): + (JSC::dateProtoFuncGetDay): + (JSC::dateProtoFuncGetUTCDay): + (JSC::dateProtoFuncGetHours): + (JSC::dateProtoFuncGetUTCHours): + (JSC::dateProtoFuncGetMinutes): + (JSC::dateProtoFuncGetUTCMinutes): + (JSC::dateProtoFuncGetSeconds): + (JSC::dateProtoFuncGetUTCSeconds): + (JSC::dateProtoFuncGetMilliSeconds): + (JSC::dateProtoFuncGetUTCMilliseconds): + (JSC::dateProtoFuncGetTimezoneOffset): + (JSC::dateProtoFuncSetTime): + (JSC::setNewValueFromTimeArgs): + (JSC::setNewValueFromDateArgs): + (JSC::dateProtoFuncSetMilliSeconds): + (JSC::dateProtoFuncSetUTCMilliseconds): + (JSC::dateProtoFuncSetSeconds): + (JSC::dateProtoFuncSetUTCSeconds): + (JSC::dateProtoFuncSetMinutes): + (JSC::dateProtoFuncSetUTCMinutes): + (JSC::dateProtoFuncSetHours): + (JSC::dateProtoFuncSetUTCHours): + (JSC::dateProtoFuncSetDate): + (JSC::dateProtoFuncSetUTCDate): + (JSC::dateProtoFuncSetMonth): + (JSC::dateProtoFuncSetUTCMonth): + (JSC::dateProtoFuncSetFullYear): + (JSC::dateProtoFuncSetUTCFullYear): + (JSC::dateProtoFuncSetYear): + (JSC::dateProtoFuncGetYear): + * runtime/DatePrototype.h: + (JSC::DatePrototype::createStructure): + * runtime/ErrorConstructor.cpp: + (JSC::callErrorConstructor): + * runtime/ErrorPrototype.cpp: + (JSC::errorProtoFuncToString): + * runtime/ExceptionHelpers.cpp: + (JSC::createInterruptedExecutionException): + (JSC::createError): + (JSC::createStackOverflowError): + (JSC::createUndefinedVariableError): + (JSC::createErrorMessage): + (JSC::createInvalidParamError): + (JSC::createNotAConstructorError): + (JSC::createNotAFunctionError): + * runtime/ExceptionHelpers.h: + * runtime/FunctionConstructor.cpp: + (JSC::callFunctionConstructor): + * runtime/FunctionPrototype.cpp: + (JSC::callFunctionPrototype): + (JSC::functionProtoFuncToString): + (JSC::functionProtoFuncApply): + (JSC::functionProtoFuncCall): + * runtime/FunctionPrototype.h: + (JSC::FunctionPrototype::createStructure): + * runtime/GetterSetter.cpp: + (JSC::GetterSetter::toPrimitive): + (JSC::GetterSetter::getPrimitiveNumber): + * runtime/GetterSetter.h: + (JSC::asGetterSetter): + * runtime/InitializeThreading.cpp: + * runtime/InternalFunction.h: + (JSC::InternalFunction::createStructure): + (JSC::asInternalFunction): + * runtime/JSActivation.cpp: + (JSC::JSActivation::getOwnPropertySlot): + (JSC::JSActivation::put): + (JSC::JSActivation::putWithAttributes): + (JSC::JSActivation::argumentsGetter): + * runtime/JSActivation.h: + (JSC::JSActivation::createStructure): + (JSC::asActivation): + * runtime/JSArray.cpp: + (JSC::storageSize): + (JSC::JSArray::JSArray): + (JSC::JSArray::getOwnPropertySlot): + (JSC::JSArray::put): + (JSC::JSArray::putSlowCase): + (JSC::JSArray::deleteProperty): + (JSC::JSArray::getPropertyNames): + (JSC::JSArray::setLength): + (JSC::JSArray::pop): + (JSC::JSArray::push): + (JSC::JSArray::mark): + (JSC::JSArray::sort): + (JSC::JSArray::compactForSorting): + (JSC::JSArray::checkConsistency): + (JSC::constructArray): + * runtime/JSArray.h: + (JSC::JSArray::getIndex): + (JSC::JSArray::setIndex): + (JSC::JSArray::createStructure): + (JSC::asArray): + * runtime/JSCell.cpp: + (JSC::JSCell::put): + (JSC::JSCell::getJSNumber): + * runtime/JSCell.h: + (JSC::asCell): + (JSC::JSValue::asCell): + (JSC::JSValue::toPrimitive): + (JSC::JSValue::getPrimitiveNumber): + (JSC::JSValue::getJSNumber): + * runtime/JSFunction.cpp: + (JSC::JSFunction::call): + (JSC::JSFunction::argumentsGetter): + (JSC::JSFunction::callerGetter): + (JSC::JSFunction::lengthGetter): + (JSC::JSFunction::getOwnPropertySlot): + (JSC::JSFunction::put): + (JSC::JSFunction::construct): + * runtime/JSFunction.h: + (JSC::JSFunction::createStructure): + (JSC::asFunction): + * runtime/JSGlobalData.h: + * runtime/JSGlobalObject.cpp: + (JSC::markIfNeeded): + (JSC::JSGlobalObject::put): + (JSC::JSGlobalObject::putWithAttributes): + (JSC::JSGlobalObject::reset): + (JSC::JSGlobalObject::resetPrototype): + * runtime/JSGlobalObject.h: + (JSC::JSGlobalObject::createStructure): + (JSC::JSGlobalObject::GlobalPropertyInfo::GlobalPropertyInfo): + (JSC::asGlobalObject): + (JSC::Structure::prototypeForLookup): + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::encode): + (JSC::decode): + (JSC::globalFuncEval): + (JSC::globalFuncParseInt): + (JSC::globalFuncParseFloat): + (JSC::globalFuncIsNaN): + (JSC::globalFuncIsFinite): + (JSC::globalFuncDecodeURI): + (JSC::globalFuncDecodeURIComponent): + (JSC::globalFuncEncodeURI): + (JSC::globalFuncEncodeURIComponent): + (JSC::globalFuncEscape): + (JSC::globalFuncUnescape): + (JSC::globalFuncJSCPrint): + * runtime/JSGlobalObjectFunctions.h: + * runtime/JSImmediate.cpp: + (JSC::JSImmediate::toThisObject): + (JSC::JSImmediate::toObject): + (JSC::JSImmediate::prototype): + (JSC::JSImmediate::toString): + * runtime/JSImmediate.h: + (JSC::JSImmediate::isImmediate): + (JSC::JSImmediate::isNumber): + (JSC::JSImmediate::isPositiveNumber): + (JSC::JSImmediate::isBoolean): + (JSC::JSImmediate::isUndefinedOrNull): + (JSC::JSImmediate::isNegative): + (JSC::JSImmediate::isEitherImmediate): + (JSC::JSImmediate::isAnyImmediate): + (JSC::JSImmediate::areBothImmediate): + (JSC::JSImmediate::areBothImmediateNumbers): + (JSC::JSImmediate::andImmediateNumbers): + (JSC::JSImmediate::xorImmediateNumbers): + (JSC::JSImmediate::orImmediateNumbers): + (JSC::JSImmediate::rightShiftImmediateNumbers): + (JSC::JSImmediate::canDoFastAdditiveOperations): + (JSC::JSImmediate::addImmediateNumbers): + (JSC::JSImmediate::subImmediateNumbers): + (JSC::JSImmediate::incImmediateNumber): + (JSC::JSImmediate::decImmediateNumber): + (JSC::JSImmediate::makeValue): + (JSC::JSImmediate::makeInt): + (JSC::JSImmediate::makeBool): + (JSC::JSImmediate::makeUndefined): + (JSC::JSImmediate::makeNull): + (JSC::JSImmediate::intValue): + (JSC::JSImmediate::uintValue): + (JSC::JSImmediate::boolValue): + (JSC::JSImmediate::rawValue): + (JSC::JSImmediate::trueImmediate): + (JSC::JSImmediate::falseImmediate): + (JSC::JSImmediate::undefinedImmediate): + (JSC::JSImmediate::nullImmediate): + (JSC::JSImmediate::zeroImmediate): + (JSC::JSImmediate::oneImmediate): + (JSC::JSImmediate::impossibleValue): + (JSC::JSImmediate::toBoolean): + (JSC::JSImmediate::getTruncatedUInt32): + (JSC::JSImmediate::from): + (JSC::JSImmediate::getTruncatedInt32): + (JSC::JSImmediate::toDouble): + (JSC::JSImmediate::getUInt32): + (JSC::jsNull): + (JSC::jsBoolean): + (JSC::jsUndefined): + (JSC::JSValue::isUndefined): + (JSC::JSValue::isNull): + (JSC::JSValue::isUndefinedOrNull): + (JSC::JSValue::isBoolean): + (JSC::JSValue::getBoolean): + (JSC::JSValue::toInt32): + (JSC::JSValue::toUInt32): + (JSC::toInt32): + (JSC::toUInt32): + * runtime/JSNotAnObject.cpp: + (JSC::JSNotAnObject::toPrimitive): + (JSC::JSNotAnObject::getPrimitiveNumber): + (JSC::JSNotAnObject::put): + * runtime/JSNotAnObject.h: + (JSC::JSNotAnObject::createStructure): + * runtime/JSNumberCell.cpp: + (JSC::JSNumberCell::toPrimitive): + (JSC::JSNumberCell::getPrimitiveNumber): + (JSC::JSNumberCell::getJSNumber): + (JSC::jsNumberCell): + (JSC::jsNaN): + * runtime/JSNumberCell.h: + (JSC::JSNumberCell::createStructure): + (JSC::asNumberCell): + (JSC::jsNumber): + (JSC::JSValue::toJSNumber): + * runtime/JSObject.cpp: + (JSC::JSObject::mark): + (JSC::JSObject::put): + (JSC::JSObject::putWithAttributes): + (JSC::callDefaultValueFunction): + (JSC::JSObject::getPrimitiveNumber): + (JSC::JSObject::defaultValue): + (JSC::JSObject::defineGetter): + (JSC::JSObject::defineSetter): + (JSC::JSObject::lookupGetter): + (JSC::JSObject::lookupSetter): + (JSC::JSObject::hasInstance): + (JSC::JSObject::toNumber): + (JSC::JSObject::toString): + (JSC::JSObject::fillGetterPropertySlot): + * runtime/JSObject.h: + (JSC::JSObject::getDirect): + (JSC::JSObject::getDirectLocation): + (JSC::JSObject::offsetForLocation): + (JSC::JSObject::locationForOffset): + (JSC::JSObject::getDirectOffset): + (JSC::JSObject::putDirectOffset): + (JSC::JSObject::createStructure): + (JSC::asObject): + (JSC::JSObject::prototype): + (JSC::JSObject::setPrototype): + (JSC::JSObject::inlineGetOwnPropertySlot): + (JSC::JSObject::getOwnPropertySlotForWrite): + (JSC::JSObject::getPropertySlot): + (JSC::JSObject::get): + (JSC::JSObject::putDirect): + (JSC::JSObject::putDirectWithoutTransition): + (JSC::JSObject::toPrimitive): + (JSC::JSValue::get): + (JSC::JSValue::put): + (JSC::JSObject::allocatePropertyStorageInline): + * runtime/JSPropertyNameIterator.cpp: + (JSC::JSPropertyNameIterator::toPrimitive): + (JSC::JSPropertyNameIterator::getPrimitiveNumber): + * runtime/JSPropertyNameIterator.h: + (JSC::JSPropertyNameIterator::create): + (JSC::JSPropertyNameIterator::next): + * runtime/JSStaticScopeObject.cpp: + (JSC::JSStaticScopeObject::put): + (JSC::JSStaticScopeObject::putWithAttributes): + * runtime/JSStaticScopeObject.h: + (JSC::JSStaticScopeObject::JSStaticScopeObject): + (JSC::JSStaticScopeObject::createStructure): + * runtime/JSString.cpp: + (JSC::JSString::toPrimitive): + (JSC::JSString::getPrimitiveNumber): + (JSC::JSString::getOwnPropertySlot): + * runtime/JSString.h: + (JSC::JSString::createStructure): + (JSC::asString): + * runtime/JSValue.h: + (JSC::JSValuePtr::makeImmediate): + (JSC::JSValuePtr::immediateValue): + (JSC::JSValuePtr::JSValuePtr): + (JSC::JSValuePtr::operator->): + (JSC::JSValuePtr::hasValue): + (JSC::JSValuePtr::operator==): + (JSC::JSValuePtr::operator!=): + (JSC::JSValuePtr::encode): + (JSC::JSValuePtr::decode): + (JSC::JSValue::asValue): + (JSC::noValue): + (JSC::operator==): + (JSC::operator!=): + * runtime/JSVariableObject.h: + (JSC::JSVariableObject::symbolTablePut): + (JSC::JSVariableObject::symbolTablePutWithAttributes): + * runtime/JSWrapperObject.cpp: + (JSC::JSWrapperObject::mark): + * runtime/JSWrapperObject.h: + (JSC::JSWrapperObject::internalValue): + (JSC::JSWrapperObject::setInternalValue): + * runtime/Lookup.cpp: + (JSC::setUpStaticFunctionSlot): + * runtime/Lookup.h: + (JSC::lookupPut): + * runtime/MathObject.cpp: + (JSC::mathProtoFuncAbs): + (JSC::mathProtoFuncACos): + (JSC::mathProtoFuncASin): + (JSC::mathProtoFuncATan): + (JSC::mathProtoFuncATan2): + (JSC::mathProtoFuncCeil): + (JSC::mathProtoFuncCos): + (JSC::mathProtoFuncExp): + (JSC::mathProtoFuncFloor): + (JSC::mathProtoFuncLog): + (JSC::mathProtoFuncMax): + (JSC::mathProtoFuncMin): + (JSC::mathProtoFuncPow): + (JSC::mathProtoFuncRandom): + (JSC::mathProtoFuncRound): + (JSC::mathProtoFuncSin): + (JSC::mathProtoFuncSqrt): + (JSC::mathProtoFuncTan): + * runtime/MathObject.h: + (JSC::MathObject::createStructure): + * runtime/NativeErrorConstructor.cpp: + (JSC::callNativeErrorConstructor): + * runtime/NumberConstructor.cpp: + (JSC::numberConstructorNaNValue): + (JSC::numberConstructorNegInfinity): + (JSC::numberConstructorPosInfinity): + (JSC::numberConstructorMaxValue): + (JSC::numberConstructorMinValue): + (JSC::callNumberConstructor): + * runtime/NumberConstructor.h: + (JSC::NumberConstructor::createStructure): + * runtime/NumberObject.cpp: + (JSC::NumberObject::getJSNumber): + (JSC::constructNumberFromImmediateNumber): + * runtime/NumberObject.h: + * runtime/NumberPrototype.cpp: + (JSC::numberProtoFuncToString): + (JSC::numberProtoFuncToLocaleString): + (JSC::numberProtoFuncValueOf): + (JSC::numberProtoFuncToFixed): + (JSC::numberProtoFuncToExponential): + (JSC::numberProtoFuncToPrecision): + * runtime/ObjectConstructor.cpp: + (JSC::constructObject): + (JSC::callObjectConstructor): + * runtime/ObjectPrototype.cpp: + (JSC::objectProtoFuncValueOf): + (JSC::objectProtoFuncHasOwnProperty): + (JSC::objectProtoFuncIsPrototypeOf): + (JSC::objectProtoFuncDefineGetter): + (JSC::objectProtoFuncDefineSetter): + (JSC::objectProtoFuncLookupGetter): + (JSC::objectProtoFuncLookupSetter): + (JSC::objectProtoFuncPropertyIsEnumerable): + (JSC::objectProtoFuncToLocaleString): + (JSC::objectProtoFuncToString): + * runtime/ObjectPrototype.h: + * runtime/Operations.cpp: + (JSC::equal): + (JSC::equalSlowCase): + (JSC::strictEqual): + (JSC::strictEqualSlowCase): + (JSC::throwOutOfMemoryError): + * runtime/Operations.h: + (JSC::equalSlowCaseInline): + (JSC::strictEqualSlowCaseInline): + * runtime/PropertySlot.cpp: + (JSC::PropertySlot::functionGetter): + * runtime/PropertySlot.h: + (JSC::PropertySlot::PropertySlot): + (JSC::PropertySlot::getValue): + (JSC::PropertySlot::putValue): + (JSC::PropertySlot::setValueSlot): + (JSC::PropertySlot::setValue): + (JSC::PropertySlot::setCustom): + (JSC::PropertySlot::setCustomIndex): + (JSC::PropertySlot::slotBase): + (JSC::PropertySlot::setBase): + (JSC::PropertySlot::): + * runtime/Protect.h: + (JSC::gcProtect): + (JSC::gcUnprotect): + (JSC::ProtectedPtr::ProtectedPtr): + (JSC::ProtectedPtr::operator JSValuePtr): + (JSC::ProtectedJSValuePtr::ProtectedJSValuePtr): + (JSC::ProtectedJSValuePtr::get): + (JSC::ProtectedJSValuePtr::operator JSValuePtr): + (JSC::ProtectedJSValuePtr::operator->): + (JSC::::ProtectedPtr): + (JSC::::~ProtectedPtr): + (JSC::::operator): + (JSC::ProtectedJSValuePtr::~ProtectedJSValuePtr): + (JSC::ProtectedJSValuePtr::operator=): + (JSC::operator==): + (JSC::operator!=): + * runtime/RegExpConstructor.cpp: + (JSC::RegExpConstructor::getBackref): + (JSC::RegExpConstructor::getLastParen): + (JSC::RegExpConstructor::getLeftContext): + (JSC::RegExpConstructor::getRightContext): + (JSC::regExpConstructorDollar1): + (JSC::regExpConstructorDollar2): + (JSC::regExpConstructorDollar3): + (JSC::regExpConstructorDollar4): + (JSC::regExpConstructorDollar5): + (JSC::regExpConstructorDollar6): + (JSC::regExpConstructorDollar7): + (JSC::regExpConstructorDollar8): + (JSC::regExpConstructorDollar9): + (JSC::regExpConstructorInput): + (JSC::regExpConstructorMultiline): + (JSC::regExpConstructorLastMatch): + (JSC::regExpConstructorLastParen): + (JSC::regExpConstructorLeftContext): + (JSC::regExpConstructorRightContext): + (JSC::RegExpConstructor::put): + (JSC::setRegExpConstructorInput): + (JSC::setRegExpConstructorMultiline): + (JSC::constructRegExp): + (JSC::callRegExpConstructor): + * runtime/RegExpConstructor.h: + (JSC::RegExpConstructor::createStructure): + (JSC::asRegExpConstructor): + * runtime/RegExpMatchesArray.h: + (JSC::RegExpMatchesArray::put): + * runtime/RegExpObject.cpp: + (JSC::regExpObjectGlobal): + (JSC::regExpObjectIgnoreCase): + (JSC::regExpObjectMultiline): + (JSC::regExpObjectSource): + (JSC::regExpObjectLastIndex): + (JSC::RegExpObject::put): + (JSC::setRegExpObjectLastIndex): + (JSC::RegExpObject::test): + (JSC::RegExpObject::exec): + (JSC::callRegExpObject): + * runtime/RegExpObject.h: + (JSC::RegExpObject::createStructure): + (JSC::asRegExpObject): + * runtime/RegExpPrototype.cpp: + (JSC::regExpProtoFuncTest): + (JSC::regExpProtoFuncExec): + (JSC::regExpProtoFuncCompile): + (JSC::regExpProtoFuncToString): + * runtime/StringConstructor.cpp: + (JSC::stringFromCharCodeSlowCase): + (JSC::stringFromCharCode): + (JSC::callStringConstructor): + * runtime/StringObject.cpp: + (JSC::StringObject::put): + * runtime/StringObject.h: + (JSC::StringObject::createStructure): + (JSC::asStringObject): + * runtime/StringObjectThatMasqueradesAsUndefined.h: + (JSC::StringObjectThatMasqueradesAsUndefined::createStructure): + * runtime/StringPrototype.cpp: + (JSC::stringProtoFuncReplace): + (JSC::stringProtoFuncToString): + (JSC::stringProtoFuncCharAt): + (JSC::stringProtoFuncCharCodeAt): + (JSC::stringProtoFuncConcat): + (JSC::stringProtoFuncIndexOf): + (JSC::stringProtoFuncLastIndexOf): + (JSC::stringProtoFuncMatch): + (JSC::stringProtoFuncSearch): + (JSC::stringProtoFuncSlice): + (JSC::stringProtoFuncSplit): + (JSC::stringProtoFuncSubstr): + (JSC::stringProtoFuncSubstring): + (JSC::stringProtoFuncToLowerCase): + (JSC::stringProtoFuncToUpperCase): + (JSC::stringProtoFuncLocaleCompare): + (JSC::stringProtoFuncBig): + (JSC::stringProtoFuncSmall): + (JSC::stringProtoFuncBlink): + (JSC::stringProtoFuncBold): + (JSC::stringProtoFuncFixed): + (JSC::stringProtoFuncItalics): + (JSC::stringProtoFuncStrike): + (JSC::stringProtoFuncSub): + (JSC::stringProtoFuncSup): + (JSC::stringProtoFuncFontcolor): + (JSC::stringProtoFuncFontsize): + (JSC::stringProtoFuncAnchor): + (JSC::stringProtoFuncLink): + * runtime/Structure.cpp: + (JSC::Structure::Structure): + (JSC::Structure::changePrototypeTransition): + (JSC::Structure::createCachedPrototypeChain): + * runtime/Structure.h: + (JSC::Structure::create): + (JSC::Structure::setPrototypeWithoutTransition): + (JSC::Structure::storedPrototype): + +2009-01-06 Oliver Hunt <oliver@apple.com> + + Reviewed by Cameron Zwarich. + + <https://bugs.webkit.org/show_bug.cgi?id=23085> [jsfunfuzz] Over released ScopeChainNode + <rdar://problem/6474110> + + So this delightful bug was caused by our unwind code using a ScopeChain to perform + the unwind. The ScopeChain would ref the initial top of the scope chain, then deref + the resultant top of scope chain, which is incorrect. + + This patch removes the dependency on ScopeChain for the unwind, and i've filed + <https://bugs.webkit.org/show_bug.cgi?id=23144> to look into the unintuitive + ScopeChain behaviour. + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::throwException): + +2009-01-06 Adam Roben <aroben@apple.com> + + Hopeful Windows crash-on-launch fix + + * wtf/Platform.h: Force a world rebuild by touching this file. + +2009-01-06 Holger Hans Peter Freyther <zecke@selfish.org> + + Reviewed by NOBODY (Build fix). + + * GNUmakefile.am:Add ByteArray.cpp too + +2009-01-06 Holger Hans Peter Freyther <zecke@selfish.org> + + Reviewed by NOBODY (Speculative build fix). + + AllInOneFile.cpp does not include the JSByteArray.cpp include it... + + * GNUmakefile.am: + +2009-01-05 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Build fix). + + Fix Wx build + + * JavaScriptCoreSources.bkl: + +2009-01-05 Oliver Hunt <oliver@apple.com> + + Windows build fixes + + Rubber-stamped by Alice Liu. + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::Interpreter): + * runtime/ByteArray.cpp: + (JSC::ByteArray::create): + * runtime/ByteArray.h: + +2009-01-05 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + CanvasPixelArray performance is too slow + <https://bugs.webkit.org/show_bug.cgi?id=23123> + + The fix to this is to devirtualise get and put in a manner similar to + JSString and JSArray. To do this I've added a ByteArray implementation + and JSByteArray wrapper to JSC. We can then do vptr comparisons to + devirtualise the calls. + + This devirtualisation improves performance by 1.5-2x in my somewhat ad + hoc tests. + + * GNUmakefile.am: + * JavaScriptCore.exp: + * JavaScriptCore.pri: + * JavaScriptCore.scons: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * interpreter/Interpreter.cpp: + (JSC::Interpreter::Interpreter): + (JSC::Interpreter::privateExecute): + (JSC::Interpreter::cti_op_get_by_val): + (JSC::Interpreter::cti_op_put_by_val): + * interpreter/Interpreter.h: + (JSC::Interpreter::isJSByteArray): + * runtime/ByteArray.cpp: Added. + (JSC::ByteArray::create): + * runtime/ByteArray.h: Added. + (JSC::ByteArray::length): + (JSC::ByteArray::set): + (JSC::ByteArray::get): + (JSC::ByteArray::data): + (JSC::ByteArray::ByteArray): + * runtime/JSByteArray.cpp: Added. + (JSC::): + (JSC::JSByteArray::JSByteArray): + (JSC::JSByteArray::createStructure): + (JSC::JSByteArray::getOwnPropertySlot): + (JSC::JSByteArray::put): + (JSC::JSByteArray::getPropertyNames): + * runtime/JSByteArray.h: Added. + (JSC::JSByteArray::canAccessIndex): + (JSC::JSByteArray::getIndex): + (JSC::JSByteArray::setIndex): + (JSC::JSByteArray::classInfo): + (JSC::JSByteArray::length): + (JSC::JSByteArray::): + (JSC::JSByteArray::JSByteArray): + (JSC::asByteArray): + +2009-01-05 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=23073 + <rdar://problem/6471129> Workers crash on Windows Release builds + + * wtf/ThreadSpecific.h: + (WTF::ThreadSpecific::destroy): Changed to clear the pointer only after data object + destruction is finished - otherwise, WebCore::ThreadGlobalData destructor was re-creating + the object in order to access atomic string table. + (WTF::ThreadSpecific::operator T*): Symmetrically, set up the per-thread pointer before + data constructor is called. + + * wtf/ThreadingWin.cpp: (WTF::wtfThreadEntryPoint): Remove a Windows-only hack to finalize + a thread - pthreadVC2 is a DLL, so it gets thread detached messages, and cleans up thread + specific data automatically. Besides, this code wasn't even compiled in for some time now. + +2009-01-05 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=23115 + Create a version of ASSERT for use with otherwise unused variables + + * wtf/Assertions.h: Added ASSERT_UNUSED. + + * jit/ExecutableAllocatorPosix.cpp: + (JSC::ExecutablePool::systemRelease): + * runtime/Collector.cpp: + (JSC::Heap::destroy): + (JSC::Heap::heapAllocate): + * runtime/JSNotAnObject.cpp: + (JSC::JSNotAnObject::toPrimitive): + (JSC::JSNotAnObject::getPrimitiveNumber): + (JSC::JSNotAnObject::toBoolean): + (JSC::JSNotAnObject::toNumber): + (JSC::JSNotAnObject::toString): + (JSC::JSNotAnObject::getOwnPropertySlot): + (JSC::JSNotAnObject::put): + (JSC::JSNotAnObject::deleteProperty): + (JSC::JSNotAnObject::getPropertyNames): + * wtf/TCSystemAlloc.cpp: + (TCMalloc_SystemRelease): + Use it in some places that used other idioms for this purpose. + +2009-01-04 Alice Liu <alice.liu@apple.com> + + <rdar://problem/6341776> Merge m_transitionCount and m_offset in Structure. + + Reviewed by Darin Adler. + + * runtime/Structure.cpp: + (JSC::Structure::Structure): Remove m_transitionCount + (JSC::Structure::addPropertyTransitionToExistingStructure): No need to wait until after the assignment to offset to assert if it's notFound; move it up. + (JSC::Structure::addPropertyTransition): Use method for transitionCount instead of m_transitionCount. Remove line that maintains the m_transitionCount. + (JSC::Structure::changePrototypeTransition): Remove line that maintains the m_transitionCount. + (JSC::Structure::getterSetterTransition): Remove line that maintains the m_transitionCount. + * runtime/Structure.h: + Changed s_maxTransitionLength and m_offset from size_t to signed char. m_offset will never become greater than 64 + because the structure transitions to a dictionary at that time. + (JSC::Structure::transitionCount): method to replace the data member + +2009-01-04 Darin Adler <darin@apple.com> + + Reviewed by David Kilzer. + + Bug 15114: Provide compile-time assertions for sizeof(UChar), sizeof(DeprecatedChar), etc. + https://bugs.webkit.org/show_bug.cgi?id=15114 + + * wtf/unicode/Unicode.h: Assert size of UChar. There is no DeprecatedChar any more. + +2009-01-03 Sam Weinig <sam@webkit.org> + + Reviewed by Oliver Hunt. + + Change the pcVector from storing native code pointers to storing offsets + from the base pointer. This will allow us to generate the pcVector on demand + for exceptions. + + * bytecode/CodeBlock.h: + (JSC::PC::PC): + (JSC::getNativePCOffset): + (JSC::CodeBlock::getBytecodeIndex): + * jit/JIT.cpp: + (JSC::JIT::privateCompile): + +2009-01-02 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Build fix). + + * runtime/ScopeChain.cpp: + +2009-01-02 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + [jsfunfuzz] unwind logic for exceptions in eval fails to account for dynamic scope external to the eval + https://bugs.webkit.org/show_bug.cgi?id=23078 + + This bug was caused by eval codeblocks being generated without accounting + for the depth of the scope chain they inherited. This meant that exception + handlers would understate their expected scope chain depth, which in turn + led to incorrectly removing nodes from the scope chain. + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::BytecodeGenerator): + (JSC::BytecodeGenerator::emitCatch): + * bytecompiler/BytecodeGenerator.h: + * interpreter/Interpreter.cpp: + (JSC::depth): + * runtime/ScopeChain.cpp: + (JSC::ScopeChain::localDepth): + * runtime/ScopeChain.h: + (JSC::ScopeChainNode::deref): + (JSC::ScopeChainNode::ref): + +2009-01-02 David Smith <catfish.man@gmail.com> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=22699 + Enable NodeList caching for getElementsByTagName + + * wtf/HashFunctions.h: Moved the definition of PHI here and renamed to stringHashingStartValue + +2009-01-02 David Kilzer <ddkilzer@apple.com> + + Attempt to fix Qt Linux build after r39553 + + * wtf/RandomNumberSeed.h: Include <sys/time.h> for gettimeofday(). + Include <sys/types.h> and <unistd.h> for getpid(). + +2009-01-02 David Kilzer <ddkilzer@apple.com> + + Bug 23081: These files are no longer part of the KDE libraries + + <https://bugs.webkit.org/show_bug.cgi?id=23081> + + Reviewed by Darin Adler. + + Removed "This file is part of the KDE libraries" comment from + source files. Added or updated Apple copyrights as well. + + * parser/Lexer.h: + * wtf/HashCountedSet.h: + * wtf/RetainPtr.h: + * wtf/VectorTraits.h: + +2009-01-02 David Kilzer <ddkilzer@apple.com> + + Bug 23080: Remove last vestiges of KJS references + + <https://bugs.webkit.org/show_bug.cgi?id=23080> + + Reviewed by Darin Adler. + + Also updated Apple copyright statements. + + * DerivedSources.make: Changed bison "kjsyy" prefix to "jscyy". + * GNUmakefile.am: Ditto. + * JavaScriptCore.pri: Ditto. Also changed KJSBISON to JSCBISON + and kjsbison to jscbison. + + * JavaScriptCoreSources.bkl: Changed JSCORE_KJS_SOURCES to + JSCORE_JSC_SOURCES. + * jscore.bkl: Ditto. + + * create_hash_table: Updated copyright and removed old comment. + + * parser/Grammar.y: Changed "kjsyy" prefix to "jscyy" prefix. + * parser/Lexer.cpp: Ditto. Also changed KJS_DEBUG_LEX to + JSC_DEBUG_LEX. + (jscyylex): + (JSC::Lexer::lex): + * parser/Parser.cpp: Ditto. + (JSC::Parser::parse): + + * pcre/dftables: Changed "kjs_pcre_" prefix to "jsc_pcre_". + * pcre/pcre_compile.cpp: Ditto. + (getOthercaseRange): + (encodeUTF8): + (compileBranch): + (calculateCompiledPatternLength): + * pcre/pcre_exec.cpp: Ditto. + (matchRef): + (getUTF8CharAndIncrementLength): + (match): + * pcre/pcre_internal.h: Ditto. + (toLowerCase): + (flipCase): + (classBitmapForChar): + (charTypeForChar): + * pcre/pcre_tables.cpp: Ditto. + * pcre/pcre_ucp_searchfuncs.cpp: Ditto. + (jsc_pcre_ucp_othercase): + * pcre/pcre_xclass.cpp: Ditto. + (getUTF8CharAndAdvancePointer): + (jsc_pcre_xclass): + + * runtime/Collector.h: Updated header guards using the + clean-header-guards script. + * runtime/CollectorHeapIterator.h: Added missing header guard. + * runtime/Identifier.h: Updated header guards. + * runtime/JSFunction.h: Fixed end-of-namespace comment. + + * runtime/JSGlobalObject.cpp: + (JSC::JSGlobalObject::reset): Renamed "kjsprint" debug function + to "jscprint". Changed implementation method from + globalFuncKJSPrint() to globalFuncJSCPrint(). + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::globalFuncJSCPrint): Renamed from globalFuncKJSPrint(). + * runtime/JSGlobalObjectFunctions.h: Ditto. + + * runtime/JSImmediate.h: Updated header guards. + * runtime/JSLock.h: Ditto. + * runtime/JSType.h: Ditto. + * runtime/JSWrapperObject.h: Ditto. + * runtime/Lookup.h: Ditto. + * runtime/Operations.h: Ditto. + * runtime/Protect.h: Ditto. + * runtime/RegExp.h: Ditto. + * runtime/UString.h: Ditto. + + * tests/mozilla/js1_5/Array/regress-157652.js: Changed "KJS" + reference in comment to "JSC". + + * wrec/CharacterClassConstructor.cpp: Change "kjs_pcre_" function + prefixes to "jsc_pcre_". + (JSC::WREC::CharacterClassConstructor::put): + (JSC::WREC::CharacterClassConstructor::flush): + + * wtf/unicode/Unicode.h: Change "KJS_" header guard to "WTF_". + * wtf/unicode/icu/UnicodeIcu.h: Ditto. + * wtf/unicode/qt4/UnicodeQt4.h: Ditto. + +2009-01-02 Oliver Hunt <oliver@apple.com> + + Reviewed by Maciej Stachowiak. + + Make randomNumber generate 2^53 values instead of 2^32 (or 2^31 for rand() platforms) + + * wtf/RandomNumber.cpp: + (WTF::randomNumber): + +2009-01-02 David Kilzer <ddkilzer@apple.com> + + Remove declaration for JSC::Identifier::initializeIdentifierThreading() + + Reviewed by Alexey Proskuryakov. + + * runtime/Identifier.h: + (JSC::Identifier::initializeIdentifierThreading): Removed + declaration since the implementation was removed in r34412. + +2009-01-01 Darin Adler <darin@apple.com> + + Reviewed by Oliver Hunt. + + String.replace does not support $& replacement metacharacter when search term is not a RegExp + <https://bugs.webkit.org/show_bug.cgi?id=21431> + <rdar://problem/6274993> + + Test: fast/js/string-replace-3.html + + * runtime/StringPrototype.cpp: + (JSC::substituteBackreferences): Added a null check here so we won't try to handle $$-$9 + backreferences when the search term is a string, not a RegExp. Added a check for 0 so we + won't try to handle $0 or $00 as a backreference. + (JSC::stringProtoFuncReplace): Added a call to substituteBackreferences. + +2009-01-01 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Darin Adler. + + Allow 32-bit integers to be stored in JSImmediates, on x64-bit. + Presently the top 32-bits of a 64-bit JSImmediate serve as a sign extension of a 31-bit + int stored in the low word (shifted left by one, to make room for a tag). In the new + format, the top 31-bits serve as a sign extension of a 32-bit int, still shifted left by + one. + + The new behavior is enabled using a flag in Platform.h, 'WTF_USE_ALTERNATE_JSIMMEDIATE'. + When this is set the constants defining the range of ints allowed to be stored as + JSImmediate values is extended. The code in JSImmediate.h can safely operate on either + format. This patch updates the JIT so that it can also operate with the new format. + + ~2% progression on x86-64, with & without the JIT, on sunspider & v8 tests. + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::addPtr): + (JSC::MacroAssembler::orPtr): + (JSC::MacroAssembler::or32): + (JSC::MacroAssembler::rshiftPtr): + (JSC::MacroAssembler::rshift32): + (JSC::MacroAssembler::subPtr): + (JSC::MacroAssembler::xorPtr): + (JSC::MacroAssembler::xor32): + (JSC::MacroAssembler::move): + (JSC::MacroAssembler::compareImm64ForBranch): + (JSC::MacroAssembler::compareImm64ForBranchEquality): + (JSC::MacroAssembler::jePtr): + (JSC::MacroAssembler::jgePtr): + (JSC::MacroAssembler::jlPtr): + (JSC::MacroAssembler::jlePtr): + (JSC::MacroAssembler::jnePtr): + (JSC::MacroAssembler::jnzSubPtr): + (JSC::MacroAssembler::joAddPtr): + (JSC::MacroAssembler::jzSubPtr): + * assembler/X86Assembler.h: + (JSC::X86Assembler::addq_rr): + (JSC::X86Assembler::orq_ir): + (JSC::X86Assembler::subq_ir): + (JSC::X86Assembler::xorq_rr): + (JSC::X86Assembler::sarq_CLr): + (JSC::X86Assembler::sarq_i8r): + (JSC::X86Assembler::cmpq_ir): + * jit/JIT.cpp: + (JSC::JIT::compileOpStrictEq): + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + (JSC::JIT::privateCompileCTIMachineTrampolines): + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::compileFastArith_op_lshift): + (JSC::JIT::compileFastArithSlow_op_lshift): + (JSC::JIT::compileFastArith_op_rshift): + (JSC::JIT::compileFastArithSlow_op_rshift): + (JSC::JIT::compileFastArith_op_bitand): + (JSC::JIT::compileFastArithSlow_op_bitand): + (JSC::JIT::compileFastArith_op_mod): + (JSC::JIT::compileFastArithSlow_op_mod): + (JSC::JIT::compileFastArith_op_add): + (JSC::JIT::compileFastArithSlow_op_add): + (JSC::JIT::compileFastArith_op_mul): + (JSC::JIT::compileFastArithSlow_op_mul): + (JSC::JIT::compileFastArith_op_post_inc): + (JSC::JIT::compileFastArithSlow_op_post_inc): + (JSC::JIT::compileFastArith_op_post_dec): + (JSC::JIT::compileFastArithSlow_op_post_dec): + (JSC::JIT::compileFastArith_op_pre_inc): + (JSC::JIT::compileFastArithSlow_op_pre_inc): + (JSC::JIT::compileFastArith_op_pre_dec): + (JSC::JIT::compileFastArithSlow_op_pre_dec): + (JSC::JIT::compileBinaryArithOp): + * jit/JITInlineMethods.h: + (JSC::JIT::getConstantOperand): + (JSC::JIT::getConstantOperandImmediateInt): + (JSC::JIT::isOperandConstantImmediateInt): + (JSC::JIT::isOperandConstant31BitImmediateInt): + (JSC::JIT::emitFastArithDeTagImmediate): + (JSC::JIT::emitFastArithDeTagImmediateJumpIfZero): + (JSC::JIT::emitFastArithReTagImmediate): + (JSC::JIT::emitFastArithImmToInt): + (JSC::JIT::emitFastArithIntToImmNoCheck): + * runtime/JSImmediate.h: + (JSC::JSImmediate::isPositiveNumber): + (JSC::JSImmediate::isNegative): + (JSC::JSImmediate::rightShiftImmediateNumbers): + (JSC::JSImmediate::canDoFastAdditiveOperations): + (JSC::JSImmediate::makeValue): + (JSC::JSImmediate::makeInt): + (JSC::JSImmediate::makeBool): + (JSC::JSImmediate::intValue): + (JSC::JSImmediate::rawValue): + (JSC::JSImmediate::toBoolean): + (JSC::JSImmediate::from): + * wtf/Platform.h: + +2008-12-31 Oliver Hunt <oliver@apple.com> + + Reviewed by Cameron Zwarich. + + [jsfunfuzz] Assertion + incorrect behaviour with dynamically created local variable in a catch block + <https://bugs.webkit.org/show_bug.cgi?id=23063> + + Eval inside a catch block attempts to use the catch block's static scope in + an unsafe way by attempting to add new properties to the scope. This patch + fixes this issue simply by preventing the catch block from using a static + scope if it contains an eval. + + * parser/Grammar.y: + * parser/Nodes.cpp: + (JSC::TryNode::emitBytecode): + * parser/Nodes.h: + (JSC::TryNode::): + +2008-12-31 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough. + + [jsfunfuzz] Computed exception offset wrong when first instruction is attempt to resolve deleted eval + <https://bugs.webkit.org/show_bug.cgi?id=23062> + + This was caused by the expression information for the initial resolve of + eval not being emitted. If this resolve was the first instruction that + could throw an exception the information search would fail leading to an + assertion failure. If it was not the first throwable opcode the wrong + expression information would used. + + Fix is simply to emit the expression info. + + * parser/Nodes.cpp: + (JSC::EvalFunctionCallNode::emitBytecode): + +2008-12-31 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Oliver Hunt. + + Bug 23054: Caching of global lookups occurs even when the global object has become a dictionary + <https://bugs.webkit.org/show_bug.cgi?id=23054> + <rdar://problem/6469905> + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::resolveGlobal): Do not cache lookup if the global + object has transitioned to a dictionary. + (JSC::Interpreter::cti_op_resolve_global): Do not cache lookup if the + global object has transitioned to a dictionary. + +2008-12-30 Oliver Hunt <oliver@apple.com> + + Reviewed by Darin Adler. + + <https://bugs.webkit.org/show_bug.cgi?id=23049> [jsfunfuzz] With blocks do not correctly protect their scope object + <rdar://problem/6469742> Crash in JSC::TypeInfo::hasStandardGetOwnPropertySlot() running jsfunfuzz + + The problem that caused this was that with nodes were not correctly protecting + the final object that was placed in the scope chain. We correct this by forcing + the use of a temporary register (which stops us relying on a local register + protecting the scope) and changing the behaviour of op_push_scope so that it + will store the final scope object. + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitPushScope): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): + (JSC::Interpreter::cti_op_push_scope): + * interpreter/Interpreter.h: + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + * parser/Nodes.cpp: + (JSC::WithNode::emitBytecode): + +2008-12-30 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Sam Weinig. + + Bug 23037: Parsing and reparsing disagree on automatic semicolon insertion + <https://bugs.webkit.org/show_bug.cgi?id=23037> + <rdar://problem/6467124> + + Parsing and reparsing disagree about automatic semicolon insertion, so that a + function like + + function() { a = 1, } + + is parsed as being syntactically valid but gets a syntax error upon reparsing. + This leads to an assertion failure in Parser::reparse(). It is not that big of + an issue in practice, because in a Release build such a function will return + 'undefined' when called. + + In this case, we are not following the spec and it should be a syntax error. + However, unless there is a newline separating the ',' and the '}', WebKit would + not treat it as a syntax error in the past either. It would be a bit of work to + make the automatic semicolon insertion match the spec exactly, so this patch + changes it to match our past behaviour. + + The problem is that even during reparsing, the Lexer adds a semicolon at the + end of the input, which confuses allowAutomaticSemicolon(), because it is + expecting either a '}', the end of input, or a terminator like a newline. + + * parser/Lexer.cpp: + (JSC::Lexer::Lexer): Initialize m_isReparsing to false. + (JSC::Lexer::lex): Do not perform automatic semicolon insertion in the Lexer if + we are in the middle of reparsing. + (JSC::Lexer::clear): Set m_isReparsing to false. + * parser/Lexer.h: + (JSC::Lexer::setIsReparsing): Added. + * parser/Parser.cpp: + (JSC::Parser::reparse): Call Lexer::setIsReparsing() to notify the Lexer of + reparsing. + +2008-12-29 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Build fix). + + Yet another attempt to fix Tiger. + + * wtf/RandomNumber.cpp: + (WTF::randomNumber): + +2008-12-29 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Build fix). + + Tiger build fix (correct this time) + + * wtf/RandomNumber.cpp: + +2008-12-29 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Rubber-stamped by Alexey Proskuryakov. + + Revert r39509, because kjsyydebug is used in the generated code if YYDEBUG is 1. + + * parser/Grammar.y: + +2008-12-29 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Build fix). + + Tiger build fix. + + * wtf/RandomNumber.cpp: + +2008-12-29 Oliver Hunt <oliver@apple.com> + + Reviewed by Mark Rowe. + + <rdar://problem/6358108> Insecure randomness in Math.random() leads to user tracking + + Switch to arc4random on PLATFORM(DARWIN), this is ~1.5x slower than random(), but the + it is still so fast that there is no fathomable way it could be a bottleneck for anything. + + randomNumber is called in two places + * During form submission where it is called once per form + * Math.random in JSC. For this difference to show up you have to be looping on + a cached local copy of random, for a large (>10000) calls. + + No change in SunSpider. + + * wtf/RandomNumber.cpp: + (WTF::randomNumber): + * wtf/RandomNumberSeed.h: + (WTF::initializeRandomNumberGenerator): + +2008-12-29 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Rubber-stamped by Sam Weinig. + + Remove unused kjsyydebug #define. + + * parser/Grammar.y: + +2008-12-29 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Oliver Hunt and Sam Weinig. + + Bug 23029: REGRESSION (r39337): jsfunfuzz generates identical test files + <https://bugs.webkit.org/show_bug.cgi?id=23029> + <rdar://problem/6469185> + + The unification of random number generation in r39337 resulted in random() + being initialized on Darwin, but rand() actually being used. Fix this by + making randomNumber() use random() instead of rand() on Darwin. + + * wtf/RandomNumber.cpp: + (WTF::randomNumber): + +2008-12-29 Sam Weinig <sam@webkit.org> + + Fix buildbots. + + * runtime/Structure.cpp: + +2008-12-29 Sam Weinig <sam@webkit.org> + + Reviewed by Oliver Hunt. + + Patch for https://bugs.webkit.org/show_bug.cgi?id=23026 + Move the deleted offsets vector into the PropertyMap + + Saves 3 words per Structure. + + * runtime/PropertyMapHashTable.h: + * runtime/Structure.cpp: + (JSC::Structure::addPropertyTransition): + (JSC::Structure::changePrototypeTransition): + (JSC::Structure::getterSetterTransition): + (JSC::Structure::toDictionaryTransition): + (JSC::Structure::fromDictionaryTransition): + (JSC::Structure::copyPropertyTable): + (JSC::Structure::put): + (JSC::Structure::remove): + (JSC::Structure::rehashPropertyMapHashTable): + * runtime/Structure.h: + (JSC::Structure::propertyStorageSize): + +2008-12-29 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Oliver Hunt. + + Change code using m_body.get() as a boolean to take advantage of the + implicit conversion of RefPtr to boolean. + + * runtime/JSFunction.cpp: + (JSC::JSFunction::~JSFunction): + +2008-12-28 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Oliver Hunt. + + Bug 22840: REGRESSION (r38349): Gmail doesn't load with profiling enabled + <https://bugs.webkit.org/show_bug.cgi?id=22840> + <rdar://problem/6468077> + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitNewArray): Add an assertion that the range + of registers passed to op_new_array is sequential. + (JSC::BytecodeGenerator::emitCall): Correct the relocation of registers + when emitting profiler hooks so that registers aren't leaked. Also, add + an assertion that the 'this' register is always ref'd (because it is), + remove the needless protection of the 'this' register when relocating, + and add an assertion that the range of registers passed to op_call for + function call arguments is sequential. + (JSC::BytecodeGenerator::emitConstruct): Correct the relocation of + registers when emitting profiler hooks so that registers aren't leaked. + Also, add an assertion that the range of registers passed to op_construct + for function call arguments is sequential. + +2008-12-26 Mark Rowe <mrowe@apple.com> + + Reviewed by Alexey Proskuryakov. + + <rdar://problem/6467376> Race condition in WTF::currentThread can lead to a thread using two different identifiers during its lifetime + + If a newly-created thread calls WTF::currentThread() before WTF::createThread calls establishIdentifierForPthreadHandle + then more than one identifier will be used for the same thread. We can avoid this by adding some extra synchronization + during thread creation that delays the execution of the thread function until the thread identifier has been set up, and + an assertion to catch this problem should it reappear in the future. + + * wtf/Threading.cpp: Added. + (WTF::NewThreadContext::NewThreadContext): + (WTF::threadEntryPoint): + (WTF::createThread): Add cross-platform createThread function that delays the execution of the thread function until + after the thread identifier has been set up. + * wtf/Threading.h: + * wtf/ThreadingGtk.cpp: + (WTF::establishIdentifierForThread): + (WTF::createThreadInternal): + * wtf/ThreadingNone.cpp: + (WTF::createThreadInternal): + * wtf/ThreadingPthreads.cpp: + (WTF::establishIdentifierForPthreadHandle): + (WTF::createThreadInternal): + * wtf/ThreadingQt.cpp: + (WTF::identifierByQthreadHandle): + (WTF::establishIdentifierForThread): + (WTF::createThreadInternal): + * wtf/ThreadingWin.cpp: + (WTF::storeThreadHandleByIdentifier): + (WTF::createThreadInternal): + + Add Threading.cpp to the build. + + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.scons: + * JavaScriptCore.vcproj/WTF/WTF.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + +2008-12-26 Sam Weinig <sam@webkit.org> + + Reviewed by Alexey Proskuryakov. + + Remove unused method. + + * runtime/Structure.h: Remove mutableTypeInfo. + +2008-12-22 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Fix rounding / bounds / signed comparison bug in ExecutableAllocator. + + ExecutableAllocator::alloc assumed that m_freePtr would be aligned. This was + not always true, since the first allocation from an additional pool would not + be rounded up. Subsequent allocations would be unaligned, and too much memory + could be erroneously allocated from the pool, when the size requested was + available, but the size rounded up to word granularity was not available in the + pool. This may result in the value of m_freePtr being greater than m_end. + + Under these circumstances, the unsigned check for space will always pass, + resulting in pointers to memory outside of the arena being returned, and + ultimately segfaulty goodness when attempting to memcpy the hot freshly jitted + code from the AssemblerBuffer. + + https://bugs.webkit.org/show_bug.cgi?id=22974 + ... and probably many, many more. + + * jit/ExecutableAllocator.h: + (JSC::ExecutablePool::alloc): + (JSC::ExecutablePool::roundUpAllocationSize): + (JSC::ExecutablePool::ExecutablePool): + (JSC::ExecutablePool::poolAllocate): + +2008-12-22 Sam Weinig <sam@webkit.org> + + Reviewed by Gavin Barraclough. + + Rename all uses of the term "repatch" to "patch". + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::DataLabelPtr::patch): + (JSC::MacroAssembler::DataLabel32::patch): + (JSC::MacroAssembler::Jump::patch): + (JSC::MacroAssembler::PatchBuffer::PatchBuffer): + (JSC::MacroAssembler::PatchBuffer::setPtr): + (JSC::MacroAssembler::loadPtrWithAddressOffsetPatch): + (JSC::MacroAssembler::storePtrWithAddressOffsetPatch): + (JSC::MacroAssembler::storePtrWithPatch): + (JSC::MacroAssembler::jnePtrWithPatch): + * assembler/X86Assembler.h: + (JSC::X86Assembler::patchAddress): + (JSC::X86Assembler::patchImmediate): + (JSC::X86Assembler::patchPointer): + (JSC::X86Assembler::patchBranchOffset): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::tryCTICachePutByID): + (JSC::Interpreter::tryCTICacheGetByID): + (JSC::Interpreter::cti_op_put_by_id): + (JSC::Interpreter::cti_op_get_by_id): + (JSC::Interpreter::cti_op_get_by_id_self_fail): + (JSC::Interpreter::cti_op_get_by_id_proto_list): + (JSC::Interpreter::cti_vm_dontLazyLinkCall): + * jit/JIT.cpp: + (JSC::ctiPatchCallByReturnAddress): + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompile): + (JSC::JIT::privateCompileCTIMachineTrampolines): + * jit/JIT.h: + * jit/JITCall.cpp: + (JSC::JIT::unlinkCall): + (JSC::JIT::linkCall): + (JSC::JIT::compileOpCall): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::compilePutByIdHotPath): + (JSC::JIT::compileGetByIdSlowCase): + (JSC::JIT::compilePutByIdSlowCase): + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::patchGetByIdSelf): + (JSC::JIT::patchPutByIdReplace): + (JSC::JIT::privateCompilePatchGetArrayLength): + (JSC::JIT::privateCompileGetByIdSelf): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdSelfList): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChainList): + (JSC::JIT::privateCompileGetByIdChain): + (JSC::JIT::privateCompilePutByIdReplace): + +2008-12-22 Adam Roben <aroben@apple.com> + + Build fix after r39428 + + * jit/JITCall.cpp: + (JSC::JIT::compileOpCallSlowCase): Added a missing MacroAssembler:: + +2008-12-22 Nikolas Zimmermann <nikolas.zimmermann@torchmobile.com> + + Rubber-stamped by George Staikos. + + Unify all TorchMobile copyright lines. Consolidate in a single line, as requested by Mark Rowe, some time ago. + + * wtf/RandomNumber.cpp: + * wtf/RandomNumber.h: + * wtf/RandomNumberSeed.h: + +2008-12-21 Nikolas Zimmermann <nikolas.zimmermann@torchmobile.com> + + Rubber-stamped by George Staikos. + + Fix copyright of the new RandomNumber* files. + + * wtf/RandomNumber.cpp: + * wtf/RandomNumber.h: + * wtf/RandomNumberSeed.h: + +2008-12-21 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt & Cameron Zwarich. + + Add support for call and property access repatching on x86-64. + + No change in performance on current configurations (2x impovement on v8-tests with JIT enabled on x86-64). + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::DataLabelPtr::repatch): + (JSC::MacroAssembler::DataLabelPtr::operator X86Assembler::JmpDst): + (JSC::MacroAssembler::DataLabel32::repatch): + (JSC::MacroAssembler::RepatchBuffer::addressOf): + (JSC::MacroAssembler::add32): + (JSC::MacroAssembler::sub32): + (JSC::MacroAssembler::loadPtrWithAddressOffsetRepatch): + (JSC::MacroAssembler::storePtrWithAddressOffsetRepatch): + (JSC::MacroAssembler::jePtr): + (JSC::MacroAssembler::jnePtr): + (JSC::MacroAssembler::jnePtrWithRepatch): + (JSC::MacroAssembler::differenceBetween): + * assembler/X86Assembler.h: + (JSC::X86Assembler::addl_im): + (JSC::X86Assembler::subl_im): + (JSC::X86Assembler::cmpl_rm): + (JSC::X86Assembler::movq_rm_disp32): + (JSC::X86Assembler::movq_mr_disp32): + (JSC::X86Assembler::repatchPointer): + (JSC::X86Assembler::X86InstructionFormatter::oneByteOp64_disp32): + * jit/JIT.cpp: + (JSC::JIT::privateCompile): + (JSC::JIT::privateCompileCTIMachineTrampolines): + * jit/JIT.h: + * jit/JITCall.cpp: + (JSC::JIT::unlinkCall): + (JSC::JIT::linkCall): + (JSC::JIT::compileOpCall): + (JSC::JIT::compileOpCallSlowCase): + * jit/JITInlineMethods.h: + (JSC::JIT::restoreArgumentReferenceForTrampoline): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::compileGetByIdSlowCase): + (JSC::JIT::compilePutByIdHotPath): + (JSC::JIT::compilePutByIdSlowCase): + (JSC::resizePropertyStorage): + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChainList): + (JSC::JIT::privateCompileGetByIdChain): + * wtf/Platform.h: + +2008-12-20 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Port optimized property access generation to the MacroAssembler. + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::AbsoluteAddress::AbsoluteAddress): + (JSC::MacroAssembler::DataLabelPtr::repatch): + (JSC::MacroAssembler::DataLabel32::DataLabel32): + (JSC::MacroAssembler::DataLabel32::repatch): + (JSC::MacroAssembler::Label::operator X86Assembler::JmpDst): + (JSC::MacroAssembler::Jump::repatch): + (JSC::MacroAssembler::JumpList::empty): + (JSC::MacroAssembler::RepatchBuffer::link): + (JSC::MacroAssembler::add32): + (JSC::MacroAssembler::and32): + (JSC::MacroAssembler::sub32): + (JSC::MacroAssembler::loadPtrWithAddressRepatch): + (JSC::MacroAssembler::storePtrWithAddressRepatch): + (JSC::MacroAssembler::push): + (JSC::MacroAssembler::ja32): + (JSC::MacroAssembler::jePtr): + (JSC::MacroAssembler::jnePtr): + (JSC::MacroAssembler::jnePtrWithRepatch): + (JSC::MacroAssembler::align): + (JSC::MacroAssembler::differenceBetween): + * assembler/X86Assembler.h: + (JSC::X86Assembler::movl_rm_disp32): + (JSC::X86Assembler::movl_mr_disp32): + (JSC::X86Assembler::X86InstructionFormatter::oneByteOp_disp32): + (JSC::X86Assembler::X86InstructionFormatter::memoryModRM): + * jit/JIT.cpp: + (JSC::ctiRepatchCallByReturnAddress): + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompile): + (JSC::JIT::privateCompileCTIMachineTrampolines): + * jit/JIT.h: + * jit/JITPropertyAccess.cpp: + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::compileGetByIdSlowCase): + (JSC::JIT::compilePutByIdHotPath): + (JSC::JIT::compilePutByIdSlowCase): + (JSC::resizePropertyStorage): + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::patchGetByIdSelf): + (JSC::JIT::patchPutByIdReplace): + (JSC::JIT::privateCompilePatchGetArrayLength): + (JSC::JIT::privateCompileGetByIdSelf): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdSelfList): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChainList): + (JSC::JIT::privateCompileGetByIdChain): + (JSC::JIT::privateCompilePutByIdReplace): + * wtf/RefCounted.h: + (WTF::RefCountedBase::addressOfCount): + +2008-12-19 Gustavo Noronha Silva <gns@gnome.org> + + Reviewed by Holger Freyther. + + https://bugs.webkit.org/show_bug.cgi?id=22686 + + Added file which was missing to the javascriptcore_sources + variable, so that it shows up in the tarball created by `make + dist'. + + * GNUmakefile.am: + +2008-12-19 Holger Hans Peter Freyther <zecke@selfish.org> + + Reviewed by Antti Koivisto. + + Build fix when building JS API tests with a c89 c compiler + + Do not use C++ style comments and convert them to C comments. + + * wtf/Platform.h: + +2008-12-18 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Sam Weinig. + + Same as last revision, adding cases for pre & post inc & dec. + + https://bugs.webkit.org/show_bug.cgi?id=22928 + + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + +2008-12-18 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Sam Weinig. + + Fixes for the JIT's handling of JSImmediate values on x86-64. + On 64-bit systems, the code in JSImmediate.h relies on the upper + bits of a JSImmediate being a sign extension of the low 32-bits. + This was not being enforced by the JIT, since a number of inline + operations were being performed on 32-bit values in registers, and + when a 32-bit result is written to a register on x86-64 the value + is zero-extended to 64-bits. + + This fix honors previous behavoir. A better fix in the long run + (when the JIT is enabled by default) may be to change JSImmediate.h + so it no longer relies on the upper bits of the pointer,... though + if we're going to change JSImmediate.h for 64-bit, we probably may + as well change the format so that the full range of 32-bit ints can + be stored, rather than just 31-bits. + + https://bugs.webkit.org/show_bug.cgi?id=22925 + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::addPtr): + (JSC::MacroAssembler::andPtr): + (JSC::MacroAssembler::orPtr): + (JSC::MacroAssembler::or32): + (JSC::MacroAssembler::xor32): + (JSC::MacroAssembler::xorPtr): + (JSC::MacroAssembler::signExtend32ToPtr): + * assembler/X86Assembler.h: + (JSC::X86Assembler::): + (JSC::X86Assembler::andq_rr): + (JSC::X86Assembler::andq_ir): + (JSC::X86Assembler::orq_rr): + (JSC::X86Assembler::xorq_ir): + (JSC::X86Assembler::movsxd_rr): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + * jit/JITInlineMethods.h: + (JSC::JIT::emitFastArithReTagImmediate): + (JSC::JIT::emitFastArithPotentiallyReTagImmediate): + (JSC::JIT::emitFastArithImmToInt): + +2008-12-18 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Sam Weinig. + + Just a tidy up - rename & refactor some the #defines configuring the JIT. + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::cti_op_convert_this): + (JSC::Interpreter::cti_op_end): + (JSC::Interpreter::cti_op_add): + (JSC::Interpreter::cti_op_pre_inc): + (JSC::Interpreter::cti_timeout_check): + (JSC::Interpreter::cti_register_file_check): + (JSC::Interpreter::cti_op_loop_if_less): + (JSC::Interpreter::cti_op_loop_if_lesseq): + (JSC::Interpreter::cti_op_new_object): + (JSC::Interpreter::cti_op_put_by_id_generic): + (JSC::Interpreter::cti_op_get_by_id_generic): + (JSC::Interpreter::cti_op_put_by_id): + (JSC::Interpreter::cti_op_put_by_id_second): + (JSC::Interpreter::cti_op_put_by_id_fail): + (JSC::Interpreter::cti_op_get_by_id): + (JSC::Interpreter::cti_op_get_by_id_second): + (JSC::Interpreter::cti_op_get_by_id_self_fail): + (JSC::Interpreter::cti_op_get_by_id_proto_list): + (JSC::Interpreter::cti_op_get_by_id_proto_list_full): + (JSC::Interpreter::cti_op_get_by_id_proto_fail): + (JSC::Interpreter::cti_op_get_by_id_array_fail): + (JSC::Interpreter::cti_op_get_by_id_string_fail): + (JSC::Interpreter::cti_op_instanceof): + (JSC::Interpreter::cti_op_del_by_id): + (JSC::Interpreter::cti_op_mul): + (JSC::Interpreter::cti_op_new_func): + (JSC::Interpreter::cti_op_call_JSFunction): + (JSC::Interpreter::cti_op_call_arityCheck): + (JSC::Interpreter::cti_vm_dontLazyLinkCall): + (JSC::Interpreter::cti_vm_lazyLinkCall): + (JSC::Interpreter::cti_op_push_activation): + (JSC::Interpreter::cti_op_call_NotJSFunction): + (JSC::Interpreter::cti_op_create_arguments): + (JSC::Interpreter::cti_op_create_arguments_no_params): + (JSC::Interpreter::cti_op_tear_off_activation): + (JSC::Interpreter::cti_op_tear_off_arguments): + (JSC::Interpreter::cti_op_profile_will_call): + (JSC::Interpreter::cti_op_profile_did_call): + (JSC::Interpreter::cti_op_ret_scopeChain): + (JSC::Interpreter::cti_op_new_array): + (JSC::Interpreter::cti_op_resolve): + (JSC::Interpreter::cti_op_construct_JSConstruct): + (JSC::Interpreter::cti_op_construct_NotJSConstruct): + (JSC::Interpreter::cti_op_get_by_val): + (JSC::Interpreter::cti_op_resolve_func): + (JSC::Interpreter::cti_op_sub): + (JSC::Interpreter::cti_op_put_by_val): + (JSC::Interpreter::cti_op_put_by_val_array): + (JSC::Interpreter::cti_op_lesseq): + (JSC::Interpreter::cti_op_loop_if_true): + (JSC::Interpreter::cti_op_negate): + (JSC::Interpreter::cti_op_resolve_base): + (JSC::Interpreter::cti_op_resolve_skip): + (JSC::Interpreter::cti_op_resolve_global): + (JSC::Interpreter::cti_op_div): + (JSC::Interpreter::cti_op_pre_dec): + (JSC::Interpreter::cti_op_jless): + (JSC::Interpreter::cti_op_not): + (JSC::Interpreter::cti_op_jtrue): + (JSC::Interpreter::cti_op_post_inc): + (JSC::Interpreter::cti_op_eq): + (JSC::Interpreter::cti_op_lshift): + (JSC::Interpreter::cti_op_bitand): + (JSC::Interpreter::cti_op_rshift): + (JSC::Interpreter::cti_op_bitnot): + (JSC::Interpreter::cti_op_resolve_with_base): + (JSC::Interpreter::cti_op_new_func_exp): + (JSC::Interpreter::cti_op_mod): + (JSC::Interpreter::cti_op_less): + (JSC::Interpreter::cti_op_neq): + (JSC::Interpreter::cti_op_post_dec): + (JSC::Interpreter::cti_op_urshift): + (JSC::Interpreter::cti_op_bitxor): + (JSC::Interpreter::cti_op_new_regexp): + (JSC::Interpreter::cti_op_bitor): + (JSC::Interpreter::cti_op_call_eval): + (JSC::Interpreter::cti_op_throw): + (JSC::Interpreter::cti_op_get_pnames): + (JSC::Interpreter::cti_op_next_pname): + (JSC::Interpreter::cti_op_push_scope): + (JSC::Interpreter::cti_op_pop_scope): + (JSC::Interpreter::cti_op_typeof): + (JSC::Interpreter::cti_op_is_undefined): + (JSC::Interpreter::cti_op_is_boolean): + (JSC::Interpreter::cti_op_is_number): + (JSC::Interpreter::cti_op_is_string): + (JSC::Interpreter::cti_op_is_object): + (JSC::Interpreter::cti_op_is_function): + (JSC::Interpreter::cti_op_stricteq): + (JSC::Interpreter::cti_op_nstricteq): + (JSC::Interpreter::cti_op_to_jsnumber): + (JSC::Interpreter::cti_op_in): + (JSC::Interpreter::cti_op_push_new_scope): + (JSC::Interpreter::cti_op_jmp_scopes): + (JSC::Interpreter::cti_op_put_by_index): + (JSC::Interpreter::cti_op_switch_imm): + (JSC::Interpreter::cti_op_switch_char): + (JSC::Interpreter::cti_op_switch_string): + (JSC::Interpreter::cti_op_del_by_val): + (JSC::Interpreter::cti_op_put_getter): + (JSC::Interpreter::cti_op_put_setter): + (JSC::Interpreter::cti_op_new_error): + (JSC::Interpreter::cti_op_debug): + (JSC::Interpreter::cti_vm_throw): + * interpreter/Interpreter.h: + * jit/JIT.cpp: + (JSC::): + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompile): + * jit/JIT.h: + * jit/JITInlineMethods.h: + (JSC::JIT::restoreArgumentReference): + (JSC::JIT::restoreArgumentReferenceForTrampoline): + * wtf/Platform.h: + +2008-12-18 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Geoff Garen. + + Bug 21855: REGRESSION (r37323): Gmail complains about popup blocking when opening a link + <https://bugs.webkit.org/show_bug.cgi?id=21855> + <rdar://problem/6278244> + + Move DynamicGlobalObjectScope to JSGlobalObject.h so that it can be used + from WebCore. + + * interpreter/Interpreter.cpp: + * runtime/JSGlobalObject.h: + (JSC::DynamicGlobalObjectScope::DynamicGlobalObjectScope): + (JSC::DynamicGlobalObjectScope::~DynamicGlobalObjectScope): + +2008-12-17 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Gavin Barraclough. + + Fixed https://bugs.webkit.org/show_bug.cgi?id=22393 + Segfault when caching property accesses to primitive cells. + + Changed some asObject casts to asCell casts in cases where a primitive + value may be a cell and not an object. + + Re-enabled property caching for primitives in cases where it had been + disabled because of this bug. + + Updated a comment to better explain something Darin thought needed + explaining in an old patch review. + + * interpreter/Interpreter.cpp: + (JSC::countPrototypeChainEntriesAndCheckForProxies): + (JSC::Interpreter::tryCacheGetByID): + (JSC::Interpreter::tryCTICacheGetByID): + (JSC::Interpreter::cti_op_get_by_id_self_fail): + (JSC::Interpreter::cti_op_get_by_id_proto_list): + +2008-12-17 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Cameron Zwarich. + + Fixes for Sunspider failures with the JIT enabled on x86-64. + + * assembler/MacroAssembler.h: + Switch the order of the RegisterID & Address form of je32, to keep it consistent with jne32. + * jit/JIT.cpp: + * jit/JIT.h: + * jit/JITInlineMethods.h: + Port the m_ctiVirtualCall tramopline generation to use the MacroAssembler interface. + * jit/JITCall.cpp: + Fix bug in the non-optimizing code path, vptr check should have been to the memory address pointer + to by the register, not to the register itself. + * wrec/WRECGenerator.cpp: + See assembler/MacroAssembler.h, above. + +2008-12-17 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Sam Weinig. + + print("Hello, 64-bit jitted world!"); + Get hello-world working through the JIT, on x86-64. + + * assembler/X86Assembler.h: + Fix encoding of opcode + RegisterID format instructions for 64-bit. + * interpreter/Interpreter.cpp: + * interpreter/Interpreter.h: + Make VoidPtrPair actually be a pair of void*s. + (Possibly should make this change for 32-bit Mac platforms, too - but won't change 32-bit behaviour in this patch). + * jit/JIT.cpp: + * jit/JIT.h: + Provide names for the timeoutCheckRegister & callFrameRegister on x86-64, + force x86-64 ctiTrampoline arguments onto the stack, + implement the asm trampolines for x86-64, + implement the restoreArgumentReference methods for x86-64 calling conventions. + * jit/JITCall.cpp: + * jit/JITInlineMethods.h: + * wtf/Platform.h: + Add switch settings to ENABLE(JIT), on PLATFORM(X86_64) (currently still disabled). + +2008-12-17 Sam Weinig <sam@webkit.org> + + Reviewed by Gavin Barraclough. + + Add more CodeBlock statistics. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dumpStatistics): + +2008-12-17 Sam Weinig <sam@webkit.org> + + Reviewed by Darin Adler. + + Fix for https://bugs.webkit.org/show_bug.cgi?id=22897 + <rdar://problem/6428342> + Look into feasibility of discarding bytecode after native codegen + + Clear the bytecode Instruction vector at the end JIT generation. + + Saves 4.8 MB on Membuster head. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): Add logging for the case that someone tries + to dump the instructions of a CodeBlock that has had its bytecode + vector cleared. + (JSC::CodeBlock::CodeBlock): Initialize the instructionCount + (JSC::CodeBlock::handlerForBytecodeOffset): Use instructionCount instead + of the size of the instruction vector in the assertion. + (JSC::CodeBlock::lineNumberForBytecodeOffset): Ditto. + (JSC::CodeBlock::expressionRangeForBytecodeOffset): Ditto. + (JSC::CodeBlock::getByIdExceptionInfoForBytecodeOffset): Ditto. + (JSC::CodeBlock::functionRegisterForBytecodeOffset): Ditto. + * bytecode/CodeBlock.h: + (JSC::CodeBlock::setInstructionCount): Store the instruction vector size + in debug builds for assertions. + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::generate): + * jit/JIT.cpp: + (JSC::JIT::privateCompile): Clear the bytecode vector unless we + have compiled with Opcode sampling where we will continue to require it + +2008-12-17 Cary Clark <caryclark@google.com> + + Reviewed by Darin Adler. + Landed by Adam Barth. + + Add ENABLE_TEXT_CARET to permit the ANDROID platform + to invalidate and draw the caret in a separate thread. + + * wtf/Platform.h: + Default ENABLE_TEXT_CARET to 1. + +2008-12-17 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Darin Adler. + + Don't use unique context group in JSGlobalContextCreate() on Tiger or Leopard, take two. + + * API/JSContextRef.cpp: The previous patch that claimed to do this was making Tiger and + Leopard always use unique context group instead. + +2008-12-16 Sam Weinig <sam@webkit.org> + + Reviewed by Geoffrey Garen. + + Fix for https://bugs.webkit.org/show_bug.cgi?id=22838 + Remove dependency on the bytecode Instruction buffer in Interpreter::throwException + Part of <rdar://problem/6428342> + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::functionRegisterForBytecodeOffset): Added. Function to get + a function Register index in a callFrame for a bytecode offset. + (JSC::CodeBlock::shrinkToFit): Shrink m_getByIdExceptionInfo and m_functionRegisterInfos. + * bytecode/CodeBlock.h: + (JSC::FunctionRegisterInfo::FunctionRegisterInfo): Added. + (JSC::CodeBlock::addFunctionRegisterInfo): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitCall): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::throwException): Use functionRegisterForBytecodeOffset in JIT + mode. + +2008-12-16 Sam Weinig <sam@webkit.org> + + Reviewed by Gavin Barraclough. + + Fix for https://bugs.webkit.org/show_bug.cgi?id=22837 + Remove dependency on the bytecode Instruction buffer in Interpreter::cti_op_call_NotJSFunction + Part of <rdar://problem/6428342> + + * interpreter/CallFrame.h: Added comment regarding returnPC storing a void*. + * interpreter/Interpreter.cpp: + (JSC::bytecodeOffsetForPC): We no longer have any cases of the PC + being in the instruction stream for JIT, so we can remove the check. + (JSC::Interpreter::cti_op_call_NotJSFunction): Use the CTI_RETURN_ADDRESS + as the call frame returnPC as it is only necessary for looking up when + throwing an exception. + * interpreter/RegisterFile.h: + (JSC::RegisterFile::): Added comment regarding returnPC storing a void*. + * jit/JIT.h: Remove ARG_instr4. + * jit/JITCall.cpp: + (JSC::JIT::compileOpCallSetupArgs): Don't pass the instruction pointer. + +2008-12-16 Darin Adler <darin@apple.com> + + Reviewed and landed by Cameron Zwarich. + + Preparatory work for fixing + + Bug 22887: Make UString::Rep use RefCounted rather than implementing its own ref counting + <https://bugs.webkit.org/show_bug.cgi?id=22887> + + Change the various string translators used by Identifier:add() so that + they never zero the ref count of a newly created UString::Rep. + + * runtime/Identifier.cpp: + (JSC::CStringTranslator::translate): + (JSC::Identifier::add): + (JSC::UCharBufferTranslator::translate): + +2008-12-16 Gavin Barraclough <barraclough@apple.com> + + Build fix for 'doze. + + * assembler/AssemblerBuffer.h: + +2008-12-16 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Cameron Zwarich. + + Make the JIT compile on x86-64. + This largely involves populting the missing calls in MacroAssembler.h. + In addition some reinterpret_casts need removing from the JIT, and the + repatching property access code will need to be fully compiled out for + now. The changes in interpret.cpp are to reorder the functions so that + the _generic forms come before all other property access methods, and + then to place all property access methods other than the generic forms + under control of the ENABLE_JIT_OPTIMIZE_PROPERTY_ACCESS macro. + + No performance impact. + + * assembler/AssemblerBuffer.h: + (JSC::AssemblerBuffer::putInt64Unchecked): + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::loadPtr): + (JSC::MacroAssembler::load32): + (JSC::MacroAssembler::storePtr): + (JSC::MacroAssembler::storePtrWithRepatch): + (JSC::MacroAssembler::store32): + (JSC::MacroAssembler::poke): + (JSC::MacroAssembler::move): + (JSC::MacroAssembler::testImm64): + (JSC::MacroAssembler::jePtr): + (JSC::MacroAssembler::jnePtr): + (JSC::MacroAssembler::jnzPtr): + (JSC::MacroAssembler::jzPtr): + * assembler/X86Assembler.h: + (JSC::X86Assembler::): + (JSC::X86Assembler::cmpq_rr): + (JSC::X86Assembler::cmpq_rm): + (JSC::X86Assembler::cmpq_im): + (JSC::X86Assembler::testq_i32m): + (JSC::X86Assembler::movl_mEAX): + (JSC::X86Assembler::movl_i32r): + (JSC::X86Assembler::movl_EAXm): + (JSC::X86Assembler::movq_rm): + (JSC::X86Assembler::movq_mEAX): + (JSC::X86Assembler::movq_mr): + (JSC::X86Assembler::movq_i64r): + (JSC::X86Assembler::movl_mr): + (JSC::X86Assembler::X86InstructionFormatter::oneByteOp64): + (JSC::X86Assembler::X86InstructionFormatter::immediate64): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::cti_op_put_by_id_generic): + (JSC::Interpreter::cti_op_get_by_id_generic): + (JSC::Interpreter::cti_op_put_by_id): + (JSC::Interpreter::cti_op_put_by_id_second): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompile): + (JSC::JIT::privateCompileCTIMachineTrampolines): + * jit/JITCall.cpp: + (JSC::JIT::compileOpCallSetupArgs): + (JSC::JIT::compileOpCall): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::compilePutByIdHotPath): + * runtime/JSImmediate.h: + (JSC::JSImmediate::makeInt): + +2008-12-16 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Darin Adler. + + Bug 22869: REGRESSION (r38407): http://news.cnet.com/8301-13579_3-9953533-37.html crashes + <https://bugs.webkit.org/show_bug.cgi?id=22869> + <rdar://problem/6402499> + + Before r38407, Structure::m_nameInPrevious was ref'd due to it being + stored in a PropertyMap. However, PropertyMaps are created lazily after + r38407, so Structure::m_nameInPrevious is not necessarily ref'd while + it is being used. Making it a RefPtr instead of a raw pointer fixes + the problem. + + Unfortunately, the crash in the bug is rather intermittent, and it is + impossible to add an assertion in UString::Ref::ref() to catch this bug + because some users of UString::Rep deliberately zero out the reference + count. Therefore, there is no layout test accompanying this bug fix. + + * runtime/Structure.cpp: + (JSC::Structure::~Structure): Use get(). + (JSC::Structure::materializePropertyMap): Use get(). + (JSC::Structure::addPropertyTransitionToExistingStructure): Use get(). + (JSC::Structure::addPropertyTransition): Use get(). + * runtime/Structure.h: Make Structure::m_nameInPrevious a RefPtr instead + of a raw pointer. + +2008-12-16 Nikolas Zimmermann <nikolas.zimmermann@torchmobile.com> + + Not reviewed. Attempt to fix win build. No 'using namespace WTF' in this file, needs manual WTF:: prefix. + Not sure why the build works as is here. + + * runtime/MathObject.cpp: + (JSC::mathProtoFuncRandom): + +2008-12-16 Nikolas Zimmermann <nikolas.zimmermann@torchmobile.com> + + Reviewed by Darin Adler. + + Fixes: https://bugs.webkit.org/show_bug.cgi?id=22876 + + Unify random number generation in JavaScriptCore & WebCore, by introducing + wtf/RandomNumber.h and moving wtf_random/wtf_random_init out of MathExtras.h. + + wtf_random_init() has been renamed to initializeRandomNumberGenerator() and + lives in it's own private header: wtf/RandomNumberSeed.h, only intended to + be used from within JavaScriptCore. + + wtf_random() has been renamed to randomNumber() and lives in a public header + wtf/RandomNumber.h, usable from within JavaScriptCore & WebCore. It encapsulates + the code taking care of initializing the random number generator (only when + building without ENABLE(JSC_MULTIPLE_THREADS), otherwhise initializeThreading() + already took care of that). + + Functional change on darwin: Use random() instead of rand(), as it got a larger + period (more randomness). HTMLFormElement already contains this implementation + and I just moved it in randomNumber(), as special case for PLATFORM(DARWIN). + + * GNUmakefile.am: Add RandomNumber.(cpp/h) / RandomNumberSeed.h. + * JavaScriptCore.exp: Ditto. + * JavaScriptCore.pri: Ditto. + * JavaScriptCore.scons: Ditto. + * JavaScriptCore.vcproj/WTF/WTF.vcproj: Ditto. + * JavaScriptCore.xcodeproj/project.pbxproj: Ditto. + * JavaScriptCoreSources.bkl: Ditto. + * runtime/MathObject.cpp: Use new WTF::randomNumber() functionality. + (JSC::mathProtoFuncRandom): + * wtf/MathExtras.h: Move wtf_random / wtf_random_init to new files. + * wtf/RandomNumber.cpp: Added. + (WTF::randomNumber): + * wtf/RandomNumber.h: Added. + * wtf/RandomNumberSeed.h: Added. Internal usage within JSC only. + (WTF::initializeRandomNumberGenerator): + * wtf/ThreadingGtk.cpp: Rename wtf_random_init() to initializeRandomNumberGenerator(). + (WTF::initializeThreading): + * wtf/ThreadingPthreads.cpp: Ditto. + (WTF::initializeThreading): + * wtf/ThreadingQt.cpp: Ditto. + (WTF::initializeThreading): + * wtf/ThreadingWin.cpp: Ditto. + (WTF::initializeThreading): + +2008-12-16 Yael Aharon <yael.aharon@nokia.com> + + Reviewed by Tor Arne Vestbø. + + Qt/Win build fix + + * JavaScriptCore.pri: + +2008-12-15 Mark Rowe <mrowe@apple.com> + + Reviewed by Cameron Zwarich. + + Fix the build with GCC 4.0. + + * Configurations/JavaScriptCore.xcconfig: GCC 4.0 appears to have a bug when compiling with -funwind-tables on, + so don't use it with that compiler version. + +2008-12-15 Mark Rowe <mrowe@apple.com> + + Rubber-stamped by Cameron Zwarich. + + <rdar://problem/6289933> Change WebKit-related projects to build with GCC 4.2 on Leopard. + + * Configurations/Base.xcconfig: + * Configurations/DebugRelease.xcconfig: + +2008-12-15 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Darin Adler. + + Don't use unique context group in JSGlobalContextCreate() on Tiger or Leopard. + + * API/JSContextRef.cpp: (JSGlobalContextCreate): + +2008-12-15 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Darin Adler. + + <rdar://problem/6445089> Mach ports leak from worker threads + + * interpreter/Interpreter.cpp: (JSC::getCPUTime): + Deallocate the thread self port. + +2008-12-15 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Mark Rowe. + + Construct stack frames in JIT code, so that backtracing can still work. + <rdar://problem/6447870> JIT should play nice with attempts to take stack traces + + * jit/JIT.cpp: + (JSC::): + (JSC::JIT::privateCompileMainPass): + +2008-12-15 Mark Rowe <mrowe@apple.com> + + Reviewed by Gavin Barraclough. + + <rdar://problem/6402262> JavaScriptCore needs exception handling tables in order to get stack traces without frame pointers + + * Configurations/JavaScriptCore.xcconfig: + +2008-12-15 Gavin Barraclough <barraclough@apple.com> + + Rubber stamped by Mark Rowe. + + Revert r39226 / Bug 22818: Unify JIT callback argument access OS X / Windows + This causes Acid3 failures – reverting for now & will revisit later. + https://bugs.webkit.org/show_bug.cgi?id=22873 + + * interpreter/Interpreter.h: + * jit/JIT.cpp: + (JSC::JIT::privateCompileCTIMachineTrampolines): + * jit/JIT.h: + * jit/JITInlineMethods.h: + (JSC::JIT::restoreArgumentReference): + (JSC::JIT::restoreArgumentReferenceForTrampoline): + (JSC::JIT::emitCTICall_internal): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::privateCompilePutByIdTransition): + * wtf/Platform.h: + +2008-12-15 Darin Adler <darin@apple.com> + + Reviewed by Sam Weinig. + + - fix <rdar://problem/6427048> crash due to infinite recursion after setting window.__proto__ = window + + Replaced toGlobalObject with the more generally useful unwrappedObject and used it to + fix the cycle detection code in put(__proto__). + + * JavaScriptCore.exp: Updated. + + * runtime/JSGlobalObject.cpp: Removed toGlobalObject. We now use unwrappedObject instead. + * runtime/JSGlobalObject.h: + (JSC::JSGlobalObject::isGlobalObject): Ditto. + + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::globalFuncEval): Use unwrappedObject and isGlobalObject here rather than toGlobalObject. + + * runtime/JSObject.cpp: + (JSC::JSObject::put): Rewrote prototype cycle checking loop. Use unwrappedObject in the loop now. + (JSC::JSObject::unwrappedObject): Replaced toGlobalObject with this new function. + * runtime/JSObject.h: More of the same. + +2008-12-15 Steve Falkenburg <sfalken@apple.com> + + Windows build fix. + + Visual Studio requires visibility of forward declarations to match class declaration. + + * assembler/X86Assembler.h: + +2008-12-15 Gustavo Noronha Silva <kov@kov.eti.br> + + Reviewed by Mark Rowe. + + https://bugs.webkit.org/show_bug.cgi?id=22686 + + GTK+ build fix. + + * GNUmakefile.am: + +2008-12-15 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Add support to X86Assembler emitting instructions that access all 16 registers on x86-64. + Add a new formating class, that is reponsible for both emitting the opcode bytes and the + ModRm bytes of an instruction in a single call; this can insert the REX byte as necessary + before the opcode, but has access to the register numbers to build the REX. + + * assembler/AssemblerBuffer.h: + (JSC::AssemblerBuffer::isAligned): + (JSC::AssemblerBuffer::data): + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::addPtr): + (JSC::MacroAssembler::add32): + (JSC::MacroAssembler::and32): + (JSC::MacroAssembler::or32): + (JSC::MacroAssembler::sub32): + (JSC::MacroAssembler::xor32): + (JSC::MacroAssembler::loadPtr): + (JSC::MacroAssembler::load32): + (JSC::MacroAssembler::load16): + (JSC::MacroAssembler::storePtr): + (JSC::MacroAssembler::storePtrWithRepatch): + (JSC::MacroAssembler::store32): + (JSC::MacroAssembler::pop): + (JSC::MacroAssembler::push): + (JSC::MacroAssembler::compareImm32ForBranch): + (JSC::MacroAssembler::compareImm32ForBranchEquality): + (JSC::MacroAssembler::testImm32): + (JSC::MacroAssembler::jae32): + (JSC::MacroAssembler::jb32): + (JSC::MacroAssembler::je16): + (JSC::MacroAssembler::jg32): + (JSC::MacroAssembler::jnePtr): + (JSC::MacroAssembler::jne32): + (JSC::MacroAssembler::jump): + * assembler/X86Assembler.h: + (JSC::X86::): + (JSC::X86Assembler::): + (JSC::X86Assembler::size): + (JSC::X86Assembler::push_r): + (JSC::X86Assembler::pop_r): + (JSC::X86Assembler::push_i32): + (JSC::X86Assembler::push_m): + (JSC::X86Assembler::pop_m): + (JSC::X86Assembler::addl_rr): + (JSC::X86Assembler::addl_mr): + (JSC::X86Assembler::addl_ir): + (JSC::X86Assembler::addq_ir): + (JSC::X86Assembler::addl_im): + (JSC::X86Assembler::andl_rr): + (JSC::X86Assembler::andl_ir): + (JSC::X86Assembler::orl_rr): + (JSC::X86Assembler::orl_mr): + (JSC::X86Assembler::orl_ir): + (JSC::X86Assembler::subl_rr): + (JSC::X86Assembler::subl_mr): + (JSC::X86Assembler::subl_ir): + (JSC::X86Assembler::subl_im): + (JSC::X86Assembler::xorl_rr): + (JSC::X86Assembler::xorl_ir): + (JSC::X86Assembler::sarl_i8r): + (JSC::X86Assembler::sarl_CLr): + (JSC::X86Assembler::shll_i8r): + (JSC::X86Assembler::shll_CLr): + (JSC::X86Assembler::imull_rr): + (JSC::X86Assembler::imull_i32r): + (JSC::X86Assembler::idivl_r): + (JSC::X86Assembler::cmpl_rr): + (JSC::X86Assembler::cmpl_rm): + (JSC::X86Assembler::cmpl_mr): + (JSC::X86Assembler::cmpl_ir): + (JSC::X86Assembler::cmpl_ir_force32): + (JSC::X86Assembler::cmpl_im): + (JSC::X86Assembler::cmpl_im_force32): + (JSC::X86Assembler::cmpw_rm): + (JSC::X86Assembler::testl_rr): + (JSC::X86Assembler::testl_i32r): + (JSC::X86Assembler::testl_i32m): + (JSC::X86Assembler::testq_rr): + (JSC::X86Assembler::testq_i32r): + (JSC::X86Assembler::testb_i8r): + (JSC::X86Assembler::sete_r): + (JSC::X86Assembler::setz_r): + (JSC::X86Assembler::setne_r): + (JSC::X86Assembler::setnz_r): + (JSC::X86Assembler::cdq): + (JSC::X86Assembler::xchgl_rr): + (JSC::X86Assembler::movl_rr): + (JSC::X86Assembler::movl_rm): + (JSC::X86Assembler::movl_mr): + (JSC::X86Assembler::movl_i32r): + (JSC::X86Assembler::movl_i32m): + (JSC::X86Assembler::movq_rr): + (JSC::X86Assembler::movq_rm): + (JSC::X86Assembler::movq_mr): + (JSC::X86Assembler::movzwl_mr): + (JSC::X86Assembler::movzbl_rr): + (JSC::X86Assembler::leal_mr): + (JSC::X86Assembler::call): + (JSC::X86Assembler::jmp): + (JSC::X86Assembler::jmp_r): + (JSC::X86Assembler::jmp_m): + (JSC::X86Assembler::jne): + (JSC::X86Assembler::jnz): + (JSC::X86Assembler::je): + (JSC::X86Assembler::jl): + (JSC::X86Assembler::jb): + (JSC::X86Assembler::jle): + (JSC::X86Assembler::jbe): + (JSC::X86Assembler::jge): + (JSC::X86Assembler::jg): + (JSC::X86Assembler::ja): + (JSC::X86Assembler::jae): + (JSC::X86Assembler::jo): + (JSC::X86Assembler::jp): + (JSC::X86Assembler::js): + (JSC::X86Assembler::addsd_rr): + (JSC::X86Assembler::addsd_mr): + (JSC::X86Assembler::cvtsi2sd_rr): + (JSC::X86Assembler::cvttsd2si_rr): + (JSC::X86Assembler::movd_rr): + (JSC::X86Assembler::movsd_rm): + (JSC::X86Assembler::movsd_mr): + (JSC::X86Assembler::mulsd_rr): + (JSC::X86Assembler::mulsd_mr): + (JSC::X86Assembler::pextrw_irr): + (JSC::X86Assembler::subsd_rr): + (JSC::X86Assembler::subsd_mr): + (JSC::X86Assembler::ucomis_rr): + (JSC::X86Assembler::int3): + (JSC::X86Assembler::ret): + (JSC::X86Assembler::predictNotTaken): + (JSC::X86Assembler::label): + (JSC::X86Assembler::align): + (JSC::X86Assembler::link): + (JSC::X86Assembler::executableCopy): + (JSC::X86Assembler::X86InstructionFormater::prefix): + (JSC::X86Assembler::X86InstructionFormater::oneByteOp): + (JSC::X86Assembler::X86InstructionFormater::twoByteOp): + (JSC::X86Assembler::X86InstructionFormater::oneByteOp64): + (JSC::X86Assembler::X86InstructionFormater::oneByteOp8): + (JSC::X86Assembler::X86InstructionFormater::twoByteOp8): + (JSC::X86Assembler::X86InstructionFormater::instructionImmediate8): + (JSC::X86Assembler::X86InstructionFormater::instructionImmediate32): + (JSC::X86Assembler::X86InstructionFormater::instructionRel32): + (JSC::X86Assembler::X86InstructionFormater::size): + (JSC::X86Assembler::X86InstructionFormater::isAligned): + (JSC::X86Assembler::X86InstructionFormater::data): + (JSC::X86Assembler::X86InstructionFormater::executableCopy): + (JSC::X86Assembler::X86InstructionFormater::registerModRM): + (JSC::X86Assembler::X86InstructionFormater::memoryModRM): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompile): + (JSC::JIT::privateCompileCTIMachineTrampolines): + * jit/JITArithmetic.cpp: + (JSC::JIT::putDoubleResultToJSNumberCellOrJSImmediate): + (JSC::JIT::compileBinaryArithOp): + * jit/JITCall.cpp: + (JSC::JIT::compileOpCall): + (JSC::JIT::compileOpCallSlowCase): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::compilePutByIdHotPath): + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::privateCompilePatchGetArrayLength): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChainList): + (JSC::JIT::privateCompileGetByIdChain): + +2008-12-15 Darin Adler <darin@apple.com> + + * interpreter/RegisterFile.h: Tweak include formatting. + +2008-12-15 Holger Hans Peter Freyther <zecke@selfish.org> + + Build fix for Gtk+. + + * interpreter/RegisterFile.h: Include stdio.h for fprintf + +2008-12-15 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Oliver Hunt. + + <rdar://problem/6444455> Worker Thread crash running multiple workers for a moderate amount of time + + * interpreter/RegisterFile.h: (JSC::RegisterFile::RegisterFile): + Improve error handling: if mmap fails, crash immediately, and print out the reason. + +2008-12-13 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Cameron Zwarich. + + Re-enable WREC on 64-bit. + Implements one of the MacroAssembler::jnzPtr methods, previously only implemented for 32-bit x86. + + https://bugs.webkit.org/show_bug.cgi?id=22849 + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::testImm64): + (JSC::MacroAssembler::jnzPtr): + * assembler/X86Assembler.h: + (JSC::X86Assembler::testq_i32r): + (JSC::X86Assembler::testq_rr): + * wtf/Platform.h: + +2008-12-13 Gavin Barraclough <barraclough@apple.com> + + Fix PPC builds. + + * assembler/MacroAssembler.h: + +2008-12-13 Gavin Barraclough <barraclough@apple.com> + + Build fix only, no review. + + * bytecode/CodeBlock.h: + +2008-12-13 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Cameron Zwarich. + + Port the remainder of the JIT, bar calling convention related code, and code + implementing optimizations which can be disabled, to use the MacroAssembler. + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::DataLabelPtr::DataLabelPtr): + (JSC::MacroAssembler::RepatchBuffer::RepatchBuffer): + (JSC::MacroAssembler::RepatchBuffer::link): + (JSC::MacroAssembler::RepatchBuffer::addressOf): + (JSC::MacroAssembler::RepatchBuffer::setPtr): + (JSC::MacroAssembler::addPtr): + (JSC::MacroAssembler::lshift32): + (JSC::MacroAssembler::mod32): + (JSC::MacroAssembler::rshift32): + (JSC::MacroAssembler::storePtrWithRepatch): + (JSC::MacroAssembler::jnzPtr): + (JSC::MacroAssembler::jzPtr): + (JSC::MacroAssembler::jump): + (JSC::MacroAssembler::label): + * assembler/X86Assembler.h: + (JSC::X86Assembler::): + (JSC::X86Assembler::xchgl_rr): + (JSC::X86Assembler::jmp_m): + (JSC::X86Assembler::repatchAddress): + (JSC::X86Assembler::getRelocatedAddress): + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::CodeBlock): + * bytecode/CodeBlock.h: + (JSC::JITCodeRef::JITCodeRef): + (JSC::CodeBlock::setJITCode): + (JSC::CodeBlock::jitCode): + (JSC::CodeBlock::executablePool): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileLinkPass): + (JSC::JIT::privateCompile): + (JSC::JIT::privateCompileCTIMachineTrampolines): + * jit/JIT.h: + (JSC::CallRecord::CallRecord): + (JSC::JumpTable::JumpTable): + (JSC::JIT::emitCTICall): + (JSC::JIT::JSRInfo::JSRInfo): + * jit/JITArithmetic.cpp: + * jit/JITCall.cpp: + * jit/JITInlineMethods.h: + (JSC::JIT::emitNakedCall): + (JSC::JIT::emitCTICall_internal): + (JSC::JIT::checkStructure): + (JSC::JIT::emitFastArithDeTagImmediateJumpIfZero): + (JSC::JIT::addSlowCase): + (JSC::JIT::addJump): + (JSC::JIT::emitJumpSlowToHot): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::privateCompileGetByIdChainList): + (JSC::JIT::privateCompileGetByIdChain): + +2008-12-12 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Sam Weinig. + + Fix the failures of the following layout tests, which regressed in + r39255: + + fast/dom/StyleSheet/ownerNode-lifetime-2.html + fast/xsl/transform-xhr-doc.xhtml + + The binary search in CodeBlock::getByIdExceptionInfoForBytecodeOffset() + doesn't guarantee that it actually finds a match, so add an explicit check + for this. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::getByIdExceptionInfoForBytecodeOffset): + +2008-12-12 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Cameron Zwarich. + + Replace emitPutCallArg methods with emitPutJITStubArg methods. Primarily to make the argument numbering + more sensible (1-based incrementing by 1, rather than 0-based incrementing by 4). The CTI name also seems + to be being deprecated from the code generally. + + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + (JSC::JIT::privateCompileCTIMachineTrampolines): + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::compileBinaryArithOp): + (JSC::JIT::compileBinaryArithOpSlowCase): + * jit/JITCall.cpp: + (JSC::JIT::compileOpCallSetupArgs): + (JSC::JIT::compileOpCallEvalSetupArgs): + (JSC::JIT::compileOpConstructSetupArgs): + (JSC::JIT::compileOpCall): + * jit/JITInlineMethods.h: + (JSC::JIT::emitPutJITStubArg): + (JSC::JIT::emitPutJITStubArgConstant): + (JSC::JIT::emitGetJITStubArg): + (JSC::JIT::emitPutJITStubArgFromVirtualRegister): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::compilePutByIdHotPath): + (JSC::JIT::compileGetByIdSlowCase): + (JSC::JIT::compilePutByIdSlowCase): + +2008-12-12 Gavin Barraclough <barraclough@apple.com> + + Fix windows builds. + + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + (JSC::JIT::privateCompile): + +2008-12-12 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Remove loop counter 'i' from the JIT generation passes, replace with a member m_bytecodeIndex. + + No impact on performance. + + * jit/JIT.cpp: + (JSC::JIT::compileOpStrictEq): + (JSC::JIT::emitSlowScriptCheck): + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + (JSC::JIT::privateCompile): + * jit/JIT.h: + (JSC::CallRecord::CallRecord): + (JSC::JmpTable::JmpTable): + (JSC::JIT::emitCTICall): + * jit/JITArithmetic.cpp: + (JSC::JIT::compileBinaryArithOp): + (JSC::JIT::compileBinaryArithOpSlowCase): + * jit/JITCall.cpp: + (JSC::JIT::compileOpCall): + (JSC::JIT::compileOpCallSlowCase): + * jit/JITInlineMethods.h: + (JSC::JIT::emitGetVirtualRegister): + (JSC::JIT::emitGetVirtualRegisters): + (JSC::JIT::emitNakedCall): + (JSC::JIT::emitCTICall_internal): + (JSC::JIT::emitJumpSlowCaseIfJSCell): + (JSC::JIT::emitJumpSlowCaseIfNotJSCell): + (JSC::JIT::emitJumpSlowCaseIfNotImmNum): + (JSC::JIT::emitJumpSlowCaseIfNotImmNums): + (JSC::JIT::emitFastArithIntToImmOrSlowCase): + (JSC::JIT::addSlowCase): + (JSC::JIT::addJump): + (JSC::JIT::emitJumpSlowToHot): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::compileGetByIdSlowCase): + (JSC::JIT::compilePutByIdHotPath): + (JSC::JIT::compilePutByIdSlowCase): + +2008-12-12 Sam Weinig <sam@webkit.org> + + Reviewed by Cameron Zwarich. + + <rdar://problem/6428342> Look into feasibility of discarding bytecode after native codegen + + Move more JIT functionality to using offsets into the Instruction buffer + instead of raw pointers. Two to go! + + * interpreter/Interpreter.cpp: + (JSC::bytecodeOffsetForPC): Rename from vPCForPC. + (JSC::Interpreter::resolve): Pass offset to exception helper. + (JSC::Interpreter::resolveSkip): Ditto. + (JSC::Interpreter::resolveGlobal): Ditto. + (JSC::Interpreter::resolveBaseAndProperty): Ditto. + (JSC::Interpreter::resolveBaseAndFunc): Ditto. + (JSC::isNotObject): Ditto. + (JSC::Interpreter::unwindCallFrame): Call bytecodeOffsetForPC. + (JSC::Interpreter::throwException): Use offsets instead of vPCs. + (JSC::Interpreter::privateExecute): Pass offset to exception helper. + (JSC::Interpreter::retrieveLastCaller): Ditto. + (JSC::Interpreter::cti_op_instanceof): Ditto. + (JSC::Interpreter::cti_op_call_NotJSFunction): Ditto. + (JSC::Interpreter::cti_op_resolve): Pass offset to exception helper. + (JSC::Interpreter::cti_op_construct_NotJSConstruct): Ditto. + (JSC::Interpreter::cti_op_resolve_func): Ditto. + (JSC::Interpreter::cti_op_resolve_skip): Ditto. + (JSC::Interpreter::cti_op_resolve_global): Ditto. + (JSC::Interpreter::cti_op_resolve_with_base): Ditto. + (JSC::Interpreter::cti_op_throw): Ditto. + (JSC::Interpreter::cti_op_in): Ditto. + (JSC::Interpreter::cti_vm_throw): Ditto. + * interpreter/Interpreter.h: + + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): Don't pass unnecessary vPC to stub. + * jit/JIT.h: Remove ARG_instr1 - ARG_instr3 and ARG_instr5 - ARG_instr6. + * jit/JITCall.cpp: + (JSC::JIT::compileOpCallEvalSetupArgs): Don't pass unnecessary vPC to stub.. + (JSC::JIT::compileOpConstructSetupArgs): Ditto. + + * runtime/ExceptionHelpers.cpp: + (JSC::createUndefinedVariableError): Take an offset instead of vPC. + (JSC::createInvalidParamError): Ditto. + (JSC::createNotAConstructorError): Ditto. + (JSC::createNotAFunctionError): Ditto. + (JSC::createNotAnObjectError): Ditto. + * runtime/ExceptionHelpers.h: + +2008-12-12 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Oliver Hunt. + + Bug 22835: Crash during bytecode generation when comparing to null + <https://bugs.webkit.org/show_bug.cgi?id=22835> + <rdar://problem/6286749> + + Change the special cases in bytecode generation for comparison to null + to use tempDestination(). + + * parser/Nodes.cpp: + (JSC::BinaryOpNode::emitBytecode): + (JSC::EqualNode::emitBytecode): + +2008-12-12 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Move slow-cases of JIT code generation over to the MacroAssembler interface. + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::Label::Label): + (JSC::MacroAssembler::jae32): + (JSC::MacroAssembler::jg32): + (JSC::MacroAssembler::jzPtr): + * jit/JIT.cpp: + (JSC::JIT::privateCompileSlowCases): + (JSC::JIT::privateCompile): + (JSC::JIT::emitGetVariableObjectRegister): + (JSC::JIT::emitPutVariableObjectRegister): + * jit/JIT.h: + (JSC::SlowCaseEntry::SlowCaseEntry): + (JSC::JIT::getSlowCase): + (JSC::JIT::linkSlowCase): + * jit/JITArithmetic.cpp: + (JSC::JIT::compileBinaryArithOpSlowCase): + * jit/JITCall.cpp: + (JSC::JIT::compileOpCallInitializeCallFrame): + (JSC::JIT::compileOpCall): + (JSC::JIT::compileOpCallSlowCase): + * jit/JITInlineMethods.h: + (JSC::JIT::emitJumpSlowCaseIfNotJSCell): + (JSC::JIT::linkSlowCaseIfNotJSCell): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::compilePutByIdHotPath): + (JSC::JIT::compileGetByIdSlowCase): + (JSC::JIT::compilePutByIdSlowCase): + +2008-12-12 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Sam Weinig. + + Bug 22828: Do not inspect bytecode instruction stream for op_get_by_id exception information + <https://bugs.webkit.org/show_bug.cgi?id=22828> + + In order to remove the bytecode instruction stream after generating + native code, all inspection of bytecode instructions at runtime must + be removed. One particular instance of this is the special handling of + exceptions thrown by the op_get_by_id emitted directly before an + op_construct or an op_instanceof. This patch moves that information to + an auxiliary data structure in CodeBlock. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::getByIdExceptionInfoForBytecodeOffset): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::addGetByIdExceptionInfo): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitConstruct): + * bytecompiler/BytecodeGenerator.h: + (JSC::BytecodeGenerator::emitGetByIdExceptionInfo): + * parser/Nodes.cpp: + (JSC::InstanceOfNode::emitBytecode): + * runtime/ExceptionHelpers.cpp: + (JSC::createNotAnObjectError): + +2008-12-12 Sam Weinig <sam@webkit.org> + + Reviewed by Geoffrey Garen. + + Change exception information accessors to take offsets into the bytecode + instruction buffer instead of pointers so that they can work even even + if the bytecode buffer is purged. + + * bytecode/CodeBlock.cpp: + (JSC::instructionOffsetForNth): + (JSC::CodeBlock::handlerForBytecodeOffset): + (JSC::CodeBlock::lineNumberForBytecodeOffset): + (JSC::CodeBlock::expressionRangeForBytecodeOffset): + * bytecode/CodeBlock.h: + * bytecode/SamplingTool.cpp: + (JSC::SamplingTool::dump): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::throwException): + (JSC::Interpreter::privateExecute): + (JSC::Interpreter::retrieveLastCaller): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + * runtime/ExceptionHelpers.cpp: + (JSC::createUndefinedVariableError): + (JSC::createInvalidParamError): + (JSC::createNotAConstructorError): + (JSC::createNotAFunctionError): + (JSC::createNotAnObjectError): + +2008-12-12 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Cameron Zwarich. + + Tiny bit of refactoring in quantifier generation. + + * wrec/WRECGenerator.cpp: + (JSC::WREC::Generator::generateNonGreedyQuantifier): + (JSC::WREC::Generator::generateGreedyQuantifier): + +2008-12-11 Sam Weinig <sam@webkit.org> + + Reviewed by Geoffrey Garen. + + Remove dependancy on having the Instruction buffer in order to + deref Structures used for property access and global resolves. + Instead, we put references to the necessary Structures in auxiliary + data structures on the CodeBlock. This is not an ideal solution, + as we still pay for having the Structures in two places and we + would like to eventually just hold on to offsets into the machine + code buffer. + + - Also removes CodeBlock bloat in non-JIT by #ifdefing the JIT + only data structures. + + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.scons: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + * bytecode/CodeBlock.cpp: + (JSC::isGlobalResolve): + (JSC::isPropertyAccess): + (JSC::instructionOffsetForNth): + (JSC::printGlobalResolveInfo): + (JSC::printStructureStubInfo): + (JSC::CodeBlock::printStructures): + (JSC::CodeBlock::dump): + (JSC::CodeBlock::~CodeBlock): + (JSC::CodeBlock::shrinkToFit): + * bytecode/CodeBlock.h: + (JSC::GlobalResolveInfo::GlobalResolveInfo): + (JSC::getNativePC): + (JSC::CodeBlock::instructions): + (JSC::CodeBlock::getStubInfo): + (JSC::CodeBlock::getBytecodeIndex): + (JSC::CodeBlock::addPropertyAccessInstruction): + (JSC::CodeBlock::addGlobalResolveInstruction): + (JSC::CodeBlock::numberOfStructureStubInfos): + (JSC::CodeBlock::addStructureStubInfo): + (JSC::CodeBlock::structureStubInfo): + (JSC::CodeBlock::addGlobalResolveInfo): + (JSC::CodeBlock::globalResolveInfo): + (JSC::CodeBlock::numberOfCallLinkInfos): + (JSC::CodeBlock::addCallLinkInfo): + (JSC::CodeBlock::callLinkInfo): + * bytecode/Instruction.h: + (JSC::PolymorphicAccessStructureList::PolymorphicStubInfo::set): + (JSC::PolymorphicAccessStructureList::PolymorphicAccessStructureList): + * bytecode/Opcode.h: + (JSC::): + * bytecode/StructureStubInfo.cpp: Copied from bytecode/CodeBlock.cpp. + (JSC::StructureStubInfo::deref): + * bytecode/StructureStubInfo.h: Copied from bytecode/CodeBlock.h. + (JSC::StructureStubInfo::StructureStubInfo): + (JSC::StructureStubInfo::initGetByIdSelf): + (JSC::StructureStubInfo::initGetByIdProto): + (JSC::StructureStubInfo::initGetByIdChain): + (JSC::StructureStubInfo::initGetByIdSelfList): + (JSC::StructureStubInfo::initGetByIdProtoList): + (JSC::StructureStubInfo::initPutByIdTransition): + (JSC::StructureStubInfo::initPutByIdReplace): + (JSC::StructureStubInfo::): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitResolve): + (JSC::BytecodeGenerator::emitGetById): + (JSC::BytecodeGenerator::emitPutById): + (JSC::BytecodeGenerator::emitCall): + (JSC::BytecodeGenerator::emitConstruct): + (JSC::BytecodeGenerator::emitCatch): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::tryCTICachePutByID): + (JSC::Interpreter::tryCTICacheGetByID): + (JSC::Interpreter::cti_op_get_by_id_self_fail): + (JSC::getPolymorphicAccessStructureListSlot): + (JSC::Interpreter::cti_op_get_by_id_proto_list): + (JSC::Interpreter::cti_op_resolve_global): + * jit/JIT.cpp: + (JSC::JIT::JIT): + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + (JSC::JIT::privateCompile): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::compilePutByIdHotPath): + (JSC::JIT::compileGetByIdSlowCase): + (JSC::JIT::compilePutByIdSlowCase): + (JSC::JIT::privateCompileGetByIdSelfList): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChainList): + +2008-12-11 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Remove CTI_ARGUMENTS mode, use va_start implementation on Windows, + unifying JIT callback (cti_*) argument access on OS X & Windows + + No performance impact. + + * interpreter/Interpreter.h: + * jit/JIT.cpp: + (JSC::JIT::privateCompileCTIMachineTrampolines): + * jit/JIT.h: + * jit/JITInlineMethods.h: + (JSC::JIT::emitCTICall): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::privateCompilePutByIdTransition): + * wtf/Platform.h: + +2008-12-11 Holger Freyther <zecke@selfish.org> + + Reviewed by Simon Hausmann. + + https://bugs.webkit.org/show_bug.cgi?id=20953 + + For Qt it is not pratical to have a FontCache and GlyphPageTreeNode + implementation. This is one of the reasons why the Qt port is currently not + using WebCore/platform/graphics/Font.cpp. By allowing to not use + the simple/fast-path the Qt port will be able to use it. + + Introduce USE(FONT_FAST_PATH) and define it for every port but the + Qt one. + + * wtf/Platform.h: Enable USE(FONT_FAST_PATH) + +2008-12-11 Gabor Loki <loki@inf.u-szeged.hu> + + Reviewed by Darin Adler and landed by Holger Freyther. + + <https://bugs.webkit.org/show_bug.cgi?id=22648> + Fix threading on Qt-port and Gtk-port for Sampling tool. + + * wtf/ThreadingGtk.cpp: + (WTF::waitForThreadCompletion): + * wtf/ThreadingQt.cpp: + (WTF::waitForThreadCompletion): + +2008-12-10 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Oliver Hunt. + + Bug 22734: Debugger crashes when stepping into a function call in a return statement + <https://bugs.webkit.org/show_bug.cgi?id=22734> + <rdar://problem/6426796> + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::BytecodeGenerator): The DebuggerCallFrame uses + the 'this' value stored in a callFrame, so op_convert_this should be + emitted at the beginning of a function body when generating bytecode + with debug hooks. + * debugger/DebuggerCallFrame.cpp: + (JSC::DebuggerCallFrame::thisObject): The assertion inherent in the call + to asObject() here is valid, because any 'this' value should have been + converted to a JSObject*. + +2008-12-10 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Port more of the JIT to use the MacroAssembler interface. + + Everything in the main pass, bar a few corner cases (operations with required + registers, or calling convention code). Slightly refactors array creation, + moving the offset calculation into the callFrame into C code (reducing code + planted). + + Overall this appears to be a 1% win on v8-tests, due to the smaller immediates + being planted (in jfalse in particular). + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::cti_op_new_array): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + * jit/JIT.h: + * wrec/WRECGenerator.cpp: + (JSC::WREC::Generator::generateEnter): + +2008-12-10 Sam Weinig <sam@webkit.org> + + Fix non-JIT builds. + + * bytecode/CodeBlock.h: + +2008-12-10 Sam Weinig <sam@webkit.org> + + Reviewed by Geoffrey Garen. + + <rdar://problem/6428332> Remove the CTI return address table from CodeBlock + + Step 2: + + Convert the return address table from a HashMap to a sorted Vector. This + reduces the size of the data structure by ~4.5MB on Membuster head. + + SunSpider reports a 0.5% progression. + + * bytecode/CodeBlock.cpp: + (JSC::sizeInBytes): Generic method to get the cost of a Vector. + (JSC::CodeBlock::dumpStatistics): Add dumping of member sizes. + * bytecode/CodeBlock.h: + (JSC::PC::PC): Struct representing NativePC -> VirtualPC mappings. + (JSC::getNativePC): Helper for binary chop. + (JSC::CodeBlock::getBytecodeIndex): Used to get the VirtualPC from a + NativePC using a binary chop of the pcVector. + (JSC::CodeBlock::pcVector): Accessor. + + * interpreter/Interpreter.cpp: + (JSC::vPCForPC): Use getBytecodeIndex instead of jitReturnAddressVPCMap().get(). + (JSC::Interpreter::cti_op_instanceof): Ditto. + (JSC::Interpreter::cti_op_resolve): Ditto. + (JSC::Interpreter::cti_op_resolve_func): Ditto. + (JSC::Interpreter::cti_op_resolve_skip): Ditto. + (JSC::Interpreter::cti_op_resolve_with_base): Ditto. + (JSC::Interpreter::cti_op_throw): Ditto. + (JSC::Interpreter::cti_op_in): Ditto. + (JSC::Interpreter::cti_vm_throw): Ditto. + + * jit/JIT.cpp: + (JSC::JIT::privateCompile): Reserve exact capacity and fill the pcVector. + +2008-12-09 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Oliver Hunt. + + Added WREC support for an assertion followed by a quantifier. Fixed + PCRE to match. + + * wrec/WRECParser.cpp: + (JSC::WREC::Parser::parseParentheses): Throw away the quantifier, since + it's meaningless. (Firefox does the same.) + + * pcre/pcre_compile.cpp: + (compileBranch): ditto. + +2008-12-09 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Cameron Zwarich. + + In preparation for compiling WREC without PCRE: + + Further relaxed WREC's parsing to be more web-compatible. Fixed PCRE to + match in cases where it didn't already. + + Changed JavaScriptCore to report syntax errors detected by WREC, rather + than falling back on PCRE any time WREC sees an error. + + * pcre/pcre_compile.cpp: + (checkEscape): Relaxed parsing of \c and \N escapes to be more + web-compatible. + + * runtime/RegExp.cpp: + (JSC::RegExp::RegExp): Only fall back on PCRE if WREC has not reported + a syntax error. + + * wrec/WREC.cpp: + (JSC::WREC::Generator::compileRegExp): Fixed some error reporting to + match PCRE. + + * wrec/WRECParser.cpp: Added error messages that match PCRE. + + (JSC::WREC::Parser::consumeGreedyQuantifier): + (JSC::WREC::Parser::parseParentheses): + (JSC::WREC::Parser::parseCharacterClass): + (JSC::WREC::Parser::parseNonCharacterEscape): Updated the above functions to + use the new setError API. + + (JSC::WREC::Parser::consumeEscape): Relaxed parsing of \c \N \u \x \B + to be more web-compatible. + + (JSC::WREC::Parser::parseAlternative): Distinguish between a malformed + quantifier and a quantifier with no prefix, like PCRE does. + + (JSC::WREC::Parser::consumeParenthesesType): Updated to use the new setError API. + + * wrec/WRECParser.h: + (JSC::WREC::Parser::error): + (JSC::WREC::Parser::syntaxError): + (JSC::WREC::Parser::parsePattern): + (JSC::WREC::Parser::reset): + (JSC::WREC::Parser::setError): Store error messages instead of error codes, + to provide for exception messages. Use a setter for reporting errors, so + errors detected early are not overwritten by errors detected later. + +2008-12-09 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Use va_args to access cti function arguments. + https://bugs.webkit.org/show_bug.cgi?id=22774 + + This may be a minor regression, but we'll take the hit if so to reduce fragility. + + * interpreter/Interpreter.cpp: + * interpreter/Interpreter.h: + +2008-12-09 Sam Weinig <sam@webkit.org> + + Reviewed twice by Cameron Zwarich. + + Fix for https://bugs.webkit.org/show_bug.cgi?id=22752 + Clear SymbolTable after codegen for Function codeblocks that + don't require an activation + + This is a ~1.5MB improvement on Membuster-head. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dumpStatistics): Add logging of non-empty symbol tables + and total size used by symbol tables. + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::generate): Clear the symbol table here. + +2008-12-09 Sam Weinig <sam@webkit.org> + + Reviewed by Geoffrey Garen. + + Remove unnecessary extra lookup when throwing an exception. + We used to first lookup the target offset using getHandlerForVPC + and then we would lookup the native code stub using + nativeExceptionCodeForHandlerVPC. Instead, we can just pass around + the HandlerInfo. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::handlerForVPC): Return the HandlerInfo. + * bytecode/CodeBlock.h: Remove nativeExceptionCodeForHandlerVPC. + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::throwException): Return a HandlerInfo instead of + and Instruction offset. + (JSC::Interpreter::privateExecute): Get the offset from HandlerInfo. + (JSC::Interpreter::cti_op_throw): Get the native code from the HandleInfo. + (JSC::Interpreter::cti_vm_throw): Ditto. + * interpreter/Interpreter.h: + +2008-12-09 Eric Seidel <eric@webkit.org> + + Build fix only, no review. + + Speculative fix for the Chromium-Windows bot. + Add JavaScriptCore/os-win32 to the include path (for stdint.h) + Strangely it builds fine on my local windows box (or at least doesn't hit this error) + + * JavaScriptCore.scons: + +2008-12-09 Eric Seidel <eric@webkit.org> + + No review, build fix only. + + Add ExecutableAllocator files missing from Scons build. + + * JavaScriptCore.scons: + +2008-12-09 Dimitri Glazkov <dglazkov@chromium.org> + + Reviewed by Timothy Hatcher. + + https://bugs.webkit.org/show_bug.cgi?id=22631 + Allow ScriptCallFrame query names of functions in the call stack. + + * JavaScriptCore.exp: added InternalFunction::name and + UString operator==() as exported symbol + +2008-12-08 Judit Jasz <jasy@inf.u-szeged.hu> + + Reviewed and tweaked by Cameron Zwarich. + + Bug 22352: Annotate opcodes with their length + <https://bugs.webkit.org/show_bug.cgi?id=22352> + + * bytecode/Opcode.cpp: + * bytecode/Opcode.h: + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + +2008-12-08 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Oliver Hunt. + + Implemented more of the relaxed and somewhat weird rules for deciding + how to interpret a non-pattern-character. + + * wrec/Escapes.h: + (JSC::WREC::Escape::): + (JSC::WREC::Escape::Escape): Eliminated Escape::None because it was + unused. If you see an '\\', it's either a valid escape or an error. + + * wrec/Quantifier.h: + (JSC::WREC::Quantifier::Quantifier): + * wrec/WRECGenerator.cpp: + (JSC::WREC::Generator::generateNonGreedyQuantifier): + (JSC::WREC::Generator::generateGreedyQuantifier): Renamed "noMaxSpecified" + to "Infinity", since that's what it means. + + * wrec/WRECParser.cpp: + (JSC::WREC::Parser::consumeGreedyQuantifier): Re-wrote {n,m} parsing rules + because they were too strict before. Added support for backtracking + in the case where the {n,m} fails to parse as a quantifier, and yet is + not a syntax error. + + (JSC::WREC::Parser::parseCharacterClass): + (JSC::WREC::Parser::parseNonCharacterEscape): Eliminated Escape::None, + as above. + + (JSC::WREC::Parser::consumeEscape): Don't treat ASCII and _ escapes + as syntax errors. See fast/regex/non-pattern-characters.html. + + * wrec/WRECParser.h: + (JSC::WREC::Parser::SavedState::SavedState): + (JSC::WREC::Parser::SavedState::restore): Added a state backtracker, + since parsing {n,m} forms requires backtracking if the form turns out + not to be a quantifier. + +2008-12-08 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Oliver Hunt. + + Refactored WREC parsing so that only one piece of code needs to know + the relaxed and somewhat weird rules for deciding how to interpret a + non-pattern-character, in preparation for implementing those rules. + + Also, implemented the relaxed and somewhat weird rules for '}' and ']'. + + * wrec/WREC.cpp: Reduced the regular expression size limit. Now that + WREC handles ']' properly, it compiles fast/js/regexp-charclass-crash.html, + which makes it hang at the old limit. (The old limit was based on the + misimpression that the same value in PCRE limited the regular expression + pattern size; in reality, it limited the expected compiled regular + expression size. WREC doesn't have a way to calculate an expected + compiled regular expression size, but this should be good enough.) + + * wrec/WRECParser.cpp: + (JSC::WREC::parsePatternCharacterSequence): Nixed this function because + it contained a second copy of the logic for handling non-pattern-characters, + which is about to get a lot more complicated. + + (JSC::WREC::PatternCharacterSequence::PatternCharacterSequence): + (JSC::WREC::PatternCharacterSequence::size): + (JSC::WREC::PatternCharacterSequence::append): + (JSC::WREC::PatternCharacterSequence::flush): Helper object for generating + an optimized sequence of pattern characters. + + (JSC::WREC::Parser::parseNonCharacterEscape): Renamed to reflect the fact + that the main parseAlternative loop handles character escapes. + + (JSC::WREC::Parser::parseAlternative): Moved pattern character sequence + logic from parsePatternCharacterSequence to here, using + PatternCharacterSequence to help with the details. + + * wrec/WRECParser.h: Updated for renames. + +2008-12-08 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Geoff Garen. + + <rdar://problem/6166088> Give JSGlobalContextCreate a behavior that is concurrency aware, + and un-deprecate it + + * API/JSContextRef.cpp: (JSGlobalContextCreate): + * API/JSContextRef.h: + Use a unique context group for the context, unless the application was linked against old + JavaScriptCore. + +2008-12-08 Sam Weinig <sam@webkit.org> + + Reviewed by Cameron Zwarich. + + Fix for <rdar://problem/6428332> Remove the CTI return address table from CodeBlock + + Step 1: + + Remove use of jitReturnAddressVPCMap when looking for vPC to store Structures + in for cached lookup. Instead, use the offset in the StructureStubInfo that is + already required. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dumpStatistics): Fix extraneous semicolon. + * interpreter/Interpreter.cpp: + (JSC::Interpreter::tryCTICachePutByID): + (JSC::Interpreter::tryCTICacheGetByID): + (JSC::Interpreter::cti_op_get_by_id_self_fail): + (JSC::Interpreter::cti_op_get_by_id_proto_list): + * jit/JIT.h: + (JSC::JIT::compileGetByIdSelf): + (JSC::JIT::compileGetByIdProto): + (JSC::JIT::compileGetByIdChain): + (JSC::JIT::compilePutByIdReplace): + (JSC::JIT::compilePutByIdTransition): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::patchGetByIdSelf): + (JSC::JIT::patchPutByIdReplace): + (JSC::JIT::privateCompilePatchGetArrayLength): Remove extra call to getStubInfo. + (JSC::JIT::privateCompileGetByIdSelf): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdChain): + (JSC::JIT::privateCompilePutByIdReplace): + +2008-12-08 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Port the op_j?n?eq_null JIT code generation to use the MacroAssembler, + and clean up slightly at the same time. The 'j' forms currently compare, + then set a register, then compare again, then branch. Branch directly on + the result of the first compare. + + Around a 1% progression on deltablue, crypto & early boyer, for about 1/2% + overall on v8-tests. + + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::compileGetByIdSlowCase): + +2008-12-08 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Expand MacroAssembler to support more operations, required by the JIT. + + Generally adds more operations and permutations of operands to the existing + interface. Rename 'jset' to 'jnz' and 'jnset' to 'jz', which seem clearer, + and require that immediate pointer operands (though not pointer addresses to + load and store instructions) are wrapped in a ImmPtr() type, akin to Imm32(). + + No performance impact. + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::): + (JSC::MacroAssembler::ImmPtr::ImmPtr): + (JSC::MacroAssembler::add32): + (JSC::MacroAssembler::and32): + (JSC::MacroAssembler::or32): + (JSC::MacroAssembler::sub32): + (JSC::MacroAssembler::xor32): + (JSC::MacroAssembler::loadPtr): + (JSC::MacroAssembler::load32): + (JSC::MacroAssembler::storePtr): + (JSC::MacroAssembler::store32): + (JSC::MacroAssembler::poke): + (JSC::MacroAssembler::move): + (JSC::MacroAssembler::testImm32): + (JSC::MacroAssembler::jae32): + (JSC::MacroAssembler::jb32): + (JSC::MacroAssembler::jePtr): + (JSC::MacroAssembler::je32): + (JSC::MacroAssembler::jnePtr): + (JSC::MacroAssembler::jne32): + (JSC::MacroAssembler::jnzPtr): + (JSC::MacroAssembler::jnz32): + (JSC::MacroAssembler::jzPtr): + (JSC::MacroAssembler::jz32): + (JSC::MacroAssembler::joSub32): + (JSC::MacroAssembler::jump): + (JSC::MacroAssembler::sete32): + (JSC::MacroAssembler::setne32): + (JSC::MacroAssembler::setnz32): + (JSC::MacroAssembler::setz32): + * assembler/X86Assembler.h: + (JSC::X86Assembler::addl_mr): + (JSC::X86Assembler::andl_i8r): + (JSC::X86Assembler::cmpl_rm): + (JSC::X86Assembler::cmpl_mr): + (JSC::X86Assembler::cmpl_i8m): + (JSC::X86Assembler::subl_mr): + (JSC::X86Assembler::testl_i32m): + (JSC::X86Assembler::xorl_i32r): + (JSC::X86Assembler::movl_rm): + (JSC::X86Assembler::modRm_opmsib): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + * jit/JITInlineMethods.h: + (JSC::JIT::emitGetVirtualRegister): + (JSC::JIT::emitPutCTIArgConstant): + (JSC::JIT::emitPutCTIParam): + (JSC::JIT::emitPutImmediateToCallFrameHeader): + (JSC::JIT::emitInitRegister): + (JSC::JIT::checkStructure): + (JSC::JIT::emitJumpIfJSCell): + (JSC::JIT::emitJumpIfNotJSCell): + (JSC::JIT::emitJumpSlowCaseIfNotImmNum): + +2008-12-08 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Fixed a bug where WREC would allow a quantifier whose minimum was + greater than its maximum. + + * wrec/Quantifier.h: + (JSC::WREC::Quantifier::Quantifier): ASSERT that the quantifier is not + backwards. + + * wrec/WRECParser.cpp: + (JSC::WREC::Parser::consumeGreedyQuantifier): Verify that the minimum + is not greater than the maximum. + +2008-12-08 Eric Seidel <eric@webkit.org> + + Build fix only, no review. + + * JavaScriptCore.scons: add bytecode/JumpTable.cpp + +2008-12-08 Sam Weinig <sam@webkit.org> + + Reviewed by Geoffrey Garen. + + Patch for https://bugs.webkit.org/show_bug.cgi?id=22716 + <rdar://problem/6428315> + Add RareData structure to CodeBlock for infrequently used auxiliary data + members. + + Reduces memory on Membuster-head by ~.5MB + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): + (JSC::CodeBlock::dumpStatistics): + (JSC::CodeBlock::mark): + (JSC::CodeBlock::getHandlerForVPC): + (JSC::CodeBlock::nativeExceptionCodeForHandlerVPC): + (JSC::CodeBlock::shrinkToFit): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::numberOfExceptionHandlers): + (JSC::CodeBlock::addExceptionHandler): + (JSC::CodeBlock::exceptionHandler): + (JSC::CodeBlock::addFunction): + (JSC::CodeBlock::function): + (JSC::CodeBlock::addUnexpectedConstant): + (JSC::CodeBlock::unexpectedConstant): + (JSC::CodeBlock::addRegExp): + (JSC::CodeBlock::regexp): + (JSC::CodeBlock::numberOfImmediateSwitchJumpTables): + (JSC::CodeBlock::addImmediateSwitchJumpTable): + (JSC::CodeBlock::immediateSwitchJumpTable): + (JSC::CodeBlock::numberOfCharacterSwitchJumpTables): + (JSC::CodeBlock::addCharacterSwitchJumpTable): + (JSC::CodeBlock::characterSwitchJumpTable): + (JSC::CodeBlock::numberOfStringSwitchJumpTables): + (JSC::CodeBlock::addStringSwitchJumpTable): + (JSC::CodeBlock::stringSwitchJumpTable): + (JSC::CodeBlock::evalCodeCache): + (JSC::CodeBlock::createRareDataIfNecessary): + +2008-11-26 Peter Kasting <pkasting@google.com> + + Reviewed by Anders Carlsson. + + https://bugs.webkit.org/show_bug.cgi?id=16814 + Allow ports to disable ActiveX->NPAPI conversion for Media Player. + Improve handling of miscellaneous ActiveX objects. + + * wtf/Platform.h: Add another ENABLE(...). + +2008-12-08 Sam Weinig <sam@webkit.org> + + Reviewed by Mark Rowe. + + Add dumping of CodeBlock member structure usage. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dumpStatistics): + * bytecode/EvalCodeCache.h: + (JSC::EvalCodeCache::isEmpty): + +2008-12-08 David Kilzer <ddkilzer@apple.com> + + Bug 22555: Sort "children" sections in Xcode project files + + <https://bugs.webkit.org/show_bug.cgi?id=22555> + + Reviewed by Eric Seidel. + + * JavaScriptCore.xcodeproj/project.pbxproj: Sorted. + +2008-12-08 Tony Chang <tony@chromium.org> + + Reviewed by Eric Seidel. + + Enable Pan scrolling only when building on PLATFORM(WIN_OS) + Previously platforms like Apple Windows WebKit, Cairo Windows WebKit, + Wx and Chromium were enabling it explicitly, now we just turn it on + for all WIN_OS, later platforms can turn it off as needed on Windows + (or turn it on under Linux, etc.) + https://bugs.webkit.org/show_bug.cgi?id=22698 + + * wtf/Platform.h: + +2008-12-08 Sam Weinig <sam@webkit.org> + + Reviewed by Cameron Zwarich. + + Add basic memory statistics dumping for CodeBlock. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dumpStatistics): + (JSC::CodeBlock::CodeBlock): + (JSC::CodeBlock::~CodeBlock): + * bytecode/CodeBlock.h: + +2008-12-08 Simon Hausmann <simon.hausmann@nokia.com> + + Fix the Linux build with newer gcc/glibc. + + * jit/ExecutableAllocatorPosix.cpp: Include unistd.h for + getpagesize(), according to + http://opengroup.org/onlinepubs/007908775/xsh/getpagesize.html + +2008-12-08 Simon Hausmann <simon.hausmann@nokia.com> + + Fix the build with Qt on Windows. + + * JavaScriptCore.pri: Compile ExecutableAllocatorWin.cpp on Windows. + +2008-12-07 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Buildfix). + + Fix non-WREC builds + + * runtime/RegExp.cpp: + (JSC::RegExp::RegExp): + +2008-12-07 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Build fix). + + Put ENABLE(ASSEMBLER) guards around use of ExecutableAllocator in global data + + Correct Qt and Gtk project files + + * GNUmakefile.am: + * JavaScriptCore.pri: + * runtime/JSGlobalData.h: + +2008-12-07 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Build fix). + + Add new files to other projects. + + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.pro: + +2008-12-07 Oliver Hunt <oliver@apple.com> + + Rubber stamped by Mark Rowe. + + Rename ExecutableAllocatorMMAP to the more sensible ExecutableAllocatorPosix + + * JavaScriptCore.xcodeproj/project.pbxproj: + * jit/ExecutableAllocator.h: + * jit/ExecutableAllocatorPosix.cpp: Renamed from JavaScriptCore/jit/ExecutableAllocatorMMAP.cpp. + (JSC::ExecutableAllocator::intializePageSize): + (JSC::ExecutablePool::systemAlloc): + (JSC::ExecutablePool::systemRelease): + +2008-12-07 Oliver Hunt <oliver@apple.com> + + Reviewed by Cameron Zwarich and Sam Weinig + + <rdar://problem/6309878> Need more granular control over allocation of executable memory (21783) + <https://bugs.webkit.org/show_bug.cgi?id=21783> + + Add a new allocator for use by the JIT that provides executable pages, so + we can get rid of the current hack that makes the entire heap executable. + + 1-2% progression on SunSpider-v8, 1% on SunSpider. Reduces memory usage as well! + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.vcproj/jsc/jsc.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * assembler/AssemblerBuffer.h: + (JSC::AssemblerBuffer::size): + (JSC::AssemblerBuffer::executableCopy): + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::size): + (JSC::MacroAssembler::copyCode): + * assembler/X86Assembler.h: + (JSC::X86Assembler::size): + (JSC::X86Assembler::executableCopy): + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::~CodeBlock): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::executablePool): + (JSC::CodeBlock::setExecutablePool): + * bytecode/Instruction.h: + (JSC::PolymorphicAccessStructureList::derefStructures): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::~Interpreter): + * interpreter/Interpreter.h: + * jit/ExecutableAllocator.cpp: Added. + * jit/ExecutableAllocator.h: Added. + (JSC::ExecutablePool::create): + (JSC::ExecutablePool::alloc): + (JSC::ExecutablePool::~ExecutablePool): + (JSC::ExecutablePool::available): + (JSC::ExecutablePool::ExecutablePool): + (JSC::ExecutablePool::poolAllocate): + (JSC::ExecutableAllocator::ExecutableAllocator): + (JSC::ExecutableAllocator::poolForSize): + (JSC::ExecutablePool::sizeForAllocation): + * jit/ExecutableAllocatorMMAP.cpp: Added. + (JSC::ExecutableAllocator::intializePageSize): + (JSC::ExecutablePool::systemAlloc): + (JSC::ExecutablePool::systemRelease): + * jit/ExecutableAllocatorWin.cpp: Added. + (JSC::ExecutableAllocator::intializePageSize): + (JSC::ExecutablePool::systemAlloc): + (JSC::ExecutablePool::systemRelease): + * jit/JIT.cpp: + (JSC::JIT::privateCompile): + (JSC::JIT::privateCompileCTIMachineTrampolines): + * jit/JIT.h: + (JSC::JIT::compileCTIMachineTrampolines): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::privateCompilePatchGetArrayLength): + (JSC::JIT::privateCompileGetByIdSelf): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdSelfList): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChainList): + (JSC::JIT::privateCompileGetByIdChain): + (JSC::JIT::privateCompilePutByIdReplace): + * parser/Nodes.cpp: + (JSC::RegExpNode::emitBytecode): + * runtime/JSGlobalData.h: + (JSC::JSGlobalData::poolForSize): + * runtime/RegExp.cpp: + (JSC::RegExp::RegExp): + (JSC::RegExp::create): + (JSC::RegExp::~RegExp): + * runtime/RegExp.h: + * runtime/RegExpConstructor.cpp: + (JSC::constructRegExp): + * runtime/RegExpPrototype.cpp: + (JSC::regExpProtoFuncCompile): + * runtime/StringPrototype.cpp: + (JSC::stringProtoFuncMatch): + (JSC::stringProtoFuncSearch): + * wrec/WREC.cpp: + (JSC::WREC::Generator::compileRegExp): + * wrec/WRECGenerator.h: + * wtf/FastMalloc.cpp: + * wtf/FastMalloc.h: + * wtf/TCSystemAlloc.cpp: + (TryMmap): + (TryVirtualAlloc): + (TryDevMem): + (TCMalloc_SystemRelease): + +2008-12-06 Sam Weinig <sam@webkit.org> + + Fix the Gtk build. + + * jit/JITPropertyAccess.cpp: + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::compilePutByIdHotPath): + +2008-12-06 Sam Weinig <sam@webkit.org> + + Reviewed by Cameron Zwarich, + + Move CodeBlock constructor into the .cpp file. + + Sunspider reports a .7% progression, but I can only assume this + is noise. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::CodeBlock): + * bytecode/CodeBlock.h: + +2008-12-06 Sam Weinig <sam@webkit.org> + + Reviewed by Cameron Zwarich. + + Split JumpTable code into its own file. + + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + * bytecode/CodeBlock.cpp: + * bytecode/CodeBlock.h: + * bytecode/JumpTable.cpp: Copied from bytecode/CodeBlock.cpp. + * bytecode/JumpTable.h: Copied from bytecode/CodeBlock.h. + +2008-12-05 Sam Weinig <sam@webkit.org> + + Reviewed by Cameron Zwarich. + + Fix for https://bugs.webkit.org/show_bug.cgi?id=22715 + Encapsulate more CodeBlock members in preparation + of moving some of them to a rare data structure. + + * bytecode/CodeBlock.cpp: + (JSC::locationForOffset): + (JSC::printConditionalJump): + (JSC::printGetByIdOp): + (JSC::printPutByIdOp): + (JSC::CodeBlock::printStructure): + (JSC::CodeBlock::printStructures): + (JSC::CodeBlock::dump): + (JSC::CodeBlock::~CodeBlock): + (JSC::CodeBlock::unlinkCallers): + (JSC::CodeBlock::derefStructures): + (JSC::CodeBlock::refStructures): + (JSC::CodeBlock::mark): + (JSC::CodeBlock::getHandlerForVPC): + (JSC::CodeBlock::nativeExceptionCodeForHandlerVPC): + (JSC::CodeBlock::lineNumberForVPC): + (JSC::CodeBlock::expressionRangeForVPC): + (JSC::CodeBlock::shrinkToFit): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::CodeBlock): + (JSC::CodeBlock::addCaller): + (JSC::CodeBlock::removeCaller): + (JSC::CodeBlock::isKnownNotImmediate): + (JSC::CodeBlock::isConstantRegisterIndex): + (JSC::CodeBlock::getConstant): + (JSC::CodeBlock::isTemporaryRegisterIndex): + (JSC::CodeBlock::getStubInfo): + (JSC::CodeBlock::getCallLinkInfo): + (JSC::CodeBlock::instructions): + (JSC::CodeBlock::setJITCode): + (JSC::CodeBlock::jitCode): + (JSC::CodeBlock::ownerNode): + (JSC::CodeBlock::setGlobalData): + (JSC::CodeBlock::setThisRegister): + (JSC::CodeBlock::thisRegister): + (JSC::CodeBlock::setNeedsFullScopeChain): + (JSC::CodeBlock::needsFullScopeChain): + (JSC::CodeBlock::setUsesEval): + (JSC::CodeBlock::usesEval): + (JSC::CodeBlock::setUsesArguments): + (JSC::CodeBlock::usesArguments): + (JSC::CodeBlock::codeType): + (JSC::CodeBlock::source): + (JSC::CodeBlock::sourceOffset): + (JSC::CodeBlock::addGlobalResolveInstruction): + (JSC::CodeBlock::numberOfPropertyAccessInstructions): + (JSC::CodeBlock::addPropertyAccessInstruction): + (JSC::CodeBlock::propertyAccessInstruction): + (JSC::CodeBlock::numberOfCallLinkInfos): + (JSC::CodeBlock::addCallLinkInfo): + (JSC::CodeBlock::callLinkInfo): + (JSC::CodeBlock::numberOfJumpTargets): + (JSC::CodeBlock::addJumpTarget): + (JSC::CodeBlock::jumpTarget): + (JSC::CodeBlock::lastJumpTarget): + (JSC::CodeBlock::numberOfExceptionHandlers): + (JSC::CodeBlock::addExceptionHandler): + (JSC::CodeBlock::exceptionHandler): + (JSC::CodeBlock::addExpressionInfo): + (JSC::CodeBlock::numberOfLineInfos): + (JSC::CodeBlock::addLineInfo): + (JSC::CodeBlock::lastLineInfo): + (JSC::CodeBlock::jitReturnAddressVPCMap): + (JSC::CodeBlock::numberOfIdentifiers): + (JSC::CodeBlock::addIdentifier): + (JSC::CodeBlock::identifier): + (JSC::CodeBlock::numberOfConstantRegisters): + (JSC::CodeBlock::addConstantRegister): + (JSC::CodeBlock::constantRegister): + (JSC::CodeBlock::addFunction): + (JSC::CodeBlock::function): + (JSC::CodeBlock::addFunctionExpression): + (JSC::CodeBlock::functionExpression): + (JSC::CodeBlock::addUnexpectedConstant): + (JSC::CodeBlock::unexpectedConstant): + (JSC::CodeBlock::addRegExp): + (JSC::CodeBlock::regexp): + (JSC::CodeBlock::symbolTable): + (JSC::CodeBlock::evalCodeCache): + New inline setters/getters. + + (JSC::ProgramCodeBlock::ProgramCodeBlock): + (JSC::ProgramCodeBlock::~ProgramCodeBlock): + (JSC::ProgramCodeBlock::clearGlobalObject): + * bytecode/SamplingTool.cpp: + (JSC::ScopeSampleRecord::sample): + (JSC::SamplingTool::dump): + * bytecompiler/BytecodeGenerator.cpp: + * bytecompiler/BytecodeGenerator.h: + * bytecompiler/Label.h: + * interpreter/CallFrame.cpp: + * interpreter/Interpreter.cpp: + * jit/JIT.cpp: + * jit/JITCall.cpp: + * jit/JITInlineMethods.h: + * jit/JITPropertyAccess.cpp: + * parser/Nodes.cpp: + * runtime/Arguments.h: + * runtime/ExceptionHelpers.cpp: + * runtime/JSActivation.cpp: + * runtime/JSActivation.h: + * runtime/JSGlobalObject.cpp: + Change direct access to use new getter/setters. + +2008-12-05 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Prevent GCC4.2 from hanging when trying to compile Interpreter.cpp. + Added "-fno-var-tracking" compiler flag. + + https://bugs.webkit.org/show_bug.cgi?id=22704 + + * JavaScriptCore.xcodeproj/project.pbxproj: + +2008-12-05 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Ordering of branch operands in MacroAssembler in unnecessarily inconsistent. + + je, jg etc take an immediate operand as the second argument, but for the + equality branches (je, jne) the immediate operand was the first argument. This + was unnecessarily inconsistent. Change je, jne methods to take the immediate + as the second argument. + + https://bugs.webkit.org/show_bug.cgi?id=22703 + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::je32): + (JSC::MacroAssembler::jne32): + * jit/JIT.cpp: + (JSC::JIT::compileOpStrictEq): + * wrec/WRECGenerator.cpp: + (JSC::WREC::Generator::generateEnter): + (JSC::WREC::Generator::generateNonGreedyQuantifier): + (JSC::WREC::Generator::generateGreedyQuantifier): + (JSC::WREC::Generator::generatePatternCharacterPair): + (JSC::WREC::Generator::generatePatternCharacter): + (JSC::WREC::Generator::generateCharacterClassInvertedRange): + (JSC::WREC::Generator::generateCharacterClassInverted): + (JSC::WREC::Generator::generateAssertionBOL): + (JSC::WREC::Generator::generateAssertionWordBoundary): + +2008-12-05 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Second tranche of porting JIT.cpp to MacroAssembler interface. + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::mul32): + (JSC::MacroAssembler::jl32): + (JSC::MacroAssembler::jnzSub32): + (JSC::MacroAssembler::joAdd32): + (JSC::MacroAssembler::joMul32): + (JSC::MacroAssembler::jzSub32): + * jit/JIT.cpp: + (JSC::JIT::emitSlowScriptCheck): + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + (JSC::JIT::privateCompileCTIMachineTrampolines): + * jit/JIT.h: + * jit/JITInlineMethods.h: + (JSC::JIT::emitJumpIfNotJSCell): + (JSC::JIT::emitJumpSlowCaseIfNotJSCell): + +2008-12-05 David Kilzer <ddkilzer@apple.com> + + Bug 22609: Provide a build-time choice when generating hash tables for properties of built-in DOM objects + + <https://bugs.webkit.org/show_bug.cgi?id=22609> + <rdar://problem/6331749> + + Reviewed by Darin Adler. + + Initial patch by Yosen Lin. Adapted for ToT WebKit by David Kilzer. + + Added back the code that generates a "compact" hash (instead of a + perfect hash) as a build-time option using the + ENABLE(PERFECT_HASH_SIZE) macro as defined in Lookup.h. + + * create_hash_table: Rename variables to differentiate perfect hash + values from compact hash values. Added back code to compute compact + hash tables. Generate both hash table sizes and emit + conditionalized code based on ENABLE(PERFECT_HASH_SIZE). + * runtime/Lookup.cpp: + (JSC::HashTable::createTable): Added version of createTable() for + use with compact hash tables. + (JSC::HashTable::deleteTable): Updated to work with compact hash + tables. + * runtime/Lookup.h: Defined ENABLE(PERFECT_HASH_SIZE) macro here. + (JSC::HashEntry::initialize): Set m_next to zero when using compact + hash tables. + (JSC::HashEntry::setNext): Added for compact hash tables. + (JSC::HashEntry::next): Added for compact hash tables. + (JSC::HashTable::entry): Added version of entry() for use with + compact hash tables. + * runtime/Structure.cpp: + (JSC::Structure::getEnumerablePropertyNames): Updated to work with + compact hash tables. + +2008-12-05 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Remove redundant calls to JIT::emitSlowScriptCheck. + This is checked in the hot path, so is not needed on the slow path - and the code + was being planted before the start of the slow case, so was completely unreachable! + + * jit/JIT.cpp: + (JSC::JIT::privateCompileSlowCases): + +2008-12-05 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Move JIT::compileOpStrictEq to MacroAssembler interface. + + The rewrite also looks like a small (<1%) performance progression. + + https://bugs.webkit.org/show_bug.cgi?id=22697 + + * jit/JIT.cpp: + (JSC::JIT::compileOpStrictEq): + (JSC::JIT::privateCompileSlowCases): + * jit/JIT.h: + * jit/JITInlineMethods.h: + (JSC::JIT::emitJumpIfJSCell): + (JSC::JIT::emitJumpSlowCaseIfJSCell): + +2008-12-05 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Remove m_assembler from MacroAssembler::Jump. + Keeping a pointer allowed for some syntactic sugar - "link()" looks nicer + than "link(this)". But maintaining this doubles the size of Jump, which + is even more unfortunate for the JIT, since there are many large structures + holding JmpSrcs. Probably best to remove it. + + https://bugs.webkit.org/show_bug.cgi?id=22693 + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::Jump::Jump): + (JSC::MacroAssembler::Jump::link): + (JSC::MacroAssembler::Jump::linkTo): + (JSC::MacroAssembler::JumpList::link): + (JSC::MacroAssembler::JumpList::linkTo): + (JSC::MacroAssembler::jae32): + (JSC::MacroAssembler::je32): + (JSC::MacroAssembler::je16): + (JSC::MacroAssembler::jg32): + (JSC::MacroAssembler::jge32): + (JSC::MacroAssembler::jl32): + (JSC::MacroAssembler::jle32): + (JSC::MacroAssembler::jnePtr): + (JSC::MacroAssembler::jne32): + (JSC::MacroAssembler::jnset32): + (JSC::MacroAssembler::jset32): + (JSC::MacroAssembler::jump): + (JSC::MacroAssembler::jzSub32): + (JSC::MacroAssembler::joAdd32): + (JSC::MacroAssembler::call): + * wrec/WREC.cpp: + (JSC::WREC::Generator::compileRegExp): + * wrec/WRECGenerator.cpp: + (JSC::WREC::Generator::generateEnter): + (JSC::WREC::Generator::generateBackreferenceQuantifier): + (JSC::WREC::Generator::generateNonGreedyQuantifier): + (JSC::WREC::Generator::generateGreedyQuantifier): + (JSC::WREC::Generator::generatePatternCharacter): + (JSC::WREC::Generator::generateCharacterClassInvertedRange): + (JSC::WREC::Generator::generateCharacterClassInverted): + (JSC::WREC::Generator::generateCharacterClass): + (JSC::WREC::Generator::generateParenthesesAssertion): + (JSC::WREC::Generator::generateParenthesesInvertedAssertion): + (JSC::WREC::Generator::generateParenthesesNonGreedy): + (JSC::WREC::Generator::generateParenthesesResetTrampoline): + (JSC::WREC::Generator::generateAssertionBOL): + (JSC::WREC::Generator::generateAssertionEOL): + (JSC::WREC::Generator::generateAssertionWordBoundary): + (JSC::WREC::Generator::generateBackreference): + (JSC::WREC::Generator::terminateAlternative): + (JSC::WREC::Generator::terminateDisjunction): + * wrec/WRECParser.h: + +2008-12-05 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoffrey Garen. + + Simplify JIT generated checks for timeout code, by moving more work into the C function. + https://bugs.webkit.org/show_bug.cgi?id=22688 + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::cti_timeout_check): + * interpreter/Interpreter.h: + * jit/JIT.cpp: + (JSC::JIT::emitSlowScriptCheck): + +2008-12-05 Sam Weinig <sam@webkit.org> + + Reviewed by Geoffrey Garen. + + Encapsulate access to jump tables in the CodeBlock in preparation + of moving them to a rare data structure. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): + (JSC::CodeBlock::shrinkToFit): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::numberOfImmediateSwitchJumpTables): + (JSC::CodeBlock::addImmediateSwitchJumpTable): + (JSC::CodeBlock::immediateSwitchJumpTable): + (JSC::CodeBlock::numberOfCharacterSwitchJumpTables): + (JSC::CodeBlock::addCharacterSwitchJumpTable): + (JSC::CodeBlock::characterSwitchJumpTable): + (JSC::CodeBlock::numberOfStringSwitchJumpTables): + (JSC::CodeBlock::addStringSwitchJumpTable): + (JSC::CodeBlock::stringSwitchJumpTable): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::generate): + (JSC::BytecodeGenerator::endSwitch): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): + (JSC::Interpreter::cti_op_switch_imm): + (JSC::Interpreter::cti_op_switch_char): + (JSC::Interpreter::cti_op_switch_string): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + +2008-12-05 Adam Roben <aroben@apple.com> + + Windows build fix after r39020 + + * jit/JITInlineMethods.h: + (JSC::JIT::restoreArgumentReference): + (JSC::JIT::restoreArgumentReferenceForTrampoline): + Add some apparently-missing __. + +2008-12-04 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=22673 + + Added support for the assertion (?=) and inverted assertion (?!) atoms + in WREC. + + * wrec/WRECGenerator.cpp: + (JSC::WREC::Generator::generateParenthesesAssertion): + (JSC::WREC::Generator::generateParenthesesInvertedAssertion): Split the + old (unused) generateParentheses into these two functions, with more + limited capabilities. + + * wrec/WRECGenerator.h: + (JSC::WREC::Generator::): Moved an enum to the top of the class definition, + to match the WebKit style, and removed a defunct comment. + + * wrec/WRECParser.cpp: + (JSC::WREC::Parser::parseParentheses): + (JSC::WREC::Parser::consumeParenthesesType): + * wrec/WRECParser.h: + (JSC::WREC::Parser::): Added support for parsing (?=) and (?!). + +2008-12-05 Simon Hausmann <simon.hausmann@nokia.com> + + Rubber-stamped by Tor Arne Vestbø. + + Disable the JIT for the Qt build alltogether again, after observing + more miscompilations in a wider range of newer gcc versions. + + * JavaScriptCore.pri: + +2008-12-05 Simon Hausmann <simon.hausmann@nokia.com> + + Reviewed by Tor Arne Vestbø. + + Disable the JIT for the Qt build on Linux unless gcc is >= 4.2, + due to miscompilations. + + * JavaScriptCore.pri: + +2008-12-04 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Start porting the JIT to use the MacroAssembler. + + https://bugs.webkit.org/show_bug.cgi?id=22671 + No change in performance. + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::Jump::operator X86Assembler::JmpSrc): + (JSC::MacroAssembler::add32): + (JSC::MacroAssembler::and32): + (JSC::MacroAssembler::lshift32): + (JSC::MacroAssembler::rshift32): + (JSC::MacroAssembler::storePtr): + (JSC::MacroAssembler::store32): + (JSC::MacroAssembler::poke): + (JSC::MacroAssembler::move): + (JSC::MacroAssembler::compareImm32ForBranchEquality): + (JSC::MacroAssembler::jnePtr): + (JSC::MacroAssembler::jnset32): + (JSC::MacroAssembler::jset32): + (JSC::MacroAssembler::jzeroSub32): + (JSC::MacroAssembler::joverAdd32): + (JSC::MacroAssembler::call): + * assembler/X86Assembler.h: + (JSC::X86Assembler::shll_i8r): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompile): + (JSC::JIT::privateCompileCTIMachineTrampolines): + * jit/JIT.h: + * jit/JITArithmetic.cpp: + (JSC::JIT::compileBinaryArithOp): + * jit/JITInlineMethods.h: + (JSC::JIT::emitGetVirtualRegister): + (JSC::JIT::emitPutCTIArg): + (JSC::JIT::emitPutCTIArgConstant): + (JSC::JIT::emitGetCTIArg): + (JSC::JIT::emitPutCTIArgFromVirtualRegister): + (JSC::JIT::emitPutCTIParam): + (JSC::JIT::emitGetCTIParam): + (JSC::JIT::emitPutToCallFrameHeader): + (JSC::JIT::emitPutImmediateToCallFrameHeader): + (JSC::JIT::emitGetFromCallFrameHeader): + (JSC::JIT::emitPutVirtualRegister): + (JSC::JIT::emitInitRegister): + (JSC::JIT::emitNakedCall): + (JSC::JIT::restoreArgumentReference): + (JSC::JIT::restoreArgumentReferenceForTrampoline): + (JSC::JIT::emitCTICall): + (JSC::JIT::checkStructure): + (JSC::JIT::emitJumpSlowCaseIfNotJSCell): + (JSC::JIT::emitJumpSlowCaseIfNotImmNum): + (JSC::JIT::emitJumpSlowCaseIfNotImmNums): + (JSC::JIT::emitFastArithDeTagImmediate): + (JSC::JIT::emitFastArithDeTagImmediateJumpIfZero): + (JSC::JIT::emitFastArithReTagImmediate): + (JSC::JIT::emitFastArithPotentiallyReTagImmediate): + (JSC::JIT::emitFastArithImmToInt): + (JSC::JIT::emitFastArithIntToImmOrSlowCase): + (JSC::JIT::emitFastArithIntToImmNoCheck): + (JSC::JIT::emitTagAsBoolImmediate): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::privateCompilePutByIdTransition): + +2008-12-04 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Oliver Hunt. + + Some refactoring for generateGreedyQuantifier. + + SunSpider reports no change (possibly a 0.3% speedup). + + * wrec/WRECGenerator.cpp: + (JSC::WREC::Generator::generateGreedyQuantifier): Clarified label + meanings and unified some logic to simplify things. + + * wrec/WRECParser.h: + (JSC::WREC::Parser::parseAlternative): Added a version of parseAlternative + that can jump to a Label, instead of a JumpList, upon failure. (Eventually, + when we have a true Label class, this will be redundant.) This makes + things easier for generateGreedyQuantifier, because it can avoid + explicitly linking things. + +2008-12-04 Simon Hausmann <simon.hausmann@nokia.com> + + Reviewed by Holger Freyther. + + Fix crashes in the Qt build on Linux/i386 with non-executable memory + by enabling TCSystemAlloc and the PROT_EXEC flag for mmap. + + * JavaScriptCore.pri: Enable the use of TCSystemAlloc if the JIT is + enabled. + * wtf/TCSystemAlloc.cpp: Extend the PROT_EXEC permissions to + PLATFORM(QT). + +2008-12-04 Simon Hausmann <simon.hausmann@nokia.com> + + Reviewed by Tor Arne Vestbø. + + Enable ENABLE_JIT_OPTIMIZE_CALL, ENABLE_JIT_OPTIMIZE_PROPERTY_ACCESS + and ENABLE_JIT_OPTIMIZE_ARITHMETIC, as suggested by Niko. + + * JavaScriptCore.pri: + +2008-12-04 Kent Hansen <khansen@trolltech.com> + + Reviewed by Simon Hausmann. + + Enable the JSC jit for the Qt build by default for release builds on + linux-g++ and win32-msvc. + + * JavaScriptCore.pri: + +2008-12-04 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Allow JIT to function without property access repatching and arithmetic optimizations. + Controlled by ENABLE_JIT_OPTIMIZE_PROPERTY_ACCESS and ENABLE_JIT_OPTIMIZE_ARITHMETIC switches. + + https://bugs.webkit.org/show_bug.cgi?id=22643 + + * JavaScriptCore.xcodeproj/project.pbxproj: + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + * jit/JIT.h: + * jit/JITArithmetic.cpp: Copied from jit/JIT.cpp. + (JSC::JIT::compileBinaryArithOp): + (JSC::JIT::compileBinaryArithOpSlowCase): + * jit/JITPropertyAccess.cpp: Copied from jit/JIT.cpp. + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::compileGetByIdSlowCase): + (JSC::JIT::compilePutByIdHotPath): + (JSC::JIT::compilePutByIdSlowCase): + (JSC::resizePropertyStorage): + (JSC::transitionWillNeedStorageRealloc): + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::patchGetByIdSelf): + (JSC::JIT::patchPutByIdReplace): + (JSC::JIT::privateCompilePatchGetArrayLength): + * wtf/Platform.h: + +2008-12-03 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Oliver Hunt. + + Optimized sequences of characters in regular expressions by comparing + two characters at a time. + + 1-2% speedup on SunSpider, 19-25% speedup on regexp-dna. + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::load32): + (JSC::MacroAssembler::jge32): Filled out a few more macro methods. + + * assembler/X86Assembler.h: + (JSC::X86Assembler::movl_mr): Added a verion of movl_mr that operates + without an offset, to allow the macro assembler to optmize for that case. + + * wrec/WREC.cpp: + (JSC::WREC::Generator::compileRegExp): Test the saved value of index + instead of the index register when checking for "end of input." The + index register doesn't increment by 1 in an orderly fashion, so testing + it for == "end of input" is not valid. + + Also, jump all the way to "return failure" upon reaching "end of input," + instead of executing the next alternative. This is more logical, and + it's a slight optimization in the case of an expression with many alternatives. + + * wrec/WRECGenerator.cpp: + (JSC::WREC::Generator::generateIncrementIndex): Added support for + jumping to a failure label in the case where the index has reached "end + of input." + + (JSC::WREC::Generator::generatePatternCharacterSequence): + (JSC::WREC::Generator::generatePatternCharacterPair): This is the + optmization. It's basically like generatePatternCharacter, but it runs two + characters at a time. + + (JSC::WREC::Generator::generatePatternCharacter): Changed to use isASCII, + since it's clearer than comparing to a magic hex value. + + * wrec/WRECGenerator.h: + +2008-12-03 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Cameron Zwarich. + + Allow JIT to operate without the call-repatching optimization. + Controlled by ENABLE(JIT_OPTIMIZE_CALL), defaults on, disabling + this leads to significant performance regression. + + https://bugs.webkit.org/show_bug.cgi?id=22639 + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * jit/JIT.cpp: + (JSC::JIT::privateCompileSlowCases): + * jit/JIT.h: + * jit/JITCall.cpp: Copied from jit/JIT.cpp. + (JSC::JIT::compileOpCallInitializeCallFrame): + (JSC::JIT::compileOpCallSetupArgs): + (JSC::JIT::compileOpCallEvalSetupArgs): + (JSC::JIT::compileOpConstructSetupArgs): + (JSC::JIT::compileOpCall): + (JSC::JIT::compileOpCallSlowCase): + (JSC::unreachable): + * jit/JITInlineMethods.h: Copied from jit/JIT.cpp. + (JSC::JIT::checkStructure): + (JSC::JIT::emitFastArithPotentiallyReTagImmediate): + (JSC::JIT::emitTagAsBoolImmediate): + * wtf/Platform.h: + +2008-12-03 Eric Seidel <eric@webkit.org> + + Rubber-stamped by David Hyatt. + + Make HAVE_ACCESSIBILITY only define if !defined + + * wtf/Platform.h: + +2008-12-03 Sam Weinig <sam@webkit.org> + + Fix build. + + * assembler/X86Assembler.h: + (JSC::X86Assembler::orl_i32r): + +2008-12-03 Sam Weinig <sam@webkit.org> + + Reviewed by Geoffrey Garen. + + Remove shared AssemblerBuffer 1MB buffer and instead give AssemblerBuffer + an 256 byte inline capacity. + + 1% progression on Sunspider. + + * assembler/AssemblerBuffer.h: + (JSC::AssemblerBuffer::AssemblerBuffer): + (JSC::AssemblerBuffer::~AssemblerBuffer): + (JSC::AssemblerBuffer::grow): + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::MacroAssembler): + * assembler/X86Assembler.h: + (JSC::X86Assembler::X86Assembler): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::Interpreter): + * interpreter/Interpreter.h: + * jit/JIT.cpp: + (JSC::JIT::JIT): + * parser/Nodes.cpp: + (JSC::RegExpNode::emitBytecode): + * runtime/RegExp.cpp: + (JSC::RegExp::RegExp): + (JSC::RegExp::create): + * runtime/RegExp.h: + * runtime/RegExpConstructor.cpp: + (JSC::constructRegExp): + * runtime/RegExpPrototype.cpp: + (JSC::regExpProtoFuncCompile): + * runtime/StringPrototype.cpp: + (JSC::stringProtoFuncMatch): + (JSC::stringProtoFuncSearch): + * wrec/WREC.cpp: + (JSC::WREC::Generator::compileRegExp): + * wrec/WRECGenerator.h: + (JSC::WREC::Generator::Generator): + * wrec/WRECParser.h: + (JSC::WREC::Parser::Parser): + +2008-12-03 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Oliver Hunt, with help from Gavin Barraclough. + + orl_i32r was actually coded as an 8bit OR. So, I renamed orl_i32r to + orl_i8r, changed all orl_i32r clients to use orl_i8r, and then added + a new orl_i32r that actually does a 32bit OR. + + (32bit OR is currently unused, but a patch I'm working on uses it.) + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::or32): Updated to choose between 8bit and 32bit OR. + + * assembler/X86Assembler.h: + (JSC::X86Assembler::orl_i8r): The old orl_i32r. + (JSC::X86Assembler::orl_i32r): The new orl_i32r. + + * jit/JIT.cpp: + (JSC::JIT::emitFastArithPotentiallyReTagImmediate): + (JSC::JIT::emitTagAsBoolImmediate): Use orl_i8r, since we're ORing 8bit + values. + +2008-12-03 Dean Jackson <dino@apple.com> + + Reviewed by Dan Bernstein. + + Helper functions for turn -> degrees. + https://bugs.webkit.org/show_bug.cgi?id=22497 + + * wtf/MathExtras.h: + (turn2deg): + (deg2turn): + +2008-12-02 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Geoff Garen. + + Bug 22504: Crashes during code generation occur due to refing of ignoredResult() + <https://bugs.webkit.org/show_bug.cgi?id=22504> + + Since ignoredResult() was implemented by casting 1 to a RegisterID*, any + attempt to ref ignoredResult() results in a crash. This will occur in + code generation of a function body where a node emits another node with + the dst that was passed to it, and then refs the returned RegisterID*. + + To fix this problem, make ignoredResult() a member function of + BytecodeGenerator that simply returns a pointe to a fixed RegisterID + member of BytecodeGenerator. + + * bytecompiler/BytecodeGenerator.h: + (JSC::BytecodeGenerator::ignoredResult): + * bytecompiler/RegisterID.h: + * parser/Nodes.cpp: + (JSC::NullNode::emitBytecode): + (JSC::BooleanNode::emitBytecode): + (JSC::NumberNode::emitBytecode): + (JSC::StringNode::emitBytecode): + (JSC::RegExpNode::emitBytecode): + (JSC::ThisNode::emitBytecode): + (JSC::ResolveNode::emitBytecode): + (JSC::ObjectLiteralNode::emitBytecode): + (JSC::PostfixResolveNode::emitBytecode): + (JSC::PostfixBracketNode::emitBytecode): + (JSC::PostfixDotNode::emitBytecode): + (JSC::DeleteValueNode::emitBytecode): + (JSC::VoidNode::emitBytecode): + (JSC::TypeOfResolveNode::emitBytecode): + (JSC::TypeOfValueNode::emitBytecode): + (JSC::PrefixResolveNode::emitBytecode): + (JSC::AssignResolveNode::emitBytecode): + (JSC::CommaNode::emitBytecode): + (JSC::ForNode::emitBytecode): + (JSC::ForInNode::emitBytecode): + (JSC::ReturnNode::emitBytecode): + (JSC::ThrowNode::emitBytecode): + (JSC::FunctionBodyNode::emitBytecode): + (JSC::FuncDeclNode::emitBytecode): + +2008-12-02 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Cameron Zwarich. + + Fixed https://bugs.webkit.org/show_bug.cgi?id=22537 + REGRESSION (r38745): Assertion failure in jsSubstring() at ge.com + + The bug was that index would become greater than length, so our + "end of input" checks, which all check "index == length", would fail. + + The solution is to check for end of input before incrementing index, + to ensure that index is always <= length. + + As a side benefit, generateJumpIfEndOfInput can now use je instead of + jg, which should be slightly faster. + + * wrec/WREC.cpp: + (JSC::WREC::Generator::compileRegExp): + * wrec/WRECGenerator.cpp: + (JSC::WREC::Generator::generateJumpIfEndOfInput): + +2008-12-02 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoffrey Garen. + + Plant shift right immediate instructions, which are awesome. + https://bugs.webkit.org/show_bug.cgi?id=22610 + ~5% on the v8-crypto test. + + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + +2008-12-02 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Cleaned up SegmentedVector by abstracting segment access into helper + functions. + + SunSpider reports no change. + + * bytecompiler/SegmentedVector.h: + (JSC::SegmentedVector::SegmentedVector): + (JSC::SegmentedVector::~SegmentedVector): + (JSC::SegmentedVector::size): + (JSC::SegmentedVector::at): + (JSC::SegmentedVector::operator[]): + (JSC::SegmentedVector::last): + (JSC::SegmentedVector::append): + (JSC::SegmentedVector::removeLast): + (JSC::SegmentedVector::grow): + (JSC::SegmentedVector::clear): + (JSC::SegmentedVector::deleteAllSegments): + (JSC::SegmentedVector::segmentFor): + (JSC::SegmentedVector::subscriptFor): + (JSC::SegmentedVector::ensureSegmentsFor): + (JSC::SegmentedVector::ensureSegment): + +2008-12-02 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Geoffrey Garen. (Patch by Cameron Zwarich <zwarich@apple.com>.) + + Fixed https://bugs.webkit.org/show_bug.cgi?id=22482 + REGRESSION (r37991): Occasionally see "Scene rendered incorrectly" + message when running the V8 Raytrace benchmark + + Rolled out r37991. It didn't properly save xmm0, which is caller-save, + before calling helper functions. + + SunSpider and v8 benchmarks show little change -- possibly a .2% + SunSpider regression, possibly a .2% v8 benchmark speedup. + + * assembler/X86Assembler.h: + (JSC::X86Assembler::): + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * bytecode/Instruction.h: + (JSC::Instruction::): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitUnaryOp): + * bytecompiler/BytecodeGenerator.h: + (JSC::BytecodeGenerator::emitToJSNumber): + (JSC::BytecodeGenerator::emitTypeOf): + (JSC::BytecodeGenerator::emitGetPropertyNames): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): + * interpreter/Interpreter.h: + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + * jit/JIT.h: + * parser/Nodes.cpp: + (JSC::UnaryOpNode::emitBytecode): + (JSC::BinaryOpNode::emitBytecode): + (JSC::EqualNode::emitBytecode): + * parser/ResultType.h: + (JSC::ResultType::isReusable): + (JSC::ResultType::mightBeNumber): + * runtime/JSNumberCell.h: + +2008-12-01 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoffrey Garen. + + Remove unused (sampling only, and derivable) argument to JIT::emitCTICall. + https://bugs.webkit.org/show_bug.cgi?id=22587 + + * jit/JIT.cpp: + (JSC::JIT::emitCTICall): + (JSC::JIT::compileOpCall): + (JSC::JIT::emitSlowScriptCheck): + (JSC::JIT::compileBinaryArithOpSlowCase): + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + (JSC::JIT::privateCompile): + * jit/JIT.h: + +2008-12-02 Dimitri Glazkov <dglazkov@chromium.org> + + Reviewed by Eric Seidel. + + Fix the inheritance chain for JSFunction. + + * runtime/JSFunction.cpp: + (JSC::JSFunction::info): Add InternalFunction::info as parent class + +2008-12-02 Simon Hausmann <hausmann@webkit.org> + + Reviewed by Tor Arne Vestbø. + + Fix ability to include JavaScriptCore.pri from other .pro files. + + * JavaScriptCore.pri: Moved -O3 setting into the .pro files. + * JavaScriptCore.pro: + * jsc.pro: + +2008-12-01 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Cameron Zwarich, with help from Gavin Barraclough. + + Fixed https://bugs.webkit.org/show_bug.cgi?id=22583. + + Refactored regular expression parsing to parse sequences of characters + as a single unit, in preparation for optimizing sequences of characters. + + SunSpider reports no change. + + * JavaScriptCore.xcodeproj/project.pbxproj: + * wrec/Escapes.h: Added. Set of classes for representing an escaped + token in a pattern. + + * wrec/Quantifier.h: + (JSC::WREC::Quantifier::Quantifier): Simplified this constructor slightly, + to match the new Escape constructor. + + * wrec/WRECGenerator.cpp: + (JSC::WREC::Generator::generatePatternCharacterSequence): + * wrec/WRECGenerator.h: Added an interface for generating a sequence + of pattern characters at a time. It doesn't do anything special yet. + + * wrec/WRECParser.cpp: + (JSC::WREC::Parser::consumeGreedyQuantifier): + (JSC::WREC::Parser::consumeQuantifier): Renamed "parse" to "consume" in + these functions, to match "consumeEscape." + + (JSC::WREC::Parser::parsePatternCharacterSequence): New function for + iteratively aggregating a sequence of characters in a pattern. + + (JSC::WREC::Parser::parseCharacterClassQuantifier): + (JSC::WREC::Parser::parseBackreferenceQuantifier): Renamed "parse" to + "consume" in these functions, to match "consumeEscape." + + (JSC::WREC::Parser::parseCharacterClass): Refactored to use the common + escape processing code in consumeEscape. + + (JSC::WREC::Parser::parseEscape): Refactored to use the common + escape processing code in consumeEscape. + + (JSC::WREC::Parser::consumeEscape): Factored escaped token processing + into a common function, since we were doing this in a few places. + + (JSC::WREC::Parser::parseTerm): Refactored to use the common + escape processing code in consumeEscape. + + * wrec/WRECParser.h: + (JSC::WREC::Parser::consumeOctal): Refactored to use a helper function + for reading a digit. + +2008-12-01 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Oliver Hunt. + + Bug 20340: SegmentedVector segment allocations can lead to unsafe use of temporary registers + <https://bugs.webkit.org/show_bug.cgi?id=20340> + + SegmentedVector currently frees segments and reallocates them when used + as a stack. This can lead to unsafe use of pointers into freed segments. + + In order to fix this problem, SegmentedVector will be changed to only + grow and never shrink. Also, rename the reserveCapacity() member + function to grow() to match the actual usage in BytecodeGenerator, where + this function is used to allocate a group of registers at once, rather + than merely saving space for them. + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::BytecodeGenerator): Use grow() instead of + reserveCapacity(). + * bytecompiler/SegmentedVector.h: + (JSC::SegmentedVector::SegmentedVector): + (JSC::SegmentedVector::last): + (JSC::SegmentedVector::append): + (JSC::SegmentedVector::removeLast): + (JSC::SegmentedVector::grow): Renamed from reserveCapacity(). + (JSC::SegmentedVector::clear): + +2008-12-01 Mark Rowe <mrowe@apple.com> + + Rubber-stamped by Anders Carlsson. + + Disable WREC for x86_64 since memory allocated by the system allocator is not marked executable, + which causes 64-bit debug builds to crash. Once we have a dedicated allocator for executable + memory we can turn this back on. + + * wtf/Platform.h: + +2008-12-01 Antti Koivisto <antti@apple.com> + + Reviewed by Maciej Stachowiak. + + Restore inline buffer after vector is shrunk back below its inline capacity. + + * wtf/Vector.h: + (WTF::): + (WTF::VectorBuffer::restoreInlineBufferIfNeeded): + (WTF::::shrinkCapacity): + +2008-11-30 Antti Koivisto <antti@apple.com> + + Reviewed by Mark Rowe. + + Try to return free pages in the current thread cache too. + + * wtf/FastMalloc.cpp: + (WTF::TCMallocStats::releaseFastMallocFreeMemory): + +2008-12-01 David Levin <levin@chromium.org> + + Reviewed by Alexey Proskuryakov. + + https://bugs.webkit.org/show_bug.cgi?id=22567 + Make HashTable work as expected with respect to threads. Specifically, it has class-level + thread safety and constant methods work on constant objects without synchronization. + + No observable change in behavior, so no test. This only affects debug builds. + + * wtf/HashTable.cpp: + (WTF::hashTableStatsMutex): + (WTF::HashTableStats::~HashTableStats): + (WTF::HashTableStats::recordCollisionAtCount): + Guarded variable access with a mutex. + + * wtf/HashTable.h: + (WTF::::lookup): + (WTF::::lookupForWriting): + (WTF::::fullLookupForWriting): + (WTF::::add): + (WTF::::reinsert): + (WTF::::remove): + (WTF::::rehash): + Changed increments of static variables to use atomicIncrement. + + (WTF::::invalidateIterators): + (WTF::addIterator): + (WTF::removeIterator): + Guarded mutable access with a mutex. + +2008-11-29 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Cameron Zwarich. + + Enable WREC on PLATFORM(X86_64). This change predominantly requires changes to the + WREC::Generator::generateEnter method to support the x86-64 ABI, and addition of + support for a limited number of quadword operations in the X86Assembler. + + This patch will cause the JS heap to be allocated with RWX permissions on 64-bit Mac + platforms. This is a regression with respect to previous 64-bit behaviour, but is no + more permissive than on 32-bit builds. This issue should be addressed at some point. + (This is tracked by bug #21783.) + + https://bugs.webkit.org/show_bug.cgi?id=22554 + Greater than 4x speedup on regexp-dna, on x86-64. + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::addPtr): + (JSC::MacroAssembler::loadPtr): + (JSC::MacroAssembler::storePtr): + (JSC::MacroAssembler::pop): + (JSC::MacroAssembler::push): + (JSC::MacroAssembler::move): + * assembler/X86Assembler.h: + (JSC::X86Assembler::): + (JSC::X86Assembler::movq_rr): + (JSC::X86Assembler::addl_i8m): + (JSC::X86Assembler::addl_i32r): + (JSC::X86Assembler::addq_i8r): + (JSC::X86Assembler::addq_i32r): + (JSC::X86Assembler::movq_mr): + (JSC::X86Assembler::movq_rm): + * wrec/WREC.h: + * wrec/WRECGenerator.cpp: + (JSC::WREC::Generator::generateEnter): + (JSC::WREC::Generator::generateReturnSuccess): + (JSC::WREC::Generator::generateReturnFailure): + * wtf/Platform.h: + * wtf/TCSystemAlloc.cpp: + +2008-12-01 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Sam Weinig. + + Preliminary work for bug 20340: SegmentedVector segment allocations can lead to unsafe use of temporary registers + <https://bugs.webkit.org/show_bug.cgi?id=20340> + + SegmentedVector currently frees segments and reallocates them when used + as a stack. This can lead to unsafe use of pointers into freed segments. + + In order to fix this problem, SegmentedVector will be changed to only + grow and never shrink, with the sole exception of clearing all of its + data, a capability that is required by Lexer. This patch changes the + public interface to only allow for these capabilities. + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::BytecodeGenerator): Use reserveCapacity() + instead of resize() for m_globals and m_parameters. + * bytecompiler/SegmentedVector.h: + (JSC::SegmentedVector::resize): Removed. + (JSC::SegmentedVector::reserveCapacity): Added. + (JSC::SegmentedVector::clear): Added. + (JSC::SegmentedVector::shrink): Removed. + (JSC::SegmentedVector::grow): Removed. + * parser/Lexer.cpp: + (JSC::Lexer::clear): Use clear() instead of resize(0). + +2008-11-30 Sam Weinig <sam@webkit.org> + + Reviewed by Mark Rowe. + + Renames jumps to m_jumps in JumpList. + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::JumpList::link): + (JSC::MacroAssembler::JumpList::linkTo): + (JSC::MacroAssembler::JumpList::append): + +2008-11-30 Antti Koivisto <antti@apple.com> + + Reviewed by Mark Rowe. + + https://bugs.webkit.org/show_bug.cgi?id=22557 + + Report free size in central and thread caches too. + + * wtf/FastMalloc.cpp: + (WTF::TCMallocStats::fastMallocStatistics): + * wtf/FastMalloc.h: + +2008-11-29 Antti Koivisto <antti@apple.com> + + Reviewed by Dan Bernstein. + + https://bugs.webkit.org/show_bug.cgi?id=22557 + Add statistics for JavaScript GC heap. + + * JavaScriptCore.exp: + * runtime/Collector.cpp: + (JSC::Heap::objectCount): + (JSC::addToStatistics): + (JSC::Heap::statistics): + * runtime/Collector.h: + +2008-11-29 Antti Koivisto <antti@apple.com> + + Fix debug build by adding a stub method. + + * wtf/FastMalloc.cpp: + (WTF::fastMallocStatistics): + +2008-11-29 Antti Koivisto <antti@apple.com> + + Reviewed by Alexey Proskuryakov. + + https://bugs.webkit.org/show_bug.cgi?id=22557 + + Add function for getting basic statistics from FastMalloc. + + * JavaScriptCore.exp: + * wtf/FastMalloc.cpp: + (WTF::DLL_Length): + (WTF::TCMalloc_PageHeap::ReturnedBytes): + (WTF::TCMallocStats::fastMallocStatistics): + * wtf/FastMalloc.h: + +2008-11-29 Cameron Zwarich <zwarich@apple.com> + + Not reviewed. + + The C++ standard does not automatically grant the friendships of an + enclosing class to its nested subclasses, so we should do so explicitly. + This fixes the GCC 4.0 build, although both GCC 4.2 and Visual C++ 2005 + accept the incorrect code as it is. + + * assembler/MacroAssembler.h: + +2008-11-29 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Cameron Zwarich. + + Add the class MacroAssembler to provide some abstraction of code generation, + and change WREC to make use of this class, rather than directly accessing + the X86Assembler. + + This patch also allows WREC to be compiled without the rest of the JIT enabled. + + * JavaScriptCore.xcodeproj/project.pbxproj: + * assembler/MacroAssembler.h: Added. + (JSC::MacroAssembler::): + (JSC::MacroAssembler::MacroAssembler): + (JSC::MacroAssembler::copyCode): + (JSC::MacroAssembler::Address::Address): + (JSC::MacroAssembler::ImplicitAddress::ImplicitAddress): + (JSC::MacroAssembler::BaseIndex::BaseIndex): + (JSC::MacroAssembler::Label::Label): + (JSC::MacroAssembler::Jump::Jump): + (JSC::MacroAssembler::Jump::link): + (JSC::MacroAssembler::Jump::linkTo): + (JSC::MacroAssembler::JumpList::link): + (JSC::MacroAssembler::JumpList::linkTo): + (JSC::MacroAssembler::JumpList::append): + (JSC::MacroAssembler::Imm32::Imm32): + (JSC::MacroAssembler::add32): + (JSC::MacroAssembler::or32): + (JSC::MacroAssembler::sub32): + (JSC::MacroAssembler::loadPtr): + (JSC::MacroAssembler::load32): + (JSC::MacroAssembler::load16): + (JSC::MacroAssembler::storePtr): + (JSC::MacroAssembler::store32): + (JSC::MacroAssembler::pop): + (JSC::MacroAssembler::push): + (JSC::MacroAssembler::peek): + (JSC::MacroAssembler::poke): + (JSC::MacroAssembler::move): + (JSC::MacroAssembler::compareImm32ForBranch): + (JSC::MacroAssembler::compareImm32ForBranchEquality): + (JSC::MacroAssembler::jae32): + (JSC::MacroAssembler::je32): + (JSC::MacroAssembler::je16): + (JSC::MacroAssembler::jg32): + (JSC::MacroAssembler::jge32): + (JSC::MacroAssembler::jl32): + (JSC::MacroAssembler::jle32): + (JSC::MacroAssembler::jne32): + (JSC::MacroAssembler::jump): + (JSC::MacroAssembler::breakpoint): + (JSC::MacroAssembler::ret): + * assembler/X86Assembler.h: + (JSC::X86Assembler::cmpw_rm): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::Interpreter): + * interpreter/Interpreter.h: + (JSC::Interpreter::assemblerBuffer): + * runtime/RegExp.cpp: + (JSC::RegExp::RegExp): + * wrec/WREC.cpp: + (JSC::WREC::Generator::compileRegExp): + * wrec/WREC.h: + * wrec/WRECFunctors.cpp: + (JSC::WREC::GeneratePatternCharacterFunctor::generateAtom): + (JSC::WREC::GenerateCharacterClassFunctor::generateAtom): + (JSC::WREC::GenerateBackreferenceFunctor::generateAtom): + (JSC::WREC::GenerateParenthesesNonGreedyFunctor::generateAtom): + * wrec/WRECFunctors.h: + (JSC::WREC::GenerateParenthesesNonGreedyFunctor::GenerateParenthesesNonGreedyFunctor): + * wrec/WRECGenerator.cpp: + (JSC::WREC::Generator::generateEnter): + (JSC::WREC::Generator::generateReturnSuccess): + (JSC::WREC::Generator::generateSaveIndex): + (JSC::WREC::Generator::generateIncrementIndex): + (JSC::WREC::Generator::generateLoadCharacter): + (JSC::WREC::Generator::generateJumpIfEndOfInput): + (JSC::WREC::Generator::generateJumpIfNotEndOfInput): + (JSC::WREC::Generator::generateReturnFailure): + (JSC::WREC::Generator::generateBacktrack1): + (JSC::WREC::Generator::generateBacktrackBackreference): + (JSC::WREC::Generator::generateBackreferenceQuantifier): + (JSC::WREC::Generator::generateNonGreedyQuantifier): + (JSC::WREC::Generator::generateGreedyQuantifier): + (JSC::WREC::Generator::generatePatternCharacter): + (JSC::WREC::Generator::generateCharacterClassInvertedRange): + (JSC::WREC::Generator::generateCharacterClassInverted): + (JSC::WREC::Generator::generateCharacterClass): + (JSC::WREC::Generator::generateParentheses): + (JSC::WREC::Generator::generateParenthesesNonGreedy): + (JSC::WREC::Generator::generateParenthesesResetTrampoline): + (JSC::WREC::Generator::generateAssertionBOL): + (JSC::WREC::Generator::generateAssertionEOL): + (JSC::WREC::Generator::generateAssertionWordBoundary): + (JSC::WREC::Generator::generateBackreference): + (JSC::WREC::Generator::terminateAlternative): + (JSC::WREC::Generator::terminateDisjunction): + * wrec/WRECGenerator.h: + (JSC::WREC::Generator::Generator): + * wrec/WRECParser.cpp: + (JSC::WREC::Parser::parsePatternCharacterQualifier): + (JSC::WREC::Parser::parseCharacterClassQuantifier): + (JSC::WREC::Parser::parseBackreferenceQuantifier): + (JSC::WREC::Parser::parseParentheses): + (JSC::WREC::Parser::parseCharacterClass): + (JSC::WREC::Parser::parseOctalEscape): + (JSC::WREC::Parser::parseEscape): + (JSC::WREC::Parser::parseTerm): + (JSC::WREC::Parser::parseDisjunction): + * wrec/WRECParser.h: + (JSC::WREC::Parser::Parser): + (JSC::WREC::Parser::parsePattern): + (JSC::WREC::Parser::parseAlternative): + * wtf/Platform.h: + +2008-11-28 Simon Hausmann <hausmann@webkit.org> + + Reviewed by Tor Arne Vestbø. + + Fix compilation on Windows CE + + Port away from the use of errno after calling strtol(), instead + detect conversion errors by checking the result and the stop + position. + + * runtime/DateMath.cpp: + (JSC::parseLong): + (JSC::parseDate): + +2008-11-28 Joerg Bornemann <joerg.bornemann@trolltech.com> + + Reviewed by Simon Hausmann. + + Implement lowResUTCTime() on Windows CE using GetSystemTime as _ftime() is not available. + + * runtime/DateMath.cpp: + (JSC::lowResUTCTime): + +2008-11-28 Simon Hausmann <hausmann@webkit.org> + + Rubber-stamped by Tor Arne Vestbø. + + Removed unnecessary inclusion of errno.h, which also fixes compilation on Windows CE. + + * runtime/JSGlobalObjectFunctions.cpp: + +2008-11-27 Cameron Zwarich <zwarich@apple.com> + + Not reviewed. + + r38825 made JSFunction::m_body private, but some inspector code in + WebCore sets the field. Add setters for it. + + * runtime/JSFunction.h: + (JSC::JSFunction::setBody): + +2008-11-27 Sam Weinig <sam@webkit.org> + + Reviewed by Cameron Zwarich. + + Fix FIXME by adding accessor for JSFunction's m_body property. + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::cti_op_call_JSFunction): + (JSC::Interpreter::cti_vm_dontLazyLinkCall): + (JSC::Interpreter::cti_vm_lazyLinkCall): + * profiler/Profiler.cpp: + (JSC::createCallIdentifierFromFunctionImp): + * runtime/Arguments.h: + (JSC::Arguments::getArgumentsData): + (JSC::Arguments::Arguments): + * runtime/FunctionPrototype.cpp: + (JSC::functionProtoFuncToString): + * runtime/JSFunction.h: + (JSC::JSFunction::JSFunction): + (JSC::JSFunction::body): + +2008-11-27 Sam Weinig <sam@webkit.org> + + Reviewed by Oliver Hunt. + + Remove unused member variables from ProgramNode. + + * parser/Nodes.h: + +2008-11-27 Brent Fulgham <bfulgham@gmail.com> + + Reviewed by Alexey Proskuryakov. + + Enable mouse panning feaure on Windows Cairo build. + See http://bugs.webkit.org/show_bug.cgi?id=22525 + + * wtf/Platform.h: Enable mouse panning feaure on Windows Cairo build. + +2008-11-27 Alp Toker <alp@nuanti.com> + + Change recently introduced C++ comments in Platform.h to C comments to + fix the minidom build with traditional C. + + Build GtkLauncher and minidom with the '-ansi' compiler flag to detect + API header breakage at build time. + + * GNUmakefile.am: + * wtf/Platform.h: + +2008-11-27 Alp Toker <alp@nuanti.com> + + Remove C++ comment from JavaScriptCore API headers (introduced r35449). + Fixes build for ANSI C applications using the public API. + + * API/WebKitAvailability.h: + +2008-11-26 Eric Seidel <eric@webkit.org> + + No review, build fix only. + + Fix the JSC Chromium Mac build by adding JavaScriptCore/icu into the include path + + * JavaScriptCore.scons: + +2008-11-25 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Maciej Stachowiak. + + Remove the unused member function JSFunction::getParameterName(). + + * runtime/JSFunction.cpp: + * runtime/JSFunction.h: + +2008-11-24 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Polymorpic caching for get by id chain. Similar to the polymorphic caching already implemented + for self and proto accesses (implemented by allowing multiple trampolines to be JIT genertaed, + and linked together) - the get by id chain caching is implemented as a genericization of the + proto list caching, allowing cached access lists to contain a mix of proto and proto chain + accesses (since in JS style inheritance hierarchies you may commonly see a mix of properties + being overridden on the direct prototype, or higher up its prototype chain). + + In order to allow this patch to compile there is a fix to appease gcc 4.2 compiler issues + (removing the jumps between fall-through cases in privateExecute). + + This patch also removes redundant immediate checking from the reptach code, and fixes a related + memory leak (failure to deallocate trampolines). + + ~2% progression on v8 tests (bulk on the win on deltablue) + + * bytecode/Instruction.h: + (JSC::PolymorphicAccessStructureList::PolymorphicStubInfo::): + (JSC::PolymorphicAccessStructureList::PolymorphicStubInfo::set): + (JSC::PolymorphicAccessStructureList::PolymorphicAccessStructureList): + (JSC::PolymorphicAccessStructureList::derefStructures): + * interpreter/Interpreter.cpp: + (JSC::countPrototypeChainEntriesAndCheckForProxies): + (JSC::Interpreter::tryCacheGetByID): + (JSC::Interpreter::privateExecute): + (JSC::Interpreter::tryCTICacheGetByID): + (JSC::Interpreter::cti_op_get_by_id_self_fail): + (JSC::getPolymorphicAccessStructureListSlot): + (JSC::Interpreter::cti_op_get_by_id_proto_list): + * interpreter/Interpreter.h: + * jit/JIT.cpp: + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdSelfList): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChainList): + (JSC::JIT::privateCompileGetByIdChain): + (JSC::JIT::privateCompilePatchGetArrayLength): + * jit/JIT.h: + (JSC::JIT::compileGetByIdChainList): + +2008-11-25 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Alexey Proskuryakov. + + Move the collect() call in Heap::heapAllocate() that is conditionally + compiled under COLLECT_ON_EVERY_ALLOCATION so that it is before we get + information about the heap. This was causing assertion failures for me + while I was reducing a bug. + + * runtime/Collector.cpp: + (JSC::Heap::heapAllocate): + +2008-11-24 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Geoff Garen. + + Bug 13790: Function declarations are not treated as statements (used to affect starcraft2.com) + <https://bugs.webkit.org/show_bug.cgi?id=13790> + + Modify the parser to treat function declarations as statements, + simplifying the grammar in the process. Technically, according to the + grammar in the ECMA spec, function declarations are not statements and + can not be used everywhere that statements can, but it is not worth the + possibility compatibility issues just to stick to the spec in this case. + + * parser/Grammar.y: + * parser/Nodes.cpp: + (JSC::FuncDeclNode::emitBytecode): Avoid returning ignoredResult() + as a result, because it causes a crash in DoWhileNode::emitBytecode(). + +2008-11-24 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Unroll the regexp matching loop by 1. 10% speedup on simple matching + stress test. No change on SunSpider. + + (I decided not to unroll to arbitrary levels because the returns diminsh + quickly.) + + * wrec/WREC.cpp: + (JSC::WREC::compileRegExp): + * wrec/WRECGenerator.cpp: + (JSC::WREC::Generator::generateJumpIfEndOfInput): + (JSC::WREC::Generator::generateJumpIfNotEndOfInput): + * wrec/WRECGenerator.h: + * wrec/WRECParser.h: + (JSC::WREC::Parser::error): + (JSC::WREC::Parser::parsePattern): + +2008-11-24 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Removed some unnecessary "Generator::" prefixes. + + * wrec/WRECGenerator.cpp: + (JSC::WREC::Generator::generateEnter): + (JSC::WREC::Generator::generateReturnSuccess): + (JSC::WREC::Generator::generateSaveIndex): + (JSC::WREC::Generator::generateIncrementIndex): + (JSC::WREC::Generator::generateLoopIfNotEndOfInput): + (JSC::WREC::Generator::generateReturnFailure): + +2008-11-24 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Made a bunch of WREC::Parser functions private, and added an explicit + "reset()" function, so a parser can be reused. + + * wrec/WRECParser.h: + (JSC::WREC::Parser::Parser): + (JSC::WREC::Parser::generator): + (JSC::WREC::Parser::ignoreCase): + (JSC::WREC::Parser::multiline): + (JSC::WREC::Parser::recordSubpattern): + (JSC::WREC::Parser::numSubpatterns): + (JSC::WREC::Parser::parsePattern): + (JSC::WREC::Parser::parseAlternative): + (JSC::WREC::Parser::reset): + +2008-11-24 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Cameron Zwarich. + + Implement repatching for get by id chain. + Previously the access is performed in a function stub, in the repatch form + the trampoline is not called to; instead the hot path is relinked to jump + directly to the trampoline, if it fails it will jump to the slow case. + + https://bugs.webkit.org/show_bug.cgi?id=22449 + 3% progression on deltablue. + + * jit/JIT.cpp: + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdChain): + +2008-11-24 Joerg Bornemann <joerg.bornemann@trolltech.com> + + Reviewed by Simon Hausmann. + + https://bugs.webkit.org/show_bug.cgi?id=20746 + + Various small compilation fixes to make the Qt port of WebKit + compile on Windows CE. + + * config.h: Don't set _CRT_RAND_S for CE, it's not available. + * jsc.cpp: Disabled use of debugger includes for CE. It + does not have the debugging functions. + * runtime/DateMath.cpp: Use localtime() on Windows CE. + * wtf/Assertions.cpp: Compile on Windows CE without debugger. + * wtf/Assertions.h: Include windows.h before defining ASSERT. + * wtf/MathExtras.h: Include stdlib.h instead of xmath.h. + * wtf/Platform.h: Disable ERRNO_H and detect endianess based + on the Qt endianess. On Qt for Windows CE the endianess is + defined by the vendor specific build spec. + * wtf/Threading.h: Use the volatile-less atomic functions. + * wtf/dtoa.cpp: Compile without errno. + * wtf/win/MainThreadWin.cpp: Don't include windows.h on CE after + Assertions.h due to the redefinition of ASSERT. + +2008-11-22 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Cameron Zwarich. + + Replace accidentally deleted immediate check from get by id chain trampoline. + https://bugs.webkit.org/show_bug.cgi?id=22413 + + * jit/JIT.cpp: + (JSC::JIT::privateCompileGetByIdChain): + +2008-11-21 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Add (really) polymorphic caching for get by id self. + Very similar to caching of prototype accesses, described below. + + Oh, also, probably shouldn't have been leaking those structure list objects. + + 4% preogression on deltablue. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): + (JSC::CodeBlock::derefStructures): + (JSC::PrototypeStructureList::derefStructures): + * bytecode/Instruction.h: + * bytecode/Opcode.h: + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): + (JSC::Interpreter::cti_op_get_by_id_self_fail): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileGetByIdSelfList): + (JSC::JIT::patchGetByIdSelf): + * jit/JIT.h: + (JSC::JIT::compileGetByIdSelfList): + +2008-11-21 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Fixed many crashes seen 'round the world (but only in release builds). + + Update outputParameter offset to reflect slight re-ordering of push + instructions in r38669. + + * wrec/WRECGenerator.cpp: + +2008-11-21 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + A little more RegExp refactoring. + + Deployed a helper function for reading the next character. Used the "link + vector of jumps" helper in a place I missed before. + + * wrec/WRECGenerator.cpp: + (JSC::WREC::Generator::generateLoadCharacter): + (JSC::WREC::Generator::generatePatternCharacter): + (JSC::WREC::Generator::generateCharacterClass): + (JSC::WREC::Generator::generateAssertionEOL): + (JSC::WREC::Generator::generateAssertionWordBoundary): + * wrec/WRECGenerator.h: + +2008-11-21 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Dan Bernstein. + + https://bugs.webkit.org/show_bug.cgi?id=22402 + Replace abort() with CRASH() + + * wtf/Assertions.h: Added a different method to crash, which should work even is 0xbbadbeef + is a valid memory address. + + * runtime/Collector.cpp: + * wtf/FastMalloc.cpp: + * wtf/FastMalloc.h: + * wtf/TCSpinLock.h: + Replace abort() with CRASH(). + +2008-11-21 Alexey Proskuryakov <ap@webkit.org> + + Reverted fix for bug 22042 (Replace abort() with CRASH()), because it was breaking + FOR_EACH_OPCODE_ID macro somehow, making Safari crash. + + * runtime/Collector.cpp: + (JSC::Heap::heapAllocate): + (JSC::Heap::collect): + * wtf/Assertions.h: + * wtf/FastMalloc.cpp: + (WTF::fastMalloc): + (WTF::fastCalloc): + (WTF::fastRealloc): + (WTF::InitSizeClasses): + (WTF::PageHeapAllocator::New): + (WTF::TCMallocStats::do_malloc): + * wtf/FastMalloc.h: + * wtf/TCSpinLock.h: + (TCMalloc_SpinLock::Init): + (TCMalloc_SpinLock::Finalize): + (TCMalloc_SpinLock::Lock): + (TCMalloc_SpinLock::Unlock): + +2008-11-21 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + A little more RegExp refactoring. + + Moved all assembly from WREC.cpp into WRECGenerator helper functions. + This should help with portability and readability. + + Removed ASSERTs after calls to executableCopy(), and changed + executableCopy() to ASSERT instead. + + * assembler/X86Assembler.h: + (JSC::X86Assembler::executableCopy): + * jit/JIT.cpp: + (JSC::JIT::privateCompile): + (JSC::JIT::privateCompileGetByIdSelf): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdChain): + (JSC::JIT::privateCompilePutByIdReplace): + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::privateCompileCTIMachineTrampolines): + (JSC::JIT::privateCompilePatchGetArrayLength): + * wrec/WREC.cpp: + (JSC::WREC::compileRegExp): + * wrec/WRECGenerator.cpp: + (JSC::WREC::Generator::generateEnter): + (JSC::WREC::Generator::generateReturnSuccess): + (JSC::WREC::Generator::generateSaveIndex): + (JSC::WREC::Generator::generateIncrementIndex): + (JSC::WREC::Generator::generateLoopIfNotEndOfInput): + (JSC::WREC::Generator::generateReturnFailure): + * wrec/WRECGenerator.h: + * wrec/WRECParser.h: + (JSC::WREC::Parser::ignoreCase): + (JSC::WREC::Parser::generator): + +2008-11-21 Alexey Proskuryakov <ap@webkit.org> + + Build fix. + + * wtf/Assertions.h: Use ::abort for C++ code. + +2008-11-21 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Sam Weinig. + + https://bugs.webkit.org/show_bug.cgi?id=22402 + Replace abort() with CRASH() + + * wtf/Assertions.h: Added abort() after an attempt to crash for extra safety. + + * runtime/Collector.cpp: + * wtf/FastMalloc.cpp: + * wtf/FastMalloc.h: + * wtf/TCSpinLock.h: + Replace abort() with CRASH(). + +2008-11-21 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Renamed wrec => generator. + + * wrec/WRECFunctors.cpp: + (JSC::WREC::GeneratePatternCharacterFunctor::generateAtom): + (JSC::WREC::GeneratePatternCharacterFunctor::backtrack): + (JSC::WREC::GenerateCharacterClassFunctor::generateAtom): + (JSC::WREC::GenerateCharacterClassFunctor::backtrack): + (JSC::WREC::GenerateBackreferenceFunctor::generateAtom): + (JSC::WREC::GenerateBackreferenceFunctor::backtrack): + (JSC::WREC::GenerateParenthesesNonGreedyFunctor::generateAtom): + +2008-11-19 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Darin Adler. + + Add support for (really) polymorphic caching of prototype accesses. + + If a cached prototype access misses, cti_op_get_by_id_proto_list is called. + When this occurs the Structure pointers from the instruction stream are copied + off into a new ProtoStubInfo object. A second prototype access trampoline is + generated, and chained onto the first. Subsequent missed call to + cti_op_get_by_id_proto_list_append, which append futher new trampolines, up to + PROTOTYPE_LIST_CACHE_SIZE (currently 4). If any of the misses result in an + access other than to a direct prototype property, list formation is halted (or + for the initial miss, does not take place at all). + + Separate fail case functions are provided for each access since this contributes + to the performance progression (enables better processor branch prediction). + + Overall this is a near 5% progression on v8, with around 10% wins on richards + and deltablue. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): + (JSC::CodeBlock::derefStructures): + * bytecode/Instruction.h: + (JSC::ProtoStructureList::ProtoStubInfo::set): + (JSC::ProtoStructureList::ProtoStructureList): + (JSC::Instruction::Instruction): + (JSC::Instruction::): + * bytecode/Opcode.h: + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): + (JSC::Interpreter::tryCTICacheGetByID): + (JSC::Interpreter::cti_op_put_by_id_fail): + (JSC::Interpreter::cti_op_get_by_id_self_fail): + (JSC::Interpreter::cti_op_get_by_id_proto_list): + (JSC::Interpreter::cti_op_get_by_id_proto_list_append): + (JSC::Interpreter::cti_op_get_by_id_proto_list_full): + (JSC::Interpreter::cti_op_get_by_id_proto_fail): + (JSC::Interpreter::cti_op_get_by_id_chain_fail): + (JSC::Interpreter::cti_op_get_by_id_array_fail): + (JSC::Interpreter::cti_op_get_by_id_string_fail): + * interpreter/Interpreter.h: + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileGetByIdSelf): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChain): + (JSC::JIT::privateCompileCTIMachineTrampolines): + (JSC::JIT::privateCompilePatchGetArrayLength): + * jit/JIT.h: + (JSC::JIT::compileGetByIdProtoList): + +2008-11-20 Sam Weinig <sam@webkit.org> + + Try and fix the tiger build. + + * parser/Grammar.y: + +2008-11-20 Eric Seidel <eric@webkit.org> + + Reviewed by Darin Adler. + + Make JavaScriptCore Chromium build under Windows (cmd only, cygwin almost works) + https://bugs.webkit.org/show_bug.cgi?id=22347 + + * JavaScriptCore.scons: + * parser/Parser.cpp: Add using std::auto_ptr since we use auto_ptr + +2008-11-20 Steve Falkenburg <sfalken@apple.com> + + Fix build. + + Reviewed by Sam Weinig. + + * parser/Parser.cpp: + (JSC::Parser::reparse): + +2008-11-20 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + A little more RegExp refactoring. + + Created a helper function in the assembler for linking a vector of + JmpSrc to a location, and deployed it in a bunch of places. + + * JavaScriptCore.xcodeproj/project.pbxproj: + * assembler/X86Assembler.h: + (JSC::X86Assembler::link): + * wrec/WREC.cpp: + (JSC::WREC::compileRegExp): + * wrec/WRECGenerator.cpp: + (JSC::WREC::Generator::generateNonGreedyQuantifier): + (JSC::WREC::Generator::generateGreedyQuantifier): + (JSC::WREC::Generator::generateCharacterClassInverted): + (JSC::WREC::Generator::generateParentheses): + (JSC::WREC::Generator::generateParenthesesResetTrampoline): + (JSC::WREC::Generator::generateAssertionBOL): + (JSC::WREC::Generator::generateAssertionEOL): + (JSC::WREC::Generator::generateAssertionWordBoundary): + (JSC::WREC::Generator::terminateAlternative): + (JSC::WREC::Generator::terminateDisjunction): + * wrec/WRECParser.cpp: + * wrec/WRECParser.h: + (JSC::WREC::Parser::consumeHex): + +2008-11-20 Sam Weinig <sam@webkit.org> + + Fix non-mac builds. + + * parser/Lexer.cpp: + * parser/Parser.cpp: + +2008-11-20 Sam Weinig <sam@webkit.org> + + Reviewed by Darin Adler. + + Patch for https://bugs.webkit.org/show_bug.cgi?id=22385 + <rdar://problem/6390179> + Lazily reparse FunctionBodyNodes on first execution. + + - Saves 57MB on Membuster head. + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::generate): Remove vector shrinking since this is now + handled by destroying the ScopeNodeData after generation. + + * parser/Grammar.y: Add alternate NoNode version of the grammar + that does not create nodes. This is used to lazily create FunctionBodyNodes + on first execution. + + * parser/Lexer.cpp: + (JSC::Lexer::setCode): Fix bug where on reparse, the Lexer was confused about + what position and length meant. Position is the current position in the original + data buffer (important for getting correct line/column information) and length + the end offset in the original buffer. + * parser/Lexer.h: + (JSC::Lexer::sourceCode): Positions are relative to the beginning of the buffer. + + * parser/Nodes.cpp: + (JSC::ScopeNodeData::ScopeNodeData): Move initialization of ScopeNode data here. + (JSC::ScopeNode::ScopeNode): Add constructor that only sets the JSGlobalData + for FunctionBodyNode stubs. + (JSC::ScopeNode::~ScopeNode): Release m_children now that we don't inherit from + BlockNode. + (JSC::ScopeNode::releaseNodes): Ditto. + (JSC::EvalNode::generateBytecode): Only shrink m_children, as we need to keep around + the rest of the data. + (JSC::FunctionBodyNode::FunctionBodyNode): Add constructor that only sets the + JSGlobalData. + (JSC::FunctionBodyNode::create): Ditto. + (JSC::FunctionBodyNode::generateBytecode): If we don't have the data, do a reparse + to construct it. Then after generation, destroy the data. + (JSC::ProgramNode::generateBytecode): After generation, destroy the AST data. + * parser/Nodes.h: + (JSC::ExpressionNode::): Add isFuncExprNode for FunctionConstructor. + (JSC::StatementNode::): Add isExprStatementNode for FunctionConstructor. + (JSC::ExprStatementNode::): Ditto. + (JSC::ExprStatementNode::expr): Add accessor for FunctionConstructor. + (JSC::FuncExprNode::): Add isFuncExprNode for FunctionConstructor + + (JSC::ScopeNode::adoptData): Adopts a ScopeNodeData. + (JSC::ScopeNode::data): Accessor for ScopeNodeData. + (JSC::ScopeNode::destroyData): Deletes the ScopeNodeData. + (JSC::ScopeNode::setFeatures): Added. + (JSC::ScopeNode::varStack): Added assert. + (JSC::ScopeNode::functionStack): Ditto. + (JSC::ScopeNode::children): Ditto. + (JSC::ScopeNode::neededConstants): Ditto. + Factor m_varStack, m_functionStack, m_children and m_numConstants into ScopeNodeData. + + * parser/Parser.cpp: + (JSC::Parser::reparse): Reparse the SourceCode in the FunctionBodyNode and set + set up the ScopeNodeData for it. + * parser/Parser.h: + + * parser/SourceCode.h: + (JSC::SourceCode::endOffset): Added for use in the lexer. + + * runtime/FunctionConstructor.cpp: + (JSC::getFunctionBody): Assuming a ProgramNode with one FunctionExpression in it, + get the FunctionBodyNode. Any issues signifies a parse failure in constructFunction. + (JSC::constructFunction): Make parsing functions in the form new Function(""), easier + by concatenating the strings together (with some glue) and parsing the function expression + as a ProgramNode from which we can receive the FunctionBodyNode. This has the added benefit + of not having special parsing code for the arguments and lazily constructing the + FunctionBodyNode's AST on first execution. + + * runtime/Identifier.h: + (JSC::operator!=): Added. + +2008-11-20 Sam Weinig <sam@webkit.org> + + Reviewed by Geoffrey Garen. + + Speedup the lexer to offset coming re-parsing patch. + + - .6% progression on Sunspider. + + * bytecompiler/SegmentedVector.h: + (JSC::SegmentedVector::shrink): Fixed bug where m_size would not be + set when shrinking to 0. + + * parser/Lexer.cpp: + (JSC::Lexer::Lexer): + (JSC::Lexer::isIdentStart): Use isASCIIAlpha and isASCII to avoid going into ICU in the common cases. + (JSC::Lexer::isIdentPart): Use isASCIIAlphanumeric and isASCII to avoid going into ICU in the common cases + (JSC::isDecimalDigit): Use version in ASCIICType.h. Inlining it was a regression. + (JSC::Lexer::isHexDigit): Ditto. + (JSC::Lexer::isOctalDigit): Ditto. + (JSC::Lexer::clear): Resize the m_identifiers SegmentedVector to initial + capacity + * parser/Lexer.h: Remove unused m_strings vector. Make m_identifiers + a SegmentedVector<Identifier> to avoid allocating a new Identifier* for + each identifier found. The SegmentedVector is need so we can passes + references to the Identifier to the parser, which remain valid even when + the vector is resized. + (JSC::Lexer::makeIdentifier): Inline and return a reference to the added + Identifier. + +2008-11-20 Sam Weinig <sam@webkit.org> + + Reviewed by Darin Adler. + + Add isASCII to ASCIICType. Use coming soon! + + * wtf/ASCIICType.h: + (WTF::isASCII): + +2008-11-20 Sam Weinig <sam@webkit.org> + + Reviewed by Darin Adler. + + Add OwnPtr constructor and OwnPtr::adopt that take an auto_ptr. + + * wtf/OwnPtr.h: + (WTF::OwnPtr::OwnPtr): + (WTF::OwnPtr::adopt): + +2008-11-20 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=22364 + Crashes seen on Tiger buildbots due to worker threads exhausting pthread keys + + * runtime/Collector.cpp: + (JSC::Heap::Heap): + (JSC::Heap::destroy): + (JSC::Heap::makeUsableFromMultipleThreads): + (JSC::Heap::registerThread): + * runtime/Collector.h: + Pthread key for tracking threads is only created on request now, because this is a limited + resource, and thread tracking is not needed for worker heaps, or for WebCore heap. + + * API/JSContextRef.cpp: (JSGlobalContextCreateInGroup): Call makeUsableFromMultipleThreads(). + + * runtime/JSGlobalData.cpp: (JSC::JSGlobalData::sharedInstance): Ditto. + + * runtime/JSGlobalData.h: (JSC::JSGlobalData::makeUsableFromMultipleThreads): Just forward + the call to Heap, which clients need not know about, ideally. + +2008-11-20 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + A little more WREC refactoring. + + Removed the "Register" suffix from register names in WREC, and renamed: + currentPosition => index + currentValue => character + quantifierCount => repeatCount + + Added a top-level parsePattern function to the WREC parser, which + allowed me to remove the error() and atEndOfPattern() accessors. + + Factored out an MSVC customization into a constant. + + Renamed nextLabel => beginPattern. + + * wrec/WREC.cpp: + (JSC::WREC::compileRegExp): + * wrec/WRECGenerator.cpp: + (JSC::WREC::Generator::generateBacktrack1): + (JSC::WREC::Generator::generateBacktrackBackreference): + (JSC::WREC::Generator::generateBackreferenceQuantifier): + (JSC::WREC::Generator::generateNonGreedyQuantifier): + (JSC::WREC::Generator::generateGreedyQuantifier): + (JSC::WREC::Generator::generatePatternCharacter): + (JSC::WREC::Generator::generateCharacterClassInvertedRange): + (JSC::WREC::Generator::generateCharacterClassInverted): + (JSC::WREC::Generator::generateCharacterClass): + (JSC::WREC::Generator::generateParentheses): + (JSC::WREC::Generator::generateParenthesesResetTrampoline): + (JSC::WREC::Generator::generateAssertionBOL): + (JSC::WREC::Generator::generateAssertionEOL): + (JSC::WREC::Generator::generateAssertionWordBoundary): + (JSC::WREC::Generator::generateBackreference): + (JSC::WREC::Generator::generateDisjunction): + (JSC::WREC::Generator::terminateDisjunction): + * wrec/WRECGenerator.h: + * wrec/WRECParser.h: + (JSC::WREC::Parser::parsePattern): + +2008-11-19 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=22361 + A little more RegExp refactoring. + + Consistently named variables holding the starting position at which + regexp matching should begin to "startOffset". + + A few more "regExpObject" => "regExpConstructor" changes. + + Refactored RegExpObject::match for clarity, and replaced a slow "get" + of the "global" property with a fast access to the global bit. + + Made the error message you see when RegExpObject::match has no input a + little more informative, as in Firefox. + + * runtime/RegExp.cpp: + (JSC::RegExp::match): + * runtime/RegExp.h: + * runtime/RegExpObject.cpp: + (JSC::RegExpObject::match): + * runtime/StringPrototype.cpp: + (JSC::stringProtoFuncReplace): + (JSC::stringProtoFuncMatch): + (JSC::stringProtoFuncSearch): + +2008-11-19 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + A little more refactoring. + + Removed the "emit" and "emitUnlinked" prefixes from the assembler. + + Moved the JmpSrc and JmpDst class definitions to the top of the X86 + assembler class, in accordance with WebKit style guidelines. + + * assembler/X86Assembler.h: + (JSC::X86Assembler::JmpSrc::JmpSrc): + (JSC::X86Assembler::JmpDst::JmpDst): + (JSC::X86Assembler::int3): + (JSC::X86Assembler::pushl_m): + (JSC::X86Assembler::popl_m): + (JSC::X86Assembler::movl_rr): + (JSC::X86Assembler::addl_rr): + (JSC::X86Assembler::addl_i8r): + (JSC::X86Assembler::addl_i8m): + (JSC::X86Assembler::addl_i32r): + (JSC::X86Assembler::addl_mr): + (JSC::X86Assembler::andl_rr): + (JSC::X86Assembler::andl_i32r): + (JSC::X86Assembler::cmpl_i8r): + (JSC::X86Assembler::cmpl_rr): + (JSC::X86Assembler::cmpl_rm): + (JSC::X86Assembler::cmpl_mr): + (JSC::X86Assembler::cmpl_i32r): + (JSC::X86Assembler::cmpl_i32m): + (JSC::X86Assembler::cmpl_i8m): + (JSC::X86Assembler::cmpw_rm): + (JSC::X86Assembler::orl_rr): + (JSC::X86Assembler::orl_mr): + (JSC::X86Assembler::orl_i32r): + (JSC::X86Assembler::subl_rr): + (JSC::X86Assembler::subl_i8r): + (JSC::X86Assembler::subl_i8m): + (JSC::X86Assembler::subl_i32r): + (JSC::X86Assembler::subl_mr): + (JSC::X86Assembler::testl_i32r): + (JSC::X86Assembler::testl_i32m): + (JSC::X86Assembler::testl_rr): + (JSC::X86Assembler::xorl_i8r): + (JSC::X86Assembler::xorl_rr): + (JSC::X86Assembler::sarl_i8r): + (JSC::X86Assembler::sarl_CLr): + (JSC::X86Assembler::shl_i8r): + (JSC::X86Assembler::shll_CLr): + (JSC::X86Assembler::imull_rr): + (JSC::X86Assembler::imull_i32r): + (JSC::X86Assembler::idivl_r): + (JSC::X86Assembler::negl_r): + (JSC::X86Assembler::movl_mr): + (JSC::X86Assembler::movzbl_rr): + (JSC::X86Assembler::movzwl_mr): + (JSC::X86Assembler::movl_rm): + (JSC::X86Assembler::movl_i32r): + (JSC::X86Assembler::movl_i32m): + (JSC::X86Assembler::leal_mr): + (JSC::X86Assembler::jmp_r): + (JSC::X86Assembler::jmp_m): + (JSC::X86Assembler::movsd_mr): + (JSC::X86Assembler::xorpd_mr): + (JSC::X86Assembler::movsd_rm): + (JSC::X86Assembler::movd_rr): + (JSC::X86Assembler::cvtsi2sd_rr): + (JSC::X86Assembler::cvttsd2si_rr): + (JSC::X86Assembler::addsd_mr): + (JSC::X86Assembler::subsd_mr): + (JSC::X86Assembler::mulsd_mr): + (JSC::X86Assembler::addsd_rr): + (JSC::X86Assembler::subsd_rr): + (JSC::X86Assembler::mulsd_rr): + (JSC::X86Assembler::ucomis_rr): + (JSC::X86Assembler::pextrw_irr): + (JSC::X86Assembler::call): + (JSC::X86Assembler::jmp): + (JSC::X86Assembler::jne): + (JSC::X86Assembler::jnz): + (JSC::X86Assembler::je): + (JSC::X86Assembler::jl): + (JSC::X86Assembler::jb): + (JSC::X86Assembler::jle): + (JSC::X86Assembler::jbe): + (JSC::X86Assembler::jge): + (JSC::X86Assembler::jg): + (JSC::X86Assembler::ja): + (JSC::X86Assembler::jae): + (JSC::X86Assembler::jo): + (JSC::X86Assembler::jp): + (JSC::X86Assembler::js): + (JSC::X86Assembler::predictNotTaken): + (JSC::X86Assembler::convertToFastCall): + (JSC::X86Assembler::restoreArgumentReference): + (JSC::X86Assembler::restoreArgumentReferenceForTrampoline): + (JSC::X86Assembler::modRm_rr): + (JSC::X86Assembler::modRm_rr_Unchecked): + (JSC::X86Assembler::modRm_rm): + (JSC::X86Assembler::modRm_rm_Unchecked): + (JSC::X86Assembler::modRm_rmsib): + (JSC::X86Assembler::modRm_opr): + (JSC::X86Assembler::modRm_opr_Unchecked): + (JSC::X86Assembler::modRm_opm): + (JSC::X86Assembler::modRm_opm_Unchecked): + (JSC::X86Assembler::modRm_opmsib): + * jit/JIT.cpp: + (JSC::JIT::emitNakedCall): + (JSC::JIT::emitNakedFastCall): + (JSC::JIT::emitCTICall): + (JSC::JIT::emitJumpSlowCaseIfNotJSCell): + (JSC::JIT::emitJumpSlowCaseIfNotImmNum): + (JSC::JIT::emitFastArithDeTagImmediateJumpIfZero): + (JSC::JIT::emitFastArithIntToImmOrSlowCase): + (JSC::JIT::emitArithIntToImmWithJump): + (JSC::JIT::compileOpCall): + (JSC::JIT::compileOpStrictEq): + (JSC::JIT::emitSlowScriptCheck): + (JSC::JIT::putDoubleResultToJSNumberCellOrJSImmediate): + (JSC::JIT::compileBinaryArithOp): + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + (JSC::JIT::privateCompile): + (JSC::JIT::privateCompileGetByIdSelf): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdChain): + (JSC::JIT::privateCompilePutByIdReplace): + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::privateCompileCTIMachineTrampolines): + (JSC::JIT::privateCompilePatchGetArrayLength): + * wrec/WREC.cpp: + (JSC::WREC::compileRegExp): + * wrec/WRECGenerator.cpp: + (JSC::WREC::Generator::generateBackreferenceQuantifier): + (JSC::WREC::Generator::generateNonGreedyQuantifier): + (JSC::WREC::Generator::generateGreedyQuantifier): + (JSC::WREC::Generator::generatePatternCharacter): + (JSC::WREC::Generator::generateCharacterClassInvertedRange): + (JSC::WREC::Generator::generateCharacterClassInverted): + (JSC::WREC::Generator::generateCharacterClass): + (JSC::WREC::Generator::generateParentheses): + (JSC::WREC::Generator::generateParenthesesNonGreedy): + (JSC::WREC::Generator::generateParenthesesResetTrampoline): + (JSC::WREC::Generator::generateAssertionBOL): + (JSC::WREC::Generator::generateAssertionEOL): + (JSC::WREC::Generator::generateAssertionWordBoundary): + (JSC::WREC::Generator::generateBackreference): + (JSC::WREC::Generator::generateDisjunction): + +2008-11-19 Simon Hausmann <hausmann@webkit.org> + + Sun CC build fix, removed trailing comman for last enum value. + + * wtf/unicode/qt4/UnicodeQt4.h: + (WTF::Unicode::): + +2008-11-19 Mark Rowe <mrowe@apple.com> + + Reviewed by Alexey Proskuryakov. + + Expand the workaround for Apple GCC compiler bug <rdar://problem/6354696> to all versions of GCC 4.0.1. + It has been observed with builds 5465 (Xcode 3.0) and 5484 (Xcode 3.1), and there is no evidence + that it has been fixed in newer builds of GCC 4.0.1. + + This addresses <https://bugs.webkit.org/show_bug.cgi?id=22351> (WebKit nightly crashes on launch on 10.4.11). + + * wtf/StdLibExtras.h: + +2008-11-18 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Maciej Stachowiak and Geoff Garen. + + Bug 22287: ASSERTION FAILED: Not enough jumps linked in slow case codegen in CTI::privateCompileSlowCases()) + <https://bugs.webkit.org/show_bug.cgi?id=22287> + + Fix a typo in the number cell reuse code where the first and second + operands are sometimes confused. + + * jit/JIT.cpp: + (JSC::JIT::compileBinaryArithOpSlowCase): + +2008-11-18 Dan Bernstein <mitz@apple.com> + + - try to fix the Windows build + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): + +2008-11-18 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Minor RegExp cleanup. + + SunSpider says no change. + + * runtime/RegExpObject.cpp: + (JSC::RegExpObject::match): Renamed "regExpObj" to "regExpConstructor". + + * wrec/WREC.cpp: + (JSC::WREC::compileRegExp): Instead of checking for a NULL output vector, + ASSERT that the output vector is not NULL. (The rest of WREC is not + safe to use with a NULL output vector, and we probably don't want to + spend the time and/or performance to make it safe.) + +2008-11-18 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Darin Adler. + + A little more renaming and refactoring. + + VM_CHECK_EXCEPTION() => CHECK_FOR_EXCEPTION(). + NEXT_INSTRUCTION => NEXT_INSTRUCTION(). + + Removed the "Error_" and "TempError_" prefixes from WREC error types. + + Refactored the WREC parser so it doesn't need a "setError" function, + and changed "isEndOfPattern" and its use -- they read kind of backwards + before. + + Changed our "TODO:" error messages at least to say something, since you + can't say "TODO:" in shipping software. + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): + (JSC::Interpreter::cti_op_convert_this): + (JSC::Interpreter::cti_op_add): + (JSC::Interpreter::cti_op_pre_inc): + (JSC::Interpreter::cti_op_loop_if_less): + (JSC::Interpreter::cti_op_loop_if_lesseq): + (JSC::Interpreter::cti_op_put_by_id): + (JSC::Interpreter::cti_op_put_by_id_second): + (JSC::Interpreter::cti_op_put_by_id_generic): + (JSC::Interpreter::cti_op_put_by_id_fail): + (JSC::Interpreter::cti_op_get_by_id): + (JSC::Interpreter::cti_op_get_by_id_second): + (JSC::Interpreter::cti_op_get_by_id_generic): + (JSC::Interpreter::cti_op_get_by_id_fail): + (JSC::Interpreter::cti_op_instanceof): + (JSC::Interpreter::cti_op_del_by_id): + (JSC::Interpreter::cti_op_mul): + (JSC::Interpreter::cti_op_call_NotJSFunction): + (JSC::Interpreter::cti_op_resolve): + (JSC::Interpreter::cti_op_construct_NotJSConstruct): + (JSC::Interpreter::cti_op_get_by_val): + (JSC::Interpreter::cti_op_resolve_func): + (JSC::Interpreter::cti_op_sub): + (JSC::Interpreter::cti_op_put_by_val): + (JSC::Interpreter::cti_op_put_by_val_array): + (JSC::Interpreter::cti_op_lesseq): + (JSC::Interpreter::cti_op_loop_if_true): + (JSC::Interpreter::cti_op_negate): + (JSC::Interpreter::cti_op_resolve_skip): + (JSC::Interpreter::cti_op_resolve_global): + (JSC::Interpreter::cti_op_div): + (JSC::Interpreter::cti_op_pre_dec): + (JSC::Interpreter::cti_op_jless): + (JSC::Interpreter::cti_op_not): + (JSC::Interpreter::cti_op_jtrue): + (JSC::Interpreter::cti_op_post_inc): + (JSC::Interpreter::cti_op_eq): + (JSC::Interpreter::cti_op_lshift): + (JSC::Interpreter::cti_op_bitand): + (JSC::Interpreter::cti_op_rshift): + (JSC::Interpreter::cti_op_bitnot): + (JSC::Interpreter::cti_op_resolve_with_base): + (JSC::Interpreter::cti_op_mod): + (JSC::Interpreter::cti_op_less): + (JSC::Interpreter::cti_op_neq): + (JSC::Interpreter::cti_op_post_dec): + (JSC::Interpreter::cti_op_urshift): + (JSC::Interpreter::cti_op_bitxor): + (JSC::Interpreter::cti_op_bitor): + (JSC::Interpreter::cti_op_push_scope): + (JSC::Interpreter::cti_op_to_jsnumber): + (JSC::Interpreter::cti_op_in): + (JSC::Interpreter::cti_op_del_by_val): + * wrec/WREC.cpp: + (JSC::WREC::compileRegExp): + * wrec/WRECParser.cpp: + (JSC::WREC::Parser::parseGreedyQuantifier): + (JSC::WREC::Parser::parseParentheses): + (JSC::WREC::Parser::parseCharacterClass): + (JSC::WREC::Parser::parseEscape): + * wrec/WRECParser.h: + (JSC::WREC::Parser::): + (JSC::WREC::Parser::atEndOfPattern): + +2008-11-18 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=22337 + Enable workers by default + + * Configurations/JavaScriptCore.xcconfig: Define ENABLE_WORKERS. + +2008-11-18 Alexey Proskuryakov <ap@webkit.org> + + - Windows build fix + + * wrec/WRECFunctors.h: + * wrec/WRECGenerator.h: + * wrec/WRECParser.h: + CharacterClass is a struct, not a class, fix forward declarations. + +2008-11-18 Dan Bernstein <mitz@apple.com> + + - Windows build fix + + * assembler/X86Assembler.h: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix gtk build. + + * wrec/Quantifier.h: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix gtk build. + + * assembler/AssemblerBuffer.h: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Split WREC classes out into individual files, with a few modifications + to more closely match the WebKit coding style. + + * GNUmakefile.am: + * JavaScriptCore.scons: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * assembler/X86Assembler.h: + * runtime/RegExp.cpp: + * wrec/CharacterClass.cpp: Copied from wrec/CharacterClassConstructor.cpp. + (JSC::WREC::CharacterClass::newline): + (JSC::WREC::CharacterClass::digits): + (JSC::WREC::CharacterClass::spaces): + (JSC::WREC::CharacterClass::wordchar): + (JSC::WREC::CharacterClass::nondigits): + (JSC::WREC::CharacterClass::nonspaces): + (JSC::WREC::CharacterClass::nonwordchar): + * wrec/CharacterClass.h: Copied from wrec/CharacterClassConstructor.h. + * wrec/CharacterClassConstructor.cpp: + (JSC::WREC::CharacterClassConstructor::addSortedRange): + (JSC::WREC::CharacterClassConstructor::append): + * wrec/CharacterClassConstructor.h: + * wrec/Quantifier.h: Copied from wrec/WREC.h. + * wrec/WREC.cpp: + (JSC::WREC::compileRegExp): + * wrec/WREC.h: + * wrec/WRECFunctors.cpp: Copied from wrec/WREC.cpp. + * wrec/WRECFunctors.h: Copied from wrec/WREC.cpp. + (JSC::WREC::GenerateAtomFunctor::~GenerateAtomFunctor): + (JSC::WREC::GeneratePatternCharacterFunctor::GeneratePatternCharacterFunctor): + (JSC::WREC::GenerateCharacterClassFunctor::GenerateCharacterClassFunctor): + (JSC::WREC::GenerateBackreferenceFunctor::GenerateBackreferenceFunctor): + (JSC::WREC::GenerateParenthesesNonGreedyFunctor::GenerateParenthesesNonGreedyFunctor): + * wrec/WRECGenerator.cpp: Copied from wrec/WREC.cpp. + (JSC::WREC::Generator::generatePatternCharacter): + (JSC::WREC::Generator::generateCharacterClassInvertedRange): + (JSC::WREC::Generator::generateCharacterClassInverted): + (JSC::WREC::Generator::generateCharacterClass): + (JSC::WREC::Generator::generateParentheses): + (JSC::WREC::Generator::generateAssertionBOL): + (JSC::WREC::Generator::generateAssertionEOL): + (JSC::WREC::Generator::generateAssertionWordBoundary): + * wrec/WRECGenerator.h: Copied from wrec/WREC.h. + * wrec/WRECParser.cpp: Copied from wrec/WREC.cpp. + (JSC::WREC::Parser::parseGreedyQuantifier): + (JSC::WREC::Parser::parseCharacterClassQuantifier): + (JSC::WREC::Parser::parseParentheses): + (JSC::WREC::Parser::parseCharacterClass): + (JSC::WREC::Parser::parseEscape): + (JSC::WREC::Parser::parseTerm): + * wrec/WRECParser.h: Copied from wrec/WREC.h. + (JSC::WREC::Parser::): + (JSC::WREC::Parser::Parser): + (JSC::WREC::Parser::setError): + (JSC::WREC::Parser::error): + (JSC::WREC::Parser::recordSubpattern): + (JSC::WREC::Parser::numSubpatterns): + (JSC::WREC::Parser::ignoreCase): + (JSC::WREC::Parser::multiline): + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix a few builds. + + * JavaScriptCoreSources.bkl: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix a few builds. + + * JavaScriptCore.pri: + * JavaScriptCore.scons: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Moved VM/CTI.* => jit/JIT.*. + + Removed VM. + + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.scons: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * VM/CTI.cpp: Removed. + * VM/CTI.h: Removed. + * bytecode/CodeBlock.cpp: + * interpreter/Interpreter.cpp: + * jit: Added. + * jit/JIT.cpp: Copied from VM/CTI.cpp. + * jit/JIT.h: Copied from VM/CTI.h. + * runtime/RegExp.cpp: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Moved runtime/ExecState.* => interpreter/CallFrame.*. + + * API/JSBase.cpp: + * API/OpaqueJSString.cpp: + * GNUmakefile.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * debugger/DebuggerCallFrame.h: + * interpreter/CallFrame.cpp: Copied from runtime/ExecState.cpp. + * interpreter/CallFrame.h: Copied from runtime/ExecState.h. + * interpreter/Interpreter.cpp: + * parser/Nodes.cpp: + * profiler/ProfileGenerator.cpp: + * profiler/Profiler.cpp: + * runtime/ClassInfo.h: + * runtime/Collector.cpp: + * runtime/Completion.cpp: + * runtime/ExceptionHelpers.cpp: + * runtime/ExecState.cpp: Removed. + * runtime/ExecState.h: Removed. + * runtime/Identifier.cpp: + * runtime/JSFunction.cpp: + * runtime/JSGlobalObjectFunctions.cpp: + * runtime/JSLock.cpp: + * runtime/JSNumberCell.h: + * runtime/JSObject.h: + * runtime/JSString.h: + * runtime/Lookup.h: + * runtime/PropertyNameArray.h: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix Windows build. + + * API/APICast.h: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix Windows build. + + * API/APICast.h: + * runtime/ExecState.h: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Moved VM/SamplingTool.* => bytecode/SamplingTool.*. + + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.scons: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + * VM/SamplingTool.cpp: Removed. + * VM/SamplingTool.h: Removed. + * bytecode/SamplingTool.cpp: Copied from VM/SamplingTool.cpp. + * bytecode/SamplingTool.h: Copied from VM/SamplingTool.h. + * jsc.cpp: + (runWithScripts): + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix Windows build. + + * runtime/ExecState.h: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Moved VM/ExceptionHelpers.cpp => runtime/ExceptionHelpers.cpp. + + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.scons: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + * VM/ExceptionHelpers.cpp: Removed. + * runtime/ExceptionHelpers.cpp: Copied from VM/ExceptionHelpers.cpp. + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Moved VM/RegisterFile.cpp => interpreter/RegisterFile.cpp. + + * AllInOneFile.cpp: + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.scons: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + * VM/RegisterFile.cpp: Removed. + * interpreter/RegisterFile.cpp: Copied from VM/RegisterFile.cpp. + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix Windows build. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix Windows build. + + * JavaScriptCore.vcproj/jsc/jsc.vcproj: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix Windows build. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Moved: + VM/ExceptionHelpers.h => runtime/ExceptionHelpers.h + VM/Register.h => interpreter/Register.h + VM/RegisterFile.h => interpreter/RegisterFile.h + + + * GNUmakefile.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * VM/ExceptionHelpers.h: Removed. + * VM/Register.h: Removed. + * VM/RegisterFile.h: Removed. + * interpreter/Register.h: Copied from VM/Register.h. + * interpreter/RegisterFile.h: Copied from VM/RegisterFile.h. + * runtime/ExceptionHelpers.h: Copied from VM/ExceptionHelpers.h. + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix Qt build. + + * JavaScriptCore.pri: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Moved VM/Machine.cpp => interpreter/Interpreter.cpp. + + * DerivedSources.make: + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.scons: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + * VM/Machine.cpp: Removed. + * interpreter/Interpreter.cpp: Copied from VM/Machine.cpp. + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Moved VM/Machine.h => interpreter/Interpreter.h + + * GNUmakefile.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * VM/CTI.cpp: + * VM/CTI.h: + * VM/ExceptionHelpers.cpp: + * VM/Machine.cpp: + * VM/Machine.h: Removed. + * VM/SamplingTool.cpp: + * bytecode/CodeBlock.cpp: + * bytecompiler/BytecodeGenerator.cpp: + * bytecompiler/BytecodeGenerator.h: + * debugger/DebuggerCallFrame.cpp: + * interpreter: Added. + * interpreter/Interpreter.h: Copied from VM/Machine.h. + * profiler/ProfileGenerator.cpp: + * runtime/Arguments.h: + * runtime/ArrayPrototype.cpp: + * runtime/Collector.cpp: + * runtime/Completion.cpp: + * runtime/ExecState.h: + * runtime/FunctionPrototype.cpp: + * runtime/JSActivation.cpp: + * runtime/JSFunction.cpp: + * runtime/JSGlobalData.cpp: + * runtime/JSGlobalObject.cpp: + * runtime/JSGlobalObjectFunctions.cpp: + * wrec/WREC.cpp: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Moved runtime/Interpreter.cpp => runtime/Completion.cpp. + + Moved functions from Interpreter.h to Completion.h, and removed + Interpreter.h from the project. + + * API/JSBase.cpp: + * AllInOneFile.cpp: + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + * jsc.cpp: + * runtime/Completion.cpp: Copied from runtime/Interpreter.cpp. + * runtime/Completion.h: + * runtime/Interpreter.cpp: Removed. + * runtime/Interpreter.h: Removed. + +2008-11-17 Gabor Loki <loki@inf.u-szeged.hu> + + Reviewed by Darin Adler. + + <https://bugs.webkit.org/show_bug.cgi?id=22312> + Fix PCRE include path problem on Qt-port + + * JavaScriptCore.pri: + * pcre/pcre.pri: + +2008-11-17 Gabor Loki <loki@inf.u-szeged.hu> + + Reviewed by Darin Adler. + + <https://bugs.webkit.org/show_bug.cgi?id=22313> + Add missing CTI source to the build system on Qt-port + + * JavaScriptCore.pri: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix JSGlue build. + + * JavaScriptCore.xcodeproj/project.pbxproj: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix Qt build. + + * jsc.pro: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix Qt build. + + * JavaScriptCore.pri: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix Qt build. + + * JavaScriptCore.pri: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + More file moves: + + VM/CodeBlock.* => bytecode/CodeBlock.* + VM/EvalCodeCache.h => bytecode/EvalCodeCache.h + VM/Instruction.h => bytecode/Instruction.h + VM/Opcode.* => bytecode/Opcode.* + + * GNUmakefile.am: + * JavaScriptCore.scons: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.vcproj/jsc/jsc.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + * VM/CodeBlock.cpp: Removed. + * VM/CodeBlock.h: Removed. + * VM/EvalCodeCache.h: Removed. + * VM/Instruction.h: Removed. + * VM/Opcode.cpp: Removed. + * VM/Opcode.h: Removed. + * bytecode: Added. + * bytecode/CodeBlock.cpp: Copied from VM/CodeBlock.cpp. + * bytecode/CodeBlock.h: Copied from VM/CodeBlock.h. + * bytecode/EvalCodeCache.h: Copied from VM/EvalCodeCache.h. + * bytecode/Instruction.h: Copied from VM/Instruction.h. + * bytecode/Opcode.cpp: Copied from VM/Opcode.cpp. + * bytecode/Opcode.h: Copied from VM/Opcode.h. + * jsc.pro: + * jscore.bkl: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix a few more builds. + + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.scons: + * JavaScriptCoreSources.bkl: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix gtk build. + + * GNUmakefile.am: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix Windows build. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Some file moves: + + VM/LabelID.h => bytecompiler/Label.h + VM/RegisterID.h => bytecompiler/RegisterID.h + VM/SegmentedVector.h => bytecompiler/SegmentedVector.h + bytecompiler/CodeGenerator.* => bytecompiler/BytecodeGenerator.* + + * AllInOneFile.cpp: + * JavaScriptCore.xcodeproj/project.pbxproj: + * VM/LabelID.h: Removed. + * VM/RegisterID.h: Removed. + * VM/SegmentedVector.h: Removed. + * bytecompiler/BytecodeGenerator.cpp: Copied from bytecompiler/CodeGenerator.cpp. + * bytecompiler/BytecodeGenerator.h: Copied from bytecompiler/CodeGenerator.h. + * bytecompiler/CodeGenerator.cpp: Removed. + * bytecompiler/CodeGenerator.h: Removed. + * bytecompiler/Label.h: Copied from VM/LabelID.h. + * bytecompiler/LabelScope.h: + * bytecompiler/RegisterID.h: Copied from VM/RegisterID.h. + * bytecompiler/SegmentedVector.h: Copied from VM/SegmentedVector.h. + * jsc.cpp: + * parser/Nodes.cpp: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix Windows build. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix Windows build. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + +2008-11-17 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix Windows build. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + +2008-11-16 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix Windows build. + + * JavaScriptCore.vcproj/jsc/jsc.vcproj: + +2008-11-16 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix Windows build. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + +2008-11-16 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Moved masm => assembler and split "AssemblerBuffer.h" out of "X86Assembler.h". + + Also renamed ENABLE_MASM to ENABLE_ASSEMBLER. + + * GNUmakefile.am: + * JavaScriptCore.xcodeproj/project.pbxproj: + * assembler: Added. + * assembler/AssemblerBuffer.h: Copied from masm/X86Assembler.h. + (JSC::AssemblerBuffer::AssemblerBuffer): + (JSC::AssemblerBuffer::~AssemblerBuffer): + (JSC::AssemblerBuffer::ensureSpace): + (JSC::AssemblerBuffer::isAligned): + (JSC::AssemblerBuffer::putByteUnchecked): + (JSC::AssemblerBuffer::putByte): + (JSC::AssemblerBuffer::putShortUnchecked): + (JSC::AssemblerBuffer::putShort): + (JSC::AssemblerBuffer::putIntUnchecked): + (JSC::AssemblerBuffer::putInt): + (JSC::AssemblerBuffer::data): + (JSC::AssemblerBuffer::size): + (JSC::AssemblerBuffer::reset): + (JSC::AssemblerBuffer::executableCopy): + (JSC::AssemblerBuffer::grow): + * assembler/X86Assembler.h: Copied from masm/X86Assembler.h. + * masm: Removed. + * masm/X86Assembler.h: Removed. + * wtf/Platform.h: + +2008-11-16 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix gtk build. + + * GNUmakefile.am: + +2008-11-16 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Fixed tyop. + + * VM/CTI.cpp: + +2008-11-16 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix windows build. + + * VM/CTI.cpp: + +2008-11-16 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix gtk build. + + * GNUmakefile.am: + +2008-11-16 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Renamed ENABLE_CTI and ENABLE(CTI) to ENABLE_JIT and ENABLE(JIT). + + * VM/CTI.cpp: + * VM/CTI.h: + * VM/CodeBlock.cpp: + (JSC::CodeBlock::~CodeBlock): + * VM/CodeBlock.h: + (JSC::CodeBlock::CodeBlock): + * VM/Machine.cpp: + (JSC::Interpreter::Interpreter): + (JSC::Interpreter::initialize): + (JSC::Interpreter::~Interpreter): + (JSC::Interpreter::execute): + (JSC::Interpreter::privateExecute): + * VM/Machine.h: + * bytecompiler/CodeGenerator.cpp: + (JSC::prepareJumpTableForStringSwitch): + * runtime/JSFunction.cpp: + (JSC::JSFunction::~JSFunction): + * runtime/JSGlobalData.h: + * wrec/WREC.h: + * wtf/Platform.h: + * wtf/TCSystemAlloc.cpp: + +2008-11-16 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix gtk build. + + * VM/CTI.cpp: + +2008-11-16 Geoffrey Garen <ggaren@apple.com> + + Reviewed by a few people on squirrelfish-dev. + + Renamed CTI => JIT. + + * VM/CTI.cpp: + (JSC::JIT::killLastResultRegister): + (JSC::JIT::emitGetVirtualRegister): + (JSC::JIT::emitGetVirtualRegisters): + (JSC::JIT::emitPutCTIArgFromVirtualRegister): + (JSC::JIT::emitPutCTIArg): + (JSC::JIT::emitGetCTIArg): + (JSC::JIT::emitPutCTIArgConstant): + (JSC::JIT::getConstantImmediateNumericArg): + (JSC::JIT::emitPutCTIParam): + (JSC::JIT::emitGetCTIParam): + (JSC::JIT::emitPutToCallFrameHeader): + (JSC::JIT::emitGetFromCallFrameHeader): + (JSC::JIT::emitPutVirtualRegister): + (JSC::JIT::emitInitRegister): + (JSC::JIT::printBytecodeOperandTypes): + (JSC::JIT::emitAllocateNumber): + (JSC::JIT::emitNakedCall): + (JSC::JIT::emitNakedFastCall): + (JSC::JIT::emitCTICall): + (JSC::JIT::emitJumpSlowCaseIfNotJSCell): + (JSC::JIT::linkSlowCaseIfNotJSCell): + (JSC::JIT::emitJumpSlowCaseIfNotImmNum): + (JSC::JIT::emitJumpSlowCaseIfNotImmNums): + (JSC::JIT::getDeTaggedConstantImmediate): + (JSC::JIT::emitFastArithDeTagImmediate): + (JSC::JIT::emitFastArithDeTagImmediateJumpIfZero): + (JSC::JIT::emitFastArithReTagImmediate): + (JSC::JIT::emitFastArithPotentiallyReTagImmediate): + (JSC::JIT::emitFastArithImmToInt): + (JSC::JIT::emitFastArithIntToImmOrSlowCase): + (JSC::JIT::emitFastArithIntToImmNoCheck): + (JSC::JIT::emitArithIntToImmWithJump): + (JSC::JIT::emitTagAsBoolImmediate): + (JSC::JIT::JIT): + (JSC::JIT::compileOpCallInitializeCallFrame): + (JSC::JIT::compileOpCallSetupArgs): + (JSC::JIT::compileOpCallEvalSetupArgs): + (JSC::JIT::compileOpConstructSetupArgs): + (JSC::JIT::compileOpCall): + (JSC::JIT::compileOpStrictEq): + (JSC::JIT::emitSlowScriptCheck): + (JSC::JIT::putDoubleResultToJSNumberCellOrJSImmediate): + (JSC::JIT::compileBinaryArithOp): + (JSC::JIT::compileBinaryArithOpSlowCase): + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileLinkPass): + (JSC::JIT::privateCompileSlowCases): + (JSC::JIT::privateCompile): + (JSC::JIT::privateCompileGetByIdSelf): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdChain): + (JSC::JIT::privateCompilePutByIdReplace): + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::unlinkCall): + (JSC::JIT::linkCall): + (JSC::JIT::privateCompileCTIMachineTrampolines): + (JSC::JIT::freeCTIMachineTrampolines): + (JSC::JIT::patchGetByIdSelf): + (JSC::JIT::patchPutByIdReplace): + (JSC::JIT::privateCompilePatchGetArrayLength): + (JSC::JIT::emitGetVariableObjectRegister): + (JSC::JIT::emitPutVariableObjectRegister): + * VM/CTI.h: + (JSC::JIT::compile): + (JSC::JIT::compileGetByIdSelf): + (JSC::JIT::compileGetByIdProto): + (JSC::JIT::compileGetByIdChain): + (JSC::JIT::compilePutByIdReplace): + (JSC::JIT::compilePutByIdTransition): + (JSC::JIT::compileCTIMachineTrampolines): + (JSC::JIT::compilePatchGetArrayLength): + * VM/CodeBlock.cpp: + (JSC::CodeBlock::unlinkCallers): + * VM/Machine.cpp: + (JSC::Interpreter::initialize): + (JSC::Interpreter::~Interpreter): + (JSC::Interpreter::execute): + (JSC::Interpreter::tryCTICachePutByID): + (JSC::Interpreter::tryCTICacheGetByID): + (JSC::Interpreter::cti_op_call_JSFunction): + (JSC::Interpreter::cti_vm_dontLazyLinkCall): + (JSC::Interpreter::cti_vm_lazyLinkCall): + * VM/Machine.h: + * VM/RegisterFile.h: + * parser/Nodes.h: + * runtime/JSArray.h: + * runtime/JSCell.h: + * runtime/JSFunction.h: + * runtime/JSImmediate.h: + * runtime/JSNumberCell.h: + * runtime/JSObject.h: + * runtime/JSString.h: + * runtime/JSVariableObject.h: + * runtime/ScopeChain.h: + * runtime/Structure.h: + * runtime/TypeInfo.h: + * runtime/UString.h: + +2008-11-16 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix wx build. + + * jscore.bkl: + +2008-11-16 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Nixed X86:: and X86Assembler:: prefixes in a lot of places using typedefs. + + * VM/CTI.cpp: + (JSC::CTI::emitGetVirtualRegister): + (JSC::CTI::emitGetVirtualRegisters): + (JSC::CTI::emitPutCTIArgFromVirtualRegister): + (JSC::CTI::emitPutCTIArg): + (JSC::CTI::emitGetCTIArg): + (JSC::CTI::emitPutCTIParam): + (JSC::CTI::emitGetCTIParam): + (JSC::CTI::emitPutToCallFrameHeader): + (JSC::CTI::emitGetFromCallFrameHeader): + (JSC::CTI::emitPutVirtualRegister): + (JSC::CTI::emitNakedCall): + (JSC::CTI::emitNakedFastCall): + (JSC::CTI::emitCTICall): + (JSC::CTI::emitJumpSlowCaseIfNotJSCell): + (JSC::CTI::emitJumpSlowCaseIfNotImmNum): + (JSC::CTI::emitJumpSlowCaseIfNotImmNums): + (JSC::CTI::emitFastArithDeTagImmediate): + (JSC::CTI::emitFastArithDeTagImmediateJumpIfZero): + (JSC::CTI::emitFastArithReTagImmediate): + (JSC::CTI::emitFastArithPotentiallyReTagImmediate): + (JSC::CTI::emitFastArithImmToInt): + (JSC::CTI::emitFastArithIntToImmOrSlowCase): + (JSC::CTI::emitFastArithIntToImmNoCheck): + (JSC::CTI::emitArithIntToImmWithJump): + (JSC::CTI::emitTagAsBoolImmediate): + (JSC::CTI::compileOpCall): + (JSC::CTI::compileOpStrictEq): + (JSC::CTI::emitSlowScriptCheck): + (JSC::CTI::putDoubleResultToJSNumberCellOrJSImmediate): + (JSC::CTI::compileBinaryArithOp): + (JSC::CTI::compileBinaryArithOpSlowCase): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + (JSC::CTI::privateCompile): + (JSC::CTI::privateCompileGetByIdSelf): + (JSC::CTI::privateCompileGetByIdProto): + (JSC::CTI::privateCompileGetByIdChain): + (JSC::CTI::privateCompilePutByIdReplace): + (JSC::CTI::privateCompilePutByIdTransition): + (JSC::CTI::privateCompileCTIMachineTrampolines): + (JSC::CTI::privateCompilePatchGetArrayLength): + (JSC::CTI::emitGetVariableObjectRegister): + (JSC::CTI::emitPutVariableObjectRegister): + * VM/CTI.h: + (JSC::CallRecord::CallRecord): + (JSC::JmpTable::JmpTable): + (JSC::SlowCaseEntry::SlowCaseEntry): + (JSC::CTI::JSRInfo::JSRInfo): + * wrec/WREC.h: + +2008-11-16 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix Qt build. + + * JavaScriptCore.pri: + +2008-11-16 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Renamed OBJECT_OFFSET => FIELD_OFFSET + + Nixed use of OBJECT_OFFSET outside of CTI.cpp by making CTI a friend in + more places. + + * VM/CTI.cpp: + (JSC::CTI::compileOpCallInitializeCallFrame): + (JSC::CTI::compileOpCall): + (JSC::CTI::emitSlowScriptCheck): + (JSC::CTI::putDoubleResultToJSNumberCellOrJSImmediate): + (JSC::CTI::compileBinaryArithOp): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + (JSC::CTI::privateCompile): + (JSC::CTI::privateCompileGetByIdSelf): + (JSC::CTI::privateCompileGetByIdProto): + (JSC::CTI::privateCompileGetByIdChain): + (JSC::CTI::privateCompilePutByIdReplace): + (JSC::CTI::privateCompilePutByIdTransition): + (JSC::CTI::privateCompileCTIMachineTrampolines): + (JSC::CTI::privateCompilePatchGetArrayLength): + (JSC::CTI::emitGetVariableObjectRegister): + (JSC::CTI::emitPutVariableObjectRegister): + * runtime/JSValue.h: + * runtime/JSVariableObject.h: + +2008-11-16 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Renames: + + X86Assembler::copy => X86Assembler::executableCopy + AssemblerBuffer::copy => AssemblerBuffer::executableCopy + + * VM/CTI.cpp: + (JSC::CTI::privateCompile): + (JSC::CTI::privateCompileGetByIdSelf): + (JSC::CTI::privateCompileGetByIdProto): + (JSC::CTI::privateCompileGetByIdChain): + (JSC::CTI::privateCompilePutByIdReplace): + (JSC::CTI::privateCompilePutByIdTransition): + (JSC::CTI::privateCompileCTIMachineTrampolines): + (JSC::CTI::privateCompilePatchGetArrayLength): + * masm/X86Assembler.h: + (JSC::AssemblerBuffer::executableCopy): + (JSC::X86Assembler::executableCopy): + * wrec/WREC.cpp: + (JSC::WREC::compileRegExp): + +2008-11-16 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Renamed WREC => JSC::WREC, removing JSC:: prefix in a lot of places. + Renamed WRECFunction => WREC::CompiledRegExp, and deployed this type + name in place of a few casts. + + * runtime/RegExp.cpp: + (JSC::RegExp::RegExp): + (JSC::RegExp::~RegExp): + (JSC::RegExp::match): + * runtime/RegExp.h: + * wrec/CharacterClassConstructor.cpp: + * wrec/CharacterClassConstructor.h: + * wrec/WREC.cpp: + (JSC::WREC::compileRegExp): + * wrec/WREC.h: + (JSC::WREC::Generator::Generator): + (JSC::WREC::Parser::Parser): + (JSC::WREC::Parser::parseAlternative): + +2008-11-16 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Renamed BytecodeInterpreter => Interpreter. + + * JavaScriptCore.exp: + * VM/CTI.cpp: + (JSC::): + (JSC::CTI::compileOpCall): + (JSC::CTI::emitSlowScriptCheck): + (JSC::CTI::compileBinaryArithOpSlowCase): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + (JSC::CTI::privateCompile): + (JSC::CTI::privateCompileGetByIdSelf): + (JSC::CTI::privateCompileGetByIdProto): + (JSC::CTI::privateCompileGetByIdChain): + (JSC::CTI::privateCompilePutByIdReplace): + (JSC::CTI::privateCompilePutByIdTransition): + (JSC::CTI::privateCompileCTIMachineTrampolines): + (JSC::CTI::freeCTIMachineTrampolines): + (JSC::CTI::patchGetByIdSelf): + (JSC::CTI::patchPutByIdReplace): + (JSC::CTI::privateCompilePatchGetArrayLength): + * VM/CTI.h: + * VM/CodeBlock.cpp: + (JSC::CodeBlock::printStructures): + (JSC::CodeBlock::derefStructures): + (JSC::CodeBlock::refStructures): + * VM/Machine.cpp: + (JSC::jsLess): + (JSC::jsLessEq): + (JSC::Interpreter::resolve): + (JSC::Interpreter::resolveSkip): + (JSC::Interpreter::resolveGlobal): + (JSC::Interpreter::resolveBase): + (JSC::Interpreter::resolveBaseAndProperty): + (JSC::Interpreter::resolveBaseAndFunc): + (JSC::Interpreter::slideRegisterWindowForCall): + (JSC::Interpreter::callEval): + (JSC::Interpreter::Interpreter): + (JSC::Interpreter::initialize): + (JSC::Interpreter::~Interpreter): + (JSC::Interpreter::dumpCallFrame): + (JSC::Interpreter::dumpRegisters): + (JSC::Interpreter::isOpcode): + (JSC::Interpreter::unwindCallFrame): + (JSC::Interpreter::throwException): + (JSC::Interpreter::execute): + (JSC::Interpreter::debug): + (JSC::Interpreter::resetTimeoutCheck): + (JSC::Interpreter::checkTimeout): + (JSC::Interpreter::createExceptionScope): + (JSC::Interpreter::tryCachePutByID): + (JSC::Interpreter::uncachePutByID): + (JSC::Interpreter::tryCacheGetByID): + (JSC::Interpreter::uncacheGetByID): + (JSC::Interpreter::privateExecute): + (JSC::Interpreter::retrieveArguments): + (JSC::Interpreter::retrieveCaller): + (JSC::Interpreter::retrieveLastCaller): + (JSC::Interpreter::findFunctionCallFrame): + (JSC::Interpreter::tryCTICachePutByID): + (JSC::Interpreter::tryCTICacheGetByID): + (JSC::Interpreter::cti_op_convert_this): + (JSC::Interpreter::cti_op_end): + (JSC::Interpreter::cti_op_add): + (JSC::Interpreter::cti_op_pre_inc): + (JSC::Interpreter::cti_timeout_check): + (JSC::Interpreter::cti_register_file_check): + (JSC::Interpreter::cti_op_loop_if_less): + (JSC::Interpreter::cti_op_loop_if_lesseq): + (JSC::Interpreter::cti_op_new_object): + (JSC::Interpreter::cti_op_put_by_id): + (JSC::Interpreter::cti_op_put_by_id_second): + (JSC::Interpreter::cti_op_put_by_id_generic): + (JSC::Interpreter::cti_op_put_by_id_fail): + (JSC::Interpreter::cti_op_get_by_id): + (JSC::Interpreter::cti_op_get_by_id_second): + (JSC::Interpreter::cti_op_get_by_id_generic): + (JSC::Interpreter::cti_op_get_by_id_fail): + (JSC::Interpreter::cti_op_instanceof): + (JSC::Interpreter::cti_op_del_by_id): + (JSC::Interpreter::cti_op_mul): + (JSC::Interpreter::cti_op_new_func): + (JSC::Interpreter::cti_op_call_JSFunction): + (JSC::Interpreter::cti_op_call_arityCheck): + (JSC::Interpreter::cti_vm_dontLazyLinkCall): + (JSC::Interpreter::cti_vm_lazyLinkCall): + (JSC::Interpreter::cti_op_push_activation): + (JSC::Interpreter::cti_op_call_NotJSFunction): + (JSC::Interpreter::cti_op_create_arguments): + (JSC::Interpreter::cti_op_create_arguments_no_params): + (JSC::Interpreter::cti_op_tear_off_activation): + (JSC::Interpreter::cti_op_tear_off_arguments): + (JSC::Interpreter::cti_op_profile_will_call): + (JSC::Interpreter::cti_op_profile_did_call): + (JSC::Interpreter::cti_op_ret_scopeChain): + (JSC::Interpreter::cti_op_new_array): + (JSC::Interpreter::cti_op_resolve): + (JSC::Interpreter::cti_op_construct_JSConstruct): + (JSC::Interpreter::cti_op_construct_NotJSConstruct): + (JSC::Interpreter::cti_op_get_by_val): + (JSC::Interpreter::cti_op_resolve_func): + (JSC::Interpreter::cti_op_sub): + (JSC::Interpreter::cti_op_put_by_val): + (JSC::Interpreter::cti_op_put_by_val_array): + (JSC::Interpreter::cti_op_lesseq): + (JSC::Interpreter::cti_op_loop_if_true): + (JSC::Interpreter::cti_op_negate): + (JSC::Interpreter::cti_op_resolve_base): + (JSC::Interpreter::cti_op_resolve_skip): + (JSC::Interpreter::cti_op_resolve_global): + (JSC::Interpreter::cti_op_div): + (JSC::Interpreter::cti_op_pre_dec): + (JSC::Interpreter::cti_op_jless): + (JSC::Interpreter::cti_op_not): + (JSC::Interpreter::cti_op_jtrue): + (JSC::Interpreter::cti_op_post_inc): + (JSC::Interpreter::cti_op_eq): + (JSC::Interpreter::cti_op_lshift): + (JSC::Interpreter::cti_op_bitand): + (JSC::Interpreter::cti_op_rshift): + (JSC::Interpreter::cti_op_bitnot): + (JSC::Interpreter::cti_op_resolve_with_base): + (JSC::Interpreter::cti_op_new_func_exp): + (JSC::Interpreter::cti_op_mod): + (JSC::Interpreter::cti_op_less): + (JSC::Interpreter::cti_op_neq): + (JSC::Interpreter::cti_op_post_dec): + (JSC::Interpreter::cti_op_urshift): + (JSC::Interpreter::cti_op_bitxor): + (JSC::Interpreter::cti_op_new_regexp): + (JSC::Interpreter::cti_op_bitor): + (JSC::Interpreter::cti_op_call_eval): + (JSC::Interpreter::cti_op_throw): + (JSC::Interpreter::cti_op_get_pnames): + (JSC::Interpreter::cti_op_next_pname): + (JSC::Interpreter::cti_op_push_scope): + (JSC::Interpreter::cti_op_pop_scope): + (JSC::Interpreter::cti_op_typeof): + (JSC::Interpreter::cti_op_is_undefined): + (JSC::Interpreter::cti_op_is_boolean): + (JSC::Interpreter::cti_op_is_number): + (JSC::Interpreter::cti_op_is_string): + (JSC::Interpreter::cti_op_is_object): + (JSC::Interpreter::cti_op_is_function): + (JSC::Interpreter::cti_op_stricteq): + (JSC::Interpreter::cti_op_nstricteq): + (JSC::Interpreter::cti_op_to_jsnumber): + (JSC::Interpreter::cti_op_in): + (JSC::Interpreter::cti_op_push_new_scope): + (JSC::Interpreter::cti_op_jmp_scopes): + (JSC::Interpreter::cti_op_put_by_index): + (JSC::Interpreter::cti_op_switch_imm): + (JSC::Interpreter::cti_op_switch_char): + (JSC::Interpreter::cti_op_switch_string): + (JSC::Interpreter::cti_op_del_by_val): + (JSC::Interpreter::cti_op_put_getter): + (JSC::Interpreter::cti_op_put_setter): + (JSC::Interpreter::cti_op_new_error): + (JSC::Interpreter::cti_op_debug): + (JSC::Interpreter::cti_vm_throw): + * VM/Machine.h: + * VM/Register.h: + * VM/SamplingTool.h: + (JSC::SamplingTool::SamplingTool): + * bytecompiler/CodeGenerator.cpp: + (JSC::BytecodeGenerator::generate): + (JSC::BytecodeGenerator::BytecodeGenerator): + * jsc.cpp: + (runWithScripts): + * runtime/ExecState.h: + (JSC::ExecState::interpreter): + * runtime/JSCell.h: + * runtime/JSFunction.h: + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + * runtime/JSGlobalData.h: + * runtime/JSString.h: + * wrec/WREC.cpp: + (WREC::compileRegExp): + * wrec/WREC.h: + +2008-11-16 Geoffrey Garen <ggaren@apple.com> + + Roll out r38461 (my last patch) because it broke the world. + +2008-11-16 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + A few more renames: + + BytecodeInterpreter => Interpreter + WREC => JSC::WREC, removing JSC:: prefix in a lot of places + X86Assembler::copy => X86Assembler::executableCopy + AssemblerBuffer::copy => AssemblerBuffer::executableCopy + WRECFunction => WREC::RegExpFunction + OBJECT_OFFSET => FIELD_OFFSET + + Also: + + Nixed use of OBJECT_OFFSET outside of CTI.cpp by making CTI a friend in more places. + Nixed X86:: and X86Assembler:: prefixes in a lot of places using typedefs + + * JavaScriptCore.exp: + * VM/CTI.cpp: + (JSC::): + (JSC::CTI::emitGetVirtualRegister): + (JSC::CTI::emitGetVirtualRegisters): + (JSC::CTI::emitPutCTIArgFromVirtualRegister): + (JSC::CTI::emitPutCTIArg): + (JSC::CTI::emitGetCTIArg): + (JSC::CTI::emitPutCTIParam): + (JSC::CTI::emitGetCTIParam): + (JSC::CTI::emitPutToCallFrameHeader): + (JSC::CTI::emitGetFromCallFrameHeader): + (JSC::CTI::emitPutVirtualRegister): + (JSC::CTI::emitNakedCall): + (JSC::CTI::emitNakedFastCall): + (JSC::CTI::emitCTICall): + (JSC::CTI::emitJumpSlowCaseIfNotJSCell): + (JSC::CTI::emitJumpSlowCaseIfNotImmNum): + (JSC::CTI::emitJumpSlowCaseIfNotImmNums): + (JSC::CTI::emitFastArithDeTagImmediate): + (JSC::CTI::emitFastArithDeTagImmediateJumpIfZero): + (JSC::CTI::emitFastArithReTagImmediate): + (JSC::CTI::emitFastArithPotentiallyReTagImmediate): + (JSC::CTI::emitFastArithImmToInt): + (JSC::CTI::emitFastArithIntToImmOrSlowCase): + (JSC::CTI::emitFastArithIntToImmNoCheck): + (JSC::CTI::emitArithIntToImmWithJump): + (JSC::CTI::emitTagAsBoolImmediate): + (JSC::CTI::compileOpCallInitializeCallFrame): + (JSC::CTI::compileOpCall): + (JSC::CTI::compileOpStrictEq): + (JSC::CTI::emitSlowScriptCheck): + (JSC::CTI::putDoubleResultToJSNumberCellOrJSImmediate): + (JSC::CTI::compileBinaryArithOp): + (JSC::CTI::compileBinaryArithOpSlowCase): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + (JSC::CTI::privateCompile): + (JSC::CTI::privateCompileGetByIdSelf): + (JSC::CTI::privateCompileGetByIdProto): + (JSC::CTI::privateCompileGetByIdChain): + (JSC::CTI::privateCompilePutByIdReplace): + (JSC::CTI::privateCompilePutByIdTransition): + (JSC::CTI::privateCompileCTIMachineTrampolines): + (JSC::CTI::freeCTIMachineTrampolines): + (JSC::CTI::patchGetByIdSelf): + (JSC::CTI::patchPutByIdReplace): + (JSC::CTI::privateCompilePatchGetArrayLength): + (JSC::CTI::emitGetVariableObjectRegister): + (JSC::CTI::emitPutVariableObjectRegister): + * VM/CTI.h: + (JSC::CallRecord::CallRecord): + (JSC::JmpTable::JmpTable): + (JSC::SlowCaseEntry::SlowCaseEntry): + (JSC::CTI::JSRInfo::JSRInfo): + * VM/CodeBlock.cpp: + (JSC::CodeBlock::printStructures): + (JSC::CodeBlock::derefStructures): + (JSC::CodeBlock::refStructures): + * VM/Machine.cpp: + (JSC::jsLess): + (JSC::jsLessEq): + (JSC::Interpreter::resolve): + (JSC::Interpreter::resolveSkip): + (JSC::Interpreter::resolveGlobal): + (JSC::Interpreter::resolveBase): + (JSC::Interpreter::resolveBaseAndProperty): + (JSC::Interpreter::resolveBaseAndFunc): + (JSC::Interpreter::slideRegisterWindowForCall): + (JSC::Interpreter::callEval): + (JSC::Interpreter::Interpreter): + (JSC::Interpreter::initialize): + (JSC::Interpreter::~Interpreter): + (JSC::Interpreter::dumpCallFrame): + (JSC::Interpreter::dumpRegisters): + (JSC::Interpreter::isOpcode): + (JSC::Interpreter::unwindCallFrame): + (JSC::Interpreter::throwException): + (JSC::Interpreter::execute): + (JSC::Interpreter::debug): + (JSC::Interpreter::resetTimeoutCheck): + (JSC::Interpreter::checkTimeout): + (JSC::Interpreter::createExceptionScope): + (JSC::Interpreter::tryCachePutByID): + (JSC::Interpreter::uncachePutByID): + (JSC::Interpreter::tryCacheGetByID): + (JSC::Interpreter::uncacheGetByID): + (JSC::Interpreter::privateExecute): + (JSC::Interpreter::retrieveArguments): + (JSC::Interpreter::retrieveCaller): + (JSC::Interpreter::retrieveLastCaller): + (JSC::Interpreter::findFunctionCallFrame): + (JSC::Interpreter::tryCTICachePutByID): + (JSC::Interpreter::tryCTICacheGetByID): + (JSC::): + (JSC::Interpreter::cti_op_convert_this): + (JSC::Interpreter::cti_op_end): + (JSC::Interpreter::cti_op_add): + (JSC::Interpreter::cti_op_pre_inc): + (JSC::Interpreter::cti_timeout_check): + (JSC::Interpreter::cti_register_file_check): + (JSC::Interpreter::cti_op_loop_if_less): + (JSC::Interpreter::cti_op_loop_if_lesseq): + (JSC::Interpreter::cti_op_new_object): + (JSC::Interpreter::cti_op_put_by_id): + (JSC::Interpreter::cti_op_put_by_id_second): + (JSC::Interpreter::cti_op_put_by_id_generic): + (JSC::Interpreter::cti_op_put_by_id_fail): + (JSC::Interpreter::cti_op_get_by_id): + (JSC::Interpreter::cti_op_get_by_id_second): + (JSC::Interpreter::cti_op_get_by_id_generic): + (JSC::Interpreter::cti_op_get_by_id_fail): + (JSC::Interpreter::cti_op_instanceof): + (JSC::Interpreter::cti_op_del_by_id): + (JSC::Interpreter::cti_op_mul): + (JSC::Interpreter::cti_op_new_func): + (JSC::Interpreter::cti_op_call_JSFunction): + (JSC::Interpreter::cti_op_call_arityCheck): + (JSC::Interpreter::cti_vm_dontLazyLinkCall): + (JSC::Interpreter::cti_vm_lazyLinkCall): + (JSC::Interpreter::cti_op_push_activation): + (JSC::Interpreter::cti_op_call_NotJSFunction): + (JSC::Interpreter::cti_op_create_arguments): + (JSC::Interpreter::cti_op_create_arguments_no_params): + (JSC::Interpreter::cti_op_tear_off_activation): + (JSC::Interpreter::cti_op_tear_off_arguments): + (JSC::Interpreter::cti_op_profile_will_call): + (JSC::Interpreter::cti_op_profile_did_call): + (JSC::Interpreter::cti_op_ret_scopeChain): + (JSC::Interpreter::cti_op_new_array): + (JSC::Interpreter::cti_op_resolve): + (JSC::Interpreter::cti_op_construct_JSConstruct): + (JSC::Interpreter::cti_op_construct_NotJSConstruct): + (JSC::Interpreter::cti_op_get_by_val): + (JSC::Interpreter::cti_op_resolve_func): + (JSC::Interpreter::cti_op_sub): + (JSC::Interpreter::cti_op_put_by_val): + (JSC::Interpreter::cti_op_put_by_val_array): + (JSC::Interpreter::cti_op_lesseq): + (JSC::Interpreter::cti_op_loop_if_true): + (JSC::Interpreter::cti_op_negate): + (JSC::Interpreter::cti_op_resolve_base): + (JSC::Interpreter::cti_op_resolve_skip): + (JSC::Interpreter::cti_op_resolve_global): + (JSC::Interpreter::cti_op_div): + (JSC::Interpreter::cti_op_pre_dec): + (JSC::Interpreter::cti_op_jless): + (JSC::Interpreter::cti_op_not): + (JSC::Interpreter::cti_op_jtrue): + (JSC::Interpreter::cti_op_post_inc): + (JSC::Interpreter::cti_op_eq): + (JSC::Interpreter::cti_op_lshift): + (JSC::Interpreter::cti_op_bitand): + (JSC::Interpreter::cti_op_rshift): + (JSC::Interpreter::cti_op_bitnot): + (JSC::Interpreter::cti_op_resolve_with_base): + (JSC::Interpreter::cti_op_new_func_exp): + (JSC::Interpreter::cti_op_mod): + (JSC::Interpreter::cti_op_less): + (JSC::Interpreter::cti_op_neq): + (JSC::Interpreter::cti_op_post_dec): + (JSC::Interpreter::cti_op_urshift): + (JSC::Interpreter::cti_op_bitxor): + (JSC::Interpreter::cti_op_new_regexp): + (JSC::Interpreter::cti_op_bitor): + (JSC::Interpreter::cti_op_call_eval): + (JSC::Interpreter::cti_op_throw): + (JSC::Interpreter::cti_op_get_pnames): + (JSC::Interpreter::cti_op_next_pname): + (JSC::Interpreter::cti_op_push_scope): + (JSC::Interpreter::cti_op_pop_scope): + (JSC::Interpreter::cti_op_typeof): + (JSC::Interpreter::cti_op_is_undefined): + (JSC::Interpreter::cti_op_is_boolean): + (JSC::Interpreter::cti_op_is_number): + (JSC::Interpreter::cti_op_is_string): + (JSC::Interpreter::cti_op_is_object): + (JSC::Interpreter::cti_op_is_function): + (JSC::Interpreter::cti_op_stricteq): + (JSC::Interpreter::cti_op_nstricteq): + (JSC::Interpreter::cti_op_to_jsnumber): + (JSC::Interpreter::cti_op_in): + (JSC::Interpreter::cti_op_push_new_scope): + (JSC::Interpreter::cti_op_jmp_scopes): + (JSC::Interpreter::cti_op_put_by_index): + (JSC::Interpreter::cti_op_switch_imm): + (JSC::Interpreter::cti_op_switch_char): + (JSC::Interpreter::cti_op_switch_string): + (JSC::Interpreter::cti_op_del_by_val): + (JSC::Interpreter::cti_op_put_getter): + (JSC::Interpreter::cti_op_put_setter): + (JSC::Interpreter::cti_op_new_error): + (JSC::Interpreter::cti_op_debug): + (JSC::Interpreter::cti_vm_throw): + * VM/Machine.h: + * VM/Register.h: + * VM/SamplingTool.cpp: + (JSC::SamplingTool::dump): + * VM/SamplingTool.h: + (JSC::SamplingTool::SamplingTool): + * bytecompiler/CodeGenerator.cpp: + (JSC::BytecodeGenerator::generate): + (JSC::BytecodeGenerator::BytecodeGenerator): + * jsc.cpp: + (runWithScripts): + * masm/X86Assembler.h: + (JSC::AssemblerBuffer::executableCopy): + (JSC::X86Assembler::executableCopy): + * runtime/ExecState.h: + (JSC::ExecState::interpreter): + * runtime/JSCell.h: + * runtime/JSFunction.h: + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + * runtime/JSGlobalData.h: + * runtime/JSImmediate.h: + * runtime/JSString.h: + * runtime/JSValue.h: + * runtime/JSVariableObject.h: + * runtime/RegExp.cpp: + (JSC::RegExp::RegExp): + (JSC::RegExp::~RegExp): + (JSC::RegExp::match): + * runtime/RegExp.h: + * wrec/CharacterClassConstructor.cpp: + * wrec/CharacterClassConstructor.h: + * wrec/WREC.cpp: + (JSC::WREC::compileRegExp): + * wrec/WREC.h: + (JSC::WREC::Generator::Generator): + (JSC::WREC::Parser::): + (JSC::WREC::Parser::Parser): + (JSC::WREC::Parser::parseAlternative): + +2008-11-16 Greg Bolsinga <bolsinga@apple.com> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=21810 + Remove use of static C++ objects that are destroyed at exit time (destructors) + + Conditionally have the DEFINE_STATIC_LOCAL workaround <rdar://problem/6354696> + (Codegen issue with C++ static reference in gcc build 5465) based upon the compiler + build versions. It will use the: + static T& = *new T; + style for all other compilers. + + * wtf/StdLibExtras.h: + +2008-11-16 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Dan Bernstein. + + https://bugs.webkit.org/show_bug.cgi?id=22290 + Remove cross-heap GC and MessagePort multi-threading support + + It is broken (and may not be implementable at all), and no longer needed, as we + don't use MessagePorts for communication with workers any more. + + * JavaScriptCore.exp: + * runtime/Collector.cpp: + (JSC::Heap::collect): + * runtime/JSGlobalObject.cpp: + * runtime/JSGlobalObject.h: + Remove hooks for cross-heap GC. + +2008-11-15 Sam Weinig <sam@webkit.org> + + Reviewed by Cameron Zwarich. + + Cleanup jsc command line code a little. + + * jsc.cpp: + (functionQuit): + (main): Use standard exit status macros + (cleanupGlobalData): Factor out cleanup code into this function. + (printUsageStatement): Use standard exit status macros. + +2008-11-15 Sam Weinig <sam@webkit.org> + + Reviewed by Cameron Zwarich. + + Cleanup BytecodeGenerator constructors. + + * bytecompiler/CodeGenerator.cpp: + (JSC::BytecodeGenerator::BytecodeGenerator): + * bytecompiler/CodeGenerator.h: + * parser/Nodes.cpp: + (JSC::ProgramNode::generateBytecode): + +2008-11-15 Darin Adler <darin@apple.com> + + Rubber stamped by Geoff Garen. + + - do the long-planned StructureID -> Structure rename + + * API/JSCallbackConstructor.cpp: + (JSC::JSCallbackConstructor::JSCallbackConstructor): + * API/JSCallbackConstructor.h: + (JSC::JSCallbackConstructor::createStructure): + * API/JSCallbackFunction.h: + (JSC::JSCallbackFunction::createStructure): + * API/JSCallbackObject.h: + (JSC::JSCallbackObject::createStructure): + * API/JSCallbackObjectFunctions.h: + (JSC::::JSCallbackObject): + * API/JSValueRef.cpp: + (JSValueIsInstanceOfConstructor): + * GNUmakefile.am: + * JavaScriptCore.exp: + * JavaScriptCore.pri: + * JavaScriptCore.scons: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + * VM/CTI.cpp: + (JSC::CTI::compileBinaryArithOp): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileGetByIdSelf): + (JSC::CTI::privateCompileGetByIdProto): + (JSC::CTI::privateCompileGetByIdChain): + (JSC::CTI::privateCompilePutByIdReplace): + (JSC::transitionWillNeedStorageRealloc): + (JSC::CTI::privateCompilePutByIdTransition): + (JSC::CTI::patchGetByIdSelf): + (JSC::CTI::patchPutByIdReplace): + * VM/CTI.h: + (JSC::CTI::compileGetByIdSelf): + (JSC::CTI::compileGetByIdProto): + (JSC::CTI::compileGetByIdChain): + (JSC::CTI::compilePutByIdReplace): + (JSC::CTI::compilePutByIdTransition): + * VM/CodeBlock.cpp: + (JSC::CodeBlock::printStructure): + (JSC::CodeBlock::printStructures): + (JSC::CodeBlock::dump): + (JSC::CodeBlock::~CodeBlock): + (JSC::CodeBlock::derefStructures): + (JSC::CodeBlock::refStructures): + * VM/CodeBlock.h: + * VM/Instruction.h: + (JSC::Instruction::Instruction): + (JSC::Instruction::): + * VM/Machine.cpp: + (JSC::jsTypeStringForValue): + (JSC::jsIsObjectType): + (JSC::BytecodeInterpreter::resolveGlobal): + (JSC::BytecodeInterpreter::BytecodeInterpreter): + (JSC::cachePrototypeChain): + (JSC::BytecodeInterpreter::tryCachePutByID): + (JSC::BytecodeInterpreter::uncachePutByID): + (JSC::BytecodeInterpreter::tryCacheGetByID): + (JSC::BytecodeInterpreter::uncacheGetByID): + (JSC::BytecodeInterpreter::privateExecute): + (JSC::BytecodeInterpreter::tryCTICachePutByID): + (JSC::BytecodeInterpreter::tryCTICacheGetByID): + (JSC::BytecodeInterpreter::cti_op_instanceof): + (JSC::BytecodeInterpreter::cti_op_construct_JSConstruct): + (JSC::BytecodeInterpreter::cti_op_resolve_global): + (JSC::BytecodeInterpreter::cti_op_is_undefined): + * runtime/Arguments.h: + (JSC::Arguments::createStructure): + * runtime/ArrayConstructor.cpp: + (JSC::ArrayConstructor::ArrayConstructor): + * runtime/ArrayConstructor.h: + * runtime/ArrayPrototype.cpp: + (JSC::ArrayPrototype::ArrayPrototype): + * runtime/ArrayPrototype.h: + * runtime/BatchedTransitionOptimizer.h: + (JSC::BatchedTransitionOptimizer::BatchedTransitionOptimizer): + (JSC::BatchedTransitionOptimizer::~BatchedTransitionOptimizer): + * runtime/BooleanConstructor.cpp: + (JSC::BooleanConstructor::BooleanConstructor): + * runtime/BooleanConstructor.h: + * runtime/BooleanObject.cpp: + (JSC::BooleanObject::BooleanObject): + * runtime/BooleanObject.h: + * runtime/BooleanPrototype.cpp: + (JSC::BooleanPrototype::BooleanPrototype): + * runtime/BooleanPrototype.h: + * runtime/DateConstructor.cpp: + (JSC::DateConstructor::DateConstructor): + * runtime/DateConstructor.h: + * runtime/DateInstance.cpp: + (JSC::DateInstance::DateInstance): + * runtime/DateInstance.h: + * runtime/DatePrototype.cpp: + (JSC::DatePrototype::DatePrototype): + * runtime/DatePrototype.h: + (JSC::DatePrototype::createStructure): + * runtime/ErrorConstructor.cpp: + (JSC::ErrorConstructor::ErrorConstructor): + * runtime/ErrorConstructor.h: + * runtime/ErrorInstance.cpp: + (JSC::ErrorInstance::ErrorInstance): + * runtime/ErrorInstance.h: + * runtime/ErrorPrototype.cpp: + (JSC::ErrorPrototype::ErrorPrototype): + * runtime/ErrorPrototype.h: + * runtime/FunctionConstructor.cpp: + (JSC::FunctionConstructor::FunctionConstructor): + * runtime/FunctionConstructor.h: + * runtime/FunctionPrototype.cpp: + (JSC::FunctionPrototype::FunctionPrototype): + (JSC::FunctionPrototype::addFunctionProperties): + * runtime/FunctionPrototype.h: + (JSC::FunctionPrototype::createStructure): + * runtime/GlobalEvalFunction.cpp: + (JSC::GlobalEvalFunction::GlobalEvalFunction): + * runtime/GlobalEvalFunction.h: + * runtime/Identifier.h: + * runtime/InternalFunction.cpp: + (JSC::InternalFunction::InternalFunction): + * runtime/InternalFunction.h: + (JSC::InternalFunction::createStructure): + (JSC::InternalFunction::InternalFunction): + * runtime/JSActivation.cpp: + (JSC::JSActivation::JSActivation): + * runtime/JSActivation.h: + (JSC::JSActivation::createStructure): + * runtime/JSArray.cpp: + (JSC::JSArray::JSArray): + * runtime/JSArray.h: + (JSC::JSArray::createStructure): + * runtime/JSCell.h: + (JSC::JSCell::JSCell): + (JSC::JSCell::isObject): + (JSC::JSCell::isString): + (JSC::JSCell::structure): + (JSC::JSValue::needsThisConversion): + * runtime/JSFunction.cpp: + (JSC::JSFunction::construct): + * runtime/JSFunction.h: + (JSC::JSFunction::JSFunction): + (JSC::JSFunction::createStructure): + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + (JSC::JSGlobalData::createLeaked): + * runtime/JSGlobalData.h: + * runtime/JSGlobalObject.cpp: + (JSC::markIfNeeded): + (JSC::JSGlobalObject::reset): + * runtime/JSGlobalObject.h: + (JSC::JSGlobalObject::JSGlobalObject): + (JSC::JSGlobalObject::argumentsStructure): + (JSC::JSGlobalObject::arrayStructure): + (JSC::JSGlobalObject::booleanObjectStructure): + (JSC::JSGlobalObject::callbackConstructorStructure): + (JSC::JSGlobalObject::callbackFunctionStructure): + (JSC::JSGlobalObject::callbackObjectStructure): + (JSC::JSGlobalObject::dateStructure): + (JSC::JSGlobalObject::emptyObjectStructure): + (JSC::JSGlobalObject::errorStructure): + (JSC::JSGlobalObject::functionStructure): + (JSC::JSGlobalObject::numberObjectStructure): + (JSC::JSGlobalObject::prototypeFunctionStructure): + (JSC::JSGlobalObject::regExpMatchesArrayStructure): + (JSC::JSGlobalObject::regExpStructure): + (JSC::JSGlobalObject::stringObjectStructure): + (JSC::JSGlobalObject::createStructure): + (JSC::Structure::prototypeForLookup): + * runtime/JSNotAnObject.h: + (JSC::JSNotAnObject::createStructure): + * runtime/JSNumberCell.h: + (JSC::JSNumberCell::createStructure): + (JSC::JSNumberCell::JSNumberCell): + * runtime/JSObject.cpp: + (JSC::JSObject::mark): + (JSC::JSObject::put): + (JSC::JSObject::deleteProperty): + (JSC::JSObject::defineGetter): + (JSC::JSObject::defineSetter): + (JSC::JSObject::getPropertyAttributes): + (JSC::JSObject::getPropertyNames): + (JSC::JSObject::removeDirect): + (JSC::JSObject::createInheritorID): + * runtime/JSObject.h: + (JSC::JSObject::getDirect): + (JSC::JSObject::getDirectLocation): + (JSC::JSObject::hasCustomProperties): + (JSC::JSObject::hasGetterSetterProperties): + (JSC::JSObject::createStructure): + (JSC::JSObject::JSObject): + (JSC::JSObject::~JSObject): + (JSC::JSObject::prototype): + (JSC::JSObject::setPrototype): + (JSC::JSObject::setStructure): + (JSC::JSObject::inheritorID): + (JSC::JSObject::inlineGetOwnPropertySlot): + (JSC::JSObject::getOwnPropertySlotForWrite): + (JSC::JSCell::fastGetOwnPropertySlot): + (JSC::JSObject::putDirect): + (JSC::JSObject::putDirectWithoutTransition): + (JSC::JSObject::transitionTo): + * runtime/JSPropertyNameIterator.h: + (JSC::JSPropertyNameIterator::next): + * runtime/JSStaticScopeObject.h: + (JSC::JSStaticScopeObject::JSStaticScopeObject): + (JSC::JSStaticScopeObject::createStructure): + * runtime/JSString.h: + (JSC::JSString::JSString): + (JSC::JSString::createStructure): + * runtime/JSVariableObject.h: + (JSC::JSVariableObject::JSVariableObject): + * runtime/JSWrapperObject.h: + (JSC::JSWrapperObject::JSWrapperObject): + * runtime/MathObject.cpp: + (JSC::MathObject::MathObject): + * runtime/MathObject.h: + (JSC::MathObject::createStructure): + * runtime/NativeErrorConstructor.cpp: + (JSC::NativeErrorConstructor::NativeErrorConstructor): + * runtime/NativeErrorConstructor.h: + * runtime/NativeErrorPrototype.cpp: + (JSC::NativeErrorPrototype::NativeErrorPrototype): + * runtime/NativeErrorPrototype.h: + * runtime/NumberConstructor.cpp: + (JSC::NumberConstructor::NumberConstructor): + * runtime/NumberConstructor.h: + (JSC::NumberConstructor::createStructure): + * runtime/NumberObject.cpp: + (JSC::NumberObject::NumberObject): + * runtime/NumberObject.h: + * runtime/NumberPrototype.cpp: + (JSC::NumberPrototype::NumberPrototype): + * runtime/NumberPrototype.h: + * runtime/ObjectConstructor.cpp: + (JSC::ObjectConstructor::ObjectConstructor): + * runtime/ObjectConstructor.h: + * runtime/ObjectPrototype.cpp: + (JSC::ObjectPrototype::ObjectPrototype): + * runtime/ObjectPrototype.h: + * runtime/Operations.h: + (JSC::equalSlowCaseInline): + * runtime/PropertyNameArray.h: + (JSC::PropertyNameArrayData::setCachedStructure): + (JSC::PropertyNameArrayData::cachedStructure): + (JSC::PropertyNameArrayData::setCachedPrototypeChain): + (JSC::PropertyNameArrayData::cachedPrototypeChain): + (JSC::PropertyNameArrayData::PropertyNameArrayData): + * runtime/PrototypeFunction.cpp: + (JSC::PrototypeFunction::PrototypeFunction): + * runtime/PrototypeFunction.h: + * runtime/RegExpConstructor.cpp: + (JSC::RegExpConstructor::RegExpConstructor): + * runtime/RegExpConstructor.h: + (JSC::RegExpConstructor::createStructure): + * runtime/RegExpObject.cpp: + (JSC::RegExpObject::RegExpObject): + * runtime/RegExpObject.h: + (JSC::RegExpObject::createStructure): + * runtime/RegExpPrototype.cpp: + (JSC::RegExpPrototype::RegExpPrototype): + * runtime/RegExpPrototype.h: + * runtime/StringConstructor.cpp: + (JSC::StringConstructor::StringConstructor): + * runtime/StringConstructor.h: + * runtime/StringObject.cpp: + (JSC::StringObject::StringObject): + * runtime/StringObject.h: + (JSC::StringObject::createStructure): + * runtime/StringObjectThatMasqueradesAsUndefined.h: + (JSC::StringObjectThatMasqueradesAsUndefined::create): + (JSC::StringObjectThatMasqueradesAsUndefined::StringObjectThatMasqueradesAsUndefined): + (JSC::StringObjectThatMasqueradesAsUndefined::createStructure): + * runtime/StringPrototype.cpp: + (JSC::StringPrototype::StringPrototype): + * runtime/StringPrototype.h: + * runtime/Structure.cpp: Copied from JavaScriptCore/runtime/StructureID.cpp. + (JSC::Structure::dumpStatistics): + (JSC::Structure::Structure): + (JSC::Structure::~Structure): + (JSC::Structure::startIgnoringLeaks): + (JSC::Structure::stopIgnoringLeaks): + (JSC::Structure::materializePropertyMap): + (JSC::Structure::getEnumerablePropertyNames): + (JSC::Structure::clearEnumerationCache): + (JSC::Structure::growPropertyStorageCapacity): + (JSC::Structure::addPropertyTransitionToExistingStructure): + (JSC::Structure::addPropertyTransition): + (JSC::Structure::removePropertyTransition): + (JSC::Structure::changePrototypeTransition): + (JSC::Structure::getterSetterTransition): + (JSC::Structure::toDictionaryTransition): + (JSC::Structure::fromDictionaryTransition): + (JSC::Structure::addPropertyWithoutTransition): + (JSC::Structure::removePropertyWithoutTransition): + (JSC::Structure::createCachedPrototypeChain): + (JSC::Structure::checkConsistency): + (JSC::Structure::copyPropertyTable): + (JSC::Structure::get): + (JSC::Structure::put): + (JSC::Structure::remove): + (JSC::Structure::insertIntoPropertyMapHashTable): + (JSC::Structure::createPropertyMapHashTable): + (JSC::Structure::expandPropertyMapHashTable): + (JSC::Structure::rehashPropertyMapHashTable): + (JSC::Structure::getEnumerablePropertyNamesInternal): + * runtime/Structure.h: Copied from JavaScriptCore/runtime/StructureID.h. + (JSC::Structure::create): + (JSC::Structure::previousID): + (JSC::Structure::setCachedPrototypeChain): + (JSC::Structure::cachedPrototypeChain): + (JSC::Structure::): + (JSC::Structure::get): + * runtime/StructureChain.cpp: Copied from JavaScriptCore/runtime/StructureIDChain.cpp. + (JSC::StructureChain::StructureChain): + (JSC::structureChainsAreEqual): + * runtime/StructureChain.h: Copied from JavaScriptCore/runtime/StructureIDChain.h. + (JSC::StructureChain::create): + (JSC::StructureChain::head): + * runtime/StructureID.cpp: Removed. + * runtime/StructureID.h: Removed. + * runtime/StructureIDChain.cpp: Removed. + * runtime/StructureIDChain.h: Removed. + * runtime/StructureIDTransitionTable.h: Removed. + * runtime/StructureTransitionTable.h: Copied from JavaScriptCore/runtime/StructureIDTransitionTable.h. + +2008-11-15 Darin Adler <darin@apple.com> + + - fix non-WREC build + + * runtime/RegExp.cpp: Put "using namespace WREC" inside #if ENABLE(WREC). + +2008-11-15 Kevin Ollivier <kevino@theolliviers.com> + + Reviewed by Timothy Hatcher. + + As ThreadingNone doesn't implement threads, isMainThread should return true, + not false. + + https://bugs.webkit.org/show_bug.cgi?id=22285 + + * wtf/ThreadingNone.cpp: + (WTF::isMainThread): + +2008-11-15 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Moved all WREC-related code into WREC.cpp and put it in a WREC namespace. + Removed the WREC prefix from class names. + + * VM/CTI.cpp: + * VM/CTI.h: + * VM/Machine.h: + (JSC::BytecodeInterpreter::assemblerBuffer): + * masm/X86Assembler.h: + * runtime/RegExp.cpp: + (JSC::RegExp::RegExp): + * wrec/CharacterClassConstructor.cpp: + * wrec/CharacterClassConstructor.h: + * wrec/WREC.cpp: + (WREC::GenerateParenthesesNonGreedyFunctor::GenerateParenthesesNonGreedyFunctor): + (WREC::GeneratePatternCharacterFunctor::generateAtom): + (WREC::GeneratePatternCharacterFunctor::backtrack): + (WREC::GenerateCharacterClassFunctor::generateAtom): + (WREC::GenerateCharacterClassFunctor::backtrack): + (WREC::GenerateBackreferenceFunctor::generateAtom): + (WREC::GenerateBackreferenceFunctor::backtrack): + (WREC::GenerateParenthesesNonGreedyFunctor::generateAtom): + (WREC::GenerateParenthesesNonGreedyFunctor::backtrack): + (WREC::Generator::generateBacktrack1): + (WREC::Generator::generateBacktrackBackreference): + (WREC::Generator::generateBackreferenceQuantifier): + (WREC::Generator::generateNonGreedyQuantifier): + (WREC::Generator::generateGreedyQuantifier): + (WREC::Generator::generatePatternCharacter): + (WREC::Generator::generateCharacterClassInvertedRange): + (WREC::Generator::generateCharacterClassInverted): + (WREC::Generator::generateCharacterClass): + (WREC::Generator::generateParentheses): + (WREC::Generator::generateParenthesesNonGreedy): + (WREC::Generator::generateParenthesesResetTrampoline): + (WREC::Generator::generateAssertionBOL): + (WREC::Generator::generateAssertionEOL): + (WREC::Generator::generateAssertionWordBoundary): + (WREC::Generator::generateBackreference): + (WREC::Generator::generateDisjunction): + (WREC::Generator::terminateDisjunction): + (WREC::Parser::parseGreedyQuantifier): + (WREC::Parser::parseQuantifier): + (WREC::Parser::parsePatternCharacterQualifier): + (WREC::Parser::parseCharacterClassQuantifier): + (WREC::Parser::parseBackreferenceQuantifier): + (WREC::Parser::parseParentheses): + (WREC::Parser::parseCharacterClass): + (WREC::Parser::parseOctalEscape): + (WREC::Parser::parseEscape): + (WREC::Parser::parseTerm): + (WREC::Parser::parseDisjunction): + (WREC::compileRegExp): + * wrec/WREC.h: + (WREC::Generator::Generator): + (WREC::Parser::Parser): + (WREC::Parser::parseAlternative): + +2008-11-15 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Changed another case of "m_jit" to "m_assembler". + + * VM/CTI.cpp: + * wrec/WREC.cpp: + * wrec/WREC.h: + (JSC::WRECGenerator::WRECGenerator): + (JSC::WRECParser::WRECParser): + +2008-11-15 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Renamed "jit" to "assembler" and, for brevity, replaced *jit.* with __ + using a macro. + + * VM/CTI.cpp: + (JSC::CTI::emitGetVirtualRegister): + (JSC::CTI::emitPutCTIArgFromVirtualRegister): + (JSC::CTI::emitPutCTIArg): + (JSC::CTI::emitGetCTIArg): + (JSC::CTI::emitPutCTIArgConstant): + (JSC::CTI::emitPutCTIParam): + (JSC::CTI::emitGetCTIParam): + (JSC::CTI::emitPutToCallFrameHeader): + (JSC::CTI::emitGetFromCallFrameHeader): + (JSC::CTI::emitPutVirtualRegister): + (JSC::CTI::emitInitRegister): + (JSC::CTI::emitAllocateNumber): + (JSC::CTI::emitNakedCall): + (JSC::CTI::emitNakedFastCall): + (JSC::CTI::emitCTICall): + (JSC::CTI::emitJumpSlowCaseIfNotJSCell): + (JSC::CTI::linkSlowCaseIfNotJSCell): + (JSC::CTI::emitJumpSlowCaseIfNotImmNum): + (JSC::CTI::emitJumpSlowCaseIfNotImmNums): + (JSC::CTI::emitFastArithDeTagImmediate): + (JSC::CTI::emitFastArithDeTagImmediateJumpIfZero): + (JSC::CTI::emitFastArithReTagImmediate): + (JSC::CTI::emitFastArithPotentiallyReTagImmediate): + (JSC::CTI::emitFastArithImmToInt): + (JSC::CTI::emitFastArithIntToImmOrSlowCase): + (JSC::CTI::emitFastArithIntToImmNoCheck): + (JSC::CTI::emitArithIntToImmWithJump): + (JSC::CTI::emitTagAsBoolImmediate): + (JSC::CTI::CTI): + (JSC::CTI::compileOpCallInitializeCallFrame): + (JSC::CTI::compileOpCall): + (JSC::CTI::compileOpStrictEq): + (JSC::CTI::emitSlowScriptCheck): + (JSC::CTI::putDoubleResultToJSNumberCellOrJSImmediate): + (JSC::CTI::compileBinaryArithOp): + (JSC::CTI::compileBinaryArithOpSlowCase): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileLinkPass): + (JSC::CTI::privateCompileSlowCases): + (JSC::CTI::privateCompile): + (JSC::CTI::privateCompileGetByIdSelf): + (JSC::CTI::privateCompileGetByIdProto): + (JSC::CTI::privateCompileGetByIdChain): + (JSC::CTI::privateCompilePutByIdReplace): + (JSC::CTI::privateCompilePutByIdTransition): + (JSC::CTI::privateCompileCTIMachineTrampolines): + (JSC::CTI::privateCompilePatchGetArrayLength): + (JSC::CTI::emitGetVariableObjectRegister): + (JSC::CTI::emitPutVariableObjectRegister): + (JSC::CTI::compileRegExp): + * VM/CTI.h: + * wrec/WREC.cpp: + (JSC::WRECGenerator::generateBacktrack1): + (JSC::WRECGenerator::generateBacktrackBackreference): + (JSC::WRECGenerator::generateBackreferenceQuantifier): + (JSC::WRECGenerator::generateNonGreedyQuantifier): + (JSC::WRECGenerator::generateGreedyQuantifier): + (JSC::WRECGenerator::generatePatternCharacter): + (JSC::WRECGenerator::generateCharacterClassInvertedRange): + (JSC::WRECGenerator::generateCharacterClassInverted): + (JSC::WRECGenerator::generateCharacterClass): + (JSC::WRECGenerator::generateParentheses): + (JSC::WRECGenerator::generateParenthesesNonGreedy): + (JSC::WRECGenerator::generateParenthesesResetTrampoline): + (JSC::WRECGenerator::generateAssertionBOL): + (JSC::WRECGenerator::generateAssertionEOL): + (JSC::WRECGenerator::generateAssertionWordBoundary): + (JSC::WRECGenerator::generateBackreference): + (JSC::WRECGenerator::generateDisjunction): + (JSC::WRECGenerator::terminateDisjunction): + +2008-11-15 Sam Weinig <sam@webkit.org> + + Reviewed by Geoffrey Garen. + + Remove dead method declaration. + + * bytecompiler/CodeGenerator.h: + +2008-11-15 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Renamed LabelID to Label, Label::isForwardLabel to Label::isForward. + + * VM/LabelID.h: + (JSC::Label::Label): + (JSC::Label::isForward): + * bytecompiler/CodeGenerator.cpp: + (JSC::BytecodeGenerator::newLabel): + (JSC::BytecodeGenerator::emitLabel): + (JSC::BytecodeGenerator::emitJump): + (JSC::BytecodeGenerator::emitJumpIfTrue): + (JSC::BytecodeGenerator::emitJumpIfFalse): + (JSC::BytecodeGenerator::pushFinallyContext): + (JSC::BytecodeGenerator::emitComplexJumpScopes): + (JSC::BytecodeGenerator::emitJumpScopes): + (JSC::BytecodeGenerator::emitNextPropertyName): + (JSC::BytecodeGenerator::emitCatch): + (JSC::BytecodeGenerator::emitJumpSubroutine): + (JSC::prepareJumpTableForImmediateSwitch): + (JSC::prepareJumpTableForCharacterSwitch): + (JSC::prepareJumpTableForStringSwitch): + (JSC::BytecodeGenerator::endSwitch): + * bytecompiler/CodeGenerator.h: + * bytecompiler/LabelScope.h: + (JSC::LabelScope::LabelScope): + (JSC::LabelScope::breakTarget): + (JSC::LabelScope::continueTarget): + * parser/Nodes.cpp: + (JSC::LogicalOpNode::emitBytecode): + (JSC::ConditionalNode::emitBytecode): + (JSC::IfNode::emitBytecode): + (JSC::IfElseNode::emitBytecode): + (JSC::DoWhileNode::emitBytecode): + (JSC::WhileNode::emitBytecode): + (JSC::ForNode::emitBytecode): + (JSC::ForInNode::emitBytecode): + (JSC::ReturnNode::emitBytecode): + (JSC::CaseBlockNode::emitBytecodeForBlock): + (JSC::TryNode::emitBytecode): + +2008-11-15 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Renamed JITCodeBuffer to AssemblerBuffer and renamed its data members + to be more like the rest of our buffer classes, with a size and a + capacity. + + Added an assert in the unchecked put case to match the test in the checked + put case. + + Changed a C-style cast to a C++-style cast. + + Renamed MAX_INSTRUCTION_SIZE to maxInstructionSize. + + * VM/CTI.cpp: + (JSC::CTI::CTI): + (JSC::CTI::compileRegExp): + * VM/Machine.cpp: + (JSC::BytecodeInterpreter::BytecodeInterpreter): + * VM/Machine.h: + (JSC::BytecodeInterpreter::assemblerBuffer): + * masm/X86Assembler.h: + (JSC::AssemblerBuffer::AssemblerBuffer): + (JSC::AssemblerBuffer::~AssemblerBuffer): + (JSC::AssemblerBuffer::ensureSpace): + (JSC::AssemblerBuffer::isAligned): + (JSC::AssemblerBuffer::putByteUnchecked): + (JSC::AssemblerBuffer::putByte): + (JSC::AssemblerBuffer::putShortUnchecked): + (JSC::AssemblerBuffer::putShort): + (JSC::AssemblerBuffer::putIntUnchecked): + (JSC::AssemblerBuffer::putInt): + (JSC::AssemblerBuffer::data): + (JSC::AssemblerBuffer::size): + (JSC::AssemblerBuffer::reset): + (JSC::AssemblerBuffer::copy): + (JSC::AssemblerBuffer::grow): + (JSC::X86Assembler::): + (JSC::X86Assembler::X86Assembler): + (JSC::X86Assembler::testl_i32r): + (JSC::X86Assembler::movl_mr): + (JSC::X86Assembler::movl_rm): + (JSC::X86Assembler::movl_i32m): + (JSC::X86Assembler::emitCall): + (JSC::X86Assembler::label): + (JSC::X86Assembler::emitUnlinkedJmp): + (JSC::X86Assembler::emitUnlinkedJne): + (JSC::X86Assembler::emitUnlinkedJe): + (JSC::X86Assembler::emitUnlinkedJl): + (JSC::X86Assembler::emitUnlinkedJb): + (JSC::X86Assembler::emitUnlinkedJle): + (JSC::X86Assembler::emitUnlinkedJbe): + (JSC::X86Assembler::emitUnlinkedJge): + (JSC::X86Assembler::emitUnlinkedJg): + (JSC::X86Assembler::emitUnlinkedJa): + (JSC::X86Assembler::emitUnlinkedJae): + (JSC::X86Assembler::emitUnlinkedJo): + (JSC::X86Assembler::emitUnlinkedJp): + (JSC::X86Assembler::emitUnlinkedJs): + (JSC::X86Assembler::link): + (JSC::X86Assembler::emitModRm_rr): + (JSC::X86Assembler::emitModRm_rm): + (JSC::X86Assembler::emitModRm_opr): + +2008-11-15 Geoffrey Garen <ggaren@apple.com> + + Suggested by Maciej Stachowiak. + + Reverted most "opcode" => "bytecode" renames. We use "bytecode" as a + mass noun to refer to a stream of instructions. Each instruction may be + an opcode or an operand. + + * VM/CTI.cpp: + (JSC::CTI::emitCTICall): + (JSC::CTI::compileOpCall): + (JSC::CTI::compileBinaryArithOp): + (JSC::CTI::compileBinaryArithOpSlowCase): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + (JSC::CTI::privateCompile): + * VM/CTI.h: + * VM/CodeBlock.cpp: + (JSC::CodeBlock::printStructureIDs): + (JSC::CodeBlock::dump): + (JSC::CodeBlock::derefStructureIDs): + (JSC::CodeBlock::refStructureIDs): + * VM/CodeBlock.h: + * VM/ExceptionHelpers.cpp: + (JSC::createNotAnObjectError): + * VM/Instruction.h: + (JSC::Instruction::Instruction): + (JSC::Instruction::): + * VM/Machine.cpp: + (JSC::BytecodeInterpreter::isOpcode): + (JSC::BytecodeInterpreter::throwException): + (JSC::BytecodeInterpreter::tryCachePutByID): + (JSC::BytecodeInterpreter::uncachePutByID): + (JSC::BytecodeInterpreter::tryCacheGetByID): + (JSC::BytecodeInterpreter::uncacheGetByID): + (JSC::BytecodeInterpreter::privateExecute): + (JSC::BytecodeInterpreter::tryCTICachePutByID): + (JSC::BytecodeInterpreter::tryCTICacheGetByID): + * VM/Machine.h: + (JSC::BytecodeInterpreter::getOpcode): + (JSC::BytecodeInterpreter::getOpcodeID): + (JSC::BytecodeInterpreter::isCallBytecode): + * VM/Opcode.cpp: + (JSC::): + (JSC::OpcodeStats::OpcodeStats): + (JSC::compareOpcodeIndices): + (JSC::compareOpcodePairIndices): + (JSC::OpcodeStats::~OpcodeStats): + (JSC::OpcodeStats::recordInstruction): + (JSC::OpcodeStats::resetLastInstruction): + * VM/Opcode.h: + (JSC::): + (JSC::padOpcodeName): + * VM/SamplingTool.cpp: + (JSC::ScopeSampleRecord::sample): + (JSC::SamplingTool::run): + (JSC::compareOpcodeIndicesSampling): + (JSC::SamplingTool::dump): + * VM/SamplingTool.h: + (JSC::ScopeSampleRecord::ScopeSampleRecord): + (JSC::SamplingTool::SamplingTool): + * bytecompiler/CodeGenerator.cpp: + (JSC::BytecodeGenerator::BytecodeGenerator): + (JSC::BytecodeGenerator::emitLabel): + (JSC::BytecodeGenerator::emitOpcode): + (JSC::BytecodeGenerator::emitJump): + (JSC::BytecodeGenerator::emitJumpIfTrue): + (JSC::BytecodeGenerator::emitJumpIfFalse): + (JSC::BytecodeGenerator::emitMove): + (JSC::BytecodeGenerator::emitUnaryOp): + (JSC::BytecodeGenerator::emitPreInc): + (JSC::BytecodeGenerator::emitPreDec): + (JSC::BytecodeGenerator::emitPostInc): + (JSC::BytecodeGenerator::emitPostDec): + (JSC::BytecodeGenerator::emitBinaryOp): + (JSC::BytecodeGenerator::emitEqualityOp): + (JSC::BytecodeGenerator::emitUnexpectedLoad): + (JSC::BytecodeGenerator::emitInstanceOf): + (JSC::BytecodeGenerator::emitResolve): + (JSC::BytecodeGenerator::emitGetScopedVar): + (JSC::BytecodeGenerator::emitPutScopedVar): + (JSC::BytecodeGenerator::emitResolveBase): + (JSC::BytecodeGenerator::emitResolveWithBase): + (JSC::BytecodeGenerator::emitResolveFunction): + (JSC::BytecodeGenerator::emitGetById): + (JSC::BytecodeGenerator::emitPutById): + (JSC::BytecodeGenerator::emitPutGetter): + (JSC::BytecodeGenerator::emitPutSetter): + (JSC::BytecodeGenerator::emitDeleteById): + (JSC::BytecodeGenerator::emitGetByVal): + (JSC::BytecodeGenerator::emitPutByVal): + (JSC::BytecodeGenerator::emitDeleteByVal): + (JSC::BytecodeGenerator::emitPutByIndex): + (JSC::BytecodeGenerator::emitNewObject): + (JSC::BytecodeGenerator::emitNewArray): + (JSC::BytecodeGenerator::emitNewFunction): + (JSC::BytecodeGenerator::emitNewRegExp): + (JSC::BytecodeGenerator::emitNewFunctionExpression): + (JSC::BytecodeGenerator::emitCall): + (JSC::BytecodeGenerator::emitReturn): + (JSC::BytecodeGenerator::emitUnaryNoDstOp): + (JSC::BytecodeGenerator::emitConstruct): + (JSC::BytecodeGenerator::emitPopScope): + (JSC::BytecodeGenerator::emitDebugHook): + (JSC::BytecodeGenerator::emitComplexJumpScopes): + (JSC::BytecodeGenerator::emitJumpScopes): + (JSC::BytecodeGenerator::emitNextPropertyName): + (JSC::BytecodeGenerator::emitCatch): + (JSC::BytecodeGenerator::emitNewError): + (JSC::BytecodeGenerator::emitJumpSubroutine): + (JSC::BytecodeGenerator::emitSubroutineReturn): + (JSC::BytecodeGenerator::emitPushNewScope): + (JSC::BytecodeGenerator::beginSwitch): + * bytecompiler/CodeGenerator.h: + * jsc.cpp: + (runWithScripts): + * masm/X86Assembler.h: + (JSC::X86Assembler::): + (JSC::X86Assembler::emitModRm_opr): + (JSC::X86Assembler::emitModRm_opr_Unchecked): + (JSC::X86Assembler::emitModRm_opm): + (JSC::X86Assembler::emitModRm_opm_Unchecked): + (JSC::X86Assembler::emitModRm_opmsib): + * parser/Nodes.cpp: + (JSC::UnaryOpNode::emitBytecode): + (JSC::BinaryOpNode::emitBytecode): + (JSC::ReverseBinaryOpNode::emitBytecode): + (JSC::ThrowableBinaryOpNode::emitBytecode): + (JSC::emitReadModifyAssignment): + (JSC::ScopeNode::ScopeNode): + * parser/Nodes.h: + (JSC::UnaryPlusNode::): + (JSC::NegateNode::): + (JSC::BitwiseNotNode::): + (JSC::LogicalNotNode::): + (JSC::MultNode::): + (JSC::DivNode::): + (JSC::ModNode::): + (JSC::AddNode::): + (JSC::SubNode::): + (JSC::LeftShiftNode::): + (JSC::RightShiftNode::): + (JSC::UnsignedRightShiftNode::): + (JSC::LessNode::): + (JSC::GreaterNode::): + (JSC::LessEqNode::): + (JSC::GreaterEqNode::): + (JSC::InstanceOfNode::): + (JSC::InNode::): + (JSC::EqualNode::): + (JSC::NotEqualNode::): + (JSC::StrictEqualNode::): + (JSC::NotStrictEqualNode::): + (JSC::BitAndNode::): + (JSC::BitOrNode::): + (JSC::BitXOrNode::): + * runtime/StructureID.cpp: + (JSC::StructureID::fromDictionaryTransition): + * wtf/Platform.h: + +2008-11-15 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Renames: + + CodeGenerator => BytecodeGenerator + emitCodeForBlock => emitBytecodeForBlock + generatedByteCode => generatedBytecode + generateCode => generateBytecode + + * JavaScriptCore.exp: + * bytecompiler/CodeGenerator.cpp: + (JSC::BytecodeGenerator::setDumpsGeneratedCode): + (JSC::BytecodeGenerator::generate): + (JSC::BytecodeGenerator::addVar): + (JSC::BytecodeGenerator::addGlobalVar): + (JSC::BytecodeGenerator::allocateConstants): + (JSC::BytecodeGenerator::BytecodeGenerator): + (JSC::BytecodeGenerator::addParameter): + (JSC::BytecodeGenerator::registerFor): + (JSC::BytecodeGenerator::constRegisterFor): + (JSC::BytecodeGenerator::isLocal): + (JSC::BytecodeGenerator::isLocalConstant): + (JSC::BytecodeGenerator::newRegister): + (JSC::BytecodeGenerator::newTemporary): + (JSC::BytecodeGenerator::highestUsedRegister): + (JSC::BytecodeGenerator::newLabelScope): + (JSC::BytecodeGenerator::newLabel): + (JSC::BytecodeGenerator::emitLabel): + (JSC::BytecodeGenerator::emitBytecode): + (JSC::BytecodeGenerator::retrieveLastBinaryOp): + (JSC::BytecodeGenerator::retrieveLastUnaryOp): + (JSC::BytecodeGenerator::rewindBinaryOp): + (JSC::BytecodeGenerator::rewindUnaryOp): + (JSC::BytecodeGenerator::emitJump): + (JSC::BytecodeGenerator::emitJumpIfTrue): + (JSC::BytecodeGenerator::emitJumpIfFalse): + (JSC::BytecodeGenerator::addConstant): + (JSC::BytecodeGenerator::addUnexpectedConstant): + (JSC::BytecodeGenerator::addRegExp): + (JSC::BytecodeGenerator::emitMove): + (JSC::BytecodeGenerator::emitUnaryOp): + (JSC::BytecodeGenerator::emitPreInc): + (JSC::BytecodeGenerator::emitPreDec): + (JSC::BytecodeGenerator::emitPostInc): + (JSC::BytecodeGenerator::emitPostDec): + (JSC::BytecodeGenerator::emitBinaryOp): + (JSC::BytecodeGenerator::emitEqualityOp): + (JSC::BytecodeGenerator::emitLoad): + (JSC::BytecodeGenerator::emitUnexpectedLoad): + (JSC::BytecodeGenerator::findScopedProperty): + (JSC::BytecodeGenerator::emitInstanceOf): + (JSC::BytecodeGenerator::emitResolve): + (JSC::BytecodeGenerator::emitGetScopedVar): + (JSC::BytecodeGenerator::emitPutScopedVar): + (JSC::BytecodeGenerator::emitResolveBase): + (JSC::BytecodeGenerator::emitResolveWithBase): + (JSC::BytecodeGenerator::emitResolveFunction): + (JSC::BytecodeGenerator::emitGetById): + (JSC::BytecodeGenerator::emitPutById): + (JSC::BytecodeGenerator::emitPutGetter): + (JSC::BytecodeGenerator::emitPutSetter): + (JSC::BytecodeGenerator::emitDeleteById): + (JSC::BytecodeGenerator::emitGetByVal): + (JSC::BytecodeGenerator::emitPutByVal): + (JSC::BytecodeGenerator::emitDeleteByVal): + (JSC::BytecodeGenerator::emitPutByIndex): + (JSC::BytecodeGenerator::emitNewObject): + (JSC::BytecodeGenerator::emitNewArray): + (JSC::BytecodeGenerator::emitNewFunction): + (JSC::BytecodeGenerator::emitNewRegExp): + (JSC::BytecodeGenerator::emitNewFunctionExpression): + (JSC::BytecodeGenerator::emitCall): + (JSC::BytecodeGenerator::emitCallEval): + (JSC::BytecodeGenerator::emitReturn): + (JSC::BytecodeGenerator::emitUnaryNoDstOp): + (JSC::BytecodeGenerator::emitConstruct): + (JSC::BytecodeGenerator::emitPushScope): + (JSC::BytecodeGenerator::emitPopScope): + (JSC::BytecodeGenerator::emitDebugHook): + (JSC::BytecodeGenerator::pushFinallyContext): + (JSC::BytecodeGenerator::popFinallyContext): + (JSC::BytecodeGenerator::breakTarget): + (JSC::BytecodeGenerator::continueTarget): + (JSC::BytecodeGenerator::emitComplexJumpScopes): + (JSC::BytecodeGenerator::emitJumpScopes): + (JSC::BytecodeGenerator::emitNextPropertyName): + (JSC::BytecodeGenerator::emitCatch): + (JSC::BytecodeGenerator::emitNewError): + (JSC::BytecodeGenerator::emitJumpSubroutine): + (JSC::BytecodeGenerator::emitSubroutineReturn): + (JSC::BytecodeGenerator::emitPushNewScope): + (JSC::BytecodeGenerator::beginSwitch): + (JSC::BytecodeGenerator::endSwitch): + (JSC::BytecodeGenerator::emitThrowExpressionTooDeepException): + * bytecompiler/CodeGenerator.h: + * jsc.cpp: + (runWithScripts): + * parser/Nodes.cpp: + (JSC::ThrowableExpressionData::emitThrowError): + (JSC::NullNode::emitBytecode): + (JSC::BooleanNode::emitBytecode): + (JSC::NumberNode::emitBytecode): + (JSC::StringNode::emitBytecode): + (JSC::RegExpNode::emitBytecode): + (JSC::ThisNode::emitBytecode): + (JSC::ResolveNode::isPure): + (JSC::ResolveNode::emitBytecode): + (JSC::ArrayNode::emitBytecode): + (JSC::ObjectLiteralNode::emitBytecode): + (JSC::PropertyListNode::emitBytecode): + (JSC::BracketAccessorNode::emitBytecode): + (JSC::DotAccessorNode::emitBytecode): + (JSC::ArgumentListNode::emitBytecode): + (JSC::NewExprNode::emitBytecode): + (JSC::EvalFunctionCallNode::emitBytecode): + (JSC::FunctionCallValueNode::emitBytecode): + (JSC::FunctionCallResolveNode::emitBytecode): + (JSC::FunctionCallBracketNode::emitBytecode): + (JSC::FunctionCallDotNode::emitBytecode): + (JSC::emitPreIncOrDec): + (JSC::emitPostIncOrDec): + (JSC::PostfixResolveNode::emitBytecode): + (JSC::PostfixBracketNode::emitBytecode): + (JSC::PostfixDotNode::emitBytecode): + (JSC::PostfixErrorNode::emitBytecode): + (JSC::DeleteResolveNode::emitBytecode): + (JSC::DeleteBracketNode::emitBytecode): + (JSC::DeleteDotNode::emitBytecode): + (JSC::DeleteValueNode::emitBytecode): + (JSC::VoidNode::emitBytecode): + (JSC::TypeOfResolveNode::emitBytecode): + (JSC::TypeOfValueNode::emitBytecode): + (JSC::PrefixResolveNode::emitBytecode): + (JSC::PrefixBracketNode::emitBytecode): + (JSC::PrefixDotNode::emitBytecode): + (JSC::PrefixErrorNode::emitBytecode): + (JSC::UnaryOpNode::emitBytecode): + (JSC::BinaryOpNode::emitBytecode): + (JSC::EqualNode::emitBytecode): + (JSC::StrictEqualNode::emitBytecode): + (JSC::ReverseBinaryOpNode::emitBytecode): + (JSC::ThrowableBinaryOpNode::emitBytecode): + (JSC::InstanceOfNode::emitBytecode): + (JSC::LogicalOpNode::emitBytecode): + (JSC::ConditionalNode::emitBytecode): + (JSC::emitReadModifyAssignment): + (JSC::ReadModifyResolveNode::emitBytecode): + (JSC::AssignResolveNode::emitBytecode): + (JSC::AssignDotNode::emitBytecode): + (JSC::ReadModifyDotNode::emitBytecode): + (JSC::AssignErrorNode::emitBytecode): + (JSC::AssignBracketNode::emitBytecode): + (JSC::ReadModifyBracketNode::emitBytecode): + (JSC::CommaNode::emitBytecode): + (JSC::ConstDeclNode::emitCodeSingle): + (JSC::ConstDeclNode::emitBytecode): + (JSC::ConstStatementNode::emitBytecode): + (JSC::statementListEmitCode): + (JSC::BlockNode::emitBytecode): + (JSC::EmptyStatementNode::emitBytecode): + (JSC::DebuggerStatementNode::emitBytecode): + (JSC::ExprStatementNode::emitBytecode): + (JSC::VarStatementNode::emitBytecode): + (JSC::IfNode::emitBytecode): + (JSC::IfElseNode::emitBytecode): + (JSC::DoWhileNode::emitBytecode): + (JSC::WhileNode::emitBytecode): + (JSC::ForNode::emitBytecode): + (JSC::ForInNode::emitBytecode): + (JSC::ContinueNode::emitBytecode): + (JSC::BreakNode::emitBytecode): + (JSC::ReturnNode::emitBytecode): + (JSC::WithNode::emitBytecode): + (JSC::CaseBlockNode::emitBytecodeForBlock): + (JSC::SwitchNode::emitBytecode): + (JSC::LabelNode::emitBytecode): + (JSC::ThrowNode::emitBytecode): + (JSC::TryNode::emitBytecode): + (JSC::EvalNode::emitBytecode): + (JSC::EvalNode::generateBytecode): + (JSC::FunctionBodyNode::generateBytecode): + (JSC::FunctionBodyNode::emitBytecode): + (JSC::ProgramNode::emitBytecode): + (JSC::ProgramNode::generateBytecode): + (JSC::FuncDeclNode::emitBytecode): + (JSC::FuncExprNode::emitBytecode): + * parser/Nodes.h: + (JSC::ExpressionNode::): + (JSC::BooleanNode::): + (JSC::NumberNode::): + (JSC::StringNode::): + (JSC::ProgramNode::): + (JSC::EvalNode::): + (JSC::FunctionBodyNode::): + * runtime/Arguments.h: + (JSC::Arguments::getArgumentsData): + (JSC::JSActivation::copyRegisters): + * runtime/JSActivation.cpp: + (JSC::JSActivation::mark): + * runtime/JSActivation.h: + (JSC::JSActivation::JSActivationData::JSActivationData): + * runtime/JSFunction.cpp: + (JSC::JSFunction::~JSFunction): + +2008-11-15 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Renamed all forms of "byte code" "opcode" "op code" "code" "bitcode" + etc. to "bytecode". + + * VM/CTI.cpp: + (JSC::CTI::printBytecodeOperandTypes): + (JSC::CTI::emitAllocateNumber): + (JSC::CTI::emitNakedCall): + (JSC::CTI::emitNakedFastCall): + (JSC::CTI::emitCTICall): + (JSC::CTI::emitJumpSlowCaseIfNotJSCell): + (JSC::CTI::emitJumpSlowCaseIfNotImmNum): + (JSC::CTI::emitJumpSlowCaseIfNotImmNums): + (JSC::CTI::emitFastArithIntToImmOrSlowCase): + (JSC::CTI::compileOpCall): + (JSC::CTI::emitSlowScriptCheck): + (JSC::CTI::compileBinaryArithOp): + (JSC::CTI::compileBinaryArithOpSlowCase): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + (JSC::CTI::privateCompile): + * VM/CTI.h: + (JSC::CallRecord::CallRecord): + (JSC::SwitchRecord::SwitchRecord): + * VM/CodeBlock.cpp: + (JSC::CodeBlock::printStructureIDs): + (JSC::CodeBlock::dump): + (JSC::CodeBlock::~CodeBlock): + (JSC::CodeBlock::derefStructureIDs): + (JSC::CodeBlock::refStructureIDs): + * VM/CodeBlock.h: + (JSC::StructureStubInfo::StructureStubInfo): + * VM/ExceptionHelpers.cpp: + (JSC::createNotAnObjectError): + * VM/Instruction.h: + (JSC::Instruction::Instruction): + (JSC::Instruction::): + * VM/Machine.cpp: + (JSC::BytecodeInterpreter::isBytecode): + (JSC::BytecodeInterpreter::throwException): + (JSC::BytecodeInterpreter::execute): + (JSC::BytecodeInterpreter::tryCachePutByID): + (JSC::BytecodeInterpreter::uncachePutByID): + (JSC::BytecodeInterpreter::tryCacheGetByID): + (JSC::BytecodeInterpreter::uncacheGetByID): + (JSC::BytecodeInterpreter::privateExecute): + (JSC::BytecodeInterpreter::tryCTICachePutByID): + (JSC::BytecodeInterpreter::tryCTICacheGetByID): + (JSC::BytecodeInterpreter::cti_op_call_JSFunction): + (JSC::BytecodeInterpreter::cti_vm_dontLazyLinkCall): + (JSC::BytecodeInterpreter::cti_vm_lazyLinkCall): + * VM/Machine.h: + (JSC::BytecodeInterpreter::getBytecode): + (JSC::BytecodeInterpreter::getBytecodeID): + (JSC::BytecodeInterpreter::isCallBytecode): + * VM/Opcode.cpp: + (JSC::): + (JSC::BytecodeStats::BytecodeStats): + (JSC::compareBytecodeIndices): + (JSC::compareBytecodePairIndices): + (JSC::BytecodeStats::~BytecodeStats): + (JSC::BytecodeStats::recordInstruction): + (JSC::BytecodeStats::resetLastInstruction): + * VM/Opcode.h: + (JSC::): + (JSC::padBytecodeName): + * VM/SamplingTool.cpp: + (JSC::ScopeSampleRecord::sample): + (JSC::SamplingTool::run): + (JSC::compareBytecodeIndicesSampling): + (JSC::SamplingTool::dump): + * VM/SamplingTool.h: + (JSC::ScopeSampleRecord::ScopeSampleRecord): + (JSC::SamplingTool::SamplingTool): + * bytecompiler/CodeGenerator.cpp: + (JSC::CodeGenerator::generate): + (JSC::CodeGenerator::CodeGenerator): + (JSC::CodeGenerator::emitLabel): + (JSC::CodeGenerator::emitBytecode): + (JSC::CodeGenerator::emitJump): + (JSC::CodeGenerator::emitJumpIfTrue): + (JSC::CodeGenerator::emitJumpIfFalse): + (JSC::CodeGenerator::emitMove): + (JSC::CodeGenerator::emitUnaryOp): + (JSC::CodeGenerator::emitPreInc): + (JSC::CodeGenerator::emitPreDec): + (JSC::CodeGenerator::emitPostInc): + (JSC::CodeGenerator::emitPostDec): + (JSC::CodeGenerator::emitBinaryOp): + (JSC::CodeGenerator::emitEqualityOp): + (JSC::CodeGenerator::emitUnexpectedLoad): + (JSC::CodeGenerator::emitInstanceOf): + (JSC::CodeGenerator::emitResolve): + (JSC::CodeGenerator::emitGetScopedVar): + (JSC::CodeGenerator::emitPutScopedVar): + (JSC::CodeGenerator::emitResolveBase): + (JSC::CodeGenerator::emitResolveWithBase): + (JSC::CodeGenerator::emitResolveFunction): + (JSC::CodeGenerator::emitGetById): + (JSC::CodeGenerator::emitPutById): + (JSC::CodeGenerator::emitPutGetter): + (JSC::CodeGenerator::emitPutSetter): + (JSC::CodeGenerator::emitDeleteById): + (JSC::CodeGenerator::emitGetByVal): + (JSC::CodeGenerator::emitPutByVal): + (JSC::CodeGenerator::emitDeleteByVal): + (JSC::CodeGenerator::emitPutByIndex): + (JSC::CodeGenerator::emitNewObject): + (JSC::CodeGenerator::emitNewArray): + (JSC::CodeGenerator::emitNewFunction): + (JSC::CodeGenerator::emitNewRegExp): + (JSC::CodeGenerator::emitNewFunctionExpression): + (JSC::CodeGenerator::emitCall): + (JSC::CodeGenerator::emitReturn): + (JSC::CodeGenerator::emitUnaryNoDstOp): + (JSC::CodeGenerator::emitConstruct): + (JSC::CodeGenerator::emitPopScope): + (JSC::CodeGenerator::emitDebugHook): + (JSC::CodeGenerator::emitComplexJumpScopes): + (JSC::CodeGenerator::emitJumpScopes): + (JSC::CodeGenerator::emitNextPropertyName): + (JSC::CodeGenerator::emitCatch): + (JSC::CodeGenerator::emitNewError): + (JSC::CodeGenerator::emitJumpSubroutine): + (JSC::CodeGenerator::emitSubroutineReturn): + (JSC::CodeGenerator::emitPushNewScope): + (JSC::CodeGenerator::beginSwitch): + (JSC::CodeGenerator::endSwitch): + * bytecompiler/CodeGenerator.h: + (JSC::CodeGenerator::emitNode): + * jsc.cpp: + (runWithScripts): + * masm/X86Assembler.h: + (JSC::X86Assembler::): + (JSC::X86Assembler::emitModRm_opr): + (JSC::X86Assembler::emitModRm_opr_Unchecked): + (JSC::X86Assembler::emitModRm_opm): + (JSC::X86Assembler::emitModRm_opm_Unchecked): + (JSC::X86Assembler::emitModRm_opmsib): + * parser/Nodes.cpp: + (JSC::NullNode::emitBytecode): + (JSC::BooleanNode::emitBytecode): + (JSC::NumberNode::emitBytecode): + (JSC::StringNode::emitBytecode): + (JSC::RegExpNode::emitBytecode): + (JSC::ThisNode::emitBytecode): + (JSC::ResolveNode::emitBytecode): + (JSC::ArrayNode::emitBytecode): + (JSC::ObjectLiteralNode::emitBytecode): + (JSC::PropertyListNode::emitBytecode): + (JSC::BracketAccessorNode::emitBytecode): + (JSC::DotAccessorNode::emitBytecode): + (JSC::ArgumentListNode::emitBytecode): + (JSC::NewExprNode::emitBytecode): + (JSC::EvalFunctionCallNode::emitBytecode): + (JSC::FunctionCallValueNode::emitBytecode): + (JSC::FunctionCallResolveNode::emitBytecode): + (JSC::FunctionCallBracketNode::emitBytecode): + (JSC::FunctionCallDotNode::emitBytecode): + (JSC::PostfixResolveNode::emitBytecode): + (JSC::PostfixBracketNode::emitBytecode): + (JSC::PostfixDotNode::emitBytecode): + (JSC::PostfixErrorNode::emitBytecode): + (JSC::DeleteResolveNode::emitBytecode): + (JSC::DeleteBracketNode::emitBytecode): + (JSC::DeleteDotNode::emitBytecode): + (JSC::DeleteValueNode::emitBytecode): + (JSC::VoidNode::emitBytecode): + (JSC::TypeOfResolveNode::emitBytecode): + (JSC::TypeOfValueNode::emitBytecode): + (JSC::PrefixResolveNode::emitBytecode): + (JSC::PrefixBracketNode::emitBytecode): + (JSC::PrefixDotNode::emitBytecode): + (JSC::PrefixErrorNode::emitBytecode): + (JSC::UnaryOpNode::emitBytecode): + (JSC::BinaryOpNode::emitBytecode): + (JSC::EqualNode::emitBytecode): + (JSC::StrictEqualNode::emitBytecode): + (JSC::ReverseBinaryOpNode::emitBytecode): + (JSC::ThrowableBinaryOpNode::emitBytecode): + (JSC::InstanceOfNode::emitBytecode): + (JSC::LogicalOpNode::emitBytecode): + (JSC::ConditionalNode::emitBytecode): + (JSC::emitReadModifyAssignment): + (JSC::ReadModifyResolveNode::emitBytecode): + (JSC::AssignResolveNode::emitBytecode): + (JSC::AssignDotNode::emitBytecode): + (JSC::ReadModifyDotNode::emitBytecode): + (JSC::AssignErrorNode::emitBytecode): + (JSC::AssignBracketNode::emitBytecode): + (JSC::ReadModifyBracketNode::emitBytecode): + (JSC::CommaNode::emitBytecode): + (JSC::ConstDeclNode::emitBytecode): + (JSC::ConstStatementNode::emitBytecode): + (JSC::BlockNode::emitBytecode): + (JSC::EmptyStatementNode::emitBytecode): + (JSC::DebuggerStatementNode::emitBytecode): + (JSC::ExprStatementNode::emitBytecode): + (JSC::VarStatementNode::emitBytecode): + (JSC::IfNode::emitBytecode): + (JSC::IfElseNode::emitBytecode): + (JSC::DoWhileNode::emitBytecode): + (JSC::WhileNode::emitBytecode): + (JSC::ForNode::emitBytecode): + (JSC::ForInNode::emitBytecode): + (JSC::ContinueNode::emitBytecode): + (JSC::BreakNode::emitBytecode): + (JSC::ReturnNode::emitBytecode): + (JSC::WithNode::emitBytecode): + (JSC::SwitchNode::emitBytecode): + (JSC::LabelNode::emitBytecode): + (JSC::ThrowNode::emitBytecode): + (JSC::TryNode::emitBytecode): + (JSC::ScopeNode::ScopeNode): + (JSC::EvalNode::emitBytecode): + (JSC::FunctionBodyNode::emitBytecode): + (JSC::ProgramNode::emitBytecode): + (JSC::FuncDeclNode::emitBytecode): + (JSC::FuncExprNode::emitBytecode): + * parser/Nodes.h: + (JSC::UnaryPlusNode::): + (JSC::NegateNode::): + (JSC::BitwiseNotNode::): + (JSC::LogicalNotNode::): + (JSC::MultNode::): + (JSC::DivNode::): + (JSC::ModNode::): + (JSC::AddNode::): + (JSC::SubNode::): + (JSC::LeftShiftNode::): + (JSC::RightShiftNode::): + (JSC::UnsignedRightShiftNode::): + (JSC::LessNode::): + (JSC::GreaterNode::): + (JSC::LessEqNode::): + (JSC::GreaterEqNode::): + (JSC::InstanceOfNode::): + (JSC::InNode::): + (JSC::EqualNode::): + (JSC::NotEqualNode::): + (JSC::StrictEqualNode::): + (JSC::NotStrictEqualNode::): + (JSC::BitAndNode::): + (JSC::BitOrNode::): + (JSC::BitXOrNode::): + (JSC::ProgramNode::): + (JSC::EvalNode::): + (JSC::FunctionBodyNode::): + * runtime/JSNotAnObject.h: + * runtime/StructureID.cpp: + (JSC::StructureID::fromDictionaryTransition): + * wtf/Platform.h: + +2008-11-15 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Renamed Machine to BytecodeInterpreter. + + Nixed the Interpreter class, and changed its two functions to stand-alone + functions. + + * JavaScriptCore.exp: + * VM/CTI.cpp: + (JSC::): + (JSC::CTI::emitCTICall): + (JSC::CTI::CTI): + (JSC::CTI::compileOpCall): + (JSC::CTI::emitSlowScriptCheck): + (JSC::CTI::compileBinaryArithOpSlowCase): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + (JSC::CTI::privateCompile): + (JSC::CTI::privateCompileGetByIdSelf): + (JSC::CTI::privateCompileGetByIdProto): + (JSC::CTI::privateCompileGetByIdChain): + (JSC::CTI::privateCompilePutByIdReplace): + (JSC::CTI::privateCompilePutByIdTransition): + (JSC::CTI::privateCompileCTIMachineTrampolines): + (JSC::CTI::freeCTIMachineTrampolines): + (JSC::CTI::patchGetByIdSelf): + (JSC::CTI::patchPutByIdReplace): + (JSC::CTI::privateCompilePatchGetArrayLength): + (JSC::CTI::compileRegExp): + * VM/CTI.h: + * VM/CodeBlock.cpp: + (JSC::CodeBlock::printStructureIDs): + (JSC::CodeBlock::dump): + (JSC::CodeBlock::derefStructureIDs): + (JSC::CodeBlock::refStructureIDs): + * VM/ExceptionHelpers.cpp: + (JSC::createNotAnObjectError): + * VM/Machine.cpp: + (JSC::jsLess): + (JSC::jsLessEq): + (JSC::BytecodeInterpreter::resolve): + (JSC::BytecodeInterpreter::resolveSkip): + (JSC::BytecodeInterpreter::resolveGlobal): + (JSC::BytecodeInterpreter::resolveBase): + (JSC::BytecodeInterpreter::resolveBaseAndProperty): + (JSC::BytecodeInterpreter::resolveBaseAndFunc): + (JSC::BytecodeInterpreter::slideRegisterWindowForCall): + (JSC::BytecodeInterpreter::callEval): + (JSC::BytecodeInterpreter::BytecodeInterpreter): + (JSC::BytecodeInterpreter::initialize): + (JSC::BytecodeInterpreter::~BytecodeInterpreter): + (JSC::BytecodeInterpreter::dumpCallFrame): + (JSC::BytecodeInterpreter::dumpRegisters): + (JSC::BytecodeInterpreter::isOpcode): + (JSC::BytecodeInterpreter::unwindCallFrame): + (JSC::BytecodeInterpreter::throwException): + (JSC::BytecodeInterpreter::execute): + (JSC::BytecodeInterpreter::debug): + (JSC::BytecodeInterpreter::resetTimeoutCheck): + (JSC::BytecodeInterpreter::checkTimeout): + (JSC::BytecodeInterpreter::createExceptionScope): + (JSC::BytecodeInterpreter::tryCachePutByID): + (JSC::BytecodeInterpreter::uncachePutByID): + (JSC::BytecodeInterpreter::tryCacheGetByID): + (JSC::BytecodeInterpreter::uncacheGetByID): + (JSC::BytecodeInterpreter::privateExecute): + (JSC::BytecodeInterpreter::retrieveArguments): + (JSC::BytecodeInterpreter::retrieveCaller): + (JSC::BytecodeInterpreter::retrieveLastCaller): + (JSC::BytecodeInterpreter::findFunctionCallFrame): + (JSC::BytecodeInterpreter::tryCTICachePutByID): + (JSC::BytecodeInterpreter::tryCTICacheGetByID): + (JSC::BytecodeInterpreter::cti_op_convert_this): + (JSC::BytecodeInterpreter::cti_op_end): + (JSC::BytecodeInterpreter::cti_op_add): + (JSC::BytecodeInterpreter::cti_op_pre_inc): + (JSC::BytecodeInterpreter::cti_timeout_check): + (JSC::BytecodeInterpreter::cti_register_file_check): + (JSC::BytecodeInterpreter::cti_op_loop_if_less): + (JSC::BytecodeInterpreter::cti_op_loop_if_lesseq): + (JSC::BytecodeInterpreter::cti_op_new_object): + (JSC::BytecodeInterpreter::cti_op_put_by_id): + (JSC::BytecodeInterpreter::cti_op_put_by_id_second): + (JSC::BytecodeInterpreter::cti_op_put_by_id_generic): + (JSC::BytecodeInterpreter::cti_op_put_by_id_fail): + (JSC::BytecodeInterpreter::cti_op_get_by_id): + (JSC::BytecodeInterpreter::cti_op_get_by_id_second): + (JSC::BytecodeInterpreter::cti_op_get_by_id_generic): + (JSC::BytecodeInterpreter::cti_op_get_by_id_fail): + (JSC::BytecodeInterpreter::cti_op_instanceof): + (JSC::BytecodeInterpreter::cti_op_del_by_id): + (JSC::BytecodeInterpreter::cti_op_mul): + (JSC::BytecodeInterpreter::cti_op_new_func): + (JSC::BytecodeInterpreter::cti_op_call_JSFunction): + (JSC::BytecodeInterpreter::cti_op_call_arityCheck): + (JSC::BytecodeInterpreter::cti_vm_dontLazyLinkCall): + (JSC::BytecodeInterpreter::cti_vm_lazyLinkCall): + (JSC::BytecodeInterpreter::cti_op_push_activation): + (JSC::BytecodeInterpreter::cti_op_call_NotJSFunction): + (JSC::BytecodeInterpreter::cti_op_create_arguments): + (JSC::BytecodeInterpreter::cti_op_create_arguments_no_params): + (JSC::BytecodeInterpreter::cti_op_tear_off_activation): + (JSC::BytecodeInterpreter::cti_op_tear_off_arguments): + (JSC::BytecodeInterpreter::cti_op_profile_will_call): + (JSC::BytecodeInterpreter::cti_op_profile_did_call): + (JSC::BytecodeInterpreter::cti_op_ret_scopeChain): + (JSC::BytecodeInterpreter::cti_op_new_array): + (JSC::BytecodeInterpreter::cti_op_resolve): + (JSC::BytecodeInterpreter::cti_op_construct_JSConstruct): + (JSC::BytecodeInterpreter::cti_op_construct_NotJSConstruct): + (JSC::BytecodeInterpreter::cti_op_get_by_val): + (JSC::BytecodeInterpreter::cti_op_resolve_func): + (JSC::BytecodeInterpreter::cti_op_sub): + (JSC::BytecodeInterpreter::cti_op_put_by_val): + (JSC::BytecodeInterpreter::cti_op_put_by_val_array): + (JSC::BytecodeInterpreter::cti_op_lesseq): + (JSC::BytecodeInterpreter::cti_op_loop_if_true): + (JSC::BytecodeInterpreter::cti_op_negate): + (JSC::BytecodeInterpreter::cti_op_resolve_base): + (JSC::BytecodeInterpreter::cti_op_resolve_skip): + (JSC::BytecodeInterpreter::cti_op_resolve_global): + (JSC::BytecodeInterpreter::cti_op_div): + (JSC::BytecodeInterpreter::cti_op_pre_dec): + (JSC::BytecodeInterpreter::cti_op_jless): + (JSC::BytecodeInterpreter::cti_op_not): + (JSC::BytecodeInterpreter::cti_op_jtrue): + (JSC::BytecodeInterpreter::cti_op_post_inc): + (JSC::BytecodeInterpreter::cti_op_eq): + (JSC::BytecodeInterpreter::cti_op_lshift): + (JSC::BytecodeInterpreter::cti_op_bitand): + (JSC::BytecodeInterpreter::cti_op_rshift): + (JSC::BytecodeInterpreter::cti_op_bitnot): + (JSC::BytecodeInterpreter::cti_op_resolve_with_base): + (JSC::BytecodeInterpreter::cti_op_new_func_exp): + (JSC::BytecodeInterpreter::cti_op_mod): + (JSC::BytecodeInterpreter::cti_op_less): + (JSC::BytecodeInterpreter::cti_op_neq): + (JSC::BytecodeInterpreter::cti_op_post_dec): + (JSC::BytecodeInterpreter::cti_op_urshift): + (JSC::BytecodeInterpreter::cti_op_bitxor): + (JSC::BytecodeInterpreter::cti_op_new_regexp): + (JSC::BytecodeInterpreter::cti_op_bitor): + (JSC::BytecodeInterpreter::cti_op_call_eval): + (JSC::BytecodeInterpreter::cti_op_throw): + (JSC::BytecodeInterpreter::cti_op_get_pnames): + (JSC::BytecodeInterpreter::cti_op_next_pname): + (JSC::BytecodeInterpreter::cti_op_push_scope): + (JSC::BytecodeInterpreter::cti_op_pop_scope): + (JSC::BytecodeInterpreter::cti_op_typeof): + (JSC::BytecodeInterpreter::cti_op_is_undefined): + (JSC::BytecodeInterpreter::cti_op_is_boolean): + (JSC::BytecodeInterpreter::cti_op_is_number): + (JSC::BytecodeInterpreter::cti_op_is_string): + (JSC::BytecodeInterpreter::cti_op_is_object): + (JSC::BytecodeInterpreter::cti_op_is_function): + (JSC::BytecodeInterpreter::cti_op_stricteq): + (JSC::BytecodeInterpreter::cti_op_nstricteq): + (JSC::BytecodeInterpreter::cti_op_to_jsnumber): + (JSC::BytecodeInterpreter::cti_op_in): + (JSC::BytecodeInterpreter::cti_op_push_new_scope): + (JSC::BytecodeInterpreter::cti_op_jmp_scopes): + (JSC::BytecodeInterpreter::cti_op_put_by_index): + (JSC::BytecodeInterpreter::cti_op_switch_imm): + (JSC::BytecodeInterpreter::cti_op_switch_char): + (JSC::BytecodeInterpreter::cti_op_switch_string): + (JSC::BytecodeInterpreter::cti_op_del_by_val): + (JSC::BytecodeInterpreter::cti_op_put_getter): + (JSC::BytecodeInterpreter::cti_op_put_setter): + (JSC::BytecodeInterpreter::cti_op_new_error): + (JSC::BytecodeInterpreter::cti_op_debug): + (JSC::BytecodeInterpreter::cti_vm_throw): + * VM/Machine.h: + * VM/Register.h: + * VM/SamplingTool.cpp: + (JSC::SamplingTool::run): + * VM/SamplingTool.h: + (JSC::SamplingTool::SamplingTool): + * bytecompiler/CodeGenerator.cpp: + (JSC::CodeGenerator::generate): + (JSC::CodeGenerator::CodeGenerator): + (JSC::CodeGenerator::emitOpcode): + * debugger/DebuggerCallFrame.cpp: + (JSC::DebuggerCallFrame::evaluate): + * jsc.cpp: + (runWithScripts): + * parser/Nodes.cpp: + (JSC::ScopeNode::ScopeNode): + * profiler/ProfileGenerator.cpp: + (JSC::ProfileGenerator::addParentForConsoleStart): + * runtime/ArrayPrototype.cpp: + (JSC::arrayProtoFuncPop): + (JSC::arrayProtoFuncPush): + * runtime/Collector.cpp: + (JSC::Heap::collect): + * runtime/ExecState.h: + (JSC::ExecState::interpreter): + * runtime/FunctionPrototype.cpp: + (JSC::functionProtoFuncApply): + * runtime/Interpreter.cpp: + (JSC::Interpreter::evaluate): + * runtime/JSCell.h: + * runtime/JSFunction.cpp: + (JSC::JSFunction::call): + (JSC::JSFunction::argumentsGetter): + (JSC::JSFunction::callerGetter): + (JSC::JSFunction::construct): + * runtime/JSFunction.h: + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + (JSC::JSGlobalData::~JSGlobalData): + * runtime/JSGlobalData.h: + * runtime/JSGlobalObject.cpp: + (JSC::JSGlobalObject::~JSGlobalObject): + (JSC::JSGlobalObject::setTimeoutTime): + (JSC::JSGlobalObject::startTimeoutCheck): + (JSC::JSGlobalObject::stopTimeoutCheck): + (JSC::JSGlobalObject::mark): + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::globalFuncEval): + * runtime/JSString.h: + * runtime/RegExp.cpp: + (JSC::RegExp::RegExp): + +2008-11-15 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Sam Weinig. + + - Remove SymbolTable from FunctionBodyNode and move it to CodeBlock + + It's not needed for functions that have never been executed, so no + need to waste the memory. Saves ~4M on membuster after 30 pages. + + * VM/CodeBlock.h: + * VM/Machine.cpp: + (JSC::Machine::retrieveArguments): + * parser/Nodes.cpp: + (JSC::EvalNode::generateCode): + (JSC::FunctionBodyNode::generateCode): + * parser/Nodes.h: + * runtime/JSActivation.h: + (JSC::JSActivation::JSActivationData::JSActivationData): + +2008-11-14 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Darin Adler. + + Bug 22259: Make all opcodes use eax as their final result register + <https://bugs.webkit.org/show_bug.cgi?id=22259> + + Change one case of op_add (and the corresponding slow case) to use eax + rather than edx. Also, change the order in which the two results of + resolve_func and resolve_base are emitted so that the retrieved value is + put last into eax. + + This gives no performance change on SunSpider or the V8 benchmark suite + when run in either harness. + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + +2008-11-14 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Geoff has this wacky notion that emitGetArg and emitPutArg should be related to + doing the same thing. Crazy. + + Rename the methods for accessing virtual registers to say 'VirtualRegister' in the + name, and those for setting up the arguments for CTI methods to contain 'CTIArg'. + + * VM/CTI.cpp: + (JSC::CTI::emitGetVirtualRegister): + (JSC::CTI::emitGetVirtualRegisters): + (JSC::CTI::emitPutCTIArgFromVirtualRegister): + (JSC::CTI::emitPutCTIArg): + (JSC::CTI::emitGetCTIArg): + (JSC::CTI::emitPutCTIArgConstant): + (JSC::CTI::emitPutVirtualRegister): + (JSC::CTI::compileOpCallSetupArgs): + (JSC::CTI::compileOpCallEvalSetupArgs): + (JSC::CTI::compileOpConstructSetupArgs): + (JSC::CTI::compileOpCall): + (JSC::CTI::compileOpStrictEq): + (JSC::CTI::putDoubleResultToJSNumberCellOrJSImmediate): + (JSC::CTI::compileBinaryArithOp): + (JSC::CTI::compileBinaryArithOpSlowCase): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + (JSC::CTI::privateCompileCTIMachineTrampolines): + * VM/CTI.h: + +2008-11-14 Greg Bolsinga <bolsinga@apple.com> + + Reviewed by Antti Koivisto + + Fix potential build break by adding StdLibExtras.h + + * GNUmakefile.am: + * JavaScriptCore.vcproj/WTF/WTF.vcproj: + +2008-11-14 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Generate less code for the slow cases of op_call and op_construct. + https://bugs.webkit.org/show_bug.cgi?id=22272 + + 1% progression on v8 tests. + + * VM/CTI.cpp: + (JSC::CTI::emitRetrieveArg): + (JSC::CTI::emitNakedCall): + (JSC::CTI::compileOpCallInitializeCallFrame): + (JSC::CTI::compileOpCall): + (JSC::CTI::privateCompileSlowCases): + (JSC::CTI::privateCompileCTIMachineTrampolines): + * VM/CTI.h: + * VM/CodeBlock.h: + (JSC::getCallLinkInfoReturnLocation): + (JSC::CodeBlock::getCallLinkInfo): + * VM/Machine.cpp: + (JSC::Machine::Machine): + (JSC::Machine::cti_vm_dontLazyLinkCall): + (JSC::Machine::cti_vm_lazyLinkCall): + * VM/Machine.h: + +2008-11-14 Greg Bolsinga <bolsinga@apple.com> + + Reviewed by Darin Alder. + + https://bugs.webkit.org/show_bug.cgi?id=21810 + Remove use of static C++ objects that are destroyed at exit time (destructors) + + Create DEFINE_STATIC_LOCAL macro. Change static local objects to leak to avoid + exit-time destructor. Update code that was changed to fix this issue that ran + into a gcc bug (<rdar://problem/6354696> Codegen issue with C++ static reference + in gcc build 5465). Also typdefs for template types needed to be added in some + cases so the type could make it through the macro successfully. + + Basically code of the form: + static T m; + becomes: + DEFINE_STATIC_LOCAL(T, m, ()); + + Also any code of the form: + static T& m = *new T; + also becomes: + DEFINE_STATIC_LOCAL(T, m, ()); + + * JavaScriptCore.xcodeproj/project.pbxproj: + * wtf/MainThread.cpp: + (WTF::mainThreadFunctionQueueMutex): + (WTF::functionQueue): + * wtf/StdLibExtras.h: Added. Add DEFINE_STATIC_LOCAL macro + * wtf/ThreadingPthreads.cpp: + (WTF::threadMapMutex): + (WTF::threadMap): + (WTF::identifierByPthreadHandle): + +2008-11-13 Sam Weinig <sam@webkit.org> + + Reviewed by Darin Adler + + Fix for https://bugs.webkit.org/show_bug.cgi?id=22269 + Reduce PropertyMap usage + + From observation of StructureID statistics, it became clear that many + StructureID's were not being used as StructureIDs themselves, but rather + only being necessary as links in the transition chain. Acknowledging this + and that PropertyMaps stored in StructureIDs can be treated as caches, that + is that they can be reconstructed on demand, it became clear that we could + reduce the memory consumption of StructureIDs by only keeping PropertyMaps + for the StructureIDs that need them the most. + + The specific strategy used to reduce the number of StructureIDs with + PropertyMaps is to take the previous StructureIDs PropertyMap when initially + transitioning (addPropertyTransition) from it and clearing out the pointer + in the process. The next time we need to do the same transition, for instance + repeated calls to the same constructor, we use the new addPropertyTransitionToExistingStructure + first, which allows us not to need the PropertyMap to determine if the property + exists already, since a transition to that property would require it not already + be present in the StructureID. Should there be no transition, the PropertyMap + can be constructed on demand (via materializePropertyMap) to determine if the put is a + replace or a transition to a new StructureID. + + Reduces memory use on Membuster head test (30 pages open) by ~15MB. + + * JavaScriptCore.exp: + * runtime/JSObject.h: + (JSC::JSObject::putDirect): First use addPropertyTransitionToExistingStructure + so that we can avoid building the PropertyMap on subsequent similar object + creations. + * runtime/PropertyMapHashTable.h: + (JSC::PropertyMapEntry::PropertyMapEntry): Add version of constructor which takes + all values to be used when lazily building the PropertyMap. + * runtime/StructureID.cpp: + (JSC::StructureID::dumpStatistics): Add statistics on the number of StructureIDs + with PropertyMaps. + (JSC::StructureID::StructureID): Rename m_cachedTransistionOffset to m_offset + (JSC::isPowerOf2): + (JSC::nextPowerOf2): + (JSC::sizeForKeyCount): Returns the expected size of a PropertyMap for a key count. + (JSC::StructureID::materializePropertyMap): Builds the PropertyMap out of its previous pointer chain. + (JSC::StructureID::addPropertyTransitionToExistingStructure): Only transitions if there is a + an existing transition. + (JSC::StructureID::addPropertyTransition): Instead of always copying the ProperyMap, try and take + it from it previous pointer. + (JSC::StructureID::removePropertyTransition): Simplify by calling toDictionaryTransition() to do + transition work. + (JSC::StructureID::changePrototypeTransition): Build the PropertyMap if necessary before transitioning + because once you have transitioned, you will not be able to reconstruct it afterwards as there is no + previous pointer, pinning the ProperyMap as well. + (JSC::StructureID::getterSetterTransition): Ditto. + (JSC::StructureID::toDictionaryTransition): Pin the PropertyMap so that it is not destroyed on further transitions. + (JSC::StructureID::fromDictionaryTransition): We can only transition back from a dictionary transition if there + are no deleted offsets. + (JSC::StructureID::addPropertyWithoutTransition): Build PropertyMap on demands and pin. + (JSC::StructureID::removePropertyWithoutTransition): Ditto. + (JSC::StructureID::get): Build on demand. + (JSC::StructureID::createPropertyMapHashTable): Add version of create that takes a size + for on demand building. + (JSC::StructureID::expandPropertyMapHashTable): + (JSC::StructureID::rehashPropertyMapHashTable): + (JSC::StructureID::getEnumerablePropertyNamesInternal): Build PropertyMap on demand. + * runtime/StructureID.h: + (JSC::StructureID::propertyStorageSize): Account for StructureIDs without PropertyMaps. + (JSC::StructureID::isEmpty): Ditto. + (JSC::StructureID::materializePropertyMapIfNecessary): + (JSC::StructureID::get): Build PropertyMap on demand + +2008-11-14 Csaba Osztrogonac <oszi@inf.u-szeged.hu> + + Reviewed by Simon Hausmann. + + <https://bugs.webkit.org/show_bug.cgi?id=21500> + + JavaScriptCore build with -O3 flag instead of -O2 (gcc). + 2.02% speedup on SunSpider (Qt-port on Linux) + 1.10% speedup on V8 (Qt-port on Linux) + 3.45% speedup on WindScorpion (Qt-port on Linux) + + * JavaScriptCore.pri: + +2008-11-14 Kristian Amlie <kristian.amlie@trolltech.com> + + Reviewed by Darin Adler. + + Compile fix for RVCT. + + In reality, it is two fixes: + + 1. Remove typename. I believe typename can only be used when the named + type depends on the template parameters, which it doesn't in this + case, so I think this is more correct. + 2. Replace ::iterator scope with specialized typedef. This is to work + around a bug in RVCT. + + https://bugs.webkit.org/show_bug.cgi?id=22260 + + * wtf/ListHashSet.h: + (WTF::::find): + +2008-11-14 Kristian Amlie <kristian.amlie@trolltech.com> + + Reviewed by Darin Adler. + + Compile fix for WINSCW. + + This fix doesn't protect against implicit conversions from bool to + integers, but most likely that will be caught on another platform. + + https://bugs.webkit.org/show_bug.cgi?id=22260 + + * wtf/PassRefPtr.h: + (WTF::PassRefPtr::operator bool): + * wtf/RefPtr.h: + (WTF::RefPtr::operator bool): + +2008-11-14 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Darin Adler. + + Bug 22245: Move wtf/dtoa.h into the WTF namespace + <https://bugs.webkit.org/show_bug.cgi?id=22245> + + Move wtf/dtoa.h into the WTF namespace from the JSC namespace. This + introduces some ambiguities in name lookups, so I changed all uses of + the functions in wtf/dtoa.h to explicitly state the namespace. + + * JavaScriptCore.exp: + * parser/Lexer.cpp: + (JSC::Lexer::lex): + * runtime/InitializeThreading.cpp: + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::parseInt): + * runtime/NumberPrototype.cpp: + (JSC::integerPartNoExp): + (JSC::numberProtoFuncToExponential): + * runtime/UString.cpp: + (JSC::concatenate): + (JSC::UString::from): + (JSC::UString::toDouble): + * wtf/dtoa.cpp: + * wtf/dtoa.h: + +2008-11-14 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Maciej Stachowiak. + + Bug 22257: Enable redundant read optimizations for results generated by compileBinaryArithOp() + <https://bugs.webkit.org/show_bug.cgi?id=22257> + + This shows no change in performance on either SunSpider or the V8 + benchmark suite, but it removes an ugly special case and allows for + future optimizations to be implemented in a cleaner fashion. + + This patch was essentially given to me by Gavin Barraclough upon my + request, but I did regression and performance testing so that he could + work on something else. + + * VM/CTI.cpp: + (JSC::CTI::putDoubleResultToJSNumberCellOrJSImmediate): Move the final + result to eax if it is not already there. + (JSC::CTI::compileBinaryArithOp): Remove the killing of the final result + register that disables the optimization. + +2008-11-13 Eric Seidel <eric@webkit.org> + + Reviewed by Adam Roben. + + Add a Scons-based build system for building + the Chromium-Mac build of JavaScriptCore. + https://bugs.webkit.org/show_bug.cgi?id=21991 + + * JavaScriptCore.scons: Added. + * SConstruct: Added. + +2008-11-13 Eric Seidel <eric@webkit.org> + + Reviewed by Adam Roben. + + Add PLATFORM(CHROMIUM) to the "we don't use cairo" blacklist + until https://bugs.webkit.org/show_bug.cgi?id=22250 is fixed. + + * wtf/Platform.h: + +2008-11-13 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Sam Weinig. + + In r38375 the 'jsc' shell was changed to improve teardown on quit. The + main() function in jsc.cpp uses Structured Exception Handling, so Visual + C++ emits a warning when destructors are used. + + In order to speculatively fix the Windows build, this patch changes that + code to use explicit pointer manipulation and locking rather than smart + pointers and RAII. + + * jsc.cpp: + (main): + +2008-11-13 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Darin Adler. + + Bug 22246: Get arguments for opcodes together to eliminate more redundant memory reads + <https://bugs.webkit.org/show_bug.cgi?id=22246> + + It is common for opcodes to read their first operand into eax and their + second operand into edx. If the value intended for the second operand is + in eax, we should first move eax to the register for the second operand + and then read the first operand into eax. + + This is a 0.5% speedup on SunSpider and a 2.0% speedup on the V8 + benchmark suite when measured using the V8 harness. + + * VM/CTI.cpp: + (JSC::CTI::emitGetArgs): + (JSC::CTI::compileOpStrictEq): + (JSC::CTI::compileBinaryArithOp): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + * VM/CTI.h: + +2008-11-13 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Darin Adler. + + Bug 22238: Avoid unnecessary reads of temporaries when the target machine register is not eax + <https://bugs.webkit.org/show_bug.cgi?id=22238> + + Enable the optimization of not reading a value back from memory that we + just wrote when the target machine register is not eax. In order to do + this, the code generation for op_put_global_var must be changed to + read its argument into a register before overwriting eax. + + This is a 0.5% speedup on SunSpider and shows no change on the V8 + benchmark suite when run in either harness. + + * VM/CTI.cpp: + (JSC::CTI::emitGetArg): + (JSC::CTI::privateCompileMainPass): + +2008-11-13 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Alexey Proskuryakov. + + Perform teardown in the 'jsc' shell in order to suppress annoying and + misleading leak messages. There is still a lone JSC::Node leaking when + quit() is called, but hopefully that can be fixed as well. + + * jsc.cpp: + (functionQuit): + (main): + +2008-11-13 Mike Pinkerton <pinkerton@chromium.org> + + Reviewed by Sam Weinig. + + Fix for https://bugs.webkit.org/show_bug.cgi?id=22087 + Need correct platform defines for Mac Chromium + + Set the appropriate platform defines for Mac Chromium, which is + similar to PLATFORM(MAC), but isn't. + + * wtf/Platform.h: + +2008-11-13 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Cameron Zwarich. + + - remove immediate checks from native codegen for known non-immediate cases like "this" + + ~.5% speedup on v8 benchmarks + + In the future we can extend this model to remove all sorts of + typechecks based on local type info or type inference. + + I also added an assertion to verify that all slow cases linked as + many slow case jumps as the corresponding fast case generated, and + fixed the pre-existing cases where this was not true. + + * VM/CTI.cpp: + (JSC::CTI::emitJumpSlowCaseIfNotJSCell): + (JSC::CTI::linkSlowCaseIfNotJSCell): + (JSC::CTI::compileBinaryArithOp): + (JSC::CTI::compileBinaryArithOpSlowCase): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + * VM/CTI.h: + * VM/CodeBlock.h: + (JSC::CodeBlock::isKnownNotImmediate): + +2008-11-13 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Maciej Stachowiak. + + Bug 21943: Avoid needless reads of temporary values in CTI code + <https://bugs.webkit.org/show_bug.cgi?id=21943> + + If an opcode needs to load a virtual register and a previous opcode left + the contents of that virtual register in a machine register, use the + value in the machine register rather than getting it from memory. + + In order to perform this optimization, it is necessary to know the + jump tagets in the CodeBlock. For temporaries, the only problematic + jump targets are binary logical operators and the ternary conditional + operator. However, if this optimization were to be extended to local + variable registers as well, other jump targets would need to be + included, like switch statement cases and the beginnings of catch + blocks. + + This optimization also requires that the fast case and the slow case + of an opcode use emitPutResult() on the same register, which was chosen + to be eax, as that is the register into which we read the first operand + of opcodes. In order to make this the case, we needed to add some mov + instructions to the slow cases of some instructions. + + This optimizaton is not applied whenever compileBinaryArithOp() is used + to compile an opcode, because different machine registers may be used to + store the final result. It seems possible to rewrite the code generation + in compileBinaryArithOp() to allow for this optimization. + + This optimization is also not applied when generating slow cases, + because some fast cases overwrite the value of eax before jumping to the + slow case. In the future, it may be possible to apply this optimization + to slow cases as well, but it did not seem to be a speedup when testing + an early version of this patch. + + This is a 1.0% speedup on SunSpider and a 6.3% speedup on the V8 + benchmark suite. + + * VM/CTI.cpp: + (JSC::CTI::killLastResultRegister): + (JSC::CTI::emitGetArg): + (JSC::CTI::emitGetPutArg): + (JSC::CTI::emitGetCTIParam): + (JSC::CTI::emitGetFromCallFrameHeader): + (JSC::CTI::emitPutResult): + (JSC::CTI::emitCTICall): + (JSC::CTI::CTI): + (JSC::CTI::compileOpCall): + (JSC::CTI::compileOpStrictEq): + (JSC::CTI::emitSlowScriptCheck): + (JSC::CTI::compileBinaryArithOp): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + (JSC::CTI::privateCompileGetByIdProto): + (JSC::CTI::privateCompilePatchGetArrayLength): + * VM/CTI.h: + * VM/CodeBlock.h: + (JSC::CodeBlock::isTemporaryRegisterIndex): + * bytecompiler/CodeGenerator.cpp: + (JSC::CodeGenerator::emitLabel): + +2008-11-12 Alp Toker <alp@nuanti.com> + + autotools build system fix-up only. Add FloatQuad.h to the source + lists and sort them. + + * GNUmakefile.am: + +2008-11-12 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Fixed https://bugs.webkit.org/show_bug.cgi?id=22192 + +37 failures in fast/profiler + + along with Darin's review comments in + https://bugs.webkit.org/show_bug.cgi?id=22174 + Simplified op_call by nixing its responsibility for moving the value of + "this" into the first argument slot + + * VM/Machine.cpp: + (JSC::returnToThrowTrampoline): + (JSC::throwStackOverflowError): + (JSC::Machine::cti_register_file_check): + (JSC::Machine::cti_op_call_arityCheck): + (JSC::Machine::cti_vm_throw): Moved the throw logic into a function, since + functions are better than macros. + + * bytecompiler/CodeGenerator.cpp: + (JSC::CodeGenerator::emitCall): + (JSC::CodeGenerator::emitConstruct): Ensure that the function register + is preserved if profiling is enabled, since the profiler uses that + register. + + * runtime/JSGlobalData.h: Renamed throwReturnAddress to exceptionLocation, + because I had a hard time understanding what "throwReturnAddress" meant. + +2008-11-12 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Roll in r38322, now that test failures have been fixed. + + * VM/CTI.cpp: + (JSC::CTI::compileOpCallSetupArgs): + (JSC::CTI::compileOpCallEvalSetupArgs): + (JSC::CTI::compileOpConstructSetupArgs): + (JSC::CTI::compileOpCall): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + * VM/CTI.h: + * VM/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * VM/Machine.cpp: + (JSC::Machine::callEval): + (JSC::Machine::dumpCallFrame): + (JSC::Machine::dumpRegisters): + (JSC::Machine::execute): + (JSC::Machine::privateExecute): + (JSC::Machine::cti_register_file_check): + (JSC::Machine::cti_op_call_arityCheck): + (JSC::Machine::cti_op_call_NotJSFunction): + (JSC::Machine::cti_op_construct_JSConstruct): + (JSC::Machine::cti_op_construct_NotJSConstruct): + (JSC::Machine::cti_op_call_eval): + (JSC::Machine::cti_vm_throw): + * VM/Machine.h: + * bytecompiler/CodeGenerator.cpp: + (JSC::CodeGenerator::emitCall): + (JSC::CodeGenerator::emitCallEval): + (JSC::CodeGenerator::emitConstruct): + * bytecompiler/CodeGenerator.h: + * parser/Nodes.cpp: + (JSC::EvalFunctionCallNode::emitCode): + (JSC::FunctionCallValueNode::emitCode): + (JSC::FunctionCallResolveNode::emitCode): + (JSC::FunctionCallBracketNode::emitCode): + (JSC::FunctionCallDotNode::emitCode): + * parser/Nodes.h: + (JSC::ScopeNode::neededConstants): + +2008-11-12 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Cameron Zwarich. + + Fix for https://bugs.webkit.org/show_bug.cgi?id=22201 + Integer conversion in array.length was safe signed values, + but the length is unsigned. + + * VM/CTI.cpp: + (JSC::CTI::privateCompilePatchGetArrayLength): + +2008-11-12 Cameron Zwarich <zwarich@apple.com> + + Rubber-stamped by Mark Rowe. + + Roll out r38322 due to test failures on the bots. + + * VM/CTI.cpp: + (JSC::CTI::compileOpCallSetupArgs): + (JSC::CTI::compileOpCall): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + * VM/CTI.h: + * VM/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * VM/Machine.cpp: + (JSC::Machine::callEval): + (JSC::Machine::dumpCallFrame): + (JSC::Machine::dumpRegisters): + (JSC::Machine::execute): + (JSC::Machine::privateExecute): + (JSC::Machine::throwStackOverflowPreviousFrame): + (JSC::Machine::cti_register_file_check): + (JSC::Machine::cti_op_call_arityCheck): + (JSC::Machine::cti_op_call_NotJSFunction): + (JSC::Machine::cti_op_construct_JSConstruct): + (JSC::Machine::cti_op_construct_NotJSConstruct): + (JSC::Machine::cti_op_call_eval): + (JSC::Machine::cti_vm_throw): + * VM/Machine.h: + * bytecompiler/CodeGenerator.cpp: + (JSC::CodeGenerator::emitCall): + (JSC::CodeGenerator::emitCallEval): + (JSC::CodeGenerator::emitConstruct): + * bytecompiler/CodeGenerator.h: + * parser/Nodes.cpp: + (JSC::EvalFunctionCallNode::emitCode): + (JSC::FunctionCallValueNode::emitCode): + (JSC::FunctionCallResolveNode::emitCode): + (JSC::FunctionCallBracketNode::emitCode): + (JSC::FunctionCallDotNode::emitCode): + * parser/Nodes.h: + (JSC::ScopeNode::neededConstants): + +2008-11-11 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Darin Adler. + + Fixed https://bugs.webkit.org/show_bug.cgi?id=22174 + Simplified op_call by nixing its responsibility for moving the value of + "this" into the first argument slot. + + Instead, the caller emits an explicit load or mov instruction, or relies + on implicit knowledge that "this" is already in the first argument slot. + As a result, two operands to op_call are gone: firstArg and thisVal. + + SunSpider and v8 tests show no change in bytecode or CTI. + + * VM/CTI.cpp: + (JSC::CTI::compileOpCallSetupArgs): + (JSC::CTI::compileOpCallEvalSetupArgs): + (JSC::CTI::compileOpConstructSetupArgs): Split apart these three versions + of setting up arguments to op_call, because they're more different than + they are the same -- even more so with this patch. + + (JSC::CTI::compileOpCall): Updated for the fact that op_construct doesn't + match op_call anymore. + + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): Merged a few call cases. Updated + for changes mentioned above. + + * VM/CTI.h: + + * VM/CodeBlock.cpp: + (JSC::CodeBlock::dump): Updated for new bytecode format of call / construct. + + * VM/Machine.cpp: + (JSC::Machine::callEval): Updated for new bytecode format of call / construct. + + (JSC::Machine::dumpCallFrame): + (JSC::Machine::dumpRegisters): Simplified these debugging functions, + taking advantage of the new call frame layout. + + (JSC::Machine::execute): Fixed up the eval version of execute to be + friendlier to calls in the new format. + + (JSC::Machine::privateExecute): Implemented the new call format in + bytecode. + + (JSC::Machine::cti_op_call_NotJSFunction): + (JSC::Machine::cti_op_construct_JSConstruct): + (JSC::Machine::cti_op_construct_NotJSConstruct): + (JSC::Machine::cti_op_call_eval): Updated CTI helpers to match the new + call format. + + Fixed a latent bug in stack overflow checking that is now hit because + the register layout has changed a bit -- namely: when throwing a stack + overflow exception inside an op_call helper, we need to account for the + fact that the current call frame is only half-constructed, and use the + parent call frame instead. + + * VM/Machine.h: + + * bytecompiler/CodeGenerator.cpp: + (JSC::CodeGenerator::emitCall): + (JSC::CodeGenerator::emitCallEval): + (JSC::CodeGenerator::emitConstruct): + * bytecompiler/CodeGenerator.h: Updated codegen to match the new call + format. + + * parser/Nodes.cpp: + (JSC::EvalFunctionCallNode::emitCode): + (JSC::FunctionCallValueNode::emitCode): + (JSC::FunctionCallResolveNode::emitCode): + (JSC::FunctionCallBracketNode::emitCode): + (JSC::FunctionCallDotNode::emitCode): + * parser/Nodes.h: + (JSC::ScopeNode::neededConstants): ditto + +2008-11-11 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Geoff Garen. + + Remove an unused forwarding header for a file that no longer exists. + + * ForwardingHeaders/JavaScriptCore/JSLock.h: Removed. + +2008-11-11 Mark Rowe <mrowe@apple.com> + + Fix broken dependencies building JavaScriptCore on a freezing cold cat, caused + by failure to update all instances of "kjs" to their new locations. + + * JavaScriptCore.xcodeproj/project.pbxproj: + +2008-11-11 Alexey Proskuryakov <ap@webkit.org> + + Rubber-stamped by Adam Roben. + + * wtf/AVLTree.h: (WTF::AVLTree::Iterator::start_iter): + Fix indentation a little more. + +2008-11-11 Cameron Zwarich <zwarich@apple.com> + + Rubber-stamped by Sam Weinig. + + Clean up EvalCodeCache to match our coding style a bit more. + + * VM/EvalCodeCache.h: + (JSC::EvalCodeCache::get): + +2008-11-11 Cameron Zwarich <zwarich@apple.com> + + Rubber-stamped by Sam Weinig. + + Bug 22179: Move EvalCodeCache from CodeBlock.h into its own file + <https://bugs.webkit.org/show_bug.cgi?id=22179> + + * GNUmakefile.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * VM/CodeBlock.h: + * VM/EvalCodeCache.h: Copied from VM/CodeBlock.h. + * VM/Machine.cpp: + +2008-11-11 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Sam Weinig. + + Remove the 'm_' prefix from the fields of the SwitchRecord struct. + + * VM/CTI.cpp: + (JSC::CTI::privateCompile): + * VM/CTI.h: + (JSC::SwitchRecord): + (JSC::SwitchRecord::SwitchRecord): + +2008-11-11 Cameron Zwarich <zwarich@apple.com> + + Rubber-stamped by Sam Weinig. + + Make asInteger() a static function so that it has internal linkage. + + * VM/CTI.cpp: + (JSC::asInteger): + +2008-11-11 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Mark Rowe. + + - shrink CodeBlock and AST related Vectors to exact fit (5-10M savings on membuster test) + + No perf regression combined with the last patch (each seems like a small regression individually) + + * bytecompiler/CodeGenerator.cpp: + (JSC::CodeGenerator::generate): + * parser/Nodes.h: + (JSC::SourceElements::releaseContentsIntoVector): + * wtf/Vector.h: + (WTF::Vector::shrinkToFit): + +2008-11-11 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Mark Rowe. + + - remove inline capacity from declaration stacks (15M savings on membuster test) + + No perf regression on SunSpider or V8 test combined with other upcoming memory improvement patch. + + * JavaScriptCore.exp: + * parser/Nodes.h: + +2008-11-11 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Oliver Hunt. + + While r38286 removed the need for the m_callFrame member variable of + CTI, it should be also be removed. + + * VM/CTI.h: + +2008-11-10 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Oliver Hunt. + + Make CTI::asInteger() a non-member function, since it needs no access to + any of CTI's member variables. + + * VM/CTI.cpp: + (JSC::asInteger): + * VM/CTI.h: + +2008-11-10 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Maciej Stachowiak. + + Use 'value' instead of 'js' in CTI as a name for JSValue* to match our + usual convention elsewhere. + + * VM/CTI.cpp: + (JSC::CTI::emitGetArg): + (JSC::CTI::emitGetPutArg): + (JSC::CTI::getConstantImmediateNumericArg): + (JSC::CTI::printOpcodeOperandTypes): + +2008-11-10 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Maciej Stachowiak. + + Make CTI::getConstant() a member function of CodeBlock instead. + + * VM/CTI.cpp: + (JSC::CTI::emitGetArg): + (JSC::CTI::emitGetPutArg): + (JSC::CTI::getConstantImmediateNumericArg): + (JSC::CTI::printOpcodeOperandTypes): + (JSC::CTI::privateCompileMainPass): + * VM/CTI.h: + * VM/CodeBlock.h: + (JSC::CodeBlock::getConstant): + +2008-11-10 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Sam Weinig. + + Rename CodeBlock::isConstant() to isConstantRegisterIndex(). + + * VM/CTI.cpp: + (JSC::CTI::emitGetArg): + (JSC::CTI::emitGetPutArg): + (JSC::CTI::getConstantImmediateNumericArg): + (JSC::CTI::printOpcodeOperandTypes): + (JSC::CTI::privateCompileMainPass): + * VM/CodeBlock.h: + (JSC::CodeBlock::isConstantRegisterIndex): + * bytecompiler/CodeGenerator.cpp: + (JSC::CodeGenerator::emitEqualityOp): + +2008-11-10 Gavin Barraclough <barraclough@apple.com> + + Build fix for non-CTI builds. + + * VM/Machine.cpp: + (JSC::Machine::initialize): + +2008-11-10 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Sam Weinig. + + Remove the unused labels member variable of CodeBlock. + + * VM/CodeBlock.h: + * VM/LabelID.h: + (JSC::LabelID::setLocation): + +2008-11-10 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Cameron Zwarich. + + Batch compile the set of static trampolines at the point Machine is constructed, using a single allocation. + Refactor out m_callFrame from CTI, since this is only needed to access the global data (instead store a + pointer to the global data directly, since this is available at the point the Machine is constructed). + Add a method to align the code buffer, to allow JIT generation for multiple trampolines in one block. + + * VM/CTI.cpp: + (JSC::CTI::getConstant): + (JSC::CTI::emitGetArg): + (JSC::CTI::emitGetPutArg): + (JSC::CTI::getConstantImmediateNumericArg): + (JSC::CTI::printOpcodeOperandTypes): + (JSC::CTI::CTI): + (JSC::CTI::compileBinaryArithOp): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileGetByIdProto): + (JSC::CTI::privateCompileGetByIdChain): + (JSC::CTI::privateCompileCTIMachineTrampolines): + (JSC::CTI::freeCTIMachineTrampolines): + * VM/CTI.h: + (JSC::CTI::compile): + (JSC::CTI::compileGetByIdSelf): + (JSC::CTI::compileGetByIdProto): + (JSC::CTI::compileGetByIdChain): + (JSC::CTI::compilePutByIdReplace): + (JSC::CTI::compilePutByIdTransition): + (JSC::CTI::compileCTIMachineTrampolines): + (JSC::CTI::compilePatchGetArrayLength): + * VM/Machine.cpp: + (JSC::Machine::initialize): + (JSC::Machine::~Machine): + (JSC::Machine::execute): + (JSC::Machine::tryCTICachePutByID): + (JSC::Machine::tryCTICacheGetByID): + (JSC::Machine::cti_op_call_JSFunction): + (JSC::Machine::cti_vm_lazyLinkCall): + * VM/Machine.h: + * masm/X86Assembler.h: + (JSC::JITCodeBuffer::isAligned): + (JSC::X86Assembler::): + (JSC::X86Assembler::align): + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + +2008-11-10 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Antti Koivisto. + + - Make Vector::clear() release the Vector's memory (1MB savings on membuster) + https://bugs.webkit.org/show_bug.cgi?id=22170 + + * wtf/Vector.h: + (WTF::VectorBufferBase::deallocateBuffer): Set capacity to 0 as + well as size, otherwise shrinking capacity to 0 can fail to reset + the capacity and thus cause a future crash. + (WTF::Vector::~Vector): Shrink size not capacity; we only need + to call destructors, the buffer will be freed anyway. + (WTF::Vector::clear): Change this to shrinkCapacity(0), not just shrink(0). + (WTF::::shrinkCapacity): Use shrink() instead of resize() for case where + the size is greater than the new capacity, to work with types that have no + default constructor. + +2008-11-10 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Maciej Stachowiak. + + Split multiple definitions into separate lines. + + * VM/CTI.cpp: + (JSC::CTI::compileBinaryArithOp): + +2008-11-10 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Geoff Garen. + + Bug 22162: Remove cachedValueGetter from the JavaScriptCore API implementation + <https://bugs.webkit.org/show_bug.cgi?id=22162> + + There is no more need for the cachedValueGetter hack now that we have + PropertySlot::setValue(), so we should remove it. + + * API/JSCallbackObject.h: + * API/JSCallbackObjectFunctions.h: + (JSC::::getOwnPropertySlot): + +2008-11-10 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Darin Adler. + + Bug 22152: Remove asObject() call from JSCallbackObject::getOwnPropertySlot() + <https://bugs.webkit.org/show_bug.cgi?id=22152> + + With the recent change to adopt asType() style cast functions with + assertions instead of static_casts in many places, the assertion for + the asObject() call in JSCallbackObject::getOwnPropertySlot() has been + failing when using any nontrivial client of the JavaScriptCore API. + The cast isn't even necessary to call slot.setCustom(), so it should + be removed. + + * API/JSCallbackObjectFunctions.h: + (JSC::JSCallbackObject::getOwnPropertySlot): + +2008-11-10 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Adam Roben. + + A few coding style fixes for AVLTree. + + * wtf/AVLTree.h: Moved to WTF namespace, Removed "KJS_" from include guards. + (WTF::AVLTree::Iterator::start_iter): Fixed indentation + + * runtime/JSArray.cpp: Added "using namepace WTF". + +2008-11-09 Cameron Zwarich <zwarich@apple.com> + + Not reviewed. + + Speculatively fix the non-AllInOne build. + + * runtime/NativeErrorConstructor.cpp: + +2008-11-09 Darin Adler <darin@apple.com> + + Reviewed by Tim Hatcher. + + - https://bugs.webkit.org/show_bug.cgi?id=22149 + remove unused code from the parser + + * AllInOneFile.cpp: Removed nodes2string.cpp. + * GNUmakefile.am: Ditto. + * JavaScriptCore.exp: Ditto. + * JavaScriptCore.pri: Ditto. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Ditto. + * JavaScriptCore.xcodeproj/project.pbxproj: Ditto. + * JavaScriptCoreSources.bkl: Ditto. + + * VM/CodeBlock.h: Added include. + + * VM/Machine.cpp: (JSC::Machine::execute): Use the types from + DeclarationStacks as DeclarationStacks:: rather than Node:: since + "Node" really has little to do with it. + * bytecompiler/CodeGenerator.cpp: + (JSC::CodeGenerator::CodeGenerator): Ditto. + + * jsc.cpp: + (Options::Options): Removed prettyPrint option. + (runWithScripts): Ditto. + (printUsageStatement): Ditto. + (parseArguments): Ditto. + (jscmain): Ditto. + + * parser/Grammar.y: Removed use of obsolete ImmediateNumberNode. + + * parser/Nodes.cpp: + (JSC::ThrowableExpressionData::emitThrowError): Use inline functions + instead of direct member access for ThrowableExpressionData values. + (JSC::BracketAccessorNode::emitCode): Ditto. + (JSC::DotAccessorNode::emitCode): Ditto. + (JSC::NewExprNode::emitCode): Ditto. + (JSC::EvalFunctionCallNode::emitCode): Ditto. + (JSC::FunctionCallValueNode::emitCode): Ditto. + (JSC::FunctionCallResolveNode::emitCode): Ditto. + (JSC::FunctionCallBracketNode::emitCode): Ditto. + (JSC::FunctionCallDotNode::emitCode): Ditto. + (JSC::PostfixResolveNode::emitCode): Ditto. + (JSC::PostfixBracketNode::emitCode): Ditto. + (JSC::PostfixDotNode::emitCode): Ditto. + (JSC::DeleteResolveNode::emitCode): Ditto. + (JSC::DeleteBracketNode::emitCode): Ditto. + (JSC::DeleteDotNode::emitCode): Ditto. + (JSC::PrefixResolveNode::emitCode): Ditto. + (JSC::PrefixBracketNode::emitCode): Ditto. + (JSC::PrefixDotNode::emitCode): Ditto. + (JSC::ThrowableBinaryOpNode::emitCode): Ditto. + (JSC::InstanceOfNode::emitCode): Ditto. + (JSC::ReadModifyResolveNode::emitCode): Ditto. + (JSC::AssignResolveNode::emitCode): Ditto. + (JSC::AssignDotNode::emitCode): Ditto. + (JSC::ReadModifyDotNode::emitCode): Ditto. + (JSC::AssignBracketNode::emitCode): Ditto. + (JSC::ReadModifyBracketNode::emitCode): Ditto. + (JSC::statementListEmitCode): Take a const StatementVector instead + of a non-const one. Also removed unused statementListPushFIFO. + (JSC::ForInNode::emitCode): Inline functions instead of member access. + (JSC::ThrowNode::emitCode): Ditto. + (JSC::EvalNode::emitCode): Ditto. + (JSC::FunctionBodyNode::emitCode): Ditto. + (JSC::ProgramNode::emitCode): Ditto. + + * parser/Nodes.h: Removed unused includes and forward declarations. + Removed Precedence enum. Made many more members private instead of + protected or public. Removed unused NodeStack typedef. Moved the + VarStack and FunctionStack typedefs from Node to ScopeNode. Made + Node::emitCode pure virtual and changed classes that don't emit + any code to inherit from ParserRefCounted rather than Node. + Moved isReturnNode from Node to StatementNode. Removed the + streamTo, precedence, and needsParensIfLeftmost functions from + all classes. Removed the ImmediateNumberNode class and make + NumberNode::setValue nonvirtual. + + * parser/nodes2string.cpp: Removed. + +2008-11-09 Darin Adler <darin@apple.com> + + Reviewed by Sam Weinig and Maciej Stachowiak. + Includes some work done by Chris Brichford. + + - fix https://bugs.webkit.org/show_bug.cgi?id=14886 + Stack overflow due to deeply nested parse tree doing repeated string concatentation + + Test: fast/js/large-expressions.html + + 1) Code generation is recursive, so takes stack proportional to the complexity + of the source code expression. Fixed by setting an arbitrary recursion limit + of 10,000 nodes. + + 2) Destruction of the syntax tree was recursive. Fixed by introducing a + non-recursive mechanism for destroying the tree. + + * bytecompiler/CodeGenerator.cpp: + (JSC::CodeGenerator::CodeGenerator): Initialize depth to 0. + (JSC::CodeGenerator::emitThrowExpressionTooDeepException): Added. Emits the code + to throw a "too deep" exception. + * bytecompiler/CodeGenerator.h: + (JSC::CodeGenerator::emitNode): Check depth and emit an exception if we exceed + the maximum depth. + + * parser/Nodes.cpp: + (JSC::NodeReleaser::releaseAllNodes): Added. To be called inside node destructors + to avoid recursive calls to destructors for nodes inside this one. + (JSC::NodeReleaser::release): Added. To be called inside releaseNodes functions. + Also added releaseNodes functions and calls to releaseAllNodes inside destructors + for each class derived from Node that has RefPtr to other nodes. + (JSC::NodeReleaser::adopt): Added. Used by the release function. + (JSC::NodeReleaser::adoptFunctionBodyNode): Added. + + * parser/Nodes.h: Added declarations of releaseNodes and destructors in all classes + that needed it. Eliminated use of ListRefPtr and releaseNext, which are the two parts + of an older solution to the non-recursive destruction problem that works only for + lists, whereas the new solution works for other graphs. Changed ReverseBinaryOpNode + to use BinaryOpNode as a base class to avoid some duplicated code. + +2008-11-08 Kevin Ollivier <kevino@theolliviers.com> + + wx build fixes after addition of JSCore parser and bycompiler dirs. Also cleanup + the JSCore Bakefile's group names to be consistent. + + * JavaScriptCoreSources.bkl: + * jscore.bkl: + +2008-11-07 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Geoff Garen. + + Bug 21801: REGRESSION (r37821): YUI date formatting JavaScript puts the letter 'd' in place of the day + <https://bugs.webkit.org/show_bug.cgi?id=21801> + + Fix the constant register check in the 'typeof' optimization in + CodeGenerator, which was completely broken after r37821. + + * bytecompiler/CodeGenerator.cpp: + (JSC::CodeGenerator::emitEqualityOp): + +2008-11-07 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Geoff Garen. + + Bug 22129: Move CTI::isConstant() to CodeBlock + <https://bugs.webkit.org/show_bug.cgi?id=22129> + + * VM/CTI.cpp: + (JSC::CTI::emitGetArg): + (JSC::CTI::emitGetPutArg): + (JSC::CTI::getConstantImmediateNumericArg): + (JSC::CTI::printOpcodeOperandTypes): + (JSC::CTI::privateCompileMainPass): + * VM/CTI.h: + * VM/CodeBlock.h: + (JSC::CodeBlock::isConstant): + +2008-11-07 Alp Toker <alp@nuanti.com> + + autotools fix. Always use the configured perl binary (which may be + different to the one in $PATH) when generating sources. + + * GNUmakefile.am: + +2008-11-07 Cameron Zwarich <zwarich@apple.com> + + Not reviewed. + + Change grammar.cpp to Grammar.cpp and grammar.h to Grammar.h in several + build scripts. + + * DerivedSources.make: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCoreSources.bkl: + +2008-11-07 Alp Toker <alp@nuanti.com> + + More grammar.cpp -> Grammar.cpp build fixes. + + * AllInOneFile.cpp: + * GNUmakefile.am: + +2008-11-07 Simon Hausmann <hausmann@webkit.org> + + Fix the build on case-sensitive file systems. grammar.y was renamed to + Grammar.y but Lexer.cpp includes grammar.h. The build bots didn't + notice this change because of stale files. + + * parser/Lexer.cpp: + +2008-11-07 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Alexey Proskuryakov. + + Rename the m_nextGlobal, m_nextParameter, and m_nextConstant member + variables of CodeGenerator to m_nextGlobalIndex, m_nextParameterIndex, + and m_nextConstantIndex respectively. This is to distinguish these from + member variables like m_lastConstant, which are actually RefPtrs to + Registers. + + * bytecompiler/CodeGenerator.cpp: + (JSC::CodeGenerator::addGlobalVar): + (JSC::CodeGenerator::allocateConstants): + (JSC::CodeGenerator::CodeGenerator): + (JSC::CodeGenerator::addParameter): + (JSC::CodeGenerator::addConstant): + * bytecompiler/CodeGenerator.h: + +2008-11-06 Gavin Barraclough barraclough@apple.com + + Reviewed by Oliver Hunt. + + Do not make a cti_* call to perform an op_call unless either: + (1) The codeblock for the function body has not been generated. + (2) The number of arguments passed does not match the callee arity. + + ~1% progression on sunspider --v8 + + * VM/CTI.cpp: + (JSC::CTI::compileOpCallInitializeCallFrame): + (JSC::CTI::compileOpCall): + (JSC::CTI::privateCompileSlowCases): + * VM/CTI.h: + * VM/Machine.cpp: + (JSC::Machine::cti_op_call_JSFunction): + (JSC::Machine::cti_op_call_arityCheck): + (JSC::Machine::cti_op_construct_JSConstruct): + * VM/Machine.h: + * kjs/nodes.h: + +2008-11-06 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Geoff Garen. + + Move the remaining files in the kjs subdirectory of JavaScriptCore to + a new parser subdirectory, and remove the kjs subdirectory entirely. + + * AllInOneFile.cpp: + * DerivedSources.make: + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.vcproj/WTF/WTF.vcproj: + * JavaScriptCore.vcproj/jsc/jsc.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + * VM/CodeBlock.h: + * VM/ExceptionHelpers.cpp: + * VM/SamplingTool.h: + * bytecompiler/CodeGenerator.h: + * jsc.pro: + * jscore.bkl: + * kjs: Removed. + * kjs/NodeInfo.h: Removed. + * kjs/Parser.cpp: Removed. + * kjs/Parser.h: Removed. + * kjs/ResultType.h: Removed. + * kjs/SourceCode.h: Removed. + * kjs/SourceProvider.h: Removed. + * kjs/grammar.y: Removed. + * kjs/keywords.table: Removed. + * kjs/lexer.cpp: Removed. + * kjs/lexer.h: Removed. + * kjs/nodes.cpp: Removed. + * kjs/nodes.h: Removed. + * kjs/nodes2string.cpp: Removed. + * parser: Added. + * parser/Grammar.y: Copied from kjs/grammar.y. + * parser/Keywords.table: Copied from kjs/keywords.table. + * parser/Lexer.cpp: Copied from kjs/lexer.cpp. + * parser/Lexer.h: Copied from kjs/lexer.h. + * parser/NodeInfo.h: Copied from kjs/NodeInfo.h. + * parser/Nodes.cpp: Copied from kjs/nodes.cpp. + * parser/Nodes.h: Copied from kjs/nodes.h. + * parser/Parser.cpp: Copied from kjs/Parser.cpp. + * parser/Parser.h: Copied from kjs/Parser.h. + * parser/ResultType.h: Copied from kjs/ResultType.h. + * parser/SourceCode.h: Copied from kjs/SourceCode.h. + * parser/SourceProvider.h: Copied from kjs/SourceProvider.h. + * parser/nodes2string.cpp: Copied from kjs/nodes2string.cpp. + * pcre/pcre.pri: + * pcre/pcre_exec.cpp: + * runtime/FunctionConstructor.cpp: + * runtime/JSActivation.h: + * runtime/JSFunction.h: + * runtime/JSGlobalData.cpp: + * runtime/JSGlobalObjectFunctions.cpp: + * runtime/JSObject.cpp: + (JSC::JSObject::toNumber): + * runtime/RegExp.cpp: + +2008-11-06 Adam Roben <aroben@apple.com> + + Windows build fix after r38196 + + * JavaScriptCore.vcproj/jsc/jsc.vcproj: Added bytecompiler/ to the + include path. + +2008-11-06 Cameron Zwarich <zwarich@apple.com> + + Rubber-stamped by Sam Weinig. + + Create a new bytecompiler subdirectory of JavaScriptCore and move some + relevant files to it. + + * AllInOneFile.cpp: + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + * VM/CodeGenerator.cpp: Removed. + * VM/CodeGenerator.h: Removed. + * bytecompiler: Added. + * bytecompiler/CodeGenerator.cpp: Copied from VM/CodeGenerator.cpp. + * bytecompiler/CodeGenerator.h: Copied from VM/CodeGenerator.h. + * bytecompiler/LabelScope.h: Copied from kjs/LabelScope.h. + * jscore.bkl: + * kjs/LabelScope.h: Removed. + +2008-11-06 Adam Roben <aroben@apple.com> + + Windows clean build fix after r38155 + + Rubberstamped by Cameron Zwarich. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Update + the post-build event for the move of create_hash_table out of kjs/. + +2008-11-06 Laszlo Gombos <laszlo.1.gombos@nokia.com> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=22107 + + Bug uncovered during RVCT port in functions not used. get_lt() and + get_gt() takes only one argument - remove second argument where + applicable. + + * wtf/AVLTree.h: + (JSC::AVLTree::remove): Remove second argument of get_lt/get_gt(). + (JSC::AVLTree::subst): Ditto. + +2008-11-06 Alp Toker <alp@nuanti.com> + + Reviewed by Cameron Zwarich. + + https://bugs.webkit.org/show_bug.cgi?id=22033 + [GTK] CTI/Linux r38064 crashes; JIT requires executable memory + + Mark pages allocated by the FastMalloc mmap code path executable with + PROT_EXEC. This fixes crashes seen on CPUs and kernels that enforce + non-executable memory (like ExecShield on Fedora Linux) when the JIT + is enabled. + + This patch does not resolve the issue on debug builds so affected + developers may still need to pass --disable-jit to configure. + + * wtf/TCSystemAlloc.cpp: + (TryMmap): + (TryDevMem): + (TCMalloc_SystemRelease): + +2008-11-06 Peter Gal <galpeter@inf.u-szeged.hu> + + Reviewed by Cameron Zwarich. + + Bug 22099: Make the Qt port build the JSC shell in the correct place + <https://bugs.webkit.org/show_bug.cgi?id=22099> + + Adjust include paths and build destination dir for the 'jsc' executable + in the Qt build. + + * jsc.pro: + +2008-11-06 Kristian Amlie <kristian.amlie@nokia.com> + + Reviewed by Simon Hausmann. + + Implemented the block allocation on Symbian through heap allocation. + + Unfortunately there is no way to allocate virtual memory. The Posix + layer provides mmap() but no anonymous mapping. So this is a very slow + solution but it should work as a start. + + * runtime/Collector.cpp: + (JSC::allocateBlock): + (JSC::freeBlock): + +2008-11-06 Laszlo Gombos <laszlo.1.gombos@nokia.com> + + Reviewed by Simon Hausmann. + + Borrow some math functions from the MSVC port to the build with the + RVCT compiler. + + * wtf/MathExtras.h: + (isinf): + (isnan): + (signbit): + +2008-11-06 Laszlo Gombos <laszlo.1.gombos@nokia.com> + + Reviewed by Simon Hausmann. + + Include strings.h for strncasecmp(). + This is needed for compilation inside Symbian and it is also + confirmed by the man-page on Linux. + + * runtime/DateMath.cpp: + +2008-11-06 Norbert Leser <norbert.leser@nokia.com> + + Reviewed by Simon Hausmann. + + Implemented currentThreadStackBase for Symbian. + + * runtime/Collector.cpp: + (JSC::currentThreadStackBase): + +2008-11-06 Laszlo Gombos <laszlo.1.gombos@nokia.com> + + Reviewed by Simon Hausmann. + + RVCT does not support tm_gmtoff field, so disable that code just like + for MSVC. + + * runtime/DateMath.h: + (JSC::GregorianDateTime::GregorianDateTime): + (JSC::GregorianDateTime::operator tm): + +2008-11-06 Kristian Amlie <kristian.amlie@nokia.com> + + Reviewed by Simon Hausmann. + + Define PLATFORM(UNIX) for S60. Effectively WebKit on S60 is compiled + on top of the Posix layer. + + * wtf/Platform.h: + +2008-11-06 Norbert Leser <norbert.leser@nokia.com> + + Reviewed by Simon Hausmann. + + Added __SYMBIAN32__ condition for defining PLATFORM(SYMBIAN). + + * wtf/Platform.h: + +2008-11-06 Ariya Hidayat <ariya.hidayat@trolltech.com> + + Reviewed by Simon Hausmann. + + Added WINSCW compiler define for Symbian S60. + + * wtf/Platform.h: + +2008-11-06 Kristian Amlie <kristian.amlie@nokia.com> + + Reviewed by Simon Hausmann. + + Use the GCC defines of the WTF_ALIGN* macros for the RVCT and the + MINSCW compiler. + + * wtf/Vector.h: + +2008-11-06 Kristian Amlie <kristian.amlie@nokia.com> + + Reviewed by Simon Hausmann. + + Define capabilities of the SYMBIAN platform. Some of the system + headers are actually dependent on RVCT. + + * wtf/Platform.h: + +2008-11-06 Kristian Amlie <kristian.amlie@nokia.com> + + Reviewed by Simon Hausmann. + + Add missing stddef.h header needed for compilation in Symbian. + + * runtime/Collector.h: + +2008-11-06 Kristian Amlie <kristian.amlie@nokia.com> + + Reviewed by Simon Hausmann. + + Added COMPILER(RVCT) to detect the ARM RVCT compiler used in the Symbian environment. + + * wtf/Platform.h: + +2008-11-06 Simon Hausmann <hausmann@webkit.org> + + Fix the Qt build, adjust include paths after move of jsc.pro. + + * jsc.pro: + +2008-11-06 Cameron Zwarich <zwarich@apple.com> + + Rubber-stamped by Sam Weinig. + + Move kjs/Shell.cpp to the top level of the JavaScriptCore directory and + rename it to jsc.cpp to reflect the name of the binary compiled from it. + + * GNUmakefile.am: + * JavaScriptCore.vcproj/jsc/jsc.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * jsc.cpp: Copied from kjs/Shell.cpp. + * jsc.pro: + * jscore.bkl: + * kjs/Shell.cpp: Removed. + +2008-11-06 Cameron Zwarich <zwarich@apple.com> + + Rubber-stamped by Sam Weinig. + + Move create_hash_table and jsc.pro out of the kjs directory and into the + root directory of JavaScriptCore. + + * DerivedSources.make: + * JavaScriptCore.pri: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * create_hash_table: Copied from kjs/create_hash_table. + * jsc.pro: Copied from kjs/jsc.pro. + * kjs/create_hash_table: Removed. + * kjs/jsc.pro: Removed. + * make-generated-sources.sh: + +2008-11-05 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Maciej Stachowiak. + + https://bugs.webkit.org/show_bug.cgi?id=22094 + + Fix for bug where the callee incorrectly recieves the caller's lexical + global object as this, rather than its own. Implementation closely + follows the spec, passing jsNull, checking in the callee and replacing + with the global object where necessary. + + * VM/CTI.cpp: + (JSC::CTI::compileOpCall): + * VM/Machine.cpp: + (JSC::Machine::cti_op_call_NotJSFunction): + (JSC::Machine::cti_op_call_eval): + * runtime/JSCell.h: + (JSC::JSValue::toThisObject): + * runtime/JSImmediate.cpp: + (JSC::JSImmediate::toThisObject): + * runtime/JSImmediate.h: + +2008-11-05 Kevin Ollivier <kevino@theolliviers.com> + + wx build fix after Operations.cpp move. + + * JavaScriptCoreSources.bkl: + +2008-11-05 Cameron Zwarich <zwarich@apple.com> + + Not reviewed. + + Fix the build for case-sensitive build systems and wxWindows. + + * JavaScriptCoreSources.bkl: + * kjs/create_hash_table: + +2008-11-05 Cameron Zwarich <zwarich@apple.com> + + Not reviewed. + + Fix the build for case-sensitive build systems. + + * JavaScriptCoreSources.bkl: + * kjs/Shell.cpp: + * runtime/Interpreter.cpp: + * runtime/JSArray.cpp: + +2008-11-05 Cameron Zwarich <zwarich@apple.com> + + Not reviewed. + + Fix the build for case-sensitive build systems. + + * API/JSBase.cpp: + * API/JSObjectRef.cpp: + * runtime/CommonIdentifiers.h: + * runtime/Identifier.cpp: + * runtime/InitializeThreading.cpp: + * runtime/InternalFunction.h: + * runtime/JSString.h: + * runtime/Lookup.h: + * runtime/PropertyNameArray.h: + * runtime/PropertySlot.h: + * runtime/StructureID.cpp: + * runtime/StructureID.h: + * runtime/UString.cpp: + +2008-11-05 Cameron Zwarich <zwarich@apple.com> + + Rubber-stamped by Sam Weinig. + + Move more files to the runtime subdirectory of JavaScriptCore. + + * API/APICast.h: + * API/JSBase.cpp: + * API/JSCallbackObject.cpp: + * API/JSClassRef.cpp: + * API/JSClassRef.h: + * API/JSStringRefCF.cpp: + * API/JSValueRef.cpp: + * API/OpaqueJSString.cpp: + * API/OpaqueJSString.h: + * AllInOneFile.cpp: + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + * VM/CodeBlock.h: + * VM/CodeGenerator.cpp: + * VM/Machine.cpp: + * VM/RegisterFile.h: + * debugger/Debugger.h: + * kjs/SourceProvider.h: + * kjs/TypeInfo.h: Removed. + * kjs/collector.cpp: Removed. + * kjs/collector.h: Removed. + * kjs/completion.h: Removed. + * kjs/create_hash_table: + * kjs/identifier.cpp: Removed. + * kjs/identifier.h: Removed. + * kjs/interpreter.cpp: Removed. + * kjs/interpreter.h: Removed. + * kjs/lexer.cpp: + * kjs/lexer.h: + * kjs/lookup.cpp: Removed. + * kjs/lookup.h: Removed. + * kjs/nodes.cpp: + * kjs/nodes.h: + * kjs/operations.cpp: Removed. + * kjs/operations.h: Removed. + * kjs/protect.h: Removed. + * kjs/regexp.cpp: Removed. + * kjs/regexp.h: Removed. + * kjs/ustring.cpp: Removed. + * kjs/ustring.h: Removed. + * pcre/pcre_exec.cpp: + * profiler/CallIdentifier.h: + * profiler/Profile.h: + * runtime/ArrayConstructor.cpp: + * runtime/ArrayPrototype.cpp: + * runtime/ArrayPrototype.h: + * runtime/Collector.cpp: Copied from kjs/collector.cpp. + * runtime/Collector.h: Copied from kjs/collector.h. + * runtime/CollectorHeapIterator.h: + * runtime/Completion.h: Copied from kjs/completion.h. + * runtime/ErrorPrototype.cpp: + * runtime/Identifier.cpp: Copied from kjs/identifier.cpp. + * runtime/Identifier.h: Copied from kjs/identifier.h. + * runtime/InitializeThreading.cpp: + * runtime/Interpreter.cpp: Copied from kjs/interpreter.cpp. + * runtime/Interpreter.h: Copied from kjs/interpreter.h. + * runtime/JSCell.h: + * runtime/JSGlobalData.cpp: + * runtime/JSGlobalData.h: + * runtime/JSLock.cpp: + * runtime/JSNumberCell.cpp: + * runtime/JSNumberCell.h: + * runtime/JSObject.cpp: + * runtime/JSValue.h: + * runtime/Lookup.cpp: Copied from kjs/lookup.cpp. + * runtime/Lookup.h: Copied from kjs/lookup.h. + * runtime/MathObject.cpp: + * runtime/NativeErrorPrototype.cpp: + * runtime/NumberPrototype.cpp: + * runtime/Operations.cpp: Copied from kjs/operations.cpp. + * runtime/Operations.h: Copied from kjs/operations.h. + * runtime/PropertyMapHashTable.h: + * runtime/Protect.h: Copied from kjs/protect.h. + * runtime/RegExp.cpp: Copied from kjs/regexp.cpp. + * runtime/RegExp.h: Copied from kjs/regexp.h. + * runtime/RegExpConstructor.cpp: + * runtime/RegExpObject.h: + * runtime/RegExpPrototype.cpp: + * runtime/SmallStrings.h: + * runtime/StringObjectThatMasqueradesAsUndefined.h: + * runtime/StructureID.cpp: + * runtime/StructureID.h: + * runtime/StructureIDTransitionTable.h: + * runtime/SymbolTable.h: + * runtime/TypeInfo.h: Copied from kjs/TypeInfo.h. + * runtime/UString.cpp: Copied from kjs/ustring.cpp. + * runtime/UString.h: Copied from kjs/ustring.h. + * wrec/CharacterClassConstructor.h: + * wrec/WREC.h: + +2008-11-05 Geoffrey Garen <ggaren@apple.com> + + Suggested by Darin Adler. + + Removed two copy constructors that the compiler can generate for us + automatically. + + * VM/LabelID.h: + (JSC::LabelID::setLocation): + (JSC::LabelID::offsetFrom): + (JSC::LabelID::ref): + (JSC::LabelID::refCount): + * kjs/LabelScope.h: + +2008-11-05 Anders Carlsson <andersca@apple.com> + + Fix Snow Leopard build. + + * JavaScriptCore.xcodeproj/project.pbxproj: + +2008-11-04 Cameron Zwarich <zwarich@apple.com> + + Rubber-stamped by Steve Falkenburg. + + Move dtoa.cpp and dtoa.h to the WTF Visual Studio project to reflect + their movement in the filesystem. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.vcproj/WTF/WTF.vcproj: + +2008-11-04 Cameron Zwarich <zwarich@apple.com> + + Rubber-stamped by Sam Weinig. + + Move kjs/dtoa.h to the wtf subdirectory of JavaScriptCore. + + * AllInOneFile.cpp: + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + * kjs/dtoa.cpp: Removed. + * kjs/dtoa.h: Removed. + * wtf/dtoa.cpp: Copied from kjs/dtoa.cpp. + * wtf/dtoa.h: Copied from kjs/dtoa.h. + +2008-11-04 Cameron Zwarich <zwarich@apple.com> + + Rubber-stamped by Sam Weinig. + + Move kjs/config.h to the top level of JavaScriptCore. + + * GNUmakefile.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * config.h: Copied from kjs/config.h. + * kjs/config.h: Removed. + +2008-11-04 Darin Adler <darin@apple.com> + + Reviewed by Tim Hatcher. + + * wtf/ThreadingNone.cpp: Tweak formatting. + +2008-11-03 Darin Adler <darin@apple.com> + + Reviewed by Tim Hatcher. + + - https://bugs.webkit.org/show_bug.cgi?id=22061 + create script to check for exit-time destructors + + * JavaScriptCore.exp: Changed to export functions rather than + a global for the atomically initialized static mutex. + + * JavaScriptCore.xcodeproj/project.pbxproj: Added a script + phase that runs the check-for-exit-time-destructors script. + + * wtf/MainThread.cpp: + (WTF::mainThreadFunctionQueueMutex): Changed to leak an object + rather than using an exit time destructor. + (WTF::functionQueue): Ditto. + * wtf/unicode/icu/CollatorICU.cpp: + (WTF::cachedCollatorMutex): Ditto. + + * wtf/Threading.h: Changed other platforms to share the Windows + approach where the mutex is internal and the functions are exported. + * wtf/ThreadingGtk.cpp: + (WTF::lockAtomicallyInitializedStaticMutex): Ditto. + (WTF::unlockAtomicallyInitializedStaticMutex): Ditto. + * wtf/ThreadingNone.cpp: + (WTF::lockAtomicallyInitializedStaticMutex): Ditto. + (WTF::unlockAtomicallyInitializedStaticMutex): Ditto. + * wtf/ThreadingPthreads.cpp: + (WTF::threadMapMutex): Changed to leak an object rather than using + an exit time destructor. + (WTF::lockAtomicallyInitializedStaticMutex): Mutex change. + (WTF::unlockAtomicallyInitializedStaticMutex): Ditto. + (WTF::threadMap): Changed to leak an object rather than using + an exit time destructor. + * wtf/ThreadingQt.cpp: + (WTF::lockAtomicallyInitializedStaticMutex): Mutex change. + (WTF::unlockAtomicallyInitializedStaticMutex): Ditto. + * wtf/ThreadingWin.cpp: + (WTF::lockAtomicallyInitializedStaticMutex): Added an assertion. + +2008-11-04 Adam Roben <aroben@apple.com> + + Windows build fix + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Update + the location of JSStaticScopeObject.{cpp,h}. + +2008-11-04 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Alexey Proskuryakov. + + Move AllInOneFile.cpp to the top level of JavaScriptCore. + + * AllInOneFile.cpp: Copied from kjs/AllInOneFile.cpp. + * GNUmakefile.am: + * JavaScriptCore.xcodeproj/project.pbxproj: + * kjs/AllInOneFile.cpp: Removed. + +2008-11-04 Cameron Zwarich <zwarich@apple.com> + + Rubber-stamped by Alexey Proskuryakov. + + Add NodeInfo.h to the JavaScriptCore Xcode project. + + * JavaScriptCore.xcodeproj/project.pbxproj: + +2008-11-03 Cameron Zwarich <zwarich@apple.com> + + Rubber-stamped by Maciej Stachowiak. + + Move more files into the runtime subdirectory of JavaScriptCore. + + * API/JSBase.cpp: + * API/JSCallbackConstructor.cpp: + * API/JSCallbackFunction.cpp: + * API/JSClassRef.cpp: + * API/OpaqueJSString.cpp: + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + * kjs/AllInOneFile.cpp: + * kjs/ArgList.cpp: Removed. + * kjs/ArgList.h: Removed. + * kjs/Arguments.cpp: Removed. + * kjs/Arguments.h: Removed. + * kjs/BatchedTransitionOptimizer.h: Removed. + * kjs/CollectorHeapIterator.h: Removed. + * kjs/CommonIdentifiers.cpp: Removed. + * kjs/CommonIdentifiers.h: Removed. + * kjs/ExecState.cpp: Removed. + * kjs/ExecState.h: Removed. + * kjs/GetterSetter.cpp: Removed. + * kjs/GetterSetter.h: Removed. + * kjs/InitializeThreading.cpp: Removed. + * kjs/InitializeThreading.h: Removed. + * kjs/JSActivation.cpp: Removed. + * kjs/JSActivation.h: Removed. + * kjs/JSGlobalData.cpp: Removed. + * kjs/JSGlobalData.h: Removed. + * kjs/JSLock.cpp: Removed. + * kjs/JSLock.h: Removed. + * kjs/JSStaticScopeObject.cpp: Removed. + * kjs/JSStaticScopeObject.h: Removed. + * kjs/JSType.h: Removed. + * kjs/PropertyNameArray.cpp: Removed. + * kjs/PropertyNameArray.h: Removed. + * kjs/ScopeChain.cpp: Removed. + * kjs/ScopeChain.h: Removed. + * kjs/ScopeChainMark.h: Removed. + * kjs/SymbolTable.h: Removed. + * kjs/Tracing.d: Removed. + * kjs/Tracing.h: Removed. + * runtime/ArgList.cpp: Copied from kjs/ArgList.cpp. + * runtime/ArgList.h: Copied from kjs/ArgList.h. + * runtime/Arguments.cpp: Copied from kjs/Arguments.cpp. + * runtime/Arguments.h: Copied from kjs/Arguments.h. + * runtime/BatchedTransitionOptimizer.h: Copied from kjs/BatchedTransitionOptimizer.h. + * runtime/CollectorHeapIterator.h: Copied from kjs/CollectorHeapIterator.h. + * runtime/CommonIdentifiers.cpp: Copied from kjs/CommonIdentifiers.cpp. + * runtime/CommonIdentifiers.h: Copied from kjs/CommonIdentifiers.h. + * runtime/ExecState.cpp: Copied from kjs/ExecState.cpp. + * runtime/ExecState.h: Copied from kjs/ExecState.h. + * runtime/GetterSetter.cpp: Copied from kjs/GetterSetter.cpp. + * runtime/GetterSetter.h: Copied from kjs/GetterSetter.h. + * runtime/InitializeThreading.cpp: Copied from kjs/InitializeThreading.cpp. + * runtime/InitializeThreading.h: Copied from kjs/InitializeThreading.h. + * runtime/JSActivation.cpp: Copied from kjs/JSActivation.cpp. + * runtime/JSActivation.h: Copied from kjs/JSActivation.h. + * runtime/JSGlobalData.cpp: Copied from kjs/JSGlobalData.cpp. + * runtime/JSGlobalData.h: Copied from kjs/JSGlobalData.h. + * runtime/JSLock.cpp: Copied from kjs/JSLock.cpp. + * runtime/JSLock.h: Copied from kjs/JSLock.h. + * runtime/JSStaticScopeObject.cpp: Copied from kjs/JSStaticScopeObject.cpp. + * runtime/JSStaticScopeObject.h: Copied from kjs/JSStaticScopeObject.h. + * runtime/JSType.h: Copied from kjs/JSType.h. + * runtime/PropertyNameArray.cpp: Copied from kjs/PropertyNameArray.cpp. + * runtime/PropertyNameArray.h: Copied from kjs/PropertyNameArray.h. + * runtime/ScopeChain.cpp: Copied from kjs/ScopeChain.cpp. + * runtime/ScopeChain.h: Copied from kjs/ScopeChain.h. + * runtime/ScopeChainMark.h: Copied from kjs/ScopeChainMark.h. + * runtime/SymbolTable.h: Copied from kjs/SymbolTable.h. + * runtime/Tracing.d: Copied from kjs/Tracing.d. + * runtime/Tracing.h: Copied from kjs/Tracing.h. + +2008-11-03 Sam Weinig <sam@webkit.org> + + Reviewed by Mark Rowe. + + Move #define to turn on dumping StructureID statistics to StructureID.cpp so that + turning it on does not require a full rebuild. + + * runtime/StructureID.cpp: + (JSC::StructureID::dumpStatistics): + * runtime/StructureID.h: + +2008-11-03 Alp Toker <alp@nuanti.com> + + Reviewed by Geoffrey Garen. + + Fix warning when building on Darwin without JSC_MULTIPLE_THREADS + enabled. + + * kjs/InitializeThreading.cpp: + +2008-11-02 Matt Lilek <webkit@mattlilek.com> + + Reviewed by Cameron Zwarich. + + Bug 22042: REGRESSION(r38066): ASSERTION FAILED: source in CodeBlock + <https://bugs.webkit.org/show_bug.cgi?id=22042> + + Rename parameter name to avoid ASSERT. + + * VM/CodeBlock.h: + (JSC::CodeBlock::CodeBlock): + (JSC::ProgramCodeBlock::ProgramCodeBlock): + (JSC::EvalCodeBlock::EvalCodeBlock): + +2008-11-02 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Oliver Hunt. + + Bug 22035: Remove the '_' suffix on constructor parameter names for structs + <https://bugs.webkit.org/show_bug.cgi?id=22035> + + * API/JSCallbackObject.h: + (JSC::JSCallbackObject::JSCallbackObjectData::JSCallbackObjectData): + * VM/CodeBlock.h: + (JSC::CodeBlock::CodeBlock): + (JSC::ProgramCodeBlock::ProgramCodeBlock): + (JSC::EvalCodeBlock::EvalCodeBlock): + * wrec/WREC.h: + (JSC::Quantifier::Quantifier): + +2008-10-31 Cameron Zwarich <zwarich@apple.com> + + Rubber-stamped by Geoff Garen. + + Rename SourceRange.h to SourceCode.h. + + * API/JSBase.cpp: + * GNUmakefile.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * VM/CodeBlock.h: + * kjs/SourceCode.h: Copied from kjs/SourceRange.h. + * kjs/SourceRange.h: Removed. + * kjs/grammar.y: + * kjs/lexer.h: + * kjs/nodes.cpp: + (JSC::ForInNode::ForInNode): + * kjs/nodes.h: + (JSC::ThrowableExpressionData::setExceptionSourceCode): + +2008-10-31 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Darin Adler. + + Bug 22019: Move JSC::Interpreter::shouldPrintExceptions() to WebCore::Console + <https://bugs.webkit.org/show_bug.cgi?id=22019> + + The JSC::Interpreter::shouldPrintExceptions() function is not used at + all in JavaScriptCore, so it should be moved to WebCore::Console, its + only user. + + * JavaScriptCore.exp: + * kjs/interpreter.cpp: + * kjs/interpreter.h: + +2008-10-31 Cameron Zwarich <zwarich@apple.com> + + Not reviewed. + + Windows build fix. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + +2008-10-31 Cameron Zwarich <zwarich@apple.com> + + Rubber-stamped by Sam Weinig. + + Remove the call to Interpreter::setShouldPrintExceptions() from the + GlobalObject constructor in the shell. The shouldPrintExceptions() + information is not used anywhere in JavaScriptCore, only in WebCore. + + * kjs/Shell.cpp: + (GlobalObject::GlobalObject): + +2008-10-31 Kevin Ollivier <kevino@theolliviers.com> + + wxMSW build fix. + + * wtf/Threading.h: + +2008-10-31 Cameron Zwarich <zwarich@apple.com> + + Rubber-stamped by Sam Weinig. + + Move more files from the kjs subdirectory of JavaScriptCore to the + runtime subdirectory. + + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + * kjs/AllInOneFile.cpp: + * kjs/RegExpConstructor.cpp: Removed. + * kjs/RegExpConstructor.h: Removed. + * kjs/RegExpMatchesArray.h: Removed. + * kjs/RegExpObject.cpp: Removed. + * kjs/RegExpObject.h: Removed. + * kjs/RegExpPrototype.cpp: Removed. + * kjs/RegExpPrototype.h: Removed. + * runtime/RegExpConstructor.cpp: Copied from kjs/RegExpConstructor.cpp. + * runtime/RegExpConstructor.h: Copied from kjs/RegExpConstructor.h. + * runtime/RegExpMatchesArray.h: Copied from kjs/RegExpMatchesArray.h. + * runtime/RegExpObject.cpp: Copied from kjs/RegExpObject.cpp. + * runtime/RegExpObject.h: Copied from kjs/RegExpObject.h. + * runtime/RegExpPrototype.cpp: Copied from kjs/RegExpPrototype.cpp. + * runtime/RegExpPrototype.h: Copied from kjs/RegExpPrototype.h. + +2008-10-31 Mark Rowe <mrowe@apple.com> + + Revert an incorrect portion of r38034. + + * profiler/ProfilerServer.mm: + +2008-10-31 Mark Rowe <mrowe@apple.com> + + Fix the 64-bit build. + + Disable strict aliasing in ProfilerServer.mm as it leads to the compiler being unhappy + with the common Obj-C idiom self = [super init]; + + * JavaScriptCore.xcodeproj/project.pbxproj: + +2008-10-31 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Alexey Proskuryakov. + + Change a header guard to match our coding style. + + * kjs/InitializeThreading.h: + +2008-10-30 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Oliver Hunt. + + Fixed a small bit of https://bugs.webkit.org/show_bug.cgi?id=21962 + AST uses way too much memory + + Removed a word from StatementNode by nixing LabelStack and turning it + into a compile-time data structure managed by CodeGenerator. + + v8 tests and SunSpider, run by Gavin, report no change. + + * GNUmakefile.am: + * JavaScriptCore.order: + * JavaScriptCore.pri: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * kjs/AllInOneFile.cpp: + * JavaScriptCoreSources.bkl: I sure hope this builds! + + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::CodeGenerator): + (JSC::CodeGenerator::newLabelScope): + (JSC::CodeGenerator::breakTarget): + (JSC::CodeGenerator::continueTarget): + * VM/CodeGenerator.h: Nixed the JumpContext system because it depended + on a LabelStack in the AST, and it was a little cumbersome on the client + side. Replaced with LabelScope, which tracks all break / continue + information in the CodeGenerator, just like we track LabelIDs and other + stacks of compile-time data. + + * kjs/LabelScope.h: Added. + (JSC::LabelScope::): + (JSC::LabelScope::LabelScope): + (JSC::LabelScope::ref): + (JSC::LabelScope::deref): + (JSC::LabelScope::refCount): + (JSC::LabelScope::breakTarget): + (JSC::LabelScope::continueTarget): + (JSC::LabelScope::type): + (JSC::LabelScope::name): + (JSC::LabelScope::scopeDepth): Simple abstraction for holding everything + you might want to know about a break-able / continue-able scope. + + * kjs/LabelStack.cpp: Removed. + * kjs/LabelStack.h: Removed. + + * kjs/grammar.y: No need to push labels at parse time -- we don't store + LabelStacks in the AST anymore. + + * kjs/nodes.cpp: + (JSC::DoWhileNode::emitCode): + (JSC::WhileNode::emitCode): + (JSC::ForNode::emitCode): + (JSC::ForInNode::emitCode): + (JSC::ContinueNode::emitCode): + (JSC::BreakNode::emitCode): + (JSC::SwitchNode::emitCode): + (JSC::LabelNode::emitCode): + * kjs/nodes.h: + (JSC::StatementNode::): + (JSC::LabelNode::): Use LabelScope where we used to use JumpContext. + Simplified a bunch of code. Touched up label-related error messages a + bit. + + * kjs/nodes2string.cpp: + (JSC::LabelNode::streamTo): Updated for rename. + +2008-10-31 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Darin Adler. + + Bug 22005: Move StructureIDChain into its own file + <https://bugs.webkit.org/show_bug.cgi?id=22005> + + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + * runtime/StructureID.cpp: + * runtime/StructureID.h: + * runtime/StructureIDChain.cpp: Copied from runtime/StructureID.cpp. + * runtime/StructureIDChain.h: Copied from runtime/StructureID.h. + +2008-10-31 Steve Falkenburg <sfalken@apple.com> + + Build fix. + + * JavaScriptCore.vcproj/jsc/jsc.vcproj: + +2008-10-31 Steve Falkenburg <sfalken@apple.com> + + Build fix. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + +2008-10-31 Darin Adler <darin@apple.com> + + Reviewed by Dan Bernstein. + + - fix storage leak seen on buildbot + + Some other cleanup too. The storage leak was caused by the fact + that HashTraits<CallIdentifier>::needsDestruction was false, so + the call identifier objects didn't get deleted. + + * profiler/CallIdentifier.h: + + Added a default constructor to create empty call identifiers. + + Changed the normal constructor to use const UString& + to avoid extra copying and reference count thrash. + + Removed the explicit copy constructor definition, since it's what + the compiler will automatically generate. (Rule of thumb: Either + you need both a custom copy constructor and a custom assignment + operator, or neither.) + + Moved the CallIdentifier hash function out of the WTF namespace; + there's no reason to put it there. + + Changed the CallIdentifier hash function to be a struct rather than + a specialization of the IntHash struct template. Having it be + a specialization made no sense, since CallIdentifier is not an integer, + and did no good. + + Removed explicit definition of emptyValueIsZero in the hash traits, + since inheriting from GenericHashTraits already makes that false. + + Removed explicit definition of emptyValue, instead relying on the + default constructor and GenericHashTraits. + + Removed explicit definition of needsDestruction, because we want it + to have its default value: true, not false. This fixes the leak! + + Changed constructDeletedValue and isDeletedValue to use a line number + of numeric_limits<unsigned>::max() to indicate a value is deleted. + Previously this used empty strings for the empty value and null strings + for the deleted value, but it's more efficient to use null for both. + +2008-10-31 Timothy Hatcher <timothy@apple.com> + + Emit the WillExecuteStatement debugger hook before the for loop body + when the statement node for the body isn't a block. This allows + breakpoints on those statements in the Web Inspector. + + https://bugs.webkit.org/show_bug.cgi?id=22004 + + Reviewed by Darin Adler. + + * kjs/nodes.cpp: + (JSC::ForNode::emitCode): Emit the WillExecuteStatement + debugger hook before the statement node if isn't a block. + Also emit the WillExecuteStatement debugger hook for the + loop as the first op-code. + (JSC::ForInNode::emitCode): Ditto. + +2008-10-31 Timothy Hatcher <timothy@apple.com> + + Fixes console warnings about not having an autorelease pool. + Also fixes the build for Snow Leopard, by including individual + Foundation headers instead of Foundation.h. + + https://bugs.webkit.org/show_bug.cgi?id=21995 + + Reviewed by Oliver Hunt. + + * profiler/ProfilerServer.mm: + (-[ProfilerServer init]): Create a NSAutoreleasePool and drain it. + +2008-10-31 Cameron Zwarich <zwarich@apple.com> + + Not reviewed. + + Speculative wxWindows build fix. + + * JavaScriptCoreSources.bkl: + * jscore.bkl: + +2008-10-31 Cameron Zwarich <zwarich@apple.com> + + Rubber-stamped by Maciej Stachowiak. + + Move VM/JSPropertyNameIterator.cpp and VM/JSPropertyNameIterator.h to + the runtime directory. + + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + * VM/JSPropertyNameIterator.cpp: Removed. + * VM/JSPropertyNameIterator.h: Removed. + * runtime/JSPropertyNameIterator.cpp: Copied from VM/JSPropertyNameIterator.cpp. + * runtime/JSPropertyNameIterator.h: Copied from VM/JSPropertyNameIterator.h. + +2008-10-31 Cameron Zwarich <zwarich@apple.com> + + Not reviewed. + + Speculative wxWindows build fix. + + * jscore.bkl: + +2008-10-30 Mark Rowe <mrowe@apple.com> + + Reviewed by Jon Homeycutt. + + Explicitly default to building for only the native architecture in debug and release builds. + + * Configurations/DebugRelease.xcconfig: + +2008-10-30 Cameron Zwarich <zwarich@apple.com> + + Rubber-stamped by Sam Weinig. + + Create a debugger directory in JavaScriptCore and move the relevant + files to it. + + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * VM/CodeBlock.cpp: + * VM/CodeGenerator.h: + * VM/Machine.cpp: + * debugger: Added. + * debugger/Debugger.cpp: Copied from kjs/debugger.cpp. + * debugger/Debugger.h: Copied from kjs/debugger.h. + * debugger/DebuggerCallFrame.cpp: Copied from kjs/DebuggerCallFrame.cpp. + * debugger/DebuggerCallFrame.h: Copied from kjs/DebuggerCallFrame.h. + * kjs/AllInOneFile.cpp: + * kjs/DebuggerCallFrame.cpp: Removed. + * kjs/DebuggerCallFrame.h: Removed. + * kjs/Parser.cpp: + * kjs/Parser.h: + * kjs/debugger.cpp: Removed. + * kjs/debugger.h: Removed. + * kjs/interpreter.cpp: + * kjs/nodes.cpp: + * runtime/FunctionConstructor.cpp: + * runtime/JSGlobalObject.cpp: + +2008-10-30 Benjamin K. Stuhl <bks24@cornell.edu> + + gcc 4.3.3/linux-x86 generates "suggest parentheses around && within ||" + warnings; add some parentheses to disambiguate things. No functional + changes, so no tests. + + https://bugs.webkit.org/show_bug.cgi?id=21973 + Add parentheses to clean up some gcc warnings + + Reviewed by Dan Bernstein. + + * wtf/ASCIICType.h: + (WTF::isASCIIAlphanumeric): + (WTF::isASCIIHexDigit): + +2008-10-30 Kevin Lindeman <klindeman@apple.com> + + Adds ProfilerServer, which is a distributed notification listener + that allows starting and stopping the profiler remotely for use + in conjunction with the profiler's DTace probes. + + https://bugs.webkit.org/show_bug.cgi?id=21719 + + Reviewed by Timothy Hatcher. + + * JavaScriptCore.xcodeproj/project.pbxproj: + * kjs/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): Calls startProfilerServerIfNeeded. + * profiler/ProfilerServer.h: Added. + * profiler/ProfilerServer.mm: Added. + (+[ProfilerServer sharedProfileServer]): + (-[ProfilerServer init]): + (-[ProfilerServer startProfiling]): + (-[ProfilerServer stopProfiling]): + (JSC::startProfilerServerIfNeeded): + +2008-10-30 Kevin Ollivier <kevino@theolliviers.com> + + wx build fix after PropertyMap and StructureID merge. + + * JavaScriptCoreSources.bkl: + +2008-10-30 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Mark Rowe. + + Change the JavaScriptCore Xcode project to use relative paths for the + PCRE source files. + + * JavaScriptCore.xcodeproj/project.pbxproj: + +2008-10-30 Sam Weinig <sam@webkit.org> + + Reviewed by Cameron Zwarich and Geoffrey Garen. + + Fix for https://bugs.webkit.org/show_bug.cgi?id=21989 + Merge PropertyMap and StructureID + + - Move PropertyMap code into StructureID in preparation for lazily + creating the map on gets. + - Make remove with transition explicit by adding removePropertyTransition. + - Make the put/remove without transition explicit. + - Make cache invalidation part of put/remove without transition. + + 1% speedup on SunSpider; 0.5% speedup on v8 suite. + + * GNUmakefile.am: + * JavaScriptCore.exp: + * JavaScriptCore.pri: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + * kjs/AllInOneFile.cpp: + * kjs/identifier.h: + * runtime/JSObject.cpp: + (JSC::JSObject::removeDirect): + * runtime/JSObject.h: + (JSC::JSObject::putDirect): + * runtime/PropertyMap.cpp: Removed. + * runtime/PropertyMap.h: Removed. + * runtime/PropertyMapHashTable.h: Copied from runtime/PropertyMap.h. + * runtime/StructureID.cpp: + (JSC::StructureID::dumpStatistics): + (JSC::StructureID::StructureID): + (JSC::StructureID::~StructureID): + (JSC::StructureID::getEnumerablePropertyNames): + (JSC::StructureID::addPropertyTransition): + (JSC::StructureID::removePropertyTransition): + (JSC::StructureID::toDictionaryTransition): + (JSC::StructureID::changePrototypeTransition): + (JSC::StructureID::getterSetterTransition): + (JSC::StructureID::addPropertyWithoutTransition): + (JSC::StructureID::removePropertyWithoutTransition): + (JSC::PropertyMapStatisticsExitLogger::~PropertyMapStatisticsExitLogger): + (JSC::StructureID::checkConsistency): + (JSC::StructureID::copyPropertyTable): + (JSC::StructureID::get): + (JSC::StructureID::put): + (JSC::StructureID::remove): + (JSC::StructureID::insertIntoPropertyMapHashTable): + (JSC::StructureID::expandPropertyMapHashTable): + (JSC::StructureID::createPropertyMapHashTable): + (JSC::StructureID::rehashPropertyMapHashTable): + (JSC::comparePropertyMapEntryIndices): + (JSC::StructureID::getEnumerablePropertyNamesInternal): + * runtime/StructureID.h: + (JSC::StructureID::propertyStorageSize): + (JSC::StructureID::isEmpty): + (JSC::StructureID::get): + +2008-10-30 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Oliver Hunt. + + Bug 21987: CTI::putDoubleResultToJSNumberCellOrJSImmediate() hardcodes its result register + <https://bugs.webkit.org/show_bug.cgi?id=21987> + + CTI::putDoubleResultToJSNumberCellOrJSImmediate() hardcodes its result + register as ecx, but it should be tempReg1, which is ecx at all of its + callsites. + + * VM/CTI.cpp: + (JSC::CTI::putDoubleResultToJSNumberCellOrJSImmediate): + +2008-10-30 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Sam Weinig. + + Bug 21985: Opcodes should use eax as their destination register whenever possible + <https://bugs.webkit.org/show_bug.cgi?id=21985> + + Change more opcodes to use eax as the register for their final result, + and change calls to emitPutResult() that pass eax to rely on the default + value of eax. + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): + +2008-10-30 Alp Toker <alp@nuanti.com> + + Build fix attempt for older gcc on the trunk-mac-intel build bot + (error: initializer for scalar variable requires one element). + + Modify the initializer syntax slightly with an additional comma. + + * VM/Machine.cpp: + (JSC::Machine::cti_op_call_JSFunction): + (JSC::Machine::cti_op_construct_JSConstruct): + (JSC::Machine::cti_op_resolve_func): + (JSC::Machine::cti_op_post_inc): + (JSC::Machine::cti_op_resolve_with_base): + (JSC::Machine::cti_op_post_dec): + +2008-10-30 Alp Toker <alp@nuanti.com> + + Reviewed by Alexey Proskuryakov. + + https://bugs.webkit.org/show_bug.cgi?id=21571 + VoidPtrPair breaks CTI on Linux + + The VoidPtrPair return change made in r37457 does not work on Linux + since POD structs aren't passed in registers. + + This patch uses a union to vectorize VoidPtrPair to a uint64_t and + matches Darwin/MSVC fixing CTI/WREC on Linux. + + Alexey reports no measurable change in Mac performance with this fix. + + * VM/Machine.cpp: + (JSC::Machine::cti_op_call_JSFunction): + (JSC::Machine::cti_op_construct_JSConstruct): + (JSC::Machine::cti_op_resolve_func): + (JSC::Machine::cti_op_post_inc): + (JSC::Machine::cti_op_resolve_with_base): + (JSC::Machine::cti_op_post_dec): + * VM/Machine.h: + (JSC::): + +2008-10-29 Oliver Hunt <oliver@apple.com> + + Reviewed by Geoff Garen. + + Initial work to reduce cost of JSNumberCell allocation + + This does the initial work needed to bring more of number + allocation into CTI code directly, rather than just falling + back onto the slow paths if we can't guarantee that a number + cell can be reused. + + Initial implementation only used by op_negate to make sure + it all works. In a negate heavy (though not dominated) test + it results in a 10% win in the non-reusable cell case. + + * VM/CTI.cpp: + (JSC::): + (JSC::CTI::emitAllocateNumber): + (JSC::CTI::emitNakedFastCall): + (JSC::CTI::emitArithIntToImmWithJump): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + * VM/CTI.h: + * VM/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::emitUnaryOp): + * VM/CodeGenerator.h: + (JSC::CodeGenerator::emitToJSNumber): + (JSC::CodeGenerator::emitTypeOf): + (JSC::CodeGenerator::emitGetPropertyNames): + * VM/Machine.cpp: + (JSC::Machine::privateExecute): + * VM/Machine.h: + * kjs/ResultType.h: + (JSC::ResultType::isReusableNumber): + (JSC::ResultType::toInt): + * kjs/nodes.cpp: + (JSC::UnaryOpNode::emitCode): + (JSC::BinaryOpNode::emitCode): + (JSC::EqualNode::emitCode): + * masm/X86Assembler.h: + (JSC::X86Assembler::): + (JSC::X86Assembler::negl_r): + (JSC::X86Assembler::xorpd_mr): + * runtime/JSNumberCell.h: + (JSC::JSNumberCell::JSNumberCell): + +2008-10-29 Steve Falkenburg <sfalken@apple.com> + + <rdar://problem/6326563> Crash on launch + + For Windows, export explicit functions rather than exporting data for atomicallyInitializedStaticMutex. + + Exporting data from a DLL on Windows requires specifying __declspec(dllimport) in the header used by + callers, but __declspec(dllexport) when defined in the DLL implementation. By instead exporting + the explicit lock/unlock functions, we can avoid this. + + Fixes a crash on launch, since we were previously erroneously exporting atomicallyInitializedStaticMutex as a function. + + Reviewed by Darin Adler. + + * wtf/Threading.h: + (WTF::lockAtomicallyInitializedStaticMutex): + (WTF::unlockAtomicallyInitializedStaticMutex): + * wtf/ThreadingWin.cpp: + (WTF::lockAtomicallyInitializedStaticMutex): + (WTF::unlockAtomicallyInitializedStaticMutex): + +2008-10-29 Sam Weinig <sam@webkit.org> + + Reviewed by Oliver Hunt. + + Remove direct use of PropertyMap. + + * JavaScriptCore.exp: + * runtime/JSObject.cpp: + (JSC::JSObject::mark): + (JSC::JSObject::put): + (JSC::JSObject::deleteProperty): + (JSC::JSObject::getPropertyAttributes): + (JSC::JSObject::removeDirect): + * runtime/JSObject.h: + (JSC::JSObject::getDirect): + (JSC::JSObject::getDirectLocation): + (JSC::JSObject::hasCustomProperties): + (JSC::JSObject::JSObject): + (JSC::JSObject::putDirect): + * runtime/PropertyMap.cpp: + (JSC::PropertyMap::get): + * runtime/PropertyMap.h: + (JSC::PropertyMap::isEmpty): + (JSC::PropertyMap::get): + * runtime/StructureID.cpp: + (JSC::StructureID::dumpStatistics): + * runtime/StructureID.h: + (JSC::StructureID::propertyStorageSize): + (JSC::StructureID::get): + (JSC::StructureID::put): + (JSC::StructureID::remove): + (JSC::StructureID::isEmpty): + +2008-10-29 Sam Weinig <sam@webkit.org> + + Reviewed by Geoffrey Garen. + + Rename and move the StructureID transition table to its own file. + + * GNUmakefile.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * runtime/StructureID.cpp: + (JSC::StructureID::addPropertyTransition): + * runtime/StructureID.h: + (JSC::StructureID::): + * runtime/StructureIDTransitionTable.h: Copied from runtime/StructureID.h. + (JSC::StructureIDTransitionTableHash::hash): + (JSC::StructureIDTransitionTableHash::equal): + +2008-10-29 Sam Weinig <sam@webkit.org> + + Reviewed by Cameron Zwarich. + + Fix for https://bugs.webkit.org/show_bug.cgi?id=21958 + Pack bits in StructureID to reduce the size of each StructureID by 2 words. + + * runtime/PropertyMap.h: + (JSC::PropertyMap::propertyMapSize): + * runtime/StructureID.cpp: + (JSC::StructureID::dumpStatistics): Add additional size statistics when dumping. + (JSC::StructureID::StructureID): + * runtime/StructureID.h: + +2008-10-29 Kevin Ollivier <kevino@theolliviers.com> + + wx build fixes after addition of runtime and ImageBuffer changes. + + * JavaScriptCoreSources.bkl: + * jscore.bkl: + +2008-10-29 Timothy Hatcher <timothy@apple.com> + + Emit the WillExecuteStatement debugger hook before the "else" body + when there is no block for the "else" body. This allows breakpoints + on those statements in the Web Inspector. + + https://bugs.webkit.org/show_bug.cgi?id=21944 + + Reviewed by Maciej Stachowiak. + + * kjs/nodes.cpp: + (JSC::IfElseNode::emitCode): Emit the WillExecuteStatement + debugger hook before the else node if isn't a block. + +2008-10-29 Alexey Proskuryakov <ap@webkit.org> + + Build fix. + + * JavaScriptCore.exp: Export HashTable::deleteTable(). + +2008-10-28 Alp Toker <alp@nuanti.com> + + Fix builddir != srcdir builds after kjs -> runtime breakage. Sources + may now be generated in both kjs/ and runtime/. + + Also sort the sources list for readability. + + * GNUmakefile.am: + +2008-10-28 Alp Toker <alp@nuanti.com> + + Reviewed by Cameron Zwarich. + + Build fix attempt after kjs -> runtime rename. + + * GNUmakefile.am: + +2008-10-28 Cameron Zwarich <zwarich@apple.com> + + Not reviewed. + + Remove a duplicate includes directory. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + +2008-10-28 Cameron Zwarich <zwarich@apple.com> + + Not reviewed. + + Attempt to fix the Windows build. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.vcproj/jsc/jsc.vcproj: + +2008-10-28 Dan Bernstein <mitz@apple.com> + + Reviewed by Mark Rowe. + + - export WTF::atomicallyInitializedStaticMutex + + * JavaScriptCore.exp: + +2008-10-28 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Cameron Zwarich. + + Fixed CodeBlock dumping to accurately report constant register indices. + + * VM/CodeBlock.cpp: + (JSC::CodeBlock::dump): + +2008-10-28 Cameron Zwarich <zwarich@apple.com> + + Not reviewed. + + More Qt build fixes. + + * JavaScriptCore.pri: + +2008-10-28 Cameron Zwarich <zwarich@apple.com> + + Not reviewed. + + Fix the Qt build, hopefully for real this time. + + * JavaScriptCore.pri: + +2008-10-28 Cameron Zwarich <zwarich@apple.com> + + Not reviewed. + + Fix the Qt build. + + * JavaScriptCore.pri: + +2008-10-28 Cameron Zwarich <zwarich@apple.com> + + Not reviewed. + + Fix the Windows build. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + +2008-10-28 Cameron Zwarich <zwarich@apple.com> + + Rubber-stamped by Sam Weinig. + + Create a runtime directory in JavaScriptCore and begin moving files to + it. This is the first step towards removing the kjs directory and + placing files in more meaningful subdirectories of JavaScriptCore. + + * API/JSBase.cpp: + * API/JSCallbackConstructor.cpp: + * API/JSCallbackConstructor.h: + * API/JSCallbackFunction.cpp: + * API/JSClassRef.cpp: + * API/JSClassRef.h: + * API/JSStringRefCF.cpp: + * API/JSValueRef.cpp: + * API/OpaqueJSString.cpp: + * DerivedSources.make: + * GNUmakefile.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * kjs/AllInOneFile.cpp: + * kjs/ArrayConstructor.cpp: Removed. + * kjs/ArrayConstructor.h: Removed. + * kjs/ArrayPrototype.cpp: Removed. + * kjs/ArrayPrototype.h: Removed. + * kjs/BooleanConstructor.cpp: Removed. + * kjs/BooleanConstructor.h: Removed. + * kjs/BooleanObject.cpp: Removed. + * kjs/BooleanObject.h: Removed. + * kjs/BooleanPrototype.cpp: Removed. + * kjs/BooleanPrototype.h: Removed. + * kjs/CallData.cpp: Removed. + * kjs/CallData.h: Removed. + * kjs/ClassInfo.h: Removed. + * kjs/ConstructData.cpp: Removed. + * kjs/ConstructData.h: Removed. + * kjs/DateConstructor.cpp: Removed. + * kjs/DateConstructor.h: Removed. + * kjs/DateInstance.cpp: Removed. + * kjs/DateInstance.h: Removed. + * kjs/DateMath.cpp: Removed. + * kjs/DateMath.h: Removed. + * kjs/DatePrototype.cpp: Removed. + * kjs/DatePrototype.h: Removed. + * kjs/Error.cpp: Removed. + * kjs/Error.h: Removed. + * kjs/ErrorConstructor.cpp: Removed. + * kjs/ErrorConstructor.h: Removed. + * kjs/ErrorInstance.cpp: Removed. + * kjs/ErrorInstance.h: Removed. + * kjs/ErrorPrototype.cpp: Removed. + * kjs/ErrorPrototype.h: Removed. + * kjs/FunctionConstructor.cpp: Removed. + * kjs/FunctionConstructor.h: Removed. + * kjs/FunctionPrototype.cpp: Removed. + * kjs/FunctionPrototype.h: Removed. + * kjs/GlobalEvalFunction.cpp: Removed. + * kjs/GlobalEvalFunction.h: Removed. + * kjs/InternalFunction.cpp: Removed. + * kjs/InternalFunction.h: Removed. + * kjs/JSArray.cpp: Removed. + * kjs/JSArray.h: Removed. + * kjs/JSCell.cpp: Removed. + * kjs/JSCell.h: Removed. + * kjs/JSFunction.cpp: Removed. + * kjs/JSFunction.h: Removed. + * kjs/JSGlobalObject.cpp: Removed. + * kjs/JSGlobalObject.h: Removed. + * kjs/JSGlobalObjectFunctions.cpp: Removed. + * kjs/JSGlobalObjectFunctions.h: Removed. + * kjs/JSImmediate.cpp: Removed. + * kjs/JSImmediate.h: Removed. + * kjs/JSNotAnObject.cpp: Removed. + * kjs/JSNotAnObject.h: Removed. + * kjs/JSNumberCell.cpp: Removed. + * kjs/JSNumberCell.h: Removed. + * kjs/JSObject.cpp: Removed. + * kjs/JSObject.h: Removed. + * kjs/JSString.cpp: Removed. + * kjs/JSString.h: Removed. + * kjs/JSValue.cpp: Removed. + * kjs/JSValue.h: Removed. + * kjs/JSVariableObject.cpp: Removed. + * kjs/JSVariableObject.h: Removed. + * kjs/JSWrapperObject.cpp: Removed. + * kjs/JSWrapperObject.h: Removed. + * kjs/MathObject.cpp: Removed. + * kjs/MathObject.h: Removed. + * kjs/NativeErrorConstructor.cpp: Removed. + * kjs/NativeErrorConstructor.h: Removed. + * kjs/NativeErrorPrototype.cpp: Removed. + * kjs/NativeErrorPrototype.h: Removed. + * kjs/NumberConstructor.cpp: Removed. + * kjs/NumberConstructor.h: Removed. + * kjs/NumberObject.cpp: Removed. + * kjs/NumberObject.h: Removed. + * kjs/NumberPrototype.cpp: Removed. + * kjs/NumberPrototype.h: Removed. + * kjs/ObjectConstructor.cpp: Removed. + * kjs/ObjectConstructor.h: Removed. + * kjs/ObjectPrototype.cpp: Removed. + * kjs/ObjectPrototype.h: Removed. + * kjs/PropertyMap.cpp: Removed. + * kjs/PropertyMap.h: Removed. + * kjs/PropertySlot.cpp: Removed. + * kjs/PropertySlot.h: Removed. + * kjs/PrototypeFunction.cpp: Removed. + * kjs/PrototypeFunction.h: Removed. + * kjs/PutPropertySlot.h: Removed. + * kjs/SmallStrings.cpp: Removed. + * kjs/SmallStrings.h: Removed. + * kjs/StringConstructor.cpp: Removed. + * kjs/StringConstructor.h: Removed. + * kjs/StringObject.cpp: Removed. + * kjs/StringObject.h: Removed. + * kjs/StringObjectThatMasqueradesAsUndefined.h: Removed. + * kjs/StringPrototype.cpp: Removed. + * kjs/StringPrototype.h: Removed. + * kjs/StructureID.cpp: Removed. + * kjs/StructureID.h: Removed. + * kjs/completion.h: + * kjs/interpreter.h: + * runtime: Added. + * runtime/ArrayConstructor.cpp: Copied from kjs/ArrayConstructor.cpp. + * runtime/ArrayConstructor.h: Copied from kjs/ArrayConstructor.h. + * runtime/ArrayPrototype.cpp: Copied from kjs/ArrayPrototype.cpp. + * runtime/ArrayPrototype.h: Copied from kjs/ArrayPrototype.h. + * runtime/BooleanConstructor.cpp: Copied from kjs/BooleanConstructor.cpp. + * runtime/BooleanConstructor.h: Copied from kjs/BooleanConstructor.h. + * runtime/BooleanObject.cpp: Copied from kjs/BooleanObject.cpp. + * runtime/BooleanObject.h: Copied from kjs/BooleanObject.h. + * runtime/BooleanPrototype.cpp: Copied from kjs/BooleanPrototype.cpp. + * runtime/BooleanPrototype.h: Copied from kjs/BooleanPrototype.h. + * runtime/CallData.cpp: Copied from kjs/CallData.cpp. + * runtime/CallData.h: Copied from kjs/CallData.h. + * runtime/ClassInfo.h: Copied from kjs/ClassInfo.h. + * runtime/ConstructData.cpp: Copied from kjs/ConstructData.cpp. + * runtime/ConstructData.h: Copied from kjs/ConstructData.h. + * runtime/DateConstructor.cpp: Copied from kjs/DateConstructor.cpp. + * runtime/DateConstructor.h: Copied from kjs/DateConstructor.h. + * runtime/DateInstance.cpp: Copied from kjs/DateInstance.cpp. + * runtime/DateInstance.h: Copied from kjs/DateInstance.h. + * runtime/DateMath.cpp: Copied from kjs/DateMath.cpp. + * runtime/DateMath.h: Copied from kjs/DateMath.h. + * runtime/DatePrototype.cpp: Copied from kjs/DatePrototype.cpp. + * runtime/DatePrototype.h: Copied from kjs/DatePrototype.h. + * runtime/Error.cpp: Copied from kjs/Error.cpp. + * runtime/Error.h: Copied from kjs/Error.h. + * runtime/ErrorConstructor.cpp: Copied from kjs/ErrorConstructor.cpp. + * runtime/ErrorConstructor.h: Copied from kjs/ErrorConstructor.h. + * runtime/ErrorInstance.cpp: Copied from kjs/ErrorInstance.cpp. + * runtime/ErrorInstance.h: Copied from kjs/ErrorInstance.h. + * runtime/ErrorPrototype.cpp: Copied from kjs/ErrorPrototype.cpp. + * runtime/ErrorPrototype.h: Copied from kjs/ErrorPrototype.h. + * runtime/FunctionConstructor.cpp: Copied from kjs/FunctionConstructor.cpp. + * runtime/FunctionConstructor.h: Copied from kjs/FunctionConstructor.h. + * runtime/FunctionPrototype.cpp: Copied from kjs/FunctionPrototype.cpp. + * runtime/FunctionPrototype.h: Copied from kjs/FunctionPrototype.h. + * runtime/GlobalEvalFunction.cpp: Copied from kjs/GlobalEvalFunction.cpp. + * runtime/GlobalEvalFunction.h: Copied from kjs/GlobalEvalFunction.h. + * runtime/InternalFunction.cpp: Copied from kjs/InternalFunction.cpp. + * runtime/InternalFunction.h: Copied from kjs/InternalFunction.h. + * runtime/JSArray.cpp: Copied from kjs/JSArray.cpp. + * runtime/JSArray.h: Copied from kjs/JSArray.h. + * runtime/JSCell.cpp: Copied from kjs/JSCell.cpp. + * runtime/JSCell.h: Copied from kjs/JSCell.h. + * runtime/JSFunction.cpp: Copied from kjs/JSFunction.cpp. + * runtime/JSFunction.h: Copied from kjs/JSFunction.h. + * runtime/JSGlobalObject.cpp: Copied from kjs/JSGlobalObject.cpp. + * runtime/JSGlobalObject.h: Copied from kjs/JSGlobalObject.h. + * runtime/JSGlobalObjectFunctions.cpp: Copied from kjs/JSGlobalObjectFunctions.cpp. + * runtime/JSGlobalObjectFunctions.h: Copied from kjs/JSGlobalObjectFunctions.h. + * runtime/JSImmediate.cpp: Copied from kjs/JSImmediate.cpp. + * runtime/JSImmediate.h: Copied from kjs/JSImmediate.h. + * runtime/JSNotAnObject.cpp: Copied from kjs/JSNotAnObject.cpp. + * runtime/JSNotAnObject.h: Copied from kjs/JSNotAnObject.h. + * runtime/JSNumberCell.cpp: Copied from kjs/JSNumberCell.cpp. + * runtime/JSNumberCell.h: Copied from kjs/JSNumberCell.h. + * runtime/JSObject.cpp: Copied from kjs/JSObject.cpp. + * runtime/JSObject.h: Copied from kjs/JSObject.h. + * runtime/JSString.cpp: Copied from kjs/JSString.cpp. + * runtime/JSString.h: Copied from kjs/JSString.h. + * runtime/JSValue.cpp: Copied from kjs/JSValue.cpp. + * runtime/JSValue.h: Copied from kjs/JSValue.h. + * runtime/JSVariableObject.cpp: Copied from kjs/JSVariableObject.cpp. + * runtime/JSVariableObject.h: Copied from kjs/JSVariableObject.h. + * runtime/JSWrapperObject.cpp: Copied from kjs/JSWrapperObject.cpp. + * runtime/JSWrapperObject.h: Copied from kjs/JSWrapperObject.h. + * runtime/MathObject.cpp: Copied from kjs/MathObject.cpp. + * runtime/MathObject.h: Copied from kjs/MathObject.h. + * runtime/NativeErrorConstructor.cpp: Copied from kjs/NativeErrorConstructor.cpp. + * runtime/NativeErrorConstructor.h: Copied from kjs/NativeErrorConstructor.h. + * runtime/NativeErrorPrototype.cpp: Copied from kjs/NativeErrorPrototype.cpp. + * runtime/NativeErrorPrototype.h: Copied from kjs/NativeErrorPrototype.h. + * runtime/NumberConstructor.cpp: Copied from kjs/NumberConstructor.cpp. + * runtime/NumberConstructor.h: Copied from kjs/NumberConstructor.h. + * runtime/NumberObject.cpp: Copied from kjs/NumberObject.cpp. + * runtime/NumberObject.h: Copied from kjs/NumberObject.h. + * runtime/NumberPrototype.cpp: Copied from kjs/NumberPrototype.cpp. + * runtime/NumberPrototype.h: Copied from kjs/NumberPrototype.h. + * runtime/ObjectConstructor.cpp: Copied from kjs/ObjectConstructor.cpp. + * runtime/ObjectConstructor.h: Copied from kjs/ObjectConstructor.h. + * runtime/ObjectPrototype.cpp: Copied from kjs/ObjectPrototype.cpp. + * runtime/ObjectPrototype.h: Copied from kjs/ObjectPrototype.h. + * runtime/PropertyMap.cpp: Copied from kjs/PropertyMap.cpp. + * runtime/PropertyMap.h: Copied from kjs/PropertyMap.h. + * runtime/PropertySlot.cpp: Copied from kjs/PropertySlot.cpp. + * runtime/PropertySlot.h: Copied from kjs/PropertySlot.h. + * runtime/PrototypeFunction.cpp: Copied from kjs/PrototypeFunction.cpp. + * runtime/PrototypeFunction.h: Copied from kjs/PrototypeFunction.h. + * runtime/PutPropertySlot.h: Copied from kjs/PutPropertySlot.h. + * runtime/SmallStrings.cpp: Copied from kjs/SmallStrings.cpp. + * runtime/SmallStrings.h: Copied from kjs/SmallStrings.h. + * runtime/StringConstructor.cpp: Copied from kjs/StringConstructor.cpp. + * runtime/StringConstructor.h: Copied from kjs/StringConstructor.h. + * runtime/StringObject.cpp: Copied from kjs/StringObject.cpp. + * runtime/StringObject.h: Copied from kjs/StringObject.h. + * runtime/StringObjectThatMasqueradesAsUndefined.h: Copied from kjs/StringObjectThatMasqueradesAsUndefined.h. + * runtime/StringPrototype.cpp: Copied from kjs/StringPrototype.cpp. + * runtime/StringPrototype.h: Copied from kjs/StringPrototype.h. + * runtime/StructureID.cpp: Copied from kjs/StructureID.cpp. + * runtime/StructureID.h: Copied from kjs/StructureID.h. + +2008-10-28 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Fixed https://bugs.webkit.org/show_bug.cgi?id=21919 + Sampler reports bogus time in op_enter during 3d-raytrace.js + + Fixed a bug where we would pass the incorrect Instruction* during some + parts of CTI codegen. + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + * VM/SamplingTool.cpp: + (JSC::SamplingTool::run): + * wtf/Platform.h: + +2008-10-28 Kevin McCullough <kmccullough@apple.com> + + Reviewed by Dan Bernstein. + + -Removed unused includes. + Apparent .4% speedup in Sunspider + + * kjs/JSObject.cpp: + * kjs/interpreter.cpp: + +2008-10-28 Alp Toker <alp@nuanti.com> + + Include copyright license files in the autotools dist target. + + Change suggested by Mike Hommey. + + * GNUmakefile.am: + +2008-10-27 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Maciej Stachowiak. + + Stop discarding CodeBlock samples that can't be charged to a specific + opcode. Instead, charge the relevant CodeBlock, and provide a footnote + explaining the situation. + + This will help us tell which CodeBlocks are hot, even if we can't + identify specific lines of code within the CodeBlocks. + + * VM/SamplingTool.cpp: + (JSC::ScopeSampleRecord::sample): + (JSC::compareScopeSampleRecords): + (JSC::SamplingTool::dump): + + * VM/SamplingTool.h: + (JSC::ScopeSampleRecord::ScopeSampleRecord): + (JSC::ScopeSampleRecord::~ScopeSampleRecord): + +2008-10-27 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Added a mutex around the SamplingTool's ScopeNode* map, to solve a crash + when sampling the v8 tests. + + * VM/SamplingTool.cpp: + (JSC::SamplingTool::run): + (JSC::SamplingTool::notifyOfScope): + * VM/SamplingTool.h: Since new ScopeNodes can be created after + the SamplingTools has begun sampling, reads and writes to / from the + map need to be synchronized. Shark says this doesn't measurably increase + sampling overhead. + +2008-10-25 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix Windows build. + + * VM/Machine.cpp: + (JSC::Machine::privateExecute): Provide a dummy value to the + HostCallRecord in CTI non-sampling builds, to silence compiler warning. + +2008-10-25 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix Windows build. + + * VM/SamplingTool.h: + (JSC::SamplingTool::encodeSample): Explicitly cast bool to int, to + silence compiler warning. + +2008-10-25 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig, with Gavin Barraclough's help. + + Fixed Sampling Tool: + - Made CodeBlock sampling work with CTI + - Improved accuracy by unifying most sampling data into a single + 32bit word, which can be written / read atomically. + - Split out three different #ifdefs for modularity: OPCODE_SAMPLING; + CODEBLOCK_SAMPLING; OPCODE_STATS. + - Improved reporting clarity + - Refactored for code clarity + + * JavaScriptCore.exp: Exported another symbol. + + * VM/CTI.cpp: + (JSC::CTI::emitCTICall): + (JSC::CTI::compileOpCall): + (JSC::CTI::emitSlowScriptCheck): + (JSC::CTI::compileBinaryArithOpSlowCase): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + (JSC::CTI::privateCompile): + * VM/CTI.h: Updated CTI codegen to use the unified SamplingTool interface + for encoding samples. (This required passing the current vPC to a lot + more functions, since the unified interface samples the current vPC.) + Added hooks for writing the current CodeBlock* on function entry and + after a function call, for the sake of the CodeBlock sampler. Removed + obsolete hook for clearing the current sample inside op_end. Also removed + the custom enum used to differentiate flavors of op_call, since the + OpcodeID enum works just as well. (This was important in an earlier + version of the patch, but now it's just cleanup.) + + * VM/CodeBlock.cpp: + (JSC::CodeBlock::lineNumberForVPC): + * VM/CodeBlock.h: Upated for refactored #ifdefs. Changed lineNumberForVPC + to be robust against vPCs not recorded for exception handling, since + the Sampler may ask for an arbitrary vPC. + + * VM/Machine.cpp: + (JSC::Machine::execute): + (JSC::Machine::privateExecute): + (JSC::Machine::cti_op_call_NotJSFunction): + (JSC::Machine::cti_op_construct_NotJSConstruct): + * VM/Machine.h: + (JSC::Machine::setSampler): + (JSC::Machine::sampler): + (JSC::Machine::jitCodeBuffer): Upated for refactored #ifdefs. Changed + Machine to use SamplingTool helper objects to record movement in and + out of host code. This makes samples a bit more precise. + + * VM/Opcode.cpp: + (JSC::OpcodeStats::~OpcodeStats): + * VM/Opcode.h: Upated for refactored #ifdefs. Added a little more padding, + to accomodate our more verbose opcode names. + + * VM/SamplingTool.cpp: + (JSC::ScopeSampleRecord::sample): Only count a sample toward our total + if we actually record it. This solves cases where a CodeBlock will + claim to have been sampled many times, with reported samples that don't + match. + + (JSC::SamplingTool::run): Read the current sample into a Sample helper + object, to ensure that the data doesn't change while we're analyzing it, + and to help decode the data. Only access the CodeBlock sampling hash + table if CodeBlock sampling has been enabled, so non-CodeBlock sampling + runs can operate with even less overhead. + + (JSC::SamplingTool::dump): I reorganized this code a lot to print the + most important info at the top, print as a table, annotate and document + the stuff I didn't understand when I started, etc. + + * VM/SamplingTool.h: New helper classes, described above. + + * kjs/Parser.h: + * kjs/Shell.cpp: + (runWithScripts): + * kjs/nodes.cpp: + (JSC::ScopeNode::ScopeNode): Updated for new sampling APIs. + + * wtf/Platform.h: Moved sampling #defines here, since our custom is to + put ENABLE #defines into Platform.h. Made explicit the fact that + CODEBLOCK_SAMPLING depends on OPCODE_SAMPLING. + +2008-10-25 Jan Michael Alonzo <jmalonzo@webkit.org> + + JSC Build fix, not reviewed. + + * VM/CTI.cpp: add missing include stdio.h for debug builds + +2008-10-24 Eric Seidel <eric@webkit.org> + + Reviewed by Darin Adler. + + Get rid of a bonus ASSERT when using a null string as a regexp. + Specifically calling: RegularExpression::match() with String::empty() + will hit this ASSERT. + Chromium hits this, but I don't know of any way to make a layout test. + + * pcre/pcre_exec.cpp: + (jsRegExpExecute): + +2008-10-24 Alexey Proskuryakov <ap@webkit.org> + + Suggested and rubber-stamped by Geoff Garen. + + Fix a crash when opening Font Picker. + + The change also hopefully fixes this bug, which I could never reproduce: + https://bugs.webkit.org/show_bug.cgi?id=20241 + <rdar://problem/6290576> Safari crashes at JSValueUnprotect() when fontpicker view close + + * API/JSContextRef.cpp: (JSContextGetGlobalObject): Use lexical global object instead of + dynamic one. + +2008-10-24 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Geoff Garen. + + Remove ScopeChainNode::bottom() and inline it into its only caller, + ScopeChainnode::globalObject(). + + * kjs/JSGlobalObject.h: + (JSC::ScopeChainNode::globalObject): + * kjs/ScopeChain.h: + (JSC::ScopeChain::bottom): + +2008-10-24 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Maciej Stachowiak. + + Bug 21862: Create JSFunction prototype property lazily + <https://bugs.webkit.org/show_bug.cgi?id=21862> + + This is a 1.5% speedup on SunSpider and a 1.4% speedup on the V8 + benchmark suite, including a 3.8% speedup on Earley-Boyer. + + * kjs/JSFunction.cpp: + (JSC::JSFunction::getOwnPropertySlot): + * kjs/nodes.cpp: + (JSC::FuncDeclNode::makeFunction): + (JSC::FuncExprNode::makeFunction): + +2008-10-24 Greg Bolsinga <bolsinga@apple.com> + + Reviewed by Sam Weinig. + + https://bugs.webkit.org/show_bug.cgi?id=21475 + + Provide support for the Geolocation API + + http://dev.w3.org/geo/api/spec-source.html + + * wtf/Platform.h: ENABLE_GEOLOCATION defaults to 0 + +2008-10-24 Darin Adler <darin@apple.com> + + - finish rolling out https://bugs.webkit.org/show_bug.cgi?id=21732 + + * API/APICast.h: + * API/JSCallbackConstructor.h: + * API/JSCallbackFunction.cpp: + * API/JSCallbackFunction.h: + * API/JSCallbackObject.h: + * API/JSCallbackObjectFunctions.h: + * API/JSContextRef.cpp: + * API/JSObjectRef.cpp: + * API/JSValueRef.cpp: + * VM/CTI.cpp: + * VM/CTI.h: + * VM/CodeBlock.cpp: + * VM/CodeBlock.h: + * VM/CodeGenerator.cpp: + * VM/CodeGenerator.h: + * VM/ExceptionHelpers.cpp: + * VM/ExceptionHelpers.h: + * VM/JSPropertyNameIterator.cpp: + * VM/JSPropertyNameIterator.h: + * VM/Machine.cpp: + * VM/Machine.h: + * VM/Register.h: + * kjs/ArgList.cpp: + * kjs/ArgList.h: + * kjs/Arguments.cpp: + * kjs/Arguments.h: + * kjs/ArrayConstructor.cpp: + * kjs/ArrayPrototype.cpp: + * kjs/BooleanConstructor.cpp: + * kjs/BooleanConstructor.h: + * kjs/BooleanObject.h: + * kjs/BooleanPrototype.cpp: + * kjs/CallData.cpp: + * kjs/CallData.h: + * kjs/ConstructData.cpp: + * kjs/ConstructData.h: + * kjs/DateConstructor.cpp: + * kjs/DateInstance.h: + * kjs/DatePrototype.cpp: + * kjs/DatePrototype.h: + * kjs/DebuggerCallFrame.cpp: + * kjs/DebuggerCallFrame.h: + * kjs/ErrorConstructor.cpp: + * kjs/ErrorPrototype.cpp: + * kjs/ExecState.cpp: + * kjs/ExecState.h: + * kjs/FunctionConstructor.cpp: + * kjs/FunctionPrototype.cpp: + * kjs/FunctionPrototype.h: + * kjs/GetterSetter.cpp: + * kjs/GetterSetter.h: + * kjs/InternalFunction.h: + * kjs/JSActivation.cpp: + * kjs/JSActivation.h: + * kjs/JSArray.cpp: + * kjs/JSArray.h: + * kjs/JSCell.cpp: + * kjs/JSCell.h: + * kjs/JSFunction.cpp: + * kjs/JSFunction.h: + * kjs/JSGlobalData.h: + * kjs/JSGlobalObject.cpp: + * kjs/JSGlobalObject.h: + * kjs/JSGlobalObjectFunctions.cpp: + * kjs/JSGlobalObjectFunctions.h: + * kjs/JSImmediate.cpp: + * kjs/JSImmediate.h: + * kjs/JSNotAnObject.cpp: + * kjs/JSNotAnObject.h: + * kjs/JSNumberCell.cpp: + * kjs/JSNumberCell.h: + * kjs/JSObject.cpp: + * kjs/JSObject.h: + * kjs/JSStaticScopeObject.cpp: + * kjs/JSStaticScopeObject.h: + * kjs/JSString.cpp: + * kjs/JSString.h: + * kjs/JSValue.h: + * kjs/JSVariableObject.h: + * kjs/JSWrapperObject.h: + * kjs/MathObject.cpp: + * kjs/MathObject.h: + * kjs/NativeErrorConstructor.cpp: + * kjs/NumberConstructor.cpp: + * kjs/NumberConstructor.h: + * kjs/NumberObject.cpp: + * kjs/NumberObject.h: + * kjs/NumberPrototype.cpp: + * kjs/ObjectConstructor.cpp: + * kjs/ObjectPrototype.cpp: + * kjs/ObjectPrototype.h: + * kjs/PropertyMap.h: + * kjs/PropertySlot.cpp: + * kjs/PropertySlot.h: + * kjs/RegExpConstructor.cpp: + * kjs/RegExpConstructor.h: + * kjs/RegExpMatchesArray.h: + * kjs/RegExpObject.cpp: + * kjs/RegExpObject.h: + * kjs/RegExpPrototype.cpp: + * kjs/Shell.cpp: + * kjs/StringConstructor.cpp: + * kjs/StringObject.cpp: + * kjs/StringObject.h: + * kjs/StringObjectThatMasqueradesAsUndefined.h: + * kjs/StringPrototype.cpp: + * kjs/StructureID.cpp: + * kjs/StructureID.h: + * kjs/collector.cpp: + * kjs/collector.h: + * kjs/completion.h: + * kjs/grammar.y: + * kjs/interpreter.cpp: + * kjs/interpreter.h: + * kjs/lookup.cpp: + * kjs/lookup.h: + * kjs/nodes.h: + * kjs/operations.cpp: + * kjs/operations.h: + * kjs/protect.h: + * profiler/ProfileGenerator.cpp: + * profiler/Profiler.cpp: + * profiler/Profiler.h: + Use JSValue* instead of JSValuePtr. + +2008-10-24 David Kilzer <ddkilzer@apple.com> + + Rolled out r37840. + + * wtf/Platform.h: + +2008-10-23 Greg Bolsinga <bolsinga@apple.com> + + Reviewed by Sam Weinig. + + https://bugs.webkit.org/show_bug.cgi?id=21475 + + Provide support for the Geolocation API + + http://dev.w3.org/geo/api/spec-source.html + + * wtf/Platform.h: ENABLE_GEOLOCATION defaults to 0 + +2008-10-23 David Kilzer <ddkilzer@apple.com> + + Bug 21832: Fix scripts using 'new File::Temp' for Perl 5.10 + + <https://bugs.webkit.org/show_bug.cgi?id=21832> + + Reviewed by Sam Weinig. + + * pcre/dftables: Use imported tempfile() from File::Temp instead of + 'new File::Temp' to make the script work with Perl 5.10. + +2008-10-23 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Fix hideous pathological case performance when looking up repatch info, bug #21727. + + When repatching JIT code to optimize we look up records providing information about + the generated code (also used to track recsources used in linking to be later released). + The lookup was being performed using a linear scan of all such records. + + (1) Split up the different types of reptach information. This means we can search them + separately, and in some cases should reduce their size. + (2) In the case of property accesses, search with a binary chop over the data. + (3) In the case of calls, pass a pointer to the repatch info into the relink function. + + * VM/CTI.cpp: + (JSC::CTI::CTI): + (JSC::CTI::compileOpCall): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + (JSC::CTI::privateCompile): + (JSC::CTI::unlinkCall): + (JSC::CTI::linkCall): + * VM/CTI.h: + * VM/CodeBlock.cpp: + (JSC::CodeBlock::dump): + (JSC::CodeBlock::~CodeBlock): + (JSC::CodeBlock::unlinkCallers): + (JSC::CodeBlock::derefStructureIDs): + * VM/CodeBlock.h: + (JSC::StructureStubInfo::StructureStubInfo): + (JSC::CallLinkInfo::CallLinkInfo): + (JSC::CallLinkInfo::setUnlinked): + (JSC::CallLinkInfo::isLinked): + (JSC::getStructureStubInfoReturnLocation): + (JSC::binaryChop): + (JSC::CodeBlock::addCaller): + (JSC::CodeBlock::getStubInfo): + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::emitResolve): + (JSC::CodeGenerator::emitGetById): + (JSC::CodeGenerator::emitPutById): + (JSC::CodeGenerator::emitCall): + (JSC::CodeGenerator::emitConstruct): + * VM/Machine.cpp: + (JSC::Machine::cti_vm_lazyLinkCall): + +2008-10-23 Peter Kasting <pkasting@google.com> + + Reviewed by Adam Roben. + + https://bugs.webkit.org/show_bug.cgi?id=21833 + Place JavaScript Debugger hooks under #if ENABLE(JAVASCRIPT_DEBUGGER). + + * wtf/Platform.h: + +2008-10-23 David Kilzer <ddkilzer@apple.com> + + Bug 21831: Fix create_hash_table for Perl 5.10 + + <https://bugs.webkit.org/show_bug.cgi?id=21831> + + Reviewed by Sam Weinig. + + * kjs/create_hash_table: Escaped square brackets so that Perl 5.10 + doesn't try to use @nameEntries. + +2008-10-23 Darin Adler <darin@apple.com> + + - roll out https://bugs.webkit.org/show_bug.cgi?id=21732 + to remove the JSValuePtr class, to fix two problems + + 1) slowness under MSVC, since it doesn't handle a + class with a single pointer in it as efficiently + as a pointer + + 2) uninitialized pointers in Vector + + * JavaScriptCore.exp: Updated. + + * API/APICast.h: + (toRef): + * VM/CTI.cpp: + (JSC::CTI::asInteger): + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::addConstant): + * VM/CodeGenerator.h: + (JSC::CodeGenerator::JSValueHashTraits::constructDeletedValue): + (JSC::CodeGenerator::JSValueHashTraits::isDeletedValue): + * VM/Machine.cpp: + (JSC::Machine::cti_op_add): + (JSC::Machine::cti_op_pre_inc): + (JSC::Machine::cti_op_get_by_id): + (JSC::Machine::cti_op_get_by_id_second): + (JSC::Machine::cti_op_get_by_id_generic): + (JSC::Machine::cti_op_get_by_id_fail): + (JSC::Machine::cti_op_instanceof): + (JSC::Machine::cti_op_del_by_id): + (JSC::Machine::cti_op_mul): + (JSC::Machine::cti_op_call_NotJSFunction): + (JSC::Machine::cti_op_resolve): + (JSC::Machine::cti_op_construct_NotJSConstruct): + (JSC::Machine::cti_op_get_by_val): + (JSC::Machine::cti_op_sub): + (JSC::Machine::cti_op_lesseq): + (JSC::Machine::cti_op_negate): + (JSC::Machine::cti_op_resolve_base): + (JSC::Machine::cti_op_resolve_skip): + (JSC::Machine::cti_op_resolve_global): + (JSC::Machine::cti_op_div): + (JSC::Machine::cti_op_pre_dec): + (JSC::Machine::cti_op_not): + (JSC::Machine::cti_op_eq): + (JSC::Machine::cti_op_lshift): + (JSC::Machine::cti_op_bitand): + (JSC::Machine::cti_op_rshift): + (JSC::Machine::cti_op_bitnot): + (JSC::Machine::cti_op_mod): + (JSC::Machine::cti_op_less): + (JSC::Machine::cti_op_neq): + (JSC::Machine::cti_op_urshift): + (JSC::Machine::cti_op_bitxor): + (JSC::Machine::cti_op_bitor): + (JSC::Machine::cti_op_call_eval): + (JSC::Machine::cti_op_throw): + (JSC::Machine::cti_op_next_pname): + (JSC::Machine::cti_op_typeof): + (JSC::Machine::cti_op_is_undefined): + (JSC::Machine::cti_op_is_boolean): + (JSC::Machine::cti_op_is_number): + (JSC::Machine::cti_op_is_string): + (JSC::Machine::cti_op_is_object): + (JSC::Machine::cti_op_is_function): + (JSC::Machine::cti_op_stricteq): + (JSC::Machine::cti_op_nstricteq): + (JSC::Machine::cti_op_to_jsnumber): + (JSC::Machine::cti_op_in): + (JSC::Machine::cti_op_del_by_val): + (JSC::Machine::cti_vm_throw): + Removed calls to payload functions. + + * VM/Register.h: + (JSC::Register::Register): Removed overload for JSCell and call + to payload function. + + * kjs/JSCell.h: Changed JSCell to derive from JSValue again. + Removed JSValuePtr constructor. + (JSC::asCell): Changed cast from reinterpret_cast to static_cast. + + * kjs/JSImmediate.h: Removed JSValuePtr class. Added typedef back. + + * kjs/JSValue.h: + (JSC::JSValue::JSValue): Added empty protected inline constructor back. + (JSC::JSValue::~JSValue): Same for destructor. + Removed == and != operator for JSValuePtr. + + * kjs/PropertySlot.h: + (JSC::PropertySlot::PropertySlot): Chnaged argument to const JSValue* + and added a const_cast. + + * kjs/protect.h: Removed overloads and specialization for JSValuePtr. + +2008-10-22 Oliver Hunt <oliver@apple.com> + + Reviewed by Maciej Stachowiak. + + Really "fix" CTI mode on windows 2k3. + + This adds new methods fastMallocExecutable and fastFreeExecutable + to wrap allocation for cti code. This still just makes fastMalloc + return executable memory all the time, which will be fixed in a + later patch. + + However in windows debug builds all executable allocations will be + allocated on separate executable pages, which should resolve any + remaining 2k3 issues. Conveniently the 2k3 bot will now also fail + if there are any fastFree vs. fastFreeExecutable errors. + + * ChangeLog: + * VM/CodeBlock.cpp: + (JSC::CodeBlock::~CodeBlock): + * kjs/regexp.cpp: + (JSC::RegExp::~RegExp): + * masm/X86Assembler.h: + (JSC::JITCodeBuffer::copy): + * wtf/FastMalloc.cpp: + (WTF::fastMallocExecutable): + (WTF::fastFreeExecutable): + (WTF::TCMallocStats::fastMallocExecutable): + (WTF::TCMallocStats::fastFreeExecutable): + * wtf/FastMalloc.h: + +2008-10-22 Darin Adler <darin@apple.com> + + Reviewed by Sam Weinig. + + - fix https://bugs.webkit.org/show_bug.cgi?id=21294 + Bug 21294: Devirtualize getOwnPropertySlot() + + A bit over 3% faster on V8 tests. + + * JavascriptCore.exp: Export leak-related functions.. + + * API/JSCallbackConstructor.h: + (JSC::JSCallbackConstructor::createStructureID): Set HasStandardGetOwnPropertySlot + since this class doesn't override getPropertySlot. + * API/JSCallbackFunction.h: + (JSC::JSCallbackFunction::createStructureID): Ditto. + + * VM/ExceptionHelpers.cpp: + (JSC::InterruptedExecutionError::InterruptedExecutionError): Use a structure + that's created just for this class instead of trying to share a single "null + prototype" structure. + + * VM/Machine.cpp: + (JSC::Machine::cti_op_create_arguments_no_params): Rename + Arguments::ArgumentsNoParameters to Arguments::NoParameters. + + * kjs/Arguments.h: Rename the enum from Arguments::ArgumentsParameters to + Arguments::NoParametersType and the value from Arguments::ArgumentsNoParameters + to Arguments::NoParameters. + (JSC::Arguments::createStructureID): Added. Returns a structure without + HasStandardGetOwnPropertySlot since this class overrides getOwnPropertySlot. + (JSC::Arguments::Arguments): Added an assertion that there are no parameters. + + * kjs/DatePrototype.h: + (JSC::DatePrototype::createStructureID): Added. Returns a structure without + HasStandardGetOwnPropertySlot since this class overrides getOwnPropertySlot. + + * kjs/FunctionPrototype.h: + (JSC::FunctionPrototype::createStructureID): Set HasStandardGetOwnPropertySlot + since this class doesn't override getPropertySlot. + * kjs/InternalFunction.h: + (JSC::InternalFunction::createStructureID): Ditto. + + * kjs/JSArray.h: + (JSC::JSArray::createStructureID): Added. Returns a structure without + HasStandardGetOwnPropertySlot since this class overrides getOwnPropertySlot. + + * kjs/JSCell.h: Added declaration of fastGetOwnPropertySlot; a non-virtual + version that uses the structure bit to decide whether to call the virtual + version. + + * kjs/JSFunction.h: + (JSC::JSFunction::createStructureID): Added. Returns a structure without + HasStandardGetOwnPropertySlot since this class overrides getOwnPropertySlot. + + * kjs/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): Initialize new structures; removed + nullProtoStructureID. + * kjs/JSGlobalData.h: Added new structures. Removed nullProtoStructureID. + + * kjs/JSGlobalObject.h: + (JSC::JSGlobalObject::createStructureID): Added. Returns a structure without + HasStandardGetOwnPropertySlot since this class overrides getOwnPropertySlot. + + * kjs/JSNotAnObject.h: + (JSC::JSNotAnObjectErrorStub::JSNotAnObjectErrorStub): Use a structure + that's created just for this class instead of trying to share a single "null + prototype" structure. + (JSC::JSNotAnObjectErrorStub::isNotAnObjectErrorStub): Marked this function + virtual for clarity and made it private since no one should call it if they + already have a pointer to this specific type. + (JSC::JSNotAnObject::JSNotAnObject): Use a structure that's created just + for this class instead of trying to share a single "null prototype" structure. + (JSC::JSNotAnObject::createStructureID): Added. Returns a structure without + HasStandardGetOwnPropertySlot since this class overrides getOwnPropertySlot. + + * kjs/JSObject.h: + (JSC::JSObject::createStructureID): Added HasStandardGetOwnPropertySlot. + (JSC::JSObject::inlineGetOwnPropertySlot): Added. Used so we can share code + between getOwnPropertySlot and fastGetOwnPropertySlot. + (JSC::JSObject::getOwnPropertySlot): Moved so that functions are above the + functions that call them. Moved the guts of this function into + inlineGetOwnPropertySlot. + (JSC::JSCell::fastGetOwnPropertySlot): Added. Checks the + HasStandardGetOwnPropertySlot bit and if it's set, calls + inlineGetOwnPropertySlot, otherwise calls getOwnPropertySlot. + (JSC::JSObject::getPropertySlot): Changed to call fastGetOwnPropertySlot. + (JSC::JSValue::get): Changed to call fastGetOwnPropertySlot. + + * kjs/JSWrapperObject.h: Made constructor protected to emphasize that + this class is only a base class and never instantiated. + + * kjs/MathObject.h: + (JSC::MathObject::createStructureID): Added. Returns a structure without + HasStandardGetOwnPropertySlot since this class overrides getOwnPropertySlot. + * kjs/NumberConstructor.h: + (JSC::NumberConstructor::createStructureID): Ditto. + * kjs/RegExpConstructor.h: + (JSC::RegExpConstructor::createStructureID): Ditto. + * kjs/RegExpObject.h: + (JSC::RegExpObject::createStructureID): Ditto. + * kjs/StringObject.h: + (JSC::StringObject::createStructureID): Ditto. + + * kjs/TypeInfo.h: Added HasStandardGetOwnPropertySlot flag and + hasStandardGetOwnPropertySlot accessor function. + +2008-10-22 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Geoff Garen. + + Bug 21803: Fuse op_jfalse with op_eq_null and op_neq_null + <https://bugs.webkit.org/show_bug.cgi?id=21803> + + Fuse op_jfalse with op_eq_null and op_neq_null to make the new opcodes + op_jeq_null and op_jneq_null. + + This is a 2.6% speedup on the V8 Raytrace benchmark, and strangely also + a 4.7% speedup on the V8 Arguments benchmark, even though it uses + neither of the two new opcodes. + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): + * VM/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::emitJumpIfTrue): + (JSC::CodeGenerator::emitJumpIfFalse): + * VM/Machine.cpp: + (JSC::Machine::privateExecute): + * VM/Opcode.h: + +2008-10-22 Darin Fisher <darin@chromium.org> + + Reviewed by Eric Seidel. + + Should not define PLATFORM(WIN,MAC,GTK) when PLATFORM(CHROMIUM) is defined + https://bugs.webkit.org/show_bug.cgi?id=21757 + + PLATFORM(CHROMIUM) implies HAVE_ACCESSIBILITY + + * wtf/Platform.h: + +2008-10-22 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Alexey Proskuryakov. + + Correct opcode names in documentation. + + * VM/Machine.cpp: + (JSC::Machine::privateExecute): + +2008-10-21 Oliver Hunt <oliver@apple.com> + + RS=Maciej Stachowiak. + + Force FastMalloc to make all allocated pages executable in + a vague hope this will allow the Win2k3 bot to be able to + run tests. + + Filed Bug 21783: Need more granular control over allocation of executable memory + to cover a more granular version of this patch. + + * wtf/TCSystemAlloc.cpp: + (TryVirtualAlloc): + +2008-10-21 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=21769 + MessagePort should be GC protected if there are messages to be delivered + + * wtf/MessageQueue.h: + (WTF::::isEmpty): Added. Also added a warning for methods that return a snapshot of queue + state, thus likely to cause race conditions. + +2008-10-21 Darin Adler <darin@apple.com> + + Reviewed by Maciej Stachowiak. + + - convert post-increment to pre-increment in a couple more places for speed + + Speeds up V8 benchmarks a little on most computers. (But, strangely, slows + them down a little on my computer.) + + * kjs/nodes.cpp: + (JSC::statementListEmitCode): Removed default argument, since we always want + to specify this explicitly. + (JSC::ForNode::emitCode): Tolerate ignoredResult() as the dst -- means the + same thing as 0. + (JSC::ReturnNode::emitCode): Ditto. + (JSC::ThrowNode::emitCode): Ditto. + (JSC::FunctionBodyNode::emitCode): Pass ignoredResult() so that we know we + don't have to compute the result of function statements. + +2008-10-21 Peter Kasting <pkasting@google.com> + + Reviewed by Maciej Stachowiak. + + Fix an include of a non-public header to use "" instead of <>. + + * API/JSProfilerPrivate.cpp: + +2008-10-20 Sam Weinig <sam@webkit.org> + + Reviewed by Cameron Zwarich. + + Fix for https://bugs.webkit.org/show_bug.cgi?id=21766 + REGRESSION: 12 JSC tests fail + + The JSGlobalObject was mutating the shared nullProtoStructureID when + used in jsc. Instead of using nullProtoStructureID, use a new StructureID. + + * API/JSCallbackObject.h: + * API/JSCallbackObjectFunctions.h: + (JSC::::JSCallbackObject): + * API/JSContextRef.cpp: + (JSGlobalContextCreateInGroup): + * kjs/JSGlobalObject.h: + (JSC::JSGlobalObject::JSGlobalObject): + * kjs/Shell.cpp: + (GlobalObject::GlobalObject): + (jscmain): + +2008-10-20 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Maciej Stachowiak. + + Remove an untaken branch in CodeGenerator::emitJumpIfFalse(). This + function is never called with a backwards target LabelID, and there is + even an assertion to this effect at the top of the function body. + + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::emitJumpIfFalse): + +2008-10-20 Cameron Zwarich <zwarich@apple.com> + + Rubber-stamped by Sam Weinig. + + Add opcode documentation for undocumented opcodes. + + * VM/Machine.cpp: + (JSC::Machine::privateExecute): + +2008-10-16 Sam Weinig <sam@webkit.org> + + Reviewed by Cameron Zwarich. + + Fix for https://bugs.webkit.org/show_bug.cgi?id=21683 + Don't create intermediate StructureIDs for builtin objects + + Second stage in reduce number of StructureIDs created when initializing the + JSGlobalObject. + + - Use putDirectWithoutTransition for the remaining singleton objects to reduce + the number of StructureIDs create for about:blank from 132 to 73. + + * kjs/ArrayConstructor.cpp: + (JSC::ArrayConstructor::ArrayConstructor): + * kjs/BooleanConstructor.cpp: + (JSC::BooleanConstructor::BooleanConstructor): + * kjs/BooleanPrototype.cpp: + (JSC::BooleanPrototype::BooleanPrototype): + * kjs/DateConstructor.cpp: + (JSC::DateConstructor::DateConstructor): + * kjs/ErrorConstructor.cpp: + (JSC::ErrorConstructor::ErrorConstructor): + * kjs/ErrorPrototype.cpp: + (JSC::ErrorPrototype::ErrorPrototype): + * kjs/FunctionConstructor.cpp: + (JSC::FunctionConstructor::FunctionConstructor): + * kjs/FunctionPrototype.cpp: + (JSC::FunctionPrototype::FunctionPrototype): + (JSC::FunctionPrototype::addFunctionProperties): + * kjs/FunctionPrototype.h: + (JSC::FunctionPrototype::createStructureID): + * kjs/InternalFunction.cpp: + * kjs/InternalFunction.h: + (JSC::InternalFunction::InternalFunction): + * kjs/JSGlobalObject.cpp: + (JSC::JSGlobalObject::reset): + * kjs/JSObject.h: + * kjs/MathObject.cpp: + (JSC::MathObject::MathObject): + * kjs/NumberConstructor.cpp: + (JSC::NumberConstructor::NumberConstructor): + * kjs/NumberPrototype.cpp: + (JSC::NumberPrototype::NumberPrototype): + * kjs/ObjectConstructor.cpp: + (JSC::ObjectConstructor::ObjectConstructor): + * kjs/RegExpConstructor.cpp: + (JSC::RegExpConstructor::RegExpConstructor): + * kjs/RegExpPrototype.cpp: + (JSC::RegExpPrototype::RegExpPrototype): + * kjs/StringConstructor.cpp: + (JSC::StringConstructor::StringConstructor): + * kjs/StringPrototype.cpp: + (JSC::StringPrototype::StringPrototype): + * kjs/StructureID.cpp: + (JSC::StructureID::dumpStatistics): + * kjs/StructureID.h: + (JSC::StructureID::setPrototypeWithoutTransition): + +2008-10-20 Alp Toker <alp@nuanti.com> + + Fix autotools dist build target by listing recently added header + files only. Not reviewed. + + * GNUmakefile.am: + +2008-10-20 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Anders Carlsson. + + * VM/Machine.cpp: + (JSC::Machine::tryCacheGetByID): Removed a redundant and sometimes + incorrect cast, which started ASSERTing after Darin's last checkin. + +2008-10-20 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Re-enable CTI, which I accidentally disabled while checking in fixes + to bytecode. + + * wtf/Platform.h: + +2008-10-20 Alp Toker <alp@nuanti.com> + + Rubber-stamped by Mark Rowe. + + Typo fix in function name: mimimum -> minimum. + + * kjs/DateMath.cpp: + (JSC::minimumYearForDST): + (JSC::equivalentYearForDST): + +2008-10-20 Alp Toker <alp@nuanti.com> + + Reviewed by Mark Rowe. + + Use pthread instead of GThread where possible in the GTK+ port. This + fixes issues with global initialisation, particularly on GTK+/Win32 + where a late g_thread_init() will cause hangs. + + * GNUmakefile.am: + * wtf/Platform.h: + * wtf/Threading.h: + * wtf/ThreadingGtk.cpp: + * wtf/ThreadingPthreads.cpp: + +2008-10-20 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Darin Adler. + + Fixed https://bugs.webkit.org/show_bug.cgi?id=21735 + Emit profiling instrumentation only if the Web Inspector's profiling + feature is enabled + + 22.2% speedup on empty function call benchmark. + 2.9% speedup on v8 benchmark. + 0.7% speedup on SunSpider. + + Lesser but similar speedups in bytecode. + + * VM/CTI.cpp: + (JSC::CTI::compileOpCall): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): Nixed JITed profiler hooks. Profiler + hooks now have their own opcodes. Added support for compiling profiler + hook opcodes. + + (JSC::CodeBlock::dump): Dump support for the new profiling opcodes. + + * VM/CodeGenerator.h: + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::CodeGenerator): + (JSC::CodeGenerator::emitCall): + (JSC::CodeGenerator::emitConstruct): Conditionally emit profiling hooks + around call and construct, at the call site. (It's easier to get things + right this way, if you have profiled code calling non-profiled code. + Also, you get a slightly more accurate profile, since you charge the full + cost of the call / construct operation to the callee.) + + Also, fixed a bug where construct would fetch the ".prototype" property + from the constructor before evaluating the arguments to the constructor, + incorrectly allowing an "invalid constructor" exception to short-circuit + argument evaluation. I encountered this bug when trying to make + constructor exceptions work with profiling. + + * VM/Machine.cpp: + (JSC::Machine::callEval): Removed obsolete profiler hooks. + + (JSC::Machine::throwException): Added a check for an exception thrown + within a call instruction. We didn't need this before because the call + instruction would check for a valid call before involing the profiler. + (JSC::Machine::execute): Added a didExecute hook at the end of top-level + function invocation, since op_ret no longer does this for us. + + (JSC::Machine::privateExecute): Removed obsolete profiler hooks. Added + profiler opcodes. Changed some ++vPC to vPC[x] notation, since the + latter is better for performance, and it makes reasoning about the + current opcode in exception handling much simpler. + + (JSC::Machine::cti_op_call_NotJSFunction): Removed obsolete profiler + hooks. + + (JSC::Machine::cti_op_create_arguments_no_params): Added missing + CTI_STACK_HACK that I noticed when adding CTI_STACK_HACK to the new + profiler opcode functions. + + (JSC::Machine::cti_op_profile_will_call): + (JSC::Machine::cti_op_profile_did_call): The new profiler opcode + functions. + + (JSC::Machine::cti_op_construct_NotJSConstruct): Removed obsolete profiler + hooks. + + * VM/Machine.h: + (JSC::Machine::isCallOpcode): Helper for exception handling. + + * VM/Opcode.h: Declare new opcodes. + + * kjs/JSGlobalObject.h: + (JSC::JSGlobalObject::supportsProfiling): Added virtual interface that + allows WebCore to specify whether the target global object has the Web + Inspector's profiling feature enabled. + + * profiler/Profiler.cpp: + (JSC::Profiler::willExecute): + (JSC::Profiler::didExecute): + (JSC::Profiler::createCallIdentifier): + * profiler/Profiler.h: Added support for invoking the profiler with + an arbitrary JSValue*, and not a known object. We didn't need this + before because the call instruction would check for a valid call before + involing the profiler. + +2008-10-20 Darin Adler <darin@apple.com> + + Reviewed by Geoff Garen. + + - get CTI working on Windows again + + * VM/CTI.cpp: + (JSC::CTI::emitCTICall): Add an overload for functions that + return JSObject*. + * VM/CTI.h: Use JSValue* and JSObject* as return types for + cti_op functions. Apparently, MSVC doesn't handle returning + the JSValuePtr struct in a register. We'll have to look into + this more. + + * VM/Machine.cpp: + (JSC::Machine::cti_op_convert_this): + (JSC::Machine::cti_op_add): + (JSC::Machine::cti_op_pre_inc): + (JSC::Machine::cti_op_new_object): + (JSC::Machine::cti_op_get_by_id): + (JSC::Machine::cti_op_get_by_id_second): + (JSC::Machine::cti_op_get_by_id_generic): + (JSC::Machine::cti_op_get_by_id_fail): + (JSC::Machine::cti_op_instanceof): + (JSC::Machine::cti_op_del_by_id): + (JSC::Machine::cti_op_mul): + (JSC::Machine::cti_op_new_func): + (JSC::Machine::cti_op_push_activation): + (JSC::Machine::cti_op_call_NotJSFunction): + (JSC::Machine::cti_op_new_array): + (JSC::Machine::cti_op_resolve): + (JSC::Machine::cti_op_construct_JSConstructFast): + (JSC::Machine::cti_op_construct_NotJSConstruct): + (JSC::Machine::cti_op_get_by_val): + (JSC::Machine::cti_op_sub): + (JSC::Machine::cti_op_lesseq): + (JSC::Machine::cti_op_negate): + (JSC::Machine::cti_op_resolve_base): + (JSC::Machine::cti_op_resolve_skip): + (JSC::Machine::cti_op_resolve_global): + (JSC::Machine::cti_op_div): + (JSC::Machine::cti_op_pre_dec): + (JSC::Machine::cti_op_not): + (JSC::Machine::cti_op_eq): + (JSC::Machine::cti_op_lshift): + (JSC::Machine::cti_op_bitand): + (JSC::Machine::cti_op_rshift): + (JSC::Machine::cti_op_bitnot): + (JSC::Machine::cti_op_new_func_exp): + (JSC::Machine::cti_op_mod): + (JSC::Machine::cti_op_less): + (JSC::Machine::cti_op_neq): + (JSC::Machine::cti_op_urshift): + (JSC::Machine::cti_op_bitxor): + (JSC::Machine::cti_op_new_regexp): + (JSC::Machine::cti_op_bitor): + (JSC::Machine::cti_op_call_eval): + (JSC::Machine::cti_op_throw): + (JSC::Machine::cti_op_next_pname): + (JSC::Machine::cti_op_typeof): + (JSC::Machine::cti_op_is_undefined): + (JSC::Machine::cti_op_is_boolean): + (JSC::Machine::cti_op_is_number): + (JSC::Machine::cti_op_is_string): + (JSC::Machine::cti_op_is_object): + (JSC::Machine::cti_op_is_function): + (JSC::Machine::cti_op_stricteq): + (JSC::Machine::cti_op_nstricteq): + (JSC::Machine::cti_op_to_jsnumber): + (JSC::Machine::cti_op_in): + (JSC::Machine::cti_op_push_new_scope): + (JSC::Machine::cti_op_del_by_val): + (JSC::Machine::cti_op_new_error): + (JSC::Machine::cti_vm_throw): + Change these functions to return pointer types, and never + JSValuePtr. + * VM/Machine.h: Ditto. + +2008-10-20 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Darin Adler. + + Fixed some recent break-age in bytecode mode. + + * VM/CodeBlock.cpp: + (JSC::CodeBlock::printStructureIDs): Fixed up an ASSERT caused by + Gavin's last checkin. This is a temporary fix so I can keep on moving. + I'll send email about what I think is an underlying problem soon. + + * VM/Machine.cpp: + (JSC::Machine::privateExecute): Removed a redundant and sometimes + incorrect cast, which started ASSERTing after Darin's last checkin. + +2008-10-20 Darin Adler <darin@apple.com> + + - another similar Windows build fix + + * VM/CTI.cpp: Changed return type to JSObject* instead of JSValuePtr. + +2008-10-20 Darin Adler <darin@apple.com> + + - try to fix Windows build + + * VM/CTI.cpp: Use JSValue* instead of JSValuePtr for ctiTrampoline. + * VM/CTI.h: Ditto. + +2008-10-19 Darin Adler <darin@apple.com> + + Reviewed by Cameron Zwarich. + + - finish https://bugs.webkit.org/show_bug.cgi?id=21732 + improve performance by eliminating JSValue as a base class for JSCell + + * VM/Machine.cpp: + (JSC::Machine::cti_op_call_profiler): Use asFunction. + (JSC::Machine::cti_vm_lazyLinkCall): Ditto. + (JSC::Machine::cti_op_construct_JSConstructFast): Use asObject. + + * kjs/JSCell.h: Re-sort friend classes. Eliminate inheritance from + JSValue. Changed cast in asCell from static_cast to reinterpret_cast. + Removed JSValue::getNumber(double&) and one of JSValue::getObject + overloads. + + * kjs/JSValue.h: Made the private constructor and destructor both + non-virtual and also remove the definitions. This class can never + be instantiated or derived. + +2008-10-19 Darin Adler <darin@apple.com> + + Reviewed by Cameron Zwarich. + + - next step of https://bugs.webkit.org/show_bug.cgi?id=21732 + improve performance by eliminating JSValue as a base class for JSCell + + Change JSValuePtr from a typedef into a class. This allows us to support + conversion from JSCell* to JSValuePtr even if JSCell isn't derived from + JSValue. + + * JavaScriptCore.exp: Updated symbols that involve JSValuePtr, since + it's now a distinct type. + + * API/APICast.h: + (toRef): Extract the JSValuePtr payload explicitly since we can't just + cast any more. + * VM/CTI.cpp: + (JSC::CTI::asInteger): Ditto. + + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::addConstant): Get at the payload directly. + (JSC::CodeGenerator::emitLoad): Added an overload of JSCell* because + otherwise classes derived from JSValue end up calling the bool + overload instead of JSValuePtr. + * VM/CodeGenerator.h: Ditto. Also update traits to use JSValue* + and the payload functions. + + * VM/Register.h: Added a JSCell* overload and use of payload functions. + + * kjs/JSCell.h: + (JSC::asCell): Use payload function. + (JSC::JSValue::asCell): Use JSValue* instead of JSValuePtr. + (JSC::JSValuePtr::JSValuePtr): Added. Constructor that takes JSCell* + and creates a JSValuePtr. + + * kjs/JSImmediate.h: Added JSValuePtr class. Also updated makeValue + and makeInt to work with JSValue* and the payload function. + + * kjs/JSValue.h: Added == and != operators for JSValuePtr. Put them + here because eventually all the JSValue functions should go here + except what's needed by JSImmediate. Also fix asValue to use + JSValue* instead of JSValuePtr. + + * kjs/PropertySlot.h: Change constructor to take JSValuePtr. + + * kjs/protect.h: Update gcProtect functions to work with JSCell* + as well as JSValuePtr. Also updated the ProtectedPtr<JSValuePtr> + specialization to work more directly. Also changed all the call + sites to use gcProtectNullTolerant. + +2008-10-19 Darin Adler <darin@apple.com> + + Reviewed by Oliver Hunt. + + - next step of https://bugs.webkit.org/show_bug.cgi?id=21732 + improve performance by eliminating JSValue as a base class for JSCell + + Remove most uses of JSValue, which will be removed in a future patch. + + * VM/Machine.cpp: + (JSC::fastToUInt32): Call toUInt32SlowCase function; no longer a member + of JSValue. + * kjs/JSNumberCell.h: + (JSC::JSNumberCell::toInt32): Ditto. + (JSC::JSNumberCell::toUInt32): Ditto. + + * kjs/JSValue.cpp: + (JSC::toInt32SlowCase): Made a non-member function. + (JSC::JSValue::toInt32SlowCase): Changed to call non-member function. + (JSC::toUInt32SlowCase): More of the same. + (JSC::JSValue::toUInt32SlowCase): Ditto. + + * kjs/JSValue.h: Moved static member function so they are no longer + member functions at all. + + * VM/CTI.h: Removed forward declaration of JSValue. + * VM/ExceptionHelpers.h: Ditto. + * kjs/CallData.h: Ditto. + * kjs/ConstructData.h: Ditto. + * kjs/JSGlobalObjectFunctions.h: Ditto. + * kjs/PropertyMap.h: Ditto. + * kjs/StructureID.h: Ditto. + * kjs/collector.h: Ditto. + * kjs/completion.h: Ditto. + + * kjs/grammar.y: + (JSC::makeBitwiseNotNode): Call new non-member toInt32 function. + (JSC::makeLeftShiftNode): More of the same. + (JSC::makeRightShiftNode): Ditto. + + * kjs/protect.h: Added a specialization for ProtectedPtr<JSValuePtr> + so this can be used with JSValuePtr. + +2008-10-18 Darin Adler <darin@apple.com> + + Reviewed by Oliver Hunt. + + - next step of https://bugs.webkit.org/show_bug.cgi?id=21732 + improve performance by eliminating JSValue as a base class for JSCell + + Tweak a little more to get closer to where we can make JSValuePtr a class. + + * API/APICast.h: + (toJS): Change back to JSValue* here, since we're converting the + pointer type. + * VM/CTI.cpp: + (JSC::CTI::unlinkCall): Call asPointer. + * VM/CTI.h: Cast to JSValue* here, since it's a pointer cast. + * kjs/DebuggerCallFrame.h: + (JSC::DebuggerCallFrame::DebuggerCallFrame): Call noValue. + * kjs/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): Call noValue. + * kjs/JSImmediate.cpp: + (JSC::JSImmediate::toObject): Remove unneeded const_cast. + * kjs/JSWrapperObject.h: + (JSC::JSWrapperObject::JSWrapperObject): Call noValue. + +2008-10-18 Darin Adler <darin@apple.com> + + - fix non-all-in-one build + + * kjs/completion.h: + (JSC::Completion::Completion): Add include of JSValue.h. + +2008-10-18 Darin Adler <darin@apple.com> + + Reviewed by Oliver Hunt. + + - fix assertions I introduced with my casting changes + + These were showing up as failures in the JavaScriptCore tests. + + * VM/Machine.cpp: + (JSC::Machine::cti_op_instanceof): Remove the bogus asCell casting that + was at the top of the function, and instead cast at the point of use. + (JSC::Machine::cti_op_construct_NotJSConstruct): Moved the cast to + object after checking the construct type. + +2008-10-18 Darin Adler <darin@apple.com> + + - fix non-all-in-one build + + * kjs/JSGlobalObjectFunctions.h: Add include of JSImmedate.h (for now). + +2008-10-18 Darin Adler <darin@apple.com> + + - fix build + + * kjs/interpreter.h: Include JSValue.h instead of JSImmediate.h. + +2008-10-18 Darin Adler <darin@apple.com> + + * kjs/interpreter.h: Fix include of JSImmediate.h. + +2008-10-18 Darin Adler <darin@apple.com> + + - fix non-all-in-one build + + * kjs/interpreter.h: Add include of JSImmediate.h. + +2008-10-18 Darin Adler <darin@apple.com> + + - fix non-all-in-one build + + * kjs/ConstructData.h: Add include of JSImmedate.h (for now). + +2008-10-18 Darin Adler <darin@apple.com> + + - try to fix Windows build + + * VM/Machine.cpp: + (JSC::Machine::Machine): Use JSCell* type since MSVC seems to only allow + calling ~JSCell directly if it's a JSCell*. + +2008-10-18 Darin Adler <darin@apple.com> + + Reviewed by Cameron Zwarich. + + - next step on https://bugs.webkit.org/show_bug.cgi?id=21732 + improve performance by eliminating JSValue as a base class for JSCell + + Use JSValuePtr everywhere instead of JSValue*. In the future, we'll be + changing JSValuePtr to be a class, and then eventually renaming it + to JSValue once that's done. + + * JavaScriptCore.exp: Update entry points, since some now take JSValue* + instead of const JSValue*. + + * API/APICast.h: + * API/JSCallbackConstructor.h: + * API/JSCallbackFunction.cpp: + * API/JSCallbackFunction.h: + * API/JSCallbackObject.h: + * API/JSCallbackObjectFunctions.h: + * API/JSContextRef.cpp: + * API/JSObjectRef.cpp: + * API/JSValueRef.cpp: + * VM/CTI.cpp: + * VM/CTI.h: + * VM/CodeBlock.cpp: + * VM/CodeBlock.h: + * VM/CodeGenerator.cpp: + * VM/CodeGenerator.h: + * VM/ExceptionHelpers.cpp: + * VM/ExceptionHelpers.h: + * VM/JSPropertyNameIterator.cpp: + * VM/JSPropertyNameIterator.h: + * VM/Machine.cpp: + * VM/Machine.h: + * VM/Register.h: + * kjs/ArgList.cpp: + * kjs/ArgList.h: + * kjs/Arguments.cpp: + * kjs/Arguments.h: + * kjs/ArrayConstructor.cpp: + * kjs/ArrayPrototype.cpp: + * kjs/BooleanConstructor.cpp: + * kjs/BooleanConstructor.h: + * kjs/BooleanObject.h: + * kjs/BooleanPrototype.cpp: + * kjs/CallData.cpp: + * kjs/CallData.h: + * kjs/ConstructData.cpp: + * kjs/ConstructData.h: + * kjs/DateConstructor.cpp: + * kjs/DateInstance.h: + * kjs/DatePrototype.cpp: + * kjs/DebuggerCallFrame.cpp: + * kjs/DebuggerCallFrame.h: + * kjs/ErrorConstructor.cpp: + * kjs/ErrorPrototype.cpp: + * kjs/ExecState.cpp: + * kjs/ExecState.h: + * kjs/FunctionConstructor.cpp: + * kjs/FunctionPrototype.cpp: + * kjs/GetterSetter.cpp: + * kjs/GetterSetter.h: + * kjs/InternalFunction.h: + * kjs/JSActivation.cpp: + * kjs/JSActivation.h: + * kjs/JSArray.cpp: + * kjs/JSArray.h: + * kjs/JSCell.cpp: + * kjs/JSCell.h: + * kjs/JSFunction.cpp: + * kjs/JSFunction.h: + * kjs/JSGlobalData.h: + * kjs/JSGlobalObject.cpp: + * kjs/JSGlobalObject.h: + * kjs/JSGlobalObjectFunctions.cpp: + * kjs/JSGlobalObjectFunctions.h: + * kjs/JSImmediate.cpp: + * kjs/JSImmediate.h: + * kjs/JSNotAnObject.cpp: + * kjs/JSNotAnObject.h: + * kjs/JSNumberCell.cpp: + * kjs/JSNumberCell.h: + * kjs/JSObject.cpp: + * kjs/JSObject.h: + * kjs/JSStaticScopeObject.cpp: + * kjs/JSStaticScopeObject.h: + * kjs/JSString.cpp: + * kjs/JSString.h: + * kjs/JSValue.h: + * kjs/JSVariableObject.h: + * kjs/JSWrapperObject.h: + * kjs/MathObject.cpp: + * kjs/NativeErrorConstructor.cpp: + * kjs/NumberConstructor.cpp: + * kjs/NumberConstructor.h: + * kjs/NumberObject.cpp: + * kjs/NumberObject.h: + * kjs/NumberPrototype.cpp: + * kjs/ObjectConstructor.cpp: + * kjs/ObjectPrototype.cpp: + * kjs/ObjectPrototype.h: + * kjs/PropertyMap.h: + * kjs/PropertySlot.cpp: + * kjs/PropertySlot.h: + * kjs/RegExpConstructor.cpp: + * kjs/RegExpConstructor.h: + * kjs/RegExpMatchesArray.h: + * kjs/RegExpObject.cpp: + * kjs/RegExpObject.h: + * kjs/RegExpPrototype.cpp: + * kjs/Shell.cpp: + * kjs/StringConstructor.cpp: + * kjs/StringObject.cpp: + * kjs/StringObject.h: + * kjs/StringObjectThatMasqueradesAsUndefined.h: + * kjs/StringPrototype.cpp: + * kjs/StructureID.cpp: + * kjs/StructureID.h: + * kjs/collector.cpp: + * kjs/collector.h: + * kjs/completion.h: + * kjs/grammar.y: + * kjs/interpreter.cpp: + * kjs/interpreter.h: + * kjs/lookup.cpp: + * kjs/lookup.h: + * kjs/nodes.h: + * kjs/operations.cpp: + * kjs/operations.h: + * kjs/protect.h: + * profiler/ProfileGenerator.cpp: + Replace JSValue* with JSValuePtr. + +2008-10-18 Darin Adler <darin@apple.com> + + * VM/Machine.cpp: + (JSC::Machine::cti_op_call_eval): Removed stray parentheses from my + last check-in. + +2008-10-18 Darin Adler <darin@apple.com> + + Reviewed by Oliver Hunt. + + - first step of https://bugs.webkit.org/show_bug.cgi?id=21732 + improve performance by eliminating JSValue as a base class for JSCell + + Remove casts from JSValue* to derived classes, replacing them with + calls to inline casting functions. These functions are also a bit + better than aidrect cast because they also do a runtime assertion. + + Removed use of 0 as for JSValue*, changing call sites to use a + noValue() function instead. + + Move things needed by classes derived from JSValue out of the class, + since the classes won't be deriving from JSValue any more soon. + + I did most of these changes by changing JSValue to not be JSValue* any + more, then fixing a lot of the compilation problems, then rolling out + the JSValue change. + + 1.011x as fast on SunSpider (presumably due to some of the Machine.cpp changes) + + * API/APICast.h: Removed unneeded forward declarations. + + * API/JSCallbackObject.h: Added an asCallbackObject function for casting. + * API/JSCallbackObjectFunctions.h: + (JSC::JSCallbackObject::asCallbackObject): Added. + (JSC::JSCallbackObject::getOwnPropertySlot): Use asObject. + (JSC::JSCallbackObject::call): Use noValue. + (JSC::JSCallbackObject::staticValueGetter): Use asCallbackObject. + (JSC::JSCallbackObject::staticFunctionGetter): Ditto. + (JSC::JSCallbackObject::callbackGetter): Ditto. + + * JavaScriptCore.exp: Updated. + + * JavaScriptCore.xcodeproj/project.pbxproj: Added RegExpMatchesArray.h. + + * VM/CTI.cpp: + (JSC::CTI::asInteger): Added. For use casting a JSValue to an integer. + (JSC::CTI::emitGetArg): Use asInteger. + (JSC::CTI::emitGetPutArg): Ditto. + (JSC::CTI::getConstantImmediateNumericArg): Ditto. Also use noValue. + (JSC::CTI::emitInitRegister): Use asInteger. + (JSC::CTI::getDeTaggedConstantImmediate): Ditto. + (JSC::CTI::compileOpCallInitializeCallFrame): Ditto. + (JSC::CTI::compileOpCall): Ditto. + (JSC::CTI::compileOpStrictEq): Ditto. + (JSC::CTI::privateCompileMainPass): Ditto. + (JSC::CTI::privateCompileGetByIdProto): Ditto. + (JSC::CTI::privateCompileGetByIdChain): Ditto. + (JSC::CTI::privateCompilePutByIdTransition): Ditto. + * VM/CTI.h: Rewrite the ARG-related macros to use C++ casts instead of + C casts and get rid of some extra parentheses. Addd declaration of + asInteger. + + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::emitEqualityOp): Use asString. + (JSC::CodeGenerator::emitLoad): Use noValue. + (JSC::CodeGenerator::findScopedProperty): Change globalObject argument + to JSObject* instead of JSValue*. + (JSC::CodeGenerator::emitResolve): Remove unneeded cast. + (JSC::CodeGenerator::emitGetScopedVar): Use asCell. + (JSC::CodeGenerator::emitPutScopedVar): Ditto. + * VM/CodeGenerator.h: Changed out argument of findScopedProperty. + Also change the JSValueMap to use PtrHash explicitly instead of + getting it from DefaultHash. + + * VM/JSPropertyNameIterator.cpp: + (JSC::JSPropertyNameIterator::toPrimitive): Use noValue. + * VM/JSPropertyNameIterator.h: + (JSC::JSPropertyNameIterator::next): Ditto. + + * VM/Machine.cpp: + (JSC::fastIsNumber): Moved isImmediate check here instead of + checking for 0 inside Heap::isNumber. Use asCell and asNumberCell. + (JSC::fastToInt32): Ditto. + (JSC::fastToUInt32): Ditto. + (JSC::jsLess): Use asString. + (JSC::jsLessEq): Ditto. + (JSC::jsAdd): Ditto. + (JSC::jsTypeStringForValue): Use asObject. + (JSC::jsIsObjectType): Ditto. + (JSC::jsIsFunctionType): Ditto. + (JSC::inlineResolveBase): Use noValue. + (JSC::Machine::callEval): Use asString. Initialize result to + undefined, not 0. + (JSC::Machine::Machine): Remove unneeded casts to JSCell*. + (JSC::Machine::throwException): Use asObject. + (JSC::Machine::debug): Remove explicit calls to the DebuggerCallFrame + constructor. + (JSC::Machine::checkTimeout): Use noValue. + (JSC::cachePrototypeChain): Use asObject. + (JSC::Machine::tryCachePutByID): Use asCell. + (JSC::Machine::tryCacheGetByID): Use aCell and asObject. + (JSC::Machine::privateExecute): Use noValue, asCell, asObject, asString, + asArray, asActivation, asFunction. Changed code that creates call frames + for host functions to pass 0 for the function pointer -- the call frame + needs a JSFunction* and a host function object is not one. This was + caught by the assertions in the casting functions. Also remove some + unneeded casts in cases where two values are compared. + (JSC::Machine::retrieveLastCaller): Use noValue. + (JSC::Machine::tryCTICachePutByID): Use asCell. + (JSC::Machine::tryCTICacheGetByID): Use aCell and asObject. + (JSC::setUpThrowTrampolineReturnAddress): Added this function to restore + the PIC-branch-avoidance that was recently lost. + (JSC::Machine::cti_op_add): Use asString. + (JSC::Machine::cti_op_instanceof): Use asCell and asObject. + (JSC::Machine::cti_op_call_JSFunction): Use asFunction. + (JSC::Machine::cti_op_call_NotJSFunction): Changed code to pass 0 for + the function pointer, since we don't have a JSFunction. Use asObject. + (JSC::Machine::cti_op_tear_off_activation): Use asActivation. + (JSC::Machine::cti_op_construct_JSConstruct): Use asFunction and asObject. + (JSC::Machine::cti_op_construct_NotJSConstruct): use asObject. + (JSC::Machine::cti_op_get_by_val): Use asArray and asString. + (JSC::Machine::cti_op_resolve_func): Use asPointer; this helps prepare + us for a situation where JSValue is not a pointer. + (JSC::Machine::cti_op_put_by_val): Use asArray. + (JSC::Machine::cti_op_put_by_val_array): Ditto. + (JSC::Machine::cti_op_resolve_global): Use asGlobalObject. + (JSC::Machine::cti_op_post_inc): Change VM_CHECK_EXCEPTION_2 to + VM_CHECK_EXCEPTION_AT_END, since there's no observable work done after + that point. Also use asPointer. + (JSC::Machine::cti_op_resolve_with_base): Use asPointer. + (JSC::Machine::cti_op_post_dec): Change VM_CHECK_EXCEPTION_2 to + VM_CHECK_EXCEPTION_AT_END, since there's no observable work done after + that point. Also use asPointer. + (JSC::Machine::cti_op_call_eval): Use asObject, noValue, and change + VM_CHECK_EXCEPTION_ARG to VM_THROW_EXCEPTION_AT_END. + (JSC::Machine::cti_op_throw): Change return value to a JSValue*. + (JSC::Machine::cti_op_in): Use asObject. + (JSC::Machine::cti_op_switch_char): Use asString. + (JSC::Machine::cti_op_switch_string): Ditto. + (JSC::Machine::cti_op_put_getter): Use asObject. + (JSC::Machine::cti_op_put_setter): Ditto. + (JSC::Machine::cti_vm_throw): Change return value to a JSValue*. + Use noValue. + * VM/Machine.h: Change return values of both cti_op_throw and + cti_vm_throw to JSValue*. + + * VM/Register.h: Remove nullJSValue, which is the same thing + as noValue(). Also removed unneeded definition of JSValue. + + * kjs/ArgList.h: Removed unneeded definition of JSValue. + + * kjs/Arguments.h: + (JSC::asArguments): Added. + + * kjs/ArrayPrototype.cpp: + (JSC::getProperty): Use noValue. + (JSC::arrayProtoFuncToString): Use asArray. + (JSC::arrayProtoFuncToLocaleString): Ditto. + (JSC::arrayProtoFuncConcat): Ditto. + (JSC::arrayProtoFuncPop): Ditto. Also removed unneeded initialization + of the result, which is set in both sides of the branch. + (JSC::arrayProtoFuncPush): Ditto. + (JSC::arrayProtoFuncShift): Removed unneeded initialization + of the result, which is set in both sides of the branch. + (JSC::arrayProtoFuncSort): Use asArray. + + * kjs/BooleanObject.h: + (JSC::asBooleanObject): Added. + + * kjs/BooleanPrototype.cpp: + (JSC::booleanProtoFuncToString): Use asBooleanObject. + (JSC::booleanProtoFuncValueOf): Ditto. + + * kjs/CallData.cpp: + (JSC::call): Use asObject and asFunction. + * kjs/ConstructData.cpp: + (JSC::construct): Ditto. + + * kjs/DateConstructor.cpp: + (JSC::constructDate): Use asDateInstance. + + * kjs/DateInstance.h: + (JSC::asDateInstance): Added. + + * kjs/DatePrototype.cpp: + (JSC::dateProtoFuncToString): Use asDateInstance. + (JSC::dateProtoFuncToUTCString): Ditto. + (JSC::dateProtoFuncToDateString): Ditto. + (JSC::dateProtoFuncToTimeString): Ditto. + (JSC::dateProtoFuncToLocaleString): Ditto. + (JSC::dateProtoFuncToLocaleDateString): Ditto. + (JSC::dateProtoFuncToLocaleTimeString): Ditto. + (JSC::dateProtoFuncValueOf): Ditto. + (JSC::dateProtoFuncGetTime): Ditto. + (JSC::dateProtoFuncGetFullYear): Ditto. + (JSC::dateProtoFuncGetUTCFullYear): Ditto. + (JSC::dateProtoFuncToGMTString): Ditto. + (JSC::dateProtoFuncGetMonth): Ditto. + (JSC::dateProtoFuncGetUTCMonth): Ditto. + (JSC::dateProtoFuncGetDate): Ditto. + (JSC::dateProtoFuncGetUTCDate): Ditto. + (JSC::dateProtoFuncGetDay): Ditto. + (JSC::dateProtoFuncGetUTCDay): Ditto. + (JSC::dateProtoFuncGetHours): Ditto. + (JSC::dateProtoFuncGetUTCHours): Ditto. + (JSC::dateProtoFuncGetMinutes): Ditto. + (JSC::dateProtoFuncGetUTCMinutes): Ditto. + (JSC::dateProtoFuncGetSeconds): Ditto. + (JSC::dateProtoFuncGetUTCSeconds): Ditto. + (JSC::dateProtoFuncGetMilliSeconds): Ditto. + (JSC::dateProtoFuncGetUTCMilliseconds): Ditto. + (JSC::dateProtoFuncGetTimezoneOffset): Ditto. + (JSC::dateProtoFuncSetTime): Ditto. + (JSC::setNewValueFromTimeArgs): Ditto. + (JSC::setNewValueFromDateArgs): Ditto. + (JSC::dateProtoFuncSetYear): Ditto. + (JSC::dateProtoFuncGetYear): Ditto. + + * kjs/DebuggerCallFrame.cpp: + (JSC::DebuggerCallFrame::thisObject): Use asObject. + (JSC::DebuggerCallFrame::evaluate): Use noValue. + * kjs/DebuggerCallFrame.h: Added a constructor that + takes only a callFrame. + + * kjs/ExecState.h: + (JSC::ExecState::clearException): Use noValue. + + * kjs/FunctionPrototype.cpp: + (JSC::functionProtoFuncToString): Use asFunction. + (JSC::functionProtoFuncApply): Use asArguments and asArray. + + * kjs/GetterSetter.cpp: + (JSC::GetterSetter::getPrimitiveNumber): Use noValue. + + * kjs/GetterSetter.h: + (JSC::asGetterSetter): Added. + + * kjs/InternalFunction.cpp: + (JSC::InternalFunction::name): Use asString. + + * kjs/InternalFunction.h: + (JSC::asInternalFunction): Added. + + * kjs/JSActivation.cpp: + (JSC::JSActivation::argumentsGetter): Use asActivation. + + * kjs/JSActivation.h: + (JSC::asActivation): Added. + + * kjs/JSArray.cpp: + (JSC::JSArray::putSlowCase): Use noValue. + (JSC::JSArray::deleteProperty): Ditto. + (JSC::JSArray::increaseVectorLength): Ditto. + (JSC::JSArray::setLength): Ditto. + (JSC::JSArray::pop): Ditto. + (JSC::JSArray::sort): Ditto. + (JSC::JSArray::compactForSorting): Ditto. + * kjs/JSArray.h: + (JSC::asArray): Added. + + * kjs/JSCell.cpp: + (JSC::JSCell::getJSNumber): Use noValue. + + * kjs/JSCell.h: + (JSC::asCell): Added. + (JSC::JSValue::asCell): Changed to not preserve const. + Given the wide use of JSValue* and JSCell*, it's not + really useful to use const. + (JSC::JSValue::isNumber): Use asValue. + (JSC::JSValue::isString): Ditto. + (JSC::JSValue::isGetterSetter): Ditto. + (JSC::JSValue::isObject): Ditto. + (JSC::JSValue::getNumber): Ditto. + (JSC::JSValue::getString): Ditto. + (JSC::JSValue::getObject): Ditto. + (JSC::JSValue::getCallData): Ditto. + (JSC::JSValue::getConstructData): Ditto. + (JSC::JSValue::getUInt32): Ditto. + (JSC::JSValue::getTruncatedInt32): Ditto. + (JSC::JSValue::getTruncatedUInt32): Ditto. + (JSC::JSValue::mark): Ditto. + (JSC::JSValue::marked): Ditto. + (JSC::JSValue::toPrimitive): Ditto. + (JSC::JSValue::getPrimitiveNumber): Ditto. + (JSC::JSValue::toBoolean): Ditto. + (JSC::JSValue::toNumber): Ditto. + (JSC::JSValue::toString): Ditto. + (JSC::JSValue::toObject): Ditto. + (JSC::JSValue::toThisObject): Ditto. + (JSC::JSValue::needsThisConversion): Ditto. + (JSC::JSValue::toThisString): Ditto. + (JSC::JSValue::getJSNumber): Ditto. + + * kjs/JSFunction.cpp: + (JSC::JSFunction::argumentsGetter): Use asFunction. + (JSC::JSFunction::callerGetter): Ditto. + (JSC::JSFunction::lengthGetter): Ditto. + (JSC::JSFunction::construct): Use asObject. + + * kjs/JSFunction.h: + (JSC::asFunction): Added. + + * kjs/JSGlobalObject.cpp: + (JSC::lastInPrototypeChain): Use asObject. + + * kjs/JSGlobalObject.h: + (JSC::asGlobalObject): Added. + (JSC::ScopeChainNode::globalObject): Use asGlobalObject. + + * kjs/JSImmediate.h: Added noValue, asPointer, and makeValue + functions. Use rawValue, makeValue, and noValue consistently + instead of doing reinterpret_cast in various functions. + + * kjs/JSNumberCell.h: + (JSC::asNumberCell): Added. + (JSC::JSValue::uncheckedGetNumber): Use asValue and asNumberCell. + (JSC::JSValue::toJSNumber): Use asValue. + + * kjs/JSObject.cpp: + (JSC::JSObject::put): Use asObject and asGetterSetter. + (JSC::callDefaultValueFunction): Use noValue. + (JSC::JSObject::defineGetter): Use asGetterSetter. + (JSC::JSObject::defineSetter): Ditto. + (JSC::JSObject::lookupGetter): Ditto. Also use asObject. + (JSC::JSObject::lookupSetter): Ditto. + (JSC::JSObject::hasInstance): Use asObject. + (JSC::JSObject::fillGetterPropertySlot): Use asGetterSetter. + + * kjs/JSObject.h: + (JSC::JSObject::getDirect): Use noValue. + (JSC::asObject): Added. + (JSC::JSValue::isObject): Use asValue. + (JSC::JSObject::get): Removed unneeded const_cast. + (JSC::JSObject::getPropertySlot): Use asObject. + (JSC::JSValue::get): Removed unneeded const_cast. + Use asValue, asCell, and asObject. + (JSC::JSValue::put): Ditto. + (JSC::JSObject::allocatePropertyStorageInline): Fixed spelling + of "oldPropertStorage". + + * kjs/JSString.cpp: + (JSC::JSString::getOwnPropertySlot): Use asObject. + + * kjs/JSString.h: + (JSC::asString): Added. + (JSC::JSValue::toThisJSString): Use asValue. + + * kjs/JSValue.h: Make PreferredPrimitiveType a top level enum + instead of a member of JSValue. Added an asValue function that + returns this. Removed overload of asCell for const. Use asValue + instead of getting right at this. + + * kjs/ObjectPrototype.cpp: + (JSC::objectProtoFuncIsPrototypeOf): Use asObject. + (JSC::objectProtoFuncDefineGetter): Ditto. + (JSC::objectProtoFuncDefineSetter): Ditto. + + * kjs/PropertySlot.h: + (JSC::PropertySlot::PropertySlot): Take a const JSValue* so the + callers don't have to worry about const. + (JSC::PropertySlot::clearBase): Use noValue. + (JSC::PropertySlot::clearValue): Ditto. + + * kjs/RegExpConstructor.cpp: + (JSC::regExpConstructorDollar1): Use asRegExpConstructor. + (JSC::regExpConstructorDollar2): Ditto. + (JSC::regExpConstructorDollar3): Ditto. + (JSC::regExpConstructorDollar4): Ditto. + (JSC::regExpConstructorDollar5): Ditto. + (JSC::regExpConstructorDollar6): Ditto. + (JSC::regExpConstructorDollar7): Ditto. + (JSC::regExpConstructorDollar8): Ditto. + (JSC::regExpConstructorDollar9): Ditto. + (JSC::regExpConstructorInput): Ditto. + (JSC::regExpConstructorMultiline): Ditto. + (JSC::regExpConstructorLastMatch): Ditto. + (JSC::regExpConstructorLastParen): Ditto. + (JSC::regExpConstructorLeftContext): Ditto. + (JSC::regExpConstructorRightContext): Ditto. + (JSC::setRegExpConstructorInput): Ditto. + (JSC::setRegExpConstructorMultiline): Ditto. + (JSC::constructRegExp): Use asObject. + + * kjs/RegExpConstructor.h: + (JSC::asRegExpConstructor): Added. + + * kjs/RegExpObject.cpp: + (JSC::regExpObjectGlobal): Use asRegExpObject. + (JSC::regExpObjectIgnoreCase): Ditto. + (JSC::regExpObjectMultiline): Ditto. + (JSC::regExpObjectSource): Ditto. + (JSC::regExpObjectLastIndex): Ditto. + (JSC::setRegExpObjectLastIndex): Ditto. + (JSC::callRegExpObject): Ditto. + + * kjs/RegExpObject.h: + (JSC::asRegExpObject): Added. + + * kjs/RegExpPrototype.cpp: + (JSC::regExpProtoFuncTest): Use asRegExpObject. + (JSC::regExpProtoFuncExec): Ditto. + (JSC::regExpProtoFuncCompile): Ditto. + (JSC::regExpProtoFuncToString): Ditto. + + * kjs/StringObject.h: + (JSC::StringObject::internalValue): Use asString. + (JSC::asStringObject): Added. + + * kjs/StringPrototype.cpp: + (JSC::stringProtoFuncReplace): Use asRegExpObject. + (JSC::stringProtoFuncToString): Ue asStringObject. + (JSC::stringProtoFuncMatch): Use asRegExpObject. + (JSC::stringProtoFuncSearch): Ditto. + (JSC::stringProtoFuncSplit): Ditto. + + * kjs/StructureID.cpp: + (JSC::StructureID::getEnumerablePropertyNames): Use asObject. + (JSC::StructureID::createCachedPrototypeChain): Ditto. + (JSC::StructureIDChain::StructureIDChain): Use asCell and asObject. + + * kjs/collector.h: + (JSC::Heap::isNumber): Removed null handling. This can only be called + on valid cells. + (JSC::Heap::cellBlock): Removed overload for const and non-const. + Whether the JSCell* is const or not really should have no effect on + whether you can modify the collector block it's in. + + * kjs/interpreter.cpp: + (JSC::Interpreter::evaluate): Use noValue and noObject. + + * kjs/nodes.cpp: + (JSC::FunctionCallResolveNode::emitCode): Use JSObject for the global + object rather than JSValue. + (JSC::PostfixResolveNode::emitCode): Ditto. + (JSC::PrefixResolveNode::emitCode): Ditto. + (JSC::ReadModifyResolveNode::emitCode): Ditto. + (JSC::AssignResolveNode::emitCode): Ditto. + + * kjs/operations.h: + (JSC::equalSlowCaseInline): Use asString, asCell, asNumberCell, + (JSC::strictEqualSlowCaseInline): Ditto. + +2008-10-18 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Oliver Hunt. + + Bug 21702: Special op_create_activation for the case where there are no named parameters + <https://bugs.webkit.org/show_bug.cgi?id=21702> + + This is a 2.5% speedup on the V8 Raytrace benchmark and a 1.1% speedup + on the V8 Earley-Boyer benchmark. + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): + * VM/Machine.cpp: + (JSC::Machine::cti_op_create_arguments_no_params): + * VM/Machine.h: + * kjs/Arguments.h: + (JSC::Arguments::): + (JSC::Arguments::Arguments): + +2008-10-17 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Cameron Zwarich. + + - in debug builds, alter the stack to avoid blowing out MallocStackLogging + + (In essence, while executing a CTI function we alter the return + address to jscGeneratedNativeCode so that a single consistent + function is on the stack instead of many random functions without + symbols.) + + * VM/CTI.h: + * VM/Machine.cpp: + (JSC::doSetReturnAddress): + (JSC::): + (JSC::StackHack::StackHack): + (JSC::StackHack::~StackHack): + (JSC::Machine::cti_op_convert_this): + (JSC::Machine::cti_op_end): + (JSC::Machine::cti_op_add): + (JSC::Machine::cti_op_pre_inc): + (JSC::Machine::cti_timeout_check): + (JSC::Machine::cti_register_file_check): + (JSC::Machine::cti_op_loop_if_less): + (JSC::Machine::cti_op_loop_if_lesseq): + (JSC::Machine::cti_op_new_object): + (JSC::Machine::cti_op_put_by_id): + (JSC::Machine::cti_op_put_by_id_second): + (JSC::Machine::cti_op_put_by_id_generic): + (JSC::Machine::cti_op_put_by_id_fail): + (JSC::Machine::cti_op_get_by_id): + (JSC::Machine::cti_op_get_by_id_second): + (JSC::Machine::cti_op_get_by_id_generic): + (JSC::Machine::cti_op_get_by_id_fail): + (JSC::Machine::cti_op_instanceof): + (JSC::Machine::cti_op_del_by_id): + (JSC::Machine::cti_op_mul): + (JSC::Machine::cti_op_new_func): + (JSC::Machine::cti_op_call_profiler): + (JSC::Machine::cti_op_call_JSFunction): + (JSC::Machine::cti_vm_lazyLinkCall): + (JSC::Machine::cti_vm_compile): + (JSC::Machine::cti_op_push_activation): + (JSC::Machine::cti_op_call_NotJSFunction): + (JSC::Machine::cti_op_create_arguments): + (JSC::Machine::cti_op_tear_off_activation): + (JSC::Machine::cti_op_tear_off_arguments): + (JSC::Machine::cti_op_ret_profiler): + (JSC::Machine::cti_op_ret_scopeChain): + (JSC::Machine::cti_op_new_array): + (JSC::Machine::cti_op_resolve): + (JSC::Machine::cti_op_construct_JSConstructFast): + (JSC::Machine::cti_op_construct_JSConstruct): + (JSC::Machine::cti_op_construct_NotJSConstruct): + (JSC::Machine::cti_op_get_by_val): + (JSC::Machine::cti_op_resolve_func): + (JSC::Machine::cti_op_sub): + (JSC::Machine::cti_op_put_by_val): + (JSC::Machine::cti_op_put_by_val_array): + (JSC::Machine::cti_op_lesseq): + (JSC::Machine::cti_op_loop_if_true): + (JSC::Machine::cti_op_negate): + (JSC::Machine::cti_op_resolve_base): + (JSC::Machine::cti_op_resolve_skip): + (JSC::Machine::cti_op_resolve_global): + (JSC::Machine::cti_op_div): + (JSC::Machine::cti_op_pre_dec): + (JSC::Machine::cti_op_jless): + (JSC::Machine::cti_op_not): + (JSC::Machine::cti_op_jtrue): + (JSC::Machine::cti_op_post_inc): + (JSC::Machine::cti_op_eq): + (JSC::Machine::cti_op_lshift): + (JSC::Machine::cti_op_bitand): + (JSC::Machine::cti_op_rshift): + (JSC::Machine::cti_op_bitnot): + (JSC::Machine::cti_op_resolve_with_base): + (JSC::Machine::cti_op_new_func_exp): + (JSC::Machine::cti_op_mod): + (JSC::Machine::cti_op_less): + (JSC::Machine::cti_op_neq): + (JSC::Machine::cti_op_post_dec): + (JSC::Machine::cti_op_urshift): + (JSC::Machine::cti_op_bitxor): + (JSC::Machine::cti_op_new_regexp): + (JSC::Machine::cti_op_bitor): + (JSC::Machine::cti_op_call_eval): + (JSC::Machine::cti_op_throw): + (JSC::Machine::cti_op_get_pnames): + (JSC::Machine::cti_op_next_pname): + (JSC::Machine::cti_op_push_scope): + (JSC::Machine::cti_op_pop_scope): + (JSC::Machine::cti_op_typeof): + (JSC::Machine::cti_op_is_undefined): + (JSC::Machine::cti_op_is_boolean): + (JSC::Machine::cti_op_is_number): + (JSC::Machine::cti_op_is_string): + (JSC::Machine::cti_op_is_object): + (JSC::Machine::cti_op_is_function): + (JSC::Machine::cti_op_stricteq): + (JSC::Machine::cti_op_nstricteq): + (JSC::Machine::cti_op_to_jsnumber): + (JSC::Machine::cti_op_in): + (JSC::Machine::cti_op_push_new_scope): + (JSC::Machine::cti_op_jmp_scopes): + (JSC::Machine::cti_op_put_by_index): + (JSC::Machine::cti_op_switch_imm): + (JSC::Machine::cti_op_switch_char): + (JSC::Machine::cti_op_switch_string): + (JSC::Machine::cti_op_del_by_val): + (JSC::Machine::cti_op_put_getter): + (JSC::Machine::cti_op_put_setter): + (JSC::Machine::cti_op_new_error): + (JSC::Machine::cti_op_debug): + (JSC::Machine::cti_vm_throw): + +2008-10-17 Gavin Barraclough <barraclough@apple.com> + + Optimize op_call by allowing call sites to be directly linked to callees. + + For the hot path of op_call, CTI now generates a check (initially for an impossible + value), and the first time the call is executed we attempt to link the call directly + to the callee. We can currently only do so if the arity of the caller and callee + match. The (optimized) setup for the call on the hot path is linked directly to + the ctiCode for the callee, without indirection. + + Two forms of the slow case of the call are generated, the first will be executed the + first time the call is reached. As well as this path attempting to link the call to + a callee, it also relinks the slow case to a second slow case, which will not continue + to attempt relinking the call. (This policy could be changed in future, but for not + this is intended to prevent thrashing). + + If a callee that the caller has been linked to is garbage collected, then the link + in the caller's JIt code will be reset back to a value that cannot match - to prevent + any false positive matches. + + ~20% progression on deltablue & richards, >12% overall reduction in v8-tests + runtime, one or two percent progression on sunspider. + + Reviewed by Oliver Hunt. + + * VM/CTI.cpp: + (JSC::): + (JSC::CTI::emitNakedCall): + (JSC::unreachable): + (JSC::CTI::compileOpCallInitializeCallFrame): + (JSC::CTI::compileOpCallSetupArgs): + (JSC::CTI::compileOpCall): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + (JSC::CTI::privateCompile): + (JSC::CTI::unlinkCall): + (JSC::CTI::linkCall): + * VM/CTI.h: + * VM/CodeBlock.cpp: + (JSC::CodeBlock::~CodeBlock): + (JSC::CodeBlock::unlinkCallers): + (JSC::CodeBlock::derefStructureIDs): + * VM/CodeBlock.h: + (JSC::StructureStubInfo::StructureStubInfo): + (JSC::CallLinkInfo::CallLinkInfo): + (JSC::CodeBlock::addCaller): + (JSC::CodeBlock::removeCaller): + (JSC::CodeBlock::getStubInfo): + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::emitCall): + (JSC::CodeGenerator::emitConstruct): + * VM/Machine.cpp: + (JSC::Machine::cti_op_call_profiler): + (JSC::Machine::cti_op_call_JSFunction): + (JSC::Machine::cti_vm_lazyLinkCall): + (JSC::Machine::cti_op_construct_JSConstructFast): + (JSC::Machine::cti_op_construct_JSConstruct): + (JSC::Machine::cti_op_construct_NotJSConstruct): + * VM/Machine.h: + * kjs/JSFunction.cpp: + (JSC::JSFunction::~JSFunction): + * kjs/JSFunction.h: + * kjs/nodes.h: + (JSC::FunctionBodyNode::): + * masm/X86Assembler.h: + (JSC::X86Assembler::getDifferenceBetweenLabels): + +2008-10-17 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Geoff Garen. + + - remove ASSERT that makes the leaks buildbot cry + + * kjs/JSFunction.cpp: + (JSC::JSFunction::JSFunction): + +2008-10-17 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Cameron Zwarich + + - don't bother to do arguments tearoff when it will have no effect + + ~1% on v8 raytrace + + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::emitReturn): + +2008-10-17 Marco Barisione <marco.barisione@collabora.co.uk> + + Reviewed by Sam Weinig. Landed by Jan Alonzo. + + https://bugs.webkit.org/show_bug.cgi?id=21603 + [GTK] Minor fixes to GOwnPtr + + * wtf/GOwnPtr.cpp: + (WTF::GError): + (WTF::GList): + (WTF::GCond): + (WTF::GMutex): + (WTF::GPatternSpec): + (WTF::GDir): + * wtf/GOwnPtr.h: + (WTF::freeOwnedGPtr): + (WTF::GOwnPtr::~GOwnPtr): + (WTF::GOwnPtr::outPtr): + (WTF::GOwnPtr::set): + (WTF::GOwnPtr::clear): + * wtf/Threading.h: + +2008-10-17 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Cameron Zwarich. + + - speed up transitions that resize the property storage a fair bit + + ~3% speedup on v8 RayTrace benchmark, ~1% on DeltaBlue + + * VM/CTI.cpp: + (JSC::resizePropertyStorage): renamed from transitionObject, and reduced to just resize + the object's property storage with one inline call. + (JSC::CTI::privateCompilePutByIdTransition): Use a separate function for property storage + resize, but still do all the rest of the work in assembly in that case, and pass the known + compile-time constants of old and new size rather than structureIDs, saving a bunch of + redundant memory access. + * kjs/JSObject.cpp: + (JSC::JSObject::allocatePropertyStorage): Just call the inline version. + * kjs/JSObject.h: + (JSC::JSObject::allocatePropertyStorageInline): Inline version of allocatePropertyStorage + * masm/X86Assembler.h: + (JSC::X86Assembler::): + (JSC::X86Assembler::pushl_i32): Add code to assmeble push of a constant; code originally by Cameron Zwarich. + +2008-10-17 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Maciej Stachowiak. + + Remove some C style casts. + + * masm/X86Assembler.h: + (JSC::JITCodeBuffer::putIntUnchecked): + (JSC::X86Assembler::link): + (JSC::X86Assembler::linkAbsoluteAddress): + (JSC::X86Assembler::getRelocatedAddress): + +2008-10-17 Cameron Zwarich <zwarich@apple.com> + + Rubber-stamped by Maciej Stachowiak. + + Remove some C style casts. + + * VM/CTI.cpp: + (JSC::CTI::patchGetByIdSelf): + (JSC::CTI::patchPutByIdReplace): + * VM/Machine.cpp: + (JSC::Machine::tryCTICachePutByID): + (JSC::Machine::tryCTICacheGetByID): + (JSC::Machine::cti_op_put_by_id): + (JSC::Machine::cti_op_put_by_id_fail): + (JSC::Machine::cti_op_get_by_id): + (JSC::Machine::cti_op_get_by_id_fail): + +2008-10-17 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Cameron Zwarich. + + - Avoid restoring the caller's 'r' value in op_ret + https://bugs.webkit.org/show_bug.cgi?id=21319 + + This patch stops writing the call frame at call and return points; + instead it does so immediately before any CTI call. + + 0.5% speedup or so on the v8 benchmark + + * VM/CTI.cpp: + (JSC::CTI::emitCTICall): + (JSC::CTI::compileOpCall): + (JSC::CTI::emitSlowScriptCheck): + (JSC::CTI::compileBinaryArithOpSlowCase): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + (JSC::CTI::privateCompile): + * VM/CTI.h: + +2008-10-17 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Sam Weinig. + + Make WREC require CTI because it won't actually compile otherwise. + + * wtf/Platform.h: + +2008-10-16 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Geoff Garen. + + - fixed <rdar://problem/5806316> JavaScriptCore should not force building with gcc 4.0 + - use gcc 4.2 when building with Xcode 3.1 or newer on Leopard, even though this is not the default + + This time there is no performance regression; we can avoid having + to use the fastcall calling convention for CTI functions by using + varargs to prevent the compiler from moving things around on the + stack. + + * Configurations/DebugRelease.xcconfig: + * JavaScriptCore.xcodeproj/project.pbxproj: + * VM/CTI.cpp: + * VM/Machine.h: + * wtf/Platform.h: + +2008-10-16 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Oliver Hunt. + + - fix for REGRESSION: r37631 causing crashes on buildbot + https://bugs.webkit.org/show_bug.cgi?id=21682 + + * kjs/collector.cpp: + (JSC::Heap::collect): Avoid crashing when a GC occurs while no global objects are live. + +2008-10-16 Sam Weinig <sam@webkit.org> + + Reviewed by Maciej Stachowiak. + + Fix for https://bugs.webkit.org/show_bug.cgi?id=21683 + Don't create intermediate StructureIDs for builtin objects + + First step in reduce number of StructureIDs created when initializing the + JSGlobalObject. + + - In order to avoid creating the intermediate StructureIDs use the new putDirectWithoutTransition + and putDirectFunctionWithoutTransition to add properties to JSObjects without transitioning + the StructureID. This patch just implements this strategy for ObjectPrototype but alone + reduces the number of StructureIDs create for about:blank by 10, from 142 to 132. + + * kjs/JSGlobalObject.cpp: + (JSC::JSGlobalObject::reset): + * kjs/JSObject.cpp: + (JSC::JSObject::putDirectFunctionWithoutTransition): + * kjs/JSObject.h: + (JSC::JSObject::putDirectWithoutTransition): + * kjs/ObjectPrototype.cpp: + (JSC::ObjectPrototype::ObjectPrototype): + * kjs/ObjectPrototype.h: + * kjs/StructureID.cpp: + (JSC::StructureID::addPropertyWithoutTransition): + * kjs/StructureID.h: + +2008-10-16 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Cameron Zwarich. + + - fix for: REGRESSION: over 100 StructureIDs leak loading about:blank (result of fix for bug 21633) + + Apparent slight progression (< 0.5%) on v8 benchmarks and SunSpider. + + * kjs/StructureID.cpp: + (JSC::StructureID::~StructureID): Don't deref this object's parent's pointer to + itself from the destructor; that doesn't even make sense. + (JSC::StructureID::addPropertyTransition): Don't refer the single transition; + the rule is that parent StructureIDs are ref'd but child ones are not. Refing + the child creates a cycle. + +2008-10-15 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=21609 + Make MessagePorts protect their peers across heaps + + * JavaScriptCore.exp: + * kjs/JSGlobalObject.cpp: + (JSC::JSGlobalObject::markCrossHeapDependentObjects): + * kjs/JSGlobalObject.h: + * kjs/collector.cpp: + (JSC::Heap::collect): + Before GC sweep phase, a function supplied by global object is now called for all global + objects in the heap, making it possible to implement cross-heap dependencies. + +2008-10-15 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=21610 + run-webkit-threads --threaded crashes in StructureID destructor + + * kjs/StructureID.cpp: + (JSC::StructureID::StructureID): + (JSC::StructureID::~StructureID): + Protect access to a static (debug-only) HashSet with a lock. + +2008-10-15 Sam Weinig <sam@webkit.org> + + Reviewed by Goeffrey Garen. + + Add function to dump statistics for StructureIDs. + + * kjs/StructureID.cpp: + (JSC::StructureID::dumpStatistics): + (JSC::StructureID::StructureID): + (JSC::StructureID::~StructureID): + * kjs/StructureID.h: + +2008-10-15 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Maciej Stachowiak. + + Bug 21633: Avoid using a HashMap when there is only a single transition + <https://bugs.webkit.org/show_bug.cgi?id=21633> + + This is a 0.8% speedup on SunSpider and between a 0.5% and 1.0% speedup + on the V8 benchmark suite, depending on which harness we use. It will + also slightly reduce the memory footprint of a StructureID. + + * kjs/StructureID.cpp: + (JSC::StructureID::StructureID): + (JSC::StructureID::~StructureID): + (JSC::StructureID::addPropertyTransition): + * kjs/StructureID.h: + (JSC::StructureID::): + +2008-10-15 Csaba Osztrogonac <oszi@inf.u-szeged.hu> + + Reviewed by Geoffrey Garen. + + 1.40% speedup on SunSpider, 1.44% speedup on V8. (Linux) + + No change on Mac. + + * VM/Machine.cpp: + (JSC::fastIsNumber): ALWAYS_INLINE modifier added. + +2008-10-15 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Cameron Zwarich. + + Fixed https://bugs.webkit.org/show_bug.cgi?id=21345 + Start the debugger without reloading the inspected page + + * JavaScriptCore.exp: New symbols. + * JavaScriptCore.xcodeproj/project.pbxproj: New files. + + * VM/CodeBlock.h: + (JSC::EvalCodeCache::get): Updated for tweak to parsing API. + + * kjs/CollectorHeapIterator.h: Added. An iterator for the object heap, + which we use to find all the live functions and recompile them. + + * kjs/DebuggerCallFrame.cpp: + (JSC::DebuggerCallFrame::evaluate): Updated for tweak to parsing API. + + * kjs/FunctionConstructor.cpp: + (JSC::constructFunction): Updated for tweak to parsing API. + + * kjs/JSFunction.cpp: + (JSC::JSFunction::JSFunction): Try to validate our SourceCode in debug + builds by ASSERTing that it's syntactically valid. This doesn't catch + all SourceCode bugs, but it catches a lot of them. + + * kjs/JSGlobalObjectFunctions.cpp: + (JSC::globalFuncEval): Updated for tweak to parsing API. + + * kjs/Parser.cpp: + (JSC::Parser::parse): + * kjs/Parser.h: + (JSC::Parser::parse): Tweaked the parser to make it possible to parse + without an ExecState, and to allow the client to specify a debugger to + notify (or not) about the source we parse. This allows the inspector + to recompile even though no JavaScript is executing, then notify the + debugger about all source code when it's done. + + * kjs/Shell.cpp: + (prettyPrintScript): Updated for tweak to parsing API. + + * kjs/SourceRange.h: + (JSC::SourceCode::isNull): Added to help with ASSERTs. + + * kjs/collector.cpp: + (JSC::Heap::heapAllocate): + (JSC::Heap::sweep): + (JSC::Heap::primaryHeapBegin): + (JSC::Heap::primaryHeapEnd): + * kjs/collector.h: + (JSC::): Moved a bunch of declarations around to enable compilation of + CollectorHeapIterator. + + * kjs/interpreter.cpp: + (JSC::Interpreter::checkSyntax): + (JSC::Interpreter::evaluate): Updated for tweak to parsing API. + + * kjs/lexer.h: + (JSC::Lexer::sourceCode): BUG FIX: Calculate SourceCode ranges relative + to the SourceCode range in which we're lexing, otherwise nested functions + that are compiled individually get SourceCode ranges that don't reflect + their nesting. + + * kjs/nodes.cpp: + (JSC::FunctionBodyNode::FunctionBodyNode): + (JSC::FunctionBodyNode::finishParsing): + (JSC::FunctionBodyNode::create): + (JSC::FunctionBodyNode::copyParameters): + * kjs/nodes.h: + (JSC::ScopeNode::setSource): + (JSC::FunctionBodyNode::parameterCount): Added some helper functions for + copying one FunctionBodyNode's parameters to another. The recompiler uses + these when calling "finishParsing". + +2008-10-15 Joerg Bornemann <joerg.bornemann@trolltech.com> + + Reviewed by Darin Adler. + + - part of https://bugs.webkit.org/show_bug.cgi?id=20746 + Fix compilation on Windows CE. + + str(n)icmp, strdup and vsnprintf are not available on Windows CE, + they are called _str(n)icmp, etc. instead + + * wtf/StringExtras.h: Added inline function implementations. + +2008-10-15 Gabor Loki <loki@inf.u-szeged.hu> + + Reviewed by Cameron Zwarich. + + <https://bugs.webkit.org/show_bug.cgi?id=20912> + Use simple uint32_t multiplication on op_mul if both operands are + immediate number and they are between zero and 0x7FFF. + + * VM/Machine.cpp: + (JSC::Machine::privateExecute): + +2008-10-09 Darin Fisher <darin@chromium.org> + + Reviewed by Sam Weinig. + + Make pan scrolling a platform configurable option. + https://bugs.webkit.org/show_bug.cgi?id=21515 + + * wtf/Platform.h: Add ENABLE_PAN_SCROLLING + +2008-10-14 Maciej Stachowiak <mjs@apple.com> + + Rubber stamped by Sam Weinig. + + - revert r37572 and r37581 for now + + Turns out GCC 4.2 is still a (small) regression, we'll have to do + more work to turn it on. + + * Configurations/DebugRelease.xcconfig: + * JavaScriptCore.xcodeproj/project.pbxproj: + * VM/CTI.cpp: + * VM/CTI.h: + * VM/Machine.cpp: + (JSC::Machine::cti_op_convert_this): + (JSC::Machine::cti_op_end): + (JSC::Machine::cti_op_add): + (JSC::Machine::cti_op_pre_inc): + (JSC::Machine::cti_timeout_check): + (JSC::Machine::cti_register_file_check): + (JSC::Machine::cti_op_loop_if_less): + (JSC::Machine::cti_op_loop_if_lesseq): + (JSC::Machine::cti_op_new_object): + (JSC::Machine::cti_op_put_by_id): + (JSC::Machine::cti_op_put_by_id_second): + (JSC::Machine::cti_op_put_by_id_generic): + (JSC::Machine::cti_op_put_by_id_fail): + (JSC::Machine::cti_op_get_by_id): + (JSC::Machine::cti_op_get_by_id_second): + (JSC::Machine::cti_op_get_by_id_generic): + (JSC::Machine::cti_op_get_by_id_fail): + (JSC::Machine::cti_op_instanceof): + (JSC::Machine::cti_op_del_by_id): + (JSC::Machine::cti_op_mul): + (JSC::Machine::cti_op_new_func): + (JSC::Machine::cti_op_call_JSFunction): + (JSC::Machine::cti_vm_compile): + (JSC::Machine::cti_op_push_activation): + (JSC::Machine::cti_op_call_NotJSFunction): + (JSC::Machine::cti_op_create_arguments): + (JSC::Machine::cti_op_tear_off_activation): + (JSC::Machine::cti_op_tear_off_arguments): + (JSC::Machine::cti_op_ret_profiler): + (JSC::Machine::cti_op_ret_scopeChain): + (JSC::Machine::cti_op_new_array): + (JSC::Machine::cti_op_resolve): + (JSC::Machine::cti_op_construct_JSConstruct): + (JSC::Machine::cti_op_construct_NotJSConstruct): + (JSC::Machine::cti_op_get_by_val): + (JSC::Machine::cti_op_resolve_func): + (JSC::Machine::cti_op_sub): + (JSC::Machine::cti_op_put_by_val): + (JSC::Machine::cti_op_put_by_val_array): + (JSC::Machine::cti_op_lesseq): + (JSC::Machine::cti_op_loop_if_true): + (JSC::Machine::cti_op_negate): + (JSC::Machine::cti_op_resolve_base): + (JSC::Machine::cti_op_resolve_skip): + (JSC::Machine::cti_op_resolve_global): + (JSC::Machine::cti_op_div): + (JSC::Machine::cti_op_pre_dec): + (JSC::Machine::cti_op_jless): + (JSC::Machine::cti_op_not): + (JSC::Machine::cti_op_jtrue): + (JSC::Machine::cti_op_post_inc): + (JSC::Machine::cti_op_eq): + (JSC::Machine::cti_op_lshift): + (JSC::Machine::cti_op_bitand): + (JSC::Machine::cti_op_rshift): + (JSC::Machine::cti_op_bitnot): + (JSC::Machine::cti_op_resolve_with_base): + (JSC::Machine::cti_op_new_func_exp): + (JSC::Machine::cti_op_mod): + (JSC::Machine::cti_op_less): + (JSC::Machine::cti_op_neq): + (JSC::Machine::cti_op_post_dec): + (JSC::Machine::cti_op_urshift): + (JSC::Machine::cti_op_bitxor): + (JSC::Machine::cti_op_new_regexp): + (JSC::Machine::cti_op_bitor): + (JSC::Machine::cti_op_call_eval): + (JSC::Machine::cti_op_throw): + (JSC::Machine::cti_op_get_pnames): + (JSC::Machine::cti_op_next_pname): + (JSC::Machine::cti_op_push_scope): + (JSC::Machine::cti_op_pop_scope): + (JSC::Machine::cti_op_typeof): + (JSC::Machine::cti_op_is_undefined): + (JSC::Machine::cti_op_is_boolean): + (JSC::Machine::cti_op_is_number): + (JSC::Machine::cti_op_is_string): + (JSC::Machine::cti_op_is_object): + (JSC::Machine::cti_op_is_function): + (JSC::Machine::cti_op_stricteq): + (JSC::Machine::cti_op_nstricteq): + (JSC::Machine::cti_op_to_jsnumber): + (JSC::Machine::cti_op_in): + (JSC::Machine::cti_op_push_new_scope): + (JSC::Machine::cti_op_jmp_scopes): + (JSC::Machine::cti_op_put_by_index): + (JSC::Machine::cti_op_switch_imm): + (JSC::Machine::cti_op_switch_char): + (JSC::Machine::cti_op_switch_string): + (JSC::Machine::cti_op_del_by_val): + (JSC::Machine::cti_op_put_getter): + (JSC::Machine::cti_op_put_setter): + (JSC::Machine::cti_op_new_error): + (JSC::Machine::cti_op_debug): + (JSC::Machine::cti_vm_throw): + * VM/Machine.h: + * masm/X86Assembler.h: + (JSC::X86Assembler::emitRestoreArgumentReference): + (JSC::X86Assembler::emitRestoreArgumentReferenceForTrampoline): + * wtf/Platform.h: + +2008-10-14 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=20256 + Array.push and other standard methods disappear + + * kjs/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + (JSC::JSGlobalData::~JSGlobalData): + Don't use static hash tables even on platforms that don't enable JSC_MULTIPLE_THREADS - + these tables reference IdentifierTable, which is always per-GlobalData. + +2008-10-14 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Cameron Zwarich. + + - always use CTI_ARGUMENTS and CTI_ARGUMENTS_FASTCALL + + This is a small regression for GCC 4.0, but simplifies the code + for future improvements and lets us focus on GCC 4.2+ and MSVC. + + * VM/CTI.cpp: + * VM/CTI.h: + * VM/Machine.cpp: + (JSC::Machine::cti_op_convert_this): + (JSC::Machine::cti_op_end): + (JSC::Machine::cti_op_add): + (JSC::Machine::cti_op_pre_inc): + (JSC::Machine::cti_timeout_check): + (JSC::Machine::cti_register_file_check): + (JSC::Machine::cti_op_loop_if_less): + (JSC::Machine::cti_op_loop_if_lesseq): + (JSC::Machine::cti_op_new_object): + (JSC::Machine::cti_op_put_by_id): + (JSC::Machine::cti_op_put_by_id_second): + (JSC::Machine::cti_op_put_by_id_generic): + (JSC::Machine::cti_op_put_by_id_fail): + (JSC::Machine::cti_op_get_by_id): + (JSC::Machine::cti_op_get_by_id_second): + (JSC::Machine::cti_op_get_by_id_generic): + (JSC::Machine::cti_op_get_by_id_fail): + (JSC::Machine::cti_op_instanceof): + (JSC::Machine::cti_op_del_by_id): + (JSC::Machine::cti_op_mul): + (JSC::Machine::cti_op_new_func): + (JSC::Machine::cti_op_call_JSFunction): + (JSC::Machine::cti_vm_compile): + (JSC::Machine::cti_op_push_activation): + (JSC::Machine::cti_op_call_NotJSFunction): + (JSC::Machine::cti_op_create_arguments): + (JSC::Machine::cti_op_tear_off_activation): + (JSC::Machine::cti_op_tear_off_arguments): + (JSC::Machine::cti_op_ret_profiler): + (JSC::Machine::cti_op_ret_scopeChain): + (JSC::Machine::cti_op_new_array): + (JSC::Machine::cti_op_resolve): + (JSC::Machine::cti_op_construct_JSConstruct): + (JSC::Machine::cti_op_construct_NotJSConstruct): + (JSC::Machine::cti_op_get_by_val): + (JSC::Machine::cti_op_resolve_func): + (JSC::Machine::cti_op_sub): + (JSC::Machine::cti_op_put_by_val): + (JSC::Machine::cti_op_put_by_val_array): + (JSC::Machine::cti_op_lesseq): + (JSC::Machine::cti_op_loop_if_true): + (JSC::Machine::cti_op_negate): + (JSC::Machine::cti_op_resolve_base): + (JSC::Machine::cti_op_resolve_skip): + (JSC::Machine::cti_op_resolve_global): + (JSC::Machine::cti_op_div): + (JSC::Machine::cti_op_pre_dec): + (JSC::Machine::cti_op_jless): + (JSC::Machine::cti_op_not): + (JSC::Machine::cti_op_jtrue): + (JSC::Machine::cti_op_post_inc): + (JSC::Machine::cti_op_eq): + (JSC::Machine::cti_op_lshift): + (JSC::Machine::cti_op_bitand): + (JSC::Machine::cti_op_rshift): + (JSC::Machine::cti_op_bitnot): + (JSC::Machine::cti_op_resolve_with_base): + (JSC::Machine::cti_op_new_func_exp): + (JSC::Machine::cti_op_mod): + (JSC::Machine::cti_op_less): + (JSC::Machine::cti_op_neq): + (JSC::Machine::cti_op_post_dec): + (JSC::Machine::cti_op_urshift): + (JSC::Machine::cti_op_bitxor): + (JSC::Machine::cti_op_new_regexp): + (JSC::Machine::cti_op_bitor): + (JSC::Machine::cti_op_call_eval): + (JSC::Machine::cti_op_throw): + (JSC::Machine::cti_op_get_pnames): + (JSC::Machine::cti_op_next_pname): + (JSC::Machine::cti_op_push_scope): + (JSC::Machine::cti_op_pop_scope): + (JSC::Machine::cti_op_typeof): + (JSC::Machine::cti_op_is_undefined): + (JSC::Machine::cti_op_is_boolean): + (JSC::Machine::cti_op_is_number): + (JSC::Machine::cti_op_is_string): + (JSC::Machine::cti_op_is_object): + (JSC::Machine::cti_op_is_function): + (JSC::Machine::cti_op_stricteq): + (JSC::Machine::cti_op_nstricteq): + (JSC::Machine::cti_op_to_jsnumber): + (JSC::Machine::cti_op_in): + (JSC::Machine::cti_op_push_new_scope): + (JSC::Machine::cti_op_jmp_scopes): + (JSC::Machine::cti_op_put_by_index): + (JSC::Machine::cti_op_switch_imm): + (JSC::Machine::cti_op_switch_char): + (JSC::Machine::cti_op_switch_string): + (JSC::Machine::cti_op_del_by_val): + (JSC::Machine::cti_op_put_getter): + (JSC::Machine::cti_op_put_setter): + (JSC::Machine::cti_op_new_error): + (JSC::Machine::cti_op_debug): + (JSC::Machine::cti_vm_throw): + * VM/Machine.h: + * masm/X86Assembler.h: + (JSC::X86Assembler::emitRestoreArgumentReference): + (JSC::X86Assembler::emitRestoreArgumentReferenceForTrampoline): + * wtf/Platform.h: + +2008-10-13 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Cameron Zwarich. + + - make Machine::getArgumentsData an Arguments method and inline it + + ~2% on v8 raytrace + + * VM/Machine.cpp: + * kjs/Arguments.h: + (JSC::Machine::getArgumentsData): + +2008-10-13 Alp Toker <alp@nuanti.com> + + Fix autotools dist build target by listing recently added header + files only. Not reviewed. + + * GNUmakefile.am: + +2008-10-13 Maciej Stachowiak <mjs@apple.com> + + Rubber stamped by Mark Rowe. + + - fixed <rdar://problem/5806316> JavaScriptCore should not force building with gcc 4.0 + - use gcc 4.2 when building with Xcode 3.1 or newer on Leopard, even though this is not the default + + * Configurations/DebugRelease.xcconfig: + * JavaScriptCore.xcodeproj/project.pbxproj: + +2008-10-13 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Geoff Garen. + + Bug 21541: Move RegisterFile growth check to callee + <https://bugs.webkit.org/show_bug.cgi?id=21541> + + Move the RegisterFile growth check to the callee in the common case, + where some of the information is known statically at JIT time. There is + still a check in the caller in the case where the caller provides too + few arguments. + + This is a 2.1% speedup on the V8 benchmark, including a 5.1% speedup on + the Richards benchmark, a 4.1% speedup on the DeltaBlue benchmark, and a + 1.4% speedup on the Earley-Boyer benchmark. It is also a 0.5% speedup on + SunSpider. + + * VM/CTI.cpp: + (JSC::CTI::privateCompile): + * VM/Machine.cpp: + (JSC::Machine::cti_register_file_check): + (JSC::Machine::cti_op_call_JSFunction): + (JSC::Machine::cti_op_construct_JSConstruct): + * VM/Machine.h: + * VM/RegisterFile.h: + * masm/X86Assembler.h: + (JSC::X86Assembler::): + (JSC::X86Assembler::cmpl_mr): + (JSC::X86Assembler::emitUnlinkedJg): + +2008-10-13 Sam Weinig <sam@webkit.org> + + Reviewed by Dan Bernstein. + + Fix for https://bugs.webkit.org/show_bug.cgi?id=21577 + 5 false positive StructureID leaks + + - Add leak ignore set to StructureID to selectively ignore leaking some StructureIDs. + - Add create method to JSGlolalData to be used when the data will be intentionally + leaked and ignore all leaks caused the StructureIDs stored in it. + + * JavaScriptCore.exp: + * kjs/JSGlobalData.cpp: + (JSC::JSGlobalData::createLeaked): + * kjs/JSGlobalData.h: + * kjs/StructureID.cpp: + (JSC::StructureID::StructureID): + (JSC::StructureID::~StructureID): + (JSC::StructureID::startIgnoringLeaks): + (JSC::StructureID::stopIgnoringLeaks): + * kjs/StructureID.h: + +2008-10-13 Marco Barisione <marco.barisione@collabora.co.uk> + + Reviewed by Darin Adler. Landed by Jan Alonzo. + + WebKit GTK Port needs a smartpointer to handle g_free (GFreePtr?) + http://bugs.webkit.org/show_bug.cgi?id=20483 + + Add a GOwnPtr smart pointer (similar to OwnPtr) to handle memory + allocated by GLib and start the conversion to use it. + + * GNUmakefile.am: + * wtf/GOwnPtr.cpp: Added. + (WTF::GError): + (WTF::GList): + (WTF::GCond): + (WTF::GMutex): + (WTF::GPatternSpec): + (WTF::GDir): + * wtf/GOwnPtr.h: Added. + (WTF::freeOwnedPtr): + (WTF::GOwnPtr::GOwnPtr): + (WTF::GOwnPtr::~GOwnPtr): + (WTF::GOwnPtr::get): + (WTF::GOwnPtr::release): + (WTF::GOwnPtr::rawPtr): + (WTF::GOwnPtr::set): + (WTF::GOwnPtr::clear): + (WTF::GOwnPtr::operator*): + (WTF::GOwnPtr::operator->): + (WTF::GOwnPtr::operator!): + (WTF::GOwnPtr::operator UnspecifiedBoolType): + (WTF::GOwnPtr::swap): + (WTF::swap): + (WTF::operator==): + (WTF::operator!=): + (WTF::getPtr): + * wtf/Threading.h: + * wtf/ThreadingGtk.cpp: + (WTF::Mutex::~Mutex): + (WTF::Mutex::lock): + (WTF::Mutex::tryLock): + (WTF::Mutex::unlock): + (WTF::ThreadCondition::~ThreadCondition): + (WTF::ThreadCondition::wait): + (WTF::ThreadCondition::timedWait): + (WTF::ThreadCondition::signal): + (WTF::ThreadCondition::broadcast): + +2008-10-12 Gabriella Toth <gtoth@inf.u-szeged.hu> + + Reviewed by Darin Adler. + + - part of https://bugs.webkit.org/show_bug.cgi?id=21055 + Bug 21055: not invoked functions + + * kjs/nodes.cpp: Deleted a function that is not invoked: + statementListInitializeVariableAccessStack. + +2008-10-12 Darin Adler <darin@apple.com> + + Reviewed by Sam Weinig. + + * wtf/unicode/icu/UnicodeIcu.h: Fixed indentation to match WebKit coding style. + * wtf/unicode/qt4/UnicodeQt4.h: Ditto. + +2008-10-12 Darin Adler <darin@apple.com> + + Reviewed by Sam Weinig. + + - https://bugs.webkit.org/show_bug.cgi?id=21556 + Bug 21556: non-ASCII digits are allowed in places where only ASCII should be + + * wtf/unicode/icu/UnicodeIcu.h: Removed isDigit, digitValue, and isFormatChar. + * wtf/unicode/qt4/UnicodeQt4.h: Ditto. + +2008-10-12 Anders Carlsson <andersca@apple.com> + + Reviewed by Darin Adler. + + Make the append method that takes a Vector more strict - it now requires the elements + of the vector to be appended same type as the elements of the Vector they're being appended to. + + This would cause problems when dealing with Vectors containing other Vectors. + + * wtf/Vector.h: + (WTF::::append): + +2008-10-11 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Sam Weinig. + + Clean up RegExpMatchesArray.h to match our coding style. + + * kjs/RegExpMatchesArray.h: + (JSC::RegExpMatchesArray::getOwnPropertySlot): + (JSC::RegExpMatchesArray::put): + (JSC::RegExpMatchesArray::deleteProperty): + (JSC::RegExpMatchesArray::getPropertyNames): + +2008-10-11 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Sam Weinig. + + Bug 21525: 55 StructureID leaks on Wikitravel's main page + <https://bugs.webkit.org/show_bug.cgi?id=21525> + + Bug 21533: Simple JavaScript code leaks StructureIDs + <https://bugs.webkit.org/show_bug.cgi?id=21533> + + StructureID::getEnumerablePropertyNames() ends up calling back to itself + via JSObject::getPropertyNames(), which causes the PropertyNameArray to + be cached twice. This leads to a memory leak in almost every use of + JSObject::getPropertyNames() on an object. The fix here is based on a + suggestion of Sam Weinig. + + This patch also fixes every StructureID leaks that occurs while running + the Mozilla MemBuster test. + + * kjs/PropertyNameArray.h: + (JSC::PropertyNameArray::PropertyNameArray): + (JSC::PropertyNameArray::setCacheable): + (JSC::PropertyNameArray::cacheable): + * kjs/StructureID.cpp: + (JSC::StructureID::getEnumerablePropertyNames): + +2008-10-10 Oliver Hunt <oliver@apple.com> + + Reviewed by Cameron Zwarich. + + Use fastcall calling convention on GCC > 4.0 + + Results in a 2-3% improvement in GCC 4.2 performance, so + that it is no longer a regression vs. GCC 4.0 + + * VM/CTI.cpp: + * VM/Machine.h: + * wtf/Platform.h: + +2008-10-10 Sam Weinig <sam@webkit.org> + + Reviewed by Darin Adler. + + - Add a workaround for a bug in ceil in Darwin libc. + - Remove old workarounds for JS math functions that are not needed + anymore. + + The math functions are heavily tested by fast/js/math.html. + + * kjs/MathObject.cpp: + (JSC::mathProtoFuncAbs): Remove workaround. + (JSC::mathProtoFuncCeil): Ditto. + (JSC::mathProtoFuncFloor): Ditto. + * wtf/MathExtras.h: + (wtf_ceil): Add ceil workaround for darwin. + +2008-10-10 Sam Weinig <sam@webkit.org> + + Reviewed by Darin Adler + + Add Assertions to JSObject constructor. + + * kjs/JSObject.h: + (JSC::JSObject::JSObject): + +2008-10-10 Sam Weinig <sam@webkit.org> + + Reviewed by Cameron Zwarich. + + Remove now unused m_getterSetterFlag variable from PropertyMap. + + * kjs/PropertyMap.cpp: + (JSC::PropertyMap::operator=): + * kjs/PropertyMap.h: + (JSC::PropertyMap::PropertyMap): + +2008-10-09 Sam Weinig <sam@webkit.org> + + Reviewed by Maciej Stachowiak. + + Add leaks checking to StructureID. + + * kjs/StructureID.cpp: + (JSC::StructureID::StructureID): + (JSC::StructureID::~StructureID): + +2008-10-09 Alp Toker <alp@nuanti.com> + + Reviewed by Mark Rowe. + + https://bugs.webkit.org/show_bug.cgi?id=20760 + Implement support for x86 Linux in CTI + + Prepare to enable CTI/WREC on supported architectures. + + Make it possible to use the CTI_ARGUMENT workaround with GCC as well + as MSVC by fixing some preprocessor conditionals. + + Note that CTI/WREC no longer requires CTI_ARGUMENT on Linux so we + don't actually enable it except when building with MSVC. GCC on Win32 + remains untested. + + Adapt inline ASM code to use the global symbol underscore prefix only + on Darwin and to call the properly mangled Machine::cti_vm_throw + symbol name depending on CTI_ARGUMENT. + + Also avoid global inclusion of the JIT infrastructure headers + throughout WebCore and WebKit causing recompilation of about ~1500 + source files after modification to X86Assembler.h, CTI.h, WREC.h, + which are only used deep inside JavaScriptCore. + + * GNUmakefile.am: + * VM/CTI.cpp: + * VM/CTI.h: + * VM/Machine.cpp: + * VM/Machine.h: + * kjs/regexp.cpp: + (JSC::RegExp::RegExp): + (JSC::RegExp::~RegExp): + (JSC::RegExp::match): + * kjs/regexp.h: + * masm/X86Assembler.h: + (JSC::X86Assembler::emitConvertToFastCall): + (JSC::X86Assembler::emitRestoreArgumentReferenceForTrampoline): + (JSC::X86Assembler::emitRestoreArgumentReference): + +2008-10-09 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Cameron Zwarich. + + Fix for bug #21160, x=0;1/(x*-1) == -Infinity + + * ChangeLog: + * VM/CTI.cpp: + (JSC::CTI::emitFastArithDeTagImmediate): + (JSC::CTI::emitFastArithDeTagImmediateJumpIfZero): + (JSC::CTI::compileBinaryArithOp): + (JSC::CTI::compileBinaryArithOpSlowCase): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + * VM/CTI.h: + * masm/X86Assembler.h: + (JSC::X86Assembler::): + (JSC::X86Assembler::emitUnlinkedJs): + +2008-10-09 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Oliver Hunt. + + Bug 21459: REGRESSION (r37324): Safari crashes inside JavaScriptCore while browsing hulu.com + <https://bugs.webkit.org/show_bug.cgi?id=21459> + + After r37324, an Arguments object does not mark an associated activation + object. This change was made because Arguments no longer directly used + the activation object in any way. However, if an activation is torn off, + then the backing store of Arguments becomes the register array of the + activation object. Arguments directly marks all of the arguments, but + the activation object is being collected, which causes its register + array to be freed and new memory to be allocated in its place. + + Unfortunately, it does not seem possible to reproduce this issue in a + layout test. + + * kjs/Arguments.cpp: + (JSC::Arguments::mark): + * kjs/Arguments.h: + (JSC::Arguments::setActivation): + (JSC::Arguments::Arguments): + (JSC::JSActivation::copyRegisters): + +2008-10-09 Ariya Hidayat <ariya.hidayat@trolltech.com> + + Reviewed by Simon. + + Build fix for MinGW. + + * wtf/AlwaysInline.h: + +2008-10-08 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Maciej Stachowiak. + + Bug 21497: REGRESSION (r37433): Bytecode JSC tests are severely broken + <https://bugs.webkit.org/show_bug.cgi?id=21497> + + Fix a typo in r37433 that causes the failure of a large number of JSC + tests with the bytecode interpreter enabled. + + * VM/Machine.cpp: + (JSC::Machine::privateExecute): + +2008-10-08 Mark Rowe <mrowe@apple.com> + + Windows build fix. + + * VM/CTI.cpp: + (JSC::): Update type of argument to ctiTrampoline. + +2008-10-08 Darin Adler <darin@apple.com> + + Reviewed by Cameron Zwarich. + + - https://bugs.webkit.org/show_bug.cgi?id=21403 + Bug 21403: use new CallFrame class rather than Register* for call frame manipulation + + Add CallFrame as a synonym for ExecState. Arguably, some day we should switch every + client over to the new name. + + Use CallFrame* consistently rather than Register* or ExecState* in low-level code such + as Machine.cpp and CTI.cpp. Similarly, use callFrame rather than r as its name and use + accessor functions to get at things in the frame. + + Eliminate other uses of ExecState* that aren't needed, replacing in some cases with + JSGlobalData* and in other cases eliminating them entirely. + + * API/JSObjectRef.cpp: + (JSObjectMakeFunctionWithCallback): + (JSObjectMakeFunction): + (JSObjectHasProperty): + (JSObjectGetProperty): + (JSObjectSetProperty): + (JSObjectDeleteProperty): + * API/OpaqueJSString.cpp: + * API/OpaqueJSString.h: + * VM/CTI.cpp: + (JSC::CTI::getConstant): + (JSC::CTI::emitGetArg): + (JSC::CTI::emitGetPutArg): + (JSC::CTI::getConstantImmediateNumericArg): + (JSC::CTI::printOpcodeOperandTypes): + (JSC::CTI::CTI): + (JSC::CTI::compileOpCall): + (JSC::CTI::compileBinaryArithOp): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompile): + (JSC::CTI::privateCompileGetByIdProto): + (JSC::CTI::privateCompileGetByIdChain): + (JSC::CTI::compileRegExp): + * VM/CTI.h: + * VM/CodeBlock.h: + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::emitEqualityOp): + (JSC::CodeGenerator::emitLoad): + (JSC::CodeGenerator::emitUnexpectedLoad): + (JSC::CodeGenerator::emitConstruct): + * VM/CodeGenerator.h: + * VM/Machine.cpp: + (JSC::jsLess): + (JSC::jsLessEq): + (JSC::jsAddSlowCase): + (JSC::jsAdd): + (JSC::jsTypeStringForValue): + (JSC::Machine::resolve): + (JSC::Machine::resolveSkip): + (JSC::Machine::resolveGlobal): + (JSC::inlineResolveBase): + (JSC::Machine::resolveBase): + (JSC::Machine::resolveBaseAndProperty): + (JSC::Machine::resolveBaseAndFunc): + (JSC::Machine::slideRegisterWindowForCall): + (JSC::isNotObject): + (JSC::Machine::callEval): + (JSC::Machine::dumpCallFrame): + (JSC::Machine::dumpRegisters): + (JSC::Machine::unwindCallFrame): + (JSC::Machine::throwException): + (JSC::DynamicGlobalObjectScope::DynamicGlobalObjectScope): + (JSC::DynamicGlobalObjectScope::~DynamicGlobalObjectScope): + (JSC::Machine::execute): + (JSC::Machine::debug): + (JSC::Machine::createExceptionScope): + (JSC::cachePrototypeChain): + (JSC::Machine::tryCachePutByID): + (JSC::Machine::tryCacheGetByID): + (JSC::Machine::privateExecute): + (JSC::Machine::retrieveArguments): + (JSC::Machine::retrieveCaller): + (JSC::Machine::retrieveLastCaller): + (JSC::Machine::findFunctionCallFrame): + (JSC::Machine::getArgumentsData): + (JSC::Machine::tryCTICachePutByID): + (JSC::Machine::getCTIArrayLengthTrampoline): + (JSC::Machine::getCTIStringLengthTrampoline): + (JSC::Machine::tryCTICacheGetByID): + (JSC::Machine::cti_op_convert_this): + (JSC::Machine::cti_op_end): + (JSC::Machine::cti_op_add): + (JSC::Machine::cti_op_pre_inc): + (JSC::Machine::cti_timeout_check): + (JSC::Machine::cti_op_loop_if_less): + (JSC::Machine::cti_op_loop_if_lesseq): + (JSC::Machine::cti_op_new_object): + (JSC::Machine::cti_op_put_by_id): + (JSC::Machine::cti_op_put_by_id_second): + (JSC::Machine::cti_op_put_by_id_generic): + (JSC::Machine::cti_op_put_by_id_fail): + (JSC::Machine::cti_op_get_by_id): + (JSC::Machine::cti_op_get_by_id_second): + (JSC::Machine::cti_op_get_by_id_generic): + (JSC::Machine::cti_op_get_by_id_fail): + (JSC::Machine::cti_op_instanceof): + (JSC::Machine::cti_op_del_by_id): + (JSC::Machine::cti_op_mul): + (JSC::Machine::cti_op_new_func): + (JSC::Machine::cti_op_call_JSFunction): + (JSC::Machine::cti_vm_compile): + (JSC::Machine::cti_op_push_activation): + (JSC::Machine::cti_op_call_NotJSFunction): + (JSC::Machine::cti_op_create_arguments): + (JSC::Machine::cti_op_tear_off_activation): + (JSC::Machine::cti_op_tear_off_arguments): + (JSC::Machine::cti_op_ret_profiler): + (JSC::Machine::cti_op_ret_scopeChain): + (JSC::Machine::cti_op_new_array): + (JSC::Machine::cti_op_resolve): + (JSC::Machine::cti_op_construct_JSConstruct): + (JSC::Machine::cti_op_construct_NotJSConstruct): + (JSC::Machine::cti_op_get_by_val): + (JSC::Machine::cti_op_resolve_func): + (JSC::Machine::cti_op_sub): + (JSC::Machine::cti_op_put_by_val): + (JSC::Machine::cti_op_put_by_val_array): + (JSC::Machine::cti_op_lesseq): + (JSC::Machine::cti_op_loop_if_true): + (JSC::Machine::cti_op_negate): + (JSC::Machine::cti_op_resolve_base): + (JSC::Machine::cti_op_resolve_skip): + (JSC::Machine::cti_op_resolve_global): + (JSC::Machine::cti_op_div): + (JSC::Machine::cti_op_pre_dec): + (JSC::Machine::cti_op_jless): + (JSC::Machine::cti_op_not): + (JSC::Machine::cti_op_jtrue): + (JSC::Machine::cti_op_post_inc): + (JSC::Machine::cti_op_eq): + (JSC::Machine::cti_op_lshift): + (JSC::Machine::cti_op_bitand): + (JSC::Machine::cti_op_rshift): + (JSC::Machine::cti_op_bitnot): + (JSC::Machine::cti_op_resolve_with_base): + (JSC::Machine::cti_op_new_func_exp): + (JSC::Machine::cti_op_mod): + (JSC::Machine::cti_op_less): + (JSC::Machine::cti_op_neq): + (JSC::Machine::cti_op_post_dec): + (JSC::Machine::cti_op_urshift): + (JSC::Machine::cti_op_bitxor): + (JSC::Machine::cti_op_new_regexp): + (JSC::Machine::cti_op_bitor): + (JSC::Machine::cti_op_call_eval): + (JSC::Machine::cti_op_throw): + (JSC::Machine::cti_op_get_pnames): + (JSC::Machine::cti_op_next_pname): + (JSC::Machine::cti_op_push_scope): + (JSC::Machine::cti_op_pop_scope): + (JSC::Machine::cti_op_typeof): + (JSC::Machine::cti_op_to_jsnumber): + (JSC::Machine::cti_op_in): + (JSC::Machine::cti_op_push_new_scope): + (JSC::Machine::cti_op_jmp_scopes): + (JSC::Machine::cti_op_put_by_index): + (JSC::Machine::cti_op_switch_imm): + (JSC::Machine::cti_op_switch_char): + (JSC::Machine::cti_op_switch_string): + (JSC::Machine::cti_op_del_by_val): + (JSC::Machine::cti_op_put_getter): + (JSC::Machine::cti_op_put_setter): + (JSC::Machine::cti_op_new_error): + (JSC::Machine::cti_op_debug): + (JSC::Machine::cti_vm_throw): + * VM/Machine.h: + * VM/Register.h: + * VM/RegisterFile.h: + * kjs/Arguments.h: + * kjs/DebuggerCallFrame.cpp: + (JSC::DebuggerCallFrame::functionName): + (JSC::DebuggerCallFrame::type): + (JSC::DebuggerCallFrame::thisObject): + (JSC::DebuggerCallFrame::evaluate): + * kjs/DebuggerCallFrame.h: + * kjs/ExecState.cpp: + (JSC::CallFrame::thisValue): + * kjs/ExecState.h: + * kjs/FunctionConstructor.cpp: + (JSC::constructFunction): + * kjs/JSActivation.cpp: + (JSC::JSActivation::JSActivation): + (JSC::JSActivation::argumentsGetter): + * kjs/JSActivation.h: + * kjs/JSGlobalObject.cpp: + (JSC::JSGlobalObject::init): + * kjs/JSGlobalObjectFunctions.cpp: + (JSC::globalFuncEval): + * kjs/JSVariableObject.h: + * kjs/Parser.cpp: + (JSC::Parser::parse): + * kjs/RegExpConstructor.cpp: + (JSC::constructRegExp): + * kjs/RegExpPrototype.cpp: + (JSC::regExpProtoFuncCompile): + * kjs/Shell.cpp: + (prettyPrintScript): + * kjs/StringPrototype.cpp: + (JSC::stringProtoFuncMatch): + (JSC::stringProtoFuncSearch): + * kjs/identifier.cpp: + (JSC::Identifier::checkSameIdentifierTable): + * kjs/interpreter.cpp: + (JSC::Interpreter::checkSyntax): + (JSC::Interpreter::evaluate): + * kjs/nodes.cpp: + (JSC::ThrowableExpressionData::emitThrowError): + (JSC::RegExpNode::emitCode): + (JSC::ArrayNode::emitCode): + (JSC::InstanceOfNode::emitCode): + * kjs/nodes.h: + * kjs/regexp.cpp: + (JSC::RegExp::RegExp): + (JSC::RegExp::create): + * kjs/regexp.h: + * profiler/HeavyProfile.h: + * profiler/Profile.h: + * wrec/WREC.cpp: + * wrec/WREC.h: + +2008-10-08 Mark Rowe <mrowe@apple.com> + + Typed by Maciej Stachowiak, reviewed by Mark Rowe. + + Fix crash in fast/js/constant-folding.html with CTI disabled. + + * VM/Machine.cpp: + (JSC::Machine::privateExecute): + +2008-10-08 Timothy Hatcher <timothy@apple.com> + + Roll out r37427 because it causes an infinite recursion loading about:blank. + + https://bugs.webkit.org/show_bug.cgi?id=21476 + +2008-10-08 Darin Adler <darin@apple.com> + + Reviewed by Cameron Zwarich. + + - https://bugs.webkit.org/show_bug.cgi?id=21403 + Bug 21403: use new CallFrame class rather than Register* for call frame manipulation + + Add CallFrame as a synonym for ExecState. Arguably, some day we should switch every + client over to the new name. + + Use CallFrame* consistently rather than Register* or ExecState* in low-level code such + as Machine.cpp and CTI.cpp. Similarly, use callFrame rather than r as its name and use + accessor functions to get at things in the frame. + + Eliminate other uses of ExecState* that aren't needed, replacing in some cases with + JSGlobalData* and in other cases eliminating them entirely. + + * API/JSObjectRef.cpp: + (JSObjectMakeFunctionWithCallback): + (JSObjectMakeFunction): + (JSObjectHasProperty): + (JSObjectGetProperty): + (JSObjectSetProperty): + (JSObjectDeleteProperty): + * API/OpaqueJSString.cpp: + * API/OpaqueJSString.h: + * VM/CTI.cpp: + (JSC::CTI::getConstant): + (JSC::CTI::emitGetArg): + (JSC::CTI::emitGetPutArg): + (JSC::CTI::getConstantImmediateNumericArg): + (JSC::CTI::printOpcodeOperandTypes): + (JSC::CTI::CTI): + (JSC::CTI::compileOpCall): + (JSC::CTI::compileBinaryArithOp): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompile): + (JSC::CTI::privateCompileGetByIdProto): + (JSC::CTI::privateCompileGetByIdChain): + (JSC::CTI::compileRegExp): + * VM/CTI.h: + * VM/CodeBlock.h: + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::emitEqualityOp): + (JSC::CodeGenerator::emitLoad): + (JSC::CodeGenerator::emitUnexpectedLoad): + (JSC::CodeGenerator::emitConstruct): + * VM/CodeGenerator.h: + * VM/Machine.cpp: + (JSC::jsLess): + (JSC::jsLessEq): + (JSC::jsAddSlowCase): + (JSC::jsAdd): + (JSC::jsTypeStringForValue): + (JSC::Machine::resolve): + (JSC::Machine::resolveSkip): + (JSC::Machine::resolveGlobal): + (JSC::inlineResolveBase): + (JSC::Machine::resolveBase): + (JSC::Machine::resolveBaseAndProperty): + (JSC::Machine::resolveBaseAndFunc): + (JSC::Machine::slideRegisterWindowForCall): + (JSC::isNotObject): + (JSC::Machine::callEval): + (JSC::Machine::dumpCallFrame): + (JSC::Machine::dumpRegisters): + (JSC::Machine::unwindCallFrame): + (JSC::Machine::throwException): + (JSC::DynamicGlobalObjectScope::DynamicGlobalObjectScope): + (JSC::DynamicGlobalObjectScope::~DynamicGlobalObjectScope): + (JSC::Machine::execute): + (JSC::Machine::debug): + (JSC::Machine::createExceptionScope): + (JSC::cachePrototypeChain): + (JSC::Machine::tryCachePutByID): + (JSC::Machine::tryCacheGetByID): + (JSC::Machine::privateExecute): + (JSC::Machine::retrieveArguments): + (JSC::Machine::retrieveCaller): + (JSC::Machine::retrieveLastCaller): + (JSC::Machine::findFunctionCallFrame): + (JSC::Machine::getArgumentsData): + (JSC::Machine::tryCTICachePutByID): + (JSC::Machine::getCTIArrayLengthTrampoline): + (JSC::Machine::getCTIStringLengthTrampoline): + (JSC::Machine::tryCTICacheGetByID): + (JSC::Machine::cti_op_convert_this): + (JSC::Machine::cti_op_end): + (JSC::Machine::cti_op_add): + (JSC::Machine::cti_op_pre_inc): + (JSC::Machine::cti_timeout_check): + (JSC::Machine::cti_op_loop_if_less): + (JSC::Machine::cti_op_loop_if_lesseq): + (JSC::Machine::cti_op_new_object): + (JSC::Machine::cti_op_put_by_id): + (JSC::Machine::cti_op_put_by_id_second): + (JSC::Machine::cti_op_put_by_id_generic): + (JSC::Machine::cti_op_put_by_id_fail): + (JSC::Machine::cti_op_get_by_id): + (JSC::Machine::cti_op_get_by_id_second): + (JSC::Machine::cti_op_get_by_id_generic): + (JSC::Machine::cti_op_get_by_id_fail): + (JSC::Machine::cti_op_instanceof): + (JSC::Machine::cti_op_del_by_id): + (JSC::Machine::cti_op_mul): + (JSC::Machine::cti_op_new_func): + (JSC::Machine::cti_op_call_JSFunction): + (JSC::Machine::cti_vm_compile): + (JSC::Machine::cti_op_push_activation): + (JSC::Machine::cti_op_call_NotJSFunction): + (JSC::Machine::cti_op_create_arguments): + (JSC::Machine::cti_op_tear_off_activation): + (JSC::Machine::cti_op_tear_off_arguments): + (JSC::Machine::cti_op_ret_profiler): + (JSC::Machine::cti_op_ret_scopeChain): + (JSC::Machine::cti_op_new_array): + (JSC::Machine::cti_op_resolve): + (JSC::Machine::cti_op_construct_JSConstruct): + (JSC::Machine::cti_op_construct_NotJSConstruct): + (JSC::Machine::cti_op_get_by_val): + (JSC::Machine::cti_op_resolve_func): + (JSC::Machine::cti_op_sub): + (JSC::Machine::cti_op_put_by_val): + (JSC::Machine::cti_op_put_by_val_array): + (JSC::Machine::cti_op_lesseq): + (JSC::Machine::cti_op_loop_if_true): + (JSC::Machine::cti_op_negate): + (JSC::Machine::cti_op_resolve_base): + (JSC::Machine::cti_op_resolve_skip): + (JSC::Machine::cti_op_resolve_global): + (JSC::Machine::cti_op_div): + (JSC::Machine::cti_op_pre_dec): + (JSC::Machine::cti_op_jless): + (JSC::Machine::cti_op_not): + (JSC::Machine::cti_op_jtrue): + (JSC::Machine::cti_op_post_inc): + (JSC::Machine::cti_op_eq): + (JSC::Machine::cti_op_lshift): + (JSC::Machine::cti_op_bitand): + (JSC::Machine::cti_op_rshift): + (JSC::Machine::cti_op_bitnot): + (JSC::Machine::cti_op_resolve_with_base): + (JSC::Machine::cti_op_new_func_exp): + (JSC::Machine::cti_op_mod): + (JSC::Machine::cti_op_less): + (JSC::Machine::cti_op_neq): + (JSC::Machine::cti_op_post_dec): + (JSC::Machine::cti_op_urshift): + (JSC::Machine::cti_op_bitxor): + (JSC::Machine::cti_op_new_regexp): + (JSC::Machine::cti_op_bitor): + (JSC::Machine::cti_op_call_eval): + (JSC::Machine::cti_op_throw): + (JSC::Machine::cti_op_get_pnames): + (JSC::Machine::cti_op_next_pname): + (JSC::Machine::cti_op_push_scope): + (JSC::Machine::cti_op_pop_scope): + (JSC::Machine::cti_op_typeof): + (JSC::Machine::cti_op_to_jsnumber): + (JSC::Machine::cti_op_in): + (JSC::Machine::cti_op_push_new_scope): + (JSC::Machine::cti_op_jmp_scopes): + (JSC::Machine::cti_op_put_by_index): + (JSC::Machine::cti_op_switch_imm): + (JSC::Machine::cti_op_switch_char): + (JSC::Machine::cti_op_switch_string): + (JSC::Machine::cti_op_del_by_val): + (JSC::Machine::cti_op_put_getter): + (JSC::Machine::cti_op_put_setter): + (JSC::Machine::cti_op_new_error): + (JSC::Machine::cti_op_debug): + (JSC::Machine::cti_vm_throw): + * VM/Machine.h: + * VM/Register.h: + * VM/RegisterFile.h: + * kjs/Arguments.h: + * kjs/DebuggerCallFrame.cpp: + (JSC::DebuggerCallFrame::functionName): + (JSC::DebuggerCallFrame::type): + (JSC::DebuggerCallFrame::thisObject): + (JSC::DebuggerCallFrame::evaluate): + * kjs/DebuggerCallFrame.h: + * kjs/ExecState.cpp: + (JSC::CallFrame::thisValue): + * kjs/ExecState.h: + * kjs/FunctionConstructor.cpp: + (JSC::constructFunction): + * kjs/JSActivation.cpp: + (JSC::JSActivation::JSActivation): + (JSC::JSActivation::argumentsGetter): + * kjs/JSActivation.h: + * kjs/JSGlobalObject.cpp: + (JSC::JSGlobalObject::init): + * kjs/JSGlobalObjectFunctions.cpp: + (JSC::globalFuncEval): + * kjs/JSVariableObject.h: + * kjs/Parser.cpp: + (JSC::Parser::parse): + * kjs/RegExpConstructor.cpp: + (JSC::constructRegExp): + * kjs/RegExpPrototype.cpp: + (JSC::regExpProtoFuncCompile): + * kjs/Shell.cpp: + (prettyPrintScript): + * kjs/StringPrototype.cpp: + (JSC::stringProtoFuncMatch): + (JSC::stringProtoFuncSearch): + * kjs/identifier.cpp: + (JSC::Identifier::checkSameIdentifierTable): + * kjs/interpreter.cpp: + (JSC::Interpreter::checkSyntax): + (JSC::Interpreter::evaluate): + * kjs/nodes.cpp: + (JSC::ThrowableExpressionData::emitThrowError): + (JSC::RegExpNode::emitCode): + (JSC::ArrayNode::emitCode): + (JSC::InstanceOfNode::emitCode): + * kjs/nodes.h: + * kjs/regexp.cpp: + (JSC::RegExp::RegExp): + (JSC::RegExp::create): + * kjs/regexp.h: + * profiler/HeavyProfile.h: + * profiler/Profile.h: + * wrec/WREC.cpp: + * wrec/WREC.h: + +2008-10-08 Prasanth Ullattil <pullatti@trolltech.com> + + Reviewed by Oliver Hunt. + + Avoid endless loops when compiling without the computed goto + optimization. + + NEXT_OPCODE expands to "continue", which will not work inside + loops. + + * VM/Machine.cpp: + (JSC::Machine::privateExecute): + +2008-10-08 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Oliver Hunt. + + Re-landing the following fix with the crashing bug in it fixed (r37405): + + - optimize away multiplication by constant 1.0 + + 2.3% speedup on v8 RayTrace benchmark + + Apparently it's not uncommon for JavaScript code to multiply by + constant 1.0 in the mistaken belief that this converts integer to + floating point and that there is any operational difference. + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): Optimize to_jsnumber for + case where parameter is already number. + (JSC::CTI::privateCompileSlowCases): ditto + * VM/Machine.cpp: + (JSC::Machine::privateExecute): ditto + * kjs/grammar.y: + (makeMultNode): Transform as follows: + +FOO * BAR ==> FOO * BAR + FOO * +BAR ==> FOO * BAR + FOO * 1 ==> +FOO + 1 * FOO ==> +FOO + (makeDivNode): Transform as follows: + +FOO / BAR ==> FOO / BAR + FOO / +BAR ==> FOO / BAR + (makeSubNode): Transform as follows: + +FOO - BAR ==> FOO - BAR + FOO - +BAR ==> FOO - BAR + * kjs/nodes.h: + (JSC::ExpressionNode::stripUnaryPlus): Helper for above + grammar.y changes + (JSC::UnaryPlusNode::stripUnaryPlus): ditto + +2008-10-08 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Oliver Hunt. + + - correctly handle appending -0 to a string, it should stringify as just 0 + + * kjs/ustring.cpp: + (JSC::concatenate): + +2008-10-08 Prasanth Ullattil <pullatti@trolltech.com> + + Reviewed by Simon. + + Fix WebKit compilation with VC2008SP1 + + Apply the TR1 workaround for JavaScriptCore, too. + + * JavaScriptCore.pro: + +2008-10-08 Prasanth Ullattil <pullatti@trolltech.com> + + Reviewed by Simon. + + Fix compilation errors on VS2008 64Bit + + * kjs/collector.cpp: + (JSC::currentThreadStackBase): + +2008-10-08 André Pönitz <apoenitz@trolltech.com> + + Reviewed by Simon. + + Fix compilation with Qt namespaces. + + * wtf/Threading.h: + +2008-10-07 Sam Weinig <sam@webkit.org> + + Roll out r37405. + +2008-10-07 Oliver Hunt <oliver@apple.com> + + Reviewed by Cameron Zwarich. + + Switch CTI runtime calls to the fastcall calling convention + + Basically this means that we get to store the argument for CTI + calls in the ECX register, which saves a register->memory write + and subsequent memory->register read. + + This is a 1.7% progression in SunSpider and 2.4% on commandline + v8 tests on Windows + + * VM/CTI.cpp: + (JSC::): + (JSC::CTI::privateCompilePutByIdTransition): + (JSC::CTI::privateCompilePatchGetArrayLength): + * VM/CTI.h: + * VM/Machine.h: + * masm/X86Assembler.h: + (JSC::X86Assembler::emitRestoreArgumentReference): + (JSC::X86Assembler::emitRestoreArgumentReferenceForTrampoline): + We need this to correctly reload ecx from inside certain property access + trampolines. + * wtf/Platform.h: + +2008-10-07 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Mark Rowe. + + - optimize away multiplication by constant 1.0 + + 2.3% speedup on v8 RayTrace benchmark + + Apparently it's not uncommon for JavaScript code to multiply by + constant 1.0 in the mistaken belief that this converts integer to + floating point and that there is any operational difference. + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): Optimize to_jsnumber for + case where parameter is already number. + (JSC::CTI::privateCompileSlowCases): ditto + * VM/Machine.cpp: + (JSC::Machine::privateExecute): ditto + * kjs/grammar.y: + (makeMultNode): Transform as follows: + +FOO * BAR ==> FOO * BAR + FOO * +BAR ==> FOO * BAR + FOO * 1 ==> +FOO + 1 * FOO ==> +FOO + (makeDivNode): Transform as follows: + +FOO / BAR ==> FOO / BAR + FOO / +BAR ==> FOO / BAR + (makeSubNode): Transform as follows: + +FOO - BAR ==> FOO - BAR + FOO - +BAR ==> FOO - BAR + * kjs/nodes.h: + (JSC::ExpressionNode::stripUnaryPlus): Helper for above + grammar.y changes + (JSC::UnaryPlusNode::stripUnaryPlus): ditto + +2008-10-07 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Oliver Hunt. + + - make constant folding code more consistent + + Added a makeSubNode to match add, mult and div; use the makeFooNode functions always, + instead of allocating nodes directly in other places in the grammar. + + * kjs/grammar.y: + +2008-10-07 Sam Weinig <sam@webkit.org> + + Reviewed by Cameron Zwarich. + + Move hasGetterSetterProperties flag from PropertyMap to StructureID. + + * kjs/JSObject.cpp: + (JSC::JSObject::put): + (JSC::JSObject::defineGetter): + (JSC::JSObject::defineSetter): + * kjs/JSObject.h: + (JSC::JSObject::hasGetterSetterProperties): + (JSC::JSObject::getOwnPropertySlotForWrite): + (JSC::JSObject::getOwnPropertySlot): + * kjs/PropertyMap.h: + * kjs/StructureID.cpp: + (JSC::StructureID::StructureID): + (JSC::StructureID::addPropertyTransition): + (JSC::StructureID::toDictionaryTransition): + (JSC::StructureID::changePrototypeTransition): + (JSC::StructureID::getterSetterTransition): + * kjs/StructureID.h: + (JSC::StructureID::hasGetterSetterProperties): + (JSC::StructureID::setHasGetterSetterProperties): + +2008-10-07 Sam Weinig <sam@webkit.org> + + Reviewed by Cameron Zwarich. + + Roll r37370 back in with bug fixes. + + - PropertyMap::storageSize() should reflect the number of keys + deletedOffsets + and has nothing to do with the internal deletedSentinel count anymore. + +2008-10-07 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Move callframe initialization into JIT code, again. + + As a part of the restructuring the second result from functions is now + returned in edx, allowing the new value of 'r' to be returned via a + register, and stored to the stack from JIT code, too. + + 4.5% progression on v8-tests. (3% in their harness) + + * VM/CTI.cpp: + (JSC::): + (JSC::CTI::emitCall): + (JSC::CTI::compileOpCall): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + (JSC::CTI::privateCompile): + * VM/CTI.h: + (JSC::CallRecord::CallRecord): + * VM/Machine.cpp: + (JSC::Machine::cti_op_call_JSFunction): + (JSC::Machine::cti_op_construct_JSConstruct): + (JSC::Machine::cti_op_resolve_func): + (JSC::Machine::cti_op_post_inc): + (JSC::Machine::cti_op_resolve_with_base): + (JSC::Machine::cti_op_post_dec): + * VM/Machine.h: + * kjs/JSFunction.h: + * kjs/ScopeChain.h: + +2008-10-07 Mark Rowe <mrowe@apple.com> + + Fix typo in method name. + + * wrec/WREC.cpp: + * wrec/WREC.h: + +2008-10-07 Cameron Zwarich <zwarich@apple.com> + + Rubber-stamped by Mark Rowe. + + Roll out r37370. + +2008-10-06 Sam Weinig <sam@webkit.org> + + Reviewed by Cameron Zwarich. + + Fix for https://bugs.webkit.org/show_bug.cgi?id=21415 + Improve the division between PropertyStorageArray and PropertyMap + + - Rework ProperyMap to store offsets in the value so that they don't + change when rehashing. This allows us not to have to keep the + PropertyStorageArray in sync and thus not have to pass it in. + - Rename PropertyMap::getOffset -> PropertyMap::get since put/remove + now also return offsets. + - A Vector of deleted offsets is now needed since the storage is out of + band. + + 1% win on SunSpider. Wash on V8 suite. + + * JavaScriptCore.exp: + * VM/CTI.cpp: + (JSC::transitionWillNeedStorageRealloc): + * VM/Machine.cpp: + (JSC::Machine::privateExecute): + Transition logic can be greatly simplified by the fact that + the storage capacity is always known, and is correct for the + inline case. + * kjs/JSObject.cpp: + (JSC::JSObject::put): Rename getOffset -> get. + (JSC::JSObject::deleteProperty): Ditto. + (JSC::JSObject::getPropertyAttributes): Ditto. + (JSC::JSObject::removeDirect): Use returned offset to + clear the value in the PropertyNameArray. + (JSC::JSObject::allocatePropertyStorage): Add assert. + * kjs/JSObject.h: + (JSC::JSObject::getDirect): Rename getOffset -> get + (JSC::JSObject::getDirectLocation): Rename getOffset -> get + (JSC::JSObject::putDirect): Use propertyStorageCapacity to determine whether + or not to resize. Also, since put now returns an offset (and thus + addPropertyTransition does also) setting of the PropertyStorageArray is + now done here. + (JSC::JSObject::transitionTo): + * kjs/PropertyMap.cpp: + (JSC::PropertyMap::checkConsistency): PropertyStorageArray is no longer + passed in. + (JSC::PropertyMap::operator=): Copy the delete offsets vector. + (JSC::PropertyMap::put): Instead of setting the PropertyNameArray + explicitly, return the offset where the value should go. + (JSC::PropertyMap::remove): Instead of removing from the PropertyNameArray + explicitly, return the offset where the value should be removed. + (JSC::PropertyMap::get): Switch to using the stored offset, instead + of the implicit one. + (JSC::PropertyMap::insert): + (JSC::PropertyMap::expand): This is never called when m_table is null, + so remove that branch and add it as an assertion. + (JSC::PropertyMap::createTable): Consistency checks no longer take + a PropertyNameArray. + (JSC::PropertyMap::rehash): No need to rehash the PropertyNameArray + now that it is completely out of band. + * kjs/PropertyMap.h: + (JSC::PropertyMapEntry::PropertyMapEntry): Store offset into PropertyNameArray. + (JSC::PropertyMap::get): Switch to using the stored offset, instead + of the implicit one. + * kjs/StructureID.cpp: + (JSC::StructureID::StructureID): Initialize the propertyStorageCapacity to + JSObject::inlineStorageCapacity. + (JSC::StructureID::growPropertyStorageCapacity): Grow the storage capacity as + described below. + (JSC::StructureID::addPropertyTransition): Copy the storage capacity. + (JSC::StructureID::toDictionaryTransition): Ditto. + (JSC::StructureID::changePrototypeTransition): Ditto. + (JSC::StructureID::getterSetterTransition): Ditto. + * kjs/StructureID.h: + (JSC::StructureID::propertyStorageCapacity): Add propertyStorageCapacity + which is the current capacity for the JSObjects PropertyStorageArray. + It starts at the JSObject::inlineStorageCapacity (currently 2), then + when it first needs to be resized moves to the JSObject::nonInlineBaseStorageCapacity + (currently 16), and after that doubles each time. + +2008-10-06 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Oliver Hunt. + + Bug 21396: Remove the OptionalCalleeActivation call frame slot + <https://bugs.webkit.org/show_bug.cgi?id=21396> + + Remove the OptionalCalleeActivation call frame slot. We have to be + careful to store the activation object in a register, because objects + in the scope chain do not get marked. + + This is a 0.3% speedup on both SunSpider and the V8 benchmark. + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): + * VM/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::CodeGenerator): + (JSC::CodeGenerator::emitReturn): + * VM/CodeGenerator.h: + * VM/Machine.cpp: + (JSC::Machine::dumpRegisters): + (JSC::Machine::unwindCallFrame): + (JSC::Machine::privateExecute): + (JSC::Machine::cti_op_call_JSFunction): + (JSC::Machine::cti_op_push_activation): + (JSC::Machine::cti_op_tear_off_activation): + (JSC::Machine::cti_op_construct_JSConstruct): + * VM/Machine.h: + (JSC::Machine::initializeCallFrame): + * VM/RegisterFile.h: + (JSC::RegisterFile::): + +2008-10-06 Tony Chang <tony@chromium.org> + + Reviewed by Alexey Proskuryakov. + + Chromium doesn't use pthreads on windows, so make its use conditional. + + Also convert a WORD to a DWORD to avoid a compiler warning. This + matches the other methods around it. + + * wtf/ThreadingWin.cpp: + (WTF::wtfThreadEntryPoint): + (WTF::ThreadCondition::broadcast): + +2008-10-06 Mark Mentovai <mark@moxienet.com> + + Reviewed by Tim Hatcher. + + Allow ENABLE_DASHBOARD_SUPPORT and ENABLE_MAC_JAVA_BRIDGE to be + disabled on the Mac. + + https://bugs.webkit.org/show_bug.cgi?id=21333 + + * wtf/Platform.h: + +2008-10-06 Steve Falkenburg <sfalken@apple.com> + + https://bugs.webkit.org/show_bug.cgi?id=21416 + Pass 0 for size to VirtualAlloc, as documented by MSDN. + Identified by Application Verifier. + + Reviewed by Darin Adler. + + * kjs/collector.cpp: + (KJS::freeBlock): + +2008-10-06 Kevin McCullough <kmccullough@apple.com> + + Reviewed by Tim Hatcheri and Oliver Hunt. + + https://bugs.webkit.org/show_bug.cgi?id=21412 + Bug 21412: Refactor user initiated profile count to be more stable + - Export UString::from for use with creating the profile title. + + * JavaScriptCore.exp: + +2008-10-06 Maciej Stachowiak <mjs@apple.com> + + Not reviewed. Build fix. + + - revert toBoolean changes (r37333 and r37335); need to make WebCore work with these + + * API/JSValueRef.cpp: + (JSValueToBoolean): + * ChangeLog: + * JavaScriptCore.exp: + * VM/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * VM/Machine.cpp: + (JSC::Machine::privateExecute): + (JSC::Machine::cti_op_loop_if_true): + (JSC::Machine::cti_op_not): + (JSC::Machine::cti_op_jtrue): + * kjs/ArrayPrototype.cpp: + (JSC::arrayProtoFuncFilter): + (JSC::arrayProtoFuncEvery): + (JSC::arrayProtoFuncSome): + * kjs/BooleanConstructor.cpp: + (JSC::constructBoolean): + (JSC::callBooleanConstructor): + * kjs/GetterSetter.h: + * kjs/JSCell.h: + (JSC::JSValue::toBoolean): + * kjs/JSNumberCell.cpp: + (JSC::JSNumberCell::toBoolean): + * kjs/JSNumberCell.h: + * kjs/JSObject.cpp: + (JSC::JSObject::toBoolean): + * kjs/JSObject.h: + * kjs/JSString.cpp: + (JSC::JSString::toBoolean): + * kjs/JSString.h: + * kjs/JSValue.h: + * kjs/RegExpConstructor.cpp: + (JSC::setRegExpConstructorMultiline): + * kjs/RegExpObject.cpp: + (JSC::RegExpObject::match): + * kjs/RegExpPrototype.cpp: + (JSC::regExpProtoFuncToString): + +2008-10-06 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Sam Weinig. + + - optimize op_jtrue, op_loop_if_true and op_not in various ways + https://bugs.webkit.org/show_bug.cgi?id=21404 + + 1) Make JSValue::toBoolean nonvirtual and completely inline by + making use of the StructureID type field. + + 2) Make JSValue::toBoolean not take an ExecState; doesn't need it. + + 3) Make op_not, op_loop_if_true and op_jtrue not read the + ExecState (toBoolean doesn't need it any more) and not check + exceptions (toBoolean can't throw). + + * API/JSValueRef.cpp: + (JSValueToBoolean): + * JavaScriptCore.exp: + * VM/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * VM/Machine.cpp: + (JSC::Machine::privateExecute): + (JSC::Machine::cti_op_loop_if_true): + (JSC::Machine::cti_op_not): + (JSC::Machine::cti_op_jtrue): + * kjs/ArrayPrototype.cpp: + (JSC::arrayProtoFuncFilter): + (JSC::arrayProtoFuncEvery): + (JSC::arrayProtoFuncSome): + * kjs/BooleanConstructor.cpp: + (JSC::constructBoolean): + (JSC::callBooleanConstructor): + * kjs/GetterSetter.h: + * kjs/JSCell.h: + (JSC::JSValue::toBoolean): + * kjs/JSNumberCell.cpp: + * kjs/JSNumberCell.h: + (JSC::JSNumberCell::toBoolean): + * kjs/JSObject.cpp: + * kjs/JSObject.h: + (JSC::JSObject::toBoolean): + (JSC::JSCell::toBoolean): + * kjs/JSString.cpp: + * kjs/JSString.h: + (JSC::JSString::toBoolean): + * kjs/JSValue.h: + * kjs/RegExpConstructor.cpp: + (JSC::setRegExpConstructorMultiline): + * kjs/RegExpObject.cpp: + (JSC::RegExpObject::match): + * kjs/RegExpPrototype.cpp: + (JSC::regExpProtoFuncToString): + +2008-10-06 Ariya Hidayat <ariya.hidayat@trolltech.com> + + Reviewed by Simon. + + Build fix for MinGW. + + * JavaScriptCore.pri: + * kjs/DateMath.cpp: + (JSC::highResUpTime): + +2008-10-05 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Oliver Hunt. + + Remove ScopeNode::containsClosures() now that it is unused. + + * kjs/nodes.h: + (JSC::ScopeNode::containsClosures): + +2008-10-05 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Cameron Zwarich. + + - fix releas-only test failures caused by the fix to bug 21375 + + * VM/Machine.cpp: + (JSC::Machine::unwindCallFrame): Update ExecState while unwinding call frames; + it now matters more to have a still-valid ExecState, since dynamicGlobalObject + will make use of the ExecState's scope chain. + * VM/Machine.h: + +2008-10-05 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Oliver Hunt. + + Bug 21364: Remove the branch in op_ret for OptionalCalleeActivation and OptionalCalleeArguments + <https://bugs.webkit.org/show_bug.cgi?id=21364> + + Use information from the parser to detect whether an activation is + needed or 'arguments' is used, and emit explicit instructions to tear + them off before op_ret. This allows a branch to be removed from op_ret + and simplifies some other code. This does cause a small change in the + behaviour of 'f.arguments'; it is no longer live when 'arguments' is not + mentioned in the lexical scope of the function. + + It should now be easy to remove the OptionaCalleeActivation slot in the + call frame, but this will be done in a later patch. + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): + * VM/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::emitReturn): + * VM/CodeGenerator.h: + * VM/Machine.cpp: + (JSC::Machine::unwindCallFrame): + (JSC::Machine::privateExecute): + (JSC::Machine::retrieveArguments): + (JSC::Machine::cti_op_create_arguments): + (JSC::Machine::cti_op_tear_off_activation): + (JSC::Machine::cti_op_tear_off_arguments): + * VM/Machine.h: + * VM/Opcode.h: + * kjs/Arguments.cpp: + (JSC::Arguments::mark): + * kjs/Arguments.h: + (JSC::Arguments::isTornOff): + (JSC::Arguments::Arguments): + (JSC::Arguments::copyRegisters): + (JSC::JSActivation::copyRegisters): + * kjs/JSActivation.cpp: + (JSC::JSActivation::argumentsGetter): + * kjs/JSActivation.h: + +2008-10-05 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Oliver Hunt. + + - fixed "REGRESSION (r37297): fast/js/deep-recursion-test takes too long and times out" + https://bugs.webkit.org/show_bug.cgi?id=21375 + + The problem is that dynamicGlobalObject had become O(N) in number + of call frames, but unwinding the stack for an exception called it + for every call frame, resulting in O(N^2) behavior for an + exception thrown from inside deep recursion. + + Instead of doing it that way, stash the dynamic global object in JSGlobalData. + + * JavaScriptCore.exp: + * VM/Machine.cpp: + (JSC::DynamicGlobalObjectScope::DynamicGlobalObjectScope): Helper class to temporarily + store and later restore a dynamicGlobalObject in JSGlobalData. + (JSC::DynamicGlobalObjectScope::~DynamicGlobalObjectScope): + (JSC::Machine::execute): In each version, establish a DynamicGlobalObjectScope. + For ProgramNode, always establish set new dynamicGlobalObject, for FunctionBody and Eval, + only if none is currently set. + * VM/Machine.h: + * kjs/ExecState.h: + * kjs/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): Ininitalize new dynamicGlobalObject field to 0. + * kjs/JSGlobalData.h: + * kjs/JSGlobalObject.h: + (JSC::ExecState::dynamicGlobalObject): Moved here from ExecState for benefit of inlining. + Return lexical global object if this is a globalExec(), otherwise look in JSGlobalData + for the one stashed there. + +2008-10-05 Sam Weinig <sam@webkit.org> + + Reviewed by Maciej Stachowiak. + + Avoid an extra lookup when transitioning to an existing StructureID + by caching the offset of property that caused the transition. + + 1% win on V8 suite. Wash on SunSpider. + + * kjs/PropertyMap.cpp: + (JSC::PropertyMap::put): + * kjs/PropertyMap.h: + * kjs/StructureID.cpp: + (JSC::StructureID::StructureID): + (JSC::StructureID::addPropertyTransition): + * kjs/StructureID.h: + (JSC::StructureID::setCachedTransistionOffset): + (JSC::StructureID::cachedTransistionOffset): + +2008-10-05 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Maciej Stachowiak. + + Bug 21364: Remove the branch in op_ret for OptionalCalleeActivation and OptionalCalleeArguments + <https://bugs.webkit.org/show_bug.cgi?id=21364> + + This patch does not yet remove the branch, but it does a bit of refactoring + so that a CodeGenerator now knows whether the associated CodeBlock will need + a full scope before doing any code generation. This makes it possible to emit + explicit tear-off instructions before every op_ret. + + * VM/CodeBlock.h: + (JSC::CodeBlock::CodeBlock): + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::generate): + (JSC::CodeGenerator::CodeGenerator): + (JSC::CodeGenerator::emitPushScope): + (JSC::CodeGenerator::emitPushNewScope): + * kjs/nodes.h: + (JSC::ScopeNode::needsActivation): + +2008-10-05 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Cameron Zwarich. + + Fix for bug #21387 - using SamplingTool with CTI. + + (1) A repatch offset offset changes due to an additional instruction to update SamplingTool state. + (2) Fix an incusion order problem due to ExecState changes. + (3) Change to a MACHINE_SAMPLING macro, use of exec should now be accessing global data. + + * VM/CTI.h: + (JSC::CTI::execute): + * VM/SamplingTool.h: + (JSC::SamplingTool::privateExecuteReturned): + * kjs/Shell.cpp: + +2008-10-04 Mark Rowe <mrowe@apple.com> + + Reviewed by Tim Hatcher. + + Add a 'Check For Weak VTables' build phase to catch weak vtables as early as possible. + + * JavaScriptCore.xcodeproj/project.pbxproj: + +2008-10-04 Sam Weinig <sam@webkit.org> + + Reviewed by Oliver Hunt. + + Fix https://bugs.webkit.org/show_bug.cgi?id=21320 + leaks of PropertyNameArrayData seen on buildbot + + - Fix RefPtr cycle by making PropertyNameArrayData's pointer back + to the StructureID a weak pointer. + + * kjs/PropertyNameArray.h: + (JSC::PropertyNameArrayData::setCachedStructureID): + (JSC::PropertyNameArrayData::cachedStructureID): + * kjs/StructureID.cpp: + (JSC::StructureID::getEnumerablePropertyNames): + (JSC::StructureID::clearEnumerationCache): + (JSC::StructureID::~StructureID): + +2008-10-04 Darin Adler <darin@apple.com> + + Reviewed by Cameron Zwarich. + + - https://bugs.webkit.org/show_bug.cgi?id=21295 + Bug 21295: Replace ExecState with a call frame Register pointer + + 10% faster on Richards; other v8 benchmarks faster too. + A wash on SunSpider. + + This does the minimum necessary to get the speedup. Next step in + cleaning this up is to replace ExecState with a CallFrame class, + and be more judicious about when to pass a call frame and when + to pass a global data pointer, global object pointer, or perhaps + something else entirely. + + * VM/CTI.cpp: Remove the debug-only check of the exception in + ctiVMThrowTrampoline -- already checked in the code the trampoline + jumps to, so not all that useful. Removed the exec argument from + ctiTrampoline. Removed emitDebugExceptionCheck -- no longer needed. + (JSC::CTI::emitCall): Removed code to set ExecState::m_callFrame. + (JSC::CTI::privateCompileMainPass): Removed code in catch to extract + the exception from ExecState::m_exception; instead, the code that + jumps into catch will make sure the exception is already in eax. + * VM/CTI.h: Removed exec from the ctiTrampoline. Also removed the + non-helpful "volatile". Temporarily left ARG_exec in as a synonym + for ARG_r; I'll change that on a future cleanup pass when introducing + more use of the CallFrame type. + (JSC::CTI::execute): Removed the ExecState* argument. + + * VM/ExceptionHelpers.cpp: + (JSC::InterruptedExecutionError::InterruptedExecutionError): Take + JSGlobalData* instead of ExecState*. + (JSC::createInterruptedExecutionException): Ditto. + * VM/ExceptionHelpers.h: Ditto. Also removed an unneeded include. + + * VM/Machine.cpp: + (JSC::slideRegisterWindowForCall): Removed the exec and + exceptionValue arguments. Changed to return 0 when there's a stack + overflow rather than using a separate exception argument to cut + down on memory accesses in the calling convention. + (JSC::Machine::unwindCallFrame): Removed the exec argument when + constructing a DebuggerCallFrame. Also removed code to set + ExecState::m_callFrame. + (JSC::Machine::throwException): Removed the exec argument when + construction a DebuggerCallFrame. + (JSC::Machine::execute): Updated to use the register instead of + ExecState and also removed various uses of ExecState. + (JSC::Machine::debug): + (JSC::Machine::privateExecute): Put globalData into a local + variable so it can be used throughout the interpreter. Changed + the VM_CHECK_EXCEPTION to get the exception in globalData instead + of through ExecState. + (JSC::Machine::retrieveLastCaller): Turn exec into a registers + pointer by calling registers() instead of by getting m_callFrame. + (JSC::Machine::callFrame): Ditto. + Tweaked exception macros. Made new versions for when you know + you have an exception. Get at global exception with ARG_globalData. + Got rid of the need to pass in the return value type. + (JSC::Machine::cti_op_add): Update to use new version of exception + macros. + (JSC::Machine::cti_op_pre_inc): Ditto. + (JSC::Machine::cti_timeout_check): Ditto. + (JSC::Machine::cti_op_instanceof): Ditto. + (JSC::Machine::cti_op_new_func): Ditto. + (JSC::Machine::cti_op_call_JSFunction): Optimized by using the + ARG values directly instead of through local variables -- this gets + rid of code that just shuffles things around in the stack frame. + Also get rid of ExecState and update for the new way exceptions are + handled in slideRegisterWindowForCall. + (JSC::Machine::cti_vm_compile): Update to make exec out of r since + they are both the same thing now. + (JSC::Machine::cti_op_call_NotJSFunction): Ditto. + (JSC::Machine::cti_op_init_arguments): Ditto. + (JSC::Machine::cti_op_resolve): Ditto. + (JSC::Machine::cti_op_construct_JSConstruct): Ditto. + (JSC::Machine::cti_op_construct_NotJSConstruct): Ditto. + (JSC::Machine::cti_op_resolve_func): Ditto. + (JSC::Machine::cti_op_put_by_val): Ditto. + (JSC::Machine::cti_op_put_by_val_array): Ditto. + (JSC::Machine::cti_op_resolve_skip): Ditto. + (JSC::Machine::cti_op_resolve_global): Ditto. + (JSC::Machine::cti_op_post_inc): Ditto. + (JSC::Machine::cti_op_resolve_with_base): Ditto. + (JSC::Machine::cti_op_post_dec): Ditto. + (JSC::Machine::cti_op_call_eval): Ditto. + (JSC::Machine::cti_op_throw): Ditto. Also rearranged to return + the exception value as the return value so it can be used by + op_catch. + (JSC::Machine::cti_op_push_scope): Ditto. + (JSC::Machine::cti_op_in): Ditto. + (JSC::Machine::cti_op_del_by_val): Ditto. + (JSC::Machine::cti_vm_throw): Ditto. Also rearranged to return + the exception value as the return value so it can be used by + op_catch. + + * kjs/DebuggerCallFrame.cpp: + (JSC::DebuggerCallFrame::functionName): Pass globalData. + (JSC::DebuggerCallFrame::evaluate): Eliminated code to make a + new ExecState. + * kjs/DebuggerCallFrame.h: Removed ExecState argument from + constructor. + + * kjs/ExecState.h: Eliminated all data members and made ExecState + inherit privately from Register instead. Also added a typedef to + the future name for this class, which is CallFrame. It's just a + Register* that knows it's a pointer at a call frame. The new class + can't be constructed or copied. Changed all functions to use + the this pointer instead of m_callFrame. Changed exception-related + functions to access an exception in JSGlobalData. Removed functions + used by CTI to pass the return address to the throw machinery -- + this is now done directly with a global in the global data. + + * kjs/FunctionPrototype.cpp: + (JSC::functionProtoFuncToString): Pass globalData instead of exec. + + * kjs/InternalFunction.cpp: + (JSC::InternalFunction::name): Take globalData instead of exec. + * kjs/InternalFunction.h: Ditto. + + * kjs/JSGlobalData.cpp: Initialize the new exception global to 0. + * kjs/JSGlobalData.h: Declare two new globals. One for the current + exception and another for the return address used by CTI to + implement the throw operation. + + * kjs/JSGlobalObject.cpp: + (JSC::JSGlobalObject::init): Removed code to set up globalExec, + which is now the same thing as globalCallFrame. + (JSC::JSGlobalObject::reset): Get globalExec from our globalExec + function so we don't have to repeat the logic twice. + (JSC::JSGlobalObject::mark): Removed code to mark the exception; + the exception is now stored in JSGlobalData and marked there. + (JSC::JSGlobalObject::globalExec): Return a pointer to the end + of the global call frame. + * kjs/JSGlobalObject.h: Removed the globalExec data member. + + * kjs/JSObject.cpp: + (JSC::JSObject::putDirectFunction): Pass globalData instead of exec. + + * kjs/collector.cpp: + (JSC::Heap::collect): Mark the global exception. + + * profiler/ProfileGenerator.cpp: + (JSC::ProfileGenerator::addParentForConsoleStart): Pass globalData + instead of exec to createCallIdentifier. + + * profiler/Profiler.cpp: + (JSC::Profiler::willExecute): Pass globalData instead of exec to + createCallIdentifier. + (JSC::Profiler::didExecute): Ditto. + (JSC::Profiler::createCallIdentifier): Take globalData instead of + exec. + (JSC::createCallIdentifierFromFunctionImp): Ditto. + * profiler/Profiler.h: Change interface to take a JSGlobalData + instead of an ExecState. + +2008-10-04 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Darin Adler. + + Bug 21369: Add opcode documentation for all undocumented opcodes + <https://bugs.webkit.org/show_bug.cgi?id=21369> + + This patch adds opcode documentation for all undocumented opcodes, and + it also renames op_init_arguments to op_create_arguments. + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): + * VM/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::CodeGenerator): + * VM/Machine.cpp: + (JSC::Machine::privateExecute): + (JSC::Machine::cti_op_create_arguments): + * VM/Machine.h: + * VM/Opcode.h: + +2008-10-03 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Cameron Zwarich. + + - "this" object in methods called on primitives should be wrapper object + https://bugs.webkit.org/show_bug.cgi?id=21362 + + I changed things so that functions which use "this" do a fast + version of toThisObject conversion if needed. Currently we miss + the conversion entirely, at least for primitive types. Using + TypeInfo and the primitive check, I made the fast case bail out + pretty fast. + + This is inexplicably an 1.007x SunSpider speedup (and a wash on V8 benchmarks). + + Also renamed some opcodes for clarity: + + init ==> enter + init_activation ==> enter_with_activation + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + * VM/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::generate): + (JSC::CodeGenerator::CodeGenerator): + * VM/Machine.cpp: + (JSC::Machine::privateExecute): + (JSC::Machine::cti_op_convert_this): + * VM/Machine.h: + * VM/Opcode.h: + * kjs/JSActivation.cpp: + (JSC::JSActivation::JSActivation): + * kjs/JSActivation.h: + (JSC::JSActivation::createStructureID): + * kjs/JSCell.h: + (JSC::JSValue::needsThisConversion): + * kjs/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + * kjs/JSGlobalData.h: + * kjs/JSNumberCell.h: + (JSC::JSNumberCell::createStructureID): + * kjs/JSStaticScopeObject.h: + (JSC::JSStaticScopeObject::JSStaticScopeObject): + (JSC::JSStaticScopeObject::createStructureID): + * kjs/JSString.h: + (JSC::JSString::createStructureID): + * kjs/JSValue.h: + * kjs/TypeInfo.h: + (JSC::TypeInfo::needsThisConversion): + * kjs/nodes.h: + (JSC::ScopeNode::usesThis): + +2008-10-03 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Maciej Stachowiak. + + Bug 21356: The size of the RegisterFile differs depending on 32-bit / 64-bit and Debug / Release + <https://bugs.webkit.org/show_bug.cgi?id=21356> + + The RegisterFile decreases in size (measured in terms of numbers of + Registers) as the size of a Register increases. This causes + + js1_5/Regress/regress-159334.js + + to fail in 64-bit debug builds. This fix makes the RegisterFile on all + platforms the same size that it is in 32-bit Release builds. + + * VM/RegisterFile.h: + (JSC::RegisterFile::RegisterFile): + +2008-10-03 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Cameron Zwarich. + + - Some code cleanup to how we handle code features. + + 1) Rename FeatureInfo typedef to CodeFeatures. + 2) Rename NodeFeatureInfo template to NodeInfo. + 3) Keep CodeFeature bitmask in ScopeNode instead of trying to break it out into individual bools. + 4) Rename misleadingly named "needsClosure" method to "containsClosures", which better describes the meaning + of ClosureFeature. + 5) Make setUsersArguments() not take an argument since it only goes one way. + + * JavaScriptCore.exp: + * VM/CodeBlock.h: + (JSC::CodeBlock::CodeBlock): + * kjs/NodeInfo.h: + * kjs/Parser.cpp: + (JSC::Parser::didFinishParsing): + * kjs/Parser.h: + (JSC::Parser::parse): + * kjs/grammar.y: + * kjs/nodes.cpp: + (JSC::ScopeNode::ScopeNode): + (JSC::ProgramNode::ProgramNode): + (JSC::ProgramNode::create): + (JSC::EvalNode::EvalNode): + (JSC::EvalNode::create): + (JSC::FunctionBodyNode::FunctionBodyNode): + (JSC::FunctionBodyNode::create): + * kjs/nodes.h: + (JSC::ScopeNode::usesEval): + (JSC::ScopeNode::containsClosures): + (JSC::ScopeNode::usesArguments): + (JSC::ScopeNode::setUsesArguments): + +2008-10-03 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Maciej Stachowiak. + + Bug 21343: REGRESSSION (r37160): ecma_3/ExecutionContexts/10.1.3-1.js and js1_4/Functions/function-001.js fail on 64-bit + <https://bugs.webkit.org/show_bug.cgi?id=21343> + + A fix was landed for this issue in r37253, and the ChangeLog assumes + that it is a compiler bug, but it turns out that it is a subtle issue + with mixing signed and unsigned 32-bit values in a 64-bit environment. + In order to properly fix this bug, we should convert our signed offsets + into the register file to use ptrdiff_t. + + This may not be the only instance of this issue, but I will land this + fix first and look for more later. + + * VM/Machine.cpp: + (JSC::Machine::getArgumentsData): + * VM/Machine.h: + * kjs/Arguments.cpp: + (JSC::Arguments::getOwnPropertySlot): + * kjs/Arguments.h: + (JSC::Arguments::init): + +2008-10-03 Darin Adler <darin@apple.com> + + * VM/CTI.cpp: Another Windows build fix. Change the args of ctiTrampoline. + + * kjs/JSNumberCell.h: A build fix for newer versions of gcc. Added + declarations of JSGlobalData overloads of jsNumberCell. + +2008-10-03 Darin Adler <darin@apple.com> + + - try to fix Windows build + + * kjs/ScopeChain.h: Add forward declaration of JSGlobalData. + +2008-10-03 Darin Adler <darin@apple.com> + + Reviewed by Geoff Garen. + + - next step of https://bugs.webkit.org/show_bug.cgi?id=21295 + Turn ExecState into a call frame pointer. + + Remove m_globalObject and m_globalData from ExecState. + + SunSpider says this is a wash (slightly faster but not statistically + significant); which is good enough since it's a preparation step and + not supposed to be a spedup. + + * API/JSCallbackFunction.cpp: + (JSC::JSCallbackFunction::JSCallbackFunction): + * kjs/ArrayConstructor.cpp: + (JSC::ArrayConstructor::ArrayConstructor): + * kjs/BooleanConstructor.cpp: + (JSC::BooleanConstructor::BooleanConstructor): + * kjs/DateConstructor.cpp: + (JSC::DateConstructor::DateConstructor): + * kjs/ErrorConstructor.cpp: + (JSC::ErrorConstructor::ErrorConstructor): + * kjs/FunctionPrototype.cpp: + (JSC::FunctionPrototype::FunctionPrototype): + * kjs/JSFunction.cpp: + (JSC::JSFunction::JSFunction): + * kjs/NativeErrorConstructor.cpp: + (JSC::NativeErrorConstructor::NativeErrorConstructor): + * kjs/NumberConstructor.cpp: + (JSC::NumberConstructor::NumberConstructor): + * kjs/ObjectConstructor.cpp: + (JSC::ObjectConstructor::ObjectConstructor): + * kjs/PrototypeFunction.cpp: + (JSC::PrototypeFunction::PrototypeFunction): + * kjs/RegExpConstructor.cpp: + (JSC::RegExpConstructor::RegExpConstructor): + * kjs/StringConstructor.cpp: + (JSC::StringConstructor::StringConstructor): + Pass JSGlobalData* instead of ExecState* to the InternalFunction + constructor. + + * API/OpaqueJSString.cpp: Added now-needed include. + + * JavaScriptCore.exp: Updated. + + * VM/CTI.cpp: + (JSC::CTI::emitSlowScriptCheck): Changed to use ARGS_globalData + instead of ARGS_exec. + + * VM/CTI.h: Added a new argument to the CTI, the global data pointer. + While it's possible to get to the global data pointer using the + ExecState pointer, it's slow enough that it's better to just keep + it around in the CTI arguments. + + * VM/CodeBlock.h: Moved the CodeType enum here from ExecState.h. + + * VM/Machine.cpp: + (JSC::Machine::execute): Pass fewer arguments when constructing + ExecState, and pass the global data pointer when invoking CTI. + (JSC::Machine::firstCallFrame): Added. Used to get the dynamic global + object, which is in the scope chain of the first call frame. + (JSC::Machine::cti_op_add): Use globalData instead of exec when + possible, to keep fast cases fast, since it's now more expensive to + get to it through the exec pointer. + (JSC::Machine::cti_timeout_check): Ditto. + (JSC::Machine::cti_op_put_by_id_second): Ditto. + (JSC::Machine::cti_op_get_by_id_second): Ditto. + (JSC::Machine::cti_op_mul): Ditto. + (JSC::Machine::cti_vm_compile): Ditto. + (JSC::Machine::cti_op_get_by_val): Ditto. + (JSC::Machine::cti_op_sub): Ditto. + (JSC::Machine::cti_op_put_by_val): Ditto. + (JSC::Machine::cti_op_put_by_val_array): Ditto. + (JSC::Machine::cti_op_negate): Ditto. + (JSC::Machine::cti_op_div): Ditto. + (JSC::Machine::cti_op_pre_dec): Ditto. + (JSC::Machine::cti_op_post_inc): Ditto. + (JSC::Machine::cti_op_lshift): Ditto. + (JSC::Machine::cti_op_bitand): Ditto. + (JSC::Machine::cti_op_rshift): Ditto. + (JSC::Machine::cti_op_bitnot): Ditto. + (JSC::Machine::cti_op_mod): Ditto. + (JSC::Machine::cti_op_post_dec): Ditto. + (JSC::Machine::cti_op_urshift): Ditto. + (JSC::Machine::cti_op_bitxor): Ditto. + (JSC::Machine::cti_op_bitor): Ditto. + (JSC::Machine::cti_op_call_eval): Ditto. + (JSC::Machine::cti_op_throw): Ditto. + (JSC::Machine::cti_op_is_string): Ditto. + (JSC::Machine::cti_op_debug): Ditto. + (JSC::Machine::cti_vm_throw): Ditto. + + * VM/Machine.h: Added firstCallFrame. + + * kjs/DebuggerCallFrame.cpp: + (JSC::DebuggerCallFrame::evaluate): Pass fewer arguments when + constructing ExecState. + + * kjs/ExecState.cpp: Deleted contents. Later we'll remove the + file altogether. + + * kjs/ExecState.h: Removed m_globalObject and m_globalData. + Moved CodeType into another header. + (JSC::ExecState::ExecState): Take only a single argument, a + call frame pointer. + (JSC::ExecState::dynamicGlobalObject): Get the object from + the first call frame since it's no longer stored. + (JSC::ExecState::globalData): Get the global data from the + scope chain, since we no longer store a pointer to it here. + (JSC::ExecState::identifierTable): Ditto. + (JSC::ExecState::propertyNames): Ditto. + (JSC::ExecState::emptyList): Ditto. + (JSC::ExecState::lexer): Ditto. + (JSC::ExecState::parser): Ditto. + (JSC::ExecState::machine): Ditto. + (JSC::ExecState::arrayTable): Ditto. + (JSC::ExecState::dateTable): Ditto. + (JSC::ExecState::mathTable): Ditto. + (JSC::ExecState::numberTable): Ditto. + (JSC::ExecState::regExpTable): Ditto. + (JSC::ExecState::regExpConstructorTable): Ditto. + (JSC::ExecState::stringTable): Ditto. + (JSC::ExecState::heap): Ditto. + + * kjs/FunctionConstructor.cpp: + (JSC::FunctionConstructor::FunctionConstructor): Pass + JSGlobalData* instead of ExecState* to the InternalFunction + constructor. + (JSC::constructFunction): Pass the global data pointer when + constructing a new scope chain. + + * kjs/InternalFunction.cpp: + (JSC::InternalFunction::InternalFunction): Take a JSGlobalData* + instead of an ExecState*. Later we can change more places to + work this way -- it's more efficient to take the type you need + since the caller might already have it. + * kjs/InternalFunction.h: Ditto. + + * kjs/JSCell.h: + (JSC::JSCell::operator new): Added an overload that takes a + JSGlobalData* so you can construct without an ExecState*. + + * kjs/JSGlobalObject.cpp: + (JSC::JSGlobalObject::init): Moved creation of the global scope + chain in here, since it now requires a pointer to the global data. + Moved the initialization of the call frame in here since it requires + the global scope chain node. Removed the extra argument to ExecState + when creating the global ExecState*. + * kjs/JSGlobalObject.h: Removed initialization of globalScopeChain + and the call frame from the JSGlobalObjectData constructor. Added + a thisValue argument to the init function. + + * kjs/JSNumberCell.cpp: Added versions of jsNumberCell that take + JSGlobalData* rather than ExecState*. + * kjs/JSNumberCell.h: + (JSC::JSNumberCell::operator new): Added a version that takes + JSGlobalData*. + (JSC::JSNumberCell::JSNumberCell): Ditto. + (JSC::jsNumber): Ditto. + * kjs/JSString.cpp: + (JSC::jsString): Ditto. + (JSC::jsSubstring): Ditto. + (JSC::jsOwnedString): Ditto. + * kjs/JSString.h: + (JSC::JSString::JSString): Changed to take JSGlobalData*. + (JSC::jsEmptyString): Added a version that takes JSGlobalData*. + (JSC::jsSingleCharacterString): Ditto. + (JSC::jsSingleCharacterSubstring): Ditto. + (JSC::jsNontrivialString): Ditto. + (JSC::JSString::getIndex): Ditto. + (JSC::jsString): Ditto. + (JSC::jsSubstring): Ditto. + (JSC::jsOwnedString): Ditto. + + * kjs/ScopeChain.h: Added a globalData pointer to each node. + (JSC::ScopeChainNode::ScopeChainNode): Initialize the globalData + pointer. + (JSC::ScopeChainNode::push): Set the global data pointer in the + new node. + (JSC::ScopeChain::ScopeChain): Take a globalData argument. + + * kjs/SmallStrings.cpp: + (JSC::SmallStrings::createEmptyString): Take JSGlobalData* instead of + ExecState*. + (JSC::SmallStrings::createSingleCharacterString): Ditto. + * kjs/SmallStrings.h: + (JSC::SmallStrings::emptyString): Ditto. + (JSC::SmallStrings::singleCharacterString): Ditto. + +2008-10-03 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Geoff Garen. + + Bug 21343: REGRESSSION (r37160): ecma_3/ExecutionContexts/10.1.3-1.js and js1_4/Functions/function-001.js fail on 64-bit + <https://bugs.webkit.org/show_bug.cgi?id=21343> + + Add a workaround for a bug in GCC, which affects GCC 4.0, GCC 4.2, and + llvm-gcc 4.2. I put it in an #ifdef because it was a slight regression + on SunSpider in 32-bit, although that might be entirely random. + + * kjs/Arguments.cpp: + (JSC::Arguments::getOwnPropertySlot): + +2008-10-03 Darin Adler <darin@apple.com> + + Rubber stamped by Alexey Proskuryakov. + + * kjs/Shell.cpp: (main): Don't delete JSGlobalData. Later, we need to change + this tool to use public JavaScriptCore API instead. + +2008-10-03 Darin Adler <darin@apple.com> + + Suggested by Alexey Proskuryakov. + + * kjs/JSGlobalData.cpp: + (JSC::JSGlobalData::~JSGlobalData): Remove call to heap.destroy() because + it's too late to ref the JSGlobalData object once it's already being + destroyed. In practice this is not a problem because WebCore's JSGlobalData + is never destroyed and JSGlobalContextRelease takes care of calling + heap.destroy() in advance. + +2008-10-02 Oliver Hunt <oliver@apple.com> + + Reviewed by Maciej Stachowiak. + + Replace SSE3 check with an SSE2 check, and implement SSE2 check on windows. + + 5.6% win on SunSpider on windows. + + * VM/CTI.cpp: + (JSC::isSSE2Present): + (JSC::CTI::compileBinaryArithOp): + (JSC::CTI::compileBinaryArithOpSlowCase): + +2008-10-03 Maciej Stachowiak <mjs@apple.com> + + Rubber stamped by Cameron Zwarich. + + - fix mistaken change of | to || which caused a big perf regression on EarleyBoyer + + * kjs/grammar.y: + +2008-10-02 Darin Adler <darin@apple.com> + + Reviewed by Geoff Garen. + + - https://bugs.webkit.org/show_bug.cgi?id=21321 + Bug 21321: speed up JavaScriptCore by inlining Heap in JSGlobalData + + 1.019x as fast on SunSpider. + + * API/JSBase.cpp: + (JSEvaluateScript): Use heap. instead of heap-> to work with the heap. + (JSCheckScriptSyntax): Ditto. + (JSGarbageCollect): Ditto. + (JSReportExtraMemoryCost): Ditto. + * API/JSContextRef.cpp: + (JSGlobalContextRetain): Ditto. + (JSGlobalContextRelease): Destroy the heap with the destroy function instead + of the delete operator. + (JSContextGetGlobalObject): Use heap. instead of heap-> to work with the heap. + * API/JSObjectRef.cpp: + (JSObjectMake): Use heap. instead of heap-> to work with the heap. + (JSObjectMakeFunctionWithCallback): Ditto. + (JSObjectMakeConstructor): Ditto. + (JSObjectMakeFunction): Ditto. + (JSObjectMakeArray): Ditto. + (JSObjectMakeDate): Ditto. + (JSObjectMakeError): Ditto. + (JSObjectMakeRegExp): Ditto. + (JSObjectHasProperty): Ditto. + (JSObjectGetProperty): Ditto. + (JSObjectSetProperty): Ditto. + (JSObjectGetPropertyAtIndex): Ditto. + (JSObjectSetPropertyAtIndex): Ditto. + (JSObjectDeleteProperty): Ditto. + (JSObjectCallAsFunction): Ditto. + (JSObjectCallAsConstructor): Ditto. + (JSObjectCopyPropertyNames): Ditto. + (JSPropertyNameAccumulatorAddName): Ditto. + * API/JSValueRef.cpp: + (JSValueIsEqual): Ditto. + (JSValueIsInstanceOfConstructor): Ditto. + (JSValueMakeNumber): Ditto. + (JSValueMakeString): Ditto. + (JSValueToNumber): Ditto. + (JSValueToStringCopy): Ditto. + (JSValueToObject): Ditto. + (JSValueProtect): Ditto. + (JSValueUnprotect): Ditto. + + * kjs/ExecState.h: + (JSC::ExecState::heap): Update to use the & operator. + + * kjs/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): Update to initialize a heap member + instead of calling new to make a heap. + (JSC::JSGlobalData::~JSGlobalData): Destroy the heap with the destroy + function instead of the delete operator. + * kjs/JSGlobalData.h: Change from Heap* to a Heap. + * kjs/JSGlobalObject.cpp: + (JSC::JSGlobalObject::mark): Use the & operator here. + (JSC::JSGlobalObject::operator new): Use heap. instead of heap-> to work + with the heap. + +2008-10-02 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Geoff Garen. + + Bug 21317: Replace RegisterFile size and capacity information with Register pointers + <https://bugs.webkit.org/show_bug.cgi?id=21317> + + This is a 2.3% speedup on the V8 DeltaBlue benchmark, a 3.3% speedup on + the V8 Raytrace benchmark, and a 1.0% speedup on SunSpider. + + * VM/Machine.cpp: + (JSC::slideRegisterWindowForCall): + (JSC::Machine::callEval): + (JSC::Machine::execute): + (JSC::Machine::privateExecute): + (JSC::Machine::cti_op_call_JSFunction): + (JSC::Machine::cti_op_construct_JSConstruct): + * VM/RegisterFile.cpp: + (JSC::RegisterFile::~RegisterFile): + * VM/RegisterFile.h: + (JSC::RegisterFile::RegisterFile): + (JSC::RegisterFile::start): + (JSC::RegisterFile::end): + (JSC::RegisterFile::size): + (JSC::RegisterFile::shrink): + (JSC::RegisterFile::grow): + (JSC::RegisterFile::lastGlobal): + (JSC::RegisterFile::markGlobals): + (JSC::RegisterFile::markCallFrames): + * kjs/JSGlobalObject.cpp: + (JSC::JSGlobalObject::copyGlobalsTo): + +2008-10-02 Cameron Zwarich <zwarich@apple.com> + + Rubber-stamped by Darin Adler. + + Change bitwise operations introduced in r37166 to boolean operations. We + only use bitwise operations over boolean operations for increasing + performance in extremely hot code, but that does not apply to anything + in the parser. + + * kjs/grammar.y: + +2008-10-02 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Darin Adler. + + Fix for bug #21232 - should reset m_isPendingDash on flush, + and should allow '\-' as beginning or end of a range (though + not to specifiy a range itself). + + * ChangeLog: + * wrec/CharacterClassConstructor.cpp: + (JSC::CharacterClassConstructor::put): + (JSC::CharacterClassConstructor::flush): + * wrec/CharacterClassConstructor.h: + (JSC::CharacterClassConstructor::flushBeforeEscapedHyphen): + * wrec/WREC.cpp: + (JSC::WRECGenerator::generateDisjunction): + (JSC::WRECParser::parseCharacterClass): + (JSC::WRECParser::parseDisjunction): + * wrec/WREC.h: + +2008-10-02 Darin Adler <darin@apple.com> + + Reviewed by Sam Weinig. + + - remove the "static" from declarations in a header file, since we + don't want them to have internal linkage + + * VM/Machine.h: Remove the static keyword from the constant and the + three inline functions that Geoff just moved here. + +2008-10-02 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Fixed https://bugs.webkit.org/show_bug.cgi?id=21283. + Profiler Crashes When Started + + * VM/Machine.cpp: + * VM/Machine.h: + (JSC::makeHostCallFramePointer): + (JSC::isHostCallFrame): + (JSC::stripHostCallFrameBit): Moved some things to the header so + JSGlobalObject could use them. + + * kjs/JSGlobalObject.h: + (JSC::JSGlobalObject::JSGlobalObjectData::JSGlobalObjectData): Call the + new makeHostCallFramePointer API, since 0 no longer indicates a host + call frame. + +2008-10-02 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Darin Adler. + + https://bugs.webkit.org/show_bug.cgi?id=21304 + Stop using a static wrapper map for WebCore JS bindings + + * kjs/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + (JSC::JSGlobalData::~JSGlobalData): + (JSC::JSGlobalData::ClientData::~ClientData): + * kjs/JSGlobalData.h: + Added a client data member to JSGlobalData. WebCore will use it to store bindings-related + global data. + + * JavaScriptCore.exp: Export virtual ClientData destructor. + +2008-10-02 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Try to fix Qt build. + + * kjs/Error.h: + +2008-10-01 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Darin Adler and Cameron Zwarich. + + Preliminary step toward dynamic recompilation: Standardized and + simplified the parsing interface. + + The main goal in this patch is to make it easy to ask for a duplicate + compilation, and get back a duplicate result -- same source URL, same + debugger / profiler ID, same toString behavior, etc. + + The basic unit of compilation and evaluation is now SourceCode, which + encompasses a SourceProvider, a range in that provider, and a starting + line number. + + A SourceProvider now encompasses a source URL, and *is* a source ID, + since a pointer is a unique identifier. + + * API/JSBase.cpp: + (JSEvaluateScript): + (JSCheckScriptSyntax): Provide a SourceCode to the Interpreter, since + other APIs are no longer supported. + + * VM/CodeBlock.h: + (JSC::EvalCodeCache::get): Provide a SourceCode to the Interpreter, since + other APIs are no longer supported. + (JSC::CodeBlock::CodeBlock): ASSERT something that used to be ASSERTed + by our caller -- this is a better bottleneck. + + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::CodeGenerator): Updated for the fact that + FunctionBodyNode's parameters are no longer a WTF::Vector. + + * kjs/Arguments.cpp: + (JSC::Arguments::Arguments): ditto + + * kjs/DebuggerCallFrame.cpp: + (JSC::DebuggerCallFrame::evaluate): Provide a SourceCode to the Parser, + since other APIs are no longer supported. + + * kjs/FunctionConstructor.cpp: + (JSC::constructFunction): Provide a SourceCode to the Parser, since + other APIs are no longer supported. Adopt FunctionBodyNode's new + "finishParsing" API. + + * kjs/JSFunction.cpp: + (JSC::JSFunction::lengthGetter): + (JSC::JSFunction::getParameterName): Updated for the fact that + FunctionBodyNode's parameters are no longer a wtf::Vector. + + * kjs/JSFunction.h: Nixed some cruft. + + * kjs/JSGlobalObjectFunctions.cpp: + (JSC::globalFuncEval): Provide a SourceCode to the Parser, since + other APIs are no longer supported. + + * kjs/Parser.cpp: + (JSC::Parser::parse): Require a SourceCode argument, instead of a bunch + of broken out parameters. Stop tracking sourceId as an integer, since we + use the SourceProvider pointer for this now. Don't clamp the + startingLineNumber, since SourceCode does that now. + + * kjs/Parser.h: + (JSC::Parser::parse): Standardized the parsing interface to require a + SourceCode. + + * kjs/Shell.cpp: + (functionRun): + (functionLoad): + (prettyPrintScript): + (runWithScripts): + (runInteractive): Provide a SourceCode to the Interpreter, since + other APIs are no longer supported. + + * kjs/SourceProvider.h: + (JSC::SourceProvider::SourceProvider): + (JSC::SourceProvider::url): + (JSC::SourceProvider::asId): + (JSC::UStringSourceProvider::create): + (JSC::UStringSourceProvider::UStringSourceProvider): Added new + responsibilities described above. + + * kjs/SourceRange.h: + (JSC::SourceCode::SourceCode): + (JSC::SourceCode::toString): + (JSC::SourceCode::provider): + (JSC::SourceCode::firstLine): + (JSC::SourceCode::data): + (JSC::SourceCode::length): Added new responsibilities described above. + Renamed SourceRange to SourceCode, based on review feedback. Added + a makeSource function for convenience. + + * kjs/debugger.h: Provide a SourceCode to the client, since other APIs + are no longer supported. + + * kjs/grammar.y: Provide startingLineNumber when creating a SourceCode. + + * kjs/debugger.h: Treat sourceId as intptr_t to avoid loss of precision + on 64bit platforms. + + * kjs/interpreter.cpp: + (JSC::Interpreter::checkSyntax): + (JSC::Interpreter::evaluate): + * kjs/interpreter.h: Require a SourceCode instead of broken out arguments. + + * kjs/lexer.cpp: + (JSC::Lexer::setCode): + * kjs/lexer.h: + (JSC::Lexer::sourceRange): Fold together the SourceProvider and line number + into a SourceCode. Fixed a bug where the Lexer would accidentally keep + alive the last SourceProvider forever. + + * kjs/nodes.cpp: + (JSC::ScopeNode::ScopeNode): + (JSC::ProgramNode::ProgramNode): + (JSC::ProgramNode::create): + (JSC::EvalNode::EvalNode): + (JSC::EvalNode::generateCode): + (JSC::EvalNode::create): + (JSC::FunctionBodyNode::FunctionBodyNode): + (JSC::FunctionBodyNode::finishParsing): + (JSC::FunctionBodyNode::create): + (JSC::FunctionBodyNode::generateCode): + (JSC::ProgramNode::generateCode): + (JSC::FunctionBodyNode::paramString): + * kjs/nodes.h: + (JSC::ScopeNode::): + (JSC::ScopeNode::sourceId): + (JSC::FunctionBodyNode::): + (JSC::FunctionBodyNode::parameterCount): + (JSC::FuncExprNode::): + (JSC::FuncDeclNode::): Store a SourceCode in all ScopeNodes, since + SourceCode is now responsible for tracking URL, ID, etc. Streamlined + some ad hoc FunctionBodyNode fixups into a "finishParsing" function, to + help make clear what you need to do in order to finish parsing a + FunctionBodyNode. + + * wtf/Vector.h: + (WTF::::releaseBuffer): Don't ASSERT that releaseBuffer() is only called + when buffer is not 0, since FunctionBodyNode is more than happy + to get back a 0 buffer, and other functions like RefPtr::release() allow + for 0, too. + +2008-10-01 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Maciej Stachowiak. + + Bug 21289: REGRESSION (r37160): Inspector crashes on load + <https://bugs.webkit.org/show_bug.cgi?id=21289> + + The code in Arguments::mark() in r37160 was wrong. It marks indices in + d->registers, but that makes no sense (they are local variables, not + arguments). It should mark those indices in d->registerArray instead. + + This patch also changes Arguments::copyRegisters() to use d->numParameters + instead of recomputing it. + + * kjs/Arguments.cpp: + (JSC::Arguments::mark): + * kjs/Arguments.h: + (JSC::Arguments::copyRegisters): + +2008-09-30 Darin Adler <darin@apple.com> + + Reviewed by Eric Seidel. + + - https://bugs.webkit.org/show_bug.cgi?id=21214 + work on getting rid of ExecState + + Eliminate some unneeded uses of dynamicGlobalObject. + + * API/JSClassRef.cpp: + (OpaqueJSClass::contextData): Changed to use a map in the global data instead + of on the global object. Also fixed to use only a single hash table lookup. + + * API/JSObjectRef.cpp: + (JSObjectMakeConstructor): Use lexicalGlobalObject rather than dynamicGlobalObject + to get the object prototype. + + * kjs/ArrayPrototype.cpp: + (JSC::arrayProtoFuncToString): Use arrayVisitedElements set in global data rather + than in the global object. + (JSC::arrayProtoFuncToLocaleString): Ditto. + (JSC::arrayProtoFuncJoin): Ditto. + + * kjs/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): Don't initialize opaqueJSClassData, since + it's no longer a pointer. + (JSC::JSGlobalData::~JSGlobalData): We still need to delete all the values, but + we don't need to delete the map since it's no longer a pointer. + + * kjs/JSGlobalData.h: Made opaqueJSClassData a map instead of a pointer to a map. + Also added arrayVisitedElements. + + * kjs/JSGlobalObject.h: Removed arrayVisitedElements. + + * kjs/Shell.cpp: + (functionRun): Use lexicalGlobalObject instead of dynamicGlobalObject. + (functionLoad): Ditto. + +2008-10-01 Cameron Zwarich <zwarich@apple.com> + + Not reviewed. + + Speculative Windows build fix. + + * kjs/grammar.y: + +2008-10-01 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Darin Adler. + + Bug 21123: using "arguments" in a function should not force creation of an activation object + <https://bugs.webkit.org/show_bug.cgi?id=21123> + + Make the 'arguments' object not require a JSActivation. We store the + 'arguments' object in the OptionalCalleeArguments call frame slot. We + need to be able to get the original 'arguments' object to tear it off + when returning from a function, but 'arguments' may be assigned to in a + number of ways. + + Therefore, we use the OptionalCalleeArguments slot when we want to get + the original activation or we know that 'arguments' was not assigned a + different value. When 'arguments' may have been assigned a new value, + we use a new local variable that is initialized with 'arguments'. Since + a function parameter named 'arguments' may overwrite the value of + 'arguments', we also need to be careful to look up 'arguments' in the + symbol table, so we get the parameter named 'arguments' instead of the + local variable that we have added for holding the 'arguments' object. + + This is a 19.1% win on the V8 Raytrace benchmark using the SunSpider + harness, and a 20.7% win using the V8 harness. This amounts to a 6.5% + total speedup on the V8 benchmark suite using the V8 harness. + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): + * VM/CodeBlock.h: + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::CodeGenerator): + * VM/Machine.cpp: + (JSC::Machine::unwindCallFrame): + (JSC::Machine::privateExecute): + (JSC::Machine::retrieveArguments): + (JSC::Machine::cti_op_init_arguments): + (JSC::Machine::cti_op_ret_activation_arguments): + * VM/Machine.h: + * VM/RegisterFile.h: + (JSC::RegisterFile::): + * kjs/Arguments.cpp: + (JSC::Arguments::mark): + (JSC::Arguments::fillArgList): + (JSC::Arguments::getOwnPropertySlot): + (JSC::Arguments::put): + * kjs/Arguments.h: + (JSC::Arguments::setRegisters): + (JSC::Arguments::init): + (JSC::Arguments::Arguments): + (JSC::Arguments::copyRegisters): + (JSC::JSActivation::copyRegisters): + * kjs/JSActivation.cpp: + (JSC::JSActivation::argumentsGetter): + * kjs/JSActivation.h: + (JSC::JSActivation::JSActivationData::JSActivationData): + * kjs/grammar.y: + * kjs/nodes.h: + (JSC::ScopeNode::setUsesArguments): + * masm/X86Assembler.h: + (JSC::X86Assembler::): + (JSC::X86Assembler::orl_mr): + +2008-10-01 Kevin McCullough <kmccullough@apple.com> + + Rubberstamped by Geoff Garen. + + Remove BreakpointCheckStatement because it's not used anymore. + No effect on sunspider or the jsc tests. + + * kjs/nodes.cpp: + * kjs/nodes.h: + +2008-09-30 Oliver Hunt <oliver@apple.com> + + Reviewed by Geoff Garen. + + Improve performance of CTI on windows. + + Currently on platforms where the compiler doesn't allow us to safely + index relative to the address of a parameter we need to actually + provide a pointer to CTI runtime call arguments. This patch improves + performance in this case by making the CTI logic for restoring this + parameter much less conservative by only resetting it before we actually + make a call, rather than between each and every SF bytecode we generate + code for. + + This results in a 3.6% progression on the v8 benchmark when compiled with MSVC. + + * VM/CTI.cpp: + (JSC::CTI::emitCall): + (JSC::CTI::compileOpCall): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + (JSC::CTI::privateCompilePutByIdTransition): + * VM/CTI.h: + * masm/X86Assembler.h: + * wtf/Platform.h: + +2008-09-30 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Oliver Hunt. + + - track uses of "this", "with" and "catch" in the parser + + Knowing this up front will be useful for future optimizations. + + Perf and correctness remain the same. + + * kjs/NodeInfo.h: + * kjs/grammar.y: + +2008-09-30 Sam Weinig <sam@webkit.org> + + Reviewed by Mark Rowe. + + Add WebKitAvailability macros for JSObjectMakeArray, JSObjectMakeDate, JSObjectMakeError, + and JSObjectMakeRegExp + + * API/JSObjectRef.h: + +2008-09-30 Darin Adler <darin@apple.com> + + Reviewed by Geoff Garen. + + - https://bugs.webkit.org/show_bug.cgi?id=21214 + work on getting rid of ExecState + + Replaced the m_prev field of ExecState with a bit in the + call frame pointer to indicate "host" call frames. + + * VM/Machine.cpp: + (JSC::makeHostCallFramePointer): Added. Sets low bit. + (JSC::isHostCallFrame): Added. Checks low bit. + (JSC::stripHostCallFrameBit): Added. Clears low bit. + (JSC::Machine::unwindCallFrame): Replaced null check that was + formerly used to detect host call frames with an isHostCallFrame check. + (JSC::Machine::execute): Pass in a host call frame pointer rather than + always passing 0 when starting execution from the host. This allows us + to follow the entire call frame pointer chain when desired, or to stop + at the host calls when that's desired. + (JSC::Machine::privateExecute): Replaced null check that was + formerly used to detect host call frames with an isHostCallFrame check. + (JSC::Machine::retrieveCaller): Ditto. + (JSC::Machine::retrieveLastCaller): Ditto. + (JSC::Machine::callFrame): Removed the code to walk up m_prev pointers + and replaced it with code that uses the caller pointer and uses the + stripHostCallFrameBit function. + + * kjs/ExecState.cpp: Removed m_prev. + * kjs/ExecState.h: Ditto. + +2008-09-30 Cameron Zwarich <zwarich@apple.com> + + Reviewed by Geoff Garen. + + Move all detection of 'arguments' in a lexical scope to the parser, in + preparation for fixing + + Bug 21123: using "arguments" in a function should not force creation of an activation object + <https://bugs.webkit.org/show_bug.cgi?id=21123> + + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::CodeGenerator): + * kjs/NodeInfo.h: + * kjs/grammar.y: + +2008-09-30 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + * kjs/Shell.cpp: + (runWithScripts): Fixed indentation. + +2008-09-30 Mark Rowe <mrowe@apple.com> + + Rubber-stamped by Sam Weinig. + + Build fix. Move InternalFunction::classInfo implementation into the .cpp + file to prevent the vtable for InternalFunction being generated as a weak symbol. + Has no effect on SunSpider. + + * kjs/InternalFunction.cpp: + (JSC::InternalFunction::classInfo): + * kjs/InternalFunction.h: + +2008-09-29 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Darin Adler. + + - optimize appending a number to a string + https://bugs.webkit.org/show_bug.cgi?id=21203 + + It's pretty common in real-world code (and on some of the v8 + benchmarks) to append a number to a string, so I made this one of + the fast cases, and also added support to UString to do it + directly without allocating a temporary UString. + + ~1% speedup on v8 benchmark. + + * VM/Machine.cpp: + (JSC::jsAddSlowCase): Make this NEVER_INLINE because somehow otherwise + the change is a regression. + (JSC::jsAdd): Handle number + string special case. + (JSC::Machine::cti_op_add): Integrate much of the logic of jsAdd to + avoid exception check in the str + str, num + num and str + num cases. + * kjs/ustring.cpp: + (JSC::expandedSize): Make this a non-member function, since it needs to be + called in non-member functions but not outside this file. + (JSC::expandCapacity): Ditto. + (JSC::UString::expandCapacity): Call the non-member version. + (JSC::createRep): Helper to make a rep from a char*. + (JSC::UString::UString): Use above helper. + (JSC::concatenate): Guts of concatenating constructor for cases where first + item is a UString::Rep, and second is a UChar* and length, or a char*. + (JSC::UString::append): Implement for cases where first item is a UString::Rep, + and second is an int or double. Sadly duplicates logic of UString::from(int) + and UString::from(double). + * kjs/ustring.h: + +2008-09-29 Darin Adler <darin@apple.com> + + Reviewed by Sam Weinig. + + - https://bugs.webkit.org/show_bug.cgi?id=21214 + work on getting rid of ExecState + + * JavaScriptCore.exp: Updated since JSGlobalObject::init + no longer takes a parameter. + + * VM/Machine.cpp: + (JSC::Machine::execute): Removed m_registerFile argument + for ExecState constructors. + + * kjs/DebuggerCallFrame.cpp: + (JSC::DebuggerCallFrame::evaluate): Removed globalThisValue + argument for ExecState constructor. + + * kjs/ExecState.cpp: + (JSC::ExecState::ExecState): Removed globalThisValue and + registerFile arguments to constructors. + + * kjs/ExecState.h: Removed m_globalThisValue and + m_registerFile data members. + + * kjs/JSGlobalObject.cpp: + (JSC::JSGlobalObject::init): Removed globalThisValue + argument for ExecState constructor. + + * kjs/JSGlobalObject.h: + (JSC::JSGlobalObject::JSGlobalObject): Got rid of parameter + for the init function. + +2008-09-29 Geoffrey Garen <ggaren@apple.com> + + Rubber-stamped by Cameron Zwarich. + + Fixed https://bugs.webkit.org/show_bug.cgi?id=21225 + Machine::retrieveLastCaller should check for a NULL codeBlock + + In order to crash, you would need to call retrieveCaller in a situation + where you had two host call frames in a row in the register file. I + don't know how to make that happen, or if it's even possible, so I don't + have a test case -- but better safe than sorry! + + * VM/Machine.cpp: + (JSC::Machine::retrieveLastCaller): + +2008-09-29 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Cameron Zwarich. + + Store the callee ScopeChain, not the caller ScopeChain, in the call frame + header. Nix the "scopeChain" local variable and ExecState::m_scopeChain, and + access the callee ScopeChain through the call frame header instead. + + Profit: call + return are simpler, because they don't have to update the + "scopeChain" local variable, or ExecState::m_scopeChain. + + Because CTI keeps "r" in a register, reading the callee ScopeChain relative + to "r" can be very fast, in any cases we care to optimize. + + 0% speedup on empty function call benchmark. (5.5% speedup in bytecode.) + 0% speedup on SunSpider. (7.5% speedup on controlflow-recursive.) + 2% speedup on SunSpider --v8. + 2% speedup on v8 benchmark. + + * VM/CTI.cpp: Changed scope chain access to read the scope chain from + the call frame header. Sped up op_ret by changing it not to fuss with + the "scopeChain" local variable or ExecState::m_scopeChain. + + * VM/CTI.h: Updated CTI trampolines not to take a ScopeChainNode* + argument, since that's stored in the call frame header now. + + * VM/Machine.cpp: Access "scopeChain" and "codeBlock" through new helper + functions that read from the call frame header. Updated functions operating + on ExecState::m_callFrame to account for / take advantage of the fact that + Exec:m_callFrame is now never NULL. + + Fixed a bug in op_construct, where it would use the caller's default + object prototype, rather than the callee's, when constructing a new object. + + * VM/Machine.h: Made some helper functions available. Removed + ScopeChainNode* arguments to a lot of functions, since the ScopeChainNode* + is now stored in the call frame header. + + * VM/RegisterFile.h: Renamed "CallerScopeChain" to "ScopeChain", since + that's what it is now. + + * kjs/DebuggerCallFrame.cpp: Updated for change to ExecState signature. + + * kjs/ExecState.cpp: + * kjs/ExecState.h: Nixed ExecState::m_callFrame, along with the unused + isGlobalObject function. + + * kjs/JSGlobalObject.cpp: + * kjs/JSGlobalObject.h: Gave the global object a fake call frame in + which to store the global scope chain, since our code now assumes that + it can always read the scope chain out of the ExecState's call frame. + +2008-09-29 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Sam Weinig. + + Remove the isActivationObject() virtual method on JSObject and use + StructureID information instead. This should be slightly faster, but + isActivationObject() is only used in assertions and unwinding the stack + for exceptions. + + * VM/Machine.cpp: + (JSC::depth): + (JSC::Machine::unwindCallFrame): + (JSC::Machine::privateExecute): + (JSC::Machine::cti_op_ret_activation): + * kjs/JSActivation.cpp: + * kjs/JSActivation.h: + * kjs/JSObject.h: + +2008-09-29 Peter Gal <galpeter@inf.u-szeged.hu> + + Reviewed and tweaked by Darin Adler. + + Fix build for non-all-in-one platforms. + + * kjs/StringPrototype.cpp: Added missing ASCIICType.h include. + +2008-09-29 Bradley T. Hughes <bradley.hughes@nokia.com> + + Reviewed by Simon Hausmann. + + Fix compilation with icpc + + * wtf/HashSet.h: + (WTF::::find): + (WTF::::contains): + +2008-09-29 Thiago Macieira <thiago.macieira@nokia.com> + + Reviewed by Simon Hausmann. + + Changed copyright from Trolltech ASA to Nokia. + + Nokia acquired Trolltech ASA, assets were transferred on September 26th 2008. + + + * wtf/qt/MainThreadQt.cpp: + +2008-09-29 Simon Hausmann <hausmann@webkit.org> + + Reviewed by Lars Knoll. + + Don't accidentially install libJavaScriptCore.a for the build inside + Qt. + + * JavaScriptCore.pro: + +2008-09-28 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Maciej Stachowiak. + + Bug 21200: Allow direct access to 'arguments' without using op_resolve + <https://bugs.webkit.org/show_bug.cgi?id=21200> + + Allow fast access to the 'arguments' object by adding an extra slot to + the callframe to store it. + + This is a 3.0% speedup on the V8 Raytrace benchmark. + + * JavaScriptCore.exp: + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): + * VM/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::CodeGenerator): + (JSC::CodeGenerator::registerFor): + * VM/CodeGenerator.h: + (JSC::CodeGenerator::registerFor): + * VM/Machine.cpp: + (JSC::Machine::initializeCallFrame): + (JSC::Machine::dumpRegisters): + (JSC::Machine::privateExecute): + (JSC::Machine::retrieveArguments): + (JSC::Machine::cti_op_call_JSFunction): + (JSC::Machine::cti_op_create_arguments): + (JSC::Machine::cti_op_construct_JSConstruct): + * VM/Machine.h: + * VM/Opcode.h: + * VM/RegisterFile.h: + (JSC::RegisterFile::): + * kjs/JSActivation.cpp: + (JSC::JSActivation::mark): + (JSC::JSActivation::argumentsGetter): + * kjs/JSActivation.h: + (JSC::JSActivation::JSActivationData::JSActivationData): + * kjs/NodeInfo.h: + * kjs/Parser.cpp: + (JSC::Parser::didFinishParsing): + * kjs/Parser.h: + (JSC::Parser::parse): + * kjs/grammar.y: + * kjs/nodes.cpp: + (JSC::ScopeNode::ScopeNode): + (JSC::ProgramNode::ProgramNode): + (JSC::ProgramNode::create): + (JSC::EvalNode::EvalNode): + (JSC::EvalNode::create): + (JSC::FunctionBodyNode::FunctionBodyNode): + (JSC::FunctionBodyNode::create): + * kjs/nodes.h: + (JSC::ScopeNode::usesArguments): + +2008-09-28 Mark Rowe <mrowe@apple.com> + + Reviewed by Sam Weinig. + + Add an ASCII fast-path to toLowerCase and toUpperCase. + + The fast path speeds up the common case of an ASCII-only string by up to 60% while adding a less than 5% penalty + to the less common non-ASCII case. + + This also removes stringProtoFuncToLocaleLowerCase and stringProtoFuncToLocaleUpperCase, which were identical + to the non-locale variants of the functions. toLocaleLowerCase and toLocaleUpperCase now use the non-locale + variants of the functions directly. + + * kjs/StringPrototype.cpp: + (JSC::stringProtoFuncToLowerCase): + (JSC::stringProtoFuncToUpperCase): + +2008-09-28 Mark Rowe <mrowe@apple.com> + + Reviewed by Cameron Zwarich. + + Speed up parseInt and parseFloat. + + Repeatedly indexing into a UString is slow, so retrieve a pointer into the underlying buffer once up front + and use that instead. This is a 7% win on a parseInt/parseFloat micro-benchmark. + + * kjs/JSGlobalObjectFunctions.cpp: + (JSC::parseInt): + (JSC::parseFloat): + +2008-09-28 Simon Hausmann <hausmann@webkit.org> + + Reviewed by David Hyatt. + + In Qt's initializeThreading re-use an existing thread identifier for the main + thread if it exists. + + currentThread() implicitly creates new identifiers and it could be that + it is called before initializeThreading(). + + * wtf/ThreadingQt.cpp: + (WTF::initializeThreading): + +2008-09-27 Keishi Hattori <casey.hattori@gmail.com> + + Added Machine::retrieveCaller to the export list. + + Reviewed by Kevin McCullough and Tim Hatcher. + + * JavaScriptCore.exp: Added Machine::retrieveCaller. + +2008-09-27 Anders Carlsson <andersca@apple.com> + + Fix build. + + * VM/CTI.cpp: + (JSC::): + +2008-09-27 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Cameron Zwarich. + + https://bugs.webkit.org/show_bug.cgi?id=21175 + + Store the callee CodeBlock, not the caller CodeBlock, in the call frame + header. Nix the "codeBlock" local variable, and access the callee + CodeBlock through the call frame header instead. + + Profit: call + return are simpler, because they don't have to update the + "codeBlock" local variable. + + Because CTI keeps "r" in a register, reading the callee CodeBlock relative + to "r" can be very fast, in any cases we care to optimize. Presently, + no such cases seem important. + + Also, stop writing "dst" to the call frame header. CTI doesn't use it. + + 21.6% speedup on empty function call benchmark. + 3.8% speedup on SunSpider --v8. + 2.1% speedup on v8 benchmark. + 0.7% speedup on SunSpider (6% speedup on controlflow-recursive). + + Small regression in bytecode, because currently every op_ret reads the + callee CodeBlock to check needsFullScopeChain, and bytecode does not + keep "r" in a register. On-balance, this is probably OK, since CTI is + our high-performance execution model. Also, this should go away once + we make needsFullScopeChain statically determinable at parse time. + + * VM/CTI.cpp: + (JSC::CTI::compileOpCall): The speedup! + (JSC::CTI::privateCompileSlowCases): ditto + + * VM/CTI.h: + (JSC::): Fixed up magic trampoline constants to account for the nixed + "codeBlock" argument. + (JSC::CTI::execute): Changed trampoline function not to take a "codeBlock" + argument, since codeBlock is now stored in the call frame header. + + * VM/Machine.cpp: Read the callee CodeBlock from the register file. Use + a NULL CallerRegisters in the call frame header to signal a built-in + caller, since CodeBlock is now never NULL. + + * VM/Machine.h: Made some stand-alone functions Machine member functions + so they could call the private codeBlock() accessor in the Register + class, of which Machine is a friend. Renamed "CallerCodeBlock" to + "CodeBlock", since it's no longer the caller's CodeBlock. + + * VM/RegisterFile.h: Marked some methods const to accommodate a + const RegisterFile* being passed around in Machine.cpp. + +2008-09-26 Jan Michael Alonzo <jmalonzo@webkit.org> + + Gtk build fix. Not reviewed. + + Narrow-down the target of the JavaScriptCore .lut.h generator so + it won't try to create the WebCore .lut.hs. + + * GNUmakefile.am: + +2008-09-26 Matt Lilek <webkit@mattlilek.com> + + Reviewed by Tim Hatcher. + + Update FEATURE_DEFINES after ENABLE_CROSS_DOCUMENT_MESSAGING was removed. + + * Configurations/JavaScriptCore.xcconfig: + +2008-09-26 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Rubber-stamped by Anders Carlson. + + Change the name 'sc' to 'scopeChainNode' in a few places. + + * kjs/nodes.cpp: + (JSC::EvalNode::generateCode): + (JSC::FunctionBodyNode::generateCode): + (JSC::ProgramNode::generateCode): + +2008-09-26 Sam Weinig <sam@webkit.org> + + Reviewed by Darin Adler. + + Patch for https://bugs.webkit.org/show_bug.cgi?id=21152 + Speedup static property get/put + + Convert getting/setting static property values to use static functions + instead of storing an integer and switching in getValueProperty/putValueProperty. + + * kjs/JSObject.cpp: + (JSC::JSObject::deleteProperty): + (JSC::JSObject::getPropertyAttributes): + * kjs/MathObject.cpp: + (JSC::MathObject::getOwnPropertySlot): + * kjs/NumberConstructor.cpp: + (JSC::numberConstructorNaNValue): + (JSC::numberConstructorNegInfinity): + (JSC::numberConstructorPosInfinity): + (JSC::numberConstructorMaxValue): + (JSC::numberConstructorMinValue): + * kjs/PropertySlot.h: + (JSC::PropertySlot::): + * kjs/RegExpConstructor.cpp: + (JSC::regExpConstructorDollar1): + (JSC::regExpConstructorDollar2): + (JSC::regExpConstructorDollar3): + (JSC::regExpConstructorDollar4): + (JSC::regExpConstructorDollar5): + (JSC::regExpConstructorDollar6): + (JSC::regExpConstructorDollar7): + (JSC::regExpConstructorDollar8): + (JSC::regExpConstructorDollar9): + (JSC::regExpConstructorInput): + (JSC::regExpConstructorMultiline): + (JSC::regExpConstructorLastMatch): + (JSC::regExpConstructorLastParen): + (JSC::regExpConstructorLeftContext): + (JSC::regExpConstructorRightContext): + (JSC::setRegExpConstructorInput): + (JSC::setRegExpConstructorMultiline): + (JSC::RegExpConstructor::setInput): + (JSC::RegExpConstructor::setMultiline): + (JSC::RegExpConstructor::multiline): + * kjs/RegExpConstructor.h: + * kjs/RegExpObject.cpp: + (JSC::regExpObjectGlobal): + (JSC::regExpObjectIgnoreCase): + (JSC::regExpObjectMultiline): + (JSC::regExpObjectSource): + (JSC::regExpObjectLastIndex): + (JSC::setRegExpObjectLastIndex): + * kjs/RegExpObject.h: + (JSC::RegExpObject::setLastIndex): + (JSC::RegExpObject::lastIndex): + (JSC::RegExpObject::RegExpObjectData::RegExpObjectData): + * kjs/StructureID.cpp: + (JSC::StructureID::getEnumerablePropertyNames): + * kjs/create_hash_table: + * kjs/lexer.cpp: + (JSC::Lexer::lex): + * kjs/lookup.cpp: + (JSC::HashTable::createTable): + (JSC::HashTable::deleteTable): + (JSC::setUpStaticFunctionSlot): + * kjs/lookup.h: + (JSC::HashEntry::initialize): + (JSC::HashEntry::setKey): + (JSC::HashEntry::key): + (JSC::HashEntry::attributes): + (JSC::HashEntry::function): + (JSC::HashEntry::functionLength): + (JSC::HashEntry::propertyGetter): + (JSC::HashEntry::propertyPutter): + (JSC::HashEntry::lexerValue): + (JSC::HashEntry::): + (JSC::HashTable::entry): + (JSC::getStaticPropertySlot): + (JSC::getStaticValueSlot): + (JSC::lookupPut): + +2008-09-26 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Maciej Stachowiak & Oliver Hunt. + + Add support for reusing temporary JSNumberCells. This change is based on the observation + that if the result of certain operations is a JSNumberCell and is consumed by a subsequent + operation that would produce a JSNumberCell, we can reuse the object rather than allocating + a fresh one. E.g. given the expression ((a * b) * c), we can statically determine that + (a * b) will have a numeric result (or else it will have thrown an exception), so the result + will either be a JSNumberCell or a JSImmediate. + + This patch changes three areas of JSC: + * The AST now tracks type information about the result of each node. + * This information is consumed in bytecode compilation, and certain bytecode operations + now carry the statically determined type information about their operands. + * CTI uses the information in a number of fashions: + * Where an operand to certain arithmetic operations is reusable, it will plant code + to try to perform the operation in JIT code & reuse the cell, where appropriate. + * Where it can be statically determined that an operand can only be numeric (typically + the result of another arithmetic operation) the code will not redundantly check that + the JSCell is a JSNumberCell. + * Where either of the operands to an add are non-numeric do not plant an optimized + arithmetic code path, just call straight out to the C function. + + +6% Sunspider (10% progression on 3D, 16% progression on math, 60% progression on access-nbody), + +1% v8-tests (improvements in raytrace & crypto) + + * VM/CTI.cpp: Add optimized code generation with reuse of temporary JSNumberCells. + * VM/CTI.h: + * kjs/JSNumberCell.h: + * masm/X86Assembler.h: + + * VM/CodeBlock.cpp: Add type information to specific bytecodes. + * VM/CodeGenerator.cpp: + * VM/CodeGenerator.h: + * VM/Machine.cpp: + + * kjs/nodes.cpp: Track static type information for nodes. + * kjs/nodes.h: + * kjs/ResultDescriptor.h: (Added) + * JavaScriptCore.xcodeproj/project.pbxproj: + +2008-09-26 Yichao Yin <yichao.yin@torchmobile.com.cn> + + Reviewed by George Staikos, Maciej Stachowiak. + + Add utility functions needed for upcoming WML code. + + * wtf/ASCIICType.h: + (WTF::isASCIIPrintable): + +2008-09-26 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Darin Adler. + + Reverted the part of r36614 that used static data because static data + is not thread-safe. + +2008-09-26 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Maciej Stachowiak. + + Removed dynamic check for whether the callee needs an activation object. + Replaced with callee code to create the activation object. + + 0.5% speedup on SunSpider. + No change on v8 benchmark. (Might be a speedup, but it's in range of the + variance.) + + 0.7% speedup on v8 benchmark in bytecode. + 1.3% speedup on empty call benchmark in bytecode. + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): Added support for op_init_activation, + the new opcode that specifies that the callee's initialization should + create an activation object. + (JSC::CTI::privateCompile): Removed previous code that did a similar + thing in an ad-hoc way. + + * VM/CodeBlock.cpp: + (JSC::CodeBlock::dump): Added a case for dumping op_init_activation. + + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::generate): Added fixup code to change op_init to + op_init_activation if necessary. (With a better parser, we would know + which to use from the beginning.) + + * VM/Instruction.h: + (JSC::Instruction::Instruction): + (WTF::): Faster traits for the instruction vector. An earlier version + of this patch relied on inserting at the beginning of the vector, and + depended on this change for speed. + + * VM/Machine.cpp: + (JSC::Machine::execute): Removed clients of setScopeChain, the old + abstraction for dynamically checking for whether an activation object + needed to be created. + (JSC::Machine::privateExecute): ditto + + (JSC::Machine::cti_op_push_activation): Renamed this function from + cti_vm_updateScopeChain, and made it faster by removing the call to + setScopeChain. + * VM/Machine.h: + + * VM/Opcode.h: Declared op_init_activation. + +2008-09-24 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Maciej Stachowiak. + + Move most of the return code back into the callee, now that the callee + doesn't have to calculate anything dynamically. + + 11.5% speedup on empty function call benchmark. + + SunSpider says 0.3% faster. SunSpider --v8 says no change. + + * VM/CTI.cpp: + (JSC::CTI::compileOpCall): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + +2008-09-24 Sam Weinig <sam@webkit.org> + + Reviewed by Maciej Stachowiak. + + Remove staticFunctionGetter. There is only one remaining user of + staticFunctionGetter and it can be converted to use setUpStaticFunctionSlot. + + * JavaScriptCore.exp: + * kjs/lookup.cpp: + * kjs/lookup.h: + +2008-09-24 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Oliver Hunt. + + - inline JIT fast case of op_neq + - remove extra level of function call indirection from slow cases of eq and neq + + 1% speedup on Richards + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + * VM/Machine.cpp: + (JSC::Machine::privateExecute): + (JSC::Machine::cti_op_eq): + (JSC::Machine::cti_op_neq): + * kjs/operations.cpp: + (JSC::equal): + (JSC::equalSlowCase): + * kjs/operations.h: + (JSC::equalSlowCaseInline): + +2008-09-24 Sam Weinig <sam@webkit.org> + + Reviewed by Darin Adler. + + Fix for https://bugs.webkit.org/show_bug.cgi?id=21080 + <rdar://problem/6243534> + Crash below Function.apply when using a runtime array as the argument list + + Test: plugins/bindings-array-apply-crash.html + + * kjs/FunctionPrototype.cpp: + (JSC::functionProtoFuncApply): Revert to the slow case if the object inherits from + JSArray (via ClassInfo) but is not a JSArray. + +2008-09-24 Kevin McCullough <kmccullough@apple.com> + + Style change. + + * kjs/nodes.cpp: + (JSC::statementListEmitCode): + +2008-09-24 Kevin McCullough <kmccullough@apple.com> + + Reviewed by Geoff. + + Bug 21031: Breakpoints in the condition of loops only breaks the first + time + - Now when setting breakpoints in the condition of a loop (for, while, + for in, and do while) will successfully break each time throught the + loop. + - For 'for' loops we need a little more complicated behavior that cannot + be accomplished without some more significant changes: + https://bugs.webkit.org/show_bug.cgi?id=21073 + + * kjs/nodes.cpp: + (JSC::statementListEmitCode): We don't want to blindly emit a debug hook + at the first line of loops, instead let the loop emit the debug hooks. + (JSC::DoWhileNode::emitCode): + (JSC::WhileNode::emitCode): + (JSC::ForNode::emitCode): + (JSC::ForInNode::emitCode): + * kjs/nodes.h: + (JSC::StatementNode::): + (JSC::DoWhileNode::): + (JSC::WhileNode::): + (JSC::ForInNode::): + +2008-09-24 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Darin Adler. + + Fixed <rdar://problem/5605532> Need a SPI for telling JS the size of + the objects it retains + + * API/tests/testapi.c: Test the new SPI a little. + + * API/JSSPI.cpp: Add the new SPI. + * API/JSSPI.h: Add the new SPI. + * JavaScriptCore.exp: Add the new SPI. + * JavaScriptCore.xcodeproj/project.pbxproj: Add the new SPI. + +2008-09-24 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Darin Adler. + + * API/JSBase.h: Filled in some missing function names. + +2008-09-24 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Cameron Zwarich. + + Fixed https://bugs.webkit.org/show_bug.cgi?id=21057 + Crash in RegisterID::deref() running fast/canvas/canvas-putImageData.html + + * VM/CodeGenerator.h: Changed declaration order to ensure the + m_lastConstant, which is a RefPtr that points into m_calleeRegisters, + has its destructor called before the destructor for m_calleeRegisters. + +2008-09-24 Darin Adler <darin@apple.com> + + Reviewed by Sam Weinig. + + - https://bugs.webkit.org/show_bug.cgi?id=21047 + speed up ret_activation with inlining + + About 1% on v8-raytrace. + + * JavaScriptCore.exp: Removed JSVariableObject::setRegisters. + + * kjs/JSActivation.cpp: Moved copyRegisters to the header to make it inline. + * kjs/JSActivation.h: + (JSC::JSActivation::copyRegisters): Moved here. Also removed the registerArraySize + argument to setRegisters, since the object doesn't need to store the number of + registers. + + * kjs/JSGlobalObject.cpp: + (JSC::JSGlobalObject::reset): Removed unnecessary clearing left over from when we + used this on objects that weren't brand new. These days, this function is really + just part of the constructor. + + * kjs/JSGlobalObject.h: Added registerArraySize to JSGlobalObjectData, since + JSVariableObjectData no longer needs it. Added a setRegisters override here + that handles storing the size. + + * kjs/JSStaticScopeObject.h: Removed code to set registerArraySize, since it + no longer exists. + + * kjs/JSVariableObject.cpp: Moved copyRegisterArray and setRegisters to the + header to make them inline. + * kjs/JSVariableObject.h: Removed registerArraySize from JSVariableObjectData, + since it was only used for the global object. + (JSC::JSVariableObject::copyRegisterArray): Moved here ot make it inline. + (JSC::JSVariableObject::setRegisters): Moved here to make it inline. Also + removed the code to set registerArraySize and changed an if statement into + an assert to save an unnnecessary branch. + +2008-09-24 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Oliver Hunt. + + - inline PropertyMap::getOffset to speed up polymorphic lookups + + ~1.5% speedup on v8 benchmark + no effect on SunSpider + + * JavaScriptCore.exp: + * kjs/PropertyMap.cpp: + * kjs/PropertyMap.h: + (JSC::PropertyMap::getOffset): + +2008-09-24 Jan Michael Alonzo <jmalonzo@webkit.org> + + Reviewed by Alp Toker. + + https://bugs.webkit.org/show_bug.cgi?id=20992 + Build fails on GTK+ Mac OS + + * wtf/ThreadingGtk.cpp: Remove platform ifdef as suggested by + Richard Hult. + (WTF::initializeThreading): + +2008-09-23 Oliver Hunt <oliver@apple.com> + + Reviewed by Maciej Stachowiak. + + Bug 19968: Slow Script at www.huffingtonpost.com + <https://bugs.webkit.org/show_bug.cgi?id=19968> + + Finally found the cause of this accursed issue. It is triggered + by synchronous creation of a new global object from JS. The new + global object resets the timer state in this execution group's + Machine, taking timerCheckCount to 0. Then when JS returns the + timerCheckCount is decremented making it non-zero. The next time + we execute JS we will start the timeout counter, however the non-zero + timeoutCheckCount means we don't reset the timer information. This + means that the timeout check is now checking the cumulative time + since the creation of the global object rather than the time since + JS was last entered. At this point the slow script dialog is guaranteed + to eventually be displayed incorrectly unless a page is loaded + asynchronously (which will reset everything into a sane state). + + The fix for this is rather trivial -- the JSGlobalObject constructor + should not be resetting the machine timer state. + + * VM/Machine.cpp: + (JSC::Machine::Machine): + Now that we can't rely on the GlobalObject initialising the timeout + state, we do it in the Machine constructor. + + * VM/Machine.h: + (JSC::Machine::stopTimeoutCheck): + Add assertions to guard against this happening. + + * kjs/JSGlobalObject.cpp: + (JSC::JSGlobalObject::init): + Don't reset the timeout state. + +2008-09-23 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Oliver Hunt. + + Fixed https://bugs.webkit.org/show_bug.cgi?id=21038 | <rdar://problem/6240812> + Uncaught exceptions in regex replace callbacks crash webkit + + This was a combination of two problems: + + (1) the replace function would continue execution after an exception + had been thrown. + + (2) In some cases, the Machine would return 0 in the case of an exception, + despite the fact that a few clients dereference the Machine's return + value without first checking for an exception. + + * VM/Machine.cpp: + (JSC::Machine::execute): + + ^ Return jsNull() instead of 0 in the case of an exception, since some + clients depend on using our return value. + + ^ ASSERT that execution does not continue after an exception has been + thrown, to help catch problems like this in the future. + + * kjs/StringPrototype.cpp: + (JSC::stringProtoFuncReplace): + + ^ Stop execution if an exception has been thrown. + +2008-09-23 Geoffrey Garen <ggaren@apple.com> + + Try to fix the windows build. + + * VM/CTI.cpp: + (JSC::CTI::compileOpCall): + (JSC::CTI::privateCompileMainPass): + +2008-09-23 Alp Toker <alp@nuanti.com> + + Build fix. + + * VM/CTI.h: + +2008-09-23 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Darin Adler. + + * wtf/Platform.h: Removed duplicate #if. + +2008-09-23 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Darin Adler. + + Changed the layout of the call frame from + + { header, parameters, locals | constants, temporaries } + + to + + { parameters, header | locals, constants, temporaries } + + This simplifies function entry+exit, and enables a number of future + optimizations. + + 13.5% speedup on empty call benchmark for bytecode; 23.6% speedup on + empty call benchmark for CTI. + + SunSpider says no change. SunSpider --v8 says 1% faster. + + * VM/CTI.cpp: + + Added a bit of abstraction for calculating whether a register is a + constant, since this patch changes that calculation: + (JSC::CTI::isConstant): + (JSC::CTI::getConstant): + (JSC::CTI::emitGetArg): + (JSC::CTI::emitGetPutArg): + (JSC::CTI::getConstantImmediateNumericArg): + + Updated for changes to callframe header location: + (JSC::CTI::emitPutToCallFrameHeader): + (JSC::CTI::emitGetFromCallFrameHeader): + (JSC::CTI::printOpcodeOperandTypes): + + Renamed to spite Oliver: + (JSC::CTI::emitInitRegister): + + Added an abstraction for emitting a call through a register, so that + calls through registers generate exception info, too: + (JSC::CTI::emitCall): + + Updated to match the new callframe header layout, and to support calls + through registers, which have no destination address: + (JSC::CTI::compileOpCall): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + (JSC::CTI::privateCompile): + + * VM/CTI.h: + + More of the above: + (JSC::CallRecord::CallRecord): + + * VM/CodeBlock.cpp: + + Updated for new register layout: + (JSC::registerName): + (JSC::CodeBlock::dump): + + * VM/CodeBlock.h: + + Updated CodeBlock to track slightly different information about the + register frame, and tweaked the style of an ASSERT_NOT_REACHED. + (JSC::CodeBlock::CodeBlock): + (JSC::CodeBlock::getStubInfo): + + * VM/CodeGenerator.cpp: + + Added some abstraction around constant register allocation, since this + patch changes it, changed codegen to account for the new callframe + layout, and added abstraction around register fetching code + that used to assume that all local registers lived at negative indices, + since vars now live at positive indices: + (JSC::CodeGenerator::generate): + (JSC::CodeGenerator::addVar): + (JSC::CodeGenerator::addGlobalVar): + (JSC::CodeGenerator::allocateConstants): + (JSC::CodeGenerator::CodeGenerator): + (JSC::CodeGenerator::addParameter): + (JSC::CodeGenerator::registerFor): + (JSC::CodeGenerator::constRegisterFor): + (JSC::CodeGenerator::newRegister): + (JSC::CodeGenerator::newTemporary): + (JSC::CodeGenerator::highestUsedRegister): + (JSC::CodeGenerator::addConstant): + + ASSERT that our caller referenced the registers it passed to us. + Otherwise, we might overwrite them with parameters: + (JSC::CodeGenerator::emitCall): + (JSC::CodeGenerator::emitConstruct): + + * VM/CodeGenerator.h: + + Added some abstraction for getting a RegisterID for a given index, + since the rules are a little weird: + (JSC::CodeGenerator::registerFor): + + * VM/Machine.cpp: + + Utility function to transform a machine return PC to a virtual machine + return VPC, for the sake of stack unwinding, since both PCs are stored + in the same location now: + (JSC::vPCForPC): + + Tweaked to account for new call frame: + (JSC::Machine::initializeCallFrame): + + Tweaked to account for registerOffset supplied by caller: + (JSC::slideRegisterWindowForCall): + + Tweaked to account for new register layout: + (JSC::scopeChainForCall): + (JSC::Machine::callEval): + (JSC::Machine::dumpRegisters): + (JSC::Machine::unwindCallFrame): + (JSC::Machine::execute): + + Changed op_call and op_construct to implement the new calling convention: + (JSC::Machine::privateExecute): + + Tweaked to account for the new register layout: + (JSC::Machine::retrieveArguments): + (JSC::Machine::retrieveCaller): + (JSC::Machine::retrieveLastCaller): + (JSC::Machine::callFrame): + (JSC::Machine::getArgumentsData): + + Changed CTI call helpers to implement the new calling convention: + (JSC::Machine::cti_op_call_JSFunction): + (JSC::Machine::cti_op_call_NotJSFunction): + (JSC::Machine::cti_op_ret_activation): + (JSC::Machine::cti_op_ret_profiler): + (JSC::Machine::cti_op_construct_JSConstruct): + (JSC::Machine::cti_op_construct_NotJSConstruct): + (JSC::Machine::cti_op_call_eval): + + * VM/Machine.h: + + * VM/Opcode.h: + + Renamed op_initialise_locals to op_init, because this opcode + doesn't initialize all locals, and it doesn't initialize only locals. + Also, to spite Oliver. + + * VM/RegisterFile.h: + + New call frame enumeration values: + (JSC::RegisterFile::): + + Simplified the calculation of whether a RegisterID is a temporary, + since we can no longer assume that all positive non-constant registers + are temporaries: + * VM/RegisterID.h: + (JSC::RegisterID::RegisterID): + (JSC::RegisterID::setTemporary): + (JSC::RegisterID::isTemporary): + + Renamed firstArgumentIndex to firstParameterIndex because the assumption + that this variable pertained to the actual arguments supplied by the + caller caused me to write some buggy code: + * kjs/Arguments.cpp: + (JSC::ArgumentsData::ArgumentsData): + (JSC::Arguments::Arguments): + (JSC::Arguments::fillArgList): + (JSC::Arguments::getOwnPropertySlot): + (JSC::Arguments::put): + + Updated for new call frame layout: + * kjs/DebuggerCallFrame.cpp: + (JSC::DebuggerCallFrame::functionName): + (JSC::DebuggerCallFrame::type): + * kjs/DebuggerCallFrame.h: + + Changed the activation object to account for the fact that a call frame + header now sits between parameters and local variables. This change + requires all variable objects to do their own marking, since they + now use their register storage differently: + * kjs/JSActivation.cpp: + (JSC::JSActivation::mark): + (JSC::JSActivation::copyRegisters): + (JSC::JSActivation::createArgumentsObject): + * kjs/JSActivation.h: + + Updated global object to use the new interfaces required by the change + to JSActivation above: + * kjs/JSGlobalObject.cpp: + (JSC::JSGlobalObject::reset): + (JSC::JSGlobalObject::mark): + (JSC::JSGlobalObject::copyGlobalsFrom): + (JSC::JSGlobalObject::copyGlobalsTo): + * kjs/JSGlobalObject.h: + (JSC::JSGlobalObject::addStaticGlobals): + + Updated static scope object to use the new interfaces required by the + change to JSActivation above: + * kjs/JSStaticScopeObject.cpp: + (JSC::JSStaticScopeObject::mark): + (JSC::JSStaticScopeObject::~JSStaticScopeObject): + * kjs/JSStaticScopeObject.h: + (JSC::JSStaticScopeObject::JSStaticScopeObject): + (JSC::JSStaticScopeObject::d): + + Updated variable object to use the new interfaces required by the + change to JSActivation above: + * kjs/JSVariableObject.cpp: + (JSC::JSVariableObject::copyRegisterArray): + (JSC::JSVariableObject::setRegisters): + * kjs/JSVariableObject.h: + + Changed the bit twiddling in symbol table not to assume that all indices + are negative, since they can be positive now: + * kjs/SymbolTable.h: + (JSC::SymbolTableEntry::SymbolTableEntry): + (JSC::SymbolTableEntry::isNull): + (JSC::SymbolTableEntry::getIndex): + (JSC::SymbolTableEntry::getAttributes): + (JSC::SymbolTableEntry::setAttributes): + (JSC::SymbolTableEntry::isReadOnly): + (JSC::SymbolTableEntry::pack): + (JSC::SymbolTableEntry::isValidIndex): + + Changed call and construct nodes to ref their functions and/or bases, + so that emitCall/emitConstruct doesn't overwrite them with parameters. + Also, updated for rename to registerFor: + * kjs/nodes.cpp: + (JSC::ResolveNode::emitCode): + (JSC::NewExprNode::emitCode): + (JSC::EvalFunctionCallNode::emitCode): + (JSC::FunctionCallValueNode::emitCode): + (JSC::FunctionCallResolveNode::emitCode): + (JSC::FunctionCallBracketNode::emitCode): + (JSC::FunctionCallDotNode::emitCode): + (JSC::PostfixResolveNode::emitCode): + (JSC::DeleteResolveNode::emitCode): + (JSC::TypeOfResolveNode::emitCode): + (JSC::PrefixResolveNode::emitCode): + (JSC::ReadModifyResolveNode::emitCode): + (JSC::AssignResolveNode::emitCode): + (JSC::ConstDeclNode::emitCodeSingle): + (JSC::ForInNode::emitCode): + + Added abstraction for getting exception info out of a call through a + register: + * masm/X86Assembler.h: + (JSC::X86Assembler::emitCall): + + Removed duplicate #if: + * wtf/Platform.h: + +2008-09-23 Kevin McCullough <kmccullough@apple.com> + + Reviewed by Darin. + + Bug 21030: The JS debugger breaks on the do of a do-while not the while + (where the conditional statement is) + https://bugs.webkit.org/show_bug.cgi?id=21030 + Now the statementListEmitCode detects if a do-while node is being + emited and emits the debug hook on the last line instead of the first. + + This change had no effect on sunspider. + + * kjs/nodes.cpp: + (JSC::statementListEmitCode): + * kjs/nodes.h: + (JSC::StatementNode::isDoWhile): + (JSC::DoWhileNode::isDoWhile): + +2008-09-23 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Cameron Zwarich. + + - inline the fast case of instanceof + https://bugs.webkit.org/show_bug.cgi?id=20818 + + ~2% speedup on EarleyBoyer test. + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + * VM/Machine.cpp: + (JSC::Machine::cti_op_instanceof): + +2008-09-23 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Cameron Zwarich. + + - add forgotten slow case logic for !== + + * VM/CTI.cpp: + (JSC::CTI::privateCompileSlowCases): + +2008-09-23 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Cameron Zwarich. + + - inline the fast cases of !==, same as for === + + 2.9% speedup on EarleyBoyer benchmark + + * VM/CTI.cpp: + (JSC::CTI::compileOpStrictEq): Factored stricteq codegen into this function, + and parameterized so it can do the reverse version as well. + (JSC::CTI::privateCompileMainPass): Use the above for stricteq and nstricteq. + * VM/CTI.h: + (JSC::CTI::): Declare above stuff. + * VM/Machine.cpp: + (JSC::Machine::cti_op_nstricteq): Removed fast cases, now handled inline. + +2008-09-23 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Oliver Hunt. + + Bug 20989: Aguments constructor should put 'callee' and 'length' properties in a more efficient way + <https://bugs.webkit.org/show_bug.cgi?id=20989> + + Make special cases for the 'callee' and 'length' properties in the + Arguments object. + + This is somewhere between a 7.8% speedup and a 10% speedup on the V8 + Raytrace benchmark, depending on whether it is run alone or with the + other V8 benchmarks. + + * kjs/Arguments.cpp: + (JSC::ArgumentsData::ArgumentsData): + (JSC::Arguments::Arguments): + (JSC::Arguments::mark): + (JSC::Arguments::getOwnPropertySlot): + (JSC::Arguments::put): + (JSC::Arguments::deleteProperty): + +2008-09-23 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Darin. + + - speed up instanceof some more + https://bugs.webkit.org/show_bug.cgi?id=20818 + + ~2% speedup on EarleyBoyer + + The idea here is to record in the StructureID whether the class + needs a special hasInstance or if it can use the normal logic from + JSObject. + + Based on this I inlined the real work directly into + cti_op_instanceof and put the fastest checks up front and the + error handling at the end (so it should be fairly straightforward + to split off the beginning to be inlined if desired). + + I only did this for CTI, not the bytecode interpreter. + + * API/JSCallbackObject.h: + (JSC::JSCallbackObject::createStructureID): + * ChangeLog: + * VM/Machine.cpp: + (JSC::Machine::cti_op_instanceof): + * kjs/JSImmediate.h: + (JSC::JSImmediate::isAnyImmediate): + * kjs/TypeInfo.h: + (JSC::TypeInfo::overridesHasInstance): + (JSC::TypeInfo::flags): + +2008-09-22 Darin Adler <darin@apple.com> + + Reviewed by Sam Weinig. + + - https://bugs.webkit.org/show_bug.cgi?id=21019 + make FunctionBodyNode::ref/deref fast + + Speeds up v8-raytrace by 7.2%. + + * kjs/nodes.cpp: + (JSC::FunctionBodyNode::FunctionBodyNode): Initialize m_refCount to 0. + * kjs/nodes.h: + (JSC::FunctionBodyNode::ref): Call base class ref once, and thereafter use + m_refCount. + (JSC::FunctionBodyNode::deref): Ditto, but the deref side. + +2008-09-22 Darin Adler <darin@apple.com> + + Pointed out by Sam Weinig. + + * kjs/Arguments.cpp: + (JSC::Arguments::fillArgList): Fix bad copy and paste. Oops! + +2008-09-22 Darin Adler <darin@apple.com> + + Reviewed by Cameron Zwarich. + + - https://bugs.webkit.org/show_bug.cgi?id=20983 + ArgumentsData should have some room to allocate some extra arguments inline + + Speeds up v8-raytrace by 5%. + + * kjs/Arguments.cpp: + (JSC::ArgumentsData::ArgumentsData): Use a fixed buffer if there are 4 or fewer + extra arguments. + (JSC::Arguments::Arguments): Use a fixed buffer if there are 4 or fewer + extra arguments. + (JSC::Arguments::~Arguments): Delete the buffer if necessary. + (JSC::Arguments::mark): Update since extraArguments are now Register. + (JSC::Arguments::fillArgList): Added special case for the only case that's + actually used in the practice, when there are no parameters. There are some + other special cases in there too, but that's the only one that matters. + (JSC::Arguments::getOwnPropertySlot): Updated to use setValueSlot since there's + no operation to get you at the JSValue* inside a Register as a "slot". + +2008-09-22 Sam Weinig <sam@webkit.org> + + Reviewed by Maciej Stachowiak. + + Patch for https://bugs.webkit.org/show_bug.cgi?id=21014 + Speed up for..in by using StructureID to avoid calls to hasProperty + + Speeds up fasta by 8%. + + * VM/JSPropertyNameIterator.cpp: + (JSC::JSPropertyNameIterator::invalidate): + * VM/JSPropertyNameIterator.h: + (JSC::JSPropertyNameIterator::next): + * kjs/PropertyNameArray.h: + (JSC::PropertyNameArrayData::begin): + (JSC::PropertyNameArrayData::end): + (JSC::PropertyNameArrayData::setCachedStructureID): + (JSC::PropertyNameArrayData::cachedStructureID): + * kjs/StructureID.cpp: + (JSC::StructureID::getEnumerablePropertyNames): + (JSC::structureIDChainsAreEqual): + * kjs/StructureID.h: + +2008-09-22 Kelvin Sherlock <ksherlock@gmail.com> + + Updated and tweaked by Sam Weinig. + + Reviewed by Geoffrey Garen. + + Bug 20020: Proposed enhancement to JavaScriptCore API + <https://bugs.webkit.org/show_bug.cgi?id=20020> + + Add JSObjectMakeArray, JSObjectMakeDate, JSObjectMakeError, and JSObjectMakeRegExp + functions to create JavaScript Array, Date, Error, and RegExp objects, respectively. + + * API/JSObjectRef.cpp: The functions + * API/JSObjectRef.h: Function prototype and documentation + * JavaScriptCore.exp: Added functions to exported function list + * API/tests/testapi.c: Added basic functionality tests. + + * kjs/DateConstructor.cpp: + Replaced static JSObject* constructDate(ExecState* exec, JSObject*, const ArgList& args) + with JSObject* constructDate(ExecState* exec, const ArgList& args). + Added static JSObject* constructWithDateConstructor(ExecState* exec, JSObject*, const ArgList& args) function + + * kjs/DateConstructor.h: + added prototype for JSObject* constructDate(ExecState* exec, const ArgList& args) + + * kjs/ErrorConstructor.cpp: + removed static qualifier from ErrorInstance* constructError(ExecState* exec, const ArgList& args) + + * kjs/ErrorConstructor.h: + added prototype for ErrorInstance* constructError(ExecState* exec, const ArgList& args) + + * kjs/RegExpConstructor.cpp: + removed static qualifier from JSObject* constructRegExp(ExecState* exec, const ArgList& args) + + * kjs/RegExpConstructor.h: + added prototype for JSObject* constructRegExp(ExecState* exec, const ArgList& args) + +2008-09-22 Matt Lilek <webkit@mattlilek.com> + + Not reviewed, Windows build fix. + + * kjs/Arguments.cpp: + * kjs/FunctionPrototype.cpp: + +2008-09-22 Sam Weinig <sam@webkit.org> + + Reviewed by Darin Adler. + + Patch for https://bugs.webkit.org/show_bug.cgi?id=20982 + Speed up the apply method of functions by special-casing array and 'arguments' objects + + 1% speedup on v8-raytrace. + + Test: fast/js/function-apply.html + + * kjs/Arguments.cpp: + (JSC::Arguments::fillArgList): + * kjs/Arguments.h: + * kjs/FunctionPrototype.cpp: + (JSC::functionProtoFuncApply): + * kjs/JSArray.cpp: + (JSC::JSArray::fillArgList): + * kjs/JSArray.h: + +2008-09-22 Darin Adler <darin@apple.com> + + Reviewed by Sam Weinig. + + - https://bugs.webkit.org/show_bug.cgi?id=20993 + Array.push/pop need optimized cases for JSArray + + 3% or so speedup on DeltaBlue benchmark. + + * kjs/ArrayPrototype.cpp: + (JSC::arrayProtoFuncPop): Call JSArray::pop when appropriate. + (JSC::arrayProtoFuncPush): Call JSArray::push when appropriate. + + * kjs/JSArray.cpp: + (JSC::JSArray::putSlowCase): Set m_fastAccessCutoff when appropriate, getting + us into the fast code path. + (JSC::JSArray::pop): Added. + (JSC::JSArray::push): Added. + * kjs/JSArray.h: Added push and pop. + + * kjs/operations.cpp: + (JSC::throwOutOfMemoryError): Don't inline this. Helps us avoid PIC branches. + +2008-09-22 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Cameron Zwarich. + + - speed up instanceof operator by replacing implementsHasInstance method with a TypeInfo flag + + Partial work towards <https://bugs.webkit.org/show_bug.cgi?id=20818> + + 2.2% speedup on EarleyBoyer benchmark. + + * API/JSCallbackConstructor.cpp: + * API/JSCallbackConstructor.h: + (JSC::JSCallbackConstructor::createStructureID): + * API/JSCallbackFunction.cpp: + * API/JSCallbackFunction.h: + (JSC::JSCallbackFunction::createStructureID): + * API/JSCallbackObject.h: + (JSC::JSCallbackObject::createStructureID): + * API/JSCallbackObjectFunctions.h: + (JSC::::hasInstance): + * API/JSValueRef.cpp: + (JSValueIsInstanceOfConstructor): + * JavaScriptCore.exp: + * VM/Machine.cpp: + (JSC::Machine::privateExecute): + (JSC::Machine::cti_op_instanceof): + * kjs/InternalFunction.cpp: + * kjs/InternalFunction.h: + (JSC::InternalFunction::createStructureID): + * kjs/JSObject.cpp: + * kjs/JSObject.h: + * kjs/TypeInfo.h: + (JSC::TypeInfo::implementsHasInstance): + +2008-09-22 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Dave Hyatt. + + Based on initial work by Darin Adler. + + - replace masqueradesAsUndefined virtual method with a flag in TypeInfo + - use this to JIT inline code for eq_null and neq_null + https://bugs.webkit.org/show_bug.cgi?id=20823 + + 0.5% speedup on SunSpider + ~4% speedup on Richards benchmark + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): + * VM/Machine.cpp: + (JSC::jsTypeStringForValue): + (JSC::jsIsObjectType): + (JSC::Machine::privateExecute): + (JSC::Machine::cti_op_is_undefined): + * VM/Machine.h: + * kjs/JSCell.h: + * kjs/JSValue.h: + * kjs/StringObjectThatMasqueradesAsUndefined.h: + (JSC::StringObjectThatMasqueradesAsUndefined::create): + (JSC::StringObjectThatMasqueradesAsUndefined::createStructureID): + * kjs/StructureID.h: + (JSC::StructureID::mutableTypeInfo): + * kjs/TypeInfo.h: + (JSC::TypeInfo::TypeInfo): + (JSC::TypeInfo::masqueradesAsUndefined): + * kjs/operations.cpp: + (JSC::equal): + * masm/X86Assembler.h: + (JSC::X86Assembler::): + (JSC::X86Assembler::setne_r): + (JSC::X86Assembler::setnz_r): + (JSC::X86Assembler::testl_i32m): + +2008-09-22 Tor Arne Vestbø <tavestbo@trolltech.com> + + Reviewed by Simon. + + Initialize QCoreApplication in kjs binary/Shell.cpp + + This allows us to use QCoreApplication::instance() to + get the main thread in ThreadingQt.cpp + + * kjs/Shell.cpp: + (main): + * wtf/ThreadingQt.cpp: + (WTF::initializeThreading): + +2008-09-21 Darin Adler <darin@apple.com> + + - blind attempt to fix non-all-in-one builds + + * kjs/JSGlobalObject.cpp: Added includes of Arguments.h and RegExpObject.h. + +2008-09-21 Darin Adler <darin@apple.com> + + - fix debug build + + * kjs/StructureID.cpp: + (JSC::StructureID::addPropertyTransition): Use typeInfo().type() instead of m_type. + (JSC::StructureID::createCachedPrototypeChain): Ditto. + +2008-09-21 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Darin Adler. + + - introduce a TypeInfo class, for holding per-type (in the C++ class sense) date in StructureID + https://bugs.webkit.org/show_bug.cgi?id=20981 + + * JavaScriptCore.exp: + * JavaScriptCore.xcodeproj/project.pbxproj: + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompilePutByIdTransition): + * VM/Machine.cpp: + (JSC::jsIsObjectType): + (JSC::Machine::Machine): + * kjs/AllInOneFile.cpp: + * kjs/JSCell.h: + (JSC::JSCell::isObject): + (JSC::JSCell::isString): + * kjs/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + * kjs/JSGlobalObject.cpp: + (JSC::JSGlobalObject::reset): + * kjs/JSGlobalObject.h: + (JSC::StructureID::prototypeForLookup): + * kjs/JSNumberCell.h: + (JSC::JSNumberCell::createStructureID): + * kjs/JSObject.cpp: + (JSC::JSObject::createInheritorID): + * kjs/JSObject.h: + (JSC::JSObject::createStructureID): + * kjs/JSString.h: + (JSC::JSString::createStructureID): + * kjs/NativeErrorConstructor.cpp: + (JSC::NativeErrorConstructor::NativeErrorConstructor): + * kjs/RegExpConstructor.cpp: + * kjs/RegExpMatchesArray.h: Added. + (JSC::RegExpMatchesArray::getOwnPropertySlot): + (JSC::RegExpMatchesArray::put): + (JSC::RegExpMatchesArray::deleteProperty): + (JSC::RegExpMatchesArray::getPropertyNames): + * kjs/StructureID.cpp: + (JSC::StructureID::StructureID): + (JSC::StructureID::addPropertyTransition): + (JSC::StructureID::toDictionaryTransition): + (JSC::StructureID::changePrototypeTransition): + (JSC::StructureID::getterSetterTransition): + * kjs/StructureID.h: + (JSC::StructureID::create): + (JSC::StructureID::typeInfo): + * kjs/TypeInfo.h: Added. + (JSC::TypeInfo::TypeInfo): + (JSC::TypeInfo::type): + +2008-09-21 Darin Adler <darin@apple.com> + + Reviewed by Cameron Zwarich. + + - fix crash logging into Gmail due to recent Arguments change + + * kjs/Arguments.cpp: + (JSC::Arguments::Arguments): Fix window where mark() function could + see d->extraArguments with uninitialized contents. + (JSC::Arguments::mark): Check d->extraArguments for 0 to handle two + cases: 1) Inside the constructor before it's initialized. + 2) numArguments <= numParameters. + +2008-09-21 Darin Adler <darin@apple.com> + + - fix loose end from the "duplicate constant values" patch + + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::emitLoad): Add a special case for values the + hash table can't handle. + +2008-09-21 Mark Rowe <mrowe@apple.com> + + Fix the non-AllInOneFile build. + + * kjs/Arguments.cpp: Add missing #include. + +2008-09-21 Darin Adler <darin@apple.com> + + Reviewed by Cameron Zwarich and Mark Rowe. + + - fix test failure caused by my recent IndexToNameMap patch + + * kjs/Arguments.cpp: + (JSC::Arguments::deleteProperty): Added the accidentally-omitted + check of the boolean result from toArrayIndex. + +2008-09-21 Darin Adler <darin@apple.com> + + Reviewed by Maciej Stachowiak. + + - https://bugs.webkit.org/show_bug.cgi?id=20975 + inline immediate-number case of == + + * VM/CTI.h: Renamed emitJumpSlowCaseIfNotImm to + emitJumpSlowCaseIfNotImmNum, since the old name was incorrect. + + * VM/CTI.cpp: Updated for new name. + (JSC::CTI::privateCompileMainPass): Added op_eq. + (JSC::CTI::privateCompileSlowCases): Added op_eq. + + * VM/Machine.cpp: + (JSC::Machine::cti_op_eq): Removed fast case, since it's now + compiled. + +2008-09-21 Peter Gal <galpter@inf.u-szeged.hu> + + Reviewed by Tim Hatcher and Eric Seidel. + + Fix the QT/Linux JavaScriptCore segmentation fault. + https://bugs.webkit.org/show_bug.cgi?id=20914 + + * wtf/ThreadingQt.cpp: + (WTF::initializeThreading): Use currentThread() if + platform is not a MAC (like in pre 36541 revisions) + +2008-09-21 Darin Adler <darin@apple.com> + + Reviewed by Sam Weinig. + + * kjs/debugger.h: Removed some unneeded includes and declarations. + +2008-09-21 Darin Adler <darin@apple.com> + + Reviewed by Sam Weinig. + + - https://bugs.webkit.org/show_bug.cgi?id=20972 + speed up Arguments further by eliminating the IndexToNameMap + + No change on SunSpider. 1.29x as fast on V8 Raytrace. + + * kjs/Arguments.cpp: Moved ArgumentsData in here. Eliminated the + indexToNameMap and hadDeletes data members. Changed extraArguments into + an OwnArrayPtr and added deletedArguments, another OwnArrayPtr. + Replaced numExtraArguments with numParameters, since that's what's + used more directly in hot code paths. + (JSC::Arguments::Arguments): Pass in argument count instead of ArgList. + Initialize ArgumentsData the new way. + (JSC::Arguments::mark): Updated. + (JSC::Arguments::getOwnPropertySlot): Overload for the integer form so + we don't have to convert integers to identifiers just to get an argument. + Integrated the deleted case with the fast case. + (JSC::Arguments::put): Ditto. + (JSC::Arguments::deleteProperty): Ditto. + + * kjs/Arguments.h: Minimized includes. Made everything private. Added + overloads for the integral property name case. Eliminated mappedIndexSetter. + Moved ArgumentsData into the .cpp file. + + * kjs/IndexToNameMap.cpp: Emptied out and prepared for deletion. + * kjs/IndexToNameMap.h: Ditto. + + * kjs/JSActivation.cpp: + (JSC::JSActivation::createArgumentsObject): Elminated ArgList. + + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + * kjs/AllInOneFile.cpp: + Removed IndexToNameMap. + +2008-09-21 Darin Adler <darin@apple.com> + + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::emitLoad): One more tweak: Wrote this in a slightly + clearer style. + +2008-09-21 Judit Jasz <jasy@inf.u-szeged.hu> + + Reviewed and tweaked by Darin Adler. + + - https://bugs.webkit.org/show_bug.cgi?id=20645 + Elminate duplicate constant values in CodeBlocks. + + Seems to be a wash on SunSpider. + + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::emitLoad): Use m_numberMap and m_stringMap to guarantee + we emit the same JSValue* for identical numbers and strings. + * VM/CodeGenerator.h: Added overload of emitLoad for const Identifier&. + Add NumberMap and IdentifierStringMap types and m_numberMap and m_stringMap. + * kjs/nodes.cpp: + (JSC::StringNode::emitCode): Call the new emitLoad and let it do the + JSString creation. + +2008-09-21 Paul Pedriana <webkit@pedriana.com> + + Reviewed and tweaked by Darin Adler. + + - https://bugs.webkit.org/show_bug.cgi?id=16925 + Fixed lack of Vector buffer alignment for both GCC and MSVC. + Since there's no portable way to do this, for now we don't support + other compilers. + + * wtf/Vector.h: Added WTF_ALIGH_ON, WTF_ALIGNED, AlignedBufferChar, and AlignedBuffer. + Use AlignedBuffer insteadof an array of char in VectorBuffer. + +2008-09-21 Gabor Loki <loki@inf.u-szeged.hu> + + Reviewed by Darin Adler. + + - https://bugs.webkit.org/show_bug.cgi?id=19408 + Add lightweight constant folding to the parser for *, /, + (only for numbers), <<, >>, ~ operators. + + 1.008x as fast on SunSpider. + + * kjs/grammar.y: + (makeNegateNode): Fold if expression is a number > 0. + (makeBitwiseNotNode): Fold if expression is a number. + (makeMultNode): Fold if expressions are both numbers. + (makeDivNode): Fold if expressions are both numbers. + (makeAddNode): Fold if expressions are both numbers. + (makeLeftShiftNode): Fold if expressions are both numbers. + (makeRightShiftNode): Fold if expressions are both numbers. + +2008-09-21 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Oliver. + + - speed up === operator by generating inline machine code for the fast paths + https://bugs.webkit.org/show_bug.cgi?id=20820 + + * VM/CTI.cpp: + (JSC::CTI::emitJumpSlowCaseIfNotImmediateNumber): + (JSC::CTI::emitJumpSlowCaseIfNotImmediateNumbers): + (JSC::CTI::emitJumpSlowCaseIfNotImmediates): + (JSC::CTI::emitTagAsBoolImmediate): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + * VM/CTI.h: + * VM/Machine.cpp: + (JSC::Machine::cti_op_stricteq): + * masm/X86Assembler.h: + (JSC::X86Assembler::): + (JSC::X86Assembler::sete_r): + (JSC::X86Assembler::setz_r): + (JSC::X86Assembler::movzbl_rr): + (JSC::X86Assembler::emitUnlinkedJnz): + +2008-09-21 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Maciej Stachowiak. + + Free memory allocated for extra arguments in the destructor of the + Arguments object. + + * kjs/Arguments.cpp: + (JSC::Arguments::~Arguments): + * kjs/Arguments.h: + +2008-09-21 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Maciej Stachowiak. + + Bug 20815: 'arguments' object creation is non-optimal + <https://bugs.webkit.org/show_bug.cgi?id=20815> + + Fix our inefficient way of creating the arguments object by only + creating named properties for each of the arguments after a use of the + 'delete' statement. This patch also speeds up access to the 'arguments' + object slightly, but it still does not use the array fast path for + indexed access that exists for many opcodes. + + This is about a 20% improvement on the V8 Raytrace benchmark, and a 1.5% + improvement on the Earley-Boyer benchmark, which gives a 4% improvement + overall. + + * kjs/Arguments.cpp: + (JSC::Arguments::Arguments): + (JSC::Arguments::mark): + (JSC::Arguments::getOwnPropertySlot): + (JSC::Arguments::put): + (JSC::Arguments::deleteProperty): + * kjs/Arguments.h: + (JSC::Arguments::ArgumentsData::ArgumentsData): + * kjs/IndexToNameMap.h: + (JSC::IndexToNameMap::size): + * kjs/JSActivation.cpp: + (JSC::JSActivation::createArgumentsObject): + * kjs/JSActivation.h: + (JSC::JSActivation::uncheckedSymbolTableGet): + (JSC::JSActivation::uncheckedSymbolTableGetValue): + (JSC::JSActivation::uncheckedSymbolTablePut): + * kjs/JSFunction.h: + (JSC::JSFunction::numParameters): + +2008-09-20 Darin Adler <darin@apple.com> + + Reviewed by Mark Rowe. + + - fix crash seen on buildbot + + * kjs/JSGlobalObject.cpp: + (JSC::JSGlobalObject::mark): Add back mark of arrayPrototype, + deleted by accident in my recent check-in. + +2008-09-20 Maciej Stachowiak <mjs@apple.com> + + Not reviewed, build fix. + + - speculative fix for non-AllInOne builds + + * kjs/operations.h: + +2008-09-20 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Darin Adler. + + - assorted optimizations to === and !== operators + (work towards <https://bugs.webkit.org/show_bug.cgi?id=20820>) + + 2.5% speedup on earley-boyer test + + * VM/Machine.cpp: + (JSC::Machine::cti_op_stricteq): Use inline version of + strictEqualSlowCase; remove unneeded exception check. + (JSC::Machine::cti_op_nstricteq): ditto + * kjs/operations.cpp: + (JSC::strictEqual): Use strictEqualSlowCaseInline + (JSC::strictEqualSlowCase): ditto + * kjs/operations.h: + (JSC::strictEqualSlowCaseInline): Version of strictEqualSlowCase that can be inlined, + since the extra function call indirection is a lose for CTI. + +2008-09-20 Darin Adler <darin@apple.com> + + Reviewed by Maciej Stachowiak. + + - finish https://bugs.webkit.org/show_bug.cgi?id=20858 + make each distinct C++ class get a distinct JSC::Structure + + This also includes some optimizations that make the change an overall + small speedup. Without those it was a bit of a slowdown. + + * API/JSCallbackConstructor.cpp: + (JSC::JSCallbackConstructor::JSCallbackConstructor): Take a structure. + * API/JSCallbackConstructor.h: Ditto. + * API/JSCallbackFunction.cpp: + (JSC::JSCallbackFunction::JSCallbackFunction): Pass a structure. + * API/JSCallbackObject.h: Take a structure. + * API/JSCallbackObjectFunctions.h: + (JSC::JSCallbackObject::JSCallbackObject): Ditto. + + * API/JSClassRef.cpp: + (OpaqueJSClass::prototype): Pass in a structure. Call setPrototype + if there's a custom prototype involved. + * API/JSObjectRef.cpp: + (JSObjectMake): Ditto. + (JSObjectMakeConstructor): Pass in a structure. + + * JavaScriptCore.exp: Updated. + + * VM/Machine.cpp: + (JSC::jsLess): Added a special case for when both arguments are strings. + This avoids converting both strings to with UString::toDouble. + (JSC::jsLessEq): Ditto. + (JSC::Machine::privateExecute): Pass in a structure. + (JSC::Machine::cti_op_construct_JSConstruct): Ditto. + (JSC::Machine::cti_op_new_regexp): Ditto. + (JSC::Machine::cti_op_is_string): Ditto. + * VM/Machine.h: Made isJSString public so it can be used in the CTI. + + * kjs/Arguments.cpp: + (JSC::Arguments::Arguments): Pass in a structure. + + * kjs/JSCell.h: Mark constructor explicit. + + * kjs/JSGlobalObject.cpp: + (JSC::markIfNeeded): Added an overload for marking structures. + (JSC::JSGlobalObject::reset): Eliminate code to set data members to + zero. We now do that in the constructor, and we no longer use this + anywhere except in the constructor. Added code to create structures. + Pass structures rather than prototypes when creating objects. + (JSC::JSGlobalObject::mark): Mark the structures. + + * kjs/JSGlobalObject.h: Removed unneeded class declarations. + Added initializers for raw pointers in JSGlobalObjectData so + everything starts with a 0. Added structure data and accessor + functions. + + * kjs/JSImmediate.cpp: + (JSC::JSImmediate::nonInlineNaN): Added. + * kjs/JSImmediate.h: + (JSC::JSImmediate::toDouble): Rewrote to avoid PIC branches. + + * kjs/JSNumberCell.cpp: + (JSC::jsNumberCell): Made non-inline to avoid PIC branches + in functions that call this one. + (JSC::jsNaN): Ditto. + * kjs/JSNumberCell.h: Ditto. + + * kjs/JSObject.h: Removed constructor that takes a prototype. + All callers now pass structures. + + * kjs/ArrayConstructor.cpp: + (JSC::ArrayConstructor::ArrayConstructor): + (JSC::constructArrayWithSizeQuirk): + * kjs/ArrayConstructor.h: + * kjs/ArrayPrototype.cpp: + (JSC::ArrayPrototype::ArrayPrototype): + * kjs/ArrayPrototype.h: + * kjs/BooleanConstructor.cpp: + (JSC::BooleanConstructor::BooleanConstructor): + (JSC::constructBoolean): + (JSC::constructBooleanFromImmediateBoolean): + * kjs/BooleanConstructor.h: + * kjs/BooleanObject.cpp: + (JSC::BooleanObject::BooleanObject): + * kjs/BooleanObject.h: + * kjs/BooleanPrototype.cpp: + (JSC::BooleanPrototype::BooleanPrototype): + * kjs/BooleanPrototype.h: + * kjs/DateConstructor.cpp: + (JSC::DateConstructor::DateConstructor): + (JSC::constructDate): + * kjs/DateConstructor.h: + * kjs/DateInstance.cpp: + (JSC::DateInstance::DateInstance): + * kjs/DateInstance.h: + * kjs/DatePrototype.cpp: + (JSC::DatePrototype::DatePrototype): + * kjs/DatePrototype.h: + * kjs/ErrorConstructor.cpp: + (JSC::ErrorConstructor::ErrorConstructor): + (JSC::constructError): + * kjs/ErrorConstructor.h: + * kjs/ErrorInstance.cpp: + (JSC::ErrorInstance::ErrorInstance): + * kjs/ErrorInstance.h: + * kjs/ErrorPrototype.cpp: + (JSC::ErrorPrototype::ErrorPrototype): + * kjs/ErrorPrototype.h: + * kjs/FunctionConstructor.cpp: + (JSC::FunctionConstructor::FunctionConstructor): + * kjs/FunctionConstructor.h: + * kjs/FunctionPrototype.cpp: + (JSC::FunctionPrototype::FunctionPrototype): + (JSC::FunctionPrototype::addFunctionProperties): + * kjs/FunctionPrototype.h: + * kjs/GlobalEvalFunction.cpp: + (JSC::GlobalEvalFunction::GlobalEvalFunction): + * kjs/GlobalEvalFunction.h: + * kjs/InternalFunction.cpp: + (JSC::InternalFunction::InternalFunction): + * kjs/InternalFunction.h: + (JSC::InternalFunction::InternalFunction): + * kjs/JSArray.cpp: + (JSC::JSArray::JSArray): + (JSC::constructEmptyArray): + (JSC::constructArray): + * kjs/JSArray.h: + * kjs/JSFunction.cpp: + (JSC::JSFunction::JSFunction): + (JSC::JSFunction::construct): + * kjs/JSObject.cpp: + (JSC::constructEmptyObject): + * kjs/JSString.cpp: + (JSC::StringObject::create): + * kjs/JSWrapperObject.h: + * kjs/MathObject.cpp: + (JSC::MathObject::MathObject): + * kjs/MathObject.h: + * kjs/NativeErrorConstructor.cpp: + (JSC::NativeErrorConstructor::NativeErrorConstructor): + (JSC::NativeErrorConstructor::construct): + * kjs/NativeErrorConstructor.h: + * kjs/NativeErrorPrototype.cpp: + (JSC::NativeErrorPrototype::NativeErrorPrototype): + * kjs/NativeErrorPrototype.h: + * kjs/NumberConstructor.cpp: + (JSC::NumberConstructor::NumberConstructor): + (JSC::constructWithNumberConstructor): + * kjs/NumberConstructor.h: + * kjs/NumberObject.cpp: + (JSC::NumberObject::NumberObject): + (JSC::constructNumber): + (JSC::constructNumberFromImmediateNumber): + * kjs/NumberObject.h: + * kjs/NumberPrototype.cpp: + (JSC::NumberPrototype::NumberPrototype): + * kjs/NumberPrototype.h: + * kjs/ObjectConstructor.cpp: + (JSC::ObjectConstructor::ObjectConstructor): + (JSC::constructObject): + * kjs/ObjectConstructor.h: + * kjs/ObjectPrototype.cpp: + (JSC::ObjectPrototype::ObjectPrototype): + * kjs/ObjectPrototype.h: + * kjs/PrototypeFunction.cpp: + (JSC::PrototypeFunction::PrototypeFunction): + * kjs/PrototypeFunction.h: + * kjs/RegExpConstructor.cpp: + (JSC::RegExpConstructor::RegExpConstructor): + (JSC::RegExpMatchesArray::RegExpMatchesArray): + (JSC::constructRegExp): + * kjs/RegExpConstructor.h: + * kjs/RegExpObject.cpp: + (JSC::RegExpObject::RegExpObject): + * kjs/RegExpObject.h: + * kjs/RegExpPrototype.cpp: + (JSC::RegExpPrototype::RegExpPrototype): + * kjs/RegExpPrototype.h: + * kjs/Shell.cpp: + (GlobalObject::GlobalObject): + * kjs/StringConstructor.cpp: + (JSC::StringConstructor::StringConstructor): + (JSC::constructWithStringConstructor): + * kjs/StringConstructor.h: + * kjs/StringObject.cpp: + (JSC::StringObject::StringObject): + * kjs/StringObject.h: + * kjs/StringObjectThatMasqueradesAsUndefined.h: + (JSC::StringObjectThatMasqueradesAsUndefined::StringObjectThatMasqueradesAsUndefined): + * kjs/StringPrototype.cpp: + (JSC::StringPrototype::StringPrototype): + * kjs/StringPrototype.h: + Take and pass structures. + +2008-09-19 Alp Toker <alp@nuanti.com> + + Build fix for the 'gold' linker and recent binutils. New behaviour + requires that we link to used libraries explicitly. + + * GNUmakefile.am: + +2008-09-19 Sam Weinig <sam@webkit.org> + + Roll r36694 back in. It did not cause the crash. + + * JavaScriptCore.exp: + * VM/JSPropertyNameIterator.cpp: + (JSC::JSPropertyNameIterator::~JSPropertyNameIterator): + (JSC::JSPropertyNameIterator::invalidate): + * VM/JSPropertyNameIterator.h: + (JSC::JSPropertyNameIterator::JSPropertyNameIterator): + (JSC::JSPropertyNameIterator::create): + * kjs/JSObject.cpp: + (JSC::JSObject::getPropertyNames): + * kjs/PropertyMap.cpp: + (JSC::PropertyMap::getEnumerablePropertyNames): + * kjs/PropertyMap.h: + * kjs/PropertyNameArray.cpp: + (JSC::PropertyNameArray::add): + * kjs/PropertyNameArray.h: + (JSC::PropertyNameArrayData::create): + (JSC::PropertyNameArrayData::propertyNameVector): + (JSC::PropertyNameArrayData::setCachedPrototypeChain): + (JSC::PropertyNameArrayData::cachedPrototypeChain): + (JSC::PropertyNameArrayData::begin): + (JSC::PropertyNameArrayData::end): + (JSC::PropertyNameArrayData::PropertyNameArrayData): + (JSC::PropertyNameArray::PropertyNameArray): + (JSC::PropertyNameArray::addKnownUnique): + (JSC::PropertyNameArray::size): + (JSC::PropertyNameArray::operator[]): + (JSC::PropertyNameArray::begin): + (JSC::PropertyNameArray::end): + (JSC::PropertyNameArray::setData): + (JSC::PropertyNameArray::data): + (JSC::PropertyNameArray::releaseData): + * kjs/StructureID.cpp: + (JSC::structureIDChainsAreEqual): + (JSC::StructureID::getEnumerablePropertyNames): + (JSC::StructureID::clearEnumerationCache): + (JSC::StructureID::createCachedPrototypeChain): + * kjs/StructureID.h: + +2008-09-19 Sam Weinig <sam@webkit.org> + + Roll out r36694. + + * JavaScriptCore.exp: + * VM/JSPropertyNameIterator.cpp: + (JSC::JSPropertyNameIterator::~JSPropertyNameIterator): + (JSC::JSPropertyNameIterator::invalidate): + * VM/JSPropertyNameIterator.h: + (JSC::JSPropertyNameIterator::JSPropertyNameIterator): + (JSC::JSPropertyNameIterator::create): + * kjs/JSObject.cpp: + (JSC::JSObject::getPropertyNames): + * kjs/PropertyMap.cpp: + (JSC::PropertyMap::getEnumerablePropertyNames): + * kjs/PropertyMap.h: + * kjs/PropertyNameArray.cpp: + (JSC::PropertyNameArray::add): + * kjs/PropertyNameArray.h: + (JSC::PropertyNameArray::PropertyNameArray): + (JSC::PropertyNameArray::addKnownUnique): + (JSC::PropertyNameArray::begin): + (JSC::PropertyNameArray::end): + (JSC::PropertyNameArray::size): + (JSC::PropertyNameArray::operator[]): + (JSC::PropertyNameArray::releaseIdentifiers): + * kjs/StructureID.cpp: + (JSC::StructureID::getEnumerablePropertyNames): + * kjs/StructureID.h: + (JSC::StructureID::clearEnumerationCache): + +2008-09-19 Oliver Hunt <oliver@apple.com> + + Reviewed by Maciej Stachowiak. + + Improve peformance of local variable initialisation. + + Pull local and constant initialisation out of slideRegisterWindowForCall + and into its own opcode. This allows the JIT to generate the initialisation + code for a function directly into the instruction stream and so avoids a few + branches on function entry. + + Results a 1% progression in SunSpider, particularly in a number of the bitop + tests where the called functions are very fast. + + * VM/CTI.cpp: + (JSC::CTI::emitInitialiseRegister): + (JSC::CTI::privateCompileMainPass): + * VM/CTI.h: + * VM/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::CodeGenerator): + * VM/Machine.cpp: + (JSC::slideRegisterWindowForCall): + (JSC::Machine::privateExecute): + * VM/Opcode.h: + +2008-09-19 Sam Weinig <sam@webkit.org> + + Reviewed by Darin Adler. + + Patch for https://bugs.webkit.org/show_bug.cgi?id=20928 + Speed up JS property enumeration by caching entire PropertyNameArray + + 1.3% speedup on Sunspider, 30% on string-fasta. + + * JavaScriptCore.exp: + * VM/JSPropertyNameIterator.cpp: + (JSC::JSPropertyNameIterator::~JSPropertyNameIterator): + (JSC::JSPropertyNameIterator::invalidate): + * VM/JSPropertyNameIterator.h: + (JSC::JSPropertyNameIterator::JSPropertyNameIterator): + (JSC::JSPropertyNameIterator::create): + * kjs/JSObject.cpp: + (JSC::JSObject::getPropertyNames): + * kjs/PropertyMap.cpp: + (JSC::PropertyMap::getEnumerablePropertyNames): + * kjs/PropertyMap.h: + * kjs/PropertyNameArray.cpp: + (JSC::PropertyNameArray::add): + * kjs/PropertyNameArray.h: + (JSC::PropertyNameArrayData::create): + (JSC::PropertyNameArrayData::propertyNameVector): + (JSC::PropertyNameArrayData::setCachedPrototypeChain): + (JSC::PropertyNameArrayData::cachedPrototypeChain): + (JSC::PropertyNameArrayData::begin): + (JSC::PropertyNameArrayData::end): + (JSC::PropertyNameArrayData::PropertyNameArrayData): + (JSC::PropertyNameArray::PropertyNameArray): + (JSC::PropertyNameArray::addKnownUnique): + (JSC::PropertyNameArray::size): + (JSC::PropertyNameArray::operator[]): + (JSC::PropertyNameArray::begin): + (JSC::PropertyNameArray::end): + (JSC::PropertyNameArray::setData): + (JSC::PropertyNameArray::data): + (JSC::PropertyNameArray::releaseData): + * kjs/ScopeChain.cpp: + (JSC::ScopeChainNode::print): + * kjs/StructureID.cpp: + (JSC::structureIDChainsAreEqual): + (JSC::StructureID::getEnumerablePropertyNames): + (JSC::StructureID::clearEnumerationCache): + (JSC::StructureID::createCachedPrototypeChain): + * kjs/StructureID.h: + +2008-09-19 Holger Hans Peter Freyther <zecke@selfish.org> + + Reviewed by Maciej Stachowiak. + + Fix a mismatched new[]/delete in JSObject::allocatePropertyStorage + + * kjs/JSObject.cpp: + (JSC::JSObject::allocatePropertyStorage): Spotted by valgrind. + +2008-09-19 Darin Adler <darin@apple.com> + + Reviewed by Sam Weinig. + + - part 2 of https://bugs.webkit.org/show_bug.cgi?id=20858 + make each distinct C++ class get a distinct JSC::Structure + + * JavaScriptCore.exp: Exported constructEmptyObject for use in WebCore. + + * kjs/JSGlobalObject.h: Changed the protected constructor to take a + structure instead of a prototype. + + * kjs/JSVariableObject.h: Removed constructor that takes a prototype. + +2008-09-19 Julien Chaffraix <jchaffraix@pleyo.com> + + Reviewed by Alexey Proskuryakov. + + Use the template hoisting technique on the RefCounted class. This reduces the code bloat due to + non-template methods' code been copied for each instance of the template. + The patch splits RefCounted between a base class that holds non-template methods and attributes + and the template RefCounted class that keeps the same functionnality. + + On my Linux with gcc 4.3 for the Gtk port, this is: + - a ~600KB save on libwebkit.so in release. + - a ~1.6MB save on libwebkit.so in debug. + + It is a wash on Sunspider and a small win on Dromaeo (not sure it is relevant). + On the whole, it should be a small win as we reduce the compiled code size and the only + new function call should be inlined by the compiler. + + * wtf/RefCounted.h: + (WTF::RefCountedBase::ref): Copied from RefCounted. + (WTF::RefCountedBase::hasOneRef): Ditto. + (WTF::RefCountedBase::refCount): Ditto. + (WTF::RefCountedBase::RefCountedBase): Ditto. + (WTF::RefCountedBase::~RefCountedBase): Ditto. + (WTF::RefCountedBase::derefBase): Tweaked from the RefCounted version to remove + template section. + (WTF::RefCounted::RefCounted): + (WTF::RefCounted::deref): Small wrapper around RefCountedBase::derefBase(). + (WTF::RefCounted::~RefCounted): Keep private destructor. + +2008-09-18 Darin Adler <darin@apple.com> + + Reviewed by Maciej Stachowiak. + + - part 1 of https://bugs.webkit.org/show_bug.cgi?id=20858 + make each distinct C++ class get a distinct JSC::Structure + + * kjs/lookup.h: Removed things here that were used only in WebCore: + cacheGlobalObject, JSC_DEFINE_PROTOTYPE, JSC_DEFINE_PROTOTYPE_WITH_PROTOTYPE, + and JSC_IMPLEMENT_PROTOTYPE. + +2008-09-18 Darin Adler <darin@apple.com> + + Reviewed by Maciej Stachowiak. + + - https://bugs.webkit.org/show_bug.cgi?id=20927 + simplify/streamline the code to turn strings into identifiers while parsing + + * kjs/grammar.y: Get rid of string from the union, and use ident for STRING as + well as for IDENT. + + * kjs/lexer.cpp: + (JSC::Lexer::lex): Use makeIdentifier instead of makeUString for String. + * kjs/lexer.h: Remove makeUString. + + * kjs/nodes.h: Changed StringNode to hold an Identifier instead of UString. + + * VM/CodeGenerator.cpp: + (JSC::keyForCharacterSwitch): Updated since StringNode now holds an Identifier. + (JSC::prepareJumpTableForStringSwitch): Ditto. + * kjs/nodes.cpp: + (JSC::StringNode::emitCode): Ditto. The comment from here is now in the lexer. + (JSC::processClauseList): Ditto. + * kjs/nodes2string.cpp: + (JSC::StringNode::streamTo): Ditto. + +2008-09-18 Sam Weinig <sam@webkit.org> + + Fix style. + + * VM/Instruction.h: + (JSC::Instruction::Instruction): + +2008-09-18 Oliver Hunt <oliver@apple.com> + + Reviewed by Maciej Stachowiak. + + Bug 20911: REGRESSION(r36480?): Reproducible assertion failure below derefStructureIDs 64-bit JavaScriptCore + <https://bugs.webkit.org/show_bug.cgi?id=20911> + + The problem was simply caused by the int constructor for Instruction + failing to initialise the full struct in 64bit builds. + + * VM/Instruction.h: + (JSC::Instruction::Instruction): + +2008-09-18 Darin Adler <darin@apple.com> + + - fix release build + + * wtf/RefCountedLeakCounter.cpp: Removed stray "static". + +2008-09-18 Darin Adler <darin@apple.com> + + Reviewed by Sam Weinig. + + * kjs/JSGlobalObject.h: Tiny style guideline tweak. + +2008-09-18 Darin Adler <darin@apple.com> + + Reviewed by Sam Weinig. + + - fix https://bugs.webkit.org/show_bug.cgi?id=20925 + LEAK messages appear every time I quit + + * JavaScriptCore.exp: Updated, and also added an export + needed for future WebCore use of JSC::StructureID. + + * wtf/RefCountedLeakCounter.cpp: + (WTF::RefCountedLeakCounter::suppressMessages): Added. + (WTF::RefCountedLeakCounter::cancelMessageSuppression): Added. + (WTF::RefCountedLeakCounter::RefCountedLeakCounter): Tweaked a bit. + (WTF::RefCountedLeakCounter::~RefCountedLeakCounter): Added code to + log the reason there was no leak checking done. + (WTF::RefCountedLeakCounter::increment): Tweaked a bit. + (WTF::RefCountedLeakCounter::decrement): Ditto. + + * wtf/RefCountedLeakCounter.h: Replaced setLogLeakMessages with two + new functions, suppressMessages and cancelMessageSuppression. Also + added m_ prefixes to the data member names. + +2008-09-18 Holger Hans Peter Freyther <zecke@selfish.org> + + Reviewed by Mark Rowe. + + https://bugs.webkit.org/show_bug.cgi?id=20437 + + Add a proper #define to define which XML Parser implementation to use. Client + code can use #if USE(QXMLSTREAM) to decide if the Qt XML StreamReader + implementation is going to be used. + + * wtf/Platform.h: + +2008-09-18 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Maciej Stachowiak. + + Make a Unicode non-breaking space count as a whitespace character in + PCRE. This change was already made in WREC, and it fixes one of the + Mozilla JS tests. Since it is now fixed in PCRE as well, we can check + in a new set of expected test results. + + * pcre/pcre_internal.h: + (isSpaceChar): + * tests/mozilla/expected.html: + +2008-09-18 Stephanie Lewis <slewis@apple.com> + + Reviewed by Mark Rowe and Maciej Stachowiak. + + add an option use arch to specify which architecture to run. + + * tests/mozilla/jsDriver.pl: + +2008-09-17 Oliver Hunt <oliver@apple.com> + + Correctly restore argument reference prior to SFX runtime calls. + + Reviewed by Steve Falkenburg. + + * VM/CTI.cpp: + (JSC::CTI::privateCompileSlowCases): + (JSC::CTI::privateCompile): + +2008-09-17 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Maciej Stachowiak. + + Bug 20876: REGRESSION (r36417, r36427): fast/js/exception-expression-offset.html fails + <https://bugs.webkit.org/show_bug.cgi?id=20876> + + r36417 and r36427 caused an get_by_id opcode to be emitted before the + instanceof and construct opcodes, in order to enable inline caching of + the prototype property. Unfortunately, this regressed some tests dealing + with exceptions thrown by 'instanceof' and the 'new' operator. We fix + these problems by detecting whether an "is not an object" exception is + thrown before op_instanceof or op_construct, and emit the proper + exception in those cases. + + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::emitConstruct): + * VM/CodeGenerator.h: + * VM/ExceptionHelpers.cpp: + (JSC::createInvalidParamError): + (JSC::createNotAConstructorError): + (JSC::createNotAnObjectError): + * VM/ExceptionHelpers.h: + * VM/Machine.cpp: + (JSC::Machine::getOpcode): + (JSC::Machine::privateExecute): + * VM/Machine.h: + * kjs/nodes.cpp: + (JSC::NewExprNode::emitCode): + (JSC::InstanceOfNode::emitCode): + +2008-09-17 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + JIT generation cti_op_construct_verify. + + Quarter to half percent progression on v8-tests. + Roughly not change on SunSpider (possible minor progression). + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): + * VM/Machine.cpp: + * VM/Machine.h: + +2008-09-15 Steve Falkenburg <sfalken@apple.com> + + Improve timer accuracy for JavaScript Date object on Windows. + + Use a combination of ftime and QueryPerformanceCounter. + ftime returns the information we want, but doesn't have sufficient resolution. + QueryPerformanceCounter has high resolution, but is only usable to measure time intervals. + To combine them, we call ftime and QueryPerformanceCounter initially. Later calls will use + QueryPerformanceCounter by itself, adding the delta to the saved ftime. We re-sync to + correct for drift if the low-res and high-res elapsed time between calls differs by more + than twice the low-resolution timer resolution. + + QueryPerformanceCounter may be inaccurate due to a problems with: + - some PCI bridge chipsets (http://support.microsoft.com/kb/274323) + - BIOS bugs (http://support.microsoft.com/kb/895980/) + - BIOS/HAL bugs on multiprocessor/multicore systems (http://msdn.microsoft.com/en-us/library/ms644904.aspx) + + Reviewed by Darin Adler. + + * kjs/DateMath.cpp: + (JSC::highResUpTime): + (JSC::lowResUTCTime): + (JSC::qpcAvailable): + (JSC::getCurrentUTCTimeWithMicroseconds): + +2008-09-17 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Implement JIT generation of CallFrame initialization, for op_call. + + 1% sunspider 2.5% v8-tests. + + * VM/CTI.cpp: + (JSC::CTI::compileOpCall): + * VM/Machine.cpp: + (JSC::Machine::cti_op_call_JSFunction): + (JSC::Machine::cti_op_call_NotJSFunction): + +2008-09-17 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Optimizations for op_call in CTI. Move check for (ctiCode == 0) into JIT code, + move copying of scopeChain for CodeBlocks that needFullScopeChain into head of + functions, instead of checking prior to making the call. + + 3% on v8-tests (4% on richards, 6% in delta-blue) + + * VM/CTI.cpp: + (JSC::CTI::compileOpCall): + (JSC::CTI::privateCompileSlowCases): + (JSC::CTI::privateCompile): + * VM/Machine.cpp: + (JSC::Machine::execute): + (JSC::Machine::cti_op_call_JSFunction): + (JSC::Machine::cti_vm_compile): + (JSC::Machine::cti_vm_updateScopeChain): + (JSC::Machine::cti_op_construct_JSConstruct): + * VM/Machine.h: + +2008-09-17 Tor Arne Vestbø <tavestbo@trolltech.com> + + Fix the QtWebKit/Mac build + + * wtf/ThreadingQt.cpp: + (WTF::initializeThreading): use QCoreApplication to get the main thread + +2008-09-16 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Maciej Stachowiak. + + Bug 20857: REGRESSION (r36427): ASSERTION FAILED: m_refCount >= 0 in RegisterID::deref() + <https://bugs.webkit.org/show_bug.cgi?id=20857> + + Fix a problem stemming from the slightly unsafe behaviour of the + CodeGenerator::finalDestination() method by putting the "func" argument + of the emitConstruct() method in a RefPtr in its caller. Also, add an + assertion guaranteeing that this is always the case. + + CodeGenerator::finalDestination() is still incorrect and can cause + problems with a different allocator; see bug 20340 for more details. + + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::emitConstruct): + * kjs/nodes.cpp: + (JSC::NewExprNode::emitCode): + +2008-09-16 Alice Liu <alice.liu@apple.com> + + build fix. + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): + +2008-09-16 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + CTI code generation for op_ret. The majority of the work + (updating variables on the stack & on exec) can be performed + directly in generated code. + + We still need to check, & to call out to C-code to handle + activation records, profiling, and full scope chains. + + +1.5% Sunspider, +5/6% v8 tests. + + * VM/CTI.cpp: + (JSC::CTI::emitPutCTIParam): + (JSC::CTI::compileOpCall): + (JSC::CTI::privateCompileMainPass): + * VM/CTI.h: + * VM/Machine.cpp: + (JSC::Machine::cti_op_ret_activation): + (JSC::Machine::cti_op_ret_profiler): + (JSC::Machine::cti_op_ret_scopeChain): + * VM/Machine.h: + +2008-09-16 Dimitri Glazkov <dglazkov@chromium.org> + + Fix the Windows build. + + Add some extra parentheses to stop MSVC from complaining so much. + + * VM/Machine.cpp: + (JSC::Machine::privateExecute): + (JSC::Machine::cti_op_stricteq): + (JSC::Machine::cti_op_nstricteq): + * kjs/operations.cpp: + (JSC::strictEqual): + +2008-09-15 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Cameron Zwarich. + + - speed up the === and !== operators by choosing the fast cases better + + No effect on SunSpider but speeds up the V8 EarlyBoyer benchmark about 4%. + + * VM/Machine.cpp: + (JSC::Machine::privateExecute): + (JSC::Machine::cti_op_stricteq): + (JSC::Machine::cti_op_nstricteq): + * kjs/JSImmediate.h: + (JSC::JSImmediate::areBothImmediate): + * kjs/operations.cpp: + (JSC::strictEqual): + (JSC::strictEqualSlowCase): + * kjs/operations.h: + +2008-09-15 Oliver Hunt <oliver@apple.com> + + RS=Sam Weinig. + + Coding style cleanup. + + * VM/Machine.cpp: + (JSC::Machine::privateExecute): + +2008-09-15 Oliver Hunt <oliver@apple.com> + + Reviewed by Cameron Zwarich. + + Bug 20874: op_resolve does not do any form of caching + <https://bugs.webkit.org/show_bug.cgi?id=20874> + + This patch adds an op_resolve_global opcode to handle (and cache) + property lookup we can statically determine must occur on the global + object (if at all). + + 3% progression on sunspider, 3.2x improvement to bitops-bitwise-and, and + 10% in math-partial-sums + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): + * VM/CTI.h: + * VM/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::findScopedProperty): + (JSC::CodeGenerator::emitResolve): + * VM/Machine.cpp: + (JSC::resolveGlobal): + (JSC::Machine::privateExecute): + (JSC::Machine::cti_op_resolve_global): + * VM/Machine.h: + * VM/Opcode.h: + +2008-09-15 Sam Weinig <sam@webkit.org> + + Roll out r36462. It broke document.all. + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + * VM/CTI.h: + * VM/Machine.cpp: + (JSC::Machine::Machine): + (JSC::Machine::cti_op_eq_null): + (JSC::Machine::cti_op_neq_null): + * VM/Machine.h: + (JSC::Machine::isJSString): + * kjs/JSCell.h: + * kjs/JSWrapperObject.h: + * kjs/StringObject.h: + * kjs/StringObjectThatMasqueradesAsUndefined.h: + +2008-09-15 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Maciej Stachowiak. + + Bug 20863: ASSERTION FAILED: addressOffset < instructions.size() in CodeBlock::getHandlerForVPC + <https://bugs.webkit.org/show_bug.cgi?id=20863> + + r36427 changed the number of arguments to op_construct without changing + the argument index for the vPC in the call to initializeCallFrame() in + the CTI case. This caused a JSC test failure. Correcting the argument + index fixes the test failure. + + * VM/Machine.cpp: + (JSC::Machine::cti_op_construct_JSConstruct): + +2008-09-15 Mark Rowe <mrowe@apple.com> + + Fix GCC 4.2 build. + + * VM/CTI.h: + +2008-09-15 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Maciej Stachowiak. + + Fixed a typo in op_get_by_id_chain that caused it to miss every time + in the interpreter. + + Also, a little cleanup. + + * VM/Machine.cpp: + (JSC::Machine::privateExecute): Set up baseObject before entering the + loop, so we compare against the right values. + +2008-09-15 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Removed the CalledAsConstructor flag from the call frame header. Now, + we use an explicit opcode at the call site to fix up constructor results. + + SunSpider says 0.4% faster. + + cti_op_construct_verify is an out-of-line function call for now, but we + can fix that once StructureID holds type information like isObject. + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): Codegen for the new opcode. + + * VM/CodeBlock.cpp: + (JSC::CodeBlock::dump): + + * VM/CodeGenerator.cpp: Codegen for the new opcode. Also... + (JSC::CodeGenerator::emitCall): ... don't test for known non-zero value. + (JSC::CodeGenerator::emitConstruct): ... ditto. + + * VM/Machine.cpp: No more CalledAsConstructor + (JSC::Machine::privateExecute): Implementation for the new opcode. + (JSC::Machine::cti_op_ret): The speedup: no need to check whether we were + called as a constructor. + (JSC::Machine::cti_op_construct_verify): Implementation for the new opcode. + * VM/Machine.h: + + * VM/Opcode.h: Declare new opcode. + + * VM/RegisterFile.h: + (JSC::RegisterFile::): No more CalledAsConstructor + +2008-09-15 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Inline code generation of eq_null/neq_null for CTI. Uses vptr checking for + StringObjectsThatAreMasqueradingAsBeingUndefined. In the long run, the + masquerading may be handled differently (through the StructureIDs - see bug + #20823). + + >1% on v8-tests. + + * VM/CTI.cpp: + (JSC::CTI::emitJumpSlowCaseIfIsJSCell): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + * VM/CTI.h: + * VM/Machine.cpp: + (JSC::Machine::Machine): + (JSC::Machine::cti_op_eq_null): + (JSC::Machine::cti_op_neq_null): + * VM/Machine.h: + (JSC::Machine::doesMasqueradesAsUndefined): + * kjs/JSWrapperObject.h: + (JSC::JSWrapperObject::): + (JSC::JSWrapperObject::JSWrapperObject): + * kjs/StringObject.h: + (JSC::StringObject::StringObject): + * kjs/StringObjectThatMasqueradesAsUndefined.h: + (JSC::StringObjectThatMasqueradesAsUndefined::StringObjectThatMasqueradesAsUndefined): + +2008-09-15 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Rubber-stamped by Oliver Hunt. + + r36427 broke CodeBlock::dump() by changing the number of arguments to + op_construct without changing the code that prints it. This patch fixes + it by printing the additional argument. + + * JavaScriptCore.xcodeproj/project.pbxproj: + * VM/CodeBlock.cpp: + (JSC::CodeBlock::dump): + +2008-09-15 Adam Roben <aroben@apple.com> + + Build fix + + * kjs/StructureID.cpp: Removed a stray semicolon. + +2008-09-15 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Maciej Stachowiak. + + Fix a crash in fast/js/exception-expression-offset.html caused by not + updating all mentions of the length of op_construct in r36427. + + * VM/Machine.cpp: + (JSC::Machine::cti_op_construct_NotJSConstruct): + +2008-09-15 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Cameron Zwarich. + + - fix layout test failure introduced by fix for 20849 + + (The failing test was fast/js/delete-then-put.html) + + * kjs/JSObject.cpp: + (JSC::JSObject::removeDirect): Clear enumeration cache + in the dictionary case. + * kjs/JSObject.h: + (JSC::JSObject::putDirect): Ditto. + * kjs/StructureID.h: + (JSC::StructureID::clearEnumerationCache): Inline to handle the + clear. + +2008-09-15 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Cameron Zwarich. + + - fix JSC test failures introduced by fix for 20849 + + * kjs/PropertyMap.cpp: + (JSC::PropertyMap::getEnumerablePropertyNames): Use the correct count. + +2008-09-15 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Maciej Stachowiak. + + Bug 20851: REGRESSION (r36410): fast/js/kde/GlobalObject.html fails + <https://bugs.webkit.org/show_bug.cgi?id=20851> + + r36410 introduced an optimization for parseInt() that is incorrect when + its argument is larger than the range of a 32-bit integer. If the + argument is a number that is not an immediate integer, then the correct + behaviour is to return the floor of its value, unless it is an infinite + value, in which case the correct behaviour is to return 0. + + * kjs/JSGlobalObjectFunctions.cpp: + (JSC::globalFuncParseInt): + +2008-09-15 Sam Weinig <sam@webkit.org> + + Reviewed by Maciej Stachowiak. + + Patch for https://bugs.webkit.org/show_bug.cgi?id=20849 + Cache property names for getEnumerablePropertyNames in the StructureID. + + ~0.5% speedup on Sunspider overall (9.7% speedup on string-fasta). ~1% speedup + on the v8 test suite. + + * kjs/JSObject.cpp: + (JSC::JSObject::getPropertyNames): + * kjs/PropertyMap.cpp: + (JSC::PropertyMap::getEnumerablePropertyNames): + * kjs/PropertyMap.h: + * kjs/StructureID.cpp: + (JSC::StructureID::StructureID): + (JSC::StructureID::getEnumerablePropertyNames): + * kjs/StructureID.h: + +2008-09-14 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Cameron Zwarich. + + - speed up JS construction by extracting "prototype" lookup so PIC applies. + + ~0.5% speedup on SunSpider + Speeds up some of the V8 tests as well, most notably earley-boyer. + + * VM/CTI.cpp: + (JSC::CTI::compileOpCall): Account for extra arg for prototype. + (JSC::CTI::privateCompileMainPass): Account for increased size of op_construct. + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::emitConstruct): Emit separate lookup to get prototype property. + * VM/Machine.cpp: + (JSC::Machine::privateExecute): Expect prototype arg in op_construct. + (JSC::Machine::cti_op_construct_JSConstruct): ditto + (JSC::Machine::cti_op_construct_NotJSConstruct): ditto + +2008-09-10 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Eric Seidel. + + Add a protected destructor for RefCounted. + + It is wrong to call its destructor directly, because (1) this should be taken care of by + deref(), and (2) many classes that use RefCounted have non-virtual destructors. + + No change in behavior. + + * wtf/RefCounted.h: (WTF::RefCounted::~RefCounted): + +2008-09-14 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Sam Weinig. + + Accelerated property accesses. + + Inline more of the array access code into the JIT code for get/put_by_val. + Accelerate get/put_by_id by speculatively inlining a disable direct access + into the hot path of the code, and repatch this with the correct StructureID + and property map offset once these are known. In the case of accesses to the + prototype and reading the array-length a trampoline is genertaed, and the + branch to the slow-case is relinked to jump to this. + + By repatching, we mean rewriting the x86 instruction stream. Instructions are + only modified in a simple fasion - altering immediate operands, memory access + deisplacements, and branch offsets. + + For regular get_by_id/put_by_id accesses to an object, a StructureID in an + instruction's immediate operant is updateded, and a memory access operation's + displacement is updated to access the correct field on the object. In the case + of more complex accesses (array length and get_by_id_prototype) the offset on + the branch to slow-case is updated, to now jump to a trampoline. + + +2.8% sunspider, +13% v8-tests + + * VM/CTI.cpp: + (JSC::CTI::emitCall): + (JSC::CTI::emitJumpSlowCaseIfNotJSCell): + (JSC::CTI::CTI): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + (JSC::CTI::privateCompile): + (JSC::CTI::privateCompileGetByIdSelf): + (JSC::CTI::privateCompileGetByIdProto): + (JSC::CTI::privateCompileGetByIdChain): + (JSC::CTI::privateCompilePutByIdReplace): + (JSC::CTI::privateCompilePutByIdTransition): + (JSC::CTI::privateCompileArrayLengthTrampoline): + (JSC::CTI::privateCompileStringLengthTrampoline): + (JSC::CTI::patchGetByIdSelf): + (JSC::CTI::patchPutByIdReplace): + (JSC::CTI::privateCompilePatchGetArrayLength): + (JSC::CTI::privateCompilePatchGetStringLength): + * VM/CTI.h: + (JSC::CTI::compileGetByIdSelf): + (JSC::CTI::compileGetByIdProto): + (JSC::CTI::compileGetByIdChain): + (JSC::CTI::compilePutByIdReplace): + (JSC::CTI::compilePutByIdTransition): + (JSC::CTI::compileArrayLengthTrampoline): + (JSC::CTI::compileStringLengthTrampoline): + (JSC::CTI::compilePatchGetArrayLength): + (JSC::CTI::compilePatchGetStringLength): + * VM/CodeBlock.cpp: + (JSC::CodeBlock::dump): + (JSC::CodeBlock::~CodeBlock): + * VM/CodeBlock.h: + (JSC::StructureStubInfo::StructureStubInfo): + (JSC::CodeBlock::getStubInfo): + * VM/Machine.cpp: + (JSC::Machine::tryCTICachePutByID): + (JSC::Machine::tryCTICacheGetByID): + (JSC::Machine::cti_op_put_by_val_array): + * VM/Machine.h: + * masm/X86Assembler.h: + (JSC::X86Assembler::): + (JSC::X86Assembler::cmpl_i8m): + (JSC::X86Assembler::emitUnlinkedJa): + (JSC::X86Assembler::getRelocatedAddress): + (JSC::X86Assembler::getDifferenceBetweenLabels): + (JSC::X86Assembler::emitModRm_opmsib): + +2008-09-14 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Cameron Zwarich. + + - split the "prototype" lookup for hasInstance into opcode stream so it can be cached + + ~5% speedup on v8 earley-boyer test + + * API/JSCallbackObject.h: Add a parameter for the pre-looked-up prototype. + * API/JSCallbackObjectFunctions.h: + (JSC::::hasInstance): Ditto. + * API/JSValueRef.cpp: + (JSValueIsInstanceOfConstructor): Look up and pass in prototype. + * JavaScriptCore.exp: + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): Pass along prototype. + * VM/CodeBlock.cpp: + (JSC::CodeBlock::dump): Print third arg. + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::emitInstanceOf): Implement this, now that there + is a third argument. + * VM/CodeGenerator.h: + * VM/Machine.cpp: + (JSC::Machine::privateExecute): Pass along the prototype. + (JSC::Machine::cti_op_instanceof): ditto + * kjs/JSObject.cpp: + (JSC::JSObject::hasInstance): Expect to get a pre-looked-up prototype. + * kjs/JSObject.h: + * kjs/nodes.cpp: + (JSC::InstanceOfNode::emitCode): Emit a get_by_id of the prototype + property and pass that register to instanceof. + * kjs/nodes.h: + +2008-09-14 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Sam Weinig. + + Remove unnecessary virtual function call from cti_op_call_JSFunction - + ~5% on richards, ~2.5% on v8-tests, ~0.5% on sunspider. + + * VM/Machine.cpp: + (JSC::Machine::cti_op_call_JSFunction): + +2008-09-14 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Maciej Stachowiak. + + Bug 20827: the 'typeof' operator is slow + <https://bugs.webkit.org/show_bug.cgi?id=20827> + + Optimize the 'typeof' operator when its result is compared to a constant + string. + + This is a 5.5% speedup on the V8 Earley-Boyer test. + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): + * VM/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::emitEqualityOp): + * VM/CodeGenerator.h: + * VM/Machine.cpp: + (JSC::jsIsObjectType): + (JSC::jsIsFunctionType): + (JSC::Machine::privateExecute): + (JSC::Machine::cti_op_is_undefined): + (JSC::Machine::cti_op_is_boolean): + (JSC::Machine::cti_op_is_number): + (JSC::Machine::cti_op_is_string): + (JSC::Machine::cti_op_is_object): + (JSC::Machine::cti_op_is_function): + * VM/Machine.h: + * VM/Opcode.h: + * kjs/nodes.cpp: + (JSC::BinaryOpNode::emitCode): + (JSC::EqualNode::emitCode): + (JSC::StrictEqualNode::emitCode): + * kjs/nodes.h: + +2008-09-14 Sam Weinig <sam@webkit.org> + + Reviewed by Cameron Zwarich. + + Patch for https://bugs.webkit.org/show_bug.cgi?id=20844 + Speed up parseInt for numbers + + Sunspider reports this as 1.029x as fast overall and 1.37x as fast on string-unpack-code. + No change on the v8 suite. + + * kjs/JSGlobalObjectFunctions.cpp: + (JSC::globalFuncParseInt): Don't convert numbers to strings just to + convert them back to numbers. + +2008-09-14 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Oliver Hunt. + + Bug 20816: op_lesseq should be optimized + <https://bugs.webkit.org/show_bug.cgi?id=20816> + + Add a loop_if_lesseq opcode that is similar to the loop_if_less opcode. + + This is a 9.4% speedup on the V8 Crypto benchmark. + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + * VM/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::emitJumpIfTrue): + * VM/Machine.cpp: + (JSC::Machine::privateExecute): + (JSC::Machine::cti_op_loop_if_lesseq): + * VM/Machine.h: + * VM/Opcode.h: + +2008-09-14 Sam Weinig <sam@webkit.org> + + Reviewed by Cameron Zwarich. + + Cleanup Sampling code. + + * VM/CTI.cpp: + (JSC::CTI::emitCall): + (JSC::CTI::privateCompileMainPass): + * VM/CTI.h: + (JSC::CTI::execute): + * VM/SamplingTool.cpp: + (JSC::): + (JSC::SamplingTool::run): + (JSC::SamplingTool::dump): + * VM/SamplingTool.h: + (JSC::SamplingTool::callingHostFunction): + +2008-09-13 Oliver Hunt <oliver@apple.com> + + Reviewed by Cameron Zwarich. + + Bug 20821: Cache property transitions to speed up object initialization + https://bugs.webkit.org/show_bug.cgi?id=20821 + + Implement a transition cache to improve the performance of new properties + being added to objects. This is extremely beneficial in constructors and + shows up as a 34% improvement on access-binary-trees in SunSpider (0.8% + overall) + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): + (JSC::): + (JSC::transitionWillNeedStorageRealloc): + (JSC::CTI::privateCompilePutByIdTransition): + * VM/CTI.h: + (JSC::CTI::compilePutByIdTransition): + * VM/CodeBlock.cpp: + (JSC::printPutByIdOp): + (JSC::CodeBlock::printStructureIDs): + (JSC::CodeBlock::dump): + (JSC::CodeBlock::derefStructureIDs): + (JSC::CodeBlock::refStructureIDs): + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::emitPutById): + * VM/Machine.cpp: + (JSC::cachePrototypeChain): + (JSC::Machine::tryCachePutByID): + (JSC::Machine::tryCacheGetByID): + (JSC::Machine::privateExecute): + (JSC::Machine::tryCTICachePutByID): + (JSC::Machine::tryCTICacheGetByID): + * VM/Machine.h: + * VM/Opcode.h: + * kjs/JSObject.h: + (JSC::JSObject::putDirect): + (JSC::JSObject::transitionTo): + * kjs/PutPropertySlot.h: + (JSC::PutPropertySlot::PutPropertySlot): + (JSC::PutPropertySlot::wasTransition): + (JSC::PutPropertySlot::setWasTransition): + * kjs/StructureID.cpp: + (JSC::StructureID::transitionTo): + (JSC::StructureIDChain::StructureIDChain): + * kjs/StructureID.h: + (JSC::StructureID::previousID): + (JSC::StructureID::setCachedPrototypeChain): + (JSC::StructureID::cachedPrototypeChain): + (JSC::StructureID::propertyMap): + * masm/X86Assembler.h: + (JSC::X86Assembler::addl_i8m): + (JSC::X86Assembler::subl_i8m): + +2008-09-12 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Maciej Stachowiak. + + Bug 20819: JSValue::isObject() is slow + <https://bugs.webkit.org/show_bug.cgi?id=20819> + + Optimize JSCell::isObject() and JSCell::isString() by making them + non-virtual calls that rely on the StructureID type information. + + This is a 0.7% speedup on SunSpider and a 1.0% speedup on the V8 + benchmark suite. + + * JavaScriptCore.exp: + * kjs/JSCell.cpp: + * kjs/JSCell.h: + (JSC::JSCell::isObject): + (JSC::JSCell::isString): + * kjs/JSObject.cpp: + * kjs/JSObject.h: + * kjs/JSString.cpp: + * kjs/JSString.h: + (JSC::JSString::JSString): + * kjs/StructureID.h: + (JSC::StructureID::type): + +2008-09-11 Stephanie Lewis <slewis@apple.com> + + Reviewed by Oliver Hunt. + + Turn off PGO Optimization on CTI.cpp -> <rdar://problem/6207709>. Fixes + crash on CNN and on Dromaeo. + Fix Missing close tag in vcproj. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + +2008-09-11 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Not reviewed. + + Correct an SVN problem with the last commit and actually add the new + files. + + * wrec/CharacterClassConstructor.cpp: Added. + (JSC::): + (JSC::getCharacterClassNewline): + (JSC::getCharacterClassDigits): + (JSC::getCharacterClassSpaces): + (JSC::getCharacterClassWordchar): + (JSC::getCharacterClassNondigits): + (JSC::getCharacterClassNonspaces): + (JSC::getCharacterClassNonwordchar): + (JSC::CharacterClassConstructor::addSorted): + (JSC::CharacterClassConstructor::addSortedRange): + (JSC::CharacterClassConstructor::put): + (JSC::CharacterClassConstructor::flush): + (JSC::CharacterClassConstructor::append): + * wrec/CharacterClassConstructor.h: Added. + (JSC::CharacterClassConstructor::CharacterClassConstructor): + (JSC::CharacterClassConstructor::isUpsideDown): + (JSC::CharacterClassConstructor::charClass): + +2008-09-11 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Maciej Stachowiak. + + Bug 20788: Split CharacterClassConstructor into its own file + <https://bugs.webkit.org/show_bug.cgi?id=20788> + + Split CharacterClassConstructor into its own file and clean up some + style issues. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * wrec/CharacterClassConstructor.cpp: Added. + (JSC::): + (JSC::getCharacterClassNewline): + (JSC::getCharacterClassDigits): + (JSC::getCharacterClassSpaces): + (JSC::getCharacterClassWordchar): + (JSC::getCharacterClassNondigits): + (JSC::getCharacterClassNonspaces): + (JSC::getCharacterClassNonwordchar): + (JSC::CharacterClassConstructor::addSorted): + (JSC::CharacterClassConstructor::addSortedRange): + (JSC::CharacterClassConstructor::put): + (JSC::CharacterClassConstructor::flush): + (JSC::CharacterClassConstructor::append): + * wrec/CharacterClassConstructor.h: Added. + (JSC::CharacterClassConstructor::CharacterClassConstructor): + (JSC::CharacterClassConstructor::isUpsideDown): + (JSC::CharacterClassConstructor::charClass): + * wrec/WREC.cpp: + (JSC::WRECParser::parseCharacterClass): + +2008-09-10 Simon Hausmann <hausmann@webkit.org> + + Not reviewed but trivial one-liner for yet unused macro. + + Changed PLATFORM(WINCE) to PLATFORM(WIN_CE) as requested by Mark. + + (part of https://bugs.webkit.org/show_bug.cgi?id=20746) + + * wtf/Platform.h: + +2008-09-10 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Rubber-stamped by Oliver Hunt. + + Fix a typo by renaming the overloaded orl_rr that takes an immediate to + orl_i32r. + + * VM/CTI.cpp: + (JSC::CTI::emitFastArithPotentiallyReTagImmediate): + * masm/X86Assembler.h: + (JSC::X86Assembler::orl_i32r): + * wrec/WREC.cpp: + (JSC::WRECGenerator::generatePatternCharacter): + (JSC::WRECGenerator::generateCharacterClassInverted): + +2008-09-10 Sam Weinig <sam@webkit.org> + + Reviewed by Geoff Garen. + + Add inline property storage for JSObject. + + 1.2% progression on Sunspider. .5% progression on the v8 test suite. + + * JavaScriptCore.exp: + * VM/CTI.cpp: + (JSC::CTI::privateCompileGetByIdProto): + (JSC::CTI::privateCompileGetByIdChain): + * kjs/JSObject.cpp: + (JSC::JSObject::mark): There is no reason to check storageSize now that + we start from 0. + (JSC::JSObject::allocatePropertyStorage): Allocates/reallocates heap storage. + * kjs/JSObject.h: + (JSC::JSObject::offsetForLocation): m_propertyStorage is not an OwnArrayPtr + now so there is no reason to .get() + (JSC::JSObject::usingInlineStorage): + (JSC::JSObject::JSObject): Start with m_propertyStorage pointing to the + inline storage. + (JSC::JSObject::~JSObject): Free the heap storage if not using the inline + storage. + (JSC::JSObject::putDirect): Switch to the heap storage only when we know + we know that we are about to add a property that will overflow the inline + storage. + * kjs/PropertyMap.cpp: + (JSC::PropertyMap::createTable): Don't allocate the propertyStorage, that is + now handled by JSObject. + (JSC::PropertyMap::rehash): PropertyStorage is not a OwnArrayPtr anymore. + * kjs/PropertyMap.h: + (JSC::PropertyMap::storageSize): Rename from markingCount. + * kjs/StructureID.cpp: + (JSC::StructureID::addPropertyTransition): Don't resize the property storage + if we are using inline storage. + * kjs/StructureID.h: + +2008-09-10 Oliver Hunt <oliver@apple.com> + + Reviewed by Geoff Garen. + + Inline immediate number version of op_mul. + + Renamed mull_rr to imull_rr as that's what it's + actually doing, and added imull_i32r for the constant + case immediate multiply. + + 1.1% improvement to SunSpider. + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + * masm/X86Assembler.h: + (JSC::X86Assembler::): + (JSC::X86Assembler::imull_rr): + (JSC::X86Assembler::imull_i32r): + +2008-09-10 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Not reviewed. + + Mac build fix. + + * JavaScriptCore.xcodeproj/project.pbxproj: + +2008-09-09 Oliver Hunt <oliver@apple.com> + + Reviewed by Maciej Stachowiak. + + Add optimised access to known properties on the global object. + + Improve cross scope access to the global object by emitting + code to access it directly rather than by walking the scope chain. + + This is a 0.8% win in SunSpider and a 1.7% win in the v8 benchmarks. + + * VM/CTI.cpp: + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::emitGetVariableObjectRegister): + (JSC::CTI::emitPutVariableObjectRegister): + * VM/CTI.h: + * VM/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * VM/CodeGenerator.cpp: + (JSC::CodeGenerator::findScopedProperty): + (JSC::CodeGenerator::emitResolve): + (JSC::CodeGenerator::emitGetScopedVar): + (JSC::CodeGenerator::emitPutScopedVar): + * VM/CodeGenerator.h: + * VM/Machine.cpp: + (JSC::Machine::privateExecute): + * VM/Opcode.h: + * kjs/nodes.cpp: + (JSC::FunctionCallResolveNode::emitCode): + (JSC::PostfixResolveNode::emitCode): + (JSC::PrefixResolveNode::emitCode): + (JSC::ReadModifyResolveNode::emitCode): + (JSC::AssignResolveNode::emitCode): + +2008-09-10 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Oliver. + + - enable polymorphic inline caching of properties of primitives + + 1.012x speedup on SunSpider. + + We create special structure IDs for JSString and + JSNumberCell. Unlike normal structure IDs, these cannot hold the + true prototype. Due to JS autoboxing semantics, the prototype used + when looking up string or number properties depends on the lexical + global object of the call site, not the creation site. Thus we + enable StructureIDs to handle this quirk for primitives. + + Everything else should be straightforward. + + * VM/CTI.cpp: + (JSC::CTI::privateCompileGetByIdProto): + (JSC::CTI::privateCompileGetByIdChain): + * VM/CTI.h: + (JSC::CTI::compileGetByIdProto): + (JSC::CTI::compileGetByIdChain): + * VM/JSPropertyNameIterator.h: + (JSC::JSPropertyNameIterator::JSPropertyNameIterator): + * VM/Machine.cpp: + (JSC::Machine::Machine): + (JSC::cachePrototypeChain): + (JSC::Machine::tryCachePutByID): + (JSC::Machine::tryCacheGetByID): + (JSC::Machine::privateExecute): + (JSC::Machine::tryCTICachePutByID): + (JSC::Machine::tryCTICacheGetByID): + * kjs/GetterSetter.h: + (JSC::GetterSetter::GetterSetter): + * kjs/JSCell.h: + * kjs/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + * kjs/JSGlobalData.h: + * kjs/JSGlobalObject.h: + (JSC::StructureID::prototypeForLookup): + * kjs/JSNumberCell.h: + (JSC::JSNumberCell::JSNumberCell): + (JSC::jsNumberCell): + * kjs/JSObject.h: + (JSC::JSObject::prototype): + * kjs/JSString.cpp: + (JSC::jsString): + (JSC::jsSubstring): + (JSC::jsOwnedString): + * kjs/JSString.h: + (JSC::JSString::JSString): + (JSC::JSString::): + (JSC::jsSingleCharacterString): + (JSC::jsSingleCharacterSubstring): + (JSC::jsNontrivialString): + * kjs/SmallStrings.cpp: + (JSC::SmallStrings::createEmptyString): + (JSC::SmallStrings::createSingleCharacterString): + * kjs/StructureID.cpp: + (JSC::StructureID::StructureID): + (JSC::StructureID::addPropertyTransition): + (JSC::StructureID::getterSetterTransition): + (JSC::StructureIDChain::StructureIDChain): + * kjs/StructureID.h: + (JSC::StructureID::create): + (JSC::StructureID::storedPrototype): + +2008-09-09 Joerg Bornemann <joerg.bornemann@trolltech.com> + + Reviewed by Sam Weinig. + + https://bugs.webkit.org/show_bug.cgi?id=20746 + + Added WINCE platform macro. + + * wtf/Platform.h: + +2008-09-09 Sam Weinig <sam@webkit.org> + + Reviewed by Mark Rowe. + + Remove unnecessary override of getOffset. + + Sunspider reports this as a .6% progression. + + * JavaScriptCore.exp: + * kjs/JSObject.h: + (JSC::JSObject::getDirectLocation): + (JSC::JSObject::getOwnPropertySlotForWrite): + (JSC::JSObject::putDirect): + * kjs/PropertyMap.cpp: + * kjs/PropertyMap.h: + +2008-09-09 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Maciej Stachowiak. + + Bug 20759: Remove MacroAssembler + <https://bugs.webkit.org/show_bug.cgi?id=20759> + + Remove MacroAssembler and move its functionality to X86Assembler. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * VM/CTI.cpp: + (JSC::CTI::emitGetArg): + (JSC::CTI::emitGetPutArg): + (JSC::CTI::emitPutArg): + (JSC::CTI::emitPutCTIParam): + (JSC::CTI::emitGetCTIParam): + (JSC::CTI::emitPutToCallFrameHeader): + (JSC::CTI::emitGetFromCallFrameHeader): + (JSC::CTI::emitPutResult): + (JSC::CTI::emitDebugExceptionCheck): + (JSC::CTI::emitJumpSlowCaseIfNotImm): + (JSC::CTI::emitJumpSlowCaseIfNotImms): + (JSC::CTI::emitFastArithDeTagImmediate): + (JSC::CTI::emitFastArithReTagImmediate): + (JSC::CTI::emitFastArithPotentiallyReTagImmediate): + (JSC::CTI::emitFastArithImmToInt): + (JSC::CTI::emitFastArithIntToImmOrSlowCase): + (JSC::CTI::emitFastArithIntToImmNoCheck): + (JSC::CTI::compileOpCall): + (JSC::CTI::emitSlowScriptCheck): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + (JSC::CTI::privateCompile): + (JSC::CTI::privateCompileGetByIdSelf): + (JSC::CTI::privateCompileGetByIdProto): + (JSC::CTI::privateCompileGetByIdChain): + (JSC::CTI::privateCompilePutByIdReplace): + (JSC::CTI::privateArrayLengthTrampoline): + (JSC::CTI::privateStringLengthTrampoline): + (JSC::CTI::compileRegExp): + * VM/CTI.h: + (JSC::CallRecord::CallRecord): + (JSC::JmpTable::JmpTable): + (JSC::SlowCaseEntry::SlowCaseEntry): + (JSC::CTI::JSRInfo::JSRInfo): + * masm/MacroAssembler.h: Removed. + * masm/MacroAssemblerWin.cpp: Removed. + * masm/X86Assembler.h: + (JSC::X86Assembler::emitConvertToFastCall): + (JSC::X86Assembler::emitRestoreArgumentReference): + * wrec/WREC.h: + (JSC::WRECGenerator::WRECGenerator): + (JSC::WRECParser::WRECParser): + +2008-09-09 Sam Weinig <sam@webkit.org> + + Reviewed by Cameron Zwarich. + + Don't waste the first item in the PropertyStorage. + + - Fix typo (makingCount -> markingCount) + - Remove undefined method declaration. + + No change on Sunspider. + + * kjs/JSObject.cpp: + (JSC::JSObject::mark): + * kjs/PropertyMap.cpp: + (JSC::PropertyMap::put): + (JSC::PropertyMap::remove): + (JSC::PropertyMap::getOffset): + (JSC::PropertyMap::insert): + (JSC::PropertyMap::rehash): + (JSC::PropertyMap::resizePropertyStorage): + (JSC::PropertyMap::checkConsistency): + * kjs/PropertyMap.h: + (JSC::PropertyMap::markingCount): Fix typo. + +2008-09-09 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Not reviewed. + + Speculative Windows build fix. + + * masm/MacroAssemblerWin.cpp: + (JSC::MacroAssembler::emitConvertToFastCall): + (JSC::MacroAssembler::emitRestoreArgumentReference): + +2008-09-09 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Maciej Stachowiak. + + Bug 20755: Create an X86 namespace for register names and other things + <https://bugs.webkit.org/show_bug.cgi?id=20755> + + Create an X86 namespace to put X86 register names. Perhaps I will move + opcode names here later as well. + + * VM/CTI.cpp: + (JSC::CTI::emitGetArg): + (JSC::CTI::emitGetPutArg): + (JSC::CTI::emitPutArg): + (JSC::CTI::emitPutArgConstant): + (JSC::CTI::emitPutCTIParam): + (JSC::CTI::emitGetCTIParam): + (JSC::CTI::emitPutToCallFrameHeader): + (JSC::CTI::emitGetFromCallFrameHeader): + (JSC::CTI::emitPutResult): + (JSC::CTI::emitDebugExceptionCheck): + (JSC::CTI::emitJumpSlowCaseIfNotImms): + (JSC::CTI::compileOpCall): + (JSC::CTI::emitSlowScriptCheck): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + (JSC::CTI::privateCompile): + (JSC::CTI::privateCompileGetByIdSelf): + (JSC::CTI::privateCompileGetByIdProto): + (JSC::CTI::privateCompileGetByIdChain): + (JSC::CTI::privateCompilePutByIdReplace): + (JSC::CTI::privateArrayLengthTrampoline): + (JSC::CTI::privateStringLengthTrampoline): + (JSC::CTI::compileRegExp): + * VM/CTI.h: + * masm/X86Assembler.h: + (JSC::X86::): + (JSC::X86Assembler::emitModRm_rm): + (JSC::X86Assembler::emitModRm_rm_Unchecked): + (JSC::X86Assembler::emitModRm_rmsib): + * wrec/WREC.cpp: + (JSC::WRECGenerator::generateNonGreedyQuantifier): + (JSC::WRECGenerator::generateGreedyQuantifier): + (JSC::WRECGenerator::generateParentheses): + (JSC::WRECGenerator::generateBackreference): + (JSC::WRECGenerator::gernerateDisjunction): + * wrec/WREC.h: + +2008-09-09 Sam Weinig <sam@webkit.org> + + Reviewed by Geoffrey Garen. + + Remove unnecessary friend declaration. + + * kjs/PropertyMap.h: + +2008-09-09 Sam Weinig <sam@webkit.org> + + Reviewed by Geoffrey Garen. + + Replace uses of PropertyMap::get and PropertyMap::getLocation with + PropertyMap::getOffset. + + Sunspider reports this as a .6% improvement. + + * JavaScriptCore.exp: + * kjs/JSObject.cpp: + (JSC::JSObject::put): + (JSC::JSObject::deleteProperty): + (JSC::JSObject::getPropertyAttributes): + * kjs/JSObject.h: + (JSC::JSObject::getDirect): + (JSC::JSObject::getDirectLocation): + (JSC::JSObject::locationForOffset): + * kjs/PropertyMap.cpp: + (JSC::PropertyMap::remove): + (JSC::PropertyMap::getOffset): + * kjs/PropertyMap.h: + +2008-09-09 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Sam Weinig. + + Bug 20754: Remove emit prefix from assembler opcode methods + <https://bugs.webkit.org/show_bug.cgi?id=20754> + + * VM/CTI.cpp: + (JSC::CTI::emitGetArg): + (JSC::CTI::emitGetPutArg): + (JSC::CTI::emitPutArg): + (JSC::CTI::emitPutArgConstant): + (JSC::CTI::emitPutCTIParam): + (JSC::CTI::emitGetCTIParam): + (JSC::CTI::emitPutToCallFrameHeader): + (JSC::CTI::emitGetFromCallFrameHeader): + (JSC::CTI::emitPutResult): + (JSC::CTI::emitDebugExceptionCheck): + (JSC::CTI::emitCall): + (JSC::CTI::emitJumpSlowCaseIfNotImm): + (JSC::CTI::emitJumpSlowCaseIfNotImms): + (JSC::CTI::emitFastArithDeTagImmediate): + (JSC::CTI::emitFastArithReTagImmediate): + (JSC::CTI::emitFastArithPotentiallyReTagImmediate): + (JSC::CTI::emitFastArithImmToInt): + (JSC::CTI::emitFastArithIntToImmOrSlowCase): + (JSC::CTI::emitFastArithIntToImmNoCheck): + (JSC::CTI::compileOpCall): + (JSC::CTI::emitSlowScriptCheck): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + (JSC::CTI::privateCompile): + (JSC::CTI::privateCompileGetByIdSelf): + (JSC::CTI::privateCompileGetByIdProto): + (JSC::CTI::privateCompileGetByIdChain): + (JSC::CTI::privateCompilePutByIdReplace): + (JSC::CTI::privateArrayLengthTrampoline): + (JSC::CTI::privateStringLengthTrampoline): + (JSC::CTI::compileRegExp): + * masm/MacroAssemblerWin.cpp: + (JSC::MacroAssembler::emitConvertToFastCall): + (JSC::MacroAssembler::emitRestoreArgumentReference): + * masm/X86Assembler.h: + (JSC::X86Assembler::pushl_r): + (JSC::X86Assembler::pushl_m): + (JSC::X86Assembler::popl_r): + (JSC::X86Assembler::popl_m): + (JSC::X86Assembler::movl_rr): + (JSC::X86Assembler::addl_rr): + (JSC::X86Assembler::addl_i8r): + (JSC::X86Assembler::addl_i32r): + (JSC::X86Assembler::addl_mr): + (JSC::X86Assembler::andl_rr): + (JSC::X86Assembler::andl_i32r): + (JSC::X86Assembler::cmpl_i8r): + (JSC::X86Assembler::cmpl_rr): + (JSC::X86Assembler::cmpl_rm): + (JSC::X86Assembler::cmpl_i32r): + (JSC::X86Assembler::cmpl_i32m): + (JSC::X86Assembler::cmpw_rm): + (JSC::X86Assembler::orl_rr): + (JSC::X86Assembler::subl_rr): + (JSC::X86Assembler::subl_i8r): + (JSC::X86Assembler::subl_i32r): + (JSC::X86Assembler::subl_mr): + (JSC::X86Assembler::testl_i32r): + (JSC::X86Assembler::testl_rr): + (JSC::X86Assembler::xorl_i8r): + (JSC::X86Assembler::xorl_rr): + (JSC::X86Assembler::sarl_i8r): + (JSC::X86Assembler::sarl_CLr): + (JSC::X86Assembler::shl_i8r): + (JSC::X86Assembler::shll_CLr): + (JSC::X86Assembler::mull_rr): + (JSC::X86Assembler::idivl_r): + (JSC::X86Assembler::cdq): + (JSC::X86Assembler::movl_mr): + (JSC::X86Assembler::movzwl_mr): + (JSC::X86Assembler::movl_rm): + (JSC::X86Assembler::movl_i32r): + (JSC::X86Assembler::movl_i32m): + (JSC::X86Assembler::leal_mr): + (JSC::X86Assembler::ret): + (JSC::X86Assembler::jmp_r): + (JSC::X86Assembler::jmp_m): + (JSC::X86Assembler::call_r): + * wrec/WREC.cpp: + (JSC::WRECGenerator::generateBacktrack1): + (JSC::WRECGenerator::generateBacktrackBackreference): + (JSC::WRECGenerator::generateBackreferenceQuantifier): + (JSC::WRECGenerator::generateNonGreedyQuantifier): + (JSC::WRECGenerator::generateGreedyQuantifier): + (JSC::WRECGenerator::generatePatternCharacter): + (JSC::WRECGenerator::generateCharacterClassInvertedRange): + (JSC::WRECGenerator::generateCharacterClassInverted): + (JSC::WRECGenerator::generateCharacterClass): + (JSC::WRECGenerator::generateParentheses): + (JSC::WRECGenerator::gererateParenthesesResetTrampoline): + (JSC::WRECGenerator::generateAssertionBOL): + (JSC::WRECGenerator::generateAssertionEOL): + (JSC::WRECGenerator::generateAssertionWordBoundary): + (JSC::WRECGenerator::generateBackreference): + (JSC::WRECGenerator::gernerateDisjunction): + +2008-09-09 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Maciej Stachowiak. + + Clean up the WREC code some more. + + * VM/CTI.cpp: + (JSC::CTI::compileRegExp): + * wrec/WREC.cpp: + (JSC::getCharacterClassNewline): + (JSC::getCharacterClassDigits): + (JSC::getCharacterClassSpaces): + (JSC::getCharacterClassWordchar): + (JSC::getCharacterClassNondigits): + (JSC::getCharacterClassNonspaces): + (JSC::getCharacterClassNonwordchar): + (JSC::WRECGenerator::generateBacktrack1): + (JSC::WRECGenerator::generateBacktrackBackreference): + (JSC::WRECGenerator::generateBackreferenceQuantifier): + (JSC::WRECGenerator::generateNonGreedyQuantifier): + (JSC::WRECGenerator::generateGreedyQuantifier): + (JSC::WRECGenerator::generatePatternCharacter): + (JSC::WRECGenerator::generateCharacterClassInvertedRange): + (JSC::WRECGenerator::generateCharacterClassInverted): + (JSC::WRECGenerator::generateCharacterClass): + (JSC::WRECGenerator::generateParentheses): + (JSC::WRECGenerator::gererateParenthesesResetTrampoline): + (JSC::WRECGenerator::generateAssertionBOL): + (JSC::WRECGenerator::generateAssertionEOL): + (JSC::WRECGenerator::generateAssertionWordBoundary): + (JSC::WRECGenerator::generateBackreference): + (JSC::WRECGenerator::gernerateDisjunction): + (JSC::WRECParser::parseCharacterClass): + (JSC::WRECParser::parseEscape): + (JSC::WRECParser::parseTerm): + * wrec/WREC.h: + +2008-09-09 Mark Rowe <mrowe@apple.com> + + Build fix, rubber-stamped by Anders Carlsson. + + Silence spurious build warnings about missing format attributes on functions in Assertions.cpp. + + * JavaScriptCore.xcodeproj/project.pbxproj: + +2008-09-09 Mark Rowe <mrowe@apple.com> + + Rubber-stamped by Oliver Hunt. + + Fix builds using the "debug" variant. + + This reverts r36130 and tweaks Identifier to export the same symbols for Debug + and Release configurations. + + * Configurations/JavaScriptCore.xcconfig: + * DerivedSources.make: + * JavaScriptCore.Debug.exp: Removed. + * JavaScriptCore.base.exp: Removed. + * JavaScriptCore.exp: Added. + * JavaScriptCore.xcodeproj/project.pbxproj: + * kjs/identifier.cpp: + (JSC::Identifier::addSlowCase): #ifdef the call to checkSameIdentifierTable so that + there is no overhead in Release builds. + (JSC::Identifier::checkSameIdentifierTable): Add empty functions for Release builds. + * kjs/identifier.h: + (JSC::Identifier::add): #ifdef the calls to checkSameIdentifierTable so that there is + no overhead in Release builds, and remove the inline definitions of checkSameIdentifierTable. + +2008-09-09 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Maciej Stachowiak. + + Clean up WREC a bit to bring it closer to our coding style guidelines. + + * wrec/WREC.cpp: + (JSC::): + (JSC::getCharacterClass_newline): + (JSC::getCharacterClass_d): + (JSC::getCharacterClass_s): + (JSC::getCharacterClass_w): + (JSC::getCharacterClass_D): + (JSC::getCharacterClass_S): + (JSC::getCharacterClass_W): + (JSC::CharacterClassConstructor::append): + (JSC::WRECGenerator::generateNonGreedyQuantifier): + (JSC::WRECGenerator::generateGreedyQuantifier): + (JSC::WRECGenerator::generateCharacterClassInverted): + (JSC::WRECParser::parseQuantifier): + (JSC::WRECParser::parsePatternCharacterQualifier): + (JSC::WRECParser::parseCharacterClassQuantifier): + (JSC::WRECParser::parseBackreferenceQuantifier): + * wrec/WREC.h: + (JSC::Quantifier::): + (JSC::Quantifier::Quantifier): + +2008-09-09 Jungshik Shin <jungshik.shin@gmail.com> + + Reviewed by Alexey Proskuryakov. + + Try MIME charset names before trying IANA names + ( https://bugs.webkit.org/show_bug.cgi?id=17537 ) + + * wtf/StringExtras.h: (strcasecmp): Added. + +2008-09-09 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Mark Rowe. + + Bug 20719: REGRESSION (r36135-36244): Hangs, then crashes after several seconds + <https://bugs.webkit.org/show_bug.cgi?id=20719> + <rdar://problem/6205787> + + Fix a typo in the case-insensitive matching of character patterns. + + * wrec/WREC.cpp: + (JSC::WRECGenerator::generatePatternCharacter): + +2008-09-09 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Sam Weinig. + + - allow polymorphic inline cache to handle Math object functions and possibly other similar things + + 1.012x speedup on SunSpider. + + * kjs/MathObject.cpp: + (JSC::MathObject::getOwnPropertySlot): + * kjs/lookup.cpp: + (JSC::setUpStaticFunctionSlot): + * kjs/lookup.h: + (JSC::getStaticPropertySlot): + +2008-09-08 Sam Weinig <sam@webkit.org> + + Reviewed by Maciej Stachowiak and Oliver Hunt. + + Split storage of properties out of the PropertyMap and into the JSObject + to allow sharing PropertyMap on the StructureID. In order to get this + function correctly, the StructureID's transition mappings were changed to + transition based on property name and attribute pairs, instead of just + property name. + + - Removes the single property optimization now that the PropertyMap is shared. + This will be replaced by in-lining some values on the JSObject. + + This is a wash on Sunspider and a 6.7% win on the v8 test suite. + + * JavaScriptCore.base.exp: + * VM/CTI.cpp: + (JSC::CTI::privateCompileGetByIdSelf): Get the storage directly off the JSObject. + (JSC::CTI::privateCompileGetByIdProto): Ditto. + (JSC::CTI::privateCompileGetByIdChain): Ditto. + (JSC::CTI::privateCompilePutByIdReplace): Ditto. + * kjs/JSObject.cpp: + (JSC::JSObject::mark): Mark the PropertyStorage. + (JSC::JSObject::put): Update to get the propertyMap of the StructureID. + (JSC::JSObject::deleteProperty): Ditto. + (JSC::JSObject::defineGetter): Return early if the property is already a getter/setter. + (JSC::JSObject::defineSetter): Ditto. + (JSC::JSObject::getPropertyAttributes): Update to get the propertyMap of the StructureID + (JSC::JSObject::getPropertyNames): Ditto. + (JSC::JSObject::removeDirect): Ditto. + * kjs/JSObject.h: Remove PropertyMap and add PropertyStorage. + (JSC::JSObject::propertyStorage): return the PropertyStorage. + (JSC::JSObject::getDirect): Update to get the propertyMap of the StructureID. + (JSC::JSObject::getDirectLocation): Ditto. + (JSC::JSObject::offsetForLocation): Compute location directly. + (JSC::JSObject::hasCustomProperties): Update to get the propertyMap of the StructureID. + (JSC::JSObject::hasGetterSetterProperties): Ditto. + (JSC::JSObject::getDirectOffset): Get by indexing into PropertyStorage. + (JSC::JSObject::putDirectOffset): Put by indexing into PropertyStorage. + (JSC::JSObject::getOwnPropertySlotForWrite): Update to get the propertyMap of the StructureID. + (JSC::JSObject::getOwnPropertySlot): Ditto. + (JSC::JSObject::putDirect): Move putting into the StructureID unless the property already exists. + * kjs/PropertyMap.cpp: Use the propertyStorage as the storage for the JSValues. + (JSC::PropertyMap::checkConsistency): + (JSC::PropertyMap::operator=): + (JSC::PropertyMap::~PropertyMap): + (JSC::PropertyMap::get): + (JSC::PropertyMap::getLocation): + (JSC::PropertyMap::put): + (JSC::PropertyMap::getOffset): + (JSC::PropertyMap::insert): + (JSC::PropertyMap::expand): + (JSC::PropertyMap::rehash): + (JSC::PropertyMap::createTable): + (JSC::PropertyMap::resizePropertyStorage): Resize the storage to match the size of the map + (JSC::PropertyMap::remove): + (JSC::PropertyMap::getEnumerablePropertyNames): + * kjs/PropertyMap.h: + (JSC::PropertyMapEntry::PropertyMapEntry): + (JSC::PropertyMap::isEmpty): + (JSC::PropertyMap::size): + (JSC::PropertyMap::makingCount): + (JSC::PropertyMap::PropertyMap): + + * kjs/StructureID.cpp: + (JSC::StructureID::addPropertyTransition): Transitions now are based off the property name + and attributes. + (JSC::StructureID::toDictionaryTransition): Copy the map. + (JSC::StructureID::changePrototypeTransition): Copy the map. + (JSC::StructureID::getterSetterTransition): Copy the map. + (JSC::StructureID::~StructureID): + * kjs/StructureID.h: + (JSC::TransitionTableHash::hash): Custom hash for transition map. + (JSC::TransitionTableHash::equal): Ditto. + (JSC::TransitionTableHashTraits::emptyValue): Custom traits for transition map + (JSC::TransitionTableHashTraits::constructDeletedValue): Ditto. + (JSC::TransitionTableHashTraits::isDeletedValue): Ditto. + (JSC::StructureID::propertyMap): Added. + +2008-09-08 Oliver Hunt <oliver@apple.com> + + Reviewed by Mark Rowe. + + Bug 20694: Slow Script error pops up when running Dromaeo tests + + Correct error in timeout logic where execution tick count would + be reset to incorrect value due to incorrect offset and indirection. + Codegen for the slow script dialog was factored out into a separate + method (emitSlowScriptCheck) rather than having multiple copies of + the same code. Also added calls to generate slow script checks + for loop_if_less and loop_if_true opcodes. + + * VM/CTI.cpp: + (JSC::CTI::emitSlowScriptCheck): + (JSC::CTI::privateCompileMainPass): + (JSC::CTI::privateCompileSlowCases): + * VM/CTI.h: + +2008-09-08 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Maciej Stachowiak. + + Remove references to the removed WRECompiler class. + + * VM/Machine.h: + * wrec/WREC.h: + +2008-09-08 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Rubber-stamped by Mark Rowe. + + Fix the build with CTI enabled but WREC disabled. + + * VM/CTI.cpp: + * VM/CTI.h: + +2008-09-08 Dan Bernstein <mitz@apple.com> + + - build fix + + * kjs/nodes.h: + (JSC::StatementNode::): + (JSC::BlockNode::): + +2008-09-08 Kevin McCullough <kmccullough@apple.com> + + Reviewed by Geoff. + + <rdar://problem/6134407> Breakpoints in for loops, while loops or + conditions without curly braces don't break. (19306) + -Statement Lists already emit debug hooks but conditionals without + brackets are not lists. + + * kjs/nodes.cpp: + (KJS::IfNode::emitCode): + (KJS::IfElseNode::emitCode): + (KJS::DoWhileNode::emitCode): + (KJS::WhileNode::emitCode): + (KJS::ForNode::emitCode): + (KJS::ForInNode::emitCode): + * kjs/nodes.h: + (KJS::StatementNode::): + (KJS::BlockNode::): + +2008-09-08 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Anders Carlsson. + + - Cache the code generated for eval to speed up SunSpider and web sites + https://bugs.webkit.org/show_bug.cgi?id=20718 + + 1.052x on SunSpider + 2.29x on date-format-tofte + + Lots of real sites seem to get many hits on this cache as well, + including GMail, Google Spreadsheets, Slate and Digg (the last of + these gets over 100 hits on initial page load). + + * VM/CodeBlock.h: + (JSC::EvalCodeCache::get): + * VM/Machine.cpp: + (JSC::Machine::callEval): + (JSC::Machine::privateExecute): + (JSC::Machine::cti_op_call_eval): + * VM/Machine.h: + +2008-09-07 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Oliver Hunt. + + Bug 20711: Change KJS prefix on preprocessor macros to JSC + <https://bugs.webkit.org/show_bug.cgi?id=20711> + + * kjs/CommonIdentifiers.cpp: + (JSC::CommonIdentifiers::CommonIdentifiers): + * kjs/CommonIdentifiers.h: + * kjs/PropertySlot.h: + (JSC::PropertySlot::getValue): + (JSC::PropertySlot::putValue): + (JSC::PropertySlot::setValueSlot): + (JSC::PropertySlot::setValue): + (JSC::PropertySlot::setRegisterSlot): + * kjs/lookup.h: + * kjs/nodes.cpp: + * kjs/nodes.h: + (JSC::Node::): + (JSC::ExpressionNode::): + (JSC::StatementNode::): + (JSC::NullNode::): + (JSC::BooleanNode::): + (JSC::NumberNode::): + (JSC::ImmediateNumberNode::): + (JSC::StringNode::): + (JSC::RegExpNode::): + (JSC::ThisNode::): + (JSC::ResolveNode::): + (JSC::ElementNode::): + (JSC::ArrayNode::): + (JSC::PropertyNode::): + (JSC::PropertyListNode::): + (JSC::ObjectLiteralNode::): + (JSC::BracketAccessorNode::): + (JSC::DotAccessorNode::): + (JSC::ArgumentListNode::): + (JSC::ArgumentsNode::): + (JSC::NewExprNode::): + (JSC::EvalFunctionCallNode::): + (JSC::FunctionCallValueNode::): + (JSC::FunctionCallResolveNode::): + (JSC::FunctionCallBracketNode::): + (JSC::FunctionCallDotNode::): + (JSC::PrePostResolveNode::): + (JSC::PostfixResolveNode::): + (JSC::PostfixBracketNode::): + (JSC::PostfixDotNode::): + (JSC::PostfixErrorNode::): + (JSC::DeleteResolveNode::): + (JSC::DeleteBracketNode::): + (JSC::DeleteDotNode::): + (JSC::DeleteValueNode::): + (JSC::VoidNode::): + (JSC::TypeOfResolveNode::): + (JSC::TypeOfValueNode::): + (JSC::PrefixResolveNode::): + (JSC::PrefixBracketNode::): + (JSC::PrefixDotNode::): + (JSC::PrefixErrorNode::): + (JSC::UnaryPlusNode::): + (JSC::NegateNode::): + (JSC::BitwiseNotNode::): + (JSC::LogicalNotNode::): + (JSC::MultNode::): + (JSC::DivNode::): + (JSC::ModNode::): + (JSC::AddNode::): + (JSC::SubNode::): + (JSC::LeftShiftNode::): + (JSC::RightShiftNode::): + (JSC::UnsignedRightShiftNode::): + (JSC::LessNode::): + (JSC::GreaterNode::): + (JSC::LessEqNode::): + (JSC::GreaterEqNode::): + (JSC::ThrowableBinaryOpNode::): + (JSC::InstanceOfNode::): + (JSC::InNode::): + (JSC::EqualNode::): + (JSC::NotEqualNode::): + (JSC::StrictEqualNode::): + (JSC::NotStrictEqualNode::): + (JSC::BitAndNode::): + (JSC::BitOrNode::): + (JSC::BitXOrNode::): + (JSC::LogicalOpNode::): + (JSC::ConditionalNode::): + (JSC::ReadModifyResolveNode::): + (JSC::AssignResolveNode::): + (JSC::ReadModifyBracketNode::): + (JSC::AssignBracketNode::): + (JSC::AssignDotNode::): + (JSC::ReadModifyDotNode::): + (JSC::AssignErrorNode::): + (JSC::CommaNode::): + (JSC::VarDeclCommaNode::): + (JSC::ConstDeclNode::): + (JSC::ConstStatementNode::): + (JSC::EmptyStatementNode::): + (JSC::DebuggerStatementNode::): + (JSC::ExprStatementNode::): + (JSC::VarStatementNode::): + (JSC::IfNode::): + (JSC::IfElseNode::): + (JSC::DoWhileNode::): + (JSC::WhileNode::): + (JSC::ForNode::): + (JSC::ContinueNode::): + (JSC::BreakNode::): + (JSC::ReturnNode::): + (JSC::WithNode::): + (JSC::LabelNode::): + (JSC::ThrowNode::): + (JSC::TryNode::): + (JSC::ParameterNode::): + (JSC::ScopeNode::): + (JSC::ProgramNode::): + (JSC::EvalNode::): + (JSC::FunctionBodyNode::): + (JSC::FuncExprNode::): + (JSC::FuncDeclNode::): + (JSC::CaseClauseNode::): + (JSC::ClauseListNode::): + (JSC::CaseBlockNode::): + (JSC::SwitchNode::): + +2008-09-07 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Maciej Stachowiak. + + Bug 20704: Replace the KJS namespace + <https://bugs.webkit.org/show_bug.cgi?id=20704> + + Rename the KJS namespace to JSC. There are still some uses of KJS in + preprocessor macros and comments, but these will also be changed some + time in the near future. + + * API/APICast.h: + (toJS): + (toRef): + (toGlobalRef): + * API/JSBase.cpp: + * API/JSCallbackConstructor.cpp: + * API/JSCallbackConstructor.h: + * API/JSCallbackFunction.cpp: + * API/JSCallbackFunction.h: + * API/JSCallbackObject.cpp: + * API/JSCallbackObject.h: + * API/JSCallbackObjectFunctions.h: + * API/JSClassRef.cpp: + (OpaqueJSClass::staticValues): + (OpaqueJSClass::staticFunctions): + * API/JSClassRef.h: + * API/JSContextRef.cpp: + * API/JSObjectRef.cpp: + * API/JSProfilerPrivate.cpp: + * API/JSStringRef.cpp: + * API/JSValueRef.cpp: + (JSValueGetType): + * API/OpaqueJSString.cpp: + * API/OpaqueJSString.h: + * JavaScriptCore.Debug.exp: + * JavaScriptCore.base.exp: + * VM/CTI.cpp: + (JSC::): + * VM/CTI.h: + * VM/CodeBlock.cpp: + * VM/CodeBlock.h: + * VM/CodeGenerator.cpp: + * VM/CodeGenerator.h: + * VM/ExceptionHelpers.cpp: + * VM/ExceptionHelpers.h: + * VM/Instruction.h: + * VM/JSPropertyNameIterator.cpp: + * VM/JSPropertyNameIterator.h: + * VM/LabelID.h: + * VM/Machine.cpp: + * VM/Machine.h: + * VM/Opcode.cpp: + * VM/Opcode.h: + * VM/Register.h: + (WTF::): + * VM/RegisterFile.cpp: + * VM/RegisterFile.h: + * VM/RegisterID.h: + (WTF::): + * VM/SamplingTool.cpp: + * VM/SamplingTool.h: + * VM/SegmentedVector.h: + * kjs/ArgList.cpp: + * kjs/ArgList.h: + * kjs/Arguments.cpp: + * kjs/Arguments.h: + * kjs/ArrayConstructor.cpp: + * kjs/ArrayConstructor.h: + * kjs/ArrayPrototype.cpp: + * kjs/ArrayPrototype.h: + * kjs/BatchedTransitionOptimizer.h: + * kjs/BooleanConstructor.cpp: + * kjs/BooleanConstructor.h: + * kjs/BooleanObject.cpp: + * kjs/BooleanObject.h: + * kjs/BooleanPrototype.cpp: + * kjs/BooleanPrototype.h: + * kjs/CallData.cpp: + * kjs/CallData.h: + * kjs/ClassInfo.h: + * kjs/CommonIdentifiers.cpp: + * kjs/CommonIdentifiers.h: + * kjs/ConstructData.cpp: + * kjs/ConstructData.h: + * kjs/DateConstructor.cpp: + * kjs/DateConstructor.h: + * kjs/DateInstance.cpp: + (JSC::DateInstance::msToGregorianDateTime): + * kjs/DateInstance.h: + * kjs/DateMath.cpp: + * kjs/DateMath.h: + * kjs/DatePrototype.cpp: + * kjs/DatePrototype.h: + * kjs/DebuggerCallFrame.cpp: + * kjs/DebuggerCallFrame.h: + * kjs/Error.cpp: + * kjs/Error.h: + * kjs/ErrorConstructor.cpp: + * kjs/ErrorConstructor.h: + * kjs/ErrorInstance.cpp: + * kjs/ErrorInstance.h: + * kjs/ErrorPrototype.cpp: + * kjs/ErrorPrototype.h: + * kjs/ExecState.cpp: + * kjs/ExecState.h: + * kjs/FunctionConstructor.cpp: + * kjs/FunctionConstructor.h: + * kjs/FunctionPrototype.cpp: + * kjs/FunctionPrototype.h: + * kjs/GetterSetter.cpp: + * kjs/GetterSetter.h: + * kjs/GlobalEvalFunction.cpp: + * kjs/GlobalEvalFunction.h: + * kjs/IndexToNameMap.cpp: + * kjs/IndexToNameMap.h: + * kjs/InitializeThreading.cpp: + * kjs/InitializeThreading.h: + * kjs/InternalFunction.cpp: + * kjs/InternalFunction.h: + (JSC::InternalFunction::InternalFunction): + * kjs/JSActivation.cpp: + * kjs/JSActivation.h: + * kjs/JSArray.cpp: + * kjs/JSArray.h: + * kjs/JSCell.cpp: + * kjs/JSCell.h: + * kjs/JSFunction.cpp: + * kjs/JSFunction.h: + (JSC::JSFunction::JSFunction): + * kjs/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + * kjs/JSGlobalData.h: + * kjs/JSGlobalObject.cpp: + * kjs/JSGlobalObject.h: + * kjs/JSGlobalObjectFunctions.cpp: + * kjs/JSGlobalObjectFunctions.h: + * kjs/JSImmediate.cpp: + * kjs/JSImmediate.h: + * kjs/JSLock.cpp: + * kjs/JSLock.h: + * kjs/JSNotAnObject.cpp: + * kjs/JSNotAnObject.h: + * kjs/JSNumberCell.cpp: + * kjs/JSNumberCell.h: + * kjs/JSObject.cpp: + * kjs/JSObject.h: + * kjs/JSStaticScopeObject.cpp: + * kjs/JSStaticScopeObject.h: + * kjs/JSString.cpp: + * kjs/JSString.h: + * kjs/JSType.h: + * kjs/JSValue.cpp: + * kjs/JSValue.h: + * kjs/JSVariableObject.cpp: + * kjs/JSVariableObject.h: + * kjs/JSWrapperObject.cpp: + * kjs/JSWrapperObject.h: + * kjs/LabelStack.cpp: + * kjs/LabelStack.h: + * kjs/MathObject.cpp: + * kjs/MathObject.h: + * kjs/NativeErrorConstructor.cpp: + * kjs/NativeErrorConstructor.h: + * kjs/NativeErrorPrototype.cpp: + * kjs/NativeErrorPrototype.h: + * kjs/NodeInfo.h: + * kjs/NumberConstructor.cpp: + * kjs/NumberConstructor.h: + * kjs/NumberObject.cpp: + * kjs/NumberObject.h: + * kjs/NumberPrototype.cpp: + * kjs/NumberPrototype.h: + * kjs/ObjectConstructor.cpp: + * kjs/ObjectConstructor.h: + * kjs/ObjectPrototype.cpp: + * kjs/ObjectPrototype.h: + * kjs/Parser.cpp: + * kjs/Parser.h: + * kjs/PropertyMap.cpp: + (JSC::PropertyMapStatisticsExitLogger::~PropertyMapStatisticsExitLogger): + * kjs/PropertyMap.h: + * kjs/PropertyNameArray.cpp: + * kjs/PropertyNameArray.h: + * kjs/PropertySlot.cpp: + * kjs/PropertySlot.h: + * kjs/PrototypeFunction.cpp: + * kjs/PrototypeFunction.h: + * kjs/PutPropertySlot.h: + * kjs/RegExpConstructor.cpp: + * kjs/RegExpConstructor.h: + * kjs/RegExpObject.cpp: + * kjs/RegExpObject.h: + * kjs/RegExpPrototype.cpp: + * kjs/RegExpPrototype.h: + * kjs/ScopeChain.cpp: + * kjs/ScopeChain.h: + * kjs/ScopeChainMark.h: + * kjs/Shell.cpp: + (jscmain): + * kjs/SmallStrings.cpp: + * kjs/SmallStrings.h: + * kjs/SourceProvider.h: + * kjs/SourceRange.h: + * kjs/StringConstructor.cpp: + * kjs/StringConstructor.h: + * kjs/StringObject.cpp: + * kjs/StringObject.h: + * kjs/StringObjectThatMasqueradesAsUndefined.h: + * kjs/StringPrototype.cpp: + * kjs/StringPrototype.h: + * kjs/StructureID.cpp: + * kjs/StructureID.h: + * kjs/SymbolTable.h: + * kjs/collector.cpp: + * kjs/collector.h: + * kjs/completion.h: + * kjs/create_hash_table: + * kjs/debugger.cpp: + * kjs/debugger.h: + * kjs/dtoa.cpp: + * kjs/dtoa.h: + * kjs/grammar.y: + * kjs/identifier.cpp: + * kjs/identifier.h: + (JSC::Identifier::equal): + * kjs/interpreter.cpp: + * kjs/interpreter.h: + * kjs/lexer.cpp: + (JSC::Lexer::Lexer): + (JSC::Lexer::clear): + (JSC::Lexer::makeIdentifier): + * kjs/lexer.h: + * kjs/lookup.cpp: + * kjs/lookup.h: + * kjs/nodes.cpp: + * kjs/nodes.h: + * kjs/nodes2string.cpp: + * kjs/operations.cpp: + * kjs/operations.h: + * kjs/protect.h: + * kjs/regexp.cpp: + * kjs/regexp.h: + * kjs/ustring.cpp: + * kjs/ustring.h: + (JSC::operator!=): + (JSC::IdentifierRepHash::hash): + (WTF::): + * masm/MacroAssembler.h: + * masm/MacroAssemblerWin.cpp: + * masm/X86Assembler.h: + * pcre/pcre_exec.cpp: + * profiler/CallIdentifier.h: + (WTF::): + * 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/TreeProfile.cpp: + * profiler/TreeProfile.h: + * wrec/WREC.cpp: + * wrec/WREC.h: + * wtf/AVLTree.h: + +2008-09-07 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Dan Bernstein. + + - rename IA32MacroAssembler class to X86Assembler + + We otherwise call the platform X86, and also, I don't see any macros. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * masm/IA32MacroAsm.h: Removed. + * masm/MacroAssembler.h: + (KJS::MacroAssembler::MacroAssembler): + * masm/MacroAssemblerWin.cpp: + (KJS::MacroAssembler::emitRestoreArgumentReference): + * masm/X86Assembler.h: Copied from masm/IA32MacroAsm.h. + (KJS::X86Assembler::X86Assembler): + * wrec/WREC.cpp: + (KJS::WRECGenerator::generateNonGreedyQuantifier): + (KJS::WRECGenerator::generateGreedyQuantifier): + (KJS::WRECGenerator::generateParentheses): + (KJS::WRECGenerator::generateBackreference): + (KJS::WRECGenerator::gernerateDisjunction): + * wrec/WREC.h: + +2008-09-07 Cameron Zwarich <cwzwarich@webkit.org> + + Not reviewed. + + Visual C++ seems to have some odd casting rules, so just convert the + offending cast back to a C-style cast for now. + + * kjs/collector.cpp: + (KJS::otherThreadStackPointer): + +2008-09-07 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Mark Rowe. + + Attempt to fix the Windows build by using a const_cast to cast regs.Esp + to a uintptr_t instead of a reinterpret_cast. + + * kjs/collector.cpp: + (KJS::otherThreadStackPointer): + +2008-09-07 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Sam Weinig. + + Remove C-style casts from kjs/collector.cpp. + + * kjs/collector.cpp: + (KJS::Heap::heapAllocate): + (KJS::currentThreadStackBase): + (KJS::Heap::markConservatively): + (KJS::otherThreadStackPointer): + (KJS::Heap::markOtherThreadConservatively): + (KJS::Heap::sweep): + +2008-09-07 Mark Rowe <mrowe@apple.com> + + Build fix for the debug variant. + + * DerivedSources.make: Also use the .Debug.exp exports file when building the debug variant. + +2008-09-07 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Timothy Hatcher. + + Remove C-style casts from the CTI code. + + * VM/CTI.cpp: + (KJS::CTI::emitGetArg): + (KJS::CTI::emitGetPutArg): + (KJS::ctiRepatchCallByReturnAddress): + (KJS::CTI::compileOpCall): + (KJS::CTI::privateCompileMainPass): + (KJS::CTI::privateCompileGetByIdSelf): + (KJS::CTI::privateCompileGetByIdProto): + (KJS::CTI::privateCompileGetByIdChain): + (KJS::CTI::privateCompilePutByIdReplace): + (KJS::CTI::privateArrayLengthTrampoline): + (KJS::CTI::privateStringLengthTrampoline): + +=== End merge of squirrelfish-extreme === + +2008-09-06 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Sam Weinig. Adapted somewhat by Maciej Stachowiak. + + - refactor WREC to share more of the JIT infrastructure with CTI + + * VM/CTI.cpp: + (KJS::CTI::emitGetArg): + (KJS::CTI::emitGetPutArg): + (KJS::CTI::emitPutArg): + (KJS::CTI::emitPutArgConstant): + (KJS::CTI::emitPutCTIParam): + (KJS::CTI::emitGetCTIParam): + (KJS::CTI::emitPutToCallFrameHeader): + (KJS::CTI::emitGetFromCallFrameHeader): + (KJS::CTI::emitPutResult): + (KJS::CTI::emitDebugExceptionCheck): + (KJS::CTI::emitJumpSlowCaseIfNotImm): + (KJS::CTI::emitJumpSlowCaseIfNotImms): + (KJS::CTI::emitFastArithDeTagImmediate): + (KJS::CTI::emitFastArithReTagImmediate): + (KJS::CTI::emitFastArithPotentiallyReTagImmediate): + (KJS::CTI::emitFastArithImmToInt): + (KJS::CTI::emitFastArithIntToImmOrSlowCase): + (KJS::CTI::emitFastArithIntToImmNoCheck): + (KJS::CTI::CTI): + (KJS::CTI::compileOpCall): + (KJS::CTI::privateCompileMainPass): + (KJS::CTI::privateCompileSlowCases): + (KJS::CTI::privateCompile): + (KJS::CTI::privateCompileGetByIdSelf): + (KJS::CTI::privateCompileGetByIdProto): + (KJS::CTI::privateCompileGetByIdChain): + (KJS::CTI::privateCompilePutByIdReplace): + (KJS::CTI::privateArrayLengthTrampoline): + (KJS::CTI::privateStringLengthTrampoline): + (KJS::CTI::compileRegExp): + * VM/CTI.h: + (KJS::CallRecord::CallRecord): + (KJS::JmpTable::JmpTable): + (KJS::SlowCaseEntry::SlowCaseEntry): + (KJS::CTI::JSRInfo::JSRInfo): + * kjs/regexp.cpp: + (KJS::RegExp::RegExp): + * wrec/WREC.cpp: + (KJS::GenerateParenthesesNonGreedyFunctor::GenerateParenthesesNonGreedyFunctor): + (KJS::GeneratePatternCharacterFunctor::generateAtom): + (KJS::GeneratePatternCharacterFunctor::backtrack): + (KJS::GenerateCharacterClassFunctor::generateAtom): + (KJS::GenerateCharacterClassFunctor::backtrack): + (KJS::GenerateBackreferenceFunctor::generateAtom): + (KJS::GenerateBackreferenceFunctor::backtrack): + (KJS::GenerateParenthesesNonGreedyFunctor::generateAtom): + (KJS::GenerateParenthesesNonGreedyFunctor::backtrack): + (KJS::WRECGenerate::generateBacktrack1): + (KJS::WRECGenerate::generateBacktrackBackreference): + (KJS::WRECGenerate::generateBackreferenceQuantifier): + (KJS::WRECGenerate::generateNonGreedyQuantifier): + (KJS::WRECGenerate::generateGreedyQuantifier): + (KJS::WRECGenerate::generatePatternCharacter): + (KJS::WRECGenerate::generateCharacterClassInvertedRange): + (KJS::WRECGenerate::generateCharacterClassInverted): + (KJS::WRECGenerate::generateCharacterClass): + (KJS::WRECGenerate::generateParentheses): + (KJS::WRECGenerate::generateParenthesesNonGreedy): + (KJS::WRECGenerate::gererateParenthesesResetTrampoline): + (KJS::WRECGenerate::generateAssertionBOL): + (KJS::WRECGenerate::generateAssertionEOL): + (KJS::WRECGenerate::generateAssertionWordBoundary): + (KJS::WRECGenerate::generateBackreference): + (KJS::WRECGenerate::gernerateDisjunction): + (KJS::WRECGenerate::terminateDisjunction): + (KJS::WRECParser::parseGreedyQuantifier): + (KJS::WRECParser::parseQuantifier): + (KJS::WRECParser::parsePatternCharacterQualifier): + (KJS::WRECParser::parseCharacterClassQuantifier): + (KJS::WRECParser::parseBackreferenceQuantifier): + (KJS::WRECParser::parseParentheses): + (KJS::WRECParser::parseCharacterClass): + (KJS::WRECParser::parseOctalEscape): + (KJS::WRECParser::parseEscape): + (KJS::WRECParser::parseTerm): + (KJS::WRECParser::parseDisjunction): + * wrec/WREC.h: + (KJS::WRECGenerate::WRECGenerate): + (KJS::WRECParser::): + (KJS::WRECParser::WRECParser): + (KJS::WRECParser::parseAlternative): + (KJS::WRECParser::isEndOfPattern): + +2008-09-06 Oliver Hunt <oliver@apple.com> + + Reviewed by NOBODY (Build fix). + + Fix the sampler build. + + * VM/SamplingTool.h: + +2008-09-06 Oliver Hunt <oliver@apple.com> + + Reviewed by Maciej Stachowiak. + + Jump through the necessary hoops required to make MSVC cooperate with SFX + + We now explicitly declare the calling convention on all cti_op_* cfunctions, + and return int instead of bool where appropriate (despite the cdecl calling + convention seems to state MSVC generates code that returns the result value + through ecx). SFX behaves slightly differently under MSVC, specifically it + stores the base argument address for the cti_op_* functions in the first + argument, and then does the required stack manipulation through that pointer. + This is necessary as MSVC's optimisations assume they have complete control + of the stack, and periodically elide our stack manipulations, or move + values in unexpected ways. MSVC also frequently produces tail calls which may + clobber the first argument, so the MSVC path is slightly less efficient due + to the need to restore it. + + * JavaScriptCore.xcodeproj/project.pbxproj: + * VM/CTI.cpp: + (KJS::): + (KJS::CTI::compileOpCall): + (KJS::CTI::privateCompileMainPass): + (KJS::CTI::privateCompileSlowCases): + * VM/CTI.h: + * VM/Machine.cpp: + * VM/Machine.h: + * masm/MacroAssembler.h: + (KJS::MacroAssembler::emitConvertToFastCall): + * masm/MacroAssemblerIA32GCC.cpp: Removed. + For performance reasons we need these no-op functions to be inlined. + + * masm/MacroAssemblerWin.cpp: + (KJS::MacroAssembler::emitRestoreArgumentReference): + * wtf/Platform.h: + +2008-09-05 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Maciej Stachowiak, or maybe the other way around. + + Added the ability to coalesce JITCode buffer grow operations by first + growing the buffer and then executing unchecked puts to it. + + About a 2% speedup on date-format-tofte. + + * VM/CTI.cpp: + (KJS::CTI::compileOpCall): + * masm/IA32MacroAsm.h: + (KJS::JITCodeBuffer::ensureSpace): + (KJS::JITCodeBuffer::putByteUnchecked): + (KJS::JITCodeBuffer::putByte): + (KJS::JITCodeBuffer::putShortUnchecked): + (KJS::JITCodeBuffer::putShort): + (KJS::JITCodeBuffer::putIntUnchecked): + (KJS::JITCodeBuffer::putInt): + (KJS::IA32MacroAssembler::emitTestl_i32r): + (KJS::IA32MacroAssembler::emitMovl_mr): + (KJS::IA32MacroAssembler::emitMovl_rm): + (KJS::IA32MacroAssembler::emitMovl_i32m): + (KJS::IA32MacroAssembler::emitUnlinkedJe): + (KJS::IA32MacroAssembler::emitModRm_rr): + (KJS::IA32MacroAssembler::emitModRm_rr_Unchecked): + (KJS::IA32MacroAssembler::emitModRm_rm_Unchecked): + (KJS::IA32MacroAssembler::emitModRm_rm): + (KJS::IA32MacroAssembler::emitModRm_opr): + (KJS::IA32MacroAssembler::emitModRm_opr_Unchecked): + (KJS::IA32MacroAssembler::emitModRm_opm_Unchecked): + +2008-09-05 Mark Rowe <mrowe@apple.com> + + Reviewed by Sam Weinig. + + Disable WREC and CTI on platforms that we have not yet had a chance to test with. + + * wtf/Platform.h: + +2008-09-05 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Use jo instead of a mask compare when fetching array.length and + string.length. 4% speedup on array.length / string.length torture + test. + + * VM/CTI.cpp: + (KJS::CTI::privateArrayLengthTrampoline): + (KJS::CTI::privateStringLengthTrampoline): + +2008-09-05 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Removed a CTI compilation pass by recording labels during bytecode + generation. This is more to reduce complexity than it is to improve + performance. + + SunSpider reports no change. + + CodeBlock now keeps a "labels" set, which holds the offsets of all the + instructions that can be jumped to. + + * VM/CTI.cpp: Nixed a pass. + + * VM/CodeBlock.h: Added a "labels" set. + + * VM/LabelID.h: No need for a special LableID for holding jump + destinations, since the CodeBlock now knows all jump destinations. + + * wtf/HashTraits.h: New hash traits to accomodate putting offset 0 in + the set. + + * kjs/nodes.cpp: + (KJS::TryNode::emitCode): Emit a dummy label to record sret targets. + +2008-09-05 Mark Rowe <mrowe@apple.com> + + Reviewed by Oliver Hunt and Gavin Barraclough. + + Move the JITCodeBuffer onto Machine and remove the static variables. + + * VM/CTI.cpp: Initialize m_jit with the Machine's code buffer. + * VM/Machine.cpp: + (KJS::Machine::Machine): Allocate a JITCodeBuffer. + * VM/Machine.h: + * kjs/RegExpConstructor.cpp: + (KJS::constructRegExp): Pass the ExecState through. + * kjs/RegExpPrototype.cpp: + (KJS::regExpProtoFuncCompile): Ditto. + * kjs/StringPrototype.cpp: + (KJS::stringProtoFuncMatch): Ditto. + (KJS::stringProtoFuncSearch): Ditto. + * kjs/nodes.cpp: + (KJS::RegExpNode::emitCode): Compile the pattern at code generation time + so that we have access to an ExecState. + * kjs/nodes.h: + (KJS::RegExpNode::): + * kjs/nodes2string.cpp: + * kjs/regexp.cpp: + (KJS::RegExp::RegExp): Pass the ExecState through. + (KJS::RegExp::create): Ditto. + * kjs/regexp.h: + * masm/IA32MacroAsm.h: + (KJS::IA32MacroAssembler::IA32MacroAssembler): Reset the JITCodeBuffer when we are + constructed. + * wrec/WREC.cpp: + (KJS::WRECompiler::compile): Retrieve the JITCodeBuffer from the Machine. + * wrec/WREC.h: + +2008-09-05 Mark Rowe <mrowe@apple.com> + + Reviewed by Oliver Hunt and Gavin Barraclough. + + Fix the build when CTI is disabled. + + * VM/CodeBlock.cpp: + (KJS::CodeBlock::~CodeBlock): + * VM/CodeGenerator.cpp: + (KJS::prepareJumpTableForStringSwitch): + * VM/Machine.cpp: + (KJS::Machine::Machine): + (KJS::Machine::~Machine): + +2008-09-05 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Mark Rowe. + + Fix some windows abi issues. + + * VM/CTI.cpp: + (KJS::CTI::privateCompileMainPass): + (KJS::CTI::privateCompileSlowCases): + * VM/CTI.h: + (KJS::CallRecord::CallRecord): + (KJS::): + * VM/Machine.cpp: + (KJS::Machine::cti_op_resolve_func): + (KJS::Machine::cti_op_post_inc): + (KJS::Machine::cti_op_resolve_with_base): + (KJS::Machine::cti_op_post_dec): + * VM/Machine.h: + +2008-09-05 Mark Rowe <mrowe@apple.com> + + Reviewed by Sam Weinig. + + Fix ecma/FunctionObjects/15.3.5.3.js after I broke it in r93. + + * VM/Machine.cpp: + (KJS::Machine::cti_op_call_NotJSFunction): Restore m_callFrame to the correct value after making the native call. + (KJS::Machine::cti_op_construct_NotJSConstruct): Ditto. + +2008-09-04 Mark Rowe <mrowe@apple.com> + + Reviewed by Sam Weinig. + + Fix fast/dom/Window/console-functions.html. + + The call frame on the ExecState was not being updated on calls into native functions. This meant that functions + such as console.log would use the line number of the last JS function on the call stack. + + * VM/Machine.cpp: + (KJS::Machine::cti_op_call_NotJSFunction): Update the ExecState's call frame before making a native function call, + and restore it when the function is done. + (KJS::Machine::cti_op_construct_NotJSConstruct): Ditto. + +2008-09-05 Oliver Hunt <oliver@apple.com> + + Start bringing up SFX on windows. + + Reviewed by Mark Rowe and Sam Weinig + + Start doing the work to bring up SFX on windows. Initially + just working on WREC, as it does not make any calls so reduces + the amount of code that needs to be corrected. + + Start abstracting the CTI JIT codegen engine. + + * ChangeLog: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * VM/CTI.cpp: + * masm/IA32MacroAsm.h: + * masm/MacroAssembler.h: Added. + (KJS::MacroAssembler::MacroAssembler): + * masm/MacroAssemblerIA32GCC.cpp: Added. + (KJS::MacroAssembler::emitConvertToFastCall): + * masm/MacroAssemblerWin.cpp: Added. + (KJS::MacroAssembler::emitConvertToFastCall): + * wrec/WREC.cpp: + (KJS::WRECompiler::parseGreedyQuantifier): + (KJS::WRECompiler::parseCharacterClass): + (KJS::WRECompiler::parseEscape): + (KJS::WRECompiler::compilePattern): + * wrec/WREC.h: + +2008-09-04 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Sam Weinig. + + Support for slow scripts (timeout checking). + + * VM/CTI.cpp: + (KJS::CTI::privateCompileMainPass): + (KJS::CTI::privateCompile): + * VM/Machine.cpp: + (KJS::slideRegisterWindowForCall): + (KJS::Machine::cti_timeout_check): + (KJS::Machine::cti_vm_throw): + +2008-09-04 Sam Weinig <sam@webkit.org> + + Reviewed by Mark Rowe. + + Third round of style cleanup. + + * VM/CTI.cpp: + * VM/CTI.h: + * VM/CodeBlock.h: + * VM/Machine.cpp: + * VM/Machine.h: + * kjs/ExecState.h: + +2008-09-04 Sam Weinig <sam@webkit.org> + + Reviewed by Jon Honeycutt. + + Second round of style cleanup. + + * VM/CTI.cpp: + * VM/CTI.h: + * wrec/WREC.h: + +2008-09-04 Sam Weinig <sam@webkit.org> + + Reviewed by Mark Rowe. + + First round of style cleanup. + + * VM/CTI.cpp: + * VM/CTI.h: + * masm/IA32MacroAsm.h: + * wrec/WREC.cpp: + * wrec/WREC.h: + +2008-09-04 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Mark Rowe. + + Merged http://trac.webkit.org/changeset/36081 to work with CTI. + + * VM/Machine.cpp: + (KJS::Machine::tryCtiCacheGetByID): + +2008-09-04 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Sam Weinig. + + Enable profiling in CTI. + + * VM/CTI.h: + (KJS::): + (KJS::CTI::execute): + * VM/Machine.cpp: + (KJS::Machine::cti_op_call_JSFunction): + (KJS::Machine::cti_op_call_NotJSFunction): + (KJS::Machine::cti_op_ret): + (KJS::Machine::cti_op_construct_JSConstruct): + (KJS::Machine::cti_op_construct_NotJSConstruct): + +2008-09-04 Victor Hernandez <vhernandez@apple.com> + + Reviewed by Geoffrey Garen. + + Fixed an #if to support using WREC without CTI. + + * kjs/regexp.cpp: + (KJS::RegExp::match): + +2008-09-04 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + The array/string length trampolines are owned by the Machine, not the codeblock that compiled them. + + * VM/CTI.cpp: + (KJS::CTI::privateArrayLengthTrampoline): + (KJS::CTI::privateStringLengthTrampoline): + * VM/Machine.cpp: + (KJS::Machine::~Machine): + * VM/Machine.h: + +2008-09-04 Mark Rowe <mrowe@apple.com> + + Reviewed by Gavin Barraclough and Sam Weinig. + + Fix a crash on launch of jsc when GuardMalloc is enabled. + + * kjs/ScopeChain.h: + (KJS::ScopeChain::ScopeChain): Initialize m_node to 0 when we have no valid scope chain. + (KJS::ScopeChain::~ScopeChain): Null-check m_node before calling deref. + +2008-09-03 Oliver Hunt <oliver@apple.com> + + Reviewed by Gavin Barraclough and Geoff Garen. + + Fix inspector and fast array access so that it bounds + checks correctly. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass2_Main): + * masm/IA32MacroAsm.h: + (KJS::IA32MacroAssembler::): + (KJS::IA32MacroAssembler::emitUnlinkedJb): + (KJS::IA32MacroAssembler::emitUnlinkedJbe): + +2008-09-03 Mark Rowe <mrowe@apple.com> + + Move the assertion after the InitializeAndReturn block, as + that is used even when CTI is enabled. + + * VM/Machine.cpp: + (KJS::Machine::privateExecute): + +2008-09-03 Mark Rowe <mrowe@apple.com> + + Reviewed by Sam Weinig. + + Replace calls to exit with ASSERT_WITH_MESSAGE or ASSERT_NOT_REACHED. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass1_Scan): + (KJS::CTI::privateCompile_pass2_Main): + (KJS::CTI::privateCompile_pass4_SlowCases): + * VM/Machine.cpp: + (KJS::Machine::privateExecute): + (KJS::Machine::cti_vm_throw): + +2008-09-03 Mark Rowe <mrowe@apple.com> + + Reviewed by Sam Weinig. + + Tweak JavaScriptCore to compile on non-x86 platforms. This is achieved + by wrapping more code with ENABLE(CTI), ENABLE(WREC), and PLATFORM(X86) + #if's. + + * VM/CTI.cpp: + * VM/CTI.h: + * VM/CodeBlock.cpp: + (KJS::CodeBlock::printStructureIDs): Use %td as the format specifier for + printing a ptrdiff_t. + * VM/Machine.cpp: + * VM/Machine.h: + * kjs/regexp.cpp: + (KJS::RegExp::RegExp): + (KJS::RegExp::~RegExp): + (KJS::RegExp::match): + * kjs/regexp.h: + * masm/IA32MacroAsm.h: + * wrec/WREC.cpp: + * wrec/WREC.h: + * wtf/Platform.h: Only enable CTI and WREC on x86. Add an extra define to + track whether any MASM-using features are enabled. + +2008-09-03 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Copy Geoff's array/string length optimization for CTI. + + * VM/CTI.cpp: + (KJS::CTI::privateArrayLengthTrampoline): + (KJS::CTI::privateStringLengthTrampoline): + * VM/CTI.h: + (KJS::CTI::compileArrayLengthTrampoline): + (KJS::CTI::compileStringLengthTrampoline): + * VM/Machine.cpp: + (KJS::Machine::Machine): + (KJS::Machine::getCtiArrayLengthTrampoline): + (KJS::Machine::getCtiStringLengthTrampoline): + (KJS::Machine::tryCtiCacheGetByID): + (KJS::Machine::cti_op_get_by_id_second): + * VM/Machine.h: + * kjs/JSString.h: + * kjs/ustring.h: + +2008-09-03 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Implement fast array accesses in CTI - 2-3% progression on sunspider. + + * VM/CTI.cpp: + (KJS::CTI::emitFastArithIntToImmNoCheck): + (KJS::CTI::compileOpCall): + (KJS::CTI::privateCompile_pass2_Main): + (KJS::CTI::privateCompile_pass4_SlowCases): + * VM/CTI.h: + * kjs/JSArray.h: + +2008-09-02 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Enable fast property access support in CTI. + + * VM/CTI.cpp: + (KJS::ctiSetReturnAddress): + (KJS::ctiRepatchCallByReturnAddress): + (KJS::CTI::privateCompile_pass2_Main): + (KJS::CTI::privateCompile): + (KJS::CTI::privateCompileGetByIdSelf): + (KJS::CTI::privateCompileGetByIdProto): + (KJS::CTI::privateCompileGetByIdChain): + (KJS::CTI::privateCompilePutByIdReplace): + * VM/CTI.h: + (KJS::CTI::compileGetByIdSelf): + (KJS::CTI::compileGetByIdProto): + (KJS::CTI::compileGetByIdChain): + (KJS::CTI::compilePutByIdReplace): + * VM/CodeBlock.cpp: + (KJS::CodeBlock::~CodeBlock): + * VM/CodeBlock.h: + * VM/Machine.cpp: + (KJS::doSetReturnAddressVmThrowTrampoline): + (KJS::Machine::tryCtiCachePutByID): + (KJS::Machine::tryCtiCacheGetByID): + (KJS::Machine::cti_op_put_by_id): + (KJS::Machine::cti_op_put_by_id_second): + (KJS::Machine::cti_op_put_by_id_generic): + (KJS::Machine::cti_op_put_by_id_fail): + (KJS::Machine::cti_op_get_by_id): + (KJS::Machine::cti_op_get_by_id_second): + (KJS::Machine::cti_op_get_by_id_generic): + (KJS::Machine::cti_op_get_by_id_fail): + (KJS::Machine::cti_op_throw): + (KJS::Machine::cti_vm_throw): + * VM/Machine.h: + * kjs/JSCell.h: + * kjs/JSObject.h: + * kjs/PropertyMap.h: + * kjs/StructureID.cpp: + (KJS::StructureIDChain::StructureIDChain): + * masm/IA32MacroAsm.h: + (KJS::IA32MacroAssembler::emitCmpl_i32m): + (KJS::IA32MacroAssembler::emitMovl_mr): + (KJS::IA32MacroAssembler::emitMovl_rm): + +2008-09-02 Sam Weinig <sam@webkit.org> + + Reviewed by Gavin Barraclough and Mark Rowe. + + A backslash (\) at the of a RegEx should produce an error. + Fixes fast/regex/test1.html. + + * wrec/WREC.cpp: + (KJS::WRECompiler::parseEscape): + +2008-09-02 Sam Weinig <sam@webkit.org> + + Reviewed by Geoff Garen. + + Link jumps for the slow case of op_loop_if_less. Fixes acid3. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass4_SlowCases): + +2008-09-01 Sam Weinig <sam@webkit.org> + + Rubber-stamped by Maciej Stachowiak. + + Switch WREC on by default. + + * wtf/Platform.h: + +2008-09-01 Sam Weinig <sam@webkit.org> + + Reviewed by Mark Rowe. + + Fix two failures in fast/regex/test1.html + - \- in a character class should be treated as a literal - + - A missing max quantifier needs to be treated differently than + a null max quantifier. + + * wrec/WREC.cpp: + (KJS::WRECompiler::generateNonGreedyQuantifier): + (KJS::WRECompiler::generateGreedyQuantifier): + (KJS::WRECompiler::parseCharacterClass): + * wrec/WREC.h: + (KJS::Quantifier::Quantifier): + +2008-09-01 Sam Weinig <sam@webkit.org> + + Reviewed by Mark Rowe. + + Fix crash in fast/js/kde/evil-n.html + + * kjs/regexp.cpp: Always pass a non-null offset vector to the wrec function. + +2008-09-01 Sam Weinig <sam@webkit.org> + + Reviewed by Gavin Barraclough and Mark Rowe. + + Add pattern length limit fixing one test in fast/js. + + * wrec/WREC.cpp: + (KJS::WRECompiler::compile): + * wrec/WREC.h: + (KJS::WRECompiler::): + +2008-09-01 Sam Weinig <sam@webkit.org> + + Reviewed by Gavin Barraclough and Mark Rowe. + + Make octal escape parsing/back-reference parsing more closely match + prior behavior fixing one test in fast/js. + + * wrec/WREC.cpp: + (KJS::WRECompiler::parseCharacterClass): 8 and 9 should be IdentityEscaped + (KJS::WRECompiler::parseEscape): + * wrec/WREC.h: + (KJS::WRECompiler::peekDigit): + +2008-09-01 Sam Weinig <sam@webkit.org> + + Reviewed by Gavin Barraclough and Mark Rowe. + + Fix one mozilla test. + + * wrec/WREC.cpp: + (KJS::WRECompiler::generateCharacterClassInverted): Fix incorrect not + ascii upper check. + +2008-09-01 Sam Weinig <sam@webkit.org> + + Reviewed by Gavin Barraclough and Mark Rowe. + + Parse octal escapes in character classes fixing one mozilla test. + + * wrec/WREC.cpp: + (KJS::WRECompiler::parseCharacterClass): + (KJS::WRECompiler::parseOctalEscape): + * wrec/WREC.h: + (KJS::WRECompiler::consumeOctal): + +2008-09-01 Sam Weinig <sam@webkit.org> + + Reviewed by Oliver Hunt. + + Fixes two mozilla tests with WREC enabled. + + * wrec/WREC.cpp: + (KJS::CharacterClassConstructor::append): Keep the character class sorted + when appending another character class. + +2008-09-01 Sam Weinig <sam@webkit.org> + + Reviewed by Gavin Barraclough and Mark Rowe. + + Fixes two mozilla tests with WREC enabled. + + * wrec/WREC.cpp: + (KJS::CharacterClassConstructor::addSortedRange): Insert the range at the correct position + instead of appending it to the end. + +2008-09-01 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Move cross-compilation unit call into NEVER_INLINE function. + + * VM/Machine.cpp: + (KJS::doSetReturnAddressVmThrowTrampoline): + +2008-09-01 Sam Weinig <sam@webkit.org> + + Reviewed by Gavin Barraclough and Geoff Garen. + + Fix one test in fast/js. + + * VM/Machine.cpp: + (KJS::Machine::cti_op_construct_NotJSConstruct): Throw a createNotAConstructorError, + instead of a createNotAFunctionError. + +2008-08-31 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Maciej Stachowiak. + + Zero-cost exception handling. This patch takes the exception checking + back of the hot path. When an exception occurs in a Machine::cti* + method, the return address to JIT code is recorded, and is then + overwritten with a pointer to a trampoline routine. When the method + returns the trampoline will cause the cti_vm_throw method to be invoked. + + cti_vm_throw uses the return address preserved above, to discover the + vPC of the bytecode that raised the exception (using a map build during + translation). From the VPC of the faulting bytecode the vPC of a catch + routine may be discovered (unwinding the stack where necesary), and then + a bytecode address for the catch routine is looked up. Final cti_vm_throw + overwrites its return address to JIT code again, to trampoline directly + to the catch routine. + + cti_op_throw is handled in a similar fashion. + + * VM/CTI.cpp: + (KJS::CTI::emitPutCTIParam): + (KJS::CTI::emitPutToCallFrameHeader): + (KJS::CTI::emitGetFromCallFrameHeader): + (KJS::ctiSetReturnAddressForArgs): + (KJS::CTI::emitDebugExceptionCheck): + (KJS::CTI::printOpcodeOperandTypes): + (KJS::CTI::emitCall): + (KJS::CTI::compileOpCall): + (KJS::CTI::privateCompile_pass2_Main): + (KJS::CTI::privateCompile): + * VM/CTI.h: + (KJS::CallRecord::CallRecord): + (KJS::): + (KJS::CTI::execute): + * VM/CodeBlock.h: + * VM/Machine.cpp: + (KJS::Machine::privateExecute): + (KJS::Machine::cti_op_instanceof): + (KJS::Machine::cti_op_call_NotJSFunction): + (KJS::Machine::cti_op_resolve): + (KJS::Machine::cti_op_resolve_func): + (KJS::Machine::cti_op_resolve_skip): + (KJS::Machine::cti_op_resolve_with_base): + (KJS::Machine::cti_op_throw): + (KJS::Machine::cti_op_in): + (KJS::Machine::cti_vm_throw): + * VM/RegisterFile.h: + (KJS::RegisterFile::): + * kjs/ExecState.h: + (KJS::ExecState::setCtiReturnAddress): + (KJS::ExecState::ctiReturnAddress): + * masm/IA32MacroAsm.h: + (KJS::IA32MacroAssembler::): + (KJS::IA32MacroAssembler::emitPushl_m): + (KJS::IA32MacroAssembler::emitPopl_m): + (KJS::IA32MacroAssembler::getRelocatedAddress): + +2008-08-31 Mark Rowe <mrowe@apple.com> + + Reviewed by Oliver Hunt. + + Fall back to PCRE for any regexp containing parentheses until we correctly backtrack within them. + + * wrec/WREC.cpp: + (KJS::WRECompiler::parseParentheses): + * wrec/WREC.h: + (KJS::WRECompiler::): + +2008-08-31 Mark Rowe <mrowe@apple.com> + + Reviewed by Oliver Hunt. + + Fix several issues within ecma_3/RegExp/perlstress-001.js with WREC enabled. + + * wrec/WREC.cpp: + (KJS::WRECompiler::generateNonGreedyQuantifier): Compare with the maximum quantifier count rather than the minimum. + (KJS::WRECompiler::generateAssertionEOL): Do a register-to-register comparison rather than immediate-to-register. + (KJS::WRECompiler::parseCharacterClass): Pass through the correct inversion flag. + +2008-08-30 Mark Rowe <mrowe@apple.com> + + Reviewed by Oliver Hunt. + + Re-fix the six remaining failures in the Mozilla JavaScript tests in a manner that does not kill performance. + This shows up as a 0.6% progression on SunSpider on my machine. + + Grow the JITCodeBuffer's underlying buffer when we run out of space rather than just bailing out. + + * VM/CodeBlock.h: + (KJS::CodeBlock::~CodeBlock): Switch to using fastFree now that JITCodeBuffer::copy uses fastMalloc. + * kjs/regexp.cpp: Ditto. + * masm/IA32MacroAsm.h: + (KJS::JITCodeBuffer::growBuffer): + (KJS::JITCodeBuffer::JITCodeBuffer): + (KJS::JITCodeBuffer::~JITCodeBuffer): + (KJS::JITCodeBuffer::putByte): + (KJS::JITCodeBuffer::putShort): + (KJS::JITCodeBuffer::putInt): + (KJS::JITCodeBuffer::reset): + (KJS::JITCodeBuffer::copy): + +2008-08-29 Oliver Hunt <oliver@apple.com> + + RS=Maciej + + Roll out previous patch as it causes a 5% performance regression + + * JavaScriptCore.xcodeproj/project.pbxproj: + * VM/CTI.cpp: + (KJS::getJCB): + (KJS::CTI::privateCompile): + * VM/CodeBlock.h: + (KJS::CodeBlock::~CodeBlock): + * masm/IA32MacroAsm.h: + (KJS::JITCodeBuffer::JITCodeBuffer): + (KJS::JITCodeBuffer::putByte): + (KJS::JITCodeBuffer::putShort): + (KJS::JITCodeBuffer::putInt): + (KJS::JITCodeBuffer::getEIP): + (KJS::JITCodeBuffer::start): + (KJS::JITCodeBuffer::getOffset): + (KJS::JITCodeBuffer::reset): + (KJS::JITCodeBuffer::copy): + (KJS::IA32MacroAssembler::emitModRm_rr): + (KJS::IA32MacroAssembler::emitModRm_rm): + (KJS::IA32MacroAssembler::emitModRm_rmsib): + (KJS::IA32MacroAssembler::IA32MacroAssembler): + (KJS::IA32MacroAssembler::emitInt3): + (KJS::IA32MacroAssembler::emitPushl_r): + (KJS::IA32MacroAssembler::emitPopl_r): + (KJS::IA32MacroAssembler::emitMovl_rr): + (KJS::IA32MacroAssembler::emitAddl_rr): + (KJS::IA32MacroAssembler::emitAddl_i8r): + (KJS::IA32MacroAssembler::emitAddl_i32r): + (KJS::IA32MacroAssembler::emitAddl_mr): + (KJS::IA32MacroAssembler::emitAndl_rr): + (KJS::IA32MacroAssembler::emitAndl_i32r): + (KJS::IA32MacroAssembler::emitCmpl_i8r): + (KJS::IA32MacroAssembler::emitCmpl_rr): + (KJS::IA32MacroAssembler::emitCmpl_rm): + (KJS::IA32MacroAssembler::emitCmpl_i32r): + (KJS::IA32MacroAssembler::emitCmpl_i32m): + (KJS::IA32MacroAssembler::emitCmpw_rm): + (KJS::IA32MacroAssembler::emitOrl_rr): + (KJS::IA32MacroAssembler::emitOrl_i8r): + (KJS::IA32MacroAssembler::emitSubl_rr): + (KJS::IA32MacroAssembler::emitSubl_i8r): + (KJS::IA32MacroAssembler::emitSubl_i32r): + (KJS::IA32MacroAssembler::emitSubl_mr): + (KJS::IA32MacroAssembler::emitTestl_i32r): + (KJS::IA32MacroAssembler::emitTestl_rr): + (KJS::IA32MacroAssembler::emitXorl_i8r): + (KJS::IA32MacroAssembler::emitXorl_rr): + (KJS::IA32MacroAssembler::emitSarl_i8r): + (KJS::IA32MacroAssembler::emitSarl_CLr): + (KJS::IA32MacroAssembler::emitShl_i8r): + (KJS::IA32MacroAssembler::emitShll_CLr): + (KJS::IA32MacroAssembler::emitMull_rr): + (KJS::IA32MacroAssembler::emitIdivl_r): + (KJS::IA32MacroAssembler::emitCdq): + (KJS::IA32MacroAssembler::emitMovl_mr): + (KJS::IA32MacroAssembler::emitMovzwl_mr): + (KJS::IA32MacroAssembler::emitMovl_rm): + (KJS::IA32MacroAssembler::emitMovl_i32r): + (KJS::IA32MacroAssembler::emitMovl_i32m): + (KJS::IA32MacroAssembler::emitLeal_mr): + (KJS::IA32MacroAssembler::emitRet): + (KJS::IA32MacroAssembler::emitJmpN_r): + (KJS::IA32MacroAssembler::emitJmpN_m): + (KJS::IA32MacroAssembler::emitCall): + (KJS::IA32MacroAssembler::label): + (KJS::IA32MacroAssembler::emitUnlinkedJmp): + (KJS::IA32MacroAssembler::emitUnlinkedJne): + (KJS::IA32MacroAssembler::emitUnlinkedJe): + (KJS::IA32MacroAssembler::emitUnlinkedJl): + (KJS::IA32MacroAssembler::emitUnlinkedJle): + (KJS::IA32MacroAssembler::emitUnlinkedJge): + (KJS::IA32MacroAssembler::emitUnlinkedJae): + (KJS::IA32MacroAssembler::emitUnlinkedJo): + (KJS::IA32MacroAssembler::link): + * wrec/WREC.cpp: + (KJS::WRECompiler::compilePattern): + (KJS::WRECompiler::compile): + * wrec/WREC.h: + +2008-08-29 Mark Rowe <mrowe@apple.com> + + Reviewed by Oliver Hunt. + + Have JITCodeBuffer manage a Vector containing the generated code so that it can grow + as needed when generating code for a large function. This fixes all six remaining failures + in Mozilla tests in both debug and release builds. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile): + * VM/CodeBlock.h: + (KJS::CodeBlock::~CodeBlock): + * masm/IA32MacroAsm.h: + (KJS::JITCodeBuffer::putByte): + (KJS::JITCodeBuffer::putShort): + (KJS::JITCodeBuffer::putInt): + (KJS::JITCodeBuffer::getEIP): + (KJS::JITCodeBuffer::start): + (KJS::JITCodeBuffer::getOffset): + (KJS::JITCodeBuffer::getCode): + (KJS::IA32MacroAssembler::emitModRm_rr): + * wrec/WREC.cpp: + (KJS::WRECompiler::compilePattern): + * wrec/WREC.h: + +2008-08-29 Mark Rowe <mrowe@apple.com> + + Reviewed by Oliver Hunt. + + Implement parsing of octal escapes in regular expressions. This fixes three Mozilla tests. + + * wrec/WREC.cpp: + (KJS::WRECompiler::parseOctalEscape): + (KJS::WRECompiler::parseEscape): Parse the escape sequence as an octal escape if it has a leading zero. + Add a FIXME about treating invalid backreferences as octal escapes in the future. + * wrec/WREC.h: + (KJS::WRECompiler::consumeNumber): Multiply by 10 rather than 0 so that we handle numbers with more than + one digit. + * wtf/ASCIICType.h: + (WTF::isASCIIOctalDigit): + +2008-08-29 Sam Weinig <sam@webkit.org> + + Reviewed by Mark Rowe. + + Pass vPC to instanceof method. Fixes 2 mozilla tests in debug. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass2_Main): + * VM/Machine.cpp: + (KJS::Machine::cti_op_instanceof): + +2008-08-29 Sam Weinig <sam@webkit.org> + + Reviewed by Mark Rowe. + + Pass vPCs to resolve methods for correct exception creation. Fixes + 17 mozilla tests in debug. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass2_Main): + * VM/CTI.h: + * VM/Machine.cpp: + (KJS::Machine::cti_op_resolve): + (KJS::Machine::cti_op_resolve_func): + (KJS::Machine::cti_op_resolve_skip): + (KJS::Machine::cti_op_resolve_with_base): + +2008-08-29 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Remembering to actually throw the exception passed to op throw helps. + Regressions 19 -> 6. + + * VM/Machine.cpp: + (KJS::Machine::cti_op_throw): + (KJS::Machine::cti_vm_throw): + +2008-08-29 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Sam Weinig. + + Support for exception unwinding the stack. + + Once upon a time, Sam asked me for a bettr ChangeLog entry. The return address + is now preserved on entry to a JIT code function (if we preserve lazily we need + restore the native return address during exception stack unwind). This takes + the number of regressions down from ~150 to 19. + + * VM/CTI.cpp: + (KJS::getJCB): + (KJS::CTI::emitExceptionCheck): + (KJS::CTI::compileOpCall): + (KJS::CTI::privateCompile_pass2_Main): + (KJS::CTI::privateCompile): + * VM/CTI.h: + (KJS::): + * VM/Machine.cpp: + (KJS::Machine::throwException): + (KJS::Machine::cti_op_call_JSFunction): + (KJS::Machine::cti_op_call_NotJSFunction): + (KJS::Machine::cti_op_construct_JSConstruct): + (KJS::Machine::cti_op_construct_NotJSConstruct): + (KJS::Machine::cti_op_throw): + (KJS::Machine::cti_vm_throw): + +2008-08-29 Mark Rowe <mrowe@apple.com> + + Reviewed by Oliver Hunt. + + Fix js1_2/regexp/word_boundary.js and four other Mozilla tests with WREC enabled. + + * wrec/WREC.cpp: + (KJS::WRECompiler::generateCharacterClassInvertedRange): If none of the exact matches + succeeded, jump to failure. + (KJS::WRECompiler::compilePattern): Restore and increment the current position stored + on the stack to ensure that it will be reset to the correct position after a failed + match has consumed input. + +2008-08-29 Mark Rowe <mrowe@apple.com> + + Reviewed by Oliver Hunt. + + Fix a hang in ecma_3/RegExp/15.10.2-1.js with WREC enabled. + A backreference with a quantifier would get stuck in an infinite + loop if the captured range was empty. + + * wrec/WREC.cpp: + (KJS::WRECompiler::generateBackreferenceQuantifier): If the captured range + was empty, do not attempt to match the backreference. + (KJS::WRECompiler::parseBackreferenceQuantifier): + * wrec/WREC.h: + (KJS::Quantifier::): + +2008-08-28 Sam Weinig <sam@webkit.org> + + Reviewed by Oliver Hunt. + + Implement op_debug. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass1_Scan): + (KJS::CTI::privateCompile_pass2_Main): + * VM/Machine.cpp: + (KJS::Machine::debug): + (KJS::Machine::privateExecute): + (KJS::Machine::cti_op_debug): + * VM/Machine.h: + +2008-08-28 Sam Weinig <sam@webkit.org> + + Reviewed by Gavin Barraclough and Geoff Garen. + + Implement op_switch_string fixing 1 mozilla test and one test in fast/js. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass1_Scan): + (KJS::CTI::privateCompile_pass2_Main): + (KJS::CTI::privateCompile): + * VM/CTI.h: + (KJS::SwitchRecord::): + (KJS::SwitchRecord::SwitchRecord): + * VM/CodeBlock.cpp: + (KJS::CodeBlock::dump): + * VM/CodeBlock.h: + (KJS::ExpressionRangeInfo::): + (KJS::StringJumpTable::offsetForValue): + (KJS::StringJumpTable::ctiForValue): + (KJS::SimpleJumpTable::add): + (KJS::SimpleJumpTable::ctiForValue): + * VM/CodeGenerator.cpp: + (KJS::prepareJumpTableForStringSwitch): + * VM/Machine.cpp: + (KJS::Machine::privateExecute): + (KJS::Machine::cti_op_switch_string): + * VM/Machine.h: + +2008-08-28 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Do not recurse on the machine stack when executing op_call. + + * VM/CTI.cpp: + (KJS::CTI::emitGetPutArg): + (KJS::CTI::emitPutArg): + (KJS::CTI::emitPutArgConstant): + (KJS::CTI::compileOpCall): + (KJS::CTI::privateCompile_pass2_Main): + (KJS::CTI::privateCompile): + * VM/CTI.h: + (KJS::): + (KJS::CTI::compile): + (KJS::CTI::execute): + (KJS::CTI::): + * VM/Machine.cpp: + (KJS::Machine::Machine): + (KJS::Machine::execute): + (KJS::Machine::cti_op_call_JSFunction): + (KJS::Machine::cti_op_call_NotJSFunction): + (KJS::Machine::cti_op_ret): + (KJS::Machine::cti_op_construct_JSConstruct): + (KJS::Machine::cti_op_construct_NotJSConstruct): + (KJS::Machine::cti_op_call_eval): + * VM/Machine.h: + * VM/Register.h: + (KJS::Register::Register): + * VM/RegisterFile.h: + (KJS::RegisterFile::): + * kjs/InternalFunction.h: + (KJS::InternalFunction::InternalFunction): + * kjs/JSFunction.h: + (KJS::JSFunction::JSFunction): + * kjs/ScopeChain.h: + (KJS::ScopeChain::ScopeChain): + * masm/IA32MacroAsm.h: + (KJS::IA32MacroAssembler::): + (KJS::IA32MacroAssembler::emitModRm_opm): + (KJS::IA32MacroAssembler::emitCmpl_i32m): + (KJS::IA32MacroAssembler::emitCallN_r): + +2008-08-28 Sam Weinig <sam@webkit.org> + + Reviewed by Mark Rowe. + + Exit instead of crashing in ctiUnsupported and ctiTimedOut. + + * VM/Machine.cpp: + (KJS::ctiUnsupported): + (KJS::ctiTimedOut): + +2008-08-28 Oliver Hunt <oliver@apple.com> + + Reviewed by Maciej Stachowiak. + + Implement codegen for op_jsr and op_sret. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass1_Scan): + (KJS::CTI::privateCompile_pass2_Main): + (KJS::CTI::privateCompile): + * VM/CTI.h: + (KJS::CTI::JSRInfo::JSRInfo): + * masm/IA32MacroAsm.h: + (KJS::IA32MacroAssembler::emitJmpN_m): + (KJS::IA32MacroAssembler::linkAbsoluteAddress): + +2008-08-28 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Initial support for exceptions (throw / catch must occur in same CodeBlock). + + * VM/CTI.cpp: + (KJS::CTI::emitExceptionCheck): + (KJS::CTI::emitCall): + (KJS::CTI::privateCompile_pass2_Main): + (KJS::CTI::privateCompile_pass4_SlowCases): + (KJS::CTI::privateCompile): + * VM/CTI.h: + * VM/CodeBlock.cpp: + (KJS::CodeBlock::nativeExceptionCodeForHandlerVPC): + * VM/CodeBlock.h: + * VM/CodeGenerator.cpp: + (KJS::CodeGenerator::emitCatch): + * VM/Machine.cpp: + (KJS::Machine::throwException): + (KJS::Machine::privateExecute): + (KJS::ctiUnsupported): + (KJS::ctiTimedOut): + (KJS::Machine::cti_op_add): + (KJS::Machine::cti_op_pre_inc): + (KJS::Machine::cti_timeout_check): + (KJS::Machine::cti_op_loop_if_less): + (KJS::Machine::cti_op_put_by_id): + (KJS::Machine::cti_op_get_by_id): + (KJS::Machine::cti_op_instanceof): + (KJS::Machine::cti_op_del_by_id): + (KJS::Machine::cti_op_mul): + (KJS::Machine::cti_op_call): + (KJS::Machine::cti_op_resolve): + (KJS::Machine::cti_op_construct): + (KJS::Machine::cti_op_get_by_val): + (KJS::Machine::cti_op_resolve_func): + (KJS::Machine::cti_op_sub): + (KJS::Machine::cti_op_put_by_val): + (KJS::Machine::cti_op_lesseq): + (KJS::Machine::cti_op_loop_if_true): + (KJS::Machine::cti_op_negate): + (KJS::Machine::cti_op_resolve_skip): + (KJS::Machine::cti_op_div): + (KJS::Machine::cti_op_pre_dec): + (KJS::Machine::cti_op_jless): + (KJS::Machine::cti_op_not): + (KJS::Machine::cti_op_jtrue): + (KJS::Machine::cti_op_post_inc): + (KJS::Machine::cti_op_eq): + (KJS::Machine::cti_op_lshift): + (KJS::Machine::cti_op_bitand): + (KJS::Machine::cti_op_rshift): + (KJS::Machine::cti_op_bitnot): + (KJS::Machine::cti_op_resolve_with_base): + (KJS::Machine::cti_op_mod): + (KJS::Machine::cti_op_less): + (KJS::Machine::cti_op_neq): + (KJS::Machine::cti_op_post_dec): + (KJS::Machine::cti_op_urshift): + (KJS::Machine::cti_op_bitxor): + (KJS::Machine::cti_op_bitor): + (KJS::Machine::cti_op_call_eval): + (KJS::Machine::cti_op_throw): + (KJS::Machine::cti_op_push_scope): + (KJS::Machine::cti_op_stricteq): + (KJS::Machine::cti_op_nstricteq): + (KJS::Machine::cti_op_to_jsnumber): + (KJS::Machine::cti_op_in): + (KJS::Machine::cti_op_del_by_val): + (KJS::Machine::cti_vm_throw): + * VM/Machine.h: + * kjs/ExecState.h: + * masm/IA32MacroAsm.h: + (KJS::IA32MacroAssembler::emitCmpl_i32m): + +2008-08-28 Mark Rowe <mrowe@apple.com> + + Rubber-stamped by Oliver Hunt. + + Print debugging info to stderr so that run-webkit-tests can capture it. + This makes it easy to check whether test failures are due to unimplemented + op codes, missing support for exceptions, etc. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass1_Scan): + (KJS::CTI::printOpcodeOperandTypes): + (KJS::CTI::privateCompile_pass2_Main): + (KJS::CTI::privateCompile_pass4_SlowCases): + (KJS::CTI::privateCompile): + * VM/Machine.cpp: + (KJS::Machine::privateExecute): + (KJS::ctiException): + (KJS::ctiUnsupported): + (KJS::Machine::cti_op_call): + (KJS::Machine::cti_op_resolve): + (KJS::Machine::cti_op_construct): + (KJS::Machine::cti_op_get_by_val): + (KJS::Machine::cti_op_resolve_func): + (KJS::Machine::cti_op_resolve_skip): + (KJS::Machine::cti_op_resolve_with_base): + (KJS::Machine::cti_op_call_eval): + +2008-08-27 Mark Rowe <mrowe@apple.com> + + Reviewed by Gavin Barraclough and Maciej Stachowiak. + + Fix fast/js/bitwise-and-on-undefined.html. + + A temporary value in the slow path of op_bitand was being stored in edx, but was + being clobbered by emitGetPutArg before we used it. To fix this, emitGetPutArg + now takes a third argument that specifies the scratch register to use when loading + from memory. This allows us to avoid clobbering the temporary in op_bitand. + + * VM/CTI.cpp: + (KJS::CTI::emitGetPutArg): + (KJS::CTI::privateCompile_pass2_Main): + (KJS::CTI::privateCompile_pass4_SlowCases): + * VM/CTI.h: + +2008-08-27 Mark Rowe <mrowe@apple.com> + + Rubber-stamped by Oliver Hunt. + + Switch CTI on by default. + + * wtf/Platform.h: + +2008-08-27 Mark Rowe <mrowe@apple.com> + + Reviewed by Oliver Hunt. + + Fix the build of the full WebKit stack. + + * JavaScriptCore.xcodeproj/project.pbxproj: Mark two new headers as private so they can be pulled in from WebCore. + * VM/CTI.h: Fix build issues that show up when compiled with GCC 4.2 as part of WebCore. + * wrec/WREC.h: Ditto. + +2008-08-27 Mark Rowe <mrowe@apple.com> + + Reviewed by Sam Weinig. + + Implement op_new_error. Does not fix any tests as it is always followed by the unimplemented op_throw. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass1_Scan): + (KJS::CTI::privateCompile_pass2_Main): + * VM/Machine.cpp: + (KJS::Machine::cti_op_new_error): + * VM/Machine.h: + +2008-08-27 Sam Weinig <sam@webkit.org> + + Reviewed by Gavin Barraclough and Geoff Garen. + + Implement op_put_getter and op_put_setter. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass1_Scan): + (KJS::CTI::privateCompile_pass2_Main): + * VM/Machine.cpp: + (KJS::Machine::cti_op_put_getter): + (KJS::Machine::cti_op_put_setter): + * VM/Machine.h: + +2008-08-27 Sam Weinig <sam@webkit.org> + + Reviewed by Gavin Barraclough and Geoff Garen. + + Implement op_del_by_val fixing 3 mozilla tests. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass1_Scan): + (KJS::CTI::privateCompile_pass2_Main): + * VM/Machine.cpp: + (KJS::Machine::cti_op_del_by_val): + * VM/Machine.h: + +2008-08-27 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Quick & dirty fix to get SamplingTool sampling op_call. + + * VM/SamplingTool.h: + (KJS::SamplingTool::callingHostFunction): + +2008-08-27 Sam Weinig <sam@webkit.org> + + Reviewed by Gavin Barraclough and Geoff Garen. + + Fix op_put_by_index. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass2_Main): Use emitPutArgConstant instead of emitGetPutArg + for the property value. + * VM/Machine.cpp: + (KJS::Machine::cti_op_put_by_index): Get the property value from the correct argument. + +2008-08-27 Sam Weinig <sam@webkit.org> + + Reviewed by Gavin Barraclough and Geoff Garen. + + Implement op_switch_imm in the CTI fixing 13 mozilla tests. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass1_Scan): + (KJS::CTI::privateCompile_pass2_Main): + * VM/Machine.cpp: + (KJS::Machine::cti_op_switch_imm): + * VM/Machine.h: + +2008-08-27 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + Implement op_switch_char in CTI. + + * VM/CTI.cpp: + (KJS::CTI::emitCall): + (KJS::CTI::privateCompile_pass1_Scan): + (KJS::CTI::privateCompile_pass2_Main): + (KJS::CTI::privateCompile): + * VM/CTI.h: + (KJS::CallRecord::CallRecord): + (KJS::SwitchRecord::SwitchRecord): + * VM/CodeBlock.h: + (KJS::SimpleJumpTable::SimpleJumpTable::ctiForValue): + * VM/Machine.cpp: + (KJS::Machine::cti_op_switch_char): + * VM/Machine.h: + * masm/IA32MacroAsm.h: + (KJS::IA32MacroAssembler::): + (KJS::IA32MacroAssembler::emitJmpN_r): + (KJS::IA32MacroAssembler::getRelocatedAddress): + * wtf/Platform.h: + +2008-08-26 Sam Weinig <sam@webkit.org> + + Reviewed by Mark Rowe. + + Implement op_put_by_index to fix 1 mozilla test. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass1_Scan): + (KJS::CTI::privateCompile_pass2_Main): + * VM/Machine.cpp: + (KJS::Machine::cti_op_put_by_index): + * VM/Machine.h: + +2008-08-26 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + More fixes from Geoff's review. + + * VM/CTI.cpp: + (KJS::CTI::emitGetArg): + (KJS::CTI::emitGetPutArg): + (KJS::CTI::emitPutArg): + (KJS::CTI::emitPutArgConstant): + (KJS::CTI::getConstantImmediateNumericArg): + (KJS::CTI::emitGetCTIParam): + (KJS::CTI::emitPutResult): + (KJS::CTI::emitCall): + (KJS::CTI::emitJumpSlowCaseIfNotImm): + (KJS::CTI::emitJumpSlowCaseIfNotImms): + (KJS::CTI::getDeTaggedConstantImmediate): + (KJS::CTI::emitFastArithDeTagImmediate): + (KJS::CTI::emitFastArithReTagImmediate): + (KJS::CTI::emitFastArithPotentiallyReTagImmediate): + (KJS::CTI::emitFastArithImmToInt): + (KJS::CTI::emitFastArithIntToImmOrSlowCase): + (KJS::CTI::privateCompile_pass2_Main): + (KJS::CTI::privateCompile_pass4_SlowCases): + (KJS::CTI::privateCompile): + * VM/CTI.h: + +2008-08-26 Mark Rowe <mrowe@apple.com> + + Reviewed by Gavin Barraclough and Geoff Garen. + + Implement op_jmp_scopes to fix 2 Mozilla tests. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass1_Scan): + (KJS::CTI::privateCompile_pass2_Main): + * VM/Machine.cpp: + (KJS::Machine::cti_op_push_new_scope): Update ExecState::m_scopeChain after calling ARG_setScopeChain. + (KJS::Machine::cti_op_jmp_scopes): + * VM/Machine.h: + +2008-08-26 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Oliver Hunt. + + WebKit Regular Expression Compiler. (set ENABLE_WREC = 1 in Platform.h). + + * JavaScriptCore.xcodeproj/project.pbxproj: + * kjs/regexp.cpp: + * kjs/regexp.h: + * wrec: Added. + * wrec/WREC.cpp: Added. + * wrec/WREC.h: Added. + * wtf/Platform.h: + +2008-08-26 Sam Weinig <sam@webkit.org> + + Rubber-stamped by Oliver Hunt. + + Remove bogus assertion. + + * VM/Machine.cpp: + (KJS::Machine::cti_op_del_by_id): + +2008-08-26 Mark Rowe <mrowe@apple.com> + + Reviewed by Sam Weinig. + + Implement op_push_new_scope and stub out op_catch. This fixes 11 Mozilla tests. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass1_Scan): + (KJS::CTI::privateCompile_pass2_Main): + * VM/Machine.cpp: + (KJS::Machine::cti_op_push_new_scope): + (KJS::Machine::cti_op_catch): + * VM/Machine.h: + +2008-08-26 Mark Rowe <mrowe@apple.com> + + Reviewed by Sam Weinig. + + Clean up op_resolve_base so that it shares its implementation with the bytecode interpreter. + + * VM/Machine.cpp: + (KJS::inlineResolveBase): + (KJS::resolveBase): + +2008-08-26 Oliver Hunt <oliver@apple.com> + + Reviewed by Sam Weinig. + + Add codegen support for op_instanceof, fixing 15 mozilla tests. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass1_Scan): + (KJS::CTI::privateCompile_pass2_Main): + * VM/Machine.cpp: + (KJS::Machine::cti_op_instanceof): + (KJS::Machine::cti_op_del_by_id): + * VM/Machine.h: + * wtf/Platform.h: + +2008-08-26 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Fixes for initial review comments. + + * VM/CTI.cpp: + (KJS::CTI::ctiCompileGetArg): + (KJS::CTI::ctiCompileGetPutArg): + (KJS::CTI::ctiCompilePutResult): + (KJS::CTI::ctiCompileCall): + (KJS::CTI::CTI): + (KJS::CTI::privateCompile_pass1_Scan): + (KJS::CTI::printOpcodeOperandTypes): + (KJS::CTI::privateCompile_pass2_Main): + (KJS::CTI::privateCompile_pass4_SlowCases): + (KJS::CTI::privateCompile): + * VM/CTI.h: + * VM/Register.h: + * kjs/JSValue.h: + +2008-08-26 Sam Weinig <sam@webkit.org> + + Reviewed by Gavin Barraclough and Geoff Garen. + + Fix up exception checking code. + + * VM/Machine.cpp: + (KJS::Machine::cti_op_call): + (KJS::Machine::cti_op_resolve): + (KJS::Machine::cti_op_construct): + (KJS::Machine::cti_op_resolve_func): + (KJS::Machine::cti_op_resolve_skip): + (KJS::Machine::cti_op_resolve_with_base): + (KJS::Machine::cti_op_call_eval): + +2008-08-26 Sam Weinig <sam@webkit.org> + + Reviewed by Oliver Hunt. + + Fix slowcase for op_post_inc and op_post_dec fixing 2 mozilla tests. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass4_SlowCases): + +2008-08-26 Mark Rowe <mrowe@apple.com> + + Reviewed by Sam Weinig. + + Implement op_in, fixing 8 mozilla tests. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass1_Scan): + (KJS::CTI::privateCompile_pass2_Main): + * VM/Machine.cpp: + (KJS::Machine::cti_op_in): + * VM/Machine.h: + +2008-08-26 Mark Rowe <mrowe@apple.com> + + Rubber-stamped by Oliver Hunt. + + Don't hardcode the size of a Register for op_new_array. Fixes a crash + seen during the Mozilla tests. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass2_Main): + +2008-08-26 Sam Weinig <sam@webkit.org> + + Reviewed by Gavin Barraclough and Geoff Garen. + + Add support for op_push_scope and op_pop_scope, fixing 20 mozilla tests. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass1_Scan): + (KJS::CTI::privateCompile_pass2_Main): + * VM/CTI.h: + * VM/Machine.cpp: + (KJS::Machine::cti_op_push_scope): + (KJS::Machine::cti_op_pop_scope): + * VM/Machine.h: + +2008-08-26 Oliver Hunt <oliver@apple.com> + + Reviewed by Maciej Stachowiak. + + Add codegen support for op_del_by_id, fixing 49 mozilla tests. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass1_Scan): + (KJS::CTI::privateCompile_pass2_Main): + * VM/Machine.cpp: + (KJS::Machine::cti_op_del_by_id): + * VM/Machine.h: + +2008-08-26 Sam Weinig <sam@webkit.org> + + Reviewed by Gavin Barraclough and Geoff Garen. + + Don't hardcode the size of a Register for op_get_scoped_var and op_put_scoped_var + fixing 513 mozilla tests in debug build. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass2_Main): + +2008-08-26 Oliver Hunt <oliver@apple.com> + + Reviewed by Maciej Stachowiak. + + Added code generator support for op_loop, fixing around 60 mozilla tests. + + * VM/CTI.cpp: + (KJS::CTI::privateCompile_pass1_Scan): + (KJS::CTI::privateCompile_pass2_Main): + +2008-08-26 Mark Rowe <mrowe@apple.com> + + Reviewed by Sam Weinig. + + Set -fomit-frame-pointer in the correct location. + + * Configurations/JavaScriptCore.xcconfig: + * JavaScriptCore.xcodeproj/project.pbxproj: + +2008-08-26 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Inital cut of CTI, Geoff's review fixes to follow. + + * JavaScriptCore.xcodeproj/project.pbxproj: + * VM/CTI.cpp: Added. + (KJS::getJCB): + (KJS::CTI::ctiCompileGetArg): + (KJS::CTI::ctiCompileGetPutArg): + (KJS::CTI::ctiCompilePutArg): + (KJS::CTI::ctiCompilePutArgImm): + (KJS::CTI::ctiImmediateNumericArg): + (KJS::CTI::ctiCompileGetCTIParam): + (KJS::CTI::ctiCompilePutResult): + (KJS::CTI::ctiCompileCall): + (KJS::CTI::slowCaseIfNotImm): + (KJS::CTI::slowCaseIfNotImms): + (KJS::CTI::ctiFastArithDeTagConstImmediate): + (KJS::CTI::ctiFastArithDeTagImmediate): + (KJS::CTI::ctiFastArithReTagImmediate): + (KJS::CTI::ctiFastArithPotentiallyReTagImmediate): + (KJS::CTI::ctiFastArithImmToInt): + (KJS::CTI::ctiFastArithIntToImmOrSlowCase): + (KJS::CTI::CTI): + (KJS::CTI::privateCompile_pass1_Scan): + (KJS::CTI::ctiCompileAdd): + (KJS::CTI::ctiCompileAddImm): + (KJS::CTI::ctiCompileAddImmNotInt): + (KJS::CTI::TEMP_HACK_PRINT_TYPES): + (KJS::CTI::privateCompile_pass2_Main): + (KJS::CTI::privateCompile_pass3_Link): + (KJS::CTI::privateCompile_pass4_SlowCases): + (KJS::CTI::privateCompile): + * VM/CTI.h: Added. + (KJS::CTI2Result::CTI2Result): + (KJS::CallRecord::CallRecord): + (KJS::JmpTable::JmpTable): + (KJS::SlowCaseEntry::SlowCaseEntry): + (KJS::CTI::compile): + (KJS::CTI::LabelInfo::LabelInfo): + * VM/CodeBlock.h: + (KJS::CodeBlock::CodeBlock): + (KJS::CodeBlock::~CodeBlock): + * VM/Machine.cpp: + (KJS::Machine::execute): + (KJS::Machine::privateExecute): + (KJS::ctiException): + (KJS::ctiUnsupported): + (KJS::ctiTimedOut): + (KJS::Machine::cti_op_end): + (KJS::Machine::cti_op_add): + (KJS::Machine::cti_op_pre_inc): + (KJS::Machine::cti_timeout_check): + (KJS::Machine::cti_op_loop_if_less): + (KJS::Machine::cti_op_new_object): + (KJS::Machine::cti_op_put_by_id): + (KJS::Machine::cti_op_get_by_id): + (KJS::Machine::cti_op_mul): + (KJS::Machine::cti_op_new_func): + (KJS::Machine::cti_op_call): + (KJS::Machine::cti_op_ret): + (KJS::Machine::cti_op_new_array): + (KJS::Machine::cti_op_resolve): + (KJS::Machine::cti_op_construct): + (KJS::Machine::cti_op_get_by_val): + (KJS::Machine::cti_op_resolve_func): + (KJS::Machine::cti_op_sub): + (KJS::Machine::cti_op_put_by_val): + (KJS::Machine::cti_op_lesseq): + (KJS::Machine::cti_op_loop_if_true): + (KJS::Machine::cti_op_negate): + (KJS::Machine::cti_op_resolve_base): + (KJS::Machine::cti_op_resolve_skip): + (KJS::Machine::cti_op_div): + (KJS::Machine::cti_op_pre_dec): + (KJS::Machine::cti_op_jless): + (KJS::Machine::cti_op_not): + (KJS::Machine::cti_op_jtrue): + (KJS::Machine::cti_op_post_inc): + (KJS::Machine::cti_op_eq): + (KJS::Machine::cti_op_lshift): + (KJS::Machine::cti_op_bitand): + (KJS::Machine::cti_op_rshift): + (KJS::Machine::cti_op_bitnot): + (KJS::Machine::cti_op_resolve_with_base): + (KJS::Machine::cti_op_new_func_exp): + (KJS::Machine::cti_op_mod): + (KJS::Machine::cti_op_less): + (KJS::Machine::cti_op_neq): + (KJS::Machine::cti_op_post_dec): + (KJS::Machine::cti_op_urshift): + (KJS::Machine::cti_op_bitxor): + (KJS::Machine::cti_op_new_regexp): + (KJS::Machine::cti_op_bitor): + (KJS::Machine::cti_op_call_eval): + (KJS::Machine::cti_op_throw): + (KJS::Machine::cti_op_get_pnames): + (KJS::Machine::cti_op_next_pname): + (KJS::Machine::cti_op_typeof): + (KJS::Machine::cti_op_stricteq): + (KJS::Machine::cti_op_nstricteq): + (KJS::Machine::cti_op_to_jsnumber): + * VM/Machine.h: + * VM/Register.h: + (KJS::Register::jsValue): + (KJS::Register::getJSValue): + (KJS::Register::codeBlock): + (KJS::Register::scopeChain): + (KJS::Register::i): + (KJS::Register::r): + (KJS::Register::vPC): + (KJS::Register::jsPropertyNameIterator): + * VM/SamplingTool.cpp: + (KJS::): + (KJS::SamplingTool::run): + (KJS::SamplingTool::dump): + * VM/SamplingTool.h: + * kjs/JSImmediate.h: + (KJS::JSImmediate::zeroImmediate): + (KJS::JSImmediate::oneImmediate): + * kjs/JSValue.h: + * kjs/JSVariableObject.h: + (KJS::JSVariableObject::JSVariableObjectData::offsetOf_registers): + (KJS::JSVariableObject::offsetOf_d): + (KJS::JSVariableObject::offsetOf_Data_registers): + * masm: Added. + * masm/IA32MacroAsm.h: Added. + (KJS::JITCodeBuffer::JITCodeBuffer): + (KJS::JITCodeBuffer::putByte): + (KJS::JITCodeBuffer::putShort): + (KJS::JITCodeBuffer::putInt): + (KJS::JITCodeBuffer::getEIP): + (KJS::JITCodeBuffer::start): + (KJS::JITCodeBuffer::getOffset): + (KJS::JITCodeBuffer::reset): + (KJS::JITCodeBuffer::copy): + (KJS::IA32MacroAssembler::): + (KJS::IA32MacroAssembler::emitModRm_rr): + (KJS::IA32MacroAssembler::emitModRm_rm): + (KJS::IA32MacroAssembler::emitModRm_rmsib): + (KJS::IA32MacroAssembler::emitModRm_opr): + (KJS::IA32MacroAssembler::emitModRm_opm): + (KJS::IA32MacroAssembler::IA32MacroAssembler): + (KJS::IA32MacroAssembler::emitInt3): + (KJS::IA32MacroAssembler::emitPushl_r): + (KJS::IA32MacroAssembler::emitPopl_r): + (KJS::IA32MacroAssembler::emitMovl_rr): + (KJS::IA32MacroAssembler::emitAddl_rr): + (KJS::IA32MacroAssembler::emitAddl_i8r): + (KJS::IA32MacroAssembler::emitAddl_i32r): + (KJS::IA32MacroAssembler::emitAddl_mr): + (KJS::IA32MacroAssembler::emitAndl_rr): + (KJS::IA32MacroAssembler::emitAndl_i32r): + (KJS::IA32MacroAssembler::emitCmpl_i8r): + (KJS::IA32MacroAssembler::emitCmpl_rr): + (KJS::IA32MacroAssembler::emitCmpl_rm): + (KJS::IA32MacroAssembler::emitCmpl_i32r): + (KJS::IA32MacroAssembler::emitCmpw_rm): + (KJS::IA32MacroAssembler::emitOrl_rr): + (KJS::IA32MacroAssembler::emitOrl_i8r): + (KJS::IA32MacroAssembler::emitSubl_rr): + (KJS::IA32MacroAssembler::emitSubl_i8r): + (KJS::IA32MacroAssembler::emitSubl_i32r): + (KJS::IA32MacroAssembler::emitSubl_mr): + (KJS::IA32MacroAssembler::emitTestl_i32r): + (KJS::IA32MacroAssembler::emitTestl_rr): + (KJS::IA32MacroAssembler::emitXorl_i8r): + (KJS::IA32MacroAssembler::emitXorl_rr): + (KJS::IA32MacroAssembler::emitSarl_i8r): + (KJS::IA32MacroAssembler::emitSarl_CLr): + (KJS::IA32MacroAssembler::emitShl_i8r): + (KJS::IA32MacroAssembler::emitShll_CLr): + (KJS::IA32MacroAssembler::emitMull_rr): + (KJS::IA32MacroAssembler::emitIdivl_r): + (KJS::IA32MacroAssembler::emitCdq): + (KJS::IA32MacroAssembler::emitMovl_mr): + (KJS::IA32MacroAssembler::emitMovzwl_mr): + (KJS::IA32MacroAssembler::emitMovl_rm): + (KJS::IA32MacroAssembler::emitMovl_i32r): + (KJS::IA32MacroAssembler::emitMovl_i32m): + (KJS::IA32MacroAssembler::emitLeal_mr): + (KJS::IA32MacroAssembler::emitRet): + (KJS::IA32MacroAssembler::JmpSrc::JmpSrc): + (KJS::IA32MacroAssembler::JmpDst::JmpDst): + (KJS::IA32MacroAssembler::emitCall): + (KJS::IA32MacroAssembler::label): + (KJS::IA32MacroAssembler::emitUnlinkedJmp): + (KJS::IA32MacroAssembler::emitUnlinkedJne): + (KJS::IA32MacroAssembler::emitUnlinkedJe): + (KJS::IA32MacroAssembler::emitUnlinkedJl): + (KJS::IA32MacroAssembler::emitUnlinkedJle): + (KJS::IA32MacroAssembler::emitUnlinkedJge): + (KJS::IA32MacroAssembler::emitUnlinkedJae): + (KJS::IA32MacroAssembler::emitUnlinkedJo): + (KJS::IA32MacroAssembler::emitPredictionNotTaken): + (KJS::IA32MacroAssembler::link): + (KJS::IA32MacroAssembler::copy): + * wtf/Platform.h: + +2008-08-26 Oliver Hunt <oliver@apple.com> + + RS=Maciej. + + Enabled -fomit-frame-pointer on Release and Production builds, add additional Profiling build config for shark, etc. + + * JavaScriptCore.xcodeproj/project.pbxproj: + +=== Start merge of squirrelfish-extreme === + +2008-09-06 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Maciej Stachowiak. + + Fix the Mac Debug build by adding symbols that are exported only in a + Debug configuration. + + * Configurations/JavaScriptCore.xcconfig: + * DerivedSources.make: + * JavaScriptCore.Debug.exp: Added. + * JavaScriptCore.base.exp: Copied from JavaScriptCore.exp. + * JavaScriptCore.exp: Removed. + * JavaScriptCore.xcodeproj/project.pbxproj: + +2008-09-05 Darin Adler <darin@apple.com> + + Reviewed by Cameron Zwarich. + + - https://bugs.webkit.org/show_bug.cgi?id=20681 + JSPropertyNameIterator functions need to be inlined + + 1.007x as fast on SunSpider overall + 1.081x as fast on SunSpider math-cordic + + * VM/JSPropertyNameIterator.cpp: Moved functions out of here. + * VM/JSPropertyNameIterator.h: + (KJS::JSPropertyNameIterator::JSPropertyNameIterator): Moved + this into the header and marked it inline. + (KJS::JSPropertyNameIterator::create): Ditto. + (KJS::JSPropertyNameIterator::next): Ditto. + +2008-09-05 Darin Adler <darin@apple.com> + + Reviewed by Geoffrey Garen. + + - fix https://bugs.webkit.org/show_bug.cgi?id=20673 + single-character strings are churning in the Identifier table + + 1.007x as fast on SunSpider overall + 1.167x as fast on SunSpider string-fasta + + * JavaScriptCore.exp: Updated. + * kjs/SmallStrings.cpp: + (KJS::SmallStrings::singleCharacterStringRep): Added. + * kjs/SmallStrings.h: Added singleCharacterStringRep for clients that + need just a UString, not a JSString. + * kjs/identifier.cpp: + (KJS::Identifier::add): Added special cases for single character strings + so that the UString::Rep that ends up in the identifier table is the one + from the single-character string optimization; otherwise we end up having + to look it up in the identifier table over and over again. + (KJS::Identifier::addSlowCase): Ditto. + (KJS::Identifier::checkSameIdentifierTable): Made this function an empty + inline in release builds so that callers don't have to put #ifndef NDEBUG + at each call site. + * kjs/identifier.h: + (KJS::Identifier::add): Removed #ifndef NDEBUG around the calls to + checkSameIdentifierTable. + (KJS::Identifier::checkSameIdentifierTable): Added. Empty inline version + for NDEBUG builds. + +2008-09-05 Mark Rowe <mrowe@apple.com> + + Build fix. + + * kjs/JSObject.h: Move the inline virtual destructor after a non-inline + virtual function so that the symbol for the vtable is not marked as a + weakly exported symbol. + +2008-09-05 Darin Adler <darin@apple.com> + + Reviewed by Sam Weinig. + + - fix https://bugs.webkit.org/show_bug.cgi?id=20671 + JavaScriptCore string manipulation spends too much time in memcpy + + 1.011x as fast on SunSpider overall + 1.028x as fast on SunSpider string tests + + For small strings, use a loop rather than calling memcpy. The loop can + be faster because there's no function call overhead, and because it can + assume the pointers are aligned instead of checking that. Currently the + threshold is set at 20 characters, based on some testing on one particular + computer. Later we can tune this for various platforms by setting + USTRING_COPY_CHARS_INLINE_CUTOFF appropriately, but it does no great harm + if not perfectly tuned. + + * kjs/ustring.cpp: + (KJS::overflowIndicator): Removed bogus const. + (KJS::maxUChars): Ditto. + (KJS::copyChars): Added. + (KJS::UString::Rep::createCopying): Call copyChars instead of memcpy. + Also eliminated need for const_cast. + (KJS::UString::expandPreCapacity): Ditto. + (KJS::concatenate): Ditto. + (KJS::UString::spliceSubstringsWithSeparators): Ditto. + (KJS::UString::append): Ditto. + +2008-09-05 Kevin McCullough <kmccullough@apple.com> + + Reviewed by Sam and Alexey. + + Make the profiler work with a null exec state. This will allow other + applications start the profiler to get DTrace probes going without + needing a WebView. + + * ChangeLog: + * profiler/ProfileGenerator.cpp: + (KJS::ProfileGenerator::ProfileGenerator): + (KJS::ProfileGenerator::willExecute): + (KJS::ProfileGenerator::didExecute): + * profiler/Profiler.cpp: + (KJS::Profiler::startProfiling): + (KJS::Profiler::stopProfiling): + (KJS::dispatchFunctionToProfiles): + +2008-09-04 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoffrey Garen. + + Fixed an off-by-one error that would cause the StructureIDChain to + be one object too short. + + Can't construct a test case because other factors make this not crash + (yet!). + + * kjs/StructureID.cpp: + (KJS::StructureIDChain::StructureIDChain): + +2008-09-04 Kevin Ollivier <kevino@theolliviers.com> + + wx build fixes. + + * JavaScriptCoreSources.bkl: + +2008-09-04 Mark Rowe <mrowe@apple.com> + + Reviewed by Eric Seidel. + + Fix https://bugs.webkit.org/show_bug.cgi?id=20639. + Bug 20639: ENABLE_DASHBOARD_SUPPORT does not need to be a FEATURE_DEFINE + + * Configurations/JavaScriptCore.xcconfig: Remove ENABLE_DASHBOARD_SUPPORT from FEATURE_DEFINES. + * wtf/Platform.h: Set ENABLE_DASHBOARD_SUPPORT for PLATFORM(MAC). + +2008-09-04 Adele Peterson <adele@apple.com> + + Build fix. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.vcproj/WTF/WTF.vcproj: + * JavaScriptCore.vcproj/jsc/jsc.vcproj: + +2008-09-04 Mark Rowe <mrowe@apple.com> + + Mac build fix. + + * kjs/config.h: Only check the value of HAVE_CONFIG_H if it is defined. + +2008-09-04 Marco Barisione <marco.barisione@collabora.co.uk> + + Reviewed by Eric Seidel. + + http://bugs.webkit.org/show_bug.cgi?id=20380 + [GTK][AUTOTOOLS] Include autotoolsconfig.h from config.h + + * kjs/config.h: Include the configuration header generated by + autotools if available. + +2008-09-04 Tor Arne Vestbø <tavestbo@trolltech.com> + + Reviewed by Simon. + + Fix the QtWebKit build to match changes in r36016 + + * JavaScriptCore.pri: + +2008-09-04 Mark Rowe <mrowe@apple.com> + + Fix the 64-bit build. + + * VM/CodeBlock.cpp: + (KJS::CodeBlock::printStructureID): Store the instruction offset into an unsigned local + to avoid a warning related to format specifiers. + (KJS::CodeBlock::printStructureIDs): Ditto. + +2008-09-04 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Rubber-stamped by Oliver Hunt. + + Correct the spelling of 'entryIndices'. + + * kjs/PropertyMap.cpp: + (KJS::PropertyMap::get): + (KJS::PropertyMap::getLocation): + (KJS::PropertyMap::put): + (KJS::PropertyMap::insert): + (KJS::PropertyMap::remove): + (KJS::PropertyMap::checkConsistency): + * kjs/PropertyMap.h: + (KJS::PropertyMapHashTable::entries): + (KJS::PropertyMap::getOffset): + (KJS::PropertyMap::putOffset): + (KJS::PropertyMap::offsetForTableLocation): + +2008-09-03 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Cameron Zwarich. + + Fixed <rdar://problem/6193925> REGRESSION: Crash occurs at + KJS::Machine::privateExecute() when attempting to load my Mobile Gallery + (http://www.me.com/gallery/#home) + + also + + https://bugs.webkit.org/show_bug.cgi?id=20633 Crash in privateExecute + @ cs.byu.edu + + The underlying problem was that we would cache prototype properties + even if the prototype was a dictionary. + + The fix is to transition a prototype back from dictionary to normal + status when an opcode caches access to it. (This is better than just + refusing to cache, since a heavily accessed prototype is almost + certainly not a true dictionary.) + + * VM/Machine.cpp: + (KJS::Machine::tryCacheGetByID): + * kjs/JSObject.h: + +2008-09-03 Eric Seidel <eric@webkit.org> + + Reviewed by Sam. + + Clean up Platform.h and add PLATFORM(CHROMIUM), PLATFORM(SKIA) and USE(V8_BINDINGS) + + * Configurations/JavaScriptCore.xcconfig: add missing ENABLE_* + * wtf/ASCIICType.h: include <wtf/Assertions.h> since it depends on it. + * wtf/Platform.h: + +2008-09-03 Kevin McCullough <kmccullough@apple.com> + + Reviewed by Tim. + + Remove the rest of the "zombie" code from the profiler. + - There is no longer a need for the ProfilerClient callback mechanism. + + * API/JSProfilerPrivate.cpp: + (JSStartProfiling): + * JavaScriptCore.exp: + * profiler/HeavyProfile.h: + * profiler/ProfileGenerator.cpp: + (KJS::ProfileGenerator::create): + (KJS::ProfileGenerator::ProfileGenerator): + * profiler/ProfileGenerator.h: + (KJS::ProfileGenerator::profileGroup): + * profiler/Profiler.cpp: + (KJS::Profiler::startProfiling): + (KJS::Profiler::stopProfiling): Immediately return the profile when + stopped instead of using a callback. + * profiler/Profiler.h: + * profiler/TreeProfile.h: + +2008-09-03 Adele Peterson <adele@apple.com> + + Build fix. + + * wtf/win/MainThreadWin.cpp: + +2008-09-02 Kevin McCullough <kmccullough@apple.com> + + Reviewed by Darin and Tim. + + Remove most of the "zombie" mode from the profiler. Next we will need + to remove the client callback mechanism in profiles. + + - This simplifies the code, leverages the recent changes I've made in + getting line numbers from SquirrelFish, and is a slight speed + improvement on SunSpider. + - Also the "zombie" mode was a constant source of odd edge cases and + obscure bugs so it's good to remove since all of its issues may not have + been found. + + * API/JSProfilerPrivate.cpp: No need to call didFinishAllExecution() any + more. + (JSEndProfiling): + * JavaScriptCore.exp: Export the new signature of retrieveLastCaller() + * VM/Machine.cpp: + (KJS::Machine::execute): No need to call didFinishAllExecution() any + more. + (KJS::Machine::retrieveCaller): Now operates on InternalFunctions now + since the RegisterFile is no longer guaranteeded to store only + JSFunctions + (KJS::Machine::retrieveLastCaller): Now also retrieve the function's + name + (KJS::Machine::callFrame): A result of changing retrieveCaller() + * VM/Machine.h: + * VM/Register.h: + * kjs/JSGlobalObject.cpp: + (KJS::JSGlobalObject::~JSGlobalObject): + * kjs/nodes.h: + * profiler/ProfileGenerator.cpp: + (KJS::ProfileGenerator::create): Now pass the original exec and get the + global exec and client when necessary. We need the original exec so we + can have the stack frame where profiling started. + (KJS::ProfileGenerator::ProfileGenerator): ditto. + (KJS::ProfileGenerator::addParentForConsoleStart): This is where the + parent to star of the profile is added, if there is one. + (KJS::ProfileGenerator::willExecute): Remove uglyness! + (KJS::ProfileGenerator::didExecute): Ditto! + (KJS::ProfileGenerator::stopProfiling): + (KJS::ProfileGenerator::removeProfileStart): Use a better way to find + and remove the function we are looking for. + (KJS::ProfileGenerator::removeProfileEnd): Ditto. + * profiler/ProfileGenerator.h: + (KJS::ProfileGenerator::client): + * profiler/ProfileNode.cpp: + (KJS::ProfileNode::removeChild): Add a better way to remove a child from + a ProfileNode. + (KJS::ProfileNode::stopProfiling): + (KJS::ProfileNode::debugPrintData): Modified a debug-only diagnostic + function to be sane. + * profiler/ProfileNode.h: + * profiler/Profiler.cpp: Change to pass the original exec state. + (KJS::Profiler::startProfiling): + (KJS::Profiler::stopProfiling): + (KJS::Profiler::willExecute): + (KJS::Profiler::didExecute): + (KJS::Profiler::createCallIdentifier): + * profiler/Profiler.h: + +2008-09-01 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Darin Adler. + + Implement callOnMainThreadAndWait(). + + This will be useful when a background thread needs to perform UI calls synchronously + (e.g. an openDatabase() call cannot return until the user answers to a confirmation dialog). + + * wtf/MainThread.cpp: + (WTF::FunctionWithContext::FunctionWithContext): Added a ThreadCondition member. When + non-zero, the condition is signalled after the function is called. + (WTF::mainThreadFunctionQueueMutex): Renamed from functionQueueMutex, sinc this is no longer + static. Changed to be initialized from initializeThreading() to avoid lock contention. + (WTF::initializeMainThread): On non-Windows platforms, just call mainThreadFunctionQueueMutex. + (WTF::dispatchFunctionsFromMainThread): Signal synchronous calls when done. + (WTF::callOnMainThread): Updated for functionQueueMutex rename. + (WTF::callOnMainThreadAndWait): Added. + + * wtf/MainThread.h: Added callOnMainThreadAndWait(); initializeMainThread() now exists on + all platforms. + + * wtf/win/MainThreadWin.cpp: (WTF::initializeMainThread): Added a callOnMainThreadAndWait() + call to initialize function queue mutex. + + * wtf/ThreadingGtk.cpp: (WTF::initializeThreading): + * wtf/ThreadingPthreads.cpp: (WTF::initializeThreading): + * wtf/ThreadingQt.cpp: (WTF::initializeThreading): + Only initialize mainThreadIdentifier on non-Darwin platforms. It was not guaranteed to be + accurate on Darwin. + +2008-09-03 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Darin Adler. + + Use isUndefinedOrNull() instead of separate checks for each in op_eq_null + and op_neq_null. + + * VM/Machine.cpp: + (KJS::Machine::privateExecute): + +2008-09-02 Csaba Osztrogonac <oszi@inf.u-szeged.hu> + + Reviewed by Darin Adler. + + Bug 20296: OpcodeStats doesn't build on platforms which don't have mergesort(). + <https://bugs.webkit.org/show_bug.cgi?id=20296> + + * VM/Opcode.cpp: + (KJS::OpcodeStats::~OpcodeStats): mergesort() replaced with qsort() + +2008-09-02 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Oliver Hunt. + + Fast path for array.length and string.length. + + SunSpider says 0.5% faster. + +2008-09-02 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Anders Carlsson. + + Added optimized paths for comparing to null. + + SunSpider says 0.5% faster. + +2008-09-02 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Changed jsDriver.pl to dump the exact text you would need in order to + reproduce a test result. This enables a fast workflow where you copy + and paste a test failure in the terminal. + + * tests/mozilla/jsDriver.pl: + +2008-09-02 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Implemented the rest of Darin's review comments for the 09-01 inline + caching patch. + + SunSpider says 0.5% faster, but that seems like noise. + + * JavaScriptCore.xcodeproj/project.pbxproj: Put PutPropertySlot into + its own file, and added BatchedTransitionOptimizer. + + * VM/CodeBlock.cpp: + (KJS::CodeBlock::~CodeBlock): Use array indexing instead of a pointer + iterator. + + * VM/CodeGenerator.cpp: + (KJS::CodeGenerator::CodeGenerator): Used BatchedTransitionOptimizer to + make batched put and remove for declared variables fast, without forever + pessimizing the global object. Removed the old getDirect/removeDirect hack + that tried to do the same in a more limited way. + + * VM/CodeGenerator.h: Moved IdentifierRepHash to the KJS namespace since + it doesn't specialize anything in WTF. + + * VM/Machine.cpp: + (KJS::Machine::Machine): Nixed the DummyConstruct tag because it was + confusingly named. + + (KJS::Machine::execute): Used BatchedTransitionOptimizer, as above. Fixed + up some comments. + + (KJS::cachePrototypeChain): Cast to JSObject*, since it's more specific. + + (KJS::Machine::tryCachePutByID): Use isNull() instead of comparing to + jsNull(), since isNull() leaves more options open for the future. + (KJS::Machine::tryCacheGetByID): ditto + (KJS::Machine::privateExecute): ditto + + * VM/SamplingTool.cpp: + (KJS::SamplingTool::dump): Use C++-style cast, to match our style + guidelines. + + * kjs/BatchedTransitionOptimizer.h: Added. New class that allows host + code to add a batch of properties to an object in an efficient way. + + * kjs/JSActivation.cpp: Use isNull(), as above. + + * kjs/JSArray.cpp: Get rid of DummyConstruct tag, as above. + * kjs/JSArray.h: + + * kjs/JSGlobalData.cpp: Nixed two unused StructureIDs. + * kjs/JSGlobalData.h: + + * kjs/JSImmediate.cpp: Use isNull(), as above. + + * kjs/JSObject.cpp: + (KJS::JSObject::mark): Moved mark tracing code elsewhere, to make this + function more readable. + + (KJS::JSObject::put): Use isNull(), as above. + + (KJS::JSObject::createInheritorID): Return a raw pointer, since the + object is owned by a data member, not necessarily the caller. + * kjs/JSObject.h: + + * kjs/JSString.cpp: Use isNull(), as above. + + * kjs/PropertyMap.h: Updated to use PropertySlot::invalidOffset. + + * kjs/PropertySlot.h: Changed KJS_INVALID_OFFSET to WTF::notFound + because C macros are so 80's. + + * kjs/PutPropertySlot.h: Added. Split out of PropertySlot.h. Also renamed + PutPropertySlot::SlotType to PutPropertySlot::Type, and slotBase to base, + since "slot" was redundant. + + * kjs/StructureID.cpp: Added a new transition *away* from dictionary + status, to support BatchedTransitionOptimizer. + + (KJS::StructureIDChain::StructureIDChain): No need to store m_size as + a data member, so keep it in a local, which might be faster. + * kjs/StructureID.h: + + * kjs/SymbolTable.h: Moved IdentifierRepHash to KJS namespace, as above. + * kjs/ustring.h: + +2008-09-02 Adam Roben <aroben@apple.com> + + Windows build fixes + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Add + StructureID.{cpp,h} to the project. Also let VS reorder this file. + * VM/CodeBlock.cpp: Include StringExtras so that snprintf will be + defined on Windows. + +2008-09-01 Sam Weinig <sam@webkit.org> + + Fix release build. + + * JavaScriptCore.exp: + +2008-09-01 Jan Michael Alonzo <jmalonzo@webkit.org> + + Reviewed by Oliver Hunt. + + Gtk buildfix + + * GNUmakefile.am: + * kjs/PropertyMap.cpp: rename Identifier.h to identifier.h + * kjs/StructureID.cpp: include JSObject.h + +2008-09-01 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Darin Adler. + + First cut at inline caching for access to vanilla JavaScript properties. + + SunSpider says 4% faster. Tests heavy on dictionary-like access have + regressed a bit -- we have a lot of room to improve in this area, + but this patch is over-ripe as-is. + + JSCells now have a StructureID that uniquely identifies their layout, + and holds their prototype. + + JSValue::put takes a PropertySlot& argument, so it can fill in details + about where it put a value, for the sake of caching. + + * VM/CodeGenerator.cpp: + (KJS::CodeGenerator::CodeGenerator): Avoid calling removeDirect if we + can, since it disables inline caching in the global object. This can + probably improve in the future. + + * kjs/JSGlobalObject.cpp: Nixed reset(), since it complicates caching, and + wasn't really necessary. + + * kjs/JSObject.cpp: Tweaked getter / setter behavior not to rely on the + IsGetterSetter flag, since the flag was buggy. This is necessary in order + to avoid accidentally accessing a getter / setter as a normal property. + + Also changed getter / setter creation to honor ReadOnly, matching Mozilla. + + * kjs/PropertyMap.cpp: Nixed clear(), since it complicates caching and + isn't necessary. + + * kjs/Shell.cpp: Moved SamplingTool dumping outside the loop. This allows + you to aggregate sampling of multiple files (or the same file repeatedly), + which helped me track down regressions. + + * kjs/ustring.h: Moved IdentifierRepHash here to share it. + +2008-09-01 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Sam Weinig. + + Eagerly allocate the Math object's numeric constants. This avoids + constantly reallocating them in loops, and also ensures that the Math + object will not use the single property optimization, which makes + properties ineligible for caching. + + SunSpider reports a small speedup, in combination with inline caching. + + * kjs/MathObject.cpp: + (KJS::MathObject::MathObject): + (KJS::MathObject::getOwnPropertySlot): + * kjs/MathObject.h: + +2008-09-01 Jan Michael Alonzo <jmalonzo@webkit.org> + + Gtk build fix, not reviewed. + + * GNUmakefile.am: Add SmallStrings.cpp in both release and debug builds + +2008-08-31 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Maciej Stachowiak. + + Bug 20577: REGRESSION (r36006): Gmail is broken + <https://bugs.webkit.org/show_bug.cgi?id=20577> + + r36006 changed stringProtoFuncSubstr() so that it is uses the more + efficient jsSubstring(), rather than using UString::substr() and then + calling jsString(). However, the change did not account for the case + where the start and the length of the substring extend beyond the length + of the original string. This patch corrects that. + + * kjs/StringPrototype.cpp: + (KJS::stringProtoFuncSubstr): + +2008-08-31 Simon Hausmann <hausmann@wekit.org> + + Unreviewed build fix (with gcc 4.3) + + * kjs/ustring.h: Properly forward declare operator== for UString and + the the concatenate functions inside the KJS namespace. + +2008-08-30 Darin Adler <darin@apple.com> + + Reviewed by Maciej. + + - https://bugs.webkit.org/show_bug.cgi?id=20333 + improve JavaScript speed when handling single-character strings + + 1.035x as fast on SunSpider overall. + 1.127x as fast on SunSpider string tests. + 1.910x as fast on SunSpider string-base64 test. + + * API/JSObjectRef.cpp: + (JSObjectMakeFunction): Removed unneeded explicit construction of UString. + + * GNUmakefile.am: Added SmallStrings.h and SmallStrings.cpp. + * JavaScriptCore.pri: Ditto. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + Ditto. + * JavaScriptCore.xcodeproj/project.pbxproj: Ditto. + * JavaScriptCoreSources.bkl: Ditto. + + * JavaScriptCore.exp: Updated. + + * VM/Machine.cpp: + (KJS::jsAddSlowCase): Changed to use a code path that doesn't involve + a UString constructor. This avoids an extra jump caused by the "in charge" + vs. "not in charge" constructors. + (KJS::jsAdd): Ditto. + (KJS::jsTypeStringForValue): Adopted jsNontrivialString. + + * kjs/ArrayPrototype.cpp: + (KJS::arrayProtoFuncToString): Adopted jsEmptyString. + (KJS::arrayProtoFuncToLocaleString): Ditto. + (KJS::arrayProtoFuncJoin): Ditto. + * kjs/BooleanPrototype.cpp: + (KJS::booleanProtoFuncToString): Adopted jsNontrivialString. + * kjs/DateConstructor.cpp: + (KJS::callDate): Ditto. + * kjs/DatePrototype.cpp: + (KJS::formatLocaleDate): Adopted jsEmptyString and jsNontrivialString. + (KJS::dateProtoFuncToString): Ditto. + (KJS::dateProtoFuncToUTCString): Ditto. + (KJS::dateProtoFuncToDateString): Ditto. + (KJS::dateProtoFuncToTimeString): Ditto. + (KJS::dateProtoFuncToLocaleString): Ditto. + (KJS::dateProtoFuncToLocaleDateString): Ditto. + (KJS::dateProtoFuncToLocaleTimeString): Ditto. + (KJS::dateProtoFuncToGMTString): Ditto. + + * kjs/ErrorPrototype.cpp: + (KJS::ErrorPrototype::ErrorPrototype): Ditto. + (KJS::errorProtoFuncToString): Ditto. + + * kjs/JSGlobalData.h: Added SmallStrings. + + * kjs/JSString.cpp: + (KJS::jsString): Eliminated the overload that takes a const char*. + Added code to use SmallStrings to get strings of small sizes rather + than creating a new JSString every time. + (KJS::jsSubstring): Added. Used when creating a string from a substring + to avoid creating a JSString in cases where the substring will end up + empty or as one character. + (KJS::jsOwnedString): Added the same code as in jsString. + + * kjs/JSString.h: Added new functions jsEmptyString, jsSingleCharacterString, + jsSingleCharacterSubstring, jsSubstring, and jsNontrivialString for various + cases where we want to create JSString, and want special handling for small + strings. + (KJS::JSString::JSString): Added an overload that takes a PassRefPtr of + a UString::Rep so you don't have to construct a UString; PassRefPtr can be + more efficient. + (KJS::jsEmptyString): Added. + (KJS::jsSingleCharacterString): Added. + (KJS::jsSingleCharacterSubstring): Added. + (KJS::jsNontrivialString): Added. + (KJS::JSString::getIndex): Adopted jsSingleCharacterSubstring. + (KJS::JSString::getStringPropertySlot): Ditto. + + * kjs/NumberPrototype.cpp: + (KJS::numberProtoFuncToFixed): Adopted jsNontrivialString. + (KJS::numberProtoFuncToExponential): Ditto. + (KJS::numberProtoFuncToPrecision): Ditto. + + * kjs/ObjectPrototype.cpp: + (KJS::objectProtoFuncToLocaleString): Adopted toThisJSString. + (KJS::objectProtoFuncToString): Adopted jsNontrivialString. + + * kjs/RegExpConstructor.cpp: Separated the lastInput value that's used + with the lastOvector to return matches from the input value that can be + changed via JavaScript. They will be equal in many cases, but not all. + (KJS::RegExpConstructor::performMatch): Set input. + (KJS::RegExpMatchesArray::RegExpMatchesArray): Ditto. + (KJS::RegExpMatchesArray::fillArrayInstance): Adopted jsSubstring. Also, + use input rather than lastInput in the appropriate place. + (KJS::RegExpConstructor::getBackref): Adopted jsSubstring and jsEmptyString. + Added code to handle the case where there is no backref -- before this + depended on range checking in UString::substr which is not present in + jsSubstring. + (KJS::RegExpConstructor::getLastParen): Ditto. + (KJS::RegExpConstructor::getLeftContext): Ditto. + (KJS::RegExpConstructor::getRightContext): Ditto. + (KJS::RegExpConstructor::getValueProperty): Use input rather than lastInput. + Also adopt jsEmptyString. + (KJS::RegExpConstructor::putValueProperty): Ditto. + (KJS::RegExpConstructor::input): Ditto. + + * kjs/RegExpPrototype.cpp: + (KJS::regExpProtoFuncToString): Adopt jsNonTrivialString. Also changed to + use UString::append to append single characters rather than using += and + a C-style string. + + * kjs/SmallStrings.cpp: Added. + (KJS::SmallStringsStorage::SmallStringsStorage): Construct the + buffer and UString::Rep for all 256 single-character strings for + the U+0000 through U+00FF. This covers all the values used in + the base64 test as well as most values seen elsewhere on the web + as well. It's possible that later we might fix this to only work + for U+0000 through U+007F but the others are used quite a bit in + the current version of the base64 test. + (KJS::SmallStringsStorage::~SmallStringsStorage): Free memory. + (KJS::SmallStrings::SmallStrings): Create a set of small strings, + initially not created; created later when they are used. + (KJS::SmallStrings::~SmallStrings): Deallocate. Not left compiler + generated because the SmallStringsStorage class's destructor needs + to be visible. + (KJS::SmallStrings::mark): Mark all the strings. + (KJS::SmallStrings::createEmptyString): Create a cell for the + empty string. Called only the first time. + (KJS::SmallStrings::createSingleCharacterString): Create a cell + for one of the single-character strings. Called only the first time. + * kjs/SmallStrings.h: Added. + + * kjs/StringConstructor.cpp: + (KJS::stringFromCharCodeSlowCase): Factored out of strinFromCharCode. + Only used for cases where the caller does not pass exactly one argument. + (KJS::stringFromCharCode): Adopted jsSingleCharacterString. + (KJS::callStringConstructor): Adopted jsEmptyString. + + * kjs/StringObject.cpp: + (KJS::StringObject::StringObject): Adopted jsEmptyString. + + * kjs/StringPrototype.cpp: + (KJS::stringProtoFuncReplace): Adopted jsSubstring. + (KJS::stringProtoFuncCharAt): Adopted jsEmptyString and + jsSingleCharacterSubstring and also added a special case when the + index is an immediate number to avoid conversion to and from floating + point, since that's the common case. + (KJS::stringProtoFuncCharCodeAt): Ditto. + (KJS::stringProtoFuncMatch): Adopted jsSubstring and jsEmptyString. + (KJS::stringProtoFuncSlice): Adopted jsSubstring and + jsSingleCharacterSubstring. Also got rid of some unneeded locals and + removed unneeded code to set the length property of the array, since it + is automatically updated as values are added to the array. + (KJS::stringProtoFuncSplit): Adopted jsEmptyString. + (KJS::stringProtoFuncSubstr): Adopted jsSubstring. + (KJS::stringProtoFuncSubstring): Ditto. + + * kjs/collector.cpp: + (KJS::Heap::collect): Added a call to mark SmallStrings. + + * kjs/ustring.cpp: + (KJS::UString::expandedSize): Made this a static member function since + it doesn't need to look at any data members. + (KJS::UString::expandCapacity): Use a non-inline function, makeNull, to + set the rep to null in failure cases. This avoids adding a PIC branch for + the normal case when there is no failure. + (KJS::UString::expandPreCapacity): Ditto. + (KJS::UString::UString): Ditto. + (KJS::concatenate): Refactored the concatenation constructor into this + separate function. Calling the concatenation constructor was leading to + an extra branch because of the in-charge vs. not-in-charge versions not + both being inlined, and this was showing up as nearly 1% on Shark. Also + added a special case for when the second string is a single character, + since it's a common idiom to build up a string that way and we can do + things much more quickly, without involving memcpy for example. Also + adopted the non-inline function, nullRep, for the same reason given for + makeNull above. + (KJS::UString::append): Adopted makeNull for failure cases. + (KJS::UString::operator=): Ditto. + (KJS::UString::toDouble): Added a special case for converting single + character strings to numbers. We're doing this a ton of times while + running the base64 test. + (KJS::operator==): Added special cases so we can compare single-character + strings without calling memcmp. Later we might want to special case other + short lengths similarly. + (KJS::UString::makeNull): Added. + (KJS::UString::nullRep): Added. + * kjs/ustring.h: Added declarations for the nullRep and makeNull. Changed + expandedSize to be a static member function. Added a declaration of the + concatenate function. Removed the concatenation constructor. Rewrote + operator+ to use the concatenate function. + +2008-08-29 Anders Carlsson <andersca@apple.com> + + Build fix. + + * VM/Machine.cpp: + (KJS::getCPUTime): + +2008-08-29 Anders Carlsson <andersca@apple.com> + + Reviewed by Darin Adler. + + <rdar://problem/6174667> + When a machine is under heavy load, the Slow Script dialog often comes up many times and just gets in the way + + Instead of using clock time, use the CPU time spent executing the current thread when + determining if the script has been running for too long. + + * VM/Machine.cpp: + (KJS::getCPUTime): + (KJS::Machine::checkTimeout): + +2008-08-28 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Rubber-stamped by Sam Weinig. + + Change 'term' to 'expr' in variable names to standardize terminology. + + * kjs/nodes.cpp: + (KJS::BinaryOpNode::emitCode): + (KJS::ReverseBinaryOpNode::emitCode): + (KJS::ThrowableBinaryOpNode::emitCode): + * kjs/nodes.h: + (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::ThrowableBinaryOpNode::): + (KJS::InstanceOfNode::): + (KJS::InNode::): + (KJS::EqualNode::): + (KJS::NotEqualNode::): + (KJS::StrictEqualNode::): + (KJS::NotStrictEqualNode::): + (KJS::BitAndNode::): + (KJS::BitOrNode::): + (KJS::BitXOrNode::): + * kjs/nodes2string.cpp: + (KJS::MultNode::streamTo): + (KJS::DivNode::streamTo): + (KJS::ModNode::streamTo): + (KJS::AddNode::streamTo): + (KJS::SubNode::streamTo): + (KJS::LeftShiftNode::streamTo): + (KJS::RightShiftNode::streamTo): + (KJS::UnsignedRightShiftNode::streamTo): + (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-08-28 Alp Toker <alp@nuanti.com> + + GTK+ dist/build fix. List newly added header files. + + * GNUmakefile.am: + +2008-08-28 Sam Weinig <sam@webkit.org> + + Reviewed by Oliver Hunt. + + Change to throw a ReferenceError at runtime instead of a ParseError + at parse time, when the left hand side expression of a for-in statement + is not an lvalue. + + * kjs/grammar.y: + * kjs/nodes.cpp: + (KJS::ForInNode::emitCode): + +2008-08-28 Alexey Proskuryakov <ap@webkit.org> + + Not reviewed, build fix (at least for OpenBSD, posssibly more). + + https://bugs.webkit.org/show_bug.cgi?id=20545 + missing #include <unistd.h> in JavaScriptCore/VM/SamplingTool.cpp + + * VM/SamplingTool.cpp: add the missing include. + +2008-08-26 Kevin McCullough <kmccullough@apple.com> + + Reviewed by Geoff and Cameron. + + <rdar://problem/6174603> Hitting assertion in Register::codeBlock when + loading facebook (20516). + + - This was a result of my line numbers change. After a host function is + called the stack does not get reset correctly. + - Oddly this also appears to be a slight speedup on SunSpider. + + * VM/Machine.cpp: + (KJS::Machine::privateExecute): + +2008-08-26 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Geoff and Tim. + + Export new API methods. + + * JavaScriptCore.exp: + +2008-08-25 Kevin McCullough <kmccullough@apple.com> + + Reviewed by Geoff, Tim and Mark. + + <rdar://problem/6150623> JSProfiler: It would be nice if the profiles + in the console said what file and line number they came from + - Lay the foundation for getting line numbers and other data from the + JavaScript engine. With the cleanup in kjs/ExecState this is actually + a slight performance improvement. + + * JavaScriptCore.exp: Export retrieveLastCaller() for WebCore. + * JavaScriptCore.xcodeproj/project.pbxproj: + * VM/Machine.cpp: Now Host and JS functions set a call frame on the + exec state, so this and the profiler code were pulled out of the + branches. + (KJS::Machine::privateExecute): + (KJS::Machine::retrieveLastCaller): This get's the lineNumber, sourceID + and sourceURL for the previously called function. + * VM/Machine.h: + * kjs/ExecState.cpp: Remove references to JSFunction since it's not used + anywhere. + * kjs/ExecState.h: + +2008-08-25 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Darin Adler. + + Ensure that JSGlobalContextRelease() performs garbage collection, even if there are other + contexts in the current context's group. + + This is only really necessary when the last reference is released, but there is no way to + determine that, and no harm in collecting slightly more often. + + * API/JSContextRef.cpp: (JSGlobalContextRelease): Explicitly collect the heap if it is not + being destroyed. + +2008-08-24 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Oliver Hunt. + + Bug 20093: JSC shell does not clear exceptions after it executes toString on an expression + <https://bugs.webkit.org/show_bug.cgi?id=20093> + + Clear exceptions after evaluating any code in the JSC shell. We do not + report exceptions that are caused by calling toString on the final + valued, but at least we avoid incorrect behaviour. + + Also, print any exceptions that occurred while evaluating code at the + interactive prompt, not just while evaluating code from a file. + + * kjs/Shell.cpp: + (runWithScripts): + (runInteractive): + +2008-08-24 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Oliver. + + Remove an unnecessary RefPtr to a RegisterID. + + * kjs/nodes.cpp: + (KJS::DeleteBracketNode::emitCode): + +2008-08-24 Mark Rowe <mrowe@apple.com> + + Reviewed by Oliver Hunt. + + Use the correct version number for when JSGlobalContextCreate was introduced. + + * API/JSContextRef.h: + +2008-08-23 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Rubber-stamped by Mark Rowe. + + Remove modelines. + + * API/APICast.h: + * API/JSBase.cpp: + * 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/JSContextRef.cpp: + * API/JSObjectRef.cpp: + * API/JSProfilerPrivate.cpp: + * API/JSStringRef.cpp: + * API/JSStringRefBSTR.cpp: + * API/JSStringRefCF.cpp: + * API/JSValueRef.cpp: + * API/tests/JSNode.c: + * API/tests/JSNode.h: + * API/tests/JSNodeList.c: + * API/tests/JSNodeList.h: + * API/tests/Node.c: + * API/tests/Node.h: + * API/tests/NodeList.c: + * API/tests/NodeList.h: + * API/tests/minidom.c: + * API/tests/minidom.js: + * API/tests/testapi.c: + * API/tests/testapi.js: + * JavaScriptCore.pro: + * kjs/FunctionConstructor.h: + * kjs/FunctionPrototype.h: + * kjs/JSArray.h: + * kjs/JSString.h: + * kjs/JSWrapperObject.cpp: + * kjs/NumberConstructor.h: + * kjs/NumberObject.h: + * kjs/NumberPrototype.h: + * kjs/lexer.h: + * kjs/lookup.h: + * wtf/Assertions.cpp: + * wtf/Assertions.h: + * wtf/HashCountedSet.h: + * wtf/HashFunctions.h: + * wtf/HashIterators.h: + * wtf/HashMap.h: + * wtf/HashSet.h: + * wtf/HashTable.h: + * wtf/HashTraits.h: + * wtf/ListHashSet.h: + * wtf/ListRefPtr.h: + * wtf/Noncopyable.h: + * wtf/OwnArrayPtr.h: + * wtf/OwnPtr.h: + * wtf/PassRefPtr.h: + * wtf/Platform.h: + * wtf/RefPtr.h: + * wtf/RefPtrHashMap.h: + * wtf/RetainPtr.h: + * wtf/UnusedParam.h: + * wtf/Vector.h: + * wtf/VectorTraits.h: + * wtf/unicode/Unicode.h: + * wtf/unicode/icu/UnicodeIcu.h: + +2008-08-22 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Oliver. + + Some cleanup to match our coding style. + + * VM/CodeGenerator.h: + * VM/Machine.cpp: + (KJS::Machine::privateExecute): + * kjs/ExecState.cpp: + * kjs/ExecState.h: + * kjs/completion.h: + * kjs/identifier.cpp: + (KJS::Identifier::equal): + (KJS::CStringTranslator::hash): + (KJS::CStringTranslator::equal): + (KJS::CStringTranslator::translate): + (KJS::UCharBufferTranslator::equal): + (KJS::UCharBufferTranslator::translate): + (KJS::Identifier::remove): + * kjs/operations.h: + +2008-08-20 Alexey Proskuryakov <ap@webkit.org> + + Windows build fix. + + * API/WebKitAvailability.h: Define DEPRECATED_ATTRIBUTE. + +2008-08-19 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Geoff Garen. + + Bring back shared JSGlobalData and implicit locking, because too many clients rely on it. + + * kjs/JSGlobalData.cpp: + (KJS::JSGlobalData::~JSGlobalData): + (KJS::JSGlobalData::JSGlobalData): Re-add shared instance. + (KJS::JSGlobalData::sharedInstanceExists): Ditto. + (KJS::JSGlobalData::sharedInstance): Ditto. + (KJS::JSGlobalData::sharedInstanceInternal): Ditto. + + * API/JSContextRef.h: Deprecated JSGlobalContextCreate(). Added a very conservative + description of its threading model (nothing is allowed). + + * API/JSContextRef.cpp: + (JSGlobalContextCreate): Use shared JSGlobalData. + (JSGlobalContextCreateInGroup): Support passing NULL group to request a unique one. + (JSGlobalContextRetain): Added back locking. + (JSGlobalContextRelease): Ditto. + (JSContextGetGlobalObject): Ditto. + + * API/tests/minidom.c: (main): + * API/tests/testapi.c: (main): + Switched to JSGlobalContextCreateInGroup() to avoid deprecation warnings. + + * JavaScriptCore.exp: Re-added JSLock methods. Added JSGlobalContextCreateInGroup (d'oh!). + + * 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/JSObjectRef.cpp: + (JSObjectMake): + (JSObjectMakeFunctionWithCallback): + (JSObjectMakeConstructor): + (JSObjectMakeFunction): + (JSObjectHasProperty): + (JSObjectGetProperty): + (JSObjectSetProperty): + (JSObjectGetPropertyAtIndex): + (JSObjectSetPropertyAtIndex): + (JSObjectDeleteProperty): + (JSObjectCallAsFunction): + (JSObjectCallAsConstructor): + (JSObjectCopyPropertyNames): + (JSPropertyNameArrayRelease): + (JSPropertyNameAccumulatorAddName): + * API/JSValueRef.cpp: + (JSValueIsEqual): + (JSValueIsInstanceOfConstructor): + (JSValueMakeNumber): + (JSValueMakeString): + (JSValueToNumber): + (JSValueToStringCopy): + (JSValueToObject): + (JSValueProtect): + (JSValueUnprotect): + * ForwardingHeaders/JavaScriptCore/JSLock.h: Added. + * GNUmakefile.am: + * JavaScriptCore.pri: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + * kjs/AllInOneFile.cpp: + * kjs/JSGlobalData.h: + * kjs/JSGlobalObject.cpp: + (KJS::JSGlobalObject::~JSGlobalObject): + (KJS::JSGlobalObject::init): + * kjs/JSLock.cpp: Added. + (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: Added. + (KJS::JSLock::JSLock): + (KJS::JSLock::~JSLock): + * 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): + Re-added implicit locking. + +2008-08-19 Kevin McCullough <kmccullough@apple.com> + + Reviewed by Tim and Mark. + + Implement DTrace hooks for dashcode and instruments. + + * API/JSProfilerPrivate.cpp: Added. Expose SPI so that profiling can be + turned on from a client. The DTrace probes were added within the + profiler mechanism for performance reasons so the profiler must be + started to enable tracing. + (JSStartProfiling): + (JSEndProfiling): + * API/JSProfilerPrivate.h: Added. Ditto. + * JavaScriptCore.exp: Exposing the start/stop methods to clients. + * JavaScriptCore.xcodeproj/project.pbxproj: + * kjs/Tracing.d: Define the DTrace probes. + * kjs/Tracing.h: Ditto. + * profiler/ProfileGenerator.cpp: Implement the DTrace probes in the + profiler. + (KJS::ProfileGenerator::willExecute): + (KJS::ProfileGenerator::didExecute): + +2008-08-19 Steve Falkenburg <sfalken@apple.com> + + Build fix. + + * kjs/operations.cpp: + (KJS::equal): + +2008-08-18 Timothy Hatcher <timothy@apple.com> + + Fix an assertion when generating a heavy profile because the + empty value and deleted value of CallIdentifier where equal. + + https://bugs.webkit.org/show_bug.cgi?id=20439 + + Reviewed by Dan Bernstein. + + * profiler/CallIdentifier.h: Make the emptyValue for CallIdentifier + use empty strings for URL and function name. + +2008-08-12 Darin Adler <darin@apple.com> + + Reviewed by Geoff. + + - eliminate JSValue::type() + + This will make it slightly easier to change the JSImmediate design without + having to touch so many call sites. + + SunSpider says this change is a wash (looked like a slight speedup, but not + statistically significant). + + * API/JSStringRef.cpp: Removed include of JSType.h. + * API/JSValueRef.cpp: Removed include of JSType.h. + (JSValueGetType): Replaced use of JSValue::type() with + JSValue::is functions. + + * JavaScriptCore.exp: Updated. + + * VM/JSPropertyNameIterator.cpp: Removed type() implementation. + (KJS::JSPropertyNameIterator::toPrimitive): Changed to take + PreferredPrimitiveType argument instead of JSType. + * VM/JSPropertyNameIterator.h: Ditto. + + * VM/Machine.cpp: + (KJS::fastIsNumber): Updated for name change. + (KJS::fastToInt32): Ditto. + (KJS::fastToUInt32): Ditto. + (KJS::jsAddSlowCase): Updated toPrimitive caller for change from + JSType to PreferredPrimitiveType. + (KJS::jsAdd): Replaced calls to JSValue::type() with calls to + JSValue::isString(). + (KJS::jsTypeStringForValue): Replaced calls to JSValue::type() + with multiple calls to JSValue::is -- we could make this a + virtual function instead if we want to have faster performance. + (KJS::Machine::privateExecute): Renamed JSImmediate::toTruncatedUInt32 + to JSImmediate::getTruncatedUInt32 for consistency with other functions. + Changed two calls of JSValue::type() to JSValue::isString(). + + * kjs/GetterSetter.cpp: + (KJS::GetterSetter::toPrimitive): Changed to take + PreferredPrimitiveType argument instead of JSType. + (KJS::GetterSetter::isGetterSetter): Added. + * kjs/GetterSetter.h: + + * kjs/JSCell.cpp: + (KJS::JSCell::isString): Added. + (KJS::JSCell::isGetterSetter): Added. + (KJS::JSCell::isObject): Added. + + * kjs/JSCell.h: Eliminated type function. Added isGetterSetter. + Made isString and isObject virtual. Changed toPrimitive to take + PreferredPrimitiveType argument instead of JSType. + (KJS::JSCell::isNumber): Use Heap::isNumber for faster performance. + (KJS::JSValue::isGetterSetter): Added. + (KJS::JSValue::toPrimitive): Changed to take + PreferredPrimitiveType argument instead of JSType. + + * kjs/JSImmediate.h: Removed JSValue::type() and replaced + JSValue::toTruncatedUInt32 with JSValue::getTruncatedUInt32. + (KJS::JSImmediate::isEitherImmediate): Added. + + * kjs/JSNotAnObject.cpp: + (KJS::JSNotAnObject::toPrimitive): Changed to take + PreferredPrimitiveType argument instead of JSType. + * kjs/JSNotAnObject.h: Ditto. + * kjs/JSNumberCell.cpp: + (KJS::JSNumberCell::toPrimitive): Ditto. + * kjs/JSNumberCell.h: + (KJS::JSNumberCell::toInt32): Renamed from fastToInt32. There's no + other "slow" version of this once you have a JSNumberCell, so there's + no need for "fast" in the name. It's a feature that this hides the + base class toInt32, which does the same job less efficiently (and has + an additional ExecState argument). + (KJS::JSNumberCell::toUInt32): Ditto. + + * kjs/JSObject.cpp: + (KJS::callDefaultValueFunction): Use isGetterSetter instead of type. + (KJS::JSObject::getPrimitiveNumber): Use PreferredPrimitiveType. + (KJS::JSObject::defaultValue): Ditto. + (KJS::JSObject::defineGetter): Use isGetterSetter. + (KJS::JSObject::defineSetter): Ditto. + (KJS::JSObject::lookupGetter): Ditto. + (KJS::JSObject::lookupSetter): Ditto. + (KJS::JSObject::toNumber): Use PreferredPrimitiveType. + (KJS::JSObject::toString): Ditto. + (KJS::JSObject::isObject): Added. + + * kjs/JSObject.h: + (KJS::JSObject::inherits): Call the isObject from JSCell; it's now + hidden by our override of isObject. + (KJS::JSObject::getOwnPropertySlotForWrite): Use isGetterSetter + instead of type. + (KJS::JSObject::getOwnPropertySlot): Ditto. + (KJS::JSObject::toPrimitive): Use PreferredPrimitiveType. + + * kjs/JSString.cpp: + (KJS::JSString::toPrimitive): Use PreferredPrimitiveType. + (KJS::JSString::isString): Added. + * kjs/JSString.h: Ditto. + + * kjs/JSValue.h: Removed type(), added isGetterSetter(). Added + PreferredPrimitiveType enum and used it as the argument for the + toPrimitive function. + (KJS::JSValue::getBoolean): Simplified a bit an removed a branch. + + * kjs/collector.cpp: + (KJS::typeName): Changed to use JSCell::is functions instead of + calling JSCell::type. + + * kjs/collector.h: + (KJS::Heap::isNumber): Renamed from fastIsNumber. + + * kjs/nodes.h: Added now-needed include of JSType, since the type + is used here to record types of values in the tree. + + * kjs/operations.cpp: + (KJS::equal): Rewrote to no longer depend on type(). + (KJS::strictEqual): Ditto. + +2008-08-18 Kevin McCullough <kmccullough@apple.com> + + Reviewed by Tim. + + If there are no nodes in a profile all the time should be attributed to + (idle) + + * profiler/Profile.cpp: If ther are no nodes make sure we still process + the head. + (KJS::Profile::forEach): + * profiler/ProfileGenerator.cpp: Remove some useless code. + (KJS::ProfileGenerator::stopProfiling): + +2008-08-18 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Maciej. + + Make JSGlobalContextRetain/Release actually work. + + * API/JSContextRef.cpp: + (JSGlobalContextRetain): + (JSGlobalContextRelease): + Ref/deref global data to give checking for globalData.refCount() some sense. + + * API/tests/testapi.c: (main): Added a test for this bug. + + * kjs/JSGlobalData.cpp: + (KJS::JSGlobalData::~JSGlobalData): + While checking for memory leaks, found that JSGlobalData::emptyList has changed to + a pointer, but it was not destructed, causing a huge leak in run-webkit-tests --threaded. + +2008-08-17 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Maciej. + + Change the counting of constants so that preincrement and predecrement of + const local variables are considered unexpected loads. + + * kjs/nodes.cpp: + (KJS::PrefixResolveNode::emitCode): + * kjs/nodes.h: + (KJS::ScopeNode::neededConstants): + +2008-08-17 Oliver Hunt <oliver@apple.com> + + Reviewed by Cameron Zwarich. + + <rdar://problem/6150322> In Gmail, a crash occurs at KJS::Machine::privateExecute() when applying list styling to text after a quote had been removed + <https://bugs.webkit.org/show_bug.cgi?id=20386> + + This crash was caused by "depth()" incorrectly determining the scope depth + of a 0 depth function without a full scope chain. Because such a function + would not have an activation the depth function would return the scope depth + of the parent frame, thus triggering an incorrect unwind. Any subsequent + look up that walked the scope chain would result in incorrect behaviour, + leading to a crash or incorrect variable resolution. This can only actually + happen in try...finally statements as that's the only path that can result in + the need to unwind the scope chain, but not force the function to need a + full scope chain. + + The fix is simply to check for this case before attempting to walk the scope chain. + + * VM/Machine.cpp: + (KJS::depth): + (KJS::Machine::throwException): + +2008-08-17 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Maciej. + + Bug 20419: Remove op_jless + <https://bugs.webkit.org/show_bug.cgi?id=20419> + + Remove op_jless, which is rarely used now that we have op_loop_if_less. + + * VM/CodeBlock.cpp: + (KJS::CodeBlock::dump): + * VM/CodeGenerator.cpp: + (KJS::CodeGenerator::emitJumpIfTrue): + * VM/Machine.cpp: + (KJS::Machine::privateExecute): + * VM/Opcode.h: + +2008-08-17 Cameron Zwarich <cwzwarich@uwaterloo.ca> + + Reviewed by Dan Bernstein. + + Fix a typo in r35807 that is also causing build failures for + non-AllInOne builds. + + * kjs/NumberConstructor.cpp: + +2008-08-17 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Cameron Zwarich. + + Made room for a free word in JSCell. + + SunSpider says no change. + + I changed JSCallbackObjectData, Arguments, JSArray, and RegExpObject to + store auxiliary data in a secondary structure. + + I changed InternalFunction to store the function's name in the property + map. + + I changed JSGlobalObjectData to use a virtual destructor, so WebCore's + JSDOMWindowBaseData could inherit from it safely. (It's a strange design + for JSDOMWindowBase to allocate an object that JSGlobalObject deletes, + but that's really our only option, given the size constraint.) + + I also added a bunch of compile-time ASSERTs, and removed lots of comments + in JSObject.h because they were often out of date, and they got in the + way of reading what was actually going on. + + Also renamed JSArray::getLength to JSArray::length, to match our style + guidelines. + +2008-08-16 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Oliver Hunt. + + Sped up property access for array.length and string.length by adding a + mechanism for returning a temporary value directly instead of returning + a pointer to a function that retrieves the value. + + Also removed some unused cruft from PropertySlot. + + SunSpider says 0.5% - 1.2% faster. + + NOTE: This optimization is not a good idea in general, because it's + actually a pessimization in the case of resolve for assignment, + and it may get in the way of other optimizations in the future. + +2008-08-16 Dan Bernstein <mitz@apple.com> + + Reviewed by Geoffrey Garen. + + Disable dead code stripping in debug builds. + + * Configurations/Base.xcconfig: + * JavaScriptCore.xcodeproj/project.pbxproj: + +2008-08-15 Mark Rowe <mrowe@apple.com> + + Reviewed by Oliver Hunt. + + <rdar://problem/6143072> FastMallocZone's enumeration code makes assumptions about handling of remote memory regions that overlap + + * wtf/FastMalloc.cpp: + (WTF::TCMalloc_Central_FreeList::enumerateFreeObjects): Don't directly compare pointers mapped into the local process with + a pointer that has not been mapped. Instead, calculate a local address for the pointer and compare with that. + (WTF::TCMallocStats::FreeObjectFinder::findFreeObjects): Pass in the remote address of the central free list so that it can + be used when calculating local addresses. + (WTF::TCMallocStats::FastMallocZone::enumerate): Ditto. + +2008-08-15 Mark Rowe <mrowe@apple.com> + + Rubber-stamped by Geoff Garen. + + <rdar://problem/6139914> Please include a _debug version of JavaScriptCore framework + + * Configurations/Base.xcconfig: Factor out the debug-only settings so that they can shared + between the Debug configuration and debug Production variant. + * JavaScriptCore.xcodeproj/project.pbxproj: Enable the debug variant. + +2008-08-15 Mark Rowe <mrowe@apple.com> + + Fix the 64-bit build. + + Add extra cast to avoid warnings about loss of precision when casting from + JSValue* to an integer type. + + * kjs/JSImmediate.h: + (KJS::JSImmediate::intValue): + (KJS::JSImmediate::uintValue): + +2008-08-15 Alexey Proskuryakov <ap@webkit.org> + + Still fixing Windows build. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.make: Added OpaqueJSString + to yet another place. + +2008-08-15 Alexey Proskuryakov <ap@webkit.org> + + Trying to fix non-Apple builds. + + * ForwardingHeaders/JavaScriptCore/OpaqueJSString.h: Added. + +2008-08-15 Gavin Barraclough <barraclough@apple.com> + + Reviewed by Geoff Garen. + + Allow JSImmediate to hold 31 bit signed integer immediate values. The low two bits of a + JSValue* are a tag, with the tag value 00 indicating the JSValue* is a pointer to a + JSCell. Non-zero tag values used to indicate that the JSValue* is not a real pointer, + but instead holds an immediate value encoded within the pointer. This patch changes the + encoding so both the tag values 01 and 11 indicate the value is a signed integer, allowing + a 31 bit value to be stored. All other immediates are tagged with the value 10, and + distinguished by a secondary tag. + + Roughly +2% on SunSpider. + + * kjs/JSImmediate.h: Encoding of JSImmediates has changed - see comment at head of file for + descption of new layout. + +2008-08-15 Alexey Proskuryakov <ap@webkit.org> + + More build fixes. + + * API/OpaqueJSString.h: Add a namespace to friend declaration to appease MSVC. + * API/JSStringRefCF.h: (JSStringCreateWithCFString) Cast UniChar* to UChar* explicitly. + * JavaScriptCore.exp: Added OpaqueJSString::create(const KJS::UString&) to fix WebCore build. + +2008-08-15 Alexey Proskuryakov <ap@webkit.org> + + Build fix. + + * JavaScriptCore.xcodeproj/project.pbxproj: Marked OpaqueJSString as private + + * kjs/identifier.cpp: + (KJS::Identifier::checkSameIdentifierTable): + * kjs/identifier.h: + (KJS::Identifier::add): + Since checkSameIdentifierTable is exported for debug build's sake, gcc wants it to be + non-inline in release builds, too. + + * JavaScriptCore.exp: Don't export inline OpaqueJSString destructor. + +2008-08-15 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Geoff Garen. + + JSStringRef is created context-free, but can get linked to one via an identifier table, + breaking an implicit API contract. + + Made JSStringRef point to OpaqueJSString, which is a new string object separate from UString. + + * API/APICast.h: Removed toRef/toJS conversions for JSStringRef, as this is no longer a + simple typecast. + + * kjs/identifier.cpp: + (KJS::Identifier::checkSameIdentifierTable): + * kjs/identifier.h: + (KJS::Identifier::add): + (KJS::UString::checkSameIdentifierTable): + Added assertions to verify that an identifier is not being added to a different JSGlobalData. + + * API/JSObjectRef.cpp: + (OpaqueJSPropertyNameArray::OpaqueJSPropertyNameArray): Changed OpaqueJSPropertyNameArray to + hold JSStringRefs. This is necessary to avoid having to construct (and leak) a new instance + in JSPropertyNameArrayGetNameAtIndex(), now that making a JSStringRef is not just a typecast. + + * API/OpaqueJSString.cpp: Added. + (OpaqueJSString::create): + (OpaqueJSString::ustring): + (OpaqueJSString::identifier): + * API/OpaqueJSString.h: Added. + (OpaqueJSString::create): + (OpaqueJSString::characters): + (OpaqueJSString::length): + (OpaqueJSString::OpaqueJSString): + (OpaqueJSString::~OpaqueJSString): + + * API/JSBase.cpp: + (JSEvaluateScript): + (JSCheckScriptSyntax): + * API/JSCallbackObjectFunctions.h: + (KJS::::getOwnPropertySlot): + (KJS::::put): + (KJS::::deleteProperty): + (KJS::::staticValueGetter): + (KJS::::callbackGetter): + * API/JSStringRef.cpp: + (JSStringCreateWithCharacters): + (JSStringCreateWithUTF8CString): + (JSStringRetain): + (JSStringRelease): + (JSStringGetLength): + (JSStringGetCharactersPtr): + (JSStringGetMaximumUTF8CStringSize): + (JSStringGetUTF8CString): + (JSStringIsEqual): + * API/JSStringRefCF.cpp: + (JSStringCreateWithCFString): + (JSStringCopyCFString): + * API/JSValueRef.cpp: + (JSValueMakeString): + (JSValueToStringCopy): + Updated to use OpaqueJSString. + + * GNUmakefile.am: + * JavaScriptCore.exp: + * JavaScriptCore.pri: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * JavaScriptCoreSources.bkl: + Added OpaqueJSString. + +2008-08-14 Kevin McCullough <kmccullough@apple.com> + + Reviewed by Tim. + + <rdar://problem/6115819> Notify of profile in console + - Profiles now have a unique ID so that they can be linked to the + console message that announces that a profile completed. + + * profiler/HeavyProfile.cpp: + (KJS::HeavyProfile::HeavyProfile): + * profiler/Profile.cpp: + (KJS::Profile::create): + (KJS::Profile::Profile): + * profiler/Profile.h: + (KJS::Profile::uid): + * profiler/ProfileGenerator.cpp: + (KJS::ProfileGenerator::create): + (KJS::ProfileGenerator::ProfileGenerator): + * profiler/ProfileGenerator.h: + * profiler/Profiler.cpp: + (KJS::Profiler::startProfiling): + * profiler/TreeProfile.cpp: + (KJS::TreeProfile::create): + (KJS::TreeProfile::TreeProfile): + * profiler/TreeProfile.h: + +2008-08-13 Geoffrey Garen <ggaren@apple.com> + + Reviewed by Oliver Hunt. + + Nixed a PIC branch from JSObject::getOwnPropertySlot, by forcing + fillGetterProperty, which references a global function pointer, + out-of-line. + + .2% SunSpider speedup, 4.3% access-nbody speedup, 8.7% speedup on a + custom property access benchmark for objects with one property. + + * kjs/JSObject.cpp: + (KJS::JSObject::fillGetterPropertySlot): + +2008-08-13 Alp Toker <alp@nuanti.com> + + Reviewed by Eric Seidel. + + https://bugs.webkit.org/show_bug.cgi?id=20349 + WTF::initializeThreading() fails if threading is already initialized + + Fix threading initialization logic to support cases where + g_thread_init() has already been called elsewhere. + + Resolves database-related crashers reported in several applications. + + * wtf/ThreadingGtk.cpp: + (WTF::initializeThreading): + +2008-08-13 Brad Hughes <bhughes@trolltech.com> + + Reviewed by Simon. + + Fix compiling of QtWebKit in release mode with the Intel C++ Compiler for Linux + + The latest upgrade of the intel compiler allows us to compile all of + Qt with optimizations enabled (yay!). + + * JavaScriptCore.pro: + +2008-08-12 Oliver Hunt <oliver@apple.com> + + Reviewed by Geoff Garen. + + Add peephole optimisation to 'op_not... jfalse...' (eg. if(!...) ) + + This is a very slight win in sunspider, and a fairly substantial win + in hot code that does if(!...), etc. + + * VM/CodeGenerator.cpp: + (KJS::CodeGenerator::retrieveLastUnaryOp): + (KJS::CodeGenerator::rewindBinaryOp): + (KJS::CodeGenerator::rewindUnaryOp): + (KJS::CodeGenerator::emitJumpIfFalse): + * VM/CodeGenerator.h: + +2008-08-12 Dan Bernstein <mitz@apple.com> + + - JavaScriptCore part of <rdar://problem/6121636> + Make fast*alloc() abort() on failure and add "try" variants that + return NULL on failure. + + Reviewed by Darin Adler. + + * JavaScriptCore.exp: Exported tryFastCalloc(). + * VM/RegisterFile.h: + (KJS::RegisterFile::RegisterFile): Removed an ASSERT(). + * kjs/JSArray.cpp: + (KJS::JSArray::putSlowCase): Changed to use tryFastRealloc(). + (KJS::JSArray::increaseVectorLength): Ditto. + * kjs/ustring.cpp: + (KJS::allocChars): Changed to use tryFastMalloc(). + (KJS::reallocChars): Changed to use tryFastRealloc(). + * wtf/FastMalloc.cpp: + (WTF::fastZeroedMalloc): Removed null checking of fastMalloc()'s result + and removed extra call to InvokeNewHook(). + (WTF::tryFastZeroedMalloc): Added. Uses tryFastMalloc(). + (WTF::tryFastMalloc): Renamed fastMalloc() to this. + (WTF::fastMalloc): Added. This version abort()s if allocation fails. + (WTF::tryFastCalloc): Renamed fastCalloc() to this. + (WTF::fastCalloc): Added. This version abort()s if allocation fails. + (WTF::tryFastRealloc): Renamed fastRealloc() to this. + (WTF::fastRealloc): Added. This version abort()s if allocation fails. + (WTF::do_malloc): Made this a function template. When the abortOnFailure + template parameter is set, the function abort()s on failure to allocate. + Otherwise, it sets errno to ENOMEM and returns zero. + (WTF::TCMallocStats::fastMalloc): Defined to abort() on failure. + (WTF::TCMallocStats::tryFastMalloc): Added. Does not abort() on + failure. + (WTF::TCMallocStats::fastCalloc): Defined to abort() on failure. + (WTF::TCMallocStats::tryFastCalloc): Added. Does not abort() on + failure. + (WTF::TCMallocStats::fastRealloc): Defined to abort() on failure. + (WTF::TCMallocStats::tryFastRealloc): Added. Does not abort() on + failure. + * wtf/FastMalloc.h: Declared the "try" variants. + +2008-08-11 Adam Roben <aroben@apple.com> + + Move WTF::notFound into its own header so that it can be used + independently of Vector + + Rubberstamped by Darin Adler. + + * JavaScriptCore.vcproj/WTF/WTF.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + Added NotFound.h to the project. + * wtf/NotFound.h: Added. Moved the notFound constant here... + * wtf/Vector.h: ...from here. + +2008-08-11 Alexey Proskuryakov <ap@webkit.org> + + Reviewed by Mark Rowe. + + <rdar://problem/6130393> REGRESSION: PhotoBooth hangs after launching under TOT Webkit + + * API/JSContextRef.cpp: (JSGlobalContextRelease): Corrected a comment. + + * kjs/collector.cpp: (KJS::Heap::~Heap): Ensure that JSGlobalData is not deleted while + sweeping the heap. + +== Rolled over to ChangeLog-2008-08-10 == diff --git a/JavaScriptCore/Configurations/FeatureDefines.xcconfig b/JavaScriptCore/Configurations/FeatureDefines.xcconfig index 95fb0c6..10328e8 100644 --- a/JavaScriptCore/Configurations/FeatureDefines.xcconfig +++ b/JavaScriptCore/Configurations/FeatureDefines.xcconfig @@ -1,4 +1,5 @@ // Copyright (C) 2009 Apple Inc. All rights reserved. +// Copyright (C) 2009 Google Inc. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions @@ -27,15 +28,21 @@ // Set any ENABLE_FEATURE_NAME macro to an empty string to disable that feature. -ENABLE_3D_RENDERING = ; -ENABLE_CHANNEL_MESSAGING = ; +ENABLE_3D_RENDERING = $(ENABLE_3D_RENDERING_$(MAC_OS_X_VERSION_MAJOR)); +ENABLE_3D_RENDERING_1050 = ENABLE_3D_RENDERING; +ENABLE_3D_RENDERING_1060 = ENABLE_3D_RENDERING; + +ENABLE_CHANNEL_MESSAGING = ENABLE_CHANNEL_MESSAGING; ENABLE_DATABASE = ENABLE_DATABASE; +ENABLE_DATAGRID = ENABLE_DATAGRID; ENABLE_DOM_STORAGE = ENABLE_DOM_STORAGE; ENABLE_FILTERS = ; ENABLE_GEOLOCATION = ; ENABLE_ICONDATABASE = ENABLE_ICONDATABASE; ENABLE_JAVASCRIPT_DEBUGGER = ENABLE_JAVASCRIPT_DEBUGGER; ENABLE_OFFLINE_WEB_APPLICATIONS = ENABLE_OFFLINE_WEB_APPLICATIONS; +ENABLE_RUBY = ENABLE_RUBY; +ENABLE_SHARED_WORKERS = ; ENABLE_SVG = ENABLE_SVG; ENABLE_SVG_ANIMATION = ENABLE_SVG_ANIMATION; ENABLE_SVG_AS_IMAGE = ENABLE_SVG_AS_IMAGE; @@ -44,9 +51,10 @@ ENABLE_SVG_FONTS = ENABLE_SVG_FONTS; ENABLE_SVG_FOREIGN_OBJECT = ENABLE_SVG_FOREIGN_OBJECT; ENABLE_SVG_USE = ENABLE_SVG_USE; ENABLE_VIDEO = ENABLE_VIDEO; +ENABLE_WEB_SOCKETS = ENABLE_WEB_SOCKETS; ENABLE_WML = ; ENABLE_WORKERS = ENABLE_WORKERS; ENABLE_XPATH = ENABLE_XPATH; ENABLE_XSLT = ENABLE_XSLT; -FEATURE_DEFINES = $(ENABLE_3D_RENDERING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_DATABASE) $(ENABLE_DOM_STORAGE) $(ENABLE_FILTERS) $(ENABLE_GEOLOCATION) $(ENABLE_ICONDATABASE) $(ENABLE_JAVASCRIPT_DEBUGGER) $(ENABLE_OFFLINE_WEB_APPLICATIONS) $(ENABLE_SVG) $(ENABLE_SVG_ANIMATION) $(ENABLE_SVG_AS_IMAGE) $(ENABLE_SVG_DOM_OBJC_BINDINGS) $(ENABLE_SVG_FONTS) $(ENABLE_SVG_FOREIGN_OBJECT) $(ENABLE_SVG_USE) $(ENABLE_VIDEO) $(ENABLE_WML) $(ENABLE_WORKERS) $(ENABLE_XPATH) $(ENABLE_XSLT); +FEATURE_DEFINES = $(ENABLE_3D_RENDERING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_DATABASE) $(ENABLE_DATAGRID) $(ENABLE_DOM_STORAGE) $(ENABLE_FILTERS) $(ENABLE_GEOLOCATION) $(ENABLE_ICONDATABASE) $(ENABLE_JAVASCRIPT_DEBUGGER) $(ENABLE_OFFLINE_WEB_APPLICATIONS) $(ENABLE_RUBY) $(ENABLE_SHARED_WORKERS) $(ENABLE_SVG) $(ENABLE_SVG_ANIMATION) $(ENABLE_SVG_AS_IMAGE) $(ENABLE_SVG_DOM_OBJC_BINDINGS) $(ENABLE_SVG_FONTS) $(ENABLE_SVG_FOREIGN_OBJECT) $(ENABLE_SVG_USE) $(ENABLE_VIDEO) $(ENABLE_WEB_SOCKETS) $(ENABLE_WML) $(ENABLE_WORKERS) $(ENABLE_XPATH) $(ENABLE_XSLT); diff --git a/JavaScriptCore/Configurations/Version.xcconfig b/JavaScriptCore/Configurations/Version.xcconfig index cc515f2..d07d57f 100644 --- a/JavaScriptCore/Configurations/Version.xcconfig +++ b/JavaScriptCore/Configurations/Version.xcconfig @@ -21,7 +21,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -MAJOR_VERSION = 531; +MAJOR_VERSION = 532; MINOR_VERSION = 0; TINY_VERSION = 0; FULL_VERSION = $(MAJOR_VERSION).$(MINOR_VERSION); diff --git a/JavaScriptCore/DerivedSources.make b/JavaScriptCore/DerivedSources.make index 4b33682..9eaccab 100644 --- a/JavaScriptCore/DerivedSources.make +++ b/JavaScriptCore/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/JavaScriptCore/GNUmakefile.am b/JavaScriptCore/GNUmakefile.am index e51a23f..6b4dc6d 100644 --- a/JavaScriptCore/GNUmakefile.am +++ b/JavaScriptCore/GNUmakefile.am @@ -35,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 \ @@ -107,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 \ @@ -138,11 +138,14 @@ javascriptcore_sources += \ JavaScriptCore/assembler/X86Assembler.h \ JavaScriptCore/assembler/AbstractMacroAssembler.h \ JavaScriptCore/assembler/AssemblerBuffer.h \ + JavaScriptCore/assembler/CodeLocation.h \ + JavaScriptCore/assembler/LinkBuffer.h \ JavaScriptCore/assembler/MacroAssembler.h \ JavaScriptCore/assembler/MacroAssemblerCodeRef.h \ JavaScriptCore/assembler/MacroAssemblerX86.h \ JavaScriptCore/assembler/MacroAssemblerX86_64.h \ JavaScriptCore/assembler/MacroAssemblerX86Common.h \ + JavaScriptCore/assembler/RepatchBuffer.h \ JavaScriptCore/os-win32/stdbool.h \ JavaScriptCore/os-win32/stdint.h \ JavaScriptCore/pcre/pcre.h \ @@ -182,10 +185,15 @@ 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/MarkStack.cpp \ + JavaScriptCore/runtime/MarkStack.h \ + JavaScriptCore/runtime/MarkStackPosix.cpp \ JavaScriptCore/runtime/SmallStrings.cpp \ JavaScriptCore/runtime/SmallStrings.h \ JavaScriptCore/runtime/Structure.cpp \ @@ -254,6 +262,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 \ @@ -399,6 +408,8 @@ javascriptcore_sources += \ JavaScriptCore/runtime/Completion.cpp \ JavaScriptCore/runtime/JSArray.cpp \ JavaScriptCore/runtime/JSArray.h \ + JavaScriptCore/runtime/JSAPIValueWrapper.cpp \ + JavaScriptCore/runtime/JSAPIValueWrapper.h \ JavaScriptCore/runtime/JSCell.cpp \ JavaScriptCore/runtime/JSCell.h \ JavaScriptCore/runtime/JSFunction.cpp \ @@ -428,6 +439,9 @@ javascriptcore_sources += \ JavaScriptCore/runtime/JSWrapperObject.h \ JavaScriptCore/runtime/Lookup.cpp \ JavaScriptCore/runtime/Lookup.h \ + JavaScriptCore/runtime/MarkStack.cpp \ + JavaScriptCore/runtime/MarkStack.h \ + JavaScriptCore/runtime/MarkStackWin.cpp \ JavaScriptCore/runtime/MathObject.cpp \ JavaScriptCore/runtime/MathObject.h \ JavaScriptCore/runtime/NativeErrorConstructor.cpp \ @@ -590,6 +604,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/JavaScriptCore.exp b/JavaScriptCore/JavaScriptCore.exp index 82786b0..3a2acd7 100644 --- a/JavaScriptCore/JavaScriptCore.exp +++ b/JavaScriptCore/JavaScriptCore.exp @@ -102,11 +102,6 @@ __ZN3JSC10throwErrorEPNS_9ExecStateENS_9ErrorTypeEPKc __ZN3JSC10throwErrorEPNS_9ExecStateENS_9ErrorTypeERKNS_7UStringE __ZN3JSC11JSByteArray15createStructureENS_7JSValueE __ZN3JSC11JSByteArrayC1EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEPNS3_9ByteArrayEPKNS_9ClassInfoE -__ZN3JSC11JSImmediate12nonInlineNaNEv -__ZN3JSC11JSImmediate12toThisObjectENS_7JSValueEPNS_9ExecStateE -__ZN3JSC11JSImmediate8toObjectENS_7JSValueEPNS_9ExecStateE -__ZN3JSC11JSImmediate8toStringENS_7JSValueE -__ZN3JSC11JSImmediate9prototypeENS_7JSValueEPNS_9ExecStateE __ZN3JSC11ParserArena5resetEv __ZN3JSC11checkSyntaxEPNS_9ExecStateERKNS_10SourceCodeE __ZN3JSC12DateInstance4infoE @@ -127,6 +122,7 @@ __ZN3JSC12StringObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15Pu __ZN3JSC12StringObject4infoE __ZN3JSC12StringObjectC2EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEERKNS_7UStringE __ZN3JSC12jsNumberCellEPNS_9ExecStateEd +__ZN3JSC12nonInlineNaNEv __ZN3JSC13SamplingFlags4stopEv __ZN3JSC13SamplingFlags5startEv __ZN3JSC13SamplingFlags7s_flagsE @@ -135,17 +131,17 @@ __ZN3JSC13jsOwnedStringEPNS_12JSGlobalDataERKNS_7UStringE __ZN3JSC14JSGlobalObject10globalExecEv __ZN3JSC14JSGlobalObject12defineGetterEPNS_9ExecStateERKNS_10IdentifierEPNS_8JSObjectE __ZN3JSC14JSGlobalObject12defineSetterEPNS_9ExecStateERKNS_10IdentifierEPNS_8JSObjectE +__ZN3JSC14JSGlobalObject12markChildrenERNS_9MarkStackE __ZN3JSC14JSGlobalObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueEj __ZN3JSC14JSGlobalObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE __ZN3JSC14JSGlobalObject4initEPNS_8JSObjectE -__ZN3JSC14JSGlobalObject4markEv __ZN3JSC14JSGlobalObjectD2Ev __ZN3JSC14JSGlobalObjectnwEmPNS_12JSGlobalDataE __ZN3JSC14SamplingThread4stopEv __ZN3JSC14SamplingThread5startEj __ZN3JSC14TimeoutChecker5resetEv __ZN3JSC14constructArrayEPNS_9ExecStateERKNS_7ArgListE -__ZN3JSC15JSWrapperObject4markEv +__ZN3JSC15JSWrapperObject12markChildrenERNS_9MarkStackE __ZN3JSC15toInt32SlowCaseEdRb __ZN3JSC16FunctionBodyNode13finishParsingEPNS_10IdentifierEm __ZN3JSC16FunctionBodyNode14copyParametersEv @@ -162,7 +158,6 @@ __ZN3JSC17PrototypeFunctionC1EPNS_9ExecStateEN3WTF10PassRefPtrINS_9StructureEEEi __ZN3JSC17PrototypeFunctionC1EPNS_9ExecStateEiRKNS_10IdentifierEPFNS_7JSValueES2_PNS_8JSObjectES6_RKNS_7ArgListEE __ZN3JSC17constructFunctionEPNS_9ExecStateERKNS_7ArgListERKNS_10IdentifierERKNS_7UStringEi __ZN3JSC18DebuggerActivationC1EPNS_8JSObjectE -__ZN3JSC18jsAPIMangledNumberEPNS_9ExecStateEd __ZN3JSC19constructEmptyArrayEPNS_9ExecStateE __ZN3JSC19initializeThreadingEv __ZN3JSC20MarkedArgumentBuffer10slowAppendENS_7JSValueE @@ -172,7 +167,6 @@ __ZN3JSC23objectProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_ __ZN3JSC23setUpStaticFunctionSlotEPNS_9ExecStateEPKNS_9HashEntryEPNS_8JSObjectERKNS_10IdentifierERNS_12PropertySlotE __ZN3JSC25evaluateInGlobalCallFrameERKNS_7UStringERNS_7JSValueEPNS_14JSGlobalObjectE __ZN3JSC4Heap11objectCountEv -__ZN3JSC4Heap14allocateNumberEm __ZN3JSC4Heap14primaryHeapEndEv __ZN3JSC4Heap15recordExtraCostEm __ZN3JSC4Heap16primaryHeapBeginEv @@ -203,10 +197,10 @@ __ZN3JSC6JSCell3putEPNS_9ExecStateEjNS_7JSValueE __ZN3JSC6JSCell9getObjectEv __ZN3JSC6JSCellnwEmPNS_9ExecStateE __ZN3JSC6JSLock12DropAllLocksC1EPNS_9ExecStateE -__ZN3JSC6JSLock12DropAllLocksC1Eb +__ZN3JSC6JSLock12DropAllLocksC1ENS_14JSLockBehaviorE __ZN3JSC6JSLock12DropAllLocksD1Ev -__ZN3JSC6JSLock4lockEb -__ZN3JSC6JSLock6unlockEb +__ZN3JSC6JSLock4lockENS_14JSLockBehaviorE +__ZN3JSC6JSLock6unlockENS_14JSLockBehaviorE __ZN3JSC6JSLock9lockCountEv __ZN3JSC6JSLockC1EPNS_9ExecStateE __ZN3JSC6Parser5parseEPNS_12JSGlobalDataEPiPNS_7UStringE @@ -217,14 +211,17 @@ __ZN3JSC7Profile10restoreAllEv __ZN3JSC7Profile5focusEPKNS_11ProfileNodeE __ZN3JSC7Profile7excludeEPKNS_11ProfileNodeE __ZN3JSC7Profile7forEachEMNS_11ProfileNodeEFvvE -__ZN3JSC7UString10BaseString12sharedBufferEv __ZN3JSC7UString3Rep11computeHashEPKci __ZN3JSC7UString3Rep11computeHashEPKti +__ZN3JSC7UString3Rep12sharedBufferEv +__ZN3JSC7UString3Rep14createFromUTF8EPKc __ZN3JSC7UString3Rep14nullBaseStringE __ZN3JSC7UString3Rep6createEPtiN3WTF10PassRefPtrINS3_21CrossThreadRefCountedINS3_16OwnFastMallocPtrItEEEEEE __ZN3JSC7UString3Rep7destroyEv +__ZN3JSC7UString4fromEd __ZN3JSC7UString4fromEi __ZN3JSC7UString4fromEj +__ZN3JSC7UString4fromEl __ZN3JSC7UString6appendEPKc __ZN3JSC7UString6appendERKS0_ __ZN3JSC7UStringC1EPKc @@ -239,6 +236,7 @@ __ZN3JSC8JSObject12defineGetterEPNS_9ExecStateERKNS_10IdentifierEPS0_ __ZN3JSC8JSObject12defineSetterEPNS_9ExecStateERKNS_10IdentifierEPS0_ __ZN3JSC8JSObject12lookupGetterEPNS_9ExecStateERKNS_10IdentifierE __ZN3JSC8JSObject12lookupSetterEPNS_9ExecStateERKNS_10IdentifierE +__ZN3JSC8JSObject12markChildrenERNS_9MarkStackE __ZN3JSC8JSObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE __ZN3JSC8JSObject14deletePropertyEPNS_9ExecStateEj __ZN3JSC8JSObject15unwrappedObjectEv @@ -254,7 +252,6 @@ __ZN3JSC8JSObject22fillGetterPropertySlotERNS_12PropertySlotEPNS_7JSValueE __ZN3JSC8JSObject23allocatePropertyStorageEmm __ZN3JSC8JSObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE __ZN3JSC8JSObject3putEPNS_9ExecStateEjNS_7JSValueE -__ZN3JSC8JSObject4markEv __ZN3JSC8Profiler13stopProfilingEPNS_9ExecStateERKNS_7UStringE __ZN3JSC8Profiler14startProfilingEPNS_9ExecStateERKNS_7UStringE __ZN3JSC8Profiler8profilerEv @@ -262,6 +259,10 @@ __ZN3JSC8evaluateEPNS_9ExecStateERNS_10ScopeChainERKNS_10SourceCodeENS_7JSValueE __ZN3JSC8jsStringEPNS_12JSGlobalDataERKNS_7UStringE __ZN3JSC9CodeBlockD1Ev __ZN3JSC9CodeBlockD2Ev +__ZN3JSC9MarkStack10s_pageSizeE +__ZN3JSC9MarkStack12releaseStackEPvm +__ZN3JSC9MarkStack13allocateStackEm +__ZN3JSC9MarkStack18initializePagesizeEv __ZN3JSC9Structure17stopIgnoringLeaksEv __ZN3JSC9Structure18startIgnoringLeaksEv __ZN3JSC9Structure21addPropertyTransitionEPS0_RKNS_10IdentifierEjPNS_6JSCellERm @@ -288,7 +289,6 @@ __ZN3WTF12detachThreadEj __ZN3WTF12isMainThreadEv __ZN3WTF12randomNumberEv __ZN3WTF13currentThreadEv -__ZN3WTF37parseDateFromNullTerminatedCharactersEPKc __ZN3WTF13tryFastCallocEmm __ZN3WTF15ThreadCondition4waitERNS_5MutexE __ZN3WTF15ThreadCondition6signalEv @@ -310,6 +310,7 @@ __ZN3WTF23waitForThreadCompletionEjPPv __ZN3WTF27releaseFastMallocFreeMemoryEv __ZN3WTF28setMainThreadCallbacksPausedEb __ZN3WTF36lockAtomicallyInitializedStaticMutexEv +__ZN3WTF37parseDateFromNullTerminatedCharactersEPKc __ZN3WTF38unlockAtomicallyInitializedStaticMutexEv __ZN3WTF5Mutex4lockEv __ZN3WTF5Mutex6unlockEv @@ -329,6 +330,8 @@ __ZNK3JSC12DateInstance7getTimeERdRi __ZNK3JSC12StringObject12toThisStringEPNS_9ExecStateE __ZNK3JSC12StringObject8toStringEPNS_9ExecStateE __ZNK3JSC14JSGlobalObject14isDynamicScopeEv + +__ZNK3JSC16FunctionBodyNode14isHostFunctionEv __ZNK3JSC16InternalFunction9classInfoEv __ZNK3JSC16JSVariableObject16isVariableObjectEv __ZNK3JSC16JSVariableObject21getPropertyAttributesEPNS_9ExecStateERKNS_10IdentifierERj @@ -341,13 +344,14 @@ __ZNK3JSC4Heap10statisticsEv __ZNK3JSC6JSCell12toThisObjectEPNS_9ExecStateE __ZNK3JSC6JSCell12toThisStringEPNS_9ExecStateE __ZNK3JSC6JSCell14isGetterSetterEv -__ZNK3JSC6JSCell17getTruncatedInt32ERi -__ZNK3JSC6JSCell18getTruncatedUInt32ERj __ZNK3JSC6JSCell9classInfoEv __ZNK3JSC6JSCell9getStringERNS_7UStringE __ZNK3JSC6JSCell9getStringEv __ZNK3JSC6JSCell9getUInt32ERj __ZNK3JSC7ArgList8getSliceEiRS0_ +__ZNK3JSC7JSValue16toObjectSlowCaseEPNS_9ExecStateE +__ZNK3JSC7JSValue19synthesizePrototypeEPNS_9ExecStateE +__ZNK3JSC7JSValue20toThisObjectSlowCaseEPNS_9ExecStateE __ZNK3JSC7JSValue9toIntegerEPNS_9ExecStateE __ZNK3JSC7UString10UTF8StringEb __ZNK3JSC7UString14toStrictUInt32EPb @@ -374,6 +378,7 @@ __ZTVN3JSC14JSGlobalObjectE __ZTVN3JSC15JSWrapperObjectE __ZTVN3JSC16InternalFunctionE __ZTVN3JSC16JSVariableObjectE +__ZTVN3JSC17JSAPIValueWrapperE __ZTVN3JSC8JSObjectE __ZTVN3JSC8JSStringE _jscore_fastmalloc_introspection diff --git a/JavaScriptCore/JavaScriptCore.gypi b/JavaScriptCore/JavaScriptCore.gypi new file mode 100644 index 0000000..462c38f --- /dev/null +++ b/JavaScriptCore/JavaScriptCore.gypi @@ -0,0 +1,455 @@ +{ + '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/MarkStack.cpp', + 'runtime/MarkStack.h', + 'runtime/MarkStackWin.cpp', + '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/JavaScriptCore.order b/JavaScriptCore/JavaScriptCore.order index bb56e98..3ae3ec6 100644 --- a/JavaScriptCore/JavaScriptCore.order +++ b/JavaScriptCore/JavaScriptCore.order @@ -186,7 +186,7 @@ __Z10jscyyparsePv __ZN3JSC5Lexer3lexEPvS1_ __ZN3JSC10Identifier3addEPNS_12JSGlobalDataEPKti __ZN3WTF7HashSetIPN3JSC7UString3RepENS_7StrHashIS4_EENS_10HashTraitsIS4_EEE3addINS1_11UCharBufferENS1_21UCharBufferTranslatorEE -__ZN3JSC15SegmentedVectorINS_10IdentifierELm64EE6appendIS1_EEvRKT_ +__ZN3WTF15SegmentedVectorINS_10IdentifierELm64EE6appendIS1_EEvRKT_ __ZNK3JSC9HashTable11createTableEPNS_12JSGlobalDataE __ZN3JSC20ParserArenaDeletablenwEmPNS_12JSGlobalDataE __ZN3WTF6VectorIPN3JSC20ParserArenaDeletableELm0EE15reserveCapacityEm diff --git a/JavaScriptCore/JavaScriptCore.pri b/JavaScriptCore/JavaScriptCore.pri index ef42965..dd48c9a 100644 --- a/JavaScriptCore/JavaScriptCore.pri +++ b/JavaScriptCore/JavaScriptCore.pri @@ -9,24 +9,26 @@ CONFIG(debug, debug|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 \ +INCLUDEPATH = \ + $$PWD \ + $$PWD/.. \ + $$PWD/assembler \ + $$PWD/bytecode \ + $$PWD/bytecompiler \ + $$PWD/debugger \ + $$PWD/interpreter \ + $$PWD/jit \ + $$PWD/parser \ + $$PWD/profiler \ + $$PWD/runtime \ + $$PWD/wrec \ + $$PWD/wtf \ + $$PWD/wtf/unicode \ + $$PWD/yarr \ + $$PWD/API \ + $$PWD/ForwardingHeaders \ + $$GENERATED_SOURCES_DIR \ + $$INCLUDEPATH DEFINES += BUILDING_QT__ BUILDING_JavaScriptCore BUILDING_WTF @@ -35,40 +37,24 @@ win32-* { LIBS += -lwinmm } -# 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 - } - } +# In debug mode JIT disabled until crash fixed +win32-* { + CONFIG(debug):!contains(DEFINES, ENABLE_JIT=1): DEFINES+=ENABLE_JIT=0 } -# 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 +# Rules when JIT enabled (not disabled) +!contains(DEFINES, ENABLE_JIT=0) { + linux-g++*:greaterThan(QT_GCC_MAJOR_VERSION,3):greaterThan(QT_GCC_MINOR_VERSION,0) { 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 \ @@ -110,11 +96,15 @@ SOURCES += \ runtime/JSVariableObject.cpp \ runtime/JSActivation.cpp \ runtime/JSNotAnObject.cpp \ + runtime/JSONObject.cpp \ runtime/LiteralParser.cpp \ + runtime/MarkStack.cpp \ + runtime/MarkStackPosix.cpp \ runtime/TimeoutChecker.cpp \ bytecode/CodeBlock.cpp \ bytecode/StructureStubInfo.cpp \ bytecode/JumpTable.cpp \ + assembler/ARMAssembler.cpp \ jit/JIT.cpp \ jit/JITCall.cpp \ jit/JITArithmetic.cpp \ @@ -172,6 +162,7 @@ SOURCES += \ runtime/InternalFunction.cpp \ runtime/Completion.cpp \ runtime/JSArray.cpp \ + runtime/JSAPIValueWrapper.cpp \ runtime/JSByteArray.cpp \ runtime/JSCell.cpp \ runtime/JSFunction.cpp \ diff --git a/JavaScriptCore/JavaScriptCore.pro b/JavaScriptCore/JavaScriptCore.pro index 28f0e6b..0cd2e1a 100644 --- a/JavaScriptCore/JavaScriptCore.pro +++ b/JavaScriptCore/JavaScriptCore.pro @@ -33,12 +33,6 @@ INCLUDEPATH += $$GENERATED_SOURCES_DIR } } -include($$OUTPUT_DIR/config.pri) - -CONFIG -= warn_on -*-g++*:QMAKE_CXXFLAGS += -Wreturn-type -fno-strict-aliasing -#QMAKE_CXXFLAGS += -Wall -Wno-undef -Wno-unused-parameter - CONFIG(release):!CONFIG(QTDIR_build) { contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols unix:contains(QT_CONFIG, reduce_relocations):CONFIG += bsymbolic_functions diff --git a/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def b/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def index 4b086dd..0de51bf 100644 --- a/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def +++ b/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def @@ -1,9 +1,14 @@ LIBRARY "JavaScriptCore" EXPORTS + ?from@UString@JSC@@SA?AV12@N@Z + ?nonInlineNaN@JSC@@YANXZ + ?synthesizePrototype@JSValue@JSC@@ABEPAVJSObject@2@PAVExecState@2@@Z + ?toObjectSlowCase@JSValue@JSC@@ABEPAVJSObject@2@PAVExecState@2@@Z + ?toThisObjectSlowCase@JSValue@JSC@@ABEPAVJSObject@2@PAVExecState@2@@Z ??0Collator@WTF@@QAE@PBD@Z ??0Debugger@JSC@@QAE@XZ - ??0DropAllLocks@JSLock@JSC@@QAE@_N@Z + ??0DropAllLocks@JSLock@JSC@@QAE@W4JSLockBehavior@2@@Z ??0InternalFunction@JSC@@IAE@PAVJSGlobalData@1@V?$PassRefPtr@VStructure@JSC@@@WTF@@ABVIdentifier@1@@Z ??0JSByteArray@JSC@@QAE@PAVExecState@1@V?$PassRefPtr@VStructure@JSC@@@WTF@@PAVByteArray@4@PBUClassInfo@1@@Z ??0JSFunction@JSC@@QAE@PAVExecState@1@V?$PassRefPtr@VStructure@JSC@@@WTF@@HABVIdentifier@1@P6I?AVJSValue@1@0PAVJSObject@1@V61@ABVArgList@1@@Z@Z @@ -41,6 +46,8 @@ EXPORTS ?addSlowCase@Identifier@JSC@@CA?AV?$PassRefPtr@URep@UString@JSC@@@WTF@@PAVJSGlobalData@2@PAURep@UString@2@@Z ?allocate@Heap@JSC@@QAEPAXI@Z ?allocatePropertyStorage@JSObject@JSC@@QAEXII@Z + ?allocateStack@MarkStack@JSC@@CAPAXI@Z + ?allocateStack@MarkStack@JSC@@CAPAXI@Z ?append@UString@JSC@@QAEAAV12@ABV12@@Z ?append@UString@JSC@@QAEAAV12@PBD@Z ?ascii@UString@JSC@@QBEPADXZ @@ -52,6 +59,7 @@ EXPORTS ?changePrototypeTransition@Structure@JSC@@SA?AV?$PassRefPtr@VStructure@JSC@@@WTF@@PAV12@VJSValue@2@@Z ?checkSameIdentifierTable@Identifier@JSC@@CAXPAVExecState@2@PAURep@UString@2@@Z ?checkSameIdentifierTable@Identifier@JSC@@CAXPAVJSGlobalData@2@PAURep@UString@2@@Z + ?checkSyntax@JSC@@YA?AVCompletion@1@PAVExecState@1@ABVSourceCode@1@@Z ?classInfo@InternalFunction@JSC@@UBEPBUClassInfo@2@XZ ?classInfo@JSCell@JSC@@UBEPBUClassInfo@2@XZ ?className@JSObject@JSC@@UBE?AVUString@2@XZ @@ -99,7 +107,7 @@ EXPORTS ?despecifyFunctionTransition@Structure@JSC@@SA?AV?$PassRefPtr@VStructure@JSC@@@WTF@@PAV12@ABVIdentifier@2@@Z ?destroy@Heap@JSC@@QAEXXZ ?destroy@Rep@UString@JSC@@QAEXXZ - ?detach@Debugger@JSC@@QAEXPAVJSGlobalObject@2@@Z + ?detach@Debugger@JSC@@UAEXPAVJSGlobalObject@2@@Z ?detachThread@WTF@@YAXI@Z ?equal@Identifier@JSC@@SA_NPBURep@UString@2@PBD@Z ?equal@JSC@@YA_NPBURep@UString@1@0@Z @@ -129,6 +137,7 @@ EXPORTS ?getOwnPropertySlot@JSString@JSC@@EAE_NPAVExecState@2@IAAVPropertySlot@2@@Z ?getOwnPropertySlot@StringObject@JSC@@UAE_NPAVExecState@2@ABVIdentifier@2@AAVPropertySlot@2@@Z ?getOwnPropertySlot@StringObject@JSC@@UAE_NPAVExecState@2@IAAVPropertySlot@2@@Z + ?getPrimitiveNumber@JSAPIValueWrapper@JSC@@UAE_NPAVExecState@2@AANAAVJSValue@2@@Z ?getPrimitiveNumber@JSObject@JSC@@UAE_NPAVExecState@2@AANAAVJSValue@2@@Z ?getPrimitiveNumber@JSString@JSC@@EAE_NPAVExecState@2@AANAAVJSValue@2@@Z ?getPropertyAttributes@JSObject@JSC@@UBE_NPAVExecState@2@ABVIdentifier@2@AAI@Z @@ -139,8 +148,6 @@ EXPORTS ?getSlice@ArgList@JSC@@QBEXHAAV12@@Z ?getString@JSCell@JSC@@QBE?AVUString@2@XZ ?getString@JSCell@JSC@@QBE_NAAVUString@2@@Z - ?getTruncatedInt32@JSCell@JSC@@UBE_NAAH@Z - ?getTruncatedUInt32@JSCell@JSC@@UBE_NAAI@Z ?getUInt32@JSCell@JSC@@UBE_NAAI@Z ?globalExec@JSGlobalObject@JSC@@UAEPAVExecState@2@XZ ?globalObjectCount@Heap@JSC@@QAEIXZ @@ -157,26 +164,25 @@ EXPORTS ?isBusy@Heap@JSC@@QAE_NXZ ?isDynamicScope@JSGlobalObject@JSC@@UBE_NXZ ?isGetterSetter@JSCell@JSC@@UBE_NXZ + ?isHostFunction@FunctionBodyNode@JSC@@QBE_NXZ ?isMainThread@WTF@@YA_NXZ ?isVariableObject@JSVariableObject@JSC@@UBE_NXZ - ?jsAPIMangledNumber@JSC@@YA?AVJSValue@1@PAVExecState@1@N@Z ?jsNumberCell@JSC@@YA?AVJSValue@1@PAVExecState@1@N@Z ?jsOwnedString@JSC@@YAPAVJSString@1@PAVJSGlobalData@1@ABVUString@1@@Z ?jsRegExpCompile@@YAPAUJSRegExp@@PB_WHW4JSRegExpIgnoreCaseOption@@W4JSRegExpMultilineOption@@PAIPAPBD@Z ?jsRegExpExecute@@YAHPBUJSRegExp@@PB_WHHPAHH@Z ?jsRegExpFree@@YAXPAUJSRegExp@@@Z ?jsString@JSC@@YAPAVJSString@1@PAVJSGlobalData@1@ABVUString@1@@Z - ?lock@JSLock@JSC@@SAX_N@Z + ?lock@JSLock@JSC@@SAXW4JSLockBehavior@2@@Z ?lock@Mutex@WTF@@QAEXXZ ?lockAtomicallyInitializedStaticMutex@WTF@@YAXXZ ?lookupGetter@JSObject@JSC@@UAE?AVJSValue@2@PAVExecState@2@ABVIdentifier@2@@Z ?lookupSetter@JSObject@JSC@@UAE?AVJSValue@2@PAVExecState@2@ABVIdentifier@2@@Z - ?mark@JSGlobalObject@JSC@@UAEXXZ - ?mark@JSObject@JSC@@UAEXXZ - ?mark@JSWrapperObject@JSC@@UAEXXZ + ?markChildren@JSGlobalObject@JSC@@UAEXAAVMarkStack@2@@Z + ?markChildren@JSObject@JSC@@UAEXAAVMarkStack@2@@Z + ?markChildren@JSWrapperObject@JSC@@UAEXAAVMarkStack@2@@Z ?materializePropertyMap@Structure@JSC@@AAEXXZ ?name@InternalFunction@JSC@@QAEABVUString@2@PAVJSGlobalData@2@@Z - ?nonInlineNaN@JSImmediate@JSC@@CANXZ ?objectCount@Heap@JSC@@QAEIXZ ?objectProtoFuncToString@JSC@@YI?AVJSValue@1@PAVExecState@1@PAVJSObject@1@V21@ABVArgList@1@@Z ?parse@Parser@JSC@@AAEXPAVJSGlobalData@2@PAHPAVUString@2@@Z @@ -188,7 +194,6 @@ EXPORTS ?protectedGlobalObjectCount@Heap@JSC@@QAEIXZ ?protectedObjectCount@Heap@JSC@@QAEIXZ ?protectedObjectTypeCounts@Heap@JSC@@QAEPAV?$HashCountedSet@PBDU?$PtrHash@PBD@WTF@@U?$HashTraits@PBD@2@@WTF@@XZ - ?prototype@JSImmediate@JSC@@CAPAVJSObject@2@VJSValue@2@PAVExecState@2@@Z ?put@JSCell@JSC@@UAEXPAVExecState@2@ABVIdentifier@2@VJSValue@2@AAVPutPropertySlot@2@@Z ?put@JSCell@JSC@@UAEXPAVExecState@2@IVJSValue@2@@Z ?put@JSGlobalObject@JSC@@UAEXPAVExecState@2@ABVIdentifier@2@VJSValue@2@AAVPutPropertySlot@2@@Z @@ -202,6 +207,7 @@ EXPORTS ?putWithAttributes@JSObject@JSC@@UAEXPAVExecState@2@IVJSValue@2@I@Z ?randomNumber@WTF@@YANXZ ?recordExtraCost@Heap@JSC@@AAEXI@Z + ?releaseStack@MarkStack@JSC@@CAXPAXI@Z ?reset@ParserArena@JSC@@QAEXXZ ?reset@TimeoutChecker@JSC@@QAEXXZ ?restoreAll@Profile@JSC@@QAEXXZ @@ -213,7 +219,7 @@ EXPORTS ?setMainThreadCallbacksPaused@WTF@@YAX_N@Z ?setOrderLowerFirst@Collator@WTF@@QAEX_N@Z ?setUpStaticFunctionSlot@JSC@@YAXPAVExecState@1@PBVHashEntry@1@PAVJSObject@1@ABVIdentifier@1@AAVPropertySlot@1@@Z - ?sharedBuffer@BaseString@UString@JSC@@QAEPAV?$CrossThreadRefCounted@V?$OwnFastMallocPtr@_W@WTF@@@WTF@@XZ + ?sharedBuffer@Rep@UString@JSC@@QAEPAV?$CrossThreadRefCounted@V?$OwnFastMallocPtr@_W@WTF@@@WTF@@XZ ?signal@ThreadCondition@WTF@@QAEXXZ ?slowAppend@MarkedArgumentBuffer@JSC@@AAEXVJSValue@2@@Z ?startIgnoringLeaks@Structure@JSC@@SAXXZ @@ -229,17 +235,20 @@ EXPORTS ?timedWait@ThreadCondition@WTF@@QAE_NAAVMutex@2@N@Z ?tlsKeyCount@WTF@@YAAAJXZ ?tlsKeys@WTF@@YAPAKXZ + ?toBoolean@JSAPIValueWrapper@JSC@@UBE_NPAVExecState@2@@Z ?toBoolean@JSObject@JSC@@UBE_NPAVExecState@2@@Z ?toBoolean@JSString@JSC@@EBE_NPAVExecState@2@@Z ?toInt32SlowCase@JSC@@YAHNAA_N@Z + ?toNumber@JSAPIValueWrapper@JSC@@UBENPAVExecState@2@@Z ?toNumber@JSObject@JSC@@UBENPAVExecState@2@@Z ?toNumber@JSString@JSC@@EBENPAVExecState@2@@Z - ?toObject@JSImmediate@JSC@@CAPAVJSObject@2@VJSValue@2@PAVExecState@2@@Z + ?toObject@JSAPIValueWrapper@JSC@@UBEPAVJSObject@2@PAVExecState@2@@Z ?toObject@JSObject@JSC@@UBEPAV12@PAVExecState@2@@Z ?toObject@JSString@JSC@@EBEPAVJSObject@2@PAVExecState@2@@Z + ?toPrimitive@JSAPIValueWrapper@JSC@@UBE?AVJSValue@2@PAVExecState@2@W4PreferredPrimitiveType@2@@Z ?toPrimitive@JSString@JSC@@EBE?AVJSValue@2@PAVExecState@2@W4PreferredPrimitiveType@2@@Z ?toStrictUInt32@UString@JSC@@QBEIPA_N@Z - ?toString@JSImmediate@JSC@@CA?AVUString@2@VJSValue@2@@Z + ?toString@JSAPIValueWrapper@JSC@@UBE?AVUString@2@PAVExecState@2@@Z ?toString@JSObject@JSC@@UBE?AVUString@2@PAVExecState@2@@Z ?toString@JSString@JSC@@EBE?AVUString@2@PAVExecState@2@@Z ?toString@StringObject@JSC@@EBE?AVUString@2@PAVExecState@2@@Z @@ -247,7 +256,6 @@ EXPORTS ?toThisJSString@JSString@JSC@@EAEPAV12@PAVExecState@2@@Z ?toThisJSString@StringObject@JSC@@EAEPAVJSString@2@PAVExecState@2@@Z ?toThisObject@JSCell@JSC@@UBEPAVJSObject@2@PAVExecState@2@@Z - ?toThisObject@JSImmediate@JSC@@CAPAVJSObject@2@VJSValue@2@PAVExecState@2@@Z ?toThisObject@JSObject@JSC@@UBEPAV12@PAVExecState@2@@Z ?toThisObject@JSString@JSC@@EBEPAVJSObject@2@PAVExecState@2@@Z ?toThisString@JSCell@JSC@@UBE?AVUString@2@PAVExecState@2@@Z @@ -259,7 +267,7 @@ EXPORTS ?tryFastCalloc@WTF@@YAPAXII@Z ?tryLock@Mutex@WTF@@QAE_NXZ ?type@DebuggerCallFrame@JSC@@QBE?AW4Type@12@XZ - ?unlock@JSLock@JSC@@SAX_N@Z + ?unlock@JSLock@JSC@@SAXW4JSLockBehavior@2@@Z ?unlock@Mutex@WTF@@QAEXXZ ?unlockAtomicallyInitializedStaticMutex@WTF@@YAXXZ ?unprotect@Heap@JSC@@QAEXVJSValue@2@@Z diff --git a/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj b/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj index 4125568..1c5e963 100644 --- a/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj +++ b/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj @@ -588,19 +588,19 @@ >
</File>
<File
- RelativePath="..\..\runtime\DateInstance.cpp"
+ RelativePath="..\..\runtime\DateConversion.cpp"
>
</File>
<File
- RelativePath="..\..\runtime\DateInstance.h"
+ RelativePath="..\..\runtime\DateConversion.h"
>
</File>
<File
- RelativePath="..\..\runtime\DateConversion.cpp"
+ RelativePath="..\..\runtime\DateInstance.cpp"
>
</File>
<File
- RelativePath="..\..\runtime\DateConversion.h"
+ RelativePath="..\..\runtime\DateInstance.h"
>
</File>
<File
@@ -708,6 +708,14 @@ >
</File>
<File
+ RelativePath="..\..\runtime\JSAPIValueWrapper.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\runtime\JSAPIValueWrapper.h"
+ >
+ </File>
+ <File
RelativePath="..\..\runtime\JSArray.cpp"
>
</File>
@@ -804,6 +812,14 @@ >
</File>
<File
+ RelativePath="..\..\runtime\JSONObject.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\runtime\JSONObject.h"
+ >
+ </File>
+ <File
RelativePath="..\..\runtime\JSStaticScopeObject.cpp"
>
</File>
@@ -868,6 +884,18 @@ >
</File>
<File
+ RelativePath="..\..\runtime\MarkStack.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\runtime\MarkStack.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\runtime\MarkStackWin.cpp"
+ >
+ </File>
+ <File
RelativePath="..\..\runtime\MathObject.cpp"
>
</File>
@@ -1463,10 +1491,6 @@ RelativePath="..\..\bytecompiler\RegisterID.h"
>
</File>
- <File
- RelativePath="..\..\bytecompiler\SegmentedVector.h"
- >
- </File>
</Filter>
<Filter
Name="bytecode"
@@ -1608,6 +1632,14 @@ >
</File>
<File
+ RelativePath="..\..\assembler\LinkBuffer.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\assembler\RepatchBuffer.h"
+ >
+ </File>
+ <File
RelativePath="..\..\assembler\AssemblerBuffer.h"
>
</File>
diff --git a/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreCommon.vsprops b/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreCommon.vsprops index 1b7cc06..5f90011 100644 --- a/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreCommon.vsprops +++ b/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreCommon.vsprops @@ -1,30 +1,30 @@ -<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioPropertySheet
- ProjectType="Visual C++"
- Version="8.00"
- Name="JavaScriptCoreCommon"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""$(WebKitOutputDir)\obj\JavaScriptCore\DerivedSources\";../../;../../API/;../../pcre/;../../parser/;../../bytecompiler/;../../jit/;../../runtime/;../../bytecode/;../../interpreter/;../../wtf/;../../profiler;../../assembler/;../../debugger/;../../wrec/;"$(WebKitLibrariesDir)\include";"$(WebKitLibrariesDir)\include\icu";../../../icu/include;"$(WebKitOutputDir)\include\JavaScriptCore";"$(WebKitLibrariesDir)\include\pthreads";"$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders";"$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders\GNUCompatibility""
- PreprocessorDefinitions="__STD_C"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="gdi32.lib oleaut32.lib winmm.lib icuin$(LibraryConfigSuffix).lib icuuc$(LibraryConfigSuffix).lib pthreadVC2$(LibraryConfigSuffix).lib WTF$(WebKitConfigSuffix).lib"
- OutputFile="$(OutDir)\$(ProjectName)$(WebKitDLLConfigSuffix).dll"
- ModuleDefinitionFile="JavaScriptCore$(WebKitDLLConfigSuffix).def"
- />
- <Tool
- Name="VCPostBuildEventTool"
- CommandLine="mkdir 2>NUL "$(WebKitOutputDir)\include\JavaScriptCore"

xcopy /y /d "$(ProjectDir)\..\..\wtf\*.h" "$(WebKitOutputDir)\include\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\wtf\unicode\*.h" "$(WebKitOutputDir)\include\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\wtf\unicode\icu\*.h" "$(WebKitOutputDir)\include\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\parser\*.h" "$(WebKitOutputDir)\include\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\runtime\*.h" "$(WebKitOutputDir)\include\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\VM\*.h" "$(WebKitOutputDir)\include\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\bytecode\*.h" "$(WebKitOutputDir)\include\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\interpreter\*.h" "$(WebKitOutputDir)\include\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\assembler\*.h" "$(WebKitOutputDir)\include\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\wrec\*.h" "$(WebKitOutputDir)\include\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\jit\*.h" "$(WebKitOutputDir)\include\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\debugger\*.h" "$(WebKitOutputDir)\include\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\profiler\*.h" "$(WebKitOutputDir)\include\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\create_hash_table" "$(WebKitOutputDir)\include\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\pcre\pcre.h" "$(WebKitOutputDir)\include\JavaScriptCore"

mkdir 2>NUL "$(OutDir)\JavaScriptCore.resources"
xcopy /y /d "$(ProjectDir)..\$(ProjectName).resources\*" "$(OutDir)\$(ProjectName).resources"

if exist "$(WebKitOutputDir)\buildfailed" del "$(WebKitOutputDir)\buildfailed"
"
- />
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="set PATH=%SystemDrive%\cygwin\bin;%PATH%
if exist "$(WebKitOutputDir)\buildfailed" grep XX$(ProjectName)XX "$(WebKitOutputDir)\buildfailed"
if errorlevel 1 exit 1
echo XX$(ProjectName)XX > "$(WebKitOutputDir)\buildfailed"

bash "$(WebKitLibrariesDir)\tools\scripts\auto-version.sh" "$(IntDir)"
"
- />
- <Tool
- Name="VCPreLinkEventTool"
- CommandLine="if not exist "$(WebKitOutputDir)\public\sym" mkdir "$(WebKitOutputDir)\public\sym""
- />
-</VisualStudioPropertySheet>
+<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioPropertySheet + ProjectType="Visual C++" + Version="8.00" + Name="JavaScriptCoreCommon" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories=""$(WebKitOutputDir)\obj\JavaScriptCore\DerivedSources\";../../;../../API/;../../pcre/;../../parser/;../../bytecompiler/;../../jit/;../../runtime/;../../bytecode/;../../interpreter/;../../wtf/;../../profiler;../../assembler/;../../debugger/;../../wrec/;"$(WebKitLibrariesDir)\include";"$(WebKitLibrariesDir)\include\icu";"$(WebKitLibrariesDir)\include\private";../../../icu/include;"$(WebKitOutputDir)\include";"$(WebKitOutputDir)\include\JavaScriptCore";"$(WebKitLibrariesDir)\include\pthreads";"$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders";"$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders\GNUCompatibility"" + PreprocessorDefinitions="__STD_C" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="gdi32.lib oleaut32.lib winmm.lib icuin$(LibraryConfigSuffix).lib icuuc$(LibraryConfigSuffix).lib pthreadVC2$(LibraryConfigSuffix).lib WTF$(WebKitConfigSuffix).lib" + OutputFile="$(OutDir)\$(ProjectName)$(WebKitDLLConfigSuffix).dll" + ModuleDefinitionFile="JavaScriptCore$(WebKitDLLConfigSuffix).def" + /> + <Tool + Name="VCPostBuildEventTool" + CommandLine="mkdir 2>NUL "$(WebKitOutputDir)\include\private\JavaScriptCore"

xcopy /y /d "$(ProjectDir)\..\..\wtf\*.h" "$(WebKitOutputDir)\include\private\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\wtf\unicode\*.h" "$(WebKitOutputDir)\include\private\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\wtf\unicode\icu\*.h" "$(WebKitOutputDir)\include\private\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\parser\*.h" "$(WebKitOutputDir)\include\private\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\runtime\*.h" "$(WebKitOutputDir)\include\private\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\VM\*.h" "$(WebKitOutputDir)\include\private\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\bytecode\*.h" "$(WebKitOutputDir)\include\private\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\interpreter\*.h" "$(WebKitOutputDir)\include\private\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\assembler\*.h" "$(WebKitOutputDir)\include\private\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\wrec\*.h" "$(WebKitOutputDir)\include\private\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\jit\*.h" "$(WebKitOutputDir)\include\private\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\debugger\*.h" "$(WebKitOutputDir)\include\private\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\profiler\*.h" "$(WebKitOutputDir)\include\private\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\create_hash_table" "$(WebKitOutputDir)\include\private\JavaScriptCore"
xcopy /y /d "$(ProjectDir)\..\..\pcre\pcre.h" "$(WebKitOutputDir)\include\private\JavaScriptCore"

mkdir 2>NUL "$(OutDir)\JavaScriptCore.resources"
xcopy /y /d "$(ProjectDir)..\$(ProjectName).resources\*" "$(OutDir)\$(ProjectName).resources"

if exist "$(WebKitOutputDir)\buildfailed" del "$(WebKitOutputDir)\buildfailed"
" + /> + <Tool + Name="VCPreBuildEventTool" + CommandLine="set PATH=%SystemDrive%\cygwin\bin;%PATH%
if exist "$(WebKitOutputDir)\buildfailed" grep XX$(ProjectName)XX "$(WebKitOutputDir)\buildfailed"
if errorlevel 1 exit 1
echo XX$(ProjectName)XX > "$(WebKitOutputDir)\buildfailed"

bash "$(WebKitLibrariesDir)\tools\scripts\auto-version.sh" "$(IntDir)"
" + /> + <Tool + Name="VCPreLinkEventTool" + CommandLine="if not exist "$(WebKitOutputDir)\public\sym" mkdir "$(WebKitOutputDir)\public\sym"" + /> +</VisualStudioPropertySheet> diff --git a/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.make b/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.make index e66f9f0..9fd7ad4 100644 --- a/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.make +++ b/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.make @@ -2,21 +2,21 @@ all: -xcopy /y/d/e/i "..\..\..\WebKitLibraries\win\tools" "$(WEBKITLIBRARIESDIR)\tools" touch "$(WEBKITOUTPUTDIR)\buildfailed" bash build-generated-files.sh "$(WEBKITOUTPUTDIR)" "$(WEBKITLIBRARIESDIR)" - -mkdir 2>NUL "$(WEBKITOUTPUTDIR)\include\JavaScriptCore\JavaScriptCore" - xcopy /y /d "..\..\API\APICast.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore\JavaScriptCore" - xcopy /y /d "..\..\API\JavaScript.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore\JavaScriptCore" - xcopy /y /d "..\..\API\JSBase.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore\JavaScriptCore" - xcopy /y /d "..\..\API\JSContextRef.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore\JavaScriptCore" - xcopy /y /d "..\..\API\JSObjectRef.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore\JavaScriptCore" - xcopy /y /d "..\..\API\JSStringRef.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore\JavaScriptCore" - xcopy /y /d "..\..\API\JSStringRefCF.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore\JavaScriptCore" - xcopy /y /d "..\..\API\JSStringRefBSTR.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore\JavaScriptCore" - xcopy /y /d "..\..\API\JSValueRef.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore\JavaScriptCore" - xcopy /y /d "..\..\API\JavaScriptCore.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore\JavaScriptCore" - xcopy /y /d "..\..\API\JSRetainPtr.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore\JavaScriptCore" - xcopy /y /d "..\..\API\OpaqueJSString.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore\JavaScriptCore" - xcopy /y /d "..\..\API\WebKitAvailability.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore\JavaScriptCore" - -del "$(WEBKITOUTPUTDIR)\include\JavaScriptCore\stdbool.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore\stdint.h" + -mkdir 2>NUL "$(WEBKITOUTPUTDIR)\include\JavaScriptCore" + xcopy /y /d "..\..\API\APICast.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore" + xcopy /y /d "..\..\API\JavaScript.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore" + xcopy /y /d "..\..\API\JSBase.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore" + xcopy /y /d "..\..\API\JSContextRef.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore" + xcopy /y /d "..\..\API\JSObjectRef.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore" + xcopy /y /d "..\..\API\JSStringRef.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore" + xcopy /y /d "..\..\API\JSStringRefCF.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore" + xcopy /y /d "..\..\API\JSStringRefBSTR.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore" + xcopy /y /d "..\..\API\JSValueRef.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore" + xcopy /y /d "..\..\API\JavaScriptCore.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore" + xcopy /y /d "..\..\API\JSRetainPtr.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore" + xcopy /y /d "..\..\API\OpaqueJSString.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore" + xcopy /y /d "..\..\API\WebKitAvailability.h" "$(WEBKITOUTPUTDIR)\include\JavaScriptCore" + -del "$(WEBKITOUTPUTDIR)\include\private\JavaScriptCore\stdbool.h" "$(WEBKITOUTPUTDIR)\include\private\JavaScriptCore\stdint.h" -del "$(WEBKITOUTPUTDIR)\buildfailed" clean: diff --git a/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.vcproj b/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.vcproj index 0c49f64..954045e 100644 --- a/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.vcproj +++ b/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreGenerated.vcproj @@ -1,53 +1,53 @@ -<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8.00"
- Name="JavaScriptCoreGenerated"
- ProjectGUID="{4FF5BA11-59EC-4C24-8F52-F235C2E7D43A}"
- RootNamespace="JavaScriptCoreGenerated"
- Keyword="MakeFileProj"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(WebKitOutputDir)\lib"
- IntermediateDirectory="$(WebKitOutputDir)\obj\$(ProjectName)\$(ConfigurationName)"
- ConfigurationType="0"
- >
- <Tool
- Name="VCNMakeTool"
- BuildCommandLine="set PATH=%SystemDrive%\cygwin\bin;%PATH%

nmake /nologo -f JavaScriptCoreGenerated.make"
- ReBuildCommandLine="set PATH=%SystemDrive%\cygwin\bin;%PATH%

nmake /nologo -f JavaScriptCoreGenerated.make clean
nmake -f JavaScriptCoreGenerated.make"
- CleanCommandLine="set PATH=%SystemDrive%\cygwin\bin;%PATH%

nmake /nologo -f JavaScriptCoreGenerated.make clean"
- Output=""
- PreprocessorDefinitions="WIN32;NDEBUG"
- IncludeSearchPath=""
- ForcedIncludes=""
- AssemblySearchPath=""
- ForcedUsingAssemblies=""
- CompileAsManaged=""
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <File
- RelativePath=".\build-generated-files.sh"
- >
- </File>
- <File
- RelativePath=".\JavaScriptCoreGenerated.make"
- >
- </File>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="8.00" + Name="JavaScriptCoreGenerated" + ProjectGUID="{4FF5BA11-59EC-4C24-8F52-F235C2E7D43A}" + RootNamespace="JavaScriptCoreGenerated" + Keyword="MakeFileProj" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Release|Win32" + OutputDirectory="$(WebKitOutputDir)\lib" + IntermediateDirectory="$(WebKitOutputDir)\obj\$(ProjectName)\$(ConfigurationName)" + ConfigurationType="0" + > + <Tool + Name="VCNMakeTool" + BuildCommandLine="set PATH=%SystemDrive%\cygwin\bin;%PATH%

nmake /nologo -f JavaScriptCoreGenerated.make" + ReBuildCommandLine="set PATH=%SystemDrive%\cygwin\bin;%PATH%

nmake /nologo -f JavaScriptCoreGenerated.make clean
nmake -f JavaScriptCoreGenerated.make" + CleanCommandLine="set PATH=%SystemDrive%\cygwin\bin;%PATH%

nmake /nologo -f JavaScriptCoreGenerated.make clean" + Output="" + PreprocessorDefinitions="WIN32;NDEBUG" + IncludeSearchPath="" + ForcedIncludes="" + AssemblySearchPath="" + ForcedUsingAssemblies="" + CompileAsManaged="" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <File + RelativePath=".\build-generated-files.sh" + > + </File> + <File + RelativePath=".\JavaScriptCoreGenerated.make" + > + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def b/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def index 31f3e3d..65998ca 100644 --- a/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def +++ b/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore_debug.def @@ -1,9 +1,14 @@ LIBRARY "JavaScriptCore_debug" EXPORTS + ?from@UString@JSC@@SA?AV12@N@Z + ?nonInlineNaN@JSC@@YANXZ + ?synthesizePrototype@JSValue@JSC@@ABEPAVJSObject@2@PAVExecState@2@@Z + ?toObjectSlowCase@JSValue@JSC@@ABEPAVJSObject@2@PAVExecState@2@@Z + ?toThisObjectSlowCase@JSValue@JSC@@ABEPAVJSObject@2@PAVExecState@2@@Z ??0Collator@WTF@@QAE@PBD@Z ??0Debugger@JSC@@QAE@XZ - ??0DropAllLocks@JSLock@JSC@@QAE@_N@Z + ??0DropAllLocks@JSLock@JSC@@QAE@W4JSLockBehavior@2@@Z ??0InternalFunction@JSC@@IAE@PAVJSGlobalData@1@V?$PassRefPtr@VStructure@JSC@@@WTF@@ABVIdentifier@1@@Z ??0JSByteArray@JSC@@QAE@PAVExecState@1@V?$PassRefPtr@VStructure@JSC@@@WTF@@PAVByteArray@4@PBUClassInfo@1@@Z ??0JSFunction@JSC@@QAE@PAVExecState@1@V?$PassRefPtr@VStructure@JSC@@@WTF@@HABVIdentifier@1@P6I?AVJSValue@1@0PAVJSObject@1@V61@ABVArgList@1@@Z@Z @@ -52,6 +57,7 @@ EXPORTS ?changePrototypeTransition@Structure@JSC@@SA?AV?$PassRefPtr@VStructure@JSC@@@WTF@@PAV12@VJSValue@2@@Z ?checkSameIdentifierTable@Identifier@JSC@@CAXPAVExecState@2@PAURep@UString@2@@Z ?checkSameIdentifierTable@Identifier@JSC@@CAXPAVJSGlobalData@2@PAURep@UString@2@@Z + ?checkSyntax@JSC@@YA?AVCompletion@1@PAVExecState@1@ABVSourceCode@1@@Z ?classInfo@InternalFunction@JSC@@UBEPBUClassInfo@2@XZ ?classInfo@JSCell@JSC@@UBEPBUClassInfo@2@XZ ?className@JSObject@JSC@@UBE?AVUString@2@XZ @@ -99,7 +105,7 @@ EXPORTS ?despecifyFunctionTransition@Structure@JSC@@SA?AV?$PassRefPtr@VStructure@JSC@@@WTF@@PAV12@ABVIdentifier@2@@Z ?destroy@Heap@JSC@@QAEXXZ ?destroy@Rep@UString@JSC@@QAEXXZ - ?detach@Debugger@JSC@@QAEXPAVJSGlobalObject@2@@Z + ?detach@Debugger@JSC@@UAEXPAVJSGlobalObject@2@@Z ?detachThread@WTF@@YAXI@Z ?equal@Identifier@JSC@@SA_NPBURep@UString@2@PBD@Z ?equal@JSC@@YA_NPBURep@UString@1@0@Z @@ -129,6 +135,7 @@ EXPORTS ?getOwnPropertySlot@JSString@JSC@@EAE_NPAVExecState@2@IAAVPropertySlot@2@@Z ?getOwnPropertySlot@StringObject@JSC@@UAE_NPAVExecState@2@ABVIdentifier@2@AAVPropertySlot@2@@Z ?getOwnPropertySlot@StringObject@JSC@@UAE_NPAVExecState@2@IAAVPropertySlot@2@@Z + ?getPrimitiveNumber@JSAPIValueWrapper@JSC@@UAE_NPAVExecState@2@AANAAVJSValue@2@@Z ?getPrimitiveNumber@JSObject@JSC@@UAE_NPAVExecState@2@AANAAVJSValue@2@@Z ?getPrimitiveNumber@JSString@JSC@@EAE_NPAVExecState@2@AANAAVJSValue@2@@Z ?getPropertyAttributes@JSObject@JSC@@UBE_NPAVExecState@2@ABVIdentifier@2@AAI@Z @@ -139,8 +146,6 @@ EXPORTS ?getSlice@ArgList@JSC@@QBEXHAAV12@@Z ?getString@JSCell@JSC@@QBE?AVUString@2@XZ ?getString@JSCell@JSC@@QBE_NAAVUString@2@@Z - ?getTruncatedInt32@JSCell@JSC@@UBE_NAAH@Z - ?getTruncatedUInt32@JSCell@JSC@@UBE_NAAI@Z ?getUInt32@JSCell@JSC@@UBE_NAAI@Z ?globalExec@JSGlobalObject@JSC@@UAEPAVExecState@2@XZ ?globalObjectCount@Heap@JSC@@QAEIXZ @@ -157,26 +162,25 @@ EXPORTS ?isBusy@Heap@JSC@@QAE_NXZ ?isDynamicScope@JSGlobalObject@JSC@@UBE_NXZ ?isGetterSetter@JSCell@JSC@@UBE_NXZ + ?isHostFunction@FunctionBodyNode@JSC@@QBE_NXZ ?isMainThread@WTF@@YA_NXZ ?isVariableObject@JSVariableObject@JSC@@UBE_NXZ - ?jsAPIMangledNumber@JSC@@YA?AVJSValue@1@PAVExecState@1@N@Z ?jsNumberCell@JSC@@YA?AVJSValue@1@PAVExecState@1@N@Z ?jsOwnedString@JSC@@YAPAVJSString@1@PAVJSGlobalData@1@ABVUString@1@@Z ?jsRegExpCompile@@YAPAUJSRegExp@@PB_WHW4JSRegExpIgnoreCaseOption@@W4JSRegExpMultilineOption@@PAIPAPBD@Z ?jsRegExpExecute@@YAHPBUJSRegExp@@PB_WHHPAHH@Z ?jsRegExpFree@@YAXPAUJSRegExp@@@Z ?jsString@JSC@@YAPAVJSString@1@PAVJSGlobalData@1@ABVUString@1@@Z - ?lock@JSLock@JSC@@SAX_N@Z + ?lock@JSLock@JSC@@SAXW4JSLockBehavior@2@@Z ?lock@Mutex@WTF@@QAEXXZ ?lockAtomicallyInitializedStaticMutex@WTF@@YAXXZ ?lookupGetter@JSObject@JSC@@UAE?AVJSValue@2@PAVExecState@2@ABVIdentifier@2@@Z ?lookupSetter@JSObject@JSC@@UAE?AVJSValue@2@PAVExecState@2@ABVIdentifier@2@@Z - ?mark@JSGlobalObject@JSC@@UAEXXZ - ?mark@JSObject@JSC@@UAEXXZ - ?mark@JSWrapperObject@JSC@@UAEXXZ + ?markChildren@JSGlobalObject@JSC@@UAEXAAVMarkStack@2@@Z + ?markChildren@JSObject@JSC@@UAEXAAVMarkStack@2@@Z + ?markChildren@JSWrapperObject@JSC@@UAEXAAVMarkStack@2@@Z ?materializePropertyMap@Structure@JSC@@AAEXXZ ?name@InternalFunction@JSC@@QAEABVUString@2@PAVJSGlobalData@2@@Z - ?nonInlineNaN@JSImmediate@JSC@@CANXZ ?objectCount@Heap@JSC@@QAEIXZ ?objectProtoFuncToString@JSC@@YI?AVJSValue@1@PAVExecState@1@PAVJSObject@1@V21@ABVArgList@1@@Z ?parse@Parser@JSC@@AAEXPAVJSGlobalData@2@PAHPAVUString@2@@Z @@ -188,7 +192,6 @@ EXPORTS ?protectedGlobalObjectCount@Heap@JSC@@QAEIXZ ?protectedObjectCount@Heap@JSC@@QAEIXZ ?protectedObjectTypeCounts@Heap@JSC@@QAEPAV?$HashCountedSet@PBDU?$PtrHash@PBD@WTF@@U?$HashTraits@PBD@2@@WTF@@XZ - ?prototype@JSImmediate@JSC@@CAPAVJSObject@2@VJSValue@2@PAVExecState@2@@Z ?put@JSCell@JSC@@UAEXPAVExecState@2@ABVIdentifier@2@VJSValue@2@AAVPutPropertySlot@2@@Z ?put@JSCell@JSC@@UAEXPAVExecState@2@IVJSValue@2@@Z ?put@JSGlobalObject@JSC@@UAEXPAVExecState@2@ABVIdentifier@2@VJSValue@2@AAVPutPropertySlot@2@@Z @@ -202,6 +205,7 @@ EXPORTS ?putWithAttributes@JSObject@JSC@@UAEXPAVExecState@2@IVJSValue@2@I@Z ?randomNumber@WTF@@YANXZ ?recordExtraCost@Heap@JSC@@AAEXI@Z + ?releaseStack@MarkStack@JSC@@CAXPAXI@Z ?reset@ParserArena@JSC@@QAEXXZ ?reset@TimeoutChecker@JSC@@QAEXXZ ?restoreAll@Profile@JSC@@QAEXXZ @@ -213,7 +217,7 @@ EXPORTS ?setMainThreadCallbacksPaused@WTF@@YAX_N@Z ?setOrderLowerFirst@Collator@WTF@@QAEX_N@Z ?setUpStaticFunctionSlot@JSC@@YAXPAVExecState@1@PBVHashEntry@1@PAVJSObject@1@ABVIdentifier@1@AAVPropertySlot@1@@Z - ?sharedBuffer@BaseString@UString@JSC@@QAEPAV?$CrossThreadRefCounted@V?$OwnFastMallocPtr@_W@WTF@@@WTF@@XZ + ?sharedBuffer@Rep@UString@JSC@@QAEPAV?$CrossThreadRefCounted@V?$OwnFastMallocPtr@_W@WTF@@@WTF@@XZ ?signal@ThreadCondition@WTF@@QAEXXZ ?slowAppend@MarkedArgumentBuffer@JSC@@AAEXVJSValue@2@@Z ?startIgnoringLeaks@Structure@JSC@@SAXXZ @@ -229,17 +233,20 @@ EXPORTS ?timedWait@ThreadCondition@WTF@@QAE_NAAVMutex@2@N@Z ?tlsKeyCount@WTF@@YAAAJXZ ?tlsKeys@WTF@@YAPAKXZ + ?toBoolean@JSAPIValueWrapper@JSC@@UBE_NPAVExecState@2@@Z ?toBoolean@JSObject@JSC@@UBE_NPAVExecState@2@@Z ?toBoolean@JSString@JSC@@EBE_NPAVExecState@2@@Z ?toInt32SlowCase@JSC@@YAHNAA_N@Z + ?toNumber@JSAPIValueWrapper@JSC@@UBENPAVExecState@2@@Z ?toNumber@JSObject@JSC@@UBENPAVExecState@2@@Z ?toNumber@JSString@JSC@@EBENPAVExecState@2@@Z - ?toObject@JSImmediate@JSC@@CAPAVJSObject@2@VJSValue@2@PAVExecState@2@@Z + ?toObject@JSAPIValueWrapper@JSC@@UBEPAVJSObject@2@PAVExecState@2@@Z ?toObject@JSObject@JSC@@UBEPAV12@PAVExecState@2@@Z ?toObject@JSString@JSC@@EBEPAVJSObject@2@PAVExecState@2@@Z + ?toPrimitive@JSAPIValueWrapper@JSC@@UBE?AVJSValue@2@PAVExecState@2@W4PreferredPrimitiveType@2@@Z ?toPrimitive@JSString@JSC@@EBE?AVJSValue@2@PAVExecState@2@W4PreferredPrimitiveType@2@@Z ?toStrictUInt32@UString@JSC@@QBEIPA_N@Z - ?toString@JSImmediate@JSC@@CA?AVUString@2@VJSValue@2@@Z + ?toString@JSAPIValueWrapper@JSC@@UBE?AVUString@2@PAVExecState@2@@Z ?toString@JSObject@JSC@@UBE?AVUString@2@PAVExecState@2@@Z ?toString@JSString@JSC@@EBE?AVUString@2@PAVExecState@2@@Z ?toString@StringObject@JSC@@EBE?AVUString@2@PAVExecState@2@@Z @@ -247,7 +254,6 @@ EXPORTS ?toThisJSString@JSString@JSC@@EAEPAV12@PAVExecState@2@@Z ?toThisJSString@StringObject@JSC@@EAEPAVJSString@2@PAVExecState@2@@Z ?toThisObject@JSCell@JSC@@UBEPAVJSObject@2@PAVExecState@2@@Z - ?toThisObject@JSImmediate@JSC@@CAPAVJSObject@2@VJSValue@2@PAVExecState@2@@Z ?toThisObject@JSObject@JSC@@UBEPAV12@PAVExecState@2@@Z ?toThisObject@JSString@JSC@@EBEPAVJSObject@2@PAVExecState@2@@Z ?toThisString@JSCell@JSC@@UBE?AVUString@2@PAVExecState@2@@Z @@ -259,7 +265,7 @@ EXPORTS ?tryFastCalloc@WTF@@YAPAXII@Z ?tryLock@Mutex@WTF@@QAE_NXZ ?type@DebuggerCallFrame@JSC@@QBE?AW4Type@12@XZ - ?unlock@JSLock@JSC@@SAX_N@Z + ?unlock@JSLock@JSC@@SAXW4JSLockBehavior@2@@Z ?unlock@Mutex@WTF@@QAEXXZ ?unlockAtomicallyInitializedStaticMutex@WTF@@YAXXZ ?unprotect@Heap@JSC@@QAEXVJSValue@2@@Z diff --git a/JavaScriptCore/JavaScriptCore.vcproj/WTF/WTF.vcproj b/JavaScriptCore/JavaScriptCore.vcproj/WTF/WTF.vcproj index d33c322..6ed89e5 100644 --- a/JavaScriptCore/JavaScriptCore.vcproj/WTF/WTF.vcproj +++ b/JavaScriptCore/JavaScriptCore.vcproj/WTF/WTF.vcproj @@ -259,6 +259,14 @@ <File
RelativePath="..\..\wtf\FastMalloc.cpp"
>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ DisableSpecificWarnings="4702"
+ />
+ </FileConfiguration>
</File>
<File
RelativePath="..\..\wtf\FastMalloc.h"
@@ -409,6 +417,10 @@ >
</File>
<File
+ RelativePath="..\..\wtf\SegmentedVector.h"
+ >
+ </File>
+ <File
RelativePath="..\..\wtf\StdLibExtras.h"
>
</File>
diff --git a/JavaScriptCore/JavaScriptCore.vcproj/WTF/WTFCommon.vsprops b/JavaScriptCore/JavaScriptCore.vcproj/WTF/WTFCommon.vsprops index b124b27..20b32f3 100644 --- a/JavaScriptCore/JavaScriptCore.vcproj/WTF/WTFCommon.vsprops +++ b/JavaScriptCore/JavaScriptCore.vcproj/WTF/WTFCommon.vsprops @@ -1,26 +1,26 @@ -<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioPropertySheet
- ProjectType="Visual C++"
- Version="8.00"
- Name="WTFCommon"
- OutputDirectory="$(WebKitOutputDir)\lib"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""$(WebKitOutputDir)\obj\JavaScriptCore\$(ConfigurationName)\DerivedSources\";../../;"../../os-win32/";../../pcre/;../../parser/;../../wtf/;../../wtf/unicode/;"$(WebKitLibrariesDir)\include";"$(WebKitLibrariesDir)\include\icu";../../../icu/include;../../bindings;../../bindings/c;../../bindings/jni;"$(WebKitOutputDir)\include\JavaScriptCore";"$(WebKitLibrariesDir)\include\pthreads""
- PreprocessorDefinitions="__STD_C"
- />
- <Tool
- Name="VCLibrarianTool"
- AdditionalDependencies="user32.lib"
- OutputFile="$(OutDir)\$(ProjectName)$(WebKitConfigSuffix).lib"
- />
- <Tool
- Name="VCPostBuildEventTool"
- CommandLine="if exist "$(WebKitOutputDir)\buildfailed" del "$(WebKitOutputDir)\buildfailed""
- />
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="set PATH=%SystemDrive%\cygwin\bin;%PATH%"
- />
-</VisualStudioPropertySheet>
+<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioPropertySheet + ProjectType="Visual C++" + Version="8.00" + Name="WTFCommon" + OutputDirectory="$(WebKitOutputDir)\lib" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories=""$(WebKitOutputDir)\obj\JavaScriptCore\$(ConfigurationName)\DerivedSources\";../../;"../../os-win32/";../../pcre/;../../parser/;../../wtf/;../../wtf/unicode/;"$(WebKitLibrariesDir)\include";"$(WebKitLibrariesDir)\include\icu";../../../icu/include;../../bindings;../../bindings/c;../../bindings/jni;"$(WebKitOutputDir)\include\JavaScriptCore";"$(WebKitLibrariesDir)\include\pthreads"" + PreprocessorDefinitions="__STD_C" + /> + <Tool + Name="VCLibrarianTool" + AdditionalDependencies="user32.lib" + OutputFile="$(OutDir)\$(ProjectName)$(WebKitConfigSuffix).lib" + /> + <Tool + Name="VCPostBuildEventTool" + CommandLine="if exist "$(WebKitOutputDir)\buildfailed" del "$(WebKitOutputDir)\buildfailed"" + /> + <Tool + Name="VCPreBuildEventTool" + CommandLine="set PATH=%SystemDrive%\cygwin\bin;%PATH%" + /> +</VisualStudioPropertySheet> diff --git a/JavaScriptCore/JavaScriptCore.vcproj/jsc/jscCommon.vsprops b/JavaScriptCore/JavaScriptCore.vcproj/jsc/jscCommon.vsprops index 8fa98b4..3a1e42e 100644 --- a/JavaScriptCore/JavaScriptCore.vcproj/jsc/jscCommon.vsprops +++ b/JavaScriptCore/JavaScriptCore.vcproj/jsc/jscCommon.vsprops @@ -1,25 +1,25 @@ -<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioPropertySheet
- ProjectType="Visual C++"
- Version="8.00"
- Name="jscCommon"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""$(WebKitOutputDir)\include";"$(WebKitOutputDir)\obj\JavaScriptCore\$(ConfigurationName)\DerivedSources\";../../;"../../os-win32/";../../pcre/;../../assembler/;../../wrec/;../../parser/;../../runtime/;../../VM/;../../bytecode/;../../interpreter/;../../wtf/;../../debugger/;../../bytecompiler/;../../profiler;"$(WebKitLibrariesDir)\include\icu";"$(WebKitLibrariesDir)\include\pthreads";../../../icu/include;"$(WebKitLibrariesDir)\include";../../jit/"
- PreprocessorDefinitions="__STD_C"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="JavaScriptCore$(WebKitDLLConfigSuffix).lib WTF$(WebKitConfigSuffix).lib icuin$(LibraryConfigSuffix).lib icuuc$(LibraryConfigSuffix).lib winmm.lib pthreadVC2$(LibraryConfigSuffix).lib user32.lib"
- SubSystem="1"
- />
- <Tool
- Name="VCPostBuildEventTool"
- CommandLine="if exist "$(WebKitOutputDir)\buildfailed" del "$(WebKitOutputDir)\buildfailed"

mkdir 2>NUL "$(WebKitOutputDir)\bin"
if exist "$(WebKitLibrariesDir)\bin\icudt40.dll" xcopy /y /d "$(WebKitLibrariesDir)\bin\icudt40.dll" "$(WebKitOutputDir)\bin"
if exist "$(WebKitLibrariesDir)\bin\icudt40$(LibraryConfigSuffix).dll" xcopy /y /d "$(WebKitLibrariesDir)\bin\icudt40$(LibraryConfigSuffix).dll" "$(WebKitOutputDir)\bin"
if exist "$(WebKitLibrariesDir)\bin\icuin40$(LibraryConfigSuffix).dll" xcopy /y /d "$(WebKitLibrariesDir)\bin\icuin40$(LibraryConfigSuffix).dll" "$(WebKitOutputDir)\bin"
if exist "$(WebKitLibrariesDir)\bin\icuuc40$(LibraryConfigSuffix).dll" xcopy /y /d "$(WebKitLibrariesDir)\bin\icuuc40$(LibraryConfigSuffix).dll" "$(WebKitOutputDir)\bin"
if exist "$(WebKitLibrariesDir)\bin\CoreFoundation$(LibraryConfigSuffix).dll" xcopy /y /d "$(WebKitLibrariesDir)\bin\CoreFoundation$(LibraryConfigSuffix).dll" "$(WebKitOutputDir)\bin"
if exist "$(WebKitLibrariesDir)\bin\CoreFoundation.resources" xcopy /y /d /e /i "$(WebKitLibrariesDir)\bin\CoreFoundation.resources" "$(WebKitOutputDir)\bin\CoreFoundation.resources"
if exist "$(WebKitLibrariesDir)\bin\pthreadVC2$(LibraryConfigSuffix).dll" xcopy /y /d "$(WebKitLibrariesDir)\bin\pthreadVC2$(LibraryConfigSuffix).dll" "$(WebKitOutputDir)\bin"
if exist "$(WebKitLibrariesDir)\bin\objc$(LibraryConfigSuffix).dll" xcopy /y /d "$(WebKitLibrariesDir)\bin\objc$(LibraryConfigSuffix).dll" "$(WebKitOutputDir)\bin"
if exist "$(WebKitLibrariesDir)\bin\ASL$(LibraryConfigSuffix).dll" xcopy /y /d "$(WebKitLibrariesDir)\bin\ASL$(LibraryConfigSuffix).dll" "$(WebKitOutputDir)\bin"

cmd /c
"
- />
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="set PATH=%SystemDrive%\cygwin\bin;%PATH%
if exist "$(WebKitOutputDir)\buildfailed" grep XX$(ProjectName)XX "$(WebKitOutputDir)\buildfailed"
if errorlevel 1 exit 1
echo XX$(ProjectName)XX > "$(WebKitOutputDir)\buildfailed"
"
- />
-</VisualStudioPropertySheet>
+<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioPropertySheet + ProjectType="Visual C++" + Version="8.00" + Name="jscCommon" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories=""$(WebKitOutputDir)\include";"$(WebKitOutputDir)\obj\JavaScriptCore\$(ConfigurationName)\DerivedSources\";../../;"../../os-win32/";../../pcre/;../../assembler/;../../wrec/;../../parser/;../../runtime/;../../VM/;../../bytecode/;../../interpreter/;../../wtf/;../../debugger/;../../bytecompiler/;../../profiler;"$(WebKitLibrariesDir)\include\icu";"$(WebKitLibrariesDir)\include\pthreads";../../../icu/include;"$(WebKitLibrariesDir)\include";../../jit/" + PreprocessorDefinitions="__STD_C" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="JavaScriptCore$(WebKitDLLConfigSuffix).lib WTF$(WebKitConfigSuffix).lib icuin$(LibraryConfigSuffix).lib icuuc$(LibraryConfigSuffix).lib winmm.lib pthreadVC2$(LibraryConfigSuffix).lib user32.lib" + SubSystem="1" + /> + <Tool + Name="VCPostBuildEventTool" + CommandLine="if exist "$(WebKitOutputDir)\buildfailed" del "$(WebKitOutputDir)\buildfailed"

mkdir 2>NUL "$(WebKitOutputDir)\bin"
if exist "$(WebKitLibrariesDir)\bin\icudt40.dll" xcopy /y /d "$(WebKitLibrariesDir)\bin\icudt40.dll" "$(WebKitOutputDir)\bin"
if exist "$(WebKitLibrariesDir)\bin\icudt40$(LibraryConfigSuffix).dll" xcopy /y /d "$(WebKitLibrariesDir)\bin\icudt40$(LibraryConfigSuffix).dll" "$(WebKitOutputDir)\bin"
if exist "$(WebKitLibrariesDir)\bin\icuin40$(LibraryConfigSuffix).dll" xcopy /y /d "$(WebKitLibrariesDir)\bin\icuin40$(LibraryConfigSuffix).dll" "$(WebKitOutputDir)\bin"
if exist "$(WebKitLibrariesDir)\bin\icuuc40$(LibraryConfigSuffix).dll" xcopy /y /d "$(WebKitLibrariesDir)\bin\icuuc40$(LibraryConfigSuffix).dll" "$(WebKitOutputDir)\bin"
if exist "$(WebKitLibrariesDir)\bin\CoreFoundation$(LibraryConfigSuffix).dll" xcopy /y /d "$(WebKitLibrariesDir)\bin\CoreFoundation$(LibraryConfigSuffix).dll" "$(WebKitOutputDir)\bin"
if exist "$(WebKitLibrariesDir)\bin\CoreFoundation.resources" xcopy /y /d /e /i "$(WebKitLibrariesDir)\bin\CoreFoundation.resources" "$(WebKitOutputDir)\bin\CoreFoundation.resources"
if exist "$(WebKitLibrariesDir)\bin\pthreadVC2$(LibraryConfigSuffix).dll" xcopy /y /d "$(WebKitLibrariesDir)\bin\pthreadVC2$(LibraryConfigSuffix).dll" "$(WebKitOutputDir)\bin"
if exist "$(WebKitLibrariesDir)\bin\objc$(LibraryConfigSuffix).dll" xcopy /y /d "$(WebKitLibrariesDir)\bin\objc$(LibraryConfigSuffix).dll" "$(WebKitOutputDir)\bin"
if exist "$(WebKitLibrariesDir)\bin\ASL$(LibraryConfigSuffix).dll" xcopy /y /d "$(WebKitLibrariesDir)\bin\ASL$(LibraryConfigSuffix).dll" "$(WebKitOutputDir)\bin"

cmd /c
" + /> + <Tool + Name="VCPreBuildEventTool" + CommandLine="set PATH=%SystemDrive%\cygwin\bin;%PATH%
if exist "$(WebKitOutputDir)\buildfailed" grep XX$(ProjectName)XX "$(WebKitOutputDir)\buildfailed"
if errorlevel 1 exit 1
echo XX$(ProjectName)XX > "$(WebKitOutputDir)\buildfailed"
" + /> +</VisualStudioPropertySheet> diff --git a/JavaScriptCore/JavaScriptCore.vcproj/testapi/testapiCommon.vsprops b/JavaScriptCore/JavaScriptCore.vcproj/testapi/testapiCommon.vsprops index af17f27..2a36c18 100644 --- a/JavaScriptCore/JavaScriptCore.vcproj/testapi/testapiCommon.vsprops +++ b/JavaScriptCore/JavaScriptCore.vcproj/testapi/testapiCommon.vsprops @@ -1,26 +1,26 @@ -<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioPropertySheet
- ProjectType="Visual C++"
- Version="8.00"
- Name="testapiCommon"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""$(ProjectDir)\..\..\API";"$(WebKitOutputDir)\include\WebCore\ForwardingHeaders";"$(WebKitOutputDir)\include\JavaScriptCore";"$(WebKitOutputDir)\include";"$(WebKitLibrariesDir)\include";"$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders";"$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders\GNUCompatibility""
- WarningLevel="4"
- Detect64BitPortabilityProblems="true"
- />
- <Tool
- Name="VCLinkerTool"
- AdditionalDependencies="JavaScriptCore$(WebKitDLLConfigSuffix).lib WTF$(WebKitConfigSuffix).lib CoreFoundation$(LibraryConfigSuffix).lib pthreadVC2$(LibraryConfigSuffix).lib icuin$(LibraryConfigSuffix).lib icuuc$(LibraryConfigSuffix).lib"
- SubSystem="1"
- />
- <Tool
- Name="VCPostBuildEventTool"
- CommandLine="if exist "$(WebKitOutputDir)\buildfailed" del "$(WebKitOutputDir)\buildfailed"

xcopy /y /d "$(ProjectDir)\..\..\API\tests\testapi.js" "$(OutDir)""
- />
- <Tool
- Name="VCPreBuildEventTool"
- CommandLine="set PATH=%SystemDrive%\cygwin\bin;%PATH%
if exist "$(WebKitOutputDir)\buildfailed" grep XX$(ProjectName)XX "$(WebKitOutputDir)\buildfailed"
if errorlevel 1 exit 1
echo XX$(ProjectName)XX > "$(WebKitOutputDir)\buildfailed"
"
- />
-</VisualStudioPropertySheet>
+<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioPropertySheet + ProjectType="Visual C++" + Version="8.00" + Name="testapiCommon" + > + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories=""$(ProjectDir)\..\..\API";"$(WebKitOutputDir)\include\WebCore\ForwardingHeaders";"$(WebKitOutputDir)\include\JavaScriptCore";"$(WebKitOutputDir)\include\private\JavaScriptCore";"$(WebKitOutputDir)\include";"$(WebKitOutputDir)\include\private";"$(WebKitLibrariesDir)\include";"$(WebKitLibrariesDir)\nclude\private";"$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders";"$(WebKitLibrariesDir)\Include\CoreFoundation\OSXCompatibilityHeaders\GNUCompatibility"" + WarningLevel="4" + Detect64BitPortabilityProblems="true" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="JavaScriptCore$(WebKitDLLConfigSuffix).lib WTF$(WebKitConfigSuffix).lib CoreFoundation$(LibraryConfigSuffix).lib pthreadVC2$(LibraryConfigSuffix).lib icuin$(LibraryConfigSuffix).lib icuuc$(LibraryConfigSuffix).lib" + SubSystem="1" + /> + <Tool + Name="VCPostBuildEventTool" + CommandLine="if exist "$(WebKitOutputDir)\buildfailed" del "$(WebKitOutputDir)\buildfailed"

xcopy /y /d "$(ProjectDir)\..\..\API\tests\testapi.js" "$(OutDir)"
" + /> + <Tool + Name="VCPreBuildEventTool" + CommandLine="set PATH=%SystemDrive%\cygwin\bin;%PATH%
if exist "$(WebKitOutputDir)\buildfailed" grep XX$(ProjectName)XX "$(WebKitOutputDir)\buildfailed"
if errorlevel 1 exit 1
echo XX$(ProjectName)XX > "$(WebKitOutputDir)\buildfailed"
" + /> +</VisualStudioPropertySheet> diff --git a/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj b/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj index 8e3eb2e..6c3d49f 100644 --- a/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj +++ b/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj @@ -119,6 +119,7 @@ 7E4EE7090EBB7963005934AA /* StructureChain.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E4EE7080EBB7963005934AA /* StructureChain.h */; settings = {ATTRIBUTES = (Private, ); }; }; 7E4EE70F0EBB7A5B005934AA /* StructureChain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7E4EE70E0EBB7A5B005934AA /* StructureChain.cpp */; }; 7EFF00640EC05A9A00AA7C93 /* NodeInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 7EFF00630EC05A9A00AA7C93 /* NodeInfo.h */; }; + 840480131021A1D9008E7F01 /* JSAPIValueWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0894D60FAFBA2D00001865 /* JSAPIValueWrapper.h */; settings = {ATTRIBUTES = (Private, ); }; }; 860161E30F3A83C100F84710 /* AbstractMacroAssembler.h in Headers */ = {isa = PBXBuildFile; fileRef = 860161DF0F3A83C100F84710 /* AbstractMacroAssembler.h */; }; 860161E40F3A83C100F84710 /* MacroAssemblerX86.h in Headers */ = {isa = PBXBuildFile; fileRef = 860161E00F3A83C100F84710 /* MacroAssemblerX86.h */; }; 860161E50F3A83C100F84710 /* MacroAssemblerX86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = 860161E10F3A83C100F84710 /* MacroAssemblerX86_64.h */; }; @@ -135,7 +136,14 @@ 86CC85A30EE79B7400288682 /* JITCall.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 86CC85A20EE79B7400288682 /* JITCall.cpp */; }; 86CC85C40EE7A89400288682 /* JITPropertyAccess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 86CC85C30EE7A89400288682 /* JITPropertyAccess.cpp */; }; 86CCEFDE0F413F8900FD7F9E /* JITCode.h in Headers */ = {isa = PBXBuildFile; fileRef = 86CCEFDD0F413F8900FD7F9E /* JITCode.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 86D3B2C310156BDE002865E7 /* ARMAssembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 86D3B2BF10156BDE002865E7 /* ARMAssembler.cpp */; }; + 86D3B2C410156BDE002865E7 /* ARMAssembler.h in Headers */ = {isa = PBXBuildFile; fileRef = 86D3B2C010156BDE002865E7 /* ARMAssembler.h */; }; + 86D3B2C510156BDE002865E7 /* AssemblerBufferWithConstantPool.h in Headers */ = {isa = PBXBuildFile; fileRef = 86D3B2C110156BDE002865E7 /* AssemblerBufferWithConstantPool.h */; }; + 86D3B2C610156BDE002865E7 /* MacroAssemblerARM.h in Headers */ = {isa = PBXBuildFile; fileRef = 86D3B2C210156BDE002865E7 /* MacroAssemblerARM.h */; }; + 86D3B3C310159D7F002865E7 /* LinkBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 86D3B3C110159D7F002865E7 /* LinkBuffer.h */; }; + 86D3B3C410159D7F002865E7 /* RepatchBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 86D3B3C210159D7F002865E7 /* RepatchBuffer.h */; }; 86DB64640F95C6FC00D7D921 /* ExecutableAllocatorFixedVMPool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 86DB64630F95C6FC00D7D921 /* ExecutableAllocatorFixedVMPool.cpp */; }; + 86E116B10FE75AC800B512BC /* CodeLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = 86E116B00FE75AC800B512BC /* CodeLocation.h */; }; 86EAC4950F93E8D1008EC948 /* RegexCompiler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 86EAC48D0F93E8D1008EC948 /* RegexCompiler.cpp */; }; 86EAC4960F93E8D1008EC948 /* RegexCompiler.h in Headers */ = {isa = PBXBuildFile; fileRef = 86EAC48E0F93E8D1008EC948 /* RegexCompiler.h */; }; 86EAC4970F93E8D1008EC948 /* RegexInterpreter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 86EAC48F0F93E8D1008EC948 /* RegexInterpreter.cpp */; }; @@ -188,16 +196,22 @@ A72700900DAC6BBC00E548D7 /* JSNotAnObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A72700780DAC605600E548D7 /* JSNotAnObject.cpp */; }; A72701B90DADE94900E548D7 /* ExceptionHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = A72701B30DADE94900E548D7 /* ExceptionHelpers.h */; }; A727FF6B0DA3092200E548D7 /* JSPropertyNameIterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A727FF660DA3053B00E548D7 /* JSPropertyNameIterator.cpp */; }; + A74B3499102A5F8E0032AB98 /* MarkStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A74B3498102A5F8E0032AB98 /* MarkStack.cpp */; }; A766B44F0EE8DCD1009518CA /* ExecutableAllocator.h in Headers */ = {isa = PBXBuildFile; fileRef = A7B48DB50EE74CFC00DCBDB6 /* ExecutableAllocator.h */; settings = {ATTRIBUTES = (Private, ); }; }; A76EE6590FAE59D5003F069A /* NativeFunctionWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = A76EE6580FAE59D5003F069A /* NativeFunctionWrapper.h */; settings = {ATTRIBUTES = (Private, ); }; }; + A7795590101A74D500114E55 /* MarkStack.h in Headers */ = {isa = PBXBuildFile; fileRef = A779558F101A74D500114E55 /* MarkStack.h */; settings = {ATTRIBUTES = (Private, ); }; }; A782F1A50EEC9FA20036273F /* ExecutableAllocatorPosix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A782F1A40EEC9FA20036273F /* ExecutableAllocatorPosix.cpp */; }; A791EF280F11E07900AE1F68 /* JSByteArray.h in Headers */ = {isa = PBXBuildFile; fileRef = A791EF260F11E07900AE1F68 /* JSByteArray.h */; settings = {ATTRIBUTES = (Private, ); }; }; A791EF290F11E07900AE1F68 /* JSByteArray.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A791EF270F11E07900AE1F68 /* JSByteArray.cpp */; }; A7A1F7AC0F252B3C00E184E2 /* ByteArray.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7A1F7AA0F252B3C00E184E2 /* ByteArray.cpp */; }; A7A1F7AD0F252B3C00E184E2 /* ByteArray.h in Headers */ = {isa = PBXBuildFile; fileRef = A7A1F7AB0F252B3C00E184E2 /* ByteArray.h */; settings = {ATTRIBUTES = (Private, ); }; }; A7B48F490EE8936F00DCBDB6 /* ExecutableAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7B48DB60EE74CFC00DCBDB6 /* ExecutableAllocator.cpp */; }; + A7C530E4102A3813005BC741 /* MarkStackPosix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7C530E3102A3813005BC741 /* MarkStackPosix.cpp */; }; A7E2EA6B0FB460CF00601F06 /* LiteralParser.h in Headers */ = {isa = PBXBuildFile; fileRef = A7E2EA690FB460CF00601F06 /* LiteralParser.h */; }; A7E2EA6C0FB460CF00601F06 /* LiteralParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7E2EA6A0FB460CF00601F06 /* LiteralParser.cpp */; }; + A7F9935F0FD7325100A0B2D0 /* JSONObject.h in Headers */ = {isa = PBXBuildFile; fileRef = A7F9935D0FD7325100A0B2D0 /* JSONObject.h */; }; + A7F993600FD7325100A0B2D0 /* JSONObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7F9935E0FD7325100A0B2D0 /* JSONObject.cpp */; }; + A7F9949B0FD746A300A0B2D0 /* JSONObject.lut.h in Headers */ = {isa = PBXBuildFile; fileRef = A7F9949A0FD746A300A0B2D0 /* JSONObject.lut.h */; }; BC02E90D0E1839DB000F9297 /* ErrorConstructor.h in Headers */ = {isa = PBXBuildFile; fileRef = BC02E9050E1839DB000F9297 /* ErrorConstructor.h */; }; BC02E90F0E1839DB000F9297 /* ErrorPrototype.h in Headers */ = {isa = PBXBuildFile; fileRef = BC02E9070E1839DB000F9297 /* ErrorPrototype.h */; }; BC02E9110E1839DB000F9297 /* NativeErrorConstructor.h in Headers */ = {isa = PBXBuildFile; fileRef = BC02E9090E1839DB000F9297 /* NativeErrorConstructor.h */; }; @@ -636,8 +650,15 @@ 86CC85A20EE79B7400288682 /* JITCall.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JITCall.cpp; sourceTree = "<group>"; }; 86CC85C30EE7A89400288682 /* JITPropertyAccess.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JITPropertyAccess.cpp; sourceTree = "<group>"; }; 86CCEFDD0F413F8900FD7F9E /* JITCode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JITCode.h; sourceTree = "<group>"; }; + 86D3B2BF10156BDE002865E7 /* ARMAssembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ARMAssembler.cpp; sourceTree = "<group>"; }; + 86D3B2C010156BDE002865E7 /* ARMAssembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARMAssembler.h; sourceTree = "<group>"; }; + 86D3B2C110156BDE002865E7 /* AssemblerBufferWithConstantPool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AssemblerBufferWithConstantPool.h; sourceTree = "<group>"; }; + 86D3B2C210156BDE002865E7 /* MacroAssemblerARM.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MacroAssemblerARM.h; sourceTree = "<group>"; }; + 86D3B3C110159D7F002865E7 /* LinkBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LinkBuffer.h; sourceTree = "<group>"; }; + 86D3B3C210159D7F002865E7 /* RepatchBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RepatchBuffer.h; sourceTree = "<group>"; }; 86DB645F0F954E9100D7D921 /* ExecutableAllocatorWin.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ExecutableAllocatorWin.cpp; sourceTree = "<group>"; }; 86DB64630F95C6FC00D7D921 /* ExecutableAllocatorFixedVMPool.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ExecutableAllocatorFixedVMPool.cpp; sourceTree = "<group>"; }; + 86E116B00FE75AC800B512BC /* CodeLocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CodeLocation.h; sourceTree = "<group>"; }; 86EAC48D0F93E8D1008EC948 /* RegexCompiler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RegexCompiler.cpp; path = yarr/RegexCompiler.cpp; sourceTree = "<group>"; }; 86EAC48E0F93E8D1008EC948 /* RegexCompiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RegexCompiler.h; path = yarr/RegexCompiler.h; sourceTree = "<group>"; }; 86EAC48F0F93E8D1008EC948 /* RegexInterpreter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RegexInterpreter.cpp; path = yarr/RegexInterpreter.cpp; sourceTree = "<group>"; }; @@ -720,7 +741,9 @@ A72701B30DADE94900E548D7 /* ExceptionHelpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExceptionHelpers.h; sourceTree = "<group>"; }; A727FF650DA3053B00E548D7 /* JSPropertyNameIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPropertyNameIterator.h; sourceTree = "<group>"; }; A727FF660DA3053B00E548D7 /* JSPropertyNameIterator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPropertyNameIterator.cpp; sourceTree = "<group>"; }; + A74B3498102A5F8E0032AB98 /* MarkStack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MarkStack.cpp; sourceTree = "<group>"; }; A76EE6580FAE59D5003F069A /* NativeFunctionWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NativeFunctionWrapper.h; sourceTree = "<group>"; }; + A779558F101A74D500114E55 /* MarkStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MarkStack.h; sourceTree = "<group>"; }; A782F1A40EEC9FA20036273F /* ExecutableAllocatorPosix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ExecutableAllocatorPosix.cpp; sourceTree = "<group>"; }; A791EF260F11E07900AE1F68 /* JSByteArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSByteArray.h; sourceTree = "<group>"; }; A791EF270F11E07900AE1F68 /* JSByteArray.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSByteArray.cpp; sourceTree = "<group>"; }; @@ -728,12 +751,16 @@ A7A1F7AB0F252B3C00E184E2 /* ByteArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ByteArray.h; sourceTree = "<group>"; }; A7B48DB50EE74CFC00DCBDB6 /* ExecutableAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExecutableAllocator.h; sourceTree = "<group>"; }; A7B48DB60EE74CFC00DCBDB6 /* ExecutableAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ExecutableAllocator.cpp; sourceTree = "<group>"; }; + A7C530E3102A3813005BC741 /* MarkStackPosix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MarkStackPosix.cpp; sourceTree = "<group>"; }; A7E2EA690FB460CF00601F06 /* LiteralParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LiteralParser.h; sourceTree = "<group>"; }; A7E2EA6A0FB460CF00601F06 /* LiteralParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LiteralParser.cpp; sourceTree = "<group>"; }; A7E42C180E3938830065A544 /* JSStaticScopeObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSStaticScopeObject.h; sourceTree = "<group>"; }; A7E42C190E3938830065A544 /* JSStaticScopeObject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSStaticScopeObject.cpp; sourceTree = "<group>"; }; A7F8690E0F9584A100558697 /* CachedCall.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CachedCall.h; sourceTree = "<group>"; }; A7F869EC0F95C2EC00558697 /* CallFrameClosure.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CallFrameClosure.h; sourceTree = "<group>"; }; + A7F9935D0FD7325100A0B2D0 /* JSONObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSONObject.h; sourceTree = "<group>"; }; + A7F9935E0FD7325100A0B2D0 /* JSONObject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSONObject.cpp; sourceTree = "<group>"; }; + A7F9949A0FD746A300A0B2D0 /* JSONObject.lut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JSONObject.lut.h; path = /Users/oliver/builds/Debug/DerivedSources/JavaScriptCore/JSONObject.lut.h; sourceTree = "<absolute>"; }; A8E894310CD0602400367179 /* JSCallbackObjectFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSCallbackObjectFunctions.h; sourceTree = "<group>"; }; A8E894330CD0603F00367179 /* JSGlobalObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSGlobalObject.h; sourceTree = "<group>"; }; BC02E9040E1839DB000F9297 /* ErrorConstructor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ErrorConstructor.cpp; sourceTree = "<group>"; }; @@ -749,6 +776,8 @@ BC02E9B60E1842FA000F9297 /* JSString.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSString.cpp; sourceTree = "<group>"; }; BC02E9B80E184545000F9297 /* GetterSetter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GetterSetter.cpp; sourceTree = "<group>"; }; BC02E9B90E184580000F9297 /* JSNumberCell.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSNumberCell.cpp; sourceTree = "<group>"; }; + BC0894D50FAFBA2D00001865 /* JSAPIValueWrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JSAPIValueWrapper.cpp; path = ../runtime/JSAPIValueWrapper.cpp; sourceTree = "<group>"; }; + BC0894D60FAFBA2D00001865 /* JSAPIValueWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JSAPIValueWrapper.h; path = ../runtime/JSAPIValueWrapper.h; sourceTree = "<group>"; }; BC1166000E1997B1008066DD /* DateInstance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DateInstance.cpp; sourceTree = "<group>"; }; BC1166010E1997B1008066DD /* DateInstance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DateInstance.h; sourceTree = "<group>"; }; BC11667A0E199C05008066DD /* InternalFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InternalFunction.h; sourceTree = "<group>"; }; @@ -1038,12 +1067,12 @@ A782F1A40EEC9FA20036273F /* ExecutableAllocatorPosix.cpp */, 86DB645F0F954E9100D7D921 /* ExecutableAllocatorWin.cpp */, 1429D92D0ED22D7000B89619 /* JIT.cpp */, - BCDD51E90FB8DF74004A8BDC /* JITOpcodes.cpp */, 1429D92E0ED22D7000B89619 /* JIT.h */, 86A90ECF0EE7D51F00AB350D /* JITArithmetic.cpp */, 86CC85A20EE79B7400288682 /* JITCall.cpp */, 86CCEFDD0F413F8900FD7F9E /* JITCode.h */, 86CC85A00EE79A4700288682 /* JITInlineMethods.h */, + BCDD51E90FB8DF74004A8BDC /* JITOpcodes.cpp */, 86CC85C30EE7A89400288682 /* JITPropertyAccess.cpp */, 960626950FB8EC02009798AB /* JITStubCall.h */, 14A23D6C0F4E19CE0023CDAD /* JITStubs.cpp */, @@ -1056,6 +1085,10 @@ isa = PBXGroup; children = ( 1482B78A0A4305AB00517CFC /* APICast.h */, + 1CAA8B4A0D32C39A0041BCFF /* JavaScript.h */, + 1CAA8B4B0D32C39A0041BCFF /* JavaScriptCore.h */, + BC0894D50FAFBA2D00001865 /* JSAPIValueWrapper.cpp */, + BC0894D60FAFBA2D00001865 /* JSAPIValueWrapper.h */, 1421359A0A677F4F00A8195E /* JSBase.cpp */, 142711380A460BBB0080EEEA /* JSBase.h */, 140D17D60E8AD4A9000CD17D /* JSBasePrivate.h */, @@ -1081,8 +1114,6 @@ 146AAB2A0B66A84900E55F16 /* JSStringRefCF.h */, 14BD5A2B0A3E91F600BAF59C /* JSValueRef.cpp */, 1482B6EA0A4300B300517CFC /* JSValueRef.h */, - 1CAA8B4A0D32C39A0041BCFF /* JavaScript.h */, - 1CAA8B4B0D32C39A0041BCFF /* JavaScriptCore.h */, E124A8F60E555775003091F1 /* OpaqueJSString.cpp */, E124A8F50E555775003091F1 /* OpaqueJSString.h */, 5DE3D0F40DD8DDFB00468714 /* WebKitAvailability.h */, @@ -1099,12 +1130,12 @@ 1440F6410A4F8B6A0005F061 /* JSNode.h */, 144007560A5370D20005F061 /* JSNodeList.c */, 144007550A5370D20005F061 /* JSNodeList.h */, + 141211020A48780900480255 /* minidom.c */, + 1412110D0A48788700480255 /* minidom.js */, 144005200A531D3B0005F061 /* Node.c */, 1440051F0A531D3B0005F061 /* Node.h */, 144007490A536CC20005F061 /* NodeList.c */, 144007480A536CC20005F061 /* NodeList.h */, - 141211020A48780900480255 /* minidom.c */, - 1412110D0A48788700480255 /* minidom.js */, ); name = minidom; path = API; @@ -1115,10 +1146,10 @@ children = ( F692A8580255597D01FF60F7 /* Debugger.cpp */, F692A8590255597D01FF60F7 /* Debugger.h */, - 149559ED0DDCDDF700648087 /* DebuggerCallFrame.cpp */, - 1480DB9B0DDC227F003CFDF2 /* DebuggerCallFrame.h */, BC3135630F302FA3003DFD3A /* DebuggerActivation.cpp */, BC3135620F302FA3003DFD3A /* DebuggerActivation.h */, + 149559ED0DDCDDF700648087 /* DebuggerCallFrame.cpp */, + 1480DB9B0DDC227F003CFDF2 /* DebuggerCallFrame.h */, ); path = debugger; sourceTree = "<group>"; @@ -1141,17 +1172,18 @@ isa = PBXGroup; children = ( BC18C5230E16FC8A00B34460 /* ArrayPrototype.lut.h */, + 65B174BE09D1000200820339 /* chartables.c */, BCD203E70E1718F4002C7E82 /* DatePrototype.lut.h */, + 65FB3F4809D11B2400F49DEB /* grammar.cpp */, + BC18C52F0E16FCEB00B34460 /* grammar.h */, + A7F9949A0FD746A300A0B2D0 /* JSONObject.lut.h */, + BC18C52D0E16FCE100B34460 /* lexer.lut.h */, BC18C5290E16FCC200B34460 /* MathObject.lut.h */, BC2680E60E16D52300A06E92 /* NumberConstructor.lut.h */, BCD202D50E170708002C7E82 /* RegExpConstructor.lut.h */, BC18C52B0E16FCD200B34460 /* RegExpObject.lut.h */, BC18C5250E16FCA700B34460 /* StringPrototype.lut.h */, 5D53727D0E1C55EC0021E549 /* TracingDtrace.h */, - 65B174BE09D1000200820339 /* chartables.c */, - 65FB3F4809D11B2400F49DEB /* grammar.cpp */, - BC18C52F0E16FCEB00B34460 /* grammar.h */, - BC18C52D0E16FCE100B34460 /* lexer.lut.h */, ); name = "Derived Sources"; path = DerivedSources/JavaScriptCore; @@ -1162,6 +1194,8 @@ 65162EF108E6A21C007556CD /* wtf */ = { isa = PBXGroup; children = ( + 06D358A00DAAD9C4003B174E /* mac */, + E195678D09E7CF1200B89D13 /* unicode */, 93AA4F770957251F0084B3A7 /* AlwaysInline.h */, 938C4F690CA06BC700D9310A /* ASCIICType.h */, 65E217B808E7EECC0023E5F6 /* Assertions.cpp */, @@ -1194,7 +1228,6 @@ 657EB7450B708F540063461B /* ListHashSet.h */, 148A1626095D16BB00666D0D /* ListRefPtr.h */, E1EE79270D6C964500FEA3BA /* Locker.h */, - 06D358A00DAAD9C4003B174E /* mac */, 06D358A20DAAD9C4003B174E /* MainThread.cpp */, 06D358A30DAAD9C4003B174E /* MainThread.h */, 5DBD18AF0C5401A700C15EAE /* MallocZoneSupport.h */, @@ -1219,6 +1252,7 @@ 65C647B3093EF8D60022C380 /* RefPtr.h */, 148A1ECD0D10C23B0069A47C /* RefPtrHashMap.h */, 51F648D60BB4E2CA0033D760 /* RetainPtr.h */, + 969A07290ED1CE6900F1F681 /* SegmentedVector.h */, FE1B44790ECCD73B004F4DD1 /* StdLibExtras.h */, E11D51750B2E798D0056C188 /* StringExtras.h */, 5DA479650CFBCF56009328A0 /* TCPackedCache.h */, @@ -1232,7 +1266,6 @@ E1B7C8BD0DA3A3360074B0DC /* ThreadSpecific.h */, 0B330C260F38C62300692DE3 /* TypeTraits.cpp */, 0B4D7E620F319AC800AD7E58 /* TypeTraits.h */, - E195678D09E7CF1200B89D13 /* unicode */, 935AF46B09E9D9DB00ACD1D8 /* UnusedParam.h */, 6592C316098B7DE10003D4F6 /* Vector.h */, 6592C317098B7DE10003D4F6 /* VectorTraits.h */, @@ -1268,7 +1301,6 @@ 969A07270ED1CE6900F1F681 /* Label.h */, 960097A50EBABB58007A7297 /* LabelScope.h */, 969A07280ED1CE6900F1F681 /* RegisterID.h */, - 969A07290ED1CE6900F1F681 /* SegmentedVector.h */, ); path = bytecompiler; sourceTree = "<group>"; @@ -1327,10 +1359,10 @@ BC8F3CCF0DAF17BA00577A80 /* ConstructData.h */, BCD203450E17135E002C7E82 /* DateConstructor.cpp */, BCD203460E17135E002C7E82 /* DateConstructor.h */, - BC1166000E1997B1008066DD /* DateInstance.cpp */, - BC1166010E1997B1008066DD /* DateInstance.h */, D21202280AD4310C00ED79B6 /* DateConversion.cpp */, D21202290AD4310C00ED79B6 /* DateConversion.h */, + BC1166000E1997B1008066DD /* DateInstance.cpp */, + BC1166010E1997B1008066DD /* DateInstance.h */, BCD203470E17135E002C7E82 /* DatePrototype.cpp */, BCD203480E17135E002C7E82 /* DatePrototype.h */, BC337BEA0E1B00CB0076918A /* Error.cpp */, @@ -1383,6 +1415,8 @@ BC7F8FB80E19D1C3008632C0 /* JSNumberCell.h */, BC22A3980E16E14800AF21C8 /* JSObject.cpp */, BC22A3990E16E14800AF21C8 /* JSObject.h */, + A7F9935E0FD7325100A0B2D0 /* JSONObject.cpp */, + A7F9935D0FD7325100A0B2D0 /* JSONObject.h */, A727FF660DA3053B00E548D7 /* JSPropertyNameIterator.cpp */, A727FF650DA3053B00E548D7 /* JSPropertyNameIterator.h */, A7E42C190E3938830065A544 /* JSStaticScopeObject.cpp */, @@ -1396,8 +1430,8 @@ 14F252560D08DD8D004ECFFF /* JSVariableObject.h */, 65C7A1710A8EAACB00FA37EA /* JSWrapperObject.cpp */, 65C7A1720A8EAACB00FA37EA /* JSWrapperObject.h */, - A7E2EA690FB460CF00601F06 /* LiteralParser.h */, A7E2EA6A0FB460CF00601F06 /* LiteralParser.cpp */, + A7E2EA690FB460CF00601F06 /* LiteralParser.h */, F692A8680255597D01FF60F7 /* Lookup.cpp */, F692A8690255597D01FF60F7 /* Lookup.h */, F692A86A0255597D01FF60F7 /* MathObject.cpp */, @@ -1462,6 +1496,9 @@ 6507D2970E871E4A00D7D896 /* TypeInfo.h */, F692A8850255597D01FF60F7 /* UString.cpp */, F692A8860255597D01FF60F7 /* UString.h */, + A779558F101A74D500114E55 /* MarkStack.h */, + A7C530E3102A3813005BC741 /* MarkStackPosix.cpp */, + A74B3498102A5F8E0032AB98 /* MarkStack.cpp */, ); path = runtime; sourceTree = "<group>"; @@ -1535,14 +1572,21 @@ isa = PBXGroup; children = ( 860161DF0F3A83C100F84710 /* AbstractMacroAssembler.h */, + 86D3B2BF10156BDE002865E7 /* ARMAssembler.cpp */, + 86D3B2C010156BDE002865E7 /* ARMAssembler.h */, 86ADD1430FDDEA980006EEC2 /* ARMv7Assembler.h */, 9688CB130ED12B4E001D649F /* AssemblerBuffer.h */, - 863B23DF0FC60E6200703AA4 /* MacroAssemblerCodeRef.h */, + 86D3B2C110156BDE002865E7 /* AssemblerBufferWithConstantPool.h */, + 86E116B00FE75AC800B512BC /* CodeLocation.h */, + 86D3B3C110159D7F002865E7 /* LinkBuffer.h */, + 86C36EE90EE1289D00B3DF59 /* MacroAssembler.h */, + 86D3B2C210156BDE002865E7 /* MacroAssemblerARM.h */, 86ADD1440FDDEA980006EEC2 /* MacroAssemblerARMv7.h */, + 863B23DF0FC60E6200703AA4 /* MacroAssemblerCodeRef.h */, 860161E00F3A83C100F84710 /* MacroAssemblerX86.h */, 860161E10F3A83C100F84710 /* MacroAssemblerX86_64.h */, 860161E20F3A83C100F84710 /* MacroAssemblerX86Common.h */, - 86C36EE90EE1289D00B3DF59 /* MacroAssembler.h */, + 86D3B3C210159D7F002865E7 /* RepatchBuffer.h */, 9688CB140ED12B4E001D649F /* X86Assembler.h */, ); path = assembler; @@ -1573,9 +1617,9 @@ E195678E09E7CF1200B89D13 /* icu */, E1A862AA0D7EBB7D001EC6AA /* Collator.h */, E1A862D50D7F2B5C001EC6AA /* CollatorDefault.cpp */, + E195679409E7CF1200B89D13 /* Unicode.h */, E1EF79A80CE97BA60088D500 /* UTF8.cpp */, E1EF79A90CE97BA60088D500 /* UTF8.h */, - E195679409E7CF1200B89D13 /* Unicode.h */, ); path = unicode; sourceTree = "<group>"; @@ -1608,20 +1652,24 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 14C5242B0F5355E900BA3D04 /* JITStubs.h in Headers */, - BC18C3E50E16F5CD00B34460 /* APICast.h in Headers */, - BC18C3E90E16F5CD00B34460 /* ASCIICType.h in Headers */, - BC18C3EB0E16F5CD00B34460 /* AVLTree.h in Headers */, + 860161E30F3A83C100F84710 /* AbstractMacroAssembler.h in Headers */, BC18C3E40E16F5CD00B34460 /* AlwaysInline.h in Headers */, + BC18C3E50E16F5CD00B34460 /* APICast.h in Headers */, BCF605140E203EF800B9A64D /* ArgList.h in Headers */, BC257DE80E1F51C50016B6C9 /* Arguments.h in Headers */, + 86D3B2C410156BDE002865E7 /* ARMAssembler.h in Headers */, + 86ADD1450FDDEA980006EEC2 /* ARMv7Assembler.h in Headers */, BC18C3E60E16F5CD00B34460 /* ArrayConstructor.h in Headers */, BC18C3E70E16F5CD00B34460 /* ArrayPrototype.h in Headers */, BC18C5240E16FC8A00B34460 /* ArrayPrototype.lut.h in Headers */, + BC18C3E90E16F5CD00B34460 /* ASCIICType.h in Headers */, 9688CB150ED12B4E001D649F /* AssemblerBuffer.h in Headers */, + 86D3B2C510156BDE002865E7 /* AssemblerBufferWithConstantPool.h in Headers */, BC18C3EA0E16F5CD00B34460 /* Assertions.h in Headers */, + BC18C3EB0E16F5CD00B34460 /* AVLTree.h in Headers */, 147B83AC0E6DB8C9004775A4 /* BatchedTransitionOptimizer.h in Headers */, BC18C3EC0E16F5CD00B34460 /* BooleanObject.h in Headers */, + A7A1F7AD0F252B3C00E184E2 /* ByteArray.h in Headers */, 969A07230ED1CE3300F1F681 /* BytecodeGenerator.h in Headers */, BC18C3ED0E16F5CD00B34460 /* CallData.h in Headers */, 1429D8DE0ED2205B00B89619 /* CallFrame.h in Headers */, @@ -1630,12 +1678,16 @@ 7E2ADD8E0E79AAD500D50C51 /* CharacterClassConstructor.h in Headers */, BC6AAAE50E1F426500AD87D8 /* ClassInfo.h in Headers */, 969A07970ED1D3AE00F1F681 /* CodeBlock.h in Headers */, + 86E116B10FE75AC800B512BC /* CodeLocation.h in Headers */, BC18C3F00E16F5CD00B34460 /* Collator.h in Headers */, BC18C3F10E16F5CD00B34460 /* Collector.h in Headers */, 14F3488F0E95EF8A003648BC /* CollectorHeapIterator.h in Headers */, BC18C3F30E16F5CD00B34460 /* CommonIdentifiers.h in Headers */, BC18C3F40E16F5CD00B34460 /* Completion.h in Headers */, + BC18C3F50E16F5CD00B34460 /* config.h in Headers */, BC18C3F60E16F5CD00B34460 /* ConstructData.h in Headers */, + 5DE6E5B30E1728EC00180407 /* create_hash_table in Headers */, + 0BDFFAE00FC6192900D69EF4 /* CrossThreadRefCounted.h in Headers */, 180B9B080F16D94F009BDBC5 /* CurrentTime.h in Headers */, BCD2034A0E17135E002C7E82 /* DateConstructor.h in Headers */, 41359CF30FDD89AD00206180 /* DateConversion.h in Headers */, @@ -1644,9 +1696,11 @@ BCD2034C0E17135E002C7E82 /* DatePrototype.h in Headers */, BCD203E80E1718F4002C7E82 /* DatePrototype.lut.h in Headers */, BC18C3FA0E16F5CD00B34460 /* Debugger.h in Headers */, + BC3135640F302FA3003DFD3A /* DebuggerActivation.h in Headers */, BC18C3FB0E16F5CD00B34460 /* DebuggerCallFrame.h in Headers */, BC18C3FC0E16F5CD00B34460 /* Deque.h in Headers */, BC18C3FD0E16F5CD00B34460 /* DisallowCType.h in Headers */, + BC18C3FE0E16F5CD00B34460 /* dtoa.h in Headers */, BC3046070E1F497F003232CF /* Error.h in Headers */, BC02E90D0E1839DB000F9297 /* ErrorConstructor.h in Headers */, BC02E98D0E183E38000F9297 /* ErrorInstance.h in Headers */, @@ -1655,12 +1709,14 @@ 969A07980ED1D3AE00F1F681 /* EvalCodeCache.h in Headers */, BC18C4000E16F5CD00B34460 /* ExceptionHelpers.h in Headers */, A766B44F0EE8DCD1009518CA /* ExecutableAllocator.h in Headers */, + E48E0F2D0F82151700A8CA37 /* FastAllocBase.h in Headers */, BC18C4020E16F5CD00B34460 /* FastMalloc.h in Headers */, BC18C4030E16F5CD00B34460 /* Forward.h in Headers */, BC18C4040E16F5CD00B34460 /* FunctionConstructor.h in Headers */, BC18C4050E16F5CD00B34460 /* FunctionPrototype.h in Headers */, BC18C4060E16F5CD00B34460 /* GetPtr.h in Headers */, BC257DF00E1F52ED0016B6C9 /* GlobalEvalFunction.h in Headers */, + BC18C5300E16FCEB00B34460 /* grammar.h in Headers */, BC18C4080E16F5CD00B34460 /* HashCountedSet.h in Headers */, BC18C4090E16F5CD00B34460 /* HashFunctions.h in Headers */, BC18C40A0E16F5CD00B34460 /* HashIterators.h in Headers */, @@ -1673,9 +1729,16 @@ 969A07990ED1D3AE00F1F681 /* Instruction.h in Headers */, BC11667B0E199C05008066DD /* InternalFunction.h in Headers */, 1429D77C0ED20D7300B89619 /* Interpreter.h in Headers */, + BC18C4130E16F5CD00B34460 /* JavaScript.h in Headers */, + BC18C4140E16F5CD00B34460 /* JavaScriptCore.h in Headers */, + BC18C4150E16F5CD00B34460 /* JavaScriptCorePrefix.h in Headers */, 1429D9300ED22D7000B89619 /* JIT.h in Headers */, + 86CCEFDE0F413F8900FD7F9E /* JITCode.h in Headers */, 86CC85A10EE79A4700288682 /* JITInlineMethods.h in Headers */, + 960626960FB8EC02009798AB /* JITStubCall.h in Headers */, + 14C5242B0F5355E900BA3D04 /* JITStubs.h in Headers */, BC18C4160E16F5CD00B34460 /* JSActivation.h in Headers */, + 840480131021A1D9008E7F01 /* JSAPIValueWrapper.h in Headers */, BC18C4170E16F5CD00B34460 /* JSArray.h in Headers */, BC18C4180E16F5CD00B34460 /* JSBase.h in Headers */, 140D17D70E8AD4A9000CD17D /* JSBasePrivate.h in Headers */, @@ -1696,6 +1759,8 @@ BC7F8FB90E19D1C3008632C0 /* JSNumberCell.h in Headers */, BC18C4240E16F5CD00B34460 /* JSObject.h in Headers */, BC18C4250E16F5CD00B34460 /* JSObjectRef.h in Headers */, + A7F9935F0FD7325100A0B2D0 /* JSONObject.h in Headers */, + A7F9949B0FD746A300A0B2D0 /* JSONObject.lut.h in Headers */, 9534AAFB0E5B7A9600B8A45B /* JSProfilerPrivate.h in Headers */, BC18C4260E16F5CD00B34460 /* JSRetainPtr.h in Headers */, BC18C4270E16F5CD00B34460 /* JSString.h in Headers */, @@ -1706,18 +1771,24 @@ BC18C42C0E16F5CD00B34460 /* JSValueRef.h in Headers */, BC18C42D0E16F5CD00B34460 /* JSVariableObject.h in Headers */, BC18C42E0E16F5CD00B34460 /* JSWrapperObject.h in Headers */, - BC18C4130E16F5CD00B34460 /* JavaScript.h in Headers */, - BC18C4140E16F5CD00B34460 /* JavaScriptCore.h in Headers */, - BC18C4150E16F5CD00B34460 /* JavaScriptCorePrefix.h in Headers */, BCFD8C930EEB2EE700283848 /* JumpTable.h in Headers */, 969A072A0ED1CE6900F1F681 /* Label.h in Headers */, 960097A60EBABB58007A7297 /* LabelScope.h in Headers */, BC18C4310E16F5CD00B34460 /* Lexer.h in Headers */, + BC18C52E0E16FCE100B34460 /* lexer.lut.h in Headers */, + 86D3B3C310159D7F002865E7 /* LinkBuffer.h in Headers */, BC18C4340E16F5CD00B34460 /* ListHashSet.h in Headers */, BC18C4350E16F5CD00B34460 /* ListRefPtr.h in Headers */, + A7E2EA6B0FB460CF00601F06 /* LiteralParser.h in Headers */, BC18C4360E16F5CD00B34460 /* Locker.h in Headers */, BC18C4370E16F5CD00B34460 /* Lookup.h in Headers */, 86C36EEA0EE1289D00B3DF59 /* MacroAssembler.h in Headers */, + 86D3B2C610156BDE002865E7 /* MacroAssemblerARM.h in Headers */, + 86ADD1460FDDEA980006EEC2 /* MacroAssemblerARMv7.h in Headers */, + 863B23E00FC6118900703AA4 /* MacroAssemblerCodeRef.h in Headers */, + 860161E40F3A83C100F84710 /* MacroAssemblerX86.h in Headers */, + 860161E50F3A83C100F84710 /* MacroAssemblerX86_64.h in Headers */, + 860161E60F3A83C100F84710 /* MacroAssemblerX86Common.h in Headers */, BC18C4390E16F5CD00B34460 /* MainThread.h in Headers */, BC18C43A0E16F5CD00B34460 /* MallocZoneSupport.h in Headers */, BC18C43B0E16F5CD00B34460 /* MathExtras.h in Headers */, @@ -1726,6 +1797,7 @@ BC18C43E0E16F5CD00B34460 /* MessageQueue.h in Headers */, BC02E9110E1839DB000F9297 /* NativeErrorConstructor.h in Headers */, BC02E9130E1839DB000F9297 /* NativeErrorPrototype.h in Headers */, + A76EE6590FAE59D5003F069A /* NativeFunctionWrapper.h in Headers */, 7EFF00640EC05A9A00AA7C93 /* NodeInfo.h in Headers */, BC18C43F0E16F5CD00B34460 /* Nodes.h in Headers */, BC18C4400E16F5CD00B34460 /* Noncopyable.h in Headers */, @@ -1740,11 +1812,15 @@ 969A079B0ED1D3AE00F1F681 /* Opcode.h in Headers */, BC18C4480E16F5CD00B34460 /* Operations.h in Headers */, BC18C4490E16F5CD00B34460 /* OwnArrayPtr.h in Headers */, + 0BDFFAE10FC6193100D69EF4 /* OwnFastMallocPtr.h in Headers */, BC18C44A0E16F5CD00B34460 /* OwnPtr.h in Headers */, 4409D8470FAF80A200523B87 /* OwnPtrCommon.h in Headers */, BC18C44B0E16F5CD00B34460 /* Parser.h in Headers */, + 93052C350FB792190048FDC3 /* ParserArena.h in Headers */, 44DD48530FAEA85000D6B4EB /* PassOwnPtr.h in Headers */, BC18C44C0E16F5CD00B34460 /* PassRefPtr.h in Headers */, + BC18C44D0E16F5CD00B34460 /* pcre.h in Headers */, + BC18C44E0E16F5CD00B34460 /* pcre_internal.h in Headers */, BC18C44F0E16F5CD00B34460 /* Platform.h in Headers */, BC18C4500E16F5CD00B34460 /* Profile.h in Headers */, 95CD45770E1C4FDD0085358E /* ProfileGenerator.h in Headers */, @@ -1765,7 +1841,12 @@ 90D3469C0E285280009492EE /* RefCountedLeakCounter.h in Headers */, BC18C4580E16F5CD00B34460 /* RefPtr.h in Headers */, BC18C4590E16F5CD00B34460 /* RefPtrHashMap.h in Headers */, + 86EAC4960F93E8D1008EC948 /* RegexCompiler.h in Headers */, + 86EAC4980F93E8D1008EC948 /* RegexInterpreter.h in Headers */, + 86EAC49A0F93E8D1008EC948 /* RegexJIT.h in Headers */, BC18C45A0E16F5CD00B34460 /* RegExp.h in Headers */, + 86EAC49B0F93E8D1008EC948 /* RegexParser.h in Headers */, + 86EAC49C0F93E8D1008EC948 /* RegexPattern.h in Headers */, BCD202C20E1706A7002C7E82 /* RegExpConstructor.h in Headers */, BCD202D60E170708002C7E82 /* RegExpConstructor.lut.h in Headers */, BC18C45B0E16F5CD00B34460 /* RegExpObject.h in Headers */, @@ -1774,6 +1855,7 @@ BC18C45D0E16F5CD00B34460 /* Register.h in Headers */, BC18C45E0E16F5CD00B34460 /* RegisterFile.h in Headers */, 969A072B0ED1CE6900F1F681 /* RegisterID.h in Headers */, + 86D3B3C410159D7F002865E7 /* RepatchBuffer.h in Headers */, 869EBCB70E8C6D4A008722CC /* ResultType.h in Headers */, BC18C4600E16F5CD00B34460 /* RetainPtr.h in Headers */, 1429D8860ED21C3D00B89619 /* SamplingTool.h in Headers */, @@ -1798,56 +1880,28 @@ BC18C46D0E16F5CD00B34460 /* TCPageMap.h in Headers */, BC18C46E0E16F5CD00B34460 /* TCSpinLock.h in Headers */, BC18C46F0E16F5CD00B34460 /* TCSystemAlloc.h in Headers */, - BC18C4710E16F5CD00B34460 /* ThreadSpecific.h in Headers */, BC18C4700E16F5CD00B34460 /* Threading.h in Headers */, + BC18C4710E16F5CD00B34460 /* ThreadSpecific.h in Headers */, + 14A42E400F4F60EE00599099 /* TimeoutChecker.h in Headers */, 5D53726F0E1C54880021E549 /* Tracing.h in Headers */, 6507D29E0E871E5E00D7D896 /* TypeInfo.h in Headers */, 0B4D7E630F319AC800AD7E58 /* TypeTraits.h in Headers */, - BC18C4760E16F5CD00B34460 /* UString.h in Headers */, - BC18C4770E16F5CD00B34460 /* UTF8.h in Headers */, + BC18C4720E16F5CD00B34460 /* ucpinternal.h in Headers */, BC18C4730E16F5CD00B34460 /* Unicode.h in Headers */, BC18C4740E16F5CD00B34460 /* UnicodeIcu.h in Headers */, BC18C4750E16F5CD00B34460 /* UnusedParam.h in Headers */, + BC18C4760E16F5CD00B34460 /* UString.h in Headers */, + BC18C4770E16F5CD00B34460 /* UTF8.h in Headers */, BC18C4780E16F5CD00B34460 /* Vector.h in Headers */, BC18C4790E16F5CD00B34460 /* VectorTraits.h in Headers */, + 96DD73790F9DA3100027FBCC /* VMTags.h in Headers */, + BC18C47A0E16F5CD00B34460 /* WebKitAvailability.h in Headers */, 869083160E6518D7000D36ED /* WREC.h in Headers */, 1429DA830ED2482900B89619 /* WRECFunctors.h in Headers */, 1429DAE00ED2645B00B89619 /* WRECGenerator.h in Headers */, 1429DABF0ED263E700B89619 /* WRECParser.h in Headers */, - BC18C47A0E16F5CD00B34460 /* WebKitAvailability.h in Headers */, 9688CB160ED12B4E001D649F /* X86Assembler.h in Headers */, - BC18C3F50E16F5CD00B34460 /* config.h in Headers */, - 5DE6E5B30E1728EC00180407 /* create_hash_table in Headers */, - BC18C3FE0E16F5CD00B34460 /* dtoa.h in Headers */, - BC18C5300E16FCEB00B34460 /* grammar.h in Headers */, - BC18C52E0E16FCE100B34460 /* lexer.lut.h in Headers */, - BC18C44D0E16F5CD00B34460 /* pcre.h in Headers */, - BC18C44E0E16F5CD00B34460 /* pcre_internal.h in Headers */, - BC18C4720E16F5CD00B34460 /* ucpinternal.h in Headers */, - A7A1F7AD0F252B3C00E184E2 /* ByteArray.h in Headers */, - BC3135640F302FA3003DFD3A /* DebuggerActivation.h in Headers */, - 860161E30F3A83C100F84710 /* AbstractMacroAssembler.h in Headers */, - 863B23E00FC6118900703AA4 /* MacroAssemblerCodeRef.h in Headers */, - 860161E40F3A83C100F84710 /* MacroAssemblerX86.h in Headers */, - 860161E50F3A83C100F84710 /* MacroAssemblerX86_64.h in Headers */, - 860161E60F3A83C100F84710 /* MacroAssemblerX86Common.h in Headers */, - 86CCEFDE0F413F8900FD7F9E /* JITCode.h in Headers */, - 14A42E400F4F60EE00599099 /* TimeoutChecker.h in Headers */, - E48E0F2D0F82151700A8CA37 /* FastAllocBase.h in Headers */, - 86EAC4960F93E8D1008EC948 /* RegexCompiler.h in Headers */, - 86EAC4980F93E8D1008EC948 /* RegexInterpreter.h in Headers */, - 86EAC49A0F93E8D1008EC948 /* RegexJIT.h in Headers */, - 86EAC49B0F93E8D1008EC948 /* RegexParser.h in Headers */, - 86EAC49C0F93E8D1008EC948 /* RegexPattern.h in Headers */, - 96DD73790F9DA3100027FBCC /* VMTags.h in Headers */, - A76EE6590FAE59D5003F069A /* NativeFunctionWrapper.h in Headers */, - A7E2EA6B0FB460CF00601F06 /* LiteralParser.h in Headers */, - 93052C350FB792190048FDC3 /* ParserArena.h in Headers */, - 960626960FB8EC02009798AB /* JITStubCall.h in Headers */, - 0BDFFAE00FC6192900D69EF4 /* CrossThreadRefCounted.h in Headers */, - 0BDFFAE10FC6193100D69EF4 /* OwnFastMallocPtr.h in Headers */, - 86ADD1450FDDEA980006EEC2 /* ARMv7Assembler.h in Headers */, - 86ADD1460FDDEA980006EEC2 /* MacroAssemblerARMv7.h in Headers */, + A7795590101A74D500114E55 /* MarkStack.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1898,11 +1952,11 @@ 5D2F7CF90C6875BB00B5B72B /* Update Info.plist with version information */, 932F5B3F0822A1C700736975 /* Headers */, 932F5B910822A1C700736975 /* Sources */, + 1C395CBC0C6BCC16000D1E52 /* Generate 64-bit Export File */, + 932F5BD20822A1C700736975 /* Frameworks */, 9319586B09D9F91A00A56FD4 /* Check For Global Initializers */, 933457200EBFDC3F00B80894 /* Check For Exit Time Destructors */, 5D29D8BE0E9860B400C3D2D0 /* Check For Weak VTables */, - 932F5BD20822A1C700736975 /* Frameworks */, - 1C395CBC0C6BCC16000D1E52 /* Generate 64-bit Export File */, ); buildRules = ( ); @@ -2007,6 +2061,7 @@ files = ( ); inputPaths = ( + "$(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH)", ); name = "Check For Weak VTables"; outputPaths = ( @@ -2082,6 +2137,7 @@ files = ( ); inputPaths = ( + "$(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH)", ); name = "Check For Global Initializers"; outputPaths = ( @@ -2096,6 +2152,7 @@ files = ( ); inputPaths = ( + "$(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH)", ); name = "Check For Exit Time Destructors"; outputPaths = ( @@ -2113,9 +2170,9 @@ files = ( 1440057F0A5335640005F061 /* JSNode.c in Sources */, 144007580A5370D20005F061 /* JSNodeList.c in Sources */, + 141211340A48795800480255 /* minidom.c in Sources */, 1440063F0A53598A0005F061 /* Node.c in Sources */, 1440074B0A536CC20005F061 /* NodeList.c in Sources */, - 141211340A48795800480255 /* minidom.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2132,7 +2189,9 @@ buildActionMask = 2147483647; files = ( 659126BD0BDD1728001921FB /* AllInOneFile.cpp in Sources */, + 86D3B2C310156BDE002865E7 /* ARMAssembler.cpp in Sources */, 65FDE49C0BDD1D4A00E80111 /* Assertions.cpp in Sources */, + A7A1F7AC0F252B3C00E184E2 /* ByteArray.cpp in Sources */, 1429D8DD0ED2205B00B89619 /* CallFrame.cpp in Sources */, 1429D9C40ED23C3900B89619 /* CharacterClass.cpp in Sources */, 7E2ADD900E79AC1100D50C51 /* CharacterClassConstructor.cpp in Sources */, @@ -2141,9 +2200,11 @@ E1A862A90D7EBB76001EC6AA /* CollatorICU.cpp in Sources */, 180B9BFE0F16E94D009BDBC5 /* CurrentTime.cpp in Sources */, 41359CF60FDD89CB00206180 /* DateMath.cpp in Sources */, + BC3135650F302FA3003DFD3A /* DebuggerActivation.cpp in Sources */, 149559EE0DDCDDF700648087 /* DebuggerCallFrame.cpp in Sources */, 1429D8780ED21ACD00B89619 /* ExceptionHelpers.cpp in Sources */, A7B48F490EE8936F00DCBDB6 /* ExecutableAllocator.cpp in Sources */, + 86DB64640F95C6FC00D7D921 /* ExecutableAllocatorFixedVMPool.cpp in Sources */, A782F1A50EEC9FA20036273F /* ExecutableAllocatorPosix.cpp in Sources */, 65DFC93308EA173A00F7300B /* HashTable.cpp in Sources */, E178636D0D9BEEC300D74E75 /* InitializeThreading.cpp in Sources */, @@ -2151,6 +2212,7 @@ 1429D92F0ED22D7000B89619 /* JIT.cpp in Sources */, 86A90ED00EE7D51F00AB350D /* JITArithmetic.cpp in Sources */, 86CC85A30EE79B7400288682 /* JITCall.cpp in Sources */, + BCDD51EB0FB8DF74004A8BDC /* JITOpcodes.cpp in Sources */, 86CC85C40EE7A89400288682 /* JITPropertyAccess.cpp in Sources */, 14A23D750F4E1ABB0023CDAD /* JITStubs.cpp in Sources */, 140B7D1D0DC69AF7009C42B8 /* JSActivation.cpp in Sources */, @@ -2164,16 +2226,24 @@ E18E3A590DF9278C00D90B34 /* JSGlobalData.cpp in Sources */, A72700900DAC6BBC00E548D7 /* JSNotAnObject.cpp in Sources */, 1482B7E40A43076000517CFC /* JSObjectRef.cpp in Sources */, + A7F993600FD7325100A0B2D0 /* JSONObject.cpp in Sources */, 95F6E6950E5B5F970091E860 /* JSProfilerPrivate.cpp in Sources */, A727FF6B0DA3092200E548D7 /* JSPropertyNameIterator.cpp in Sources */, 1482B74E0A43032800517CFC /* JSStringRef.cpp in Sources */, 146AAB380B66A94400E55F16 /* JSStringRefCF.cpp in Sources */, 14BD5A320A3E91F600BAF59C /* JSValueRef.cpp in Sources */, BCFD8C920EEB2EE700283848 /* JumpTable.cpp in Sources */, + A7E2EA6C0FB460CF00601F06 /* LiteralParser.cpp in Sources */, 06D358B30DAADAA4003B174E /* MainThread.cpp in Sources */, 06D358B40DAADAAA003B174E /* MainThreadMac.mm in Sources */, E124A8F80E555775003091F1 /* OpaqueJSString.cpp in Sources */, 969A079A0ED1D3AE00F1F681 /* Opcode.cpp in Sources */, + 93052C340FB792190048FDC3 /* ParserArena.cpp in Sources */, + 930754C108B0F68000AB3056 /* pcre_compile.cpp in Sources */, + 930754EB08B0F78500AB3056 /* pcre_exec.cpp in Sources */, + 930754D008B0F74600AB3056 /* pcre_tables.cpp in Sources */, + 937013480CA97E0E00FA14D3 /* pcre_ucp_searchfuncs.cpp in Sources */, + 93E26BD408B1514100F85226 /* pcre_xclass.cpp in Sources */, 95742F650DD11F5A000917FB /* Profile.cpp in Sources */, 95CD45760E1C4FDD0085358E /* ProfileGenerator.cpp in Sources */, 95AB83560DA43C3000BC83F3 /* ProfileNode.cpp in Sources */, @@ -2181,6 +2251,9 @@ 1C61516C0EBAC7A00031376F /* ProfilerServer.mm in Sources */, 088FA5BB0EF76D4300578E6F /* RandomNumber.cpp in Sources */, 905B02AE0E28640F006DF882 /* RefCountedLeakCounter.cpp in Sources */, + 86EAC4950F93E8D1008EC948 /* RegexCompiler.cpp in Sources */, + 86EAC4970F93E8D1008EC948 /* RegexInterpreter.cpp in Sources */, + 86EAC4990F93E8D1008EC948 /* RegexJIT.cpp in Sources */, 1429D8850ED21C3D00B89619 /* SamplingTool.cpp in Sources */, 9330402C0E6A764000786E6A /* SmallStrings.cpp in Sources */, BCDE3B430E6C832D001453A7 /* Structure.cpp in Sources */, @@ -2188,27 +2261,15 @@ BCCF0D0C0EF0B8A500413C8F /* StructureStubInfo.cpp in Sources */, 5D6A566B0F05995500266145 /* Threading.cpp in Sources */, E1EE793D0D6C9B9200FEA3BA /* ThreadingPthreads.cpp in Sources */, + 14A42E3F0F4F60EE00599099 /* TimeoutChecker.cpp in Sources */, + 0B330C270F38C62300692DE3 /* TypeTraits.cpp in Sources */, E1EF79AA0CE97BA60088D500 /* UTF8.cpp in Sources */, 869083150E6518D7000D36ED /* WREC.cpp in Sources */, 1429DA820ED2482900B89619 /* WRECFunctors.cpp in Sources */, 1429DAE10ED2645B00B89619 /* WRECGenerator.cpp in Sources */, 1429DAC00ED263E700B89619 /* WRECParser.cpp in Sources */, - 930754C108B0F68000AB3056 /* pcre_compile.cpp in Sources */, - 930754EB08B0F78500AB3056 /* pcre_exec.cpp in Sources */, - 930754D008B0F74600AB3056 /* pcre_tables.cpp in Sources */, - 937013480CA97E0E00FA14D3 /* pcre_ucp_searchfuncs.cpp in Sources */, - 93E26BD408B1514100F85226 /* pcre_xclass.cpp in Sources */, - A7A1F7AC0F252B3C00E184E2 /* ByteArray.cpp in Sources */, - BC3135650F302FA3003DFD3A /* DebuggerActivation.cpp in Sources */, - 0B330C270F38C62300692DE3 /* TypeTraits.cpp in Sources */, - 14A42E3F0F4F60EE00599099 /* TimeoutChecker.cpp in Sources */, - 86EAC4950F93E8D1008EC948 /* RegexCompiler.cpp in Sources */, - 86EAC4970F93E8D1008EC948 /* RegexInterpreter.cpp in Sources */, - 86EAC4990F93E8D1008EC948 /* RegexJIT.cpp in Sources */, - 86DB64640F95C6FC00D7D921 /* ExecutableAllocatorFixedVMPool.cpp in Sources */, - A7E2EA6C0FB460CF00601F06 /* LiteralParser.cpp in Sources */, - 93052C340FB792190048FDC3 /* ParserArena.cpp in Sources */, - BCDD51EB0FB8DF74004A8BDC /* JITOpcodes.cpp in Sources */, + A7C530E4102A3813005BC741 /* MarkStackPosix.cpp in Sources */, + A74B3499102A5F8E0032AB98 /* MarkStack.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/JavaScriptCore/JavaScriptCoreSources.bkl b/JavaScriptCore/JavaScriptCoreSources.bkl index 2146c09..1bdf251 100644 --- a/JavaScriptCore/JavaScriptCoreSources.bkl +++ b/JavaScriptCore/JavaScriptCoreSources.bkl @@ -116,6 +116,7 @@ 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 diff --git a/JavaScriptCore/SConstruct b/JavaScriptCore/SConstruct deleted file mode 100644 index b77d202..0000000 --- a/JavaScriptCore/SConstruct +++ /dev/null @@ -1 +0,0 @@ -SConscript(['JavaScriptCore.scons']) diff --git a/JavaScriptCore/assembler/ARMAssembler.cpp b/JavaScriptCore/assembler/ARMAssembler.cpp new file mode 100644 index 0000000..69daa16 --- /dev/null +++ b/JavaScriptCore/assembler/ARMAssembler.cpp @@ -0,0 +1,384 @@ +/* + * 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. + */ + +#include "config.h" + +#if ENABLE(ASSEMBLER) && PLATFORM(ARM) + +#include "ARMAssembler.h" + +namespace JSC { + +// Patching helpers + +ARMWord* ARMAssembler::getLdrImmAddress(ARMWord* insn, uint32_t* constPool) +{ + // Must be an ldr ..., [pc +/- imm] + ASSERT((*insn & 0x0f7f0000) == 0x051f0000); + + if (constPool && (*insn & 0x1)) + return reinterpret_cast<ARMWord*>(constPool + ((*insn & SDT_OFFSET_MASK) >> 1)); + + ARMWord addr = reinterpret_cast<ARMWord>(insn) + 2 * sizeof(ARMWord); + if (*insn & DT_UP) + return reinterpret_cast<ARMWord*>(addr + (*insn & SDT_OFFSET_MASK)); + else + return reinterpret_cast<ARMWord*>(addr - (*insn & SDT_OFFSET_MASK)); +} + +void ARMAssembler::linkBranch(void* code, JmpSrc from, void* to) +{ + ARMWord* insn = reinterpret_cast<ARMWord*>(code) + (from.m_offset / sizeof(ARMWord)); + + if (!from.m_latePatch) { + int diff = reinterpret_cast<ARMWord*>(to) - reinterpret_cast<ARMWord*>(insn + 2); + + if ((diff <= BOFFSET_MAX && diff >= BOFFSET_MIN)) { + *insn = B | getConditionalField(*insn) | (diff & BRANCH_MASK); + ExecutableAllocator::cacheFlush(insn, sizeof(ARMWord)); + return; + } + } + ARMWord* addr = getLdrImmAddress(insn); + *addr = reinterpret_cast<ARMWord>(to); + ExecutableAllocator::cacheFlush(addr, sizeof(ARMWord)); +} + +void ARMAssembler::patchConstantPoolLoad(void* loadAddr, void* constPoolAddr) +{ + ARMWord *ldr = reinterpret_cast<ARMWord*>(loadAddr); + ARMWord diff = reinterpret_cast<ARMWord*>(constPoolAddr) - ldr; + ARMWord index = (*ldr & 0xfff) >> 1; + + ASSERT(diff >= 1); + if (diff >= 2 || index > 0) { + diff = (diff + index - 2) * sizeof(ARMWord); + ASSERT(diff <= 0xfff); + *ldr = (*ldr & ~0xfff) | diff; + } else + *ldr = (*ldr & ~(0xfff | ARMAssembler::DT_UP)) | sizeof(ARMWord); +} + +// Handle immediates + +ARMWord ARMAssembler::getOp2(ARMWord imm) +{ + int rol; + + if (imm <= 0xff) + return OP2_IMM | imm; + + if ((imm & 0xff000000) == 0) { + imm <<= 8; + rol = 8; + } + else { + imm = (imm << 24) | (imm >> 8); + rol = 0; + } + + if ((imm & 0xff000000) == 0) { + imm <<= 8; + rol += 4; + } + + if ((imm & 0xf0000000) == 0) { + imm <<= 4; + rol += 2; + } + + if ((imm & 0xc0000000) == 0) { + imm <<= 2; + rol += 1; + } + + if ((imm & 0x00ffffff) == 0) + return OP2_IMM | (imm >> 24) | (rol << 8); + + return 0; +} + +int ARMAssembler::genInt(int reg, ARMWord imm, bool positive) +{ + // Step1: Search a non-immediate part + ARMWord mask; + ARMWord imm1; + ARMWord imm2; + int rol; + + mask = 0xff000000; + rol = 8; + while(1) { + if ((imm & mask) == 0) { + imm = (imm << rol) | (imm >> (32 - rol)); + rol = 4 + (rol >> 1); + break; + } + rol += 2; + mask >>= 2; + if (mask & 0x3) { + // rol 8 + imm = (imm << 8) | (imm >> 24); + mask = 0xff00; + rol = 24; + while (1) { + if ((imm & mask) == 0) { + imm = (imm << rol) | (imm >> (32 - rol)); + rol = (rol >> 1) - 8; + break; + } + rol += 2; + mask >>= 2; + if (mask & 0x3) + return 0; + } + break; + } + } + + ASSERT((imm & 0xff) == 0); + + if ((imm & 0xff000000) == 0) { + imm1 = OP2_IMM | ((imm >> 16) & 0xff) | (((rol + 4) & 0xf) << 8); + imm2 = OP2_IMM | ((imm >> 8) & 0xff) | (((rol + 8) & 0xf) << 8); + } else if (imm & 0xc0000000) { + imm1 = OP2_IMM | ((imm >> 24) & 0xff) | ((rol & 0xf) << 8); + imm <<= 8; + rol += 4; + + if ((imm & 0xff000000) == 0) { + imm <<= 8; + rol += 4; + } + + if ((imm & 0xf0000000) == 0) { + imm <<= 4; + rol += 2; + } + + if ((imm & 0xc0000000) == 0) { + imm <<= 2; + rol += 1; + } + + if ((imm & 0x00ffffff) == 0) + imm2 = OP2_IMM | (imm >> 24) | ((rol & 0xf) << 8); + else + return 0; + } else { + if ((imm & 0xf0000000) == 0) { + imm <<= 4; + rol += 2; + } + + if ((imm & 0xc0000000) == 0) { + imm <<= 2; + rol += 1; + } + + imm1 = OP2_IMM | ((imm >> 24) & 0xff) | ((rol & 0xf) << 8); + imm <<= 8; + rol += 4; + + if ((imm & 0xf0000000) == 0) { + imm <<= 4; + rol += 2; + } + + if ((imm & 0xc0000000) == 0) { + imm <<= 2; + rol += 1; + } + + if ((imm & 0x00ffffff) == 0) + imm2 = OP2_IMM | (imm >> 24) | ((rol & 0xf) << 8); + else + return 0; + } + + if (positive) { + mov_r(reg, imm1); + orr_r(reg, reg, imm2); + } else { + mvn_r(reg, imm1); + bic_r(reg, reg, imm2); + } + + return 1; +} + +ARMWord ARMAssembler::getImm(ARMWord imm, int tmpReg, bool invert) +{ + ARMWord tmp; + + // Do it by 1 instruction + tmp = getOp2(imm); + if (tmp) + return tmp; + + tmp = getOp2(~imm); + if (tmp) { + if (invert) + return tmp | OP2_INV_IMM; + mvn_r(tmpReg, tmp); + return tmpReg; + } + + // Do it by 2 instruction + if (genInt(tmpReg, imm, true)) + return tmpReg; + if (genInt(tmpReg, ~imm, false)) + return tmpReg; + + ldr_imm(tmpReg, imm); + return tmpReg; +} + +void ARMAssembler::moveImm(ARMWord imm, int dest) +{ + ARMWord tmp; + + // Do it by 1 instruction + tmp = getOp2(imm); + if (tmp) { + mov_r(dest, tmp); + return; + } + + tmp = getOp2(~imm); + if (tmp) { + mvn_r(dest, tmp); + return; + } + + // Do it by 2 instruction + if (genInt(dest, imm, true)) + return; + if (genInt(dest, ~imm, false)) + return; + + ldr_imm(dest, imm); +} + +// Memory load/store helpers + +void ARMAssembler::dataTransfer32(bool isLoad, RegisterID srcDst, RegisterID base, int32_t offset) +{ + if (offset >= 0) { + if (offset <= 0xfff) + dtr_u(isLoad, srcDst, base, offset); + else if (offset <= 0xfffff) { + add_r(ARM::S0, base, OP2_IMM | (offset >> 12) | (10 << 8)); + dtr_u(isLoad, srcDst, ARM::S0, offset & 0xfff); + } else { + ARMWord reg = getImm(offset, ARM::S0); + dtr_ur(isLoad, srcDst, base, reg); + } + } else { + offset = -offset; + if (offset <= 0xfff) + dtr_d(isLoad, srcDst, base, offset); + else if (offset <= 0xfffff) { + sub_r(ARM::S0, base, OP2_IMM | (offset >> 12) | (10 << 8)); + dtr_d(isLoad, srcDst, ARM::S0, offset & 0xfff); + } else { + ARMWord reg = getImm(offset, ARM::S0); + dtr_dr(isLoad, srcDst, base, reg); + } + } +} + +void ARMAssembler::baseIndexTransfer32(bool isLoad, RegisterID srcDst, RegisterID base, RegisterID index, int scale, int32_t offset) +{ + ARMWord op2; + + ASSERT(scale >= 0 && scale <= 3); + op2 = lsl(index, scale); + + if (offset >= 0 && offset <= 0xfff) { + add_r(ARM::S0, base, op2); + dtr_u(isLoad, srcDst, ARM::S0, offset); + return; + } + if (offset <= 0 && offset >= -0xfff) { + add_r(ARM::S0, base, op2); + dtr_d(isLoad, srcDst, ARM::S0, -offset); + return; + } + + ldr_un_imm(ARM::S0, offset); + add_r(ARM::S0, ARM::S0, op2); + dtr_ur(isLoad, srcDst, base, ARM::S0); +} + +void ARMAssembler::doubleTransfer(bool isLoad, FPRegisterID srcDst, RegisterID base, int32_t offset) +{ + if (offset & 0x3) { + if (offset <= 0x3ff && offset >= 0) { + fdtr_u(isLoad, srcDst, base, offset >> 2); + return; + } + if (offset <= 0x3ffff && offset >= 0) { + add_r(ARM::S0, base, OP2_IMM | (offset >> 10) | (11 << 8)); + fdtr_u(isLoad, srcDst, ARM::S0, (offset >> 2) & 0xff); + return; + } + offset = -offset; + + if (offset <= 0x3ff && offset >= 0) { + fdtr_d(isLoad, srcDst, base, offset >> 2); + return; + } + if (offset <= 0x3ffff && offset >= 0) { + sub_r(ARM::S0, base, OP2_IMM | (offset >> 10) | (11 << 8)); + fdtr_d(isLoad, srcDst, ARM::S0, (offset >> 2) & 0xff); + return; + } + offset = -offset; + } + + ldr_un_imm(ARM::S0, offset); + add_r(ARM::S0, ARM::S0, base); + fdtr_u(isLoad, srcDst, ARM::S0, 0); +} + +void* ARMAssembler::executableCopy(ExecutablePool* allocator) +{ + char* data = reinterpret_cast<char*>(m_buffer.executableCopy(allocator)); + + for (Jumps::Iterator iter = m_jumps.begin(); iter != m_jumps.end(); ++iter) { + ARMWord* ldrAddr = reinterpret_cast<ARMWord*>(data + *iter); + ARMWord* offset = getLdrImmAddress(ldrAddr); + if (*offset != 0xffffffff) + linkBranch(data, JmpSrc(*iter), data + *offset); + } + + return data; +} + +} // namespace JSC + +#endif // ENABLE(ASSEMBLER) && PLATFORM(ARM) diff --git a/JavaScriptCore/assembler/ARMAssembler.h b/JavaScriptCore/assembler/ARMAssembler.h new file mode 100644 index 0000000..d3fe782 --- /dev/null +++ b/JavaScriptCore/assembler/ARMAssembler.h @@ -0,0 +1,767 @@ +/* + * 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 ARMAssembler_h +#define ARMAssembler_h + +#include <wtf/Platform.h> + +#if ENABLE(ASSEMBLER) && PLATFORM(ARM) + +#include "AssemblerBufferWithConstantPool.h" +#include <wtf/Assertions.h> +namespace JSC { + +typedef uint32_t ARMWord; + +namespace ARM { + typedef enum { + r0 = 0, + r1, + r2, + r3, + S0 = r3, + r4, + r5, + r6, + r7, + r8, + S1 = r8, + r9, + r10, + r11, + r12, + r13, + sp = r13, + r14, + lr = r14, + r15, + pc = r15 + } RegisterID; + + typedef enum { + d0, + d1, + d2, + d3, + SD0 = d3 + } FPRegisterID; + +} // namespace ARM + + class ARMAssembler { + public: + typedef ARM::RegisterID RegisterID; + typedef ARM::FPRegisterID FPRegisterID; + typedef AssemblerBufferWithConstantPool<2048, 4, 4, ARMAssembler> ARMBuffer; + typedef WTF::SegmentedVector<int, 64> Jumps; + + ARMAssembler() { } + + // ARM conditional constants + typedef enum { + EQ = 0x00000000, // Zero + NE = 0x10000000, // Non-zero + CS = 0x20000000, + CC = 0x30000000, + MI = 0x40000000, + PL = 0x50000000, + VS = 0x60000000, + VC = 0x70000000, + HI = 0x80000000, + LS = 0x90000000, + GE = 0xa0000000, + LT = 0xb0000000, + GT = 0xc0000000, + LE = 0xd0000000, + AL = 0xe0000000 + } Condition; + + // ARM instruction constants + enum { + AND = (0x0 << 21), + EOR = (0x1 << 21), + SUB = (0x2 << 21), + RSB = (0x3 << 21), + ADD = (0x4 << 21), + ADC = (0x5 << 21), + SBC = (0x6 << 21), + RSC = (0x7 << 21), + TST = (0x8 << 21), + TEQ = (0x9 << 21), + CMP = (0xa << 21), + CMN = (0xb << 21), + ORR = (0xc << 21), + MOV = (0xd << 21), + BIC = (0xe << 21), + MVN = (0xf << 21), + MUL = 0x00000090, + MULL = 0x00c00090, + FADDD = 0x0e300b00, + FSUBD = 0x0e300b40, + FMULD = 0x0e200b00, + FCMPD = 0x0eb40b40, + DTR = 0x05000000, + LDRH = 0x00100090, + STRH = 0x00000090, + STMDB = 0x09200000, + LDMIA = 0x08b00000, + FDTR = 0x0d000b00, + B = 0x0a000000, + BL = 0x0b000000, + FMSR = 0x0e000a10, + FSITOD = 0x0eb80bc0, + FMSTAT = 0x0ef1fa10, +#if ARM_ARCH_VERSION >= 5 + CLZ = 0x016f0f10, + BKPT = 0xe120070, +#endif + }; + + enum { + OP2_IMM = (1 << 25), + OP2_IMMh = (1 << 22), + OP2_INV_IMM = (1 << 26), + SET_CC = (1 << 20), + OP2_OFSREG = (1 << 25), + DT_UP = (1 << 23), + DT_WB = (1 << 21), + // This flag is inlcuded in LDR and STR + DT_PRE = (1 << 24), + HDT_UH = (1 << 5), + DT_LOAD = (1 << 20), + }; + + // Masks of ARM instructions + enum { + BRANCH_MASK = 0x00ffffff, + NONARM = 0xf0000000, + SDT_MASK = 0x0c000000, + SDT_OFFSET_MASK = 0xfff, + }; + + enum { + BOFFSET_MIN = -0x00800000, + BOFFSET_MAX = 0x007fffff, + SDT = 0x04000000, + }; + + enum { + padForAlign8 = 0x00, + padForAlign16 = 0x0000, + padForAlign32 = 0xee120070, + }; + + class JmpSrc { + friend class ARMAssembler; + public: + JmpSrc() + : m_offset(-1) + , m_latePatch(false) + { + } + + void enableLatePatch() { m_latePatch = true; } + private: + JmpSrc(int offset) + : m_offset(offset) + , m_latePatch(false) + { + } + + int m_offset : 31; + int m_latePatch : 1; + }; + + class JmpDst { + friend class ARMAssembler; + 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; + }; + + // Instruction formating + + void emitInst(ARMWord op, int rd, int rn, ARMWord op2) + { + ASSERT ( ((op2 & ~OP2_IMM) <= 0xfff) || (((op2 & ~OP2_IMMh) <= 0xfff)) ); + m_buffer.putInt(op | RN(rn) | RD(rd) | op2); + } + + void and_r(int rd, int rn, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | AND, rd, rn, op2); + } + + void ands_r(int rd, int rn, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | AND | SET_CC, rd, rn, op2); + } + + void eor_r(int rd, int rn, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | EOR, rd, rn, op2); + } + + void eors_r(int rd, int rn, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | EOR | SET_CC, rd, rn, op2); + } + + void sub_r(int rd, int rn, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | SUB, rd, rn, op2); + } + + void subs_r(int rd, int rn, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | SUB | SET_CC, rd, rn, op2); + } + + void rsb_r(int rd, int rn, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | RSB, rd, rn, op2); + } + + void rsbs_r(int rd, int rn, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | RSB | SET_CC, rd, rn, op2); + } + + void add_r(int rd, int rn, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | ADD, rd, rn, op2); + } + + void adds_r(int rd, int rn, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | ADD | SET_CC, rd, rn, op2); + } + + void adc_r(int rd, int rn, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | ADC, rd, rn, op2); + } + + void adcs_r(int rd, int rn, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | ADC | SET_CC, rd, rn, op2); + } + + void sbc_r(int rd, int rn, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | SBC, rd, rn, op2); + } + + void sbcs_r(int rd, int rn, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | SBC | SET_CC, rd, rn, op2); + } + + void rsc_r(int rd, int rn, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | RSC, rd, rn, op2); + } + + void rscs_r(int rd, int rn, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | RSC | SET_CC, rd, rn, op2); + } + + void tst_r(int rn, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | TST | SET_CC, 0, rn, op2); + } + + void teq_r(int rn, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | TEQ | SET_CC, 0, rn, op2); + } + + void cmp_r(int rn, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | CMP | SET_CC, 0, rn, op2); + } + + void orr_r(int rd, int rn, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | ORR, rd, rn, op2); + } + + void orrs_r(int rd, int rn, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | ORR | SET_CC, rd, rn, op2); + } + + void mov_r(int rd, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | MOV, rd, ARM::r0, op2); + } + + void movs_r(int rd, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | MOV | SET_CC, rd, ARM::r0, op2); + } + + void bic_r(int rd, int rn, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | BIC, rd, rn, op2); + } + + void bics_r(int rd, int rn, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | BIC | SET_CC, rd, rn, op2); + } + + void mvn_r(int rd, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | MVN, rd, ARM::r0, op2); + } + + void mvns_r(int rd, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | MVN | SET_CC, rd, ARM::r0, op2); + } + + void mul_r(int rd, int rn, int rm, Condition cc = AL) + { + m_buffer.putInt(static_cast<ARMWord>(cc) | MUL | RN(rd) | RS(rn) | RM(rm)); + } + + void muls_r(int rd, int rn, int rm, Condition cc = AL) + { + m_buffer.putInt(static_cast<ARMWord>(cc) | MUL | SET_CC | RN(rd) | RS(rn) | RM(rm)); + } + + void mull_r(int rdhi, int rdlo, int rn, int rm, Condition cc = AL) + { + m_buffer.putInt(static_cast<ARMWord>(cc) | MULL | RN(rdhi) | RD(rdlo) | RS(rn) | RM(rm)); + } + + void faddd_r(int dd, int dn, int dm, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | FADDD, dd, dn, dm); + } + + void fsubd_r(int dd, int dn, int dm, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | FSUBD, dd, dn, dm); + } + + void fmuld_r(int dd, int dn, int dm, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | FMULD, dd, dn, dm); + } + + void fcmpd_r(int dd, int dm, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | FCMPD, dd, 0, dm); + } + + void ldr_imm(int rd, ARMWord imm, Condition cc = AL) + { + m_buffer.putIntWithConstantInt(static_cast<ARMWord>(cc) | DTR | DT_LOAD | DT_UP | RN(ARM::pc) | RD(rd), imm, true); + } + + void ldr_un_imm(int rd, ARMWord imm, Condition cc = AL) + { + m_buffer.putIntWithConstantInt(static_cast<ARMWord>(cc) | DTR | DT_LOAD | DT_UP | RN(ARM::pc) | RD(rd), imm); + } + + void dtr_u(bool isLoad, int rd, int rb, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | DTR | (isLoad ? DT_LOAD : 0) | DT_UP, rd, rb, op2); + } + + void dtr_ur(bool isLoad, int rd, int rb, int rm, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | DTR | (isLoad ? DT_LOAD : 0) | DT_UP | OP2_OFSREG, rd, rb, rm); + } + + void dtr_d(bool isLoad, int rd, int rb, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | DTR | (isLoad ? DT_LOAD : 0), rd, rb, op2); + } + + void dtr_dr(bool isLoad, int rd, int rb, int rm, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | DTR | (isLoad ? DT_LOAD : 0) | OP2_OFSREG, rd, rb, rm); + } + + void ldrh_r(int rd, int rn, int rm, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | LDRH | HDT_UH | DT_UP | DT_PRE, rd, rn, rm); + } + + void ldrh_d(int rd, int rb, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | LDRH | HDT_UH | DT_PRE, rd, rb, op2); + } + + void ldrh_u(int rd, int rb, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | LDRH | HDT_UH | DT_UP | DT_PRE, rd, rb, op2); + } + + void strh_r(int rn, int rm, int rd, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | STRH | HDT_UH | DT_UP | DT_PRE, rd, rn, rm); + } + + void fdtr_u(bool isLoad, int rd, int rb, ARMWord op2, Condition cc = AL) + { + ASSERT(op2 <= 0xff); + emitInst(static_cast<ARMWord>(cc) | FDTR | DT_UP | (isLoad ? DT_LOAD : 0), rd, rb, op2); + } + + void fdtr_d(bool isLoad, int rd, int rb, ARMWord op2, Condition cc = AL) + { + ASSERT(op2 <= 0xff); + emitInst(static_cast<ARMWord>(cc) | FDTR | (isLoad ? DT_LOAD : 0), rd, rb, op2); + } + + void push_r(int reg, Condition cc = AL) + { + ASSERT(ARMWord(reg) <= 0xf); + m_buffer.putInt(cc | DTR | DT_WB | RN(ARM::sp) | RD(reg) | 0x4); + } + + void pop_r(int reg, Condition cc = AL) + { + ASSERT(ARMWord(reg) <= 0xf); + m_buffer.putInt(cc | (DTR ^ DT_PRE) | DT_LOAD | DT_UP | RN(ARM::sp) | RD(reg) | 0x4); + } + + inline void poke_r(int reg, Condition cc = AL) + { + dtr_d(false, ARM::sp, 0, reg, cc); + } + + inline void peek_r(int reg, Condition cc = AL) + { + dtr_u(true, reg, ARM::sp, 0, cc); + } + + void fmsr_r(int dd, int rn, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | FMSR, rn, dd, 0); + } + + void fsitod_r(int dd, int dm, Condition cc = AL) + { + emitInst(static_cast<ARMWord>(cc) | FSITOD, dd, 0, dm); + } + + void fmstat(Condition cc = AL) + { + m_buffer.putInt(static_cast<ARMWord>(cc) | FMSTAT); + } + +#if ARM_ARCH_VERSION >= 5 + void clz_r(int rd, int rm, Condition cc = AL) + { + m_buffer.putInt(static_cast<ARMWord>(cc) | CLZ | RD(rd) | RM(rm)); + } +#endif + + void bkpt(ARMWord value) + { +#if ARM_ARCH_VERSION >= 5 + m_buffer.putInt(BKPT | ((value & 0xff0) << 4) | (value & 0xf)); +#else + // Cannot access to Zero memory address + dtr_dr(true, ARM::S0, ARM::S0, ARM::S0); +#endif + } + + static ARMWord lsl(int reg, ARMWord value) + { + ASSERT(reg <= ARM::pc); + ASSERT(value <= 0x1f); + return reg | (value << 7) | 0x00; + } + + static ARMWord lsr(int reg, ARMWord value) + { + ASSERT(reg <= ARM::pc); + ASSERT(value <= 0x1f); + return reg | (value << 7) | 0x20; + } + + static ARMWord asr(int reg, ARMWord value) + { + ASSERT(reg <= ARM::pc); + ASSERT(value <= 0x1f); + return reg | (value << 7) | 0x40; + } + + static ARMWord lsl_r(int reg, int shiftReg) + { + ASSERT(reg <= ARM::pc); + ASSERT(shiftReg <= ARM::pc); + return reg | (shiftReg << 8) | 0x10; + } + + static ARMWord lsr_r(int reg, int shiftReg) + { + ASSERT(reg <= ARM::pc); + ASSERT(shiftReg <= ARM::pc); + return reg | (shiftReg << 8) | 0x30; + } + + static ARMWord asr_r(int reg, int shiftReg) + { + ASSERT(reg <= ARM::pc); + ASSERT(shiftReg <= ARM::pc); + return reg | (shiftReg << 8) | 0x50; + } + + // General helpers + + int size() + { + return m_buffer.size(); + } + + void ensureSpace(int insnSpace, int constSpace) + { + m_buffer.ensureSpace(insnSpace, constSpace); + } + + JmpDst label() + { + return JmpDst(m_buffer.size()); + } + + JmpDst align(int alignment) + { + while (!m_buffer.isAligned(alignment)) + mov_r(ARM::r0, ARM::r0); + + return label(); + } + + JmpSrc jmp(Condition cc = AL) + { + int s = size(); + ldr_un_imm(ARM::pc, 0xffffffff, cc); + m_jumps.append(s); + return JmpSrc(s); + } + + void* executableCopy(ExecutablePool* allocator); + + // Patching helpers + + static ARMWord* getLdrImmAddress(ARMWord* insn, uint32_t* constPool = 0); + static void linkBranch(void* code, JmpSrc from, void* to); + + static void patchPointerInternal(intptr_t from, void* to) + { + ARMWord* insn = reinterpret_cast<ARMWord*>(from); + ARMWord* addr = getLdrImmAddress(insn); + *addr = reinterpret_cast<ARMWord>(to); + ExecutableAllocator::cacheFlush(addr, sizeof(ARMWord)); + } + + static ARMWord patchConstantPoolLoad(ARMWord load, ARMWord value) + { + value = (value << 1) + 1; + ASSERT(!(value & ~0xfff)); + return (load & ~0xfff) | value; + } + + static void patchConstantPoolLoad(void* loadAddr, void* constPoolAddr); + + // Patch pointers + + static void linkPointer(void* code, JmpDst from, void* to) + { + patchPointerInternal(reinterpret_cast<intptr_t>(code) + from.m_offset, to); + } + + static void repatchInt32(void* from, int32_t to) + { + patchPointerInternal(reinterpret_cast<intptr_t>(from), reinterpret_cast<void*>(to)); + } + + static void repatchPointer(void* from, void* to) + { + patchPointerInternal(reinterpret_cast<intptr_t>(from), to); + } + + static void repatchLoadPtrToLEA(void* from) + { + // On arm, this is a patch from LDR to ADD. It is restricted conversion, + // from special case to special case, altough enough for its purpose + ARMWord* insn = reinterpret_cast<ARMWord*>(from); + ASSERT((*insn & 0x0ff00f00) == 0x05900000); + + *insn = (*insn & 0xf00ff0ff) | 0x02800000; + ExecutableAllocator::cacheFlush(insn, sizeof(ARMWord)); + } + + // Linkers + + void linkJump(JmpSrc from, JmpDst to) + { + ARMWord* insn = reinterpret_cast<ARMWord*>(m_buffer.data()) + (from.m_offset / sizeof(ARMWord)); + *getLdrImmAddress(insn, m_buffer.poolAddress()) = static_cast<ARMWord>(to.m_offset); + } + + static void linkJump(void* code, JmpSrc from, void* to) + { + linkBranch(code, from, to); + } + + static void relinkJump(void* from, void* to) + { + patchPointerInternal(reinterpret_cast<intptr_t>(from) - sizeof(ARMWord), to); + } + + static void linkCall(void* code, JmpSrc from, void* to) + { + linkBranch(code, from, to); + } + + static void relinkCall(void* from, void* to) + { + relinkJump(from, to); + } + + // Address operations + + static void* getRelocatedAddress(void* code, JmpSrc jump) + { + return reinterpret_cast<void*>(reinterpret_cast<ARMWord*>(code) + jump.m_offset / sizeof(ARMWord) + 1); + } + + static void* getRelocatedAddress(void* code, JmpDst label) + { + return reinterpret_cast<void*>(reinterpret_cast<ARMWord*>(code) + label.m_offset / sizeof(ARMWord)); + } + + // Address differences + + static int getDifferenceBetweenLabels(JmpDst from, JmpSrc to) + { + return (to.m_offset + sizeof(ARMWord)) - from.m_offset; + } + + static int getDifferenceBetweenLabels(JmpDst from, JmpDst to) + { + return to.m_offset - from.m_offset; + } + + static unsigned getCallReturnOffset(JmpSrc call) + { + return call.m_offset + sizeof(ARMWord); + } + + // Handle immediates + + static ARMWord getOp2Byte(ARMWord imm) + { + ASSERT(imm <= 0xff); + return OP2_IMMh | (imm & 0x0f) | ((imm & 0xf0) << 4) ; + } + + static ARMWord getOp2(ARMWord imm); + ARMWord getImm(ARMWord imm, int tmpReg, bool invert = false); + void moveImm(ARMWord imm, int dest); + + // Memory load/store helpers + + void dataTransfer32(bool isLoad, RegisterID srcDst, RegisterID base, int32_t offset); + void baseIndexTransfer32(bool isLoad, RegisterID srcDst, RegisterID base, RegisterID index, int scale, int32_t offset); + void doubleTransfer(bool isLoad, FPRegisterID srcDst, RegisterID base, int32_t offset); + + // Constant pool hnadlers + + static ARMWord placeConstantPoolBarrier(int offset) + { + offset = (offset - sizeof(ARMWord)) >> 2; + ASSERT((offset <= BOFFSET_MAX && offset >= BOFFSET_MIN)); + return AL | B | (offset & BRANCH_MASK); + } + + private: + ARMWord RM(int reg) + { + ASSERT(reg <= ARM::pc); + return reg; + } + + ARMWord RS(int reg) + { + ASSERT(reg <= ARM::pc); + return reg << 8; + } + + ARMWord RD(int reg) + { + ASSERT(reg <= ARM::pc); + return reg << 12; + } + + ARMWord RN(int reg) + { + ASSERT(reg <= ARM::pc); + return reg << 16; + } + + static ARMWord getConditionalField(ARMWord i) + { + return i & 0xf0000000; + } + + int genInt(int reg, ARMWord imm, bool positive); + + ARMBuffer m_buffer; + Jumps m_jumps; + }; + +} // namespace JSC + +#endif // ENABLE(ASSEMBLER) && PLATFORM(ARM) + +#endif // ARMAssembler_h diff --git a/JavaScriptCore/assembler/ARMv7Assembler.h b/JavaScriptCore/assembler/ARMv7Assembler.h index c9cb87e..f7e2fb4 100644 --- a/JavaScriptCore/assembler/ARMv7Assembler.h +++ b/JavaScriptCore/assembler/ARMv7Assembler.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 Apple Inc. All rights reserved. + * 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 @@ -28,7 +28,7 @@ #include <wtf/Platform.h> -#if ENABLE(ASSEMBLER) && PLATFORM(ARM_V7) +#if ENABLE(ASSEMBLER) && PLATFORM_ARM_ARCH(7) #include "AssemblerBuffer.h" #include <wtf/Assertions.h> @@ -442,6 +442,7 @@ public: { } + void enableLatePatch() { } private: JmpSrc(int offset) : m_offset(offset) @@ -898,7 +899,7 @@ public: m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_EOR_imm_T1, rn, rd, imm); } - // What is wrong with you people?, xor is not spelled with an 'e'. :-( + // xor is not spelled with an 'e'. :-( void eor(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) { ASSERT(!BadReg(rd)); @@ -907,7 +908,7 @@ public: m_formatter.twoWordOp12Reg4FourFours(OP_EOR_reg_T2, rn, FourFours(shift.hi4(), rd, shift.lo4(), rm)); } - // What is wrong with you people?, xor is not spelled with an 'e'. :-( + // xor is not spelled with an 'e'. :-( void eor(RegisterID rd, RegisterID rn, RegisterID rm) { if ((rd == rn) && !((rd | rm) & 8)) @@ -1520,7 +1521,7 @@ public: linkWithOffset(location, relative); } - // bah, this mathod should really be static, since it is used by the PatchBuffer. + // 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) { @@ -1528,51 +1529,51 @@ public: ASSERT(from.m_offset != -1); ASSERT(reinterpret_cast<intptr_t>(to) & 1); - patchPointer(reinterpret_cast<uint16_t*>(reinterpret_cast<intptr_t>(code) + from.m_offset) - 1, to); + setPointer(reinterpret_cast<uint16_t*>(reinterpret_cast<intptr_t>(code) + from.m_offset) - 1, to); } - static void patchPointer(void* code, JmpDst where, void* value) + static void linkPointer(void* code, JmpDst where, void* value) { - patchPointer(reinterpret_cast<char*>(code) + where.m_offset, value); + setPointer(reinterpret_cast<char*>(code) + where.m_offset, value); } static void relinkJump(void* from, void* to) { - ExecutableAllocator::MakeWritable unprotect(reinterpret_cast<uint16_t*>(from) - 2, 2 * sizeof(uint16_t)); - ASSERT(!(reinterpret_cast<intptr_t>(from) & 1)); ASSERT(!(reinterpret_cast<intptr_t>(to) & 1)); intptr_t relative = reinterpret_cast<intptr_t>(to) - reinterpret_cast<intptr_t>(from); linkWithOffset(reinterpret_cast<uint16_t*>(from), relative); + + ExecutableAllocator::cacheFlush(reinterpret_cast<uint16_t*>(from) - 2, 2 * sizeof(uint16_t)); } static void relinkCall(void* from, void* to) { - ExecutableAllocator::MakeWritable unprotect(reinterpret_cast<uint16_t*>(from) - 5, 4 * sizeof(uint16_t)); - ASSERT(!(reinterpret_cast<intptr_t>(from) & 1)); ASSERT(reinterpret_cast<intptr_t>(to) & 1); - patchPointer(reinterpret_cast<uint16_t*>(from) - 1, to); + setPointer(reinterpret_cast<uint16_t*>(from) - 1, to); + + ExecutableAllocator::cacheFlush(reinterpret_cast<uint16_t*>(from) - 5, 4 * sizeof(uint16_t)); } static void repatchInt32(void* where, int32_t value) { - ExecutableAllocator::MakeWritable unprotect(reinterpret_cast<uint16_t*>(where) - 4, 4 * sizeof(uint16_t)); - ASSERT(!(reinterpret_cast<intptr_t>(where) & 1)); - patchInt32(where, value); + setInt32(where, value); + + ExecutableAllocator::cacheFlush(reinterpret_cast<uint16_t*>(where) - 4, 4 * sizeof(uint16_t)); } static void repatchPointer(void* where, void* value) { - ExecutableAllocator::MakeWritable unprotect(reinterpret_cast<uint16_t*>(where) - 4, 4 * sizeof(uint16_t)); - ASSERT(!(reinterpret_cast<intptr_t>(where) & 1)); - patchPointer(where, value); + setPointer(where, value); + + ExecutableAllocator::cacheFlush(reinterpret_cast<uint16_t*>(where) - 4, 4 * sizeof(uint16_t)); } static void repatchLoadPtrToLEA(void* where) @@ -1582,8 +1583,8 @@ public: uint16_t* loadOp = reinterpret_cast<uint16_t*>(where) + 4; ASSERT((*loadOp & 0xfff0) == OP_LDR_reg_T2); - ExecutableAllocator::MakeWritable unprotect(loadOp, sizeof(uint16_t)); *loadOp = OP_ADD_reg_T3 | (*loadOp & 0xf); + ExecutableAllocator::cacheFlush(loadOp, sizeof(uint16_t)); } private: @@ -1610,12 +1611,10 @@ private: m_formatter.vfpOp(0x0b00ed00 | offset | (up << 7) | (isLoad << 4) | doubleRegisterMask(rd, 6, 28) | rn); } - static void patchInt32(void* code, uint32_t value) + static void setInt32(void* code, uint32_t value) { uint16_t* location = reinterpret_cast<uint16_t*>(code); - ExecutableAllocator::MakeWritable unprotect(location - 4, 4 * sizeof(uint16_t)); - uint16_t lo16 = value; uint16_t hi16 = value >> 16; @@ -1623,11 +1622,13 @@ private: spliceLo11(location - 3, lo16); spliceHi5(location - 2, hi16); spliceLo11(location - 1, hi16); + + ExecutableAllocator::cacheFlush(location - 4, 4 * sizeof(uint16_t)); } - static void patchPointer(void* code, void* value) + static void setPointer(void* code, void* value) { - patchInt32(code, reinterpret_cast<uint32_t>(value)); + setInt32(code, reinterpret_cast<uint32_t>(value)); } // Linking & patching: @@ -1753,6 +1754,6 @@ private: } // namespace JSC -#endif // ENABLE(ASSEMBLER) && PLATFORM(ARM_V7) +#endif // ENABLE(ASSEMBLER) && PLATFORM_ARM_ARCH(7) #endif // ARMAssembler_h diff --git a/JavaScriptCore/assembler/AbstractMacroAssembler.h b/JavaScriptCore/assembler/AbstractMacroAssembler.h index 7460029..f927ed2 100644 --- a/JavaScriptCore/assembler/AbstractMacroAssembler.h +++ b/JavaScriptCore/assembler/AbstractMacroAssembler.h @@ -29,34 +29,26 @@ #include <wtf/Platform.h> #include <MacroAssemblerCodeRef.h> +#include <CodeLocation.h> #include <wtf/Noncopyable.h> #include <wtf/UnusedParam.h> #if ENABLE(ASSEMBLER) -// FIXME: keep transitioning this out into MacroAssemblerX86_64. -#if PLATFORM(X86_64) -#define REPTACH_OFFSET_CALL_R11 3 -#endif - namespace JSC { +class LinkBuffer; +class RepatchBuffer; + template <class AssemblerType> class AbstractMacroAssembler { public: + typedef AssemblerType AssemblerType_T; + typedef MacroAssemblerCodePtr CodePtr; typedef MacroAssemblerCodeRef CodeRef; class Jump; - class PatchBuffer; - class CodeLocationInstruction; - class CodeLocationLabel; - class CodeLocationJump; - class CodeLocationCall; - class CodeLocationNearCall; - class CodeLocationDataLabel32; - class CodeLocationDataLabelPtr; - class ProcessorReturnAddress; typedef typename AssemblerType::RegisterID RegisterID; typedef typename AssemblerType::FPRegisterID FPRegisterID; @@ -181,7 +173,7 @@ public: struct Imm32 { explicit Imm32(int32_t value) : m_value(value) -#if PLATFORM(ARM_V7) +#if PLATFORM(ARM) , m_isPointer(false) #endif { @@ -190,7 +182,7 @@ public: #if !PLATFORM(X86_64) explicit Imm32(ImmPtr ptr) : m_value(ptr.asIntptr()) -#if PLATFORM(ARM_V7) +#if PLATFORM(ARM) , m_isPointer(true) #endif { @@ -198,7 +190,7 @@ public: #endif int32_t m_value; -#if PLATFORM(ARM_V7) +#if PLATFORM(ARM) // 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. @@ -227,7 +219,7 @@ public: friend class AbstractMacroAssembler; friend class Jump; friend class MacroAssemblerCodeRef; - friend class PatchBuffer; + friend class LinkBuffer; public: Label() @@ -252,7 +244,7 @@ public: class DataLabelPtr { template<class TemplateAssemblerType> friend class AbstractMacroAssembler; - friend class PatchBuffer; + friend class LinkBuffer; public: DataLabelPtr() { @@ -274,7 +266,7 @@ public: class DataLabel32 { template<class TemplateAssemblerType> friend class AbstractMacroAssembler; - friend class PatchBuffer; + friend class LinkBuffer; public: DataLabel32() { @@ -298,7 +290,7 @@ public: class Call { template<class TemplateAssemblerType> friend class AbstractMacroAssembler; - friend class PatchBuffer; + public: enum Flags { None = 0x0, @@ -328,8 +320,13 @@ public: return Call(jump.m_jmp, Linkable); } - private: + void enableLatePatch() + { + m_jmp.enableLatePatch(); + } + JmpSrc m_jmp; + private: Flags m_flags; }; @@ -343,7 +340,7 @@ public: template<class TemplateAssemblerType> friend class AbstractMacroAssembler; friend class Call; - friend class PatchBuffer; + friend class LinkBuffer; public: Jump() { @@ -364,6 +361,11 @@ public: masm->m_assembler.linkJump(m_jmp, label.m_label); } + void enableLatePatch() + { + m_jmp.enableLatePatch(); + } + private: JmpSrc m_jmp; }; @@ -373,9 +375,11 @@ public: // 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; + friend class LinkBuffer; public: + typedef Vector<Jump, 16> JumpVector; + void link(AbstractMacroAssembler<AssemblerType>* masm) { size_t size = m_jumps.size(); @@ -406,504 +410,21 @@ public: { return !m_jumps.size(); } - - private: - Vector<Jump, 16> m_jumps; - }; - - - // Section 3: MacroAssembler JIT instruction stream handles. - // - // The MacroAssembler supported facilities to modify a JIT generated - // instruction stream after it has been generated (relinking calls and - // jumps, and repatching data values). The following types are used - // to store handles into the underlying instruction stream, the type - // providing semantic information as to what it is that is in the - // instruction stream at this point, and thus what operations may be - // performed on it. - - - // CodeLocationCommon: - // - // Base type for other CodeLocation* types. A postion in the JIT genertaed - // instruction stream, without any semantic information. - class CodeLocationCommon { - public: - CodeLocationCommon() - { - } - - // In order to avoid the need to store multiple handles into the - // instructions stream, where the code generation is deterministic - // and the labels will always be a fixed distance apart, these - // methods may be used to recover a handle that has nopw been - // retained, based on a known fixed relative offset from one that has. - 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: - explicit CodeLocationCommon(CodePtr location) - : m_location(location) - { - } - - void* dataLocation() { return m_location.dataLocation(); } - void* executableAddress() { return m_location.executableAddress(); } - - void reset() - { - m_location = CodePtr(); - } - - private: - CodePtr m_location; - }; - - // CodeLocationInstruction: - // - // An arbitrary instruction in the JIT code. - class CodeLocationInstruction : public CodeLocationCommon { - friend class CodeLocationCommon; - public: - CodeLocationInstruction() - { - } - - void repatchLoadPtrToLEA() - { - AssemblerType::repatchLoadPtrToLEA(this->dataLocation()); - } - - private: - explicit CodeLocationInstruction(void* location) - : CodeLocationCommon(CodePtr(location)) - { - } - }; - - // CodeLocationLabel: - // - // A point in the JIT code maked with a label. - class CodeLocationLabel : public CodeLocationCommon { - friend class CodeLocationCommon; - friend class CodeLocationJump; - friend class CodeLocationCall; - friend class CodeLocationNearCall; - friend class PatchBuffer; - friend class ProcessorReturnAddress; - - public: - CodeLocationLabel() - { - } - - void* addressForSwitch() { return this->executableAddress(); } - void* addressForExceptionHandler() { return this->executableAddress(); } - void* addressForJSR() { return this->executableAddress(); } - - bool operator!() - { - return !this->executableAddress(); - } - - void reset() - { - CodeLocationCommon::reset(); - } - - private: - explicit CodeLocationLabel(CodePtr location) - : CodeLocationCommon(location) - { - } - - explicit CodeLocationLabel(void* location) - : CodeLocationCommon(CodePtr(location)) - { - } - - void* getJumpDestination() { return this->executableAddress(); } - }; - - // CodeLocationJump: - // - // A point in the JIT code at which there is a jump instruction. - class CodeLocationJump : public CodeLocationCommon { - friend class CodeLocationCommon; - friend class PatchBuffer; - public: - CodeLocationJump() - { - } - - void relink(CodeLocationLabel destination) - { - AssemblerType::relinkJump(this->dataLocation(), destination.dataLocation()); - } - - private: - explicit CodeLocationJump(void* location) - : CodeLocationCommon(CodePtr(location)) - { - } - }; - - // CodeLocationCall: - // - // A point in the JIT code at which there is a call instruction. - class CodeLocationCall : public CodeLocationCommon { - friend class CodeLocationCommon; - friend class PatchBuffer; - friend class ProcessorReturnAddress; - public: - CodeLocationCall() - { - } - - void relink(CodeLocationLabel destination) - { -#if PLATFORM(X86_64) - CodeLocationCommon::dataLabelPtrAtOffset(-REPTACH_OFFSET_CALL_R11).repatch(destination.executableAddress()); -#else - AssemblerType::relinkCall(this->dataLocation(), destination.executableAddress()); -#endif - } - - void relink(FunctionPtr destination) - { -#if PLATFORM(X86_64) - CodeLocationCommon::dataLabelPtrAtOffset(-REPTACH_OFFSET_CALL_R11).repatch(destination.executableAddress()); -#else - AssemblerType::relinkCall(this->dataLocation(), destination.executableAddress()); -#endif - } - - // This methods returns the value that will be set as the return address - // within a function that has been called from this call instruction. - void* calleeReturnAddressValue() - { - return this->executableAddress(); - } - - private: - explicit CodeLocationCall(CodePtr location) - : CodeLocationCommon(location) - { - } - - explicit CodeLocationCall(void* location) - : CodeLocationCommon(CodePtr(location)) - { - } - }; - - // CodeLocationNearCall: - // - // A point in the JIT code at which there is a call instruction with near linkage. - class CodeLocationNearCall : public CodeLocationCommon { - friend class CodeLocationCommon; - friend class PatchBuffer; - friend class ProcessorReturnAddress; - public: - CodeLocationNearCall() - { - } - - void relink(CodePtr destination) - { - AssemblerType::relinkCall(this->dataLocation(), destination.executableAddress()); - } - - void relink(CodeLocationLabel destination) - { - AssemblerType::relinkCall(this->dataLocation(), destination.executableAddress()); - } - - void relink(FunctionPtr destination) - { - AssemblerType::relinkCall(this->dataLocation(), destination.executableAddress()); - } - - // This methods returns the value that will be set as the return address - // within a function that has been called from this call instruction. - void* calleeReturnAddressValue() - { - return this->executableAddress(); - } - - private: - explicit CodeLocationNearCall(CodePtr location) - : CodeLocationCommon(location) - { - } - - explicit CodeLocationNearCall(void* location) - : CodeLocationCommon(CodePtr(location)) - { - } - }; - - // CodeLocationDataLabel32: - // - // A point in the JIT code at which there is an int32_t immediate that may be repatched. - class CodeLocationDataLabel32 : public CodeLocationCommon { - friend class CodeLocationCommon; - friend class PatchBuffer; - public: - CodeLocationDataLabel32() - { - } - - void repatch(int32_t value) - { - AssemblerType::repatchInt32(this->dataLocation(), value); - } - - private: - explicit CodeLocationDataLabel32(void* location) - : CodeLocationCommon(CodePtr(location)) - { - } - }; - - // CodeLocationDataLabelPtr: - // - // A point in the JIT code at which there is a void* immediate that may be repatched. - class CodeLocationDataLabelPtr : public CodeLocationCommon { - friend class CodeLocationCommon; - friend class PatchBuffer; - public: - CodeLocationDataLabelPtr() - { - } - - void repatch(void* value) - { - AssemblerType::repatchPointer(this->dataLocation(), value); - } - - private: - explicit CodeLocationDataLabelPtr(void* location) - : CodeLocationCommon(CodePtr(location)) - { - } - }; - - // ProcessorReturnAddress: - // - // This class can be used to relink a call identified by its return address. - class ProcessorReturnAddress { - friend class CodeLocationCall; - friend class CodeLocationNearCall; - public: - ProcessorReturnAddress(void* location) - : m_location(location) - { - } - - void relinkCallerToTrampoline(CodeLocationLabel label) - { - CodeLocationCall(CodePtr(m_location)).relink(label); - } - - void relinkCallerToTrampoline(CodePtr newCalleeFunction) - { - relinkCallerToTrampoline(CodeLocationLabel(newCalleeFunction)); - } - - void relinkCallerToFunction(FunctionPtr function) - { - CodeLocationCall(CodePtr(m_location)).relink(function); - } - - void relinkNearCallerToTrampoline(CodeLocationLabel label) - { - CodeLocationNearCall(CodePtr(m_location)).relink(label); - } - void relinkNearCallerToTrampoline(CodePtr newCalleeFunction) - { - relinkNearCallerToTrampoline(CodeLocationLabel(newCalleeFunction)); - } - - void* addressForLookup() - { - return m_location.value(); - } + const JumpVector& jumps() { return m_jumps; } private: - ReturnAddressPtr m_location; + JumpVector m_jumps; }; - // Section 4: PatchBuffer - utility to finalize code generation. + // Section 3: Misc admin methods static CodePtr trampolineAt(CodeRef ref, Label label) { return CodePtr(AssemblerType::getRelocatedAddress(ref.m_code.dataLocation(), label.m_label)); } - // 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 Noncopyable { - 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. - PatchBuffer(AbstractMacroAssembler<AssemblerType>* masm, PassRefPtr<ExecutablePool> 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 - { - } - - ~PatchBuffer() - { - 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)); -#if PLATFORM(X86_64) - if (!call.isFlagSet(Call::Near)) { - char* callLocation = reinterpret_cast<char*>(AssemblerType::getRelocatedAddress(code(), call.m_jmp)) - REPTACH_OFFSET_CALL_R11; - AssemblerType::patchPointerForCall(callLocation, function.value()); - } else -#endif - AssemblerType::linkCall(code(), call.m_jmp, function.value()); - } - - void link(Jump jump, CodeLocationLabel label) - { - AssemblerType::linkJump(code(), jump.m_jmp, label.dataLocation()); - } - - void link(JumpList list, CodeLocationLabel label) - { - for (unsigned i = 0; i < list.m_jumps.size(); ++i) - AssemblerType::linkJump(code(), list.m_jumps[i].m_jmp, label.dataLocation()); - } - - void patch(DataLabelPtr label, void* value) - { - AssemblerType::patchPointer(code(), label.m_label, value); - } - - void patch(DataLabelPtr label, CodeLocationLabel value) - { - AssemblerType::patchPointer(code(), label.m_label, value.getJumpDestination()); - } - - // 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(AssemblerType::getRelocatedAddress(code(), call.m_jmp)); - } - - CodeLocationNearCall locationOfNearCall(Call call) - { - ASSERT(call.isFlagSet(Call::Linkable)); - ASSERT(call.isFlagSet(Call::Near)); - return CodeLocationNearCall(AssemblerType::getRelocatedAddress(code(), call.m_jmp)); - } - - CodeLocationLabel locationOf(Label label) - { - return CodeLocationLabel(AssemblerType::getRelocatedAddress(code(), label.m_label)); - } - - CodeLocationDataLabelPtr locationOf(DataLabelPtr label) - { - return CodeLocationDataLabelPtr(AssemblerType::getRelocatedAddress(code(), label.m_label)); - } - - CodeLocationDataLabel32 locationOf(DataLabel32 label) - { - return CodeLocationDataLabel32(AssemblerType::getRelocatedAddress(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 AssemblerType::getCallReturnOffset(call.m_jmp); - } - - // 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); - } - - RefPtr<ExecutablePool> m_executablePool; - void* m_code; - size_t m_size; -#ifndef NDEBUG - bool m_completed; -#endif - }; - - - // Section 5: Misc admin methods - size_t size() { return m_assembler.size(); @@ -962,50 +483,60 @@ public: protected: AssemblerType m_assembler; -}; + friend class LinkBuffer; + friend class RepatchBuffer; -template <class AssemblerType> -typename AbstractMacroAssembler<AssemblerType>::CodeLocationInstruction AbstractMacroAssembler<AssemblerType>::CodeLocationCommon::instructionAtOffset(int offset) -{ - return typename AbstractMacroAssembler::CodeLocationInstruction(reinterpret_cast<char*>(dataLocation()) + offset); -} + static void linkJump(void* code, Jump jump, CodeLocationLabel target) + { + AssemblerType::linkJump(code, jump.m_jmp, target.dataLocation()); + } -template <class AssemblerType> -typename AbstractMacroAssembler<AssemblerType>::CodeLocationLabel AbstractMacroAssembler<AssemblerType>::CodeLocationCommon::labelAtOffset(int offset) -{ - return typename AbstractMacroAssembler::CodeLocationLabel(reinterpret_cast<char*>(dataLocation()) + offset); -} + static void linkPointer(void* code, typename AssemblerType::JmpDst label, void* value) + { + AssemblerType::linkPointer(code, label, value); + } -template <class AssemblerType> -typename AbstractMacroAssembler<AssemblerType>::CodeLocationJump AbstractMacroAssembler<AssemblerType>::CodeLocationCommon::jumpAtOffset(int offset) -{ - return typename AbstractMacroAssembler::CodeLocationJump(reinterpret_cast<char*>(dataLocation()) + offset); -} + static void* getLinkerAddress(void* code, typename AssemblerType::JmpSrc label) + { + return AssemblerType::getRelocatedAddress(code, label); + } -template <class AssemblerType> -typename AbstractMacroAssembler<AssemblerType>::CodeLocationCall AbstractMacroAssembler<AssemblerType>::CodeLocationCommon::callAtOffset(int offset) -{ - return typename AbstractMacroAssembler::CodeLocationCall(reinterpret_cast<char*>(dataLocation()) + offset); -} + static void* getLinkerAddress(void* code, typename AssemblerType::JmpDst label) + { + return AssemblerType::getRelocatedAddress(code, label); + } -template <class AssemblerType> -typename AbstractMacroAssembler<AssemblerType>::CodeLocationNearCall AbstractMacroAssembler<AssemblerType>::CodeLocationCommon::nearCallAtOffset(int offset) -{ - return typename AbstractMacroAssembler::CodeLocationNearCall(reinterpret_cast<char*>(dataLocation()) + offset); -} + static unsigned getLinkerCallReturnOffset(Call call) + { + return AssemblerType::getCallReturnOffset(call.m_jmp); + } -template <class AssemblerType> -typename AbstractMacroAssembler<AssemblerType>::CodeLocationDataLabelPtr AbstractMacroAssembler<AssemblerType>::CodeLocationCommon::dataLabelPtrAtOffset(int offset) -{ - return typename AbstractMacroAssembler::CodeLocationDataLabelPtr(reinterpret_cast<char*>(dataLocation()) + offset); -} + static void repatchJump(CodeLocationJump jump, CodeLocationLabel destination) + { + AssemblerType::relinkJump(jump.dataLocation(), destination.dataLocation()); + } -template <class AssemblerType> -typename AbstractMacroAssembler<AssemblerType>::CodeLocationDataLabel32 AbstractMacroAssembler<AssemblerType>::CodeLocationCommon::dataLabel32AtOffset(int offset) -{ - return typename AbstractMacroAssembler::CodeLocationDataLabel32(reinterpret_cast<char*>(dataLocation()) + offset); -} + 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 diff --git a/JavaScriptCore/assembler/AssemblerBuffer.h b/JavaScriptCore/assembler/AssemblerBuffer.h index 7a5a8d3..073906a 100644 --- a/JavaScriptCore/assembler/AssemblerBuffer.h +++ b/JavaScriptCore/assembler/AssemblerBuffer.h @@ -95,12 +95,14 @@ namespace JSC { void putIntUnchecked(int value) { + ASSERT(!(m_size > m_capacity - 4)); *reinterpret_cast<int*>(&m_buffer[m_size]) = value; m_size += 4; } void putInt64Unchecked(int64_t value) { + ASSERT(!(m_size > m_capacity - 8)); *reinterpret_cast<int64_t*>(&m_buffer[m_size]) = value; m_size += 8; } @@ -137,10 +139,19 @@ namespace JSC { 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<char*>(fastMalloc(m_capacity)); diff --git a/JavaScriptCore/assembler/AssemblerBufferWithConstantPool.h b/JavaScriptCore/assembler/AssemblerBufferWithConstantPool.h new file mode 100644 index 0000000..f15b7f3 --- /dev/null +++ b/JavaScriptCore/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 <wtf/Platform.h> + +#if ENABLE(ASSEMBLER) + +#include "AssemblerBuffer.h" +#include <wtf/SegmentedVector.h> + +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 <int maxPoolSize, int barrierSize, int maxInstructionSize, class AssemblerType> +class AssemblerBufferWithConstantPool: public AssemblerBuffer { + typedef WTF::SegmentedVector<uint32_t, 512> LoadOffsets; +public: + enum { + UniqueConst, + ReusableConst, + UnusedEntry, + }; + + AssemblerBufferWithConstantPool() + : AssemblerBuffer() + , m_numConsts(0) + , m_maxDistance(maxPoolSize) + , m_lastConstDelta(0) + { + m_pool = static_cast<uint32_t*>(fastMalloc(maxPoolSize)); + m_mask = static_cast<char*>(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<char>(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<char*>(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<void*>(m_buffer + *iter); + AssemblerType::patchConstantPoolLoad(loadAddr, reinterpret_cast<void*>(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/JavaScriptCore/assembler/CodeLocation.h b/JavaScriptCore/assembler/CodeLocation.h new file mode 100644 index 0000000..b910b6f --- /dev/null +++ b/JavaScriptCore/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 <wtf/Platform.h> + +#include <MacroAssemblerCodeRef.h> + +#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<char*>(dataLocation()) + offset); +} + +inline CodeLocationLabel CodeLocationCommon::labelAtOffset(int offset) +{ + ASSERT_VALID_CODE_OFFSET(offset); + return CodeLocationLabel(reinterpret_cast<char*>(dataLocation()) + offset); +} + +inline CodeLocationJump CodeLocationCommon::jumpAtOffset(int offset) +{ + ASSERT_VALID_CODE_OFFSET(offset); + return CodeLocationJump(reinterpret_cast<char*>(dataLocation()) + offset); +} + +inline CodeLocationCall CodeLocationCommon::callAtOffset(int offset) +{ + ASSERT_VALID_CODE_OFFSET(offset); + return CodeLocationCall(reinterpret_cast<char*>(dataLocation()) + offset); +} + +inline CodeLocationNearCall CodeLocationCommon::nearCallAtOffset(int offset) +{ + ASSERT_VALID_CODE_OFFSET(offset); + return CodeLocationNearCall(reinterpret_cast<char*>(dataLocation()) + offset); +} + +inline CodeLocationDataLabelPtr CodeLocationCommon::dataLabelPtrAtOffset(int offset) +{ + ASSERT_VALID_CODE_OFFSET(offset); + return CodeLocationDataLabelPtr(reinterpret_cast<char*>(dataLocation()) + offset); +} + +inline CodeLocationDataLabel32 CodeLocationCommon::dataLabel32AtOffset(int offset) +{ + ASSERT_VALID_CODE_OFFSET(offset); + return CodeLocationDataLabel32(reinterpret_cast<char*>(dataLocation()) + offset); +} + +} // namespace JSC + +#endif // ENABLE(ASSEMBLER) + +#endif // CodeLocation_h diff --git a/JavaScriptCore/assembler/LinkBuffer.h b/JavaScriptCore/assembler/LinkBuffer.h new file mode 100644 index 0000000..6d08117 --- /dev/null +++ b/JavaScriptCore/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 <wtf/Platform.h> + +#if ENABLE(ASSEMBLER) + +#include <MacroAssembler.h> +#include <wtf/Noncopyable.h> + +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> 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<ExecutablePool> 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/JavaScriptCore/assembler/MacroAssembler.h b/JavaScriptCore/assembler/MacroAssembler.h index c9749a0..9e1c5d3 100644 --- a/JavaScriptCore/assembler/MacroAssembler.h +++ b/JavaScriptCore/assembler/MacroAssembler.h @@ -30,10 +30,14 @@ #if ENABLE(ASSEMBLER) -#if PLATFORM(ARM_V7) +#if PLATFORM_ARM_ARCH(7) #include "MacroAssemblerARMv7.h" namespace JSC { typedef MacroAssemblerARMv7 MacroAssemblerBase; }; +#elif PLATFORM(ARM) +#include "MacroAssemblerARM.h" +namespace JSC { typedef MacroAssemblerARM MacroAssemblerBase; }; + #elif PLATFORM(X86) #include "MacroAssemblerX86.h" namespace JSC { typedef MacroAssemblerX86 MacroAssemblerBase; }; diff --git a/JavaScriptCore/assembler/MacroAssemblerARM.h b/JavaScriptCore/assembler/MacroAssemblerARM.h new file mode 100644 index 0000000..b04ed13 --- /dev/null +++ b/JavaScriptCore/assembler/MacroAssemblerARM.h @@ -0,0 +1,794 @@ +/* + * Copyright (C) 2008 Apple Inc. + * 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 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 MacroAssemblerARM_h +#define MacroAssemblerARM_h + +#include <wtf/Platform.h> + +#if ENABLE(ASSEMBLER) && PLATFORM(ARM) + +#include "ARMAssembler.h" +#include "AbstractMacroAssembler.h" + +namespace JSC { + +class MacroAssemblerARM : public AbstractMacroAssembler<ARMAssembler> { +public: + enum Condition { + Equal = ARMAssembler::EQ, + NotEqual = ARMAssembler::NE, + Above = ARMAssembler::HI, + AboveOrEqual = ARMAssembler::CS, + Below = ARMAssembler::CC, + BelowOrEqual = ARMAssembler::LS, + GreaterThan = ARMAssembler::GT, + GreaterThanOrEqual = ARMAssembler::GE, + LessThan = ARMAssembler::LT, + LessThanOrEqual = ARMAssembler::LE, + Overflow = ARMAssembler::VS, + Signed = ARMAssembler::MI, + Zero = ARMAssembler::EQ, + NonZero = ARMAssembler::NE + }; + + enum DoubleCondition { + DoubleEqual = ARMAssembler::EQ, + DoubleGreaterThan = ARMAssembler::GT, + DoubleGreaterThanOrEqual = ARMAssembler::GE, + DoubleLessThan = ARMAssembler::LT, + DoubleLessThanOrEqual = ARMAssembler::LE, + }; + + static const RegisterID stackPointerRegister = ARM::sp; + + static const Scale ScalePtr = TimesFour; + + void add32(RegisterID src, RegisterID dest) + { + m_assembler.adds_r(dest, dest, src); + } + + void add32(Imm32 imm, Address address) + { + load32(address, ARM::S1); + add32(imm, ARM::S1); + store32(ARM::S1, address); + } + + void add32(Imm32 imm, RegisterID dest) + { + m_assembler.adds_r(dest, dest, m_assembler.getImm(imm.m_value, ARM::S0)); + } + + void add32(Address src, RegisterID dest) + { + load32(src, ARM::S1); + add32(ARM::S1, dest); + } + + void and32(RegisterID src, RegisterID dest) + { + m_assembler.ands_r(dest, dest, src); + } + + void and32(Imm32 imm, RegisterID dest) + { + ARMWord w = m_assembler.getImm(imm.m_value, ARM::S0, true); + if (w & ARMAssembler::OP2_INV_IMM) + m_assembler.bics_r(dest, dest, w & ~ARMAssembler::OP2_INV_IMM); + else + m_assembler.ands_r(dest, dest, w); + } + + void lshift32(Imm32 imm, RegisterID dest) + { + m_assembler.movs_r(dest, m_assembler.lsl(dest, imm.m_value & 0x1f)); + } + + void lshift32(RegisterID shift_amount, RegisterID dest) + { + m_assembler.movs_r(dest, m_assembler.lsl_r(dest, shift_amount)); + } + + void mul32(RegisterID src, RegisterID dest) + { + if (src == dest) { + move(src, ARM::S0); + src = ARM::S0; + } + m_assembler.muls_r(dest, dest, src); + } + + void mul32(Imm32 imm, RegisterID src, RegisterID dest) + { + move(imm, ARM::S0); + m_assembler.muls_r(dest, src, ARM::S0); + } + + void not32(RegisterID dest) + { + m_assembler.mvns_r(dest, dest); + } + + void or32(RegisterID src, RegisterID dest) + { + m_assembler.orrs_r(dest, dest, src); + } + + void or32(Imm32 imm, RegisterID dest) + { + m_assembler.orrs_r(dest, dest, m_assembler.getImm(imm.m_value, ARM::S0)); + } + + void rshift32(RegisterID shift_amount, RegisterID dest) + { + m_assembler.movs_r(dest, m_assembler.asr_r(dest, shift_amount)); + } + + void rshift32(Imm32 imm, RegisterID dest) + { + m_assembler.movs_r(dest, m_assembler.asr(dest, imm.m_value & 0x1f)); + } + + void sub32(RegisterID src, RegisterID dest) + { + m_assembler.subs_r(dest, dest, src); + } + + void sub32(Imm32 imm, RegisterID dest) + { + m_assembler.subs_r(dest, dest, m_assembler.getImm(imm.m_value, ARM::S0)); + } + + void sub32(Imm32 imm, Address address) + { + load32(address, ARM::S1); + sub32(imm, ARM::S1); + store32(ARM::S1, address); + } + + void sub32(Address src, RegisterID dest) + { + load32(src, ARM::S1); + sub32(ARM::S1, dest); + } + + void xor32(RegisterID src, RegisterID dest) + { + m_assembler.eors_r(dest, dest, src); + } + + void xor32(Imm32 imm, RegisterID dest) + { + m_assembler.eors_r(dest, dest, m_assembler.getImm(imm.m_value, ARM::S0)); + } + + void load32(ImplicitAddress address, RegisterID dest) + { + m_assembler.dataTransfer32(true, dest, address.base, address.offset); + } + + void load32(BaseIndex address, RegisterID dest) + { + m_assembler.baseIndexTransfer32(true, dest, address.base, address.index, static_cast<int>(address.scale), address.offset); + } + + DataLabel32 load32WithAddressOffsetPatch(Address address, RegisterID dest) + { + DataLabel32 dataLabel(this); + m_assembler.ldr_un_imm(ARM::S0, 0); + m_assembler.dtr_ur(true, dest, address.base, ARM::S0); + return dataLabel; + } + + Label loadPtrWithPatchToLEA(Address address, RegisterID dest) + { + Label label(this); + load32(address, dest); + return label; + } + + void load16(BaseIndex address, RegisterID dest) + { + m_assembler.add_r(ARM::S0, address.base, m_assembler.lsl(address.index, address.scale)); + if (address.offset>=0) + m_assembler.ldrh_u(dest, ARM::S0, ARMAssembler::getOp2Byte(address.offset)); + else + m_assembler.ldrh_d(dest, ARM::S0, ARMAssembler::getOp2Byte(-address.offset)); + } + + DataLabel32 store32WithAddressOffsetPatch(RegisterID src, Address address) + { + DataLabel32 dataLabel(this); + m_assembler.ldr_un_imm(ARM::S0, 0); + m_assembler.dtr_ur(false, src, address.base, ARM::S0); + return dataLabel; + } + + void store32(RegisterID src, ImplicitAddress address) + { + m_assembler.dataTransfer32(false, src, address.base, address.offset); + } + + void store32(RegisterID src, BaseIndex address) + { + m_assembler.baseIndexTransfer32(false, src, address.base, address.index, static_cast<int>(address.scale), address.offset); + } + + void store32(Imm32 imm, ImplicitAddress address) + { + if (imm.m_isPointer) + m_assembler.ldr_un_imm(ARM::S1, imm.m_value); + else + move(imm, ARM::S1); + store32(ARM::S1, address); + } + + void store32(RegisterID src, void* address) + { + m_assembler.ldr_un_imm(ARM::S0, reinterpret_cast<ARMWord>(address)); + m_assembler.dtr_u(false, src, ARM::S0, 0); + } + + void store32(Imm32 imm, void* address) + { + m_assembler.ldr_un_imm(ARM::S0, reinterpret_cast<ARMWord>(address)); + if (imm.m_isPointer) + m_assembler.ldr_un_imm(ARM::S1, imm.m_value); + else + m_assembler.moveImm(imm.m_value, ARM::S1); + m_assembler.dtr_u(false, ARM::S1, ARM::S0, 0); + } + + void pop(RegisterID dest) + { + m_assembler.pop_r(dest); + } + + void push(RegisterID src) + { + m_assembler.push_r(src); + } + + void push(Address address) + { + load32(address, ARM::S1); + push(ARM::S1); + } + + void push(Imm32 imm) + { + move(imm, ARM::S0); + push(ARM::S0); + } + + void move(Imm32 imm, RegisterID dest) + { + if (imm.m_isPointer) + m_assembler.ldr_un_imm(dest, imm.m_value); + else + m_assembler.moveImm(imm.m_value, dest); + } + + void move(RegisterID src, RegisterID dest) + { + m_assembler.mov_r(dest, src); + } + + void move(ImmPtr imm, RegisterID dest) + { + move(Imm32(imm), dest); + } + + void swap(RegisterID reg1, RegisterID reg2) + { + m_assembler.mov_r(ARM::S0, reg1); + m_assembler.mov_r(reg1, reg2); + m_assembler.mov_r(reg2, ARM::S0); + } + + void signExtend32ToPtr(RegisterID src, RegisterID dest) + { + if (src != dest) + move(src, dest); + } + + void zeroExtend32ToPtr(RegisterID src, RegisterID dest) + { + if (src != dest) + move(src, dest); + } + + Jump branch32(Condition cond, RegisterID left, RegisterID right) + { + m_assembler.cmp_r(left, right); + return Jump(m_assembler.jmp(ARMCondition(cond))); + } + + Jump branch32(Condition cond, RegisterID left, Imm32 right) + { + if (right.m_isPointer) { + m_assembler.ldr_un_imm(ARM::S0, right.m_value); + m_assembler.cmp_r(left, ARM::S0); + } else + m_assembler.cmp_r(left, m_assembler.getImm(right.m_value, ARM::S0)); + return Jump(m_assembler.jmp(ARMCondition(cond))); + } + + Jump branch32(Condition cond, RegisterID left, Address right) + { + load32(right, ARM::S1); + return branch32(cond, left, ARM::S1); + } + + Jump branch32(Condition cond, Address left, RegisterID right) + { + load32(left, ARM::S1); + return branch32(cond, ARM::S1, right); + } + + Jump branch32(Condition cond, Address left, Imm32 right) + { + load32(left, ARM::S1); + return branch32(cond, ARM::S1, right); + } + + Jump branch32(Condition cond, BaseIndex left, Imm32 right) + { + load32(left, ARM::S1); + return branch32(cond, ARM::S1, right); + } + + Jump branch16(Condition cond, BaseIndex left, RegisterID right) + { + UNUSED_PARAM(cond); + UNUSED_PARAM(left); + UNUSED_PARAM(right); + ASSERT_NOT_REACHED(); + return jump(); + } + + Jump branch16(Condition cond, BaseIndex left, Imm32 right) + { + load16(left, ARM::S0); + move(right, ARM::S1); + m_assembler.cmp_r(ARM::S0, ARM::S1); + return m_assembler.jmp(ARMCondition(cond)); + } + + Jump branchTest32(Condition cond, RegisterID reg, RegisterID mask) + { + ASSERT((cond == Zero) || (cond == NonZero)); + m_assembler.tst_r(reg, mask); + return Jump(m_assembler.jmp(ARMCondition(cond))); + } + + Jump branchTest32(Condition cond, RegisterID reg, Imm32 mask = Imm32(-1)) + { + ASSERT((cond == Zero) || (cond == NonZero)); + ARMWord w = m_assembler.getImm(mask.m_value, ARM::S0, true); + if (w & ARMAssembler::OP2_INV_IMM) + m_assembler.bics_r(ARM::S0, reg, w & ~ARMAssembler::OP2_INV_IMM); + else + m_assembler.tst_r(reg, w); + return Jump(m_assembler.jmp(ARMCondition(cond))); + } + + Jump branchTest32(Condition cond, Address address, Imm32 mask = Imm32(-1)) + { + load32(address, ARM::S1); + return branchTest32(cond, ARM::S1, mask); + } + + Jump branchTest32(Condition cond, BaseIndex address, Imm32 mask = Imm32(-1)) + { + load32(address, ARM::S1); + return branchTest32(cond, ARM::S1, mask); + } + + Jump jump() + { + return Jump(m_assembler.jmp()); + } + + void jump(RegisterID target) + { + move(target, ARM::pc); + } + + void jump(Address address) + { + load32(address, ARM::pc); + } + + Jump branchAdd32(Condition cond, RegisterID src, RegisterID dest) + { + ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); + add32(src, dest); + return Jump(m_assembler.jmp(ARMCondition(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.jmp(ARMCondition(cond))); + } + + void mull32(RegisterID src1, RegisterID src2, RegisterID dest) + { + if (src1 == dest) { + move(src1, ARM::S0); + src1 = ARM::S0; + } + m_assembler.mull_r(ARM::S1, dest, src2, src1); + m_assembler.cmp_r(ARM::S1, m_assembler.asr(dest, 31)); + } + + Jump branchMul32(Condition cond, RegisterID src, RegisterID dest) + { + ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); + if (cond == Overflow) { + mull32(src, dest, dest); + cond = NonZero; + } + else + mul32(src, dest); + return Jump(m_assembler.jmp(ARMCondition(cond))); + } + + Jump branchMul32(Condition cond, Imm32 imm, RegisterID src, RegisterID dest) + { + ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); + if (cond == Overflow) { + move(imm, ARM::S0); + mull32(ARM::S0, src, dest); + cond = NonZero; + } + else + mul32(imm, src, dest); + return Jump(m_assembler.jmp(ARMCondition(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.jmp(ARMCondition(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.jmp(ARMCondition(cond))); + } + + void breakpoint() + { + m_assembler.bkpt(0); + } + + Call nearCall() + { + prepareCall(); + return Call(m_assembler.jmp(), Call::LinkableNear); + } + + Call call(RegisterID target) + { + prepareCall(); + move(ARM::pc, target); + JmpSrc jmpSrc; + return Call(jmpSrc, Call::None); + } + + void call(Address address) + { + call32(address.base, address.offset); + } + + void ret() + { + pop(ARM::pc); + } + + void set32(Condition cond, RegisterID left, RegisterID right, RegisterID dest) + { + m_assembler.cmp_r(left, right); + m_assembler.mov_r(dest, ARMAssembler::getOp2(0)); + m_assembler.mov_r(dest, ARMAssembler::getOp2(1), ARMCondition(cond)); + } + + void set32(Condition cond, RegisterID left, Imm32 right, RegisterID dest) + { + m_assembler.cmp_r(left, m_assembler.getImm(right.m_value, ARM::S0)); + m_assembler.mov_r(dest, ARMAssembler::getOp2(0)); + m_assembler.mov_r(dest, ARMAssembler::getOp2(1), ARMCondition(cond)); + } + + void setTest32(Condition cond, Address address, Imm32 mask, RegisterID dest) + { + load32(address, ARM::S1); + if (mask.m_value == -1) + m_assembler.cmp_r(0, ARM::S1); + else + m_assembler.tst_r(ARM::S1, m_assembler.getImm(mask.m_value, ARM::S0)); + m_assembler.mov_r(dest, ARMAssembler::getOp2(0)); + m_assembler.mov_r(dest, ARMAssembler::getOp2(1), ARMCondition(cond)); + } + + void add32(Imm32 imm, RegisterID src, RegisterID dest) + { + m_assembler.add_r(dest, src, m_assembler.getImm(imm.m_value, ARM::S0)); + } + + void add32(Imm32 imm, AbsoluteAddress address) + { + m_assembler.ldr_un_imm(ARM::S1, reinterpret_cast<ARMWord>(address.m_ptr)); + m_assembler.dtr_u(true, ARM::S1, ARM::S1, 0); + add32(imm, ARM::S1); + m_assembler.ldr_un_imm(ARM::S0, reinterpret_cast<ARMWord>(address.m_ptr)); + m_assembler.dtr_u(false, ARM::S1, ARM::S0, 0); + } + + void sub32(Imm32 imm, AbsoluteAddress address) + { + m_assembler.ldr_un_imm(ARM::S1, reinterpret_cast<ARMWord>(address.m_ptr)); + m_assembler.dtr_u(true, ARM::S1, ARM::S1, 0); + sub32(imm, ARM::S1); + m_assembler.ldr_un_imm(ARM::S0, reinterpret_cast<ARMWord>(address.m_ptr)); + m_assembler.dtr_u(false, ARM::S1, ARM::S0, 0); + } + + void load32(void* address, RegisterID dest) + { + m_assembler.ldr_un_imm(ARM::S0, reinterpret_cast<ARMWord>(address)); + m_assembler.dtr_u(true, dest, ARM::S0, 0); + } + + Jump branch32(Condition cond, AbsoluteAddress left, RegisterID right) + { + load32(left.m_ptr, ARM::S1); + return branch32(cond, ARM::S1, right); + } + + Jump branch32(Condition cond, AbsoluteAddress left, Imm32 right) + { + load32(left.m_ptr, ARM::S1); + return branch32(cond, ARM::S1, right); + } + + Call call() + { + prepareCall(); + return Call(m_assembler.jmp(), Call::Linkable); + } + + Call tailRecursiveCall() + { + return Call::fromTailJump(jump()); + } + + Call makeTailRecursiveCall(Jump oldJump) + { + return Call::fromTailJump(oldJump); + } + + DataLabelPtr moveWithPatch(ImmPtr initialValue, RegisterID dest) + { + DataLabelPtr dataLabel(this); + m_assembler.ldr_un_imm(dest, reinterpret_cast<ARMWord>(initialValue.m_value)); + return dataLabel; + } + + Jump branchPtrWithPatch(Condition cond, RegisterID left, DataLabelPtr& dataLabel, ImmPtr initialRightValue = ImmPtr(0)) + { + dataLabel = moveWithPatch(initialRightValue, ARM::S1); + Jump jump = branch32(cond, left, ARM::S1); + jump.enableLatePatch(); + return jump; + } + + Jump branchPtrWithPatch(Condition cond, Address left, DataLabelPtr& dataLabel, ImmPtr initialRightValue = ImmPtr(0)) + { + load32(left, ARM::S1); + dataLabel = moveWithPatch(initialRightValue, ARM::S0); + Jump jump = branch32(cond, ARM::S0, ARM::S1); + jump.enableLatePatch(); + return jump; + } + + DataLabelPtr storePtrWithPatch(ImmPtr initialValue, ImplicitAddress address) + { + DataLabelPtr dataLabel = moveWithPatch(initialValue, ARM::S1); + store32(ARM::S1, address); + return dataLabel; + } + + DataLabelPtr storePtrWithPatch(ImplicitAddress address) + { + return storePtrWithPatch(ImmPtr(0), address); + } + + // Floating point operators + bool supportsFloatingPoint() const + { + // FIXME: should be a dynamic test: VFP, FPA, or nothing + return false; + } + + bool supportsFloatingPointTruncate() const + { + return false; + } + + void loadDouble(ImplicitAddress address, FPRegisterID dest) + { + m_assembler.doubleTransfer(true, dest, address.base, address.offset); + } + + void storeDouble(FPRegisterID src, ImplicitAddress address) + { + m_assembler.doubleTransfer(false, src, address.base, address.offset); + } + + void addDouble(FPRegisterID src, FPRegisterID dest) + { + m_assembler.faddd_r(dest, dest, src); + } + + void addDouble(Address src, FPRegisterID dest) + { + loadDouble(src, ARM::SD0); + addDouble(ARM::SD0, dest); + } + + void subDouble(FPRegisterID src, FPRegisterID dest) + { + m_assembler.fsubd_r(dest, dest, src); + } + + void subDouble(Address src, FPRegisterID dest) + { + loadDouble(src, ARM::SD0); + subDouble(ARM::SD0, dest); + } + + void mulDouble(FPRegisterID src, FPRegisterID dest) + { + m_assembler.fmuld_r(dest, dest, src); + } + + void mulDouble(Address src, FPRegisterID dest) + { + loadDouble(src, ARM::SD0); + mulDouble(ARM::SD0, dest); + } + + void convertInt32ToDouble(RegisterID src, FPRegisterID dest) + { + m_assembler.fmsr_r(dest, src); + m_assembler.fsitod_r(dest, dest); + } + + Jump branchDouble(DoubleCondition cond, FPRegisterID left, FPRegisterID right) + { + m_assembler.fcmpd_r(left, right); + m_assembler.fmstat(); + return Jump(m_assembler.jmp(static_cast<ARMAssembler::Condition>(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) + { + UNUSED_PARAM(src); + UNUSED_PARAM(dest); + ASSERT_NOT_REACHED(); + return jump(); + } + +protected: + ARMAssembler::Condition ARMCondition(Condition cond) + { + return static_cast<ARMAssembler::Condition>(cond); + } + + void prepareCall() + { + m_assembler.ensureSpace(3 * sizeof(ARMWord), sizeof(ARMWord)); + + // S0 might be used for parameter passing + m_assembler.add_r(ARM::S1, ARM::pc, ARMAssembler::OP2_IMM | 0x4); + m_assembler.push_r(ARM::S1); + } + + void call32(RegisterID base, int32_t offset) + { + if (base == ARM::sp) + offset += 4; + + if (offset >= 0) { + if (offset <= 0xfff) { + prepareCall(); + m_assembler.dtr_u(true, ARM::pc, base, offset); + } else if (offset <= 0xfffff) { + m_assembler.add_r(ARM::S0, base, ARMAssembler::OP2_IMM | (offset >> 12) | (10 << 8)); + prepareCall(); + m_assembler.dtr_u(true, ARM::pc, ARM::S0, offset & 0xfff); + } else { + ARMWord reg = m_assembler.getImm(offset, ARM::S0); + prepareCall(); + m_assembler.dtr_ur(true, ARM::pc, base, reg); + } + } else { + offset = -offset; + if (offset <= 0xfff) { + prepareCall(); + m_assembler.dtr_d(true, ARM::pc, base, offset); + } else if (offset <= 0xfffff) { + m_assembler.sub_r(ARM::S0, base, ARMAssembler::OP2_IMM | (offset >> 12) | (10 << 8)); + prepareCall(); + m_assembler.dtr_d(true, ARM::pc, ARM::S0, offset & 0xfff); + } else { + ARMWord reg = m_assembler.getImm(offset, ARM::S0); + prepareCall(); + m_assembler.dtr_dr(true, ARM::pc, base, reg); + } + } + } + +private: + friend class LinkBuffer; + friend class RepatchBuffer; + + static void linkCall(void* code, Call call, FunctionPtr function) + { + ARMAssembler::linkCall(code, call.m_jmp, function.value()); + } + + static void repatchCall(CodeLocationCall call, CodeLocationLabel destination) + { + ARMAssembler::relinkCall(call.dataLocation(), destination.executableAddress()); + } + + static void repatchCall(CodeLocationCall call, FunctionPtr destination) + { + ARMAssembler::relinkCall(call.dataLocation(), destination.executableAddress()); + } + +}; + +} + +#endif + +#endif // MacroAssemblerARM_h diff --git a/JavaScriptCore/assembler/MacroAssemblerARMv7.h b/JavaScriptCore/assembler/MacroAssemblerARMv7.h index 5ccbd43..f7a8402 100644 --- a/JavaScriptCore/assembler/MacroAssemblerARMv7.h +++ b/JavaScriptCore/assembler/MacroAssemblerARMv7.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 Apple Inc. All rights reserved. + * 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 @@ -1054,6 +1054,25 @@ protected: { return static_cast<ARMv7Assembler::Condition>(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 diff --git a/JavaScriptCore/assembler/MacroAssemblerCodeRef.h b/JavaScriptCore/assembler/MacroAssemblerCodeRef.h index 0aa985c..341a7ff 100644 --- a/JavaScriptCore/assembler/MacroAssemblerCodeRef.h +++ b/JavaScriptCore/assembler/MacroAssemblerCodeRef.h @@ -37,7 +37,7 @@ // 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_V7) +#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 @@ -46,9 +46,12 @@ #define ASSERT_VALID_CODE_POINTER(ptr) \ ASSERT(reinterpret_cast<intptr_t>(ptr) & ~1); \ ASSERT(reinterpret_cast<intptr_t>(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 { @@ -98,6 +101,12 @@ public: 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: @@ -115,7 +124,7 @@ public: } explicit MacroAssemblerCodePtr(void* value) -#if PLATFORM(ARM_V7) +#if PLATFORM_ARM_ARCH(7) // Decorate the pointer as a thumb code pointer. : m_value(reinterpret_cast<char*>(value) + 1) #else @@ -132,13 +141,18 @@ public: } void* executableAddress() const { return m_value; } -#if PLATFORM(ARM_V7) +#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<char*>(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; }; @@ -151,28 +165,20 @@ private: class MacroAssemblerCodeRef { public: MacroAssemblerCodeRef() -#ifndef NDEBUG : m_size(0) -#endif { } MacroAssemblerCodeRef(void* code, PassRefPtr<ExecutablePool> executablePool, size_t size) : m_code(code) , m_executablePool(executablePool) + , m_size(size) { -#ifndef NDEBUG - m_size = size; -#else - UNUSED_PARAM(size); -#endif } MacroAssemblerCodePtr m_code; RefPtr<ExecutablePool> m_executablePool; -#ifndef NDEBUG size_t m_size; -#endif }; } // namespace JSC diff --git a/JavaScriptCore/assembler/MacroAssemblerX86.h b/JavaScriptCore/assembler/MacroAssemblerX86.h index aaf98fd..6e96240 100644 --- a/JavaScriptCore/assembler/MacroAssemblerX86.h +++ b/JavaScriptCore/assembler/MacroAssemblerX86.h @@ -51,6 +51,8 @@ public: using MacroAssemblerX86Common::store32; using MacroAssemblerX86Common::branch32; using MacroAssemblerX86Common::call; + using MacroAssemblerX86Common::loadDouble; + using MacroAssemblerX86Common::convertInt32ToDouble; void add32(Imm32 imm, RegisterID src, RegisterID dest) { @@ -87,6 +89,17 @@ public: 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); @@ -164,6 +177,24 @@ public: 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 diff --git a/JavaScriptCore/assembler/MacroAssemblerX86Common.h b/JavaScriptCore/assembler/MacroAssemblerX86Common.h index cea691e..c9e3569 100644 --- a/JavaScriptCore/assembler/MacroAssemblerX86Common.h +++ b/JavaScriptCore/assembler/MacroAssemblerX86Common.h @@ -57,6 +57,7 @@ public: enum DoubleCondition { DoubleEqual = X86Assembler::ConditionE, + DoubleNotEqual = X86Assembler::ConditionNE, DoubleGreaterThan = X86Assembler::ConditionA, DoubleGreaterThanOrEqual = X86Assembler::ConditionAE, DoubleLessThan = X86Assembler::ConditionB, @@ -91,6 +92,11 @@ public: { 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) { @@ -102,6 +108,16 @@ public: 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); @@ -138,16 +154,36 @@ public: { 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) { @@ -159,6 +195,16 @@ public: 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); @@ -211,14 +257,35 @@ public: 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, RegisterID srcDest) + void xor32(Imm32 imm, Address dest) { - m_assembler.xorl_ir(imm.m_value, srcDest); + 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); } @@ -300,6 +367,18 @@ public: 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()); @@ -330,6 +409,11 @@ public: 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()); @@ -337,6 +421,12 @@ public: 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 @@ -348,6 +438,12 @@ public: return branch32(Equal, dest, Imm32(0x80000000)); } + void zeroDouble(FPRegisterID srcDest) + { + ASSERT(isSSE2Present()); + m_assembler.xorpd_rr(srcDest, srcDest); + } + // Stack manipulation operations: // @@ -397,7 +493,8 @@ public: { // 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? - m_assembler.movq_rr(src, dest); + if (src != dest) + m_assembler.movq_rr(src, dest); } void move(ImmPtr imm, RegisterID dest) @@ -605,12 +702,40 @@ public: 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) { @@ -632,7 +757,35 @@ public: 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: @@ -661,6 +814,27 @@ public: 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); @@ -682,6 +856,16 @@ public: // 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) diff --git a/JavaScriptCore/assembler/MacroAssemblerX86_64.h b/JavaScriptCore/assembler/MacroAssemblerX86_64.h index ffdca7c..e3d296c 100644 --- a/JavaScriptCore/assembler/MacroAssemblerX86_64.h +++ b/JavaScriptCore/assembler/MacroAssemblerX86_64.h @@ -32,6 +32,8 @@ #include "MacroAssemblerX86Common.h" +#define REPTACH_OFFSET_CALL_R11 3 + namespace JSC { class MacroAssemblerX86_64 : public MacroAssemblerX86Common { @@ -48,6 +50,8 @@ public: using MacroAssemblerX86Common::load32; using MacroAssemblerX86Common::store32; using MacroAssemblerX86Common::call; + using MacroAssemblerX86Common::loadDouble; + using MacroAssemblerX86Common::convertInt32ToDouble; void add32(Imm32 imm, AbsoluteAddress address) { @@ -84,6 +88,18 @@ public: } } + void loadDouble(void* address, FPRegisterID dest) + { + move(ImmPtr(address), scratchRegister); + loadDouble(scratchRegister, dest); + } + + void convertInt32ToDouble(AbsoluteAddress src, FPRegisterID dest) + { + move(Imm32(*static_cast<int32_t*>(src.m_ptr)), scratchRegister); + m_assembler.cvtsi2sd_rr(scratchRegister, dest); + } + void store32(Imm32 imm, void* address) { move(X86::eax, scratchRegister); @@ -446,6 +462,29 @@ public: 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 diff --git a/JavaScriptCore/assembler/RepatchBuffer.h b/JavaScriptCore/assembler/RepatchBuffer.h new file mode 100644 index 0000000..89cbf06 --- /dev/null +++ b/JavaScriptCore/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 <wtf/Platform.h> + +#if ENABLE(ASSEMBLER) + +#include <MacroAssembler.h> +#include <wtf/Noncopyable.h> + +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/JavaScriptCore/assembler/X86Assembler.h b/JavaScriptCore/assembler/X86Assembler.h index 7a8b58d..fb58361 100644 --- a/JavaScriptCore/assembler/X86Assembler.h +++ b/JavaScriptCore/assembler/X86Assembler.h @@ -114,10 +114,12 @@ private: 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) @@ -169,6 +171,8 @@ private: 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_JCC_rel32 = 0x80, @@ -205,6 +209,7 @@ private: GROUP3_OP_TEST = 0, GROUP3_OP_NOT = 2, + GROUP3_OP_NEG = 3, GROUP3_OP_IDIV = 7, GROUP5_OP_CALLN = 2, @@ -226,6 +231,7 @@ public: { } + void enableLatePatch() { } private: JmpSrc(int offset) : m_offset(offset) @@ -318,6 +324,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)) { @@ -385,6 +396,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)) { @@ -436,11 +457,26 @@ public: } #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); @@ -451,6 +487,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)) { @@ -512,6 +553,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)) { @@ -568,6 +614,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)) { @@ -648,7 +715,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); @@ -1153,6 +1225,11 @@ public: return m_formatter.immediateRel32(); } + JmpSrc jz() + { + return je(); + } + JmpSrc jl() { m_formatter.twoByteOp(jccRel32(ConditionL)); @@ -1245,6 +1322,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); @@ -1283,6 +1374,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); @@ -1320,6 +1419,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() @@ -1344,6 +1467,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)) @@ -1366,59 +1494,48 @@ public: ASSERT(to.m_offset != -1); char* code = reinterpret_cast<char*>(m_formatter.data()); - patchRel32(code + from.m_offset, code + to.m_offset); + setRel32(code + from.m_offset, code + to.m_offset); } static void linkJump(void* code, JmpSrc from, void* to) { ASSERT(from.m_offset != -1); - patchRel32(reinterpret_cast<char*>(code) + from.m_offset, to); + setRel32(reinterpret_cast<char*>(code) + from.m_offset, to); } static void linkCall(void* code, JmpSrc from, void* to) { ASSERT(from.m_offset != -1); - patchRel32(reinterpret_cast<char*>(code) + from.m_offset, to); - } - -#if PLATFORM(X86_64) - static void patchPointerForCall(void* where, void* value) - { - reinterpret_cast<void**>(where)[-1] = value; + setRel32(reinterpret_cast<char*>(code) + from.m_offset, to); } -#endif - static void patchPointer(void* code, JmpDst where, void* value) + static void linkPointer(void* code, JmpDst where, void* value) { ASSERT(where.m_offset != -1); - patchPointer(reinterpret_cast<char*>(code) + where.m_offset, value); + setPointer(reinterpret_cast<char*>(code) + where.m_offset, value); } static void relinkJump(void* from, void* to) { - ExecutableAllocator::MakeWritable unprotect(reinterpret_cast<char*>(from) - sizeof(int32_t), sizeof(int32_t)); - patchRel32(from, to); + setRel32(from, to); } static void relinkCall(void* from, void* to) { - ExecutableAllocator::MakeWritable unprotect(reinterpret_cast<char*>(from) - sizeof(int32_t), sizeof(int32_t)); - patchRel32(from, to); + setRel32(from, to); } static void repatchInt32(void* where, int32_t value) { - ExecutableAllocator::MakeWritable unprotect(reinterpret_cast<char*>(where) - sizeof(int32_t), sizeof(int32_t)); - patchInt32(where, value); + setInt32(where, value); } static void repatchPointer(void* where, void* value) { - ExecutableAllocator::MakeWritable unprotect(reinterpret_cast<char*>(where) - sizeof(void*), sizeof(void*)); - patchPointer(where, value); + setPointer(where, value); } static void repatchLoadPtrToLEA(void* where) @@ -1428,7 +1545,6 @@ public: // Skip over the prefix byte. where = reinterpret_cast<char*>(where) + 1; #endif - ExecutableAllocator::MakeWritable unprotect(where, 1); *reinterpret_cast<unsigned char*>(where) = static_cast<unsigned char>(OP_LEA); } @@ -1476,22 +1592,22 @@ public: private: - static void patchPointer(void* where, void* value) + static void setPointer(void* where, void* value) { reinterpret_cast<void**>(where)[-1] = value; } - static void patchInt32(void* where, int32_t value) + static void setInt32(void* where, int32_t value) { reinterpret_cast<int32_t*>(where)[-1] = value; } - static void patchRel32(void* from, void* to) + static void setRel32(void* from, void* to) { intptr_t offset = reinterpret_cast<intptr_t>(to) - reinterpret_cast<intptr_t>(from); ASSERT(offset == static_cast<int32_t>(offset)); - patchInt32(from, offset); + setInt32(from, offset); } class X86InstructionFormatter { @@ -1611,6 +1727,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: // diff --git a/JavaScriptCore/bytecode/CodeBlock.cpp b/JavaScriptCore/bytecode/CodeBlock.cpp index d2b122a..e22f25a 100644 --- a/JavaScriptCore/bytecode/CodeBlock.cpp +++ b/JavaScriptCore/bytecode/CodeBlock.cpp @@ -57,6 +57,9 @@ static UString escapeQuotes(const UString& str) static UString valueToSourceString(ExecState* exec, JSValue val) { + if (!val) + return "0"; + if (val.isString()) { UString result("\""); result += escapeQuotes(val.toString(exec)) + "\""; @@ -227,44 +230,44 @@ static void printGlobalResolveInfo(const GlobalResolveInfo& resolveInfo, unsigne static void printStructureStubInfo(const StructureStubInfo& stubInfo, unsigned instructionOffset) { - switch (stubInfo.opcodeID) { - case op_get_by_id_self: + switch (stubInfo.accessType) { + case access_get_by_id_self: printf(" [%4d] %s: %s\n", instructionOffset, "get_by_id_self", pointerToSourceString(stubInfo.u.getByIdSelf.baseObjectStructure).UTF8String().c_str()); return; - case op_get_by_id_proto: + case access_get_by_id_proto: printf(" [%4d] %s: %s, %s\n", instructionOffset, "get_by_id_proto", pointerToSourceString(stubInfo.u.getByIdProto.baseObjectStructure).UTF8String().c_str(), pointerToSourceString(stubInfo.u.getByIdProto.prototypeStructure).UTF8String().c_str()); return; - case op_get_by_id_chain: + case access_get_by_id_chain: printf(" [%4d] %s: %s, %s\n", instructionOffset, "get_by_id_chain", pointerToSourceString(stubInfo.u.getByIdChain.baseObjectStructure).UTF8String().c_str(), pointerToSourceString(stubInfo.u.getByIdChain.chain).UTF8String().c_str()); return; - case op_get_by_id_self_list: + case access_get_by_id_self_list: printf(" [%4d] %s: %s (%d)\n", instructionOffset, "op_get_by_id_self_list", pointerToSourceString(stubInfo.u.getByIdSelfList.structureList).UTF8String().c_str(), stubInfo.u.getByIdSelfList.listSize); return; - case op_get_by_id_proto_list: + case access_get_by_id_proto_list: printf(" [%4d] %s: %s (%d)\n", instructionOffset, "op_get_by_id_proto_list", pointerToSourceString(stubInfo.u.getByIdProtoList.structureList).UTF8String().c_str(), stubInfo.u.getByIdProtoList.listSize); return; - case op_put_by_id_transition: + case access_put_by_id_transition: printf(" [%4d] %s: %s, %s, %s\n", instructionOffset, "put_by_id_transition", pointerToSourceString(stubInfo.u.putByIdTransition.previousStructure).UTF8String().c_str(), pointerToSourceString(stubInfo.u.putByIdTransition.structure).UTF8String().c_str(), pointerToSourceString(stubInfo.u.putByIdTransition.chain).UTF8String().c_str()); return; - case op_put_by_id_replace: + case access_put_by_id_replace: printf(" [%4d] %s: %s\n", instructionOffset, "put_by_id_replace", pointerToSourceString(stubInfo.u.putByIdReplace.baseObjectStructure).UTF8String().c_str()); return; - case op_get_by_id: + case access_get_by_id: printf(" [%4d] %s\n", instructionOffset, "get_by_id"); return; - case op_put_by_id: + case access_put_by_id: printf(" [%4d] %s\n", instructionOffset, "put_by_id"); return; - case op_get_by_id_generic: + case access_get_by_id_generic: printf(" [%4d] %s\n", instructionOffset, "op_get_by_id_generic"); return; - case op_put_by_id_generic: + case access_put_by_id_generic: printf(" [%4d] %s\n", instructionOffset, "op_put_by_id_generic"); return; - case op_get_array_length: + case access_get_array_length: printf(" [%4d] %s\n", instructionOffset, "op_get_array_length"); return; - case op_get_string_length: + case access_get_string_length: printf(" [%4d] %s\n", instructionOffset, "op_get_string_length"); return; default: @@ -363,15 +366,6 @@ void CodeBlock::dump(ExecState* exec) const } 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<unsigned>(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; @@ -506,12 +500,6 @@ void CodeBlock::dump(ExecState* exec, const Vector<Instruction>::const_iterator& printf("[%4d] convert_this %s\n", location, registerName(r0).c_str()); break; } - case op_unexpected_load: { - 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()); - break; - } case op_new_object: { int r0 = (++it)->u.operand; printf("[%4d] new_object\t %s\n", location, registerName(r0).c_str()); @@ -610,6 +598,7 @@ void CodeBlock::dump(ExecState* exec, const Vector<Instruction>::const_iterator& } case op_div: { printBinaryOp(location, it, "div"); + ++it; break; } case op_mod: { @@ -754,13 +743,6 @@ void CodeBlock::dump(ExecState* exec, const Vector<Instruction>::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; @@ -1084,7 +1066,7 @@ void CodeBlock::dump(ExecState* exec, const Vector<Instruction>::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: { @@ -1142,7 +1124,6 @@ static HashSet<CodeBlock*> liveCodeBlockSet; #define FOR_EACH_MEMBER_VECTOR_RARE_DATA(macro) \ macro(regexps) \ macro(functions) \ - macro(unexpectedConstants) \ macro(exceptionHandlers) \ macro(immediateSwitchJumpTables) \ macro(characterSwitchJumpTables) \ @@ -1265,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> sourceProvider, unsigned sourceOffset) : m_numCalleeRegisters(0) - , m_numConstants(0) , m_numVars(0) , m_numParameters(0) , m_ownerNode(ownerNode) @@ -1315,19 +1316,26 @@ CodeBlock::~CodeBlock() } for (size_t size = m_methodCallLinkInfos.size(), i = 0; i < size; ++i) { - if (Structure* structure = m_methodCallLinkInfos[i].cachedStructure) + 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(); @@ -1342,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)) { @@ -1387,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)) { @@ -1418,29 +1428,27 @@ void CodeBlock::refStructures(Instruction* vPC) const ASSERT(vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id) || vPC[0].u.opcode == interpreter->getOpcode(op_put_by_id) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_generic) || vPC[0].u.opcode == interpreter->getOpcode(op_put_by_id_generic)); } -void CodeBlock::mark() +void CodeBlock::markAggregate(MarkStack& markStack) { - for (size_t i = 0; i < m_constantRegisters.size(); ++i) + for (size_t i = 0; i < m_constantRegisters.size(); ++i) { if (!m_constantRegisters[i].marked()) - m_constantRegisters[i].mark(); + markStack.append(m_constantRegisters[i].jsValue()); + } for (size_t i = 0; i < m_functionExpressions.size(); ++i) - m_functionExpressions[i]->body()->mark(); + m_functionExpressions[i]->body()->markAggregate(markStack); if (m_rareData) { for (size_t i = 0; i < m_rareData->m_functions.size(); ++i) - m_rareData->m_functions[i]->body()->mark(); + m_rareData->m_functions[i]->body()->markAggregate(markStack); - 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(); + m_rareData->m_evalCodeCache.markAggregate(markStack); } } void CodeBlock::reparseForExceptionInfoIfNecessary(CallFrame* callFrame) { + ASSERT(m_codeType != NativeCode); if (m_exceptionInfo) return; @@ -1511,6 +1519,7 @@ void CodeBlock::reparseForExceptionInfoIfNecessary(CallFrame* callFrame) HandlerInfo* CodeBlock::handlerForBytecodeOffset(unsigned bytecodeOffset) { + ASSERT(m_codeType != NativeCode); ASSERT(bytecodeOffset < m_instructionCount); if (!m_rareData) @@ -1529,6 +1538,7 @@ HandlerInfo* CodeBlock::handlerForBytecodeOffset(unsigned bytecodeOffset) int CodeBlock::lineNumberForBytecodeOffset(CallFrame* callFrame, unsigned bytecodeOffset) { + ASSERT(m_codeType != NativeCode); ASSERT(bytecodeOffset < m_instructionCount); reparseForExceptionInfoIfNecessary(callFrame); @@ -1554,6 +1564,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); @@ -1593,6 +1604,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); @@ -1621,6 +1633,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()) @@ -1647,6 +1660,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; @@ -1667,6 +1681,7 @@ bool CodeBlock::hasGlobalResolveInstructionAtBytecodeOffset(unsigned bytecodeOff #else bool CodeBlock::hasGlobalResolveInfoAtBytecodeOffset(unsigned bytecodeOffset) { + ASSERT(m_codeType != NativeCode); if (m_globalResolveInfos.isEmpty()) return false; @@ -1689,6 +1704,7 @@ bool CodeBlock::hasGlobalResolveInfoAtBytecodeOffset(unsigned bytecodeOffset) #if ENABLE(JIT) void CodeBlock::setJITCode(JITCode jitCode) { + ASSERT(m_codeType != NativeCode); ownerNode()->setJITCode(jitCode); #if !ENABLE(OPCODE_SAMPLING) if (!BytecodeGenerator::dumpsGeneratedCode()) @@ -1724,7 +1740,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/JavaScriptCore/bytecode/CodeBlock.h b/JavaScriptCore/bytecode/CodeBlock.h index ac29c6c..39b1db3 100644 --- a/JavaScriptCore/bytecode/CodeBlock.h +++ b/JavaScriptCore/bytecode/CodeBlock.h @@ -36,8 +36,10 @@ #include "JSGlobalObject.h" #include "JumpTable.h" #include "Nodes.h" +#include "PtrAndFlags.h" #include "RegExp.h" #include "UString.h" +#include <wtf/FastAllocBase.h> #include <wtf/RefPtr.h> #include <wtf/Vector.h> @@ -45,11 +47,21 @@ #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 { + enum HasSeenShouldRepatch { + hasSeenShouldRepatch + }; + class ExecState; - enum CodeType { GlobalCode, EvalCode, FunctionCode }; + enum CodeType { GlobalCode, EvalCode, FunctionCode, NativeCode }; static ALWAYS_INLINE int missingThisObjectMarker() { return std::numeric_limits<int>::max(); } @@ -59,7 +71,7 @@ namespace JSC { uint32_t target; uint32_t scopeDepth; #if ENABLE(JIT) - MacroAssembler::CodeLocationLabel nativeCode; + CodeLocationLabel nativeCode; #endif }; @@ -95,15 +107,25 @@ namespace JSC { } unsigned bytecodeIndex; - MacroAssembler::CodeLocationNearCall callReturnLocation; - MacroAssembler::CodeLocationDataLabelPtr hotPathBegin; - MacroAssembler::CodeLocationNearCall hotPathOther; - MacroAssembler::CodeLocationLabel coldPathOther; + CodeLocationNearCall callReturnLocation; + CodeLocationDataLabelPtr hotPathBegin; + CodeLocationNearCall hotPathOther; + PtrAndFlags<CodeBlock, HasSeenShouldRepatch> ownerCodeBlock; CodeBlock* callee; unsigned position; void setUnlinked() { callee = 0; } bool isLinked() { return callee; } + + bool seenOnce() + { + return ownerCodeBlock.isFlagSet(hasSeenShouldRepatch); + } + + void setSeen() + { + ownerCodeBlock.setFlag(hasSeenShouldRepatch); + } }; struct MethodCallLinkInfo { @@ -112,9 +134,20 @@ namespace JSC { { } - MacroAssembler::CodeLocationCall callReturnLocation; - MacroAssembler::CodeLocationDataLabelPtr structureLabel; + bool seenOnce() + { + return cachedPrototypeStructure.isFlagSet(hasSeenShouldRepatch); + } + + void setSeen() + { + cachedPrototypeStructure.setFlag(hasSeenShouldRepatch); + } + + CodeLocationCall callReturnLocation; + CodeLocationDataLabelPtr structureLabel; Structure* cachedStructure; + PtrAndFlags<Structure, HasSeenShouldRepatch> cachedPrototypeStructure; }; struct FunctionRegisterInfo { @@ -160,17 +193,17 @@ namespace JSC { inline void* getStructureStubInfoReturnLocation(StructureStubInfo* structureStubInfo) { - return structureStubInfo->callReturnLocation.calleeReturnAddressValue(); + return structureStubInfo->callReturnLocation.executableAddress(); } inline void* getCallLinkInfoReturnLocation(CallLinkInfo* callLinkInfo) { - return callLinkInfo->callReturnLocation.calleeReturnAddressValue(); + return callLinkInfo->callReturnLocation.executableAddress(); } inline void* getMethodCallLinkInfoReturnLocation(MethodCallLinkInfo* methodCallLinkInfo) { - return methodCallLinkInfo->callReturnLocation.calleeReturnAddressValue(); + return methodCallLinkInfo->callReturnLocation.executableAddress(); } inline unsigned getCallReturnOffset(CallReturnOffsetToBytecodeIndex* pc) @@ -215,16 +248,17 @@ namespace JSC { } #endif - class CodeBlock { + class CodeBlock : public FastAllocBase { friend class JIT; public: + CodeBlock(ScopeNode* ownerNode); CodeBlock(ScopeNode* ownerNode, CodeType, PassRefPtr<SourceProvider>, unsigned sourceOffset); ~CodeBlock(); - void mark(); + void markAggregate(MarkStack&); void refStructures(Instruction* vPC) const; void derefStructures(Instruction* vPC) const; -#if ENABLE(JIT) +#if ENABLE(JIT_OPTIMIZE_CALL) void unlinkCallers(); #endif @@ -247,19 +281,9 @@ namespace JSC { return false; } - ALWAYS_INLINE bool isConstantRegisterIndex(int index) - { - return index >= m_numVars && index < m_numVars + m_numConstants; - } - - ALWAYS_INLINE JSValue getConstant(int index) - { - return m_constantRegisters[index - m_numVars].jsValue(); - } - ALWAYS_INLINE bool isTemporaryRegisterIndex(int index) { - return index >= m_numVars + m_numConstants; + return index >= m_numVars; } HandlerInfo* handlerForBytecodeOffset(unsigned bytecodeOffset); @@ -287,25 +311,25 @@ namespace JSC { m_linkedCallerList.shrink(lastPos); } - StructureStubInfo& getStubInfo(void* returnAddress) + StructureStubInfo& getStubInfo(ReturnAddressPtr returnAddress) { - return *(binaryChop<StructureStubInfo, void*, getStructureStubInfoReturnLocation>(m_structureStubInfos.begin(), m_structureStubInfos.size(), returnAddress)); + return *(binaryChop<StructureStubInfo, void*, getStructureStubInfoReturnLocation>(m_structureStubInfos.begin(), m_structureStubInfos.size(), returnAddress.value())); } - CallLinkInfo& getCallLinkInfo(void* returnAddress) + CallLinkInfo& getCallLinkInfo(ReturnAddressPtr returnAddress) { - return *(binaryChop<CallLinkInfo, void*, getCallLinkInfoReturnLocation>(m_callLinkInfos.begin(), m_callLinkInfos.size(), returnAddress)); + return *(binaryChop<CallLinkInfo, void*, getCallLinkInfoReturnLocation>(m_callLinkInfos.begin(), m_callLinkInfos.size(), returnAddress.value())); } - MethodCallLinkInfo& getMethodCallLinkInfo(void* returnAddress) + MethodCallLinkInfo& getMethodCallLinkInfo(ReturnAddressPtr returnAddress) { - return *(binaryChop<MethodCallLinkInfo, void*, getMethodCallLinkInfoReturnLocation>(m_methodCallLinkInfos.begin(), m_methodCallLinkInfos.size(), returnAddress)); + return *(binaryChop<MethodCallLinkInfo, void*, getMethodCallLinkInfoReturnLocation>(m_methodCallLinkInfos.begin(), m_methodCallLinkInfos.size(), returnAddress.value())); } - unsigned getBytecodeIndex(CallFrame* callFrame, void* nativePC) + unsigned getBytecodeIndex(CallFrame* callFrame, ReturnAddressPtr returnAddress) { reparseForExceptionInfoIfNecessary(callFrame); - return binaryChop<CallReturnOffsetToBytecodeIndex, unsigned, getCallReturnOffset>(m_exceptionInfo->m_callReturnIndexVector.begin(), m_exceptionInfo->m_callReturnIndexVector.size(), ownerNode()->generatedJITCode().offsetOf(nativePC))->bytecodeIndex; + return binaryChop<CallReturnOffsetToBytecodeIndex, unsigned, getCallReturnOffset>(callReturnIndexVector().begin(), callReturnIndexVector().size(), ownerNode()->generatedJITCode().offsetOf(returnAddress.value()))->bytecodeIndex; } bool functionRegisterForBytecodeOffset(unsigned bytecodeOffset, int& functionRegisterIndex); @@ -320,6 +344,7 @@ namespace JSC { #endif #if ENABLE(JIT) + JITCode& getJITCode() { return ownerNode()->generatedJITCode(); } void setJITCode(JITCode); ExecutablePool* executablePool() { return ownerNode()->getExecutablePool(); } #endif @@ -340,8 +365,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); } @@ -399,7 +424,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(); } @@ -409,9 +436,6 @@ namespace JSC { bool hasFunctions() const { return m_functionExpressions.size() || (m_rareData && m_rareData->m_functions.size()); } - unsigned addUnexpectedConstant(JSValue v) { createRareDataIfNecessary(); unsigned size = m_rareData->m_unexpectedConstants.size(); m_rareData->m_unexpectedConstants.append(v); return size; } - JSValue 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(); } @@ -433,18 +457,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; @@ -457,6 +476,7 @@ namespace JSC { void createRareDataIfNecessary() { + ASSERT(m_codeType != NativeCode); if (!m_rareData) m_rareData.set(new RareData); } @@ -501,7 +521,7 @@ namespace JSC { SymbolTable m_symbolTable; - struct ExceptionInfo { + struct ExceptionInfo : FastAllocBase { Vector<ExpressionRangeInfo> m_expressionInfo; Vector<LineInfo> m_lineInfo; Vector<GetByIdExceptionInfo> m_getByIdExceptionInfo; @@ -512,12 +532,11 @@ namespace JSC { }; OwnPtr<ExceptionInfo> m_exceptionInfo; - struct RareData { + struct RareData : FastAllocBase { Vector<HandlerInfo> m_exceptionHandlers; // Rare Constants Vector<RefPtr<FuncDeclNode> > m_functions; - Vector<JSValue> m_unexpectedConstants; Vector<RefPtr<RegExp> > m_regexps; // Jump Tables @@ -572,6 +591,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/JavaScriptCore/bytecode/EvalCodeCache.h b/JavaScriptCore/bytecode/EvalCodeCache.h index f0ce73e..986525c 100644 --- a/JavaScriptCore/bytecode/EvalCodeCache.h +++ b/JavaScriptCore/bytecode/EvalCodeCache.h @@ -68,11 +68,11 @@ namespace JSC { bool isEmpty() const { return m_cacheMap.isEmpty(); } - void mark() + void markAggregate(MarkStack& markStack) { EvalCacheMap::iterator end = m_cacheMap.end(); for (EvalCacheMap::iterator ptr = m_cacheMap.begin(); ptr != end; ++ptr) - ptr->second->mark(); + ptr->second->markAggregate(markStack); } private: static const int maxCacheableSourceLength = 256; diff --git a/JavaScriptCore/bytecode/Instruction.h b/JavaScriptCore/bytecode/Instruction.h index 24ba490..bcef7fb 100644 --- a/JavaScriptCore/bytecode/Instruction.h +++ b/JavaScriptCore/bytecode/Instruction.h @@ -38,12 +38,12 @@ namespace JSC { - // *Sigh*, If the JIT is enabled we need to track the stubRountine (of type MacroAssembler::CodeLocationLabel), + // *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 MacroAssembler::CodeLocationLabel PolymorphicAccessStructureListStubRoutineType; + typedef CodeLocationLabel PolymorphicAccessStructureListStubRoutineType; #else typedef void* PolymorphicAccessStructureListStubRoutineType; #endif @@ -53,7 +53,7 @@ namespace JSC { class StructureChain; // Structure used by op_get_by_id_self_list and op_get_by_id_proto_list instruction to hold data off the main opcode stream. - struct PolymorphicAccessStructureList { + struct PolymorphicAccessStructureList : FastAllocBase { struct PolymorphicStubInfo { bool isChain; PolymorphicAccessStructureListStubRoutineType stubRoutine; diff --git a/JavaScriptCore/bytecode/JumpTable.h b/JavaScriptCore/bytecode/JumpTable.h index eee773c..b4f8e44 100644 --- a/JavaScriptCore/bytecode/JumpTable.h +++ b/JavaScriptCore/bytecode/JumpTable.h @@ -40,7 +40,7 @@ namespace JSC { struct OffsetLocation { int32_t branchOffset; #if ENABLE(JIT) - MacroAssembler::CodeLocationLabel ctiOffset; + CodeLocationLabel ctiOffset; #endif }; @@ -48,7 +48,7 @@ namespace JSC { typedef HashMap<RefPtr<UString::Rep>, OffsetLocation> StringOffsetTable; StringOffsetTable offsetTable; #if ENABLE(JIT) - MacroAssembler::CodeLocationLabel 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) @@ -61,7 +61,7 @@ namespace JSC { } #if ENABLE(JIT) - inline MacroAssembler::CodeLocationLabel ctiForValue(UString::Rep* value) + inline CodeLocationLabel ctiForValue(UString::Rep* value) { StringOffsetTable::const_iterator end = offsetTable.end(); StringOffsetTable::const_iterator loc = offsetTable.find(value); @@ -77,8 +77,8 @@ namespace JSC { Vector<int32_t> branchOffsets; int32_t min; #if ENABLE(JIT) - Vector<MacroAssembler::CodeLocationLabel> ctiOffsets; - MacroAssembler::CodeLocationLabel ctiDefault; + Vector<CodeLocationLabel> ctiOffsets; + CodeLocationLabel ctiDefault; #endif int32_t offsetForValue(int32_t value, int32_t defaultOffset); @@ -89,7 +89,7 @@ namespace JSC { } #if ENABLE(JIT) - inline MacroAssembler::CodeLocationLabel ctiForValue(int32_t value) + inline CodeLocationLabel ctiForValue(int32_t value) { if (value >= min && static_cast<uint32_t>(value - min) < ctiOffsets.size()) return ctiOffsets[value - min]; diff --git a/JavaScriptCore/bytecode/Opcode.h b/JavaScriptCore/bytecode/Opcode.h index f4421df..c9196ce 100644 --- a/JavaScriptCore/bytecode/Opcode.h +++ b/JavaScriptCore/bytecode/Opcode.h @@ -44,7 +44,6 @@ namespace JSC { 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) \ @@ -68,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) \ \ @@ -99,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) \ @@ -182,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 diff --git a/JavaScriptCore/bytecode/SamplingTool.h b/JavaScriptCore/bytecode/SamplingTool.h index 7d7dc9c..1a3f7cf 100644 --- a/JavaScriptCore/bytecode/SamplingTool.h +++ b/JavaScriptCore/bytecode/SamplingTool.h @@ -136,11 +136,11 @@ namespace JSC { class SamplingTool { public: - friend class CallRecord; + friend struct CallRecord; friend class HostCallRecord; #if ENABLE(OPCODE_SAMPLING) - class CallRecord : Noncopyable { + class CallRecord : public Noncopyable { public: CallRecord(SamplingTool* samplingTool) : m_samplingTool(samplingTool) @@ -170,7 +170,7 @@ namespace JSC { } }; #else - class CallRecord : Noncopyable { + class CallRecord : public Noncopyable { public: CallRecord(SamplingTool*) { diff --git a/JavaScriptCore/bytecode/StructureStubInfo.cpp b/JavaScriptCore/bytecode/StructureStubInfo.cpp index bf3fdc4..018d832 100644 --- a/JavaScriptCore/bytecode/StructureStubInfo.cpp +++ b/JavaScriptCore/bytecode/StructureStubInfo.cpp @@ -31,44 +31,44 @@ namespace JSC { #if ENABLE(JIT) void StructureStubInfo::deref() { - switch (opcodeID) { - case op_get_by_id_self: + switch (accessType) { + case access_get_by_id_self: u.getByIdSelf.baseObjectStructure->deref(); return; - case op_get_by_id_proto: + case access_get_by_id_proto: u.getByIdProto.baseObjectStructure->deref(); u.getByIdProto.prototypeStructure->deref(); return; - case op_get_by_id_chain: + case access_get_by_id_chain: u.getByIdChain.baseObjectStructure->deref(); u.getByIdChain.chain->deref(); return; - case op_get_by_id_self_list: { + case access_get_by_id_self_list: { PolymorphicAccessStructureList* polymorphicStructures = u.getByIdSelfList.structureList; polymorphicStructures->derefStructures(u.getByIdSelfList.listSize); delete polymorphicStructures; return; } - case op_get_by_id_proto_list: { + case access_get_by_id_proto_list: { PolymorphicAccessStructureList* polymorphicStructures = u.getByIdProtoList.structureList; polymorphicStructures->derefStructures(u.getByIdProtoList.listSize); delete polymorphicStructures; return; } - case op_put_by_id_transition: + case access_put_by_id_transition: u.putByIdTransition.previousStructure->deref(); u.putByIdTransition.structure->deref(); u.putByIdTransition.chain->deref(); return; - case op_put_by_id_replace: + case access_put_by_id_replace: u.putByIdReplace.baseObjectStructure->deref(); return; - case op_get_by_id: - case op_put_by_id: - case op_get_by_id_generic: - case op_put_by_id_generic: - case op_get_array_length: - case op_get_string_length: + case access_get_by_id: + case access_put_by_id: + case access_get_by_id_generic: + case access_put_by_id_generic: + case access_get_array_length: + case access_get_string_length: // These instructions don't ref their Structures. return; default: diff --git a/JavaScriptCore/bytecode/StructureStubInfo.h b/JavaScriptCore/bytecode/StructureStubInfo.h index 24fcb7d..8e2c489 100644 --- a/JavaScriptCore/bytecode/StructureStubInfo.h +++ b/JavaScriptCore/bytecode/StructureStubInfo.h @@ -35,15 +35,32 @@ namespace JSC { + enum AccessType { + access_get_by_id_self, + access_get_by_id_proto, + access_get_by_id_chain, + access_get_by_id_self_list, + access_get_by_id_proto_list, + access_put_by_id_transition, + access_put_by_id_replace, + access_get_by_id, + access_put_by_id, + access_get_by_id_generic, + access_put_by_id_generic, + access_get_array_length, + access_get_string_length, + }; + struct StructureStubInfo { - StructureStubInfo(OpcodeID opcodeID) - : opcodeID(opcodeID) + StructureStubInfo(AccessType accessType) + : accessType(accessType) + , seen(false) { } void initGetByIdSelf(Structure* baseObjectStructure) { - opcodeID = op_get_by_id_self; + accessType = access_get_by_id_self; u.getByIdSelf.baseObjectStructure = baseObjectStructure; baseObjectStructure->ref(); @@ -51,7 +68,7 @@ namespace JSC { void initGetByIdProto(Structure* baseObjectStructure, Structure* prototypeStructure) { - opcodeID = op_get_by_id_proto; + accessType = access_get_by_id_proto; u.getByIdProto.baseObjectStructure = baseObjectStructure; baseObjectStructure->ref(); @@ -62,7 +79,7 @@ namespace JSC { void initGetByIdChain(Structure* baseObjectStructure, StructureChain* chain) { - opcodeID = op_get_by_id_chain; + accessType = access_get_by_id_chain; u.getByIdChain.baseObjectStructure = baseObjectStructure; baseObjectStructure->ref(); @@ -73,7 +90,7 @@ namespace JSC { void initGetByIdSelfList(PolymorphicAccessStructureList* structureList, int listSize) { - opcodeID = op_get_by_id_self_list; + accessType = access_get_by_id_self_list; u.getByIdProtoList.structureList = structureList; u.getByIdProtoList.listSize = listSize; @@ -81,7 +98,7 @@ namespace JSC { void initGetByIdProtoList(PolymorphicAccessStructureList* structureList, int listSize) { - opcodeID = op_get_by_id_proto_list; + accessType = access_get_by_id_proto_list; u.getByIdProtoList.structureList = structureList; u.getByIdProtoList.listSize = listSize; @@ -91,7 +108,7 @@ namespace JSC { void initPutByIdTransition(Structure* previousStructure, Structure* structure, StructureChain* chain) { - opcodeID = op_put_by_id_transition; + accessType = access_put_by_id_transition; u.putByIdTransition.previousStructure = previousStructure; previousStructure->ref(); @@ -105,7 +122,7 @@ namespace JSC { void initPutByIdReplace(Structure* baseObjectStructure) { - opcodeID = op_put_by_id_replace; + accessType = access_put_by_id_replace; u.putByIdReplace.baseObjectStructure = baseObjectStructure; baseObjectStructure->ref(); @@ -113,7 +130,19 @@ namespace JSC { void deref(); - OpcodeID opcodeID; + bool seenOnce() + { + return seen; + } + + void setSeen() + { + seen = true; + } + + int accessType : 31; + int seen : 1; + union { struct { Structure* baseObjectStructure; @@ -144,9 +173,9 @@ namespace JSC { } putByIdReplace; } u; - MacroAssembler::CodeLocationLabel stubRoutine; - MacroAssembler::CodeLocationCall callReturnLocation; - MacroAssembler::CodeLocationLabel hotPathBegin; + CodeLocationLabel stubRoutine; + CodeLocationCall callReturnLocation; + CodeLocationLabel hotPathBegin; }; } // namespace JSC diff --git a/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp b/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp index 21a3016..59537b6 100644 --- a/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp +++ b/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp @@ -196,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) @@ -222,6 +215,7 @@ 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) @@ -272,7 +266,7 @@ 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()); @@ -290,7 +284,7 @@ BytecodeGenerator::BytecodeGenerator(ProgramNode* programNode, const Debugger* d globalObject->putWithAttributes(exec, varStack[i].first, jsUndefined(), attributes); } - allocateConstants(programNode->neededConstants()); + preserveLastVar(); } } @@ -305,6 +299,7 @@ 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) @@ -332,7 +327,7 @@ BytecodeGenerator::BytecodeGenerator(FunctionBodyNode* functionBody, const Debug } else emitOpcode(op_enter); - if (usesArguments) { + if (usesArguments) { emitOpcode(op_init_arguments); // The debugger currently retrieves the arguments object from an activation rather than pulling @@ -372,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) @@ -387,6 +382,7 @@ 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) @@ -401,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) @@ -525,7 +521,7 @@ PassRefPtr<LabelScope> BytecodeGenerator::newLabelScope(LabelScope::Type type, c m_labelScopes.removeLast(); // Allocate new label scope. - LabelScope scope(type, name, scopeDepth(), newLabel(), type == LabelScope::Loop ? newLabel() : 0); // Only loops have continue targets. + LabelScope scope(type, name, scopeDepth(), newLabel(), type == LabelScope::Loop ? newLabel() : PassRefPtr<Label>()); // Only loops have continue targets. m_labelScopes.append(scope); return &m_labelScopes.last(); } @@ -791,34 +787,19 @@ unsigned BytecodeGenerator::addConstant(const Identifier& ident) return result.first->second; } -RegisterID* BytecodeGenerator::addConstant(JSValue v) +RegisterID* BytecodeGenerator::addConstantValue(JSValue v) { - pair<JSValueMap::iterator, bool> result = m_jsValueMap.add(JSValue::encode(v), m_nextConstantIndex); - if (result.second) { - RegisterID& constant = m_calleeRegisters[m_nextConstantIndex]; - - ++m_nextConstantIndex; + int index = m_nextConstantOffset; + pair<JSValueMap::iterator, bool> result = m_jsValueMap.add(JSValue::encode(v), m_nextConstantOffset); + if (result.second) { + m_constantPoolRegisters.append(FirstConstantRegisterIndex + m_nextConstantOffset); + ++m_nextConstantOffset; m_codeBlock->addConstantRegister(JSValue(v)); - return &constant; - } - - return ®isterFor(result.first->second); -} - -unsigned BytecodeGenerator::addUnexpectedConstant(JSValue v) -{ - return m_codeBlock->addUnexpectedConstant(v); -} + } else + index = result.first->second; -RegisterID* BytecodeGenerator::emitLoadGlobalObject(RegisterID* dst, JSObject* globalObject) -{ - if (!m_globalConstantIndex) - m_globalConstantIndex = m_codeBlock->addUnexpectedConstant(globalObject); - emitOpcode(op_unexpected_load); - instructions().append(dst->index()); - instructions().append(m_globalConstantIndex); - return dst; + return &m_constantPoolRegisters[index]; } unsigned BytecodeGenerator::addRegExp(RegExp* r) @@ -880,9 +861,8 @@ RegisterID* BytecodeGenerator::emitBinaryOp(OpcodeID opcodeID, RegisterID* dst, instructions().append(src2->index()); if (opcodeID == op_bitor || opcodeID == op_bitand || opcodeID == op_bitxor || - opcodeID == op_add || opcodeID == op_mul || opcodeID == op_sub) { + opcodeID == op_add || opcodeID == op_mul || opcodeID == op_sub || opcodeID == op_div) instructions().append(types.toInt()); - } return dst; } @@ -898,8 +878,8 @@ RegisterID* BytecodeGenerator::emitEqualityOp(OpcodeID opcodeID, RegisterID* dst if (src1->index() == dstIndex && src1->isTemporary() && m_codeBlock->isConstantRegisterIndex(src2->index()) - && m_codeBlock->constantRegister(src2->index() - m_codeBlock->m_numVars).jsValue().isString()) { - const UString& value = asString(m_codeBlock->constantRegister(src2->index() - m_codeBlock->m_numVars).jsValue())->value(); + && m_codeBlock->constantRegister(src2->index()).jsValue().isString()) { + const UString& value = asString(m_codeBlock->constantRegister(src2->index()).jsValue())->value(); if (value == "undefined") { rewindUnaryOp(); emitOpcode(op_is_undefined); @@ -979,28 +959,12 @@ RegisterID* BytecodeGenerator::emitLoad(RegisterID* dst, const Identifier& ident RegisterID* BytecodeGenerator::emitLoad(RegisterID* dst, JSValue v) { - RegisterID* constantID = addConstant(v); + RegisterID* constantID = addConstantValue(v); if (dst) return emitMove(dst, constantID); return constantID; } -RegisterID* BytecodeGenerator::emitUnexpectedLoad(RegisterID* dst, bool b) -{ - emitOpcode(op_unexpected_load); - instructions().append(dst->index()); - instructions().append(addUnexpectedConstant(jsBoolean(b))); - return dst; -} - -RegisterID* BytecodeGenerator::emitUnexpectedLoad(RegisterID* dst, double d) -{ - emitOpcode(op_unexpected_load); - instructions().append(dst->index()); - instructions().append(addUnexpectedConstant(jsNumber(globalData(), d))); - return dst; -} - bool BytecodeGenerator::findScopedProperty(const Identifier& property, int& index, size_t& stackDepth, bool forWriting, JSObject*& globalObject) { // Cases where we cannot statically optimize the lookup. @@ -1169,7 +1133,7 @@ RegisterID* BytecodeGenerator::emitResolveBase(RegisterID* dst, const Identifier } // Global object is the base - return emitLoadGlobalObject(dst, globalObject); + return emitLoad(dst, JSValue(globalObject)); } RegisterID* BytecodeGenerator::emitResolveWithBase(RegisterID* baseDst, RegisterID* propDst, const Identifier& property) @@ -1196,7 +1160,7 @@ RegisterID* BytecodeGenerator::emitResolveWithBase(RegisterID* baseDst, Register } // Global object is the base - emitLoadGlobalObject(baseDst, globalObject); + emitLoad(baseDst, JSValue(globalObject)); if (index != missingSymbolMarker() && !forceGlobalResolve) { // Directly index the property lookup across multiple scopes. @@ -1218,15 +1182,6 @@ RegisterID* BytecodeGenerator::emitResolveWithBase(RegisterID* baseDst, Register return baseDst; } -RegisterID* BytecodeGenerator::emitResolveFunction(RegisterID* baseDst, RegisterID* funcDst, const Identifier& property) -{ - emitOpcode(op_resolve_func); - instructions().append(baseDst->index()); - instructions().append(funcDst->index()); - instructions().append(addConstant(property)); - return baseDst; -} - void BytecodeGenerator::emitMethodCheck() { emitOpcode(op_method_check); @@ -1235,7 +1190,7 @@ void BytecodeGenerator::emitMethodCheck() RegisterID* BytecodeGenerator::emitGetById(RegisterID* dst, RegisterID* base, const Identifier& property) { #if ENABLE(JIT) - m_codeBlock->addStructureStubInfo(StructureStubInfo(op_get_by_id)); + m_codeBlock->addStructureStubInfo(StructureStubInfo(access_get_by_id)); #else m_codeBlock->addPropertyAccessInstruction(instructions().size()); #endif @@ -1254,7 +1209,7 @@ RegisterID* BytecodeGenerator::emitGetById(RegisterID* dst, RegisterID* base, co RegisterID* BytecodeGenerator::emitPutById(RegisterID* base, const Identifier& property, RegisterID* value) { #if ENABLE(JIT) - m_codeBlock->addStructureStubInfo(StructureStubInfo(op_put_by_id)); + m_codeBlock->addStructureStubInfo(StructureStubInfo(access_put_by_id)); #else m_codeBlock->addPropertyAccessInstruction(instructions().size()); #endif @@ -1815,7 +1770,7 @@ RegisterID* BytecodeGenerator::emitNextPropertyName(RegisterID* dst, RegisterID* RegisterID* BytecodeGenerator::emitCatch(RegisterID* targetRegister, Label* start, Label* end) { #if ENABLE(JIT) - HandlerInfo info = { start->offsetFrom(0), end->offsetFrom(0), instructions().size(), m_dynamicScopeDepth + m_baseScopeDepth, MacroAssembler::CodeLocationLabel() }; + HandlerInfo info = { start->offsetFrom(0), end->offsetFrom(0), instructions().size(), m_dynamicScopeDepth + m_baseScopeDepth, CodeLocationLabel() }; #else HandlerInfo info = { start->offsetFrom(0), end->offsetFrom(0), instructions().size(), m_dynamicScopeDepth + m_baseScopeDepth }; #endif @@ -1831,7 +1786,7 @@ RegisterID* BytecodeGenerator::emitNewError(RegisterID* dst, ErrorType type, JSV emitOpcode(op_new_error); instructions().append(dst->index()); instructions().append(static_cast<int>(type)); - instructions().append(addUnexpectedConstant(message)); + instructions().append(addConstantValue(message)->index()); return dst; } @@ -1840,6 +1795,7 @@ PassRefPtr<Label> BytecodeGenerator::emitJumpSubroutine(RegisterID* retAddrDst, emitOpcode(op_jsr); instructions().append(retAddrDst->index()); instructions().append(finally->offsetFrom(instructions().size())); + emitLabel(newLabel().get()); // Record the fact that the next instruction is implicitly labeled, because op_sret will return to it. return finally; } @@ -1893,7 +1849,6 @@ static int32_t keyForImmediateSwitch(ExpressionNode* node, int32_t min, int32_t ASSERT(node->isNumber()); double value = static_cast<NumberNode*>(node)->value(); int32_t key = static_cast<int32_t>(value); - ASSERT(JSValue::makeInt32Fast(key) && (JSValue::makeInt32Fast(key).getInt32Fast() == value)); ASSERT(key == value); ASSERT(key >= min); ASSERT(key <= max); diff --git a/JavaScriptCore/bytecompiler/BytecodeGenerator.h b/JavaScriptCore/bytecompiler/BytecodeGenerator.h index 6813d69..c273597 100644 --- a/JavaScriptCore/bytecompiler/BytecodeGenerator.h +++ b/JavaScriptCore/bytecompiler/BytecodeGenerator.h @@ -37,11 +37,12 @@ #include "LabelScope.h" #include "Interpreter.h" #include "RegisterID.h" -#include "SegmentedVector.h" #include "SymbolTable.h" #include "Debugger.h" #include "Nodes.h" +#include <wtf/FastAllocBase.h> #include <wtf/PassRefPtr.h> +#include <wtf/SegmentedVector.h> #include <wtf/Vector.h> namespace JSC { @@ -60,7 +61,7 @@ namespace JSC { FinallyContext finallyContext; }; - class BytecodeGenerator { + class BytecodeGenerator : public WTF::FastAllocBase { public: typedef DeclarationStacks::VarStack VarStack; typedef DeclarationStacks::FunctionStack FunctionStack; @@ -244,9 +245,6 @@ namespace JSC { RegisterID* emitLoad(RegisterID* dst, double); RegisterID* emitLoad(RegisterID* dst, const Identifier&); RegisterID* emitLoad(RegisterID* dst, JSValue); - RegisterID* emitUnexpectedLoad(RegisterID* dst, bool); - RegisterID* emitUnexpectedLoad(RegisterID* dst, double); - RegisterID* emitLoadGlobalObject(RegisterID* dst, JSObject* globalObject); RegisterID* emitUnaryOp(OpcodeID, RegisterID* dst, RegisterID* src); RegisterID* emitBinaryOp(OpcodeID, RegisterID* dst, RegisterID* src1, RegisterID* src2, OperandTypes); @@ -278,7 +276,6 @@ namespace JSC { RegisterID* emitResolveBase(RegisterID* dst, const Identifier& property); RegisterID* emitResolveWithBase(RegisterID* baseDst, RegisterID* propDst, const Identifier& property); - RegisterID* emitResolveFunction(RegisterID* baseDst, RegisterID* funcDst, const Identifier& property); void emitMethodCheck(); @@ -357,7 +354,7 @@ namespace JSC { PassRefPtr<Label> emitComplexJumpScopes(Label* target, ControlFlowContext* topScope, ControlFlowContext* bottomScope); - typedef HashMap<EncodedJSValue, unsigned, PtrHash<EncodedJSValue>, JSValueHashTraits> JSValueMap; + typedef HashMap<EncodedJSValue, unsigned, EncodedJSValueHash, EncodedJSValueHashTraits> JSValueMap; struct IdentifierMapIndexHashTraits { typedef int TraitType; @@ -398,7 +395,7 @@ namespace JSC { RegisterID* addParameter(const Identifier&); - void allocateConstants(size_t); + void preserveLastVar(); RegisterID& registerFor(int index) { @@ -419,8 +416,7 @@ namespace JSC { unsigned addConstant(FuncDeclNode*); unsigned addConstant(FuncExprNode*); unsigned addConstant(const Identifier&); - RegisterID* addConstant(JSValue); - unsigned addUnexpectedConstant(JSValue); + RegisterID* addConstantValue(JSValue); unsigned addRegExp(RegExp*); Vector<Instruction>& instructions() { return m_codeBlock->instructions(); } @@ -449,12 +445,13 @@ namespace JSC { RegisterID m_thisRegister; RegisterID m_argumentsRegister; int m_activationRegisterIndex; - SegmentedVector<RegisterID, 32> m_calleeRegisters; - SegmentedVector<RegisterID, 32> m_parameters; - SegmentedVector<RegisterID, 32> m_globals; - SegmentedVector<Label, 32> m_labels; - SegmentedVector<LabelScope, 8> m_labelScopes; - RefPtr<RegisterID> m_lastConstant; + WTF::SegmentedVector<RegisterID, 32> m_constantPoolRegisters; + WTF::SegmentedVector<RegisterID, 32> m_calleeRegisters; + WTF::SegmentedVector<RegisterID, 32> m_parameters; + WTF::SegmentedVector<RegisterID, 32> m_globals; + WTF::SegmentedVector<Label, 32> m_labels; + WTF::SegmentedVector<LabelScope, 8> m_labelScopes; + RefPtr<RegisterID> m_lastVar; int m_finallyDepth; int m_dynamicScopeDepth; int m_baseScopeDepth; @@ -465,7 +462,8 @@ namespace JSC { int m_nextGlobalIndex; int m_nextParameterIndex; - int m_nextConstantIndex; + int m_firstConstantIndex; + int m_nextConstantOffset; unsigned m_globalConstantIndex; int m_globalVarStorageOffset; diff --git a/JavaScriptCore/bytecompiler/RegisterID.h b/JavaScriptCore/bytecompiler/RegisterID.h index 0223c2a..3532ad8 100644 --- a/JavaScriptCore/bytecompiler/RegisterID.h +++ b/JavaScriptCore/bytecompiler/RegisterID.h @@ -35,7 +35,7 @@ namespace JSC { - class RegisterID : Noncopyable { + class RegisterID : public Noncopyable { public: RegisterID() : m_refCount(0) diff --git a/JavaScriptCore/config.h b/JavaScriptCore/config.h index cecae47..6681761 100644 --- a/JavaScriptCore/config.h +++ b/JavaScriptCore/config.h @@ -42,7 +42,7 @@ #define max max #define min min -#if !COMPILER(MSVC7) && !PLATFORM(WIN_CE) +#if !COMPILER(MSVC7) && !PLATFORM(WINCE) // We need to define this before the first #include of stdlib.h or it won't contain rand_s. #ifndef _CRT_RAND_S #define _CRT_RAND_S diff --git a/JavaScriptCore/create_hash_table b/JavaScriptCore/create_hash_table index 25d0b02..4184500 100755 --- a/JavaScriptCore/create_hash_table +++ b/JavaScriptCore/create_hash_table @@ -268,7 +268,7 @@ sub output() { } print " { 0, 0, 0, 0 }\n"; print "};\n\n"; - print "extern const struct HashTable $name =\n"; + print "extern JSC_CONST_HASHTABLE HashTable $name =\n"; print " \{ $compactSize, $compactHashSizeMask, $nameEntries, 0 \};\n"; print "} // namespace\n"; } diff --git a/JavaScriptCore/debugger/Debugger.h b/JavaScriptCore/debugger/Debugger.h index 868ea71..98d0935 100644 --- a/JavaScriptCore/debugger/Debugger.h +++ b/JavaScriptCore/debugger/Debugger.h @@ -38,7 +38,7 @@ namespace JSC { virtual ~Debugger(); void attach(JSGlobalObject*); - void detach(JSGlobalObject*); + virtual void detach(JSGlobalObject*); virtual void sourceParsed(ExecState*, const SourceCode&, int errorLine, const UString& errorMsg) = 0; virtual void exception(const DebuggerCallFrame&, intptr_t sourceID, int lineno) = 0; diff --git a/JavaScriptCore/debugger/DebuggerActivation.cpp b/JavaScriptCore/debugger/DebuggerActivation.cpp index 4b2568f..34d0447 100644 --- a/JavaScriptCore/debugger/DebuggerActivation.cpp +++ b/JavaScriptCore/debugger/DebuggerActivation.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 Apple Inc. All rights reserved. + * Copyright (C) 2008, 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 @@ -38,11 +38,12 @@ DebuggerActivation::DebuggerActivation(JSObject* activation) m_activation = static_cast<JSActivation*>(activation); } -void DebuggerActivation::mark() +void DebuggerActivation::markChildren(MarkStack& markStack) { - JSObject::mark(); - if (m_activation && !m_activation->marked()) - m_activation->mark(); + JSObject::markChildren(markStack); + + if (m_activation) + markStack.append(m_activation); } UString DebuggerActivation::className() const diff --git a/JavaScriptCore/debugger/DebuggerActivation.h b/JavaScriptCore/debugger/DebuggerActivation.h index 9e1f9f5..82cde4d 100644 --- a/JavaScriptCore/debugger/DebuggerActivation.h +++ b/JavaScriptCore/debugger/DebuggerActivation.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 Apple Inc. All rights reserved. + * Copyright (C) 2008, 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 @@ -36,7 +36,7 @@ namespace JSC { public: DebuggerActivation(JSObject*); - virtual void mark(); + virtual void markChildren(MarkStack&); virtual UString className() const; virtual bool getOwnPropertySlot(ExecState*, const Identifier& propertyName, PropertySlot&); virtual void put(ExecState*, const Identifier& propertyName, JSValue, PutPropertySlot&); diff --git a/JavaScriptCore/interpreter/CachedCall.h b/JavaScriptCore/interpreter/CachedCall.h index f48f4f4..767c262 100644 --- a/JavaScriptCore/interpreter/CachedCall.h +++ b/JavaScriptCore/interpreter/CachedCall.h @@ -32,7 +32,7 @@ #include "Interpreter.h" namespace JSC { - class CachedCall : Noncopyable { + class CachedCall : public Noncopyable { public: CachedCall(CallFrame* callFrame, JSFunction* function, int argCount, JSValue* exception) : m_valid(false) diff --git a/JavaScriptCore/interpreter/CallFrame.h b/JavaScriptCore/interpreter/CallFrame.h index a61e143..92ec06e 100644 --- a/JavaScriptCore/interpreter/CallFrame.h +++ b/JavaScriptCore/interpreter/CallFrame.h @@ -89,6 +89,7 @@ namespace JSC { #endif static const HashTable* arrayTable(CallFrame* callFrame) { return callFrame->globalData().arrayTable; } static const HashTable* dateTable(CallFrame* callFrame) { return callFrame->globalData().dateTable; } + static const HashTable* jsonTable(CallFrame* callFrame) { return callFrame->globalData().jsonTable; } static const HashTable* mathTable(CallFrame* callFrame) { return callFrame->globalData().mathTable; } static const HashTable* numberTable(CallFrame* callFrame) { return callFrame->globalData().numberTable; } static const HashTable* regExpTable(CallFrame* callFrame) { return callFrame->globalData().regExpTable; } @@ -104,7 +105,7 @@ namespace JSC { Arguments* optionalCalleeArguments() const { return this[RegisterFile::OptionalCalleeArguments].arguments(); } Instruction* returnPC() const { return this[RegisterFile::ReturnPC].vPC(); } - void setCalleeArguments(Arguments* arguments) { this[RegisterFile::OptionalCalleeArguments] = arguments; } + void setCalleeArguments(JSValue arguments) { this[RegisterFile::OptionalCalleeArguments] = arguments; } void setCallerFrame(CallFrame* callerFrame) { this[RegisterFile::CallerFrame] = callerFrame; } void setScopeChain(ScopeChainNode* scopeChain) { this[RegisterFile::ScopeChain] = scopeChain; } @@ -117,32 +118,29 @@ namespace JSC { setScopeChain(scopeChain); setCallerFrame(callerFrame); this[RegisterFile::ReturnPC] = vPC; // This is either an Instruction* or a pointer into JIT generated code stored as an Instruction*. - this[RegisterFile::ReturnValueRegister] = returnValueRegister; + this[RegisterFile::ReturnValueRegister] = Register::withInt(returnValueRegister); setArgumentCount(argc); // original argument count (for the sake of the "arguments" object) setCallee(function); - setCalleeArguments(0); + setCalleeArguments(JSValue()); } - private: - friend class Arguments; - friend class JSActivation; - friend class JSGlobalObject; - friend class Interpreter; - friend struct CallFrameClosure; + // Read a register from the codeframe (or constant from the CodeBlock). + inline Register& r(int); + static CallFrame* noCaller() { return reinterpret_cast<CallFrame*>(HostCallFrameFlag); } int returnValueRegister() const { return this[RegisterFile::ReturnValueRegister].i(); } - void setArgumentCount(int count) { this[RegisterFile::ArgumentCount] = count; } + bool hasHostCallFrameFlag() const { return reinterpret_cast<intptr_t>(this) & HostCallFrameFlag; } + CallFrame* addHostCallFrameFlag() const { return reinterpret_cast<CallFrame*>(reinterpret_cast<intptr_t>(this) | HostCallFrameFlag); } + CallFrame* removeHostCallFrameFlag() { return reinterpret_cast<CallFrame*>(reinterpret_cast<intptr_t>(this) & ~HostCallFrameFlag); } + + private: + void setArgumentCount(int count) { this[RegisterFile::ArgumentCount] = Register::withInt(count); } void setCallee(JSFunction* callee) { this[RegisterFile::Callee] = callee; } void setCodeBlock(CodeBlock* codeBlock) { this[RegisterFile::CodeBlock] = codeBlock; } static const intptr_t HostCallFrameFlag = 1; - static CallFrame* noCaller() { return reinterpret_cast<CallFrame*>(HostCallFrameFlag); } - bool hasHostCallFrameFlag() const { return reinterpret_cast<intptr_t>(this) & HostCallFrameFlag; } - CallFrame* addHostCallFrameFlag() const { return reinterpret_cast<CallFrame*>(reinterpret_cast<intptr_t>(this) | HostCallFrameFlag); } - CallFrame* removeHostCallFrameFlag() { return reinterpret_cast<CallFrame*>(reinterpret_cast<intptr_t>(this) & ~HostCallFrameFlag); } - ExecState(); ~ExecState(); }; diff --git a/JavaScriptCore/interpreter/CallFrameClosure.h b/JavaScriptCore/interpreter/CallFrameClosure.h index 0e14ced..9085327 100644 --- a/JavaScriptCore/interpreter/CallFrameClosure.h +++ b/JavaScriptCore/interpreter/CallFrameClosure.h @@ -49,7 +49,7 @@ struct CallFrameClosure { void resetCallFrame() { newCallFrame->setScopeChain(scopeChain); - newCallFrame->setCalleeArguments(0); + newCallFrame->setCalleeArguments(JSValue()); for (int i = providedParams; i < expectedParams; ++i) newCallFrame[i - RegisterFile::CallFrameHeaderSize - expectedParams] = jsUndefined(); } diff --git a/JavaScriptCore/interpreter/Interpreter.cpp b/JavaScriptCore/interpreter/Interpreter.cpp index d980962..f102739 100644 --- a/JavaScriptCore/interpreter/Interpreter.cpp +++ b/JavaScriptCore/interpreter/Interpreter.cpp @@ -58,6 +58,7 @@ #include "RegExpPrototype.h" #include "Register.h" #include "SamplingTool.h" +#include <limits.h> #include <stdio.h> #include <wtf/Threading.h> @@ -65,10 +66,6 @@ #include "JIT.h" #endif -#if ENABLE(ASSEMBLER) -#include "AssemblerBuffer.h" -#endif - using namespace std; namespace JSC { @@ -76,7 +73,7 @@ namespace JSC { static ALWAYS_INLINE unsigned bytecodeOffsetForPC(CallFrame* callFrame, CodeBlock* codeBlock, void* pc) { #if ENABLE(JIT) - return codeBlock->getBytecodeIndex(callFrame, pc); + return codeBlock->getBytecodeIndex(callFrame, ReturnAddressPtr(pc)); #else UNUSED_PARAM(callFrame); return static_cast<Instruction*>(pc) - codeBlock->instructions().begin(); @@ -112,7 +109,7 @@ NEVER_INLINE bool Interpreter::resolve(CallFrame* callFrame, Instruction* vPC, J exceptionValue = callFrame->globalData().exception; if (exceptionValue) return false; - callFrame[dst] = JSValue(result); + callFrame->r(dst) = JSValue(result); return true; } } while (++iter != end); @@ -145,7 +142,7 @@ NEVER_INLINE bool Interpreter::resolveSkip(CallFrame* callFrame, Instruction* vP exceptionValue = callFrame->globalData().exception; if (exceptionValue) return false; - callFrame[dst] = JSValue(result); + callFrame->r(dst) = JSValue(result); return true; } } while (++iter != end); @@ -163,7 +160,7 @@ NEVER_INLINE bool Interpreter::resolveGlobal(CallFrame* callFrame, Instruction* int offset = (vPC + 5)->u.operand; if (structure == globalObject->structure()) { - callFrame[dst] = JSValue(globalObject->getDirectOffset(offset)); + callFrame->r(dst) = JSValue(globalObject->getDirectOffset(offset)); return true; } @@ -178,14 +175,14 @@ NEVER_INLINE bool Interpreter::resolveGlobal(CallFrame* callFrame, Instruction* globalObject->structure()->ref(); vPC[4] = globalObject->structure(); vPC[5] = slot.cachedOffset(); - callFrame[dst] = JSValue(result); + callFrame->r(dst) = JSValue(result); return true; } exceptionValue = callFrame->globalData().exception; if (exceptionValue) return false; - callFrame[dst] = JSValue(result); + callFrame->r(dst) = JSValue(result); return true; } @@ -197,7 +194,7 @@ NEVER_INLINE void Interpreter::resolveBase(CallFrame* callFrame, Instruction* vP { int dst = (vPC + 1)->u.operand; int property = (vPC + 2)->u.operand; - callFrame[dst] = JSValue(JSC::resolveBase(callFrame, callFrame->codeBlock()->identifier(property), callFrame->scopeChain())); + callFrame->r(dst) = JSValue(JSC::resolveBase(callFrame, callFrame->codeBlock()->identifier(property), callFrame->scopeChain())); } NEVER_INLINE bool Interpreter::resolveBaseAndProperty(CallFrame* callFrame, Instruction* vPC, JSValue& exceptionValue) @@ -225,8 +222,8 @@ NEVER_INLINE bool Interpreter::resolveBaseAndProperty(CallFrame* callFrame, Inst exceptionValue = callFrame->globalData().exception; if (exceptionValue) return false; - callFrame[propDst] = JSValue(result); - callFrame[baseDst] = JSValue(base); + callFrame->r(propDst) = JSValue(result); + callFrame->r(baseDst) = JSValue(base); return true; } ++iter; @@ -270,8 +267,8 @@ NEVER_INLINE bool Interpreter::resolveBaseAndFunc(CallFrame* callFrame, Instruct if (exceptionValue) return false; - callFrame[baseDst] = JSValue(thisObj); - callFrame[funcDst] = JSValue(result); + callFrame->r(baseDst) = JSValue(thisObj); + callFrame->r(funcDst) = JSValue(result); return true; } ++iter; @@ -350,7 +347,7 @@ NEVER_INLINE JSValue Interpreter::callEval(CallFrame* callFrame, RegisterFile* r UString programSource = asString(program)->value(); - LiteralParser preparser(callFrame, programSource); + LiteralParser preparser(callFrame, programSource, LiteralParser::NonStrictJSON); if (JSValue parsedObject = preparser.tryLiteralParse()) return parsedObject; @@ -384,77 +381,92 @@ void Interpreter::dumpCallFrame(CallFrame* callFrame) void Interpreter::dumpRegisters(CallFrame* callFrame) { printf("Register frame: \n\n"); - printf("----------------------------------------------------\n"); - printf(" use | address | value \n"); - printf("----------------------------------------------------\n"); + printf("-----------------------------------------------------------------------------\n"); + printf(" use | address | value \n"); + printf("-----------------------------------------------------------------------------\n"); CodeBlock* codeBlock = callFrame->codeBlock(); RegisterFile* registerFile = &callFrame->scopeChain()->globalObject()->globalData()->interpreter->registerFile(); const Register* it; const Register* end; + JSValue v; if (codeBlock->codeType() == GlobalCode) { it = registerFile->lastGlobal(); end = it + registerFile->numGlobals(); while (it != end) { - printf("[global var] | %10p | %10p \n", it, (*it).v()); + v = (*it).jsValue(); +#if USE(JSVALUE32_64) + printf("[global var] | %10p | %-16s 0x%llx \n", it, v.description(), JSValue::encode(v)); +#else + printf("[global var] | %10p | %-16s %p \n", it, v.description(), JSValue::encode(v)); +#endif ++it; } - printf("----------------------------------------------------\n"); + printf("-----------------------------------------------------------------------------\n"); } it = callFrame->registers() - RegisterFile::CallFrameHeaderSize - codeBlock->m_numParameters; - printf("[this] | %10p | %10p \n", it, (*it).v()); ++it; + v = (*it).jsValue(); +#if USE(JSVALUE32_64) + printf("[this] | %10p | %-16s 0x%llx \n", it, v.description(), JSValue::encode(v)); ++it; +#else + printf("[this] | %10p | %-16s %p \n", it, v.description(), JSValue::encode(v)); ++it; +#endif end = it + max(codeBlock->m_numParameters - 1, 0); // - 1 to skip "this" if (it != end) { do { - printf("[param] | %10p | %10p \n", it, (*it).v()); + v = (*it).jsValue(); +#if USE(JSVALUE32_64) + printf("[param] | %10p | %-16s 0x%llx \n", it, v.description(), JSValue::encode(v)); +#else + printf("[param] | %10p | %-16s %p \n", it, v.description(), JSValue::encode(v)); +#endif ++it; } while (it != end); } - printf("----------------------------------------------------\n"); - - printf("[CodeBlock] | %10p | %10p \n", it, (*it).v()); ++it; - printf("[ScopeChain] | %10p | %10p \n", it, (*it).v()); ++it; - printf("[CallerRegisters] | %10p | %10p \n", it, (*it).v()); ++it; - printf("[ReturnPC] | %10p | %10p \n", it, (*it).v()); ++it; - printf("[ReturnValueRegister] | %10p | %10p \n", it, (*it).v()); ++it; - printf("[ArgumentCount] | %10p | %10p \n", it, (*it).v()); ++it; - printf("[Callee] | %10p | %10p \n", it, (*it).v()); ++it; - printf("[OptionalCalleeArguments] | %10p | %10p \n", it, (*it).v()); ++it; - printf("----------------------------------------------------\n"); + printf("-----------------------------------------------------------------------------\n"); + printf("[CodeBlock] | %10p | %p \n", it, (*it).codeBlock()); ++it; + printf("[ScopeChain] | %10p | %p \n", it, (*it).scopeChain()); ++it; + printf("[CallerRegisters] | %10p | %d \n", it, (*it).i()); ++it; + printf("[ReturnPC] | %10p | %p \n", it, (*it).vPC()); ++it; + printf("[ReturnValueRegister] | %10p | %d \n", it, (*it).i()); ++it; + printf("[ArgumentCount] | %10p | %d \n", it, (*it).i()); ++it; + printf("[Callee] | %10p | %p \n", it, (*it).function()); ++it; + printf("[OptionalCalleeArguments] | %10p | %p \n", it, (*it).arguments()); ++it; + printf("-----------------------------------------------------------------------------\n"); int registerCount = 0; end = it + codeBlock->m_numVars; if (it != end) { do { - printf("[r%2d] | %10p | %10p \n", registerCount, it, (*it).v()); - ++it; - ++registerCount; - } while (it != end); - } - printf("----------------------------------------------------\n"); - - end = it + codeBlock->m_numConstants; - if (it != end) { - do { - printf("[r%2d] | %10p | %10p \n", registerCount, it, (*it).v()); + v = (*it).jsValue(); +#if USE(JSVALUE32_64) + printf("[r%2d] | %10p | %-16s 0x%llx \n", registerCount, it, v.description(), JSValue::encode(v)); +#else + printf("[r%2d] | %10p | %-16s %p \n", registerCount, it, v.description(), JSValue::encode(v)); +#endif ++it; ++registerCount; } while (it != end); } - printf("----------------------------------------------------\n"); + printf("-----------------------------------------------------------------------------\n"); - end = it + codeBlock->m_numCalleeRegisters - codeBlock->m_numConstants - codeBlock->m_numVars; + end = it + codeBlock->m_numCalleeRegisters - codeBlock->m_numVars; if (it != end) { do { - printf("[r%2d] | %10p | %10p \n", registerCount, it, (*it).v()); + v = (*it).jsValue(); +#if USE(JSVALUE32_64) + printf("[r%2d] | %10p | %-16s 0x%llx \n", registerCount, it, v.description(), JSValue::encode(v)); +#else + printf("[r%2d] | %10p | %-16s %p \n", registerCount, it, v.description(), JSValue::encode(v)); +#endif ++it; ++registerCount; } while (it != end); } - printf("----------------------------------------------------\n"); + printf("-----------------------------------------------------------------------------\n"); } #endif @@ -567,13 +579,13 @@ NEVER_INLINE HandlerInfo* Interpreter::throwException(CallFrame*& callFrame, JSV if (Profiler* profiler = *Profiler::enabledProfilerReference()) { #if !ENABLE(JIT) if (isCallBytecode(codeBlock->instructions()[bytecodeOffset].u.opcode)) - profiler->didExecute(callFrame, callFrame[codeBlock->instructions()[bytecodeOffset + 2].u.operand].jsValue()); + profiler->didExecute(callFrame, callFrame->r(codeBlock->instructions()[bytecodeOffset + 2].u.operand).jsValue()); else if (codeBlock->instructions()[bytecodeOffset + 8].u.opcode == getOpcode(op_construct)) - profiler->didExecute(callFrame, callFrame[codeBlock->instructions()[bytecodeOffset + 10].u.operand].jsValue()); + profiler->didExecute(callFrame, callFrame->r(codeBlock->instructions()[bytecodeOffset + 10].u.operand).jsValue()); #else int functionRegisterIndex; if (codeBlock->functionRegisterForBytecodeOffset(bytecodeOffset, functionRegisterIndex)) - profiler->didExecute(callFrame, callFrame[functionRegisterIndex].jsValue()); + profiler->didExecute(callFrame, callFrame->r(functionRegisterIndex).jsValue()); #endif } @@ -625,7 +637,7 @@ JSValue Interpreter::execute(ProgramNode* programNode, CallFrame* callFrame, Sco globalObject->copyGlobalsTo(m_registerFile); CallFrame* newCallFrame = CallFrame::create(oldEnd + codeBlock->m_numParameters + RegisterFile::CallFrameHeaderSize); - newCallFrame[codeBlock->thisRegister()] = JSValue(thisObj); + newCallFrame->r(codeBlock->thisRegister()) = JSValue(thisObj); newCallFrame->init(codeBlock, 0, scopeChain, CallFrame::noCaller(), 0, 0, 0); if (codeBlock->needsFullScopeChain()) @@ -682,10 +694,10 @@ JSValue Interpreter::execute(FunctionBodyNode* functionBodyNode, CallFrame* call CallFrame* newCallFrame = CallFrame::create(oldEnd); size_t dst = 0; - newCallFrame[0] = JSValue(thisObj); + newCallFrame->r(0) = JSValue(thisObj); ArgList::const_iterator end = args.end(); for (ArgList::const_iterator it = args.begin(); it != end; ++it) - newCallFrame[++dst] = *it; + newCallFrame->r(++dst) = *it; CodeBlock* codeBlock = &functionBodyNode->bytecode(scopeChain); newCallFrame = slideRegisterWindowForCall(codeBlock, &m_registerFile, newCallFrame, argc + RegisterFile::CallFrameHeaderSize, argc); @@ -743,7 +755,7 @@ CallFrameClosure Interpreter::prepareForRepeatCall(FunctionBodyNode* functionBod CallFrame* newCallFrame = CallFrame::create(oldEnd); size_t dst = 0; for (int i = 0; i < argc; ++i) - newCallFrame[++dst] = jsUndefined(); + newCallFrame->r(++dst) = jsUndefined(); CodeBlock* codeBlock = &functionBodyNode->bytecode(scopeChain); newCallFrame = slideRegisterWindowForCall(codeBlock, &m_registerFile, newCallFrame, argc + RegisterFile::CallFrameHeaderSize, argc); @@ -854,7 +866,7 @@ JSValue Interpreter::execute(EvalNode* evalNode, CallFrame* callFrame, JSObject* CallFrame* newCallFrame = CallFrame::create(m_registerFile.start() + globalRegisterOffset); // a 0 codeBlock indicates a built-in caller - newCallFrame[codeBlock->thisRegister()] = JSValue(thisObj); + newCallFrame->r(codeBlock->thisRegister()) = JSValue(thisObj); newCallFrame->init(codeBlock, 0, scopeChain, callFrame->addHostCallFrameFlag(), 0, 0, 0); if (codeBlock->needsFullScopeChain()) @@ -918,9 +930,9 @@ NEVER_INLINE ScopeChainNode* Interpreter::createExceptionScope(CallFrame* callFr int dst = (++vPC)->u.operand; CodeBlock* codeBlock = callFrame->codeBlock(); Identifier& property = codeBlock->identifier((++vPC)->u.operand); - JSValue value = callFrame[(++vPC)->u.operand].jsValue(); + JSValue value = callFrame->r((++vPC)->u.operand).jsValue(); JSObject* scope = new (callFrame) JSStaticScopeObject(callFrame, property, value, DontDelete); - callFrame[dst] = JSValue(scope); + callFrame->r(dst) = JSValue(scope); return callFrame->scopeChain()->push(scope); } @@ -970,12 +982,18 @@ NEVER_INLINE void Interpreter::tryCachePutByID(CallFrame* callFrame, CodeBlock* return; } + StructureChain* protoChain = structure->prototypeChain(callFrame); + if (!protoChain->isCacheable()) { + vPC[0] = getOpcode(op_put_by_id_generic); + return; + } + // Structure transition, cache transition info if (slot.type() == PutPropertySlot::NewProperty) { vPC[0] = getOpcode(op_put_by_id_transition); vPC[4] = structure->previousID(); vPC[5] = structure; - vPC[6] = structure->prototypeChain(callFrame); + vPC[6] = protoChain; vPC[7] = slot.cachedOffset(); codeBlock->refStructures(vPC); return; @@ -1077,9 +1095,15 @@ NEVER_INLINE void Interpreter::tryCacheGetByID(CallFrame* callFrame, CodeBlock* return; } + StructureChain* protoChain = structure->prototypeChain(callFrame); + if (!protoChain->isCacheable()) { + vPC[0] = getOpcode(op_get_by_id_generic); + return; + } + vPC[0] = getOpcode(op_get_by_id_chain); vPC[4] = structure; - vPC[5] = structure->prototypeChain(callFrame); + vPC[5] = protoChain; vPC[6] = count; vPC[7] = slot.cachedOffset(); codeBlock->refStructures(vPC); @@ -1113,7 +1137,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi } #if ENABLE(JIT) - // Currently with CTI enabled we never interpret functions + // Mixing Interpreter + JIT is not supported. ASSERT_NOT_REACHED(); #endif #if !USE(INTERPRETER) @@ -1185,7 +1209,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi constructor, and puts the result in register dst. */ int dst = (++vPC)->u.operand; - callFrame[dst] = JSValue(constructEmptyObject(callFrame)); + callFrame->r(dst) = JSValue(constructEmptyObject(callFrame)); ++vPC; NEXT_INSTRUCTION(); @@ -1202,7 +1226,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int firstArg = (++vPC)->u.operand; int argCount = (++vPC)->u.operand; ArgList args(callFrame->registers() + firstArg, argCount); - callFrame[dst] = JSValue(constructArray(callFrame, args)); + callFrame->r(dst) = JSValue(constructArray(callFrame, args)); ++vPC; NEXT_INSTRUCTION(); @@ -1216,7 +1240,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int dst = (++vPC)->u.operand; int regExp = (++vPC)->u.operand; - callFrame[dst] = JSValue(new (globalData) RegExpObject(callFrame->scopeChain()->globalObject()->regExpStructure(), callFrame->codeBlock()->regexp(regExp))); + callFrame->r(dst) = JSValue(new (globalData) RegExpObject(callFrame->scopeChain()->globalObject()->regExpStructure(), callFrame->codeBlock()->regexp(regExp))); ++vPC; NEXT_INSTRUCTION(); @@ -1228,7 +1252,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int dst = (++vPC)->u.operand; int src = (++vPC)->u.operand; - callFrame[dst] = callFrame[src]; + callFrame->r(dst) = callFrame->r(src); ++vPC; NEXT_INSTRUCTION(); @@ -1241,14 +1265,14 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi as a boolean in register dst. */ int dst = (++vPC)->u.operand; - JSValue src1 = callFrame[(++vPC)->u.operand].jsValue(); - JSValue src2 = callFrame[(++vPC)->u.operand].jsValue(); - if (JSFastMath::canDoFastBitwiseOperations(src1, src2)) - callFrame[dst] = JSFastMath::equal(src1, src2); + JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue(); + JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue(); + if (src1.isInt32() && src2.isInt32()) + callFrame->r(dst) = jsBoolean(src1.asInt32() == src2.asInt32()); else { JSValue result = jsBoolean(JSValue::equalSlowCase(callFrame, src1, src2)); CHECK_FOR_EXCEPTION(); - callFrame[dst] = result; + callFrame->r(dst) = result; } ++vPC; @@ -1261,15 +1285,15 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi operator, and puts the result as a boolean in register dst. */ int dst = (++vPC)->u.operand; - JSValue src = callFrame[(++vPC)->u.operand].jsValue(); + JSValue src = callFrame->r((++vPC)->u.operand).jsValue(); if (src.isUndefinedOrNull()) { - callFrame[dst] = jsBoolean(true); + callFrame->r(dst) = jsBoolean(true); ++vPC; NEXT_INSTRUCTION(); } - callFrame[dst] = jsBoolean(src.isCell() && src.asCell()->structure()->typeInfo().masqueradesAsUndefined()); + callFrame->r(dst) = jsBoolean(src.isCell() && src.asCell()->structure()->typeInfo().masqueradesAsUndefined()); ++vPC; NEXT_INSTRUCTION(); } @@ -1281,14 +1305,14 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi result as a boolean in register dst. */ int dst = (++vPC)->u.operand; - JSValue src1 = callFrame[(++vPC)->u.operand].jsValue(); - JSValue src2 = callFrame[(++vPC)->u.operand].jsValue(); - if (JSFastMath::canDoFastBitwiseOperations(src1, src2)) - callFrame[dst] = JSFastMath::notEqual(src1, src2); + JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue(); + JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue(); + if (src1.isInt32() && src2.isInt32()) + callFrame->r(dst) = jsBoolean(src1.asInt32() != src2.asInt32()); else { JSValue result = jsBoolean(!JSValue::equalSlowCase(callFrame, src1, src2)); CHECK_FOR_EXCEPTION(); - callFrame[dst] = result; + callFrame->r(dst) = result; } ++vPC; @@ -1301,15 +1325,15 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi operator, and puts the result as a boolean in register dst. */ int dst = (++vPC)->u.operand; - JSValue src = callFrame[(++vPC)->u.operand].jsValue(); + JSValue src = callFrame->r((++vPC)->u.operand).jsValue(); if (src.isUndefinedOrNull()) { - callFrame[dst] = jsBoolean(false); + callFrame->r(dst) = jsBoolean(false); ++vPC; NEXT_INSTRUCTION(); } - callFrame[dst] = jsBoolean(!src.isCell() || !asCell(src)->structure()->typeInfo().masqueradesAsUndefined()); + callFrame->r(dst) = jsBoolean(!src.isCell() || !asCell(src)->structure()->typeInfo().masqueradesAsUndefined()); ++vPC; NEXT_INSTRUCTION(); } @@ -1321,9 +1345,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi result as a boolean in register dst. */ int dst = (++vPC)->u.operand; - JSValue src1 = callFrame[(++vPC)->u.operand].jsValue(); - JSValue src2 = callFrame[(++vPC)->u.operand].jsValue(); - callFrame[dst] = jsBoolean(JSValue::strictEqual(src1, src2)); + JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue(); + JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue(); + callFrame->r(dst) = jsBoolean(JSValue::strictEqual(src1, src2)); ++vPC; NEXT_INSTRUCTION(); @@ -1336,9 +1360,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi puts the result as a boolean in register dst. */ int dst = (++vPC)->u.operand; - JSValue src1 = callFrame[(++vPC)->u.operand].jsValue(); - JSValue src2 = callFrame[(++vPC)->u.operand].jsValue(); - callFrame[dst] = jsBoolean(!JSValue::strictEqual(src1, src2)); + JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue(); + JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue(); + callFrame->r(dst) = jsBoolean(!JSValue::strictEqual(src1, src2)); ++vPC; NEXT_INSTRUCTION(); @@ -1351,11 +1375,11 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi a boolean in register dst. */ int dst = (++vPC)->u.operand; - JSValue src1 = callFrame[(++vPC)->u.operand].jsValue(); - JSValue src2 = callFrame[(++vPC)->u.operand].jsValue(); + JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue(); + JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue(); JSValue result = jsBoolean(jsLess(callFrame, src1, src2)); CHECK_FOR_EXCEPTION(); - callFrame[dst] = result; + callFrame->r(dst) = result; ++vPC; NEXT_INSTRUCTION(); @@ -1368,11 +1392,11 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi puts the result as a boolean in register dst. */ int dst = (++vPC)->u.operand; - JSValue src1 = callFrame[(++vPC)->u.operand].jsValue(); - JSValue src2 = callFrame[(++vPC)->u.operand].jsValue(); + JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue(); + JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue(); JSValue result = jsBoolean(jsLessEq(callFrame, src1, src2)); CHECK_FOR_EXCEPTION(); - callFrame[dst] = result; + callFrame->r(dst) = result; ++vPC; NEXT_INSTRUCTION(); @@ -1384,13 +1408,13 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi back in register srcDst. */ int srcDst = (++vPC)->u.operand; - JSValue v = callFrame[srcDst].jsValue(); - if (JSFastMath::canDoFastAdditiveOperations(v)) - callFrame[srcDst] = JSValue(JSFastMath::incImmediateNumber(v)); + JSValue v = callFrame->r(srcDst).jsValue(); + if (v.isInt32() && v.asInt32() < INT_MAX) + callFrame->r(srcDst) = jsNumber(callFrame, v.asInt32() + 1); else { JSValue result = jsNumber(callFrame, v.toNumber(callFrame) + 1); CHECK_FOR_EXCEPTION(); - callFrame[srcDst] = result; + callFrame->r(srcDst) = result; } ++vPC; @@ -1403,13 +1427,13 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi back in register srcDst. */ int srcDst = (++vPC)->u.operand; - JSValue v = callFrame[srcDst].jsValue(); - if (JSFastMath::canDoFastAdditiveOperations(v)) - callFrame[srcDst] = JSValue(JSFastMath::decImmediateNumber(v)); + JSValue v = callFrame->r(srcDst).jsValue(); + if (v.isInt32() && v.asInt32() > INT_MIN) + callFrame->r(srcDst) = jsNumber(callFrame, v.asInt32() - 1); else { JSValue result = jsNumber(callFrame, v.toNumber(callFrame) - 1); CHECK_FOR_EXCEPTION(); - callFrame[srcDst] = result; + callFrame->r(srcDst) = result; } ++vPC; @@ -1424,15 +1448,15 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int dst = (++vPC)->u.operand; int srcDst = (++vPC)->u.operand; - JSValue v = callFrame[srcDst].jsValue(); - if (JSFastMath::canDoFastAdditiveOperations(v)) { - callFrame[dst] = v; - callFrame[srcDst] = JSValue(JSFastMath::incImmediateNumber(v)); + JSValue v = callFrame->r(srcDst).jsValue(); + if (v.isInt32() && v.asInt32() < INT_MAX) { + callFrame->r(srcDst) = jsNumber(callFrame, v.asInt32() + 1); + callFrame->r(dst) = v; } else { - JSValue number = callFrame[srcDst].jsValue().toJSNumber(callFrame); + JSValue number = callFrame->r(srcDst).jsValue().toJSNumber(callFrame); CHECK_FOR_EXCEPTION(); - callFrame[dst] = number; - callFrame[srcDst] = JSValue(jsNumber(callFrame, number.uncheckedGetNumber() + 1)); + callFrame->r(srcDst) = jsNumber(callFrame, number.uncheckedGetNumber() + 1); + callFrame->r(dst) = number; } ++vPC; @@ -1447,15 +1471,15 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int dst = (++vPC)->u.operand; int srcDst = (++vPC)->u.operand; - JSValue v = callFrame[srcDst].jsValue(); - if (JSFastMath::canDoFastAdditiveOperations(v)) { - callFrame[dst] = v; - callFrame[srcDst] = JSValue(JSFastMath::decImmediateNumber(v)); + JSValue v = callFrame->r(srcDst).jsValue(); + if (v.isInt32() && v.asInt32() > INT_MIN) { + callFrame->r(srcDst) = jsNumber(callFrame, v.asInt32() - 1); + callFrame->r(dst) = v; } else { - JSValue number = callFrame[srcDst].jsValue().toJSNumber(callFrame); + JSValue number = callFrame->r(srcDst).jsValue().toJSNumber(callFrame); CHECK_FOR_EXCEPTION(); - callFrame[dst] = number; - callFrame[srcDst] = JSValue(jsNumber(callFrame, number.uncheckedGetNumber() - 1)); + callFrame->r(srcDst) = jsNumber(callFrame, number.uncheckedGetNumber() - 1); + callFrame->r(dst) = number; } ++vPC; @@ -1470,14 +1494,14 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int dst = (++vPC)->u.operand; int src = (++vPC)->u.operand; - JSValue srcVal = callFrame[src].jsValue(); + JSValue srcVal = callFrame->r(src).jsValue(); if (LIKELY(srcVal.isNumber())) - callFrame[dst] = callFrame[src]; + callFrame->r(dst) = callFrame->r(src); else { JSValue result = srcVal.toJSNumber(callFrame); CHECK_FOR_EXCEPTION(); - callFrame[dst] = result; + callFrame->r(dst) = result; } ++vPC; @@ -1490,17 +1514,16 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi result in register dst. */ int dst = (++vPC)->u.operand; - JSValue src = callFrame[(++vPC)->u.operand].jsValue(); - ++vPC; - double v; - if (src.getNumber(v)) - callFrame[dst] = JSValue(jsNumber(callFrame, -v)); + JSValue src = callFrame->r((++vPC)->u.operand).jsValue(); + if (src.isInt32() && src.asInt32()) + callFrame->r(dst) = jsNumber(callFrame, -src.asInt32()); else { JSValue result = jsNumber(callFrame, -src.toNumber(callFrame)); CHECK_FOR_EXCEPTION(); - callFrame[dst] = result; + callFrame->r(dst) = result; } + ++vPC; NEXT_INSTRUCTION(); } DEFINE_OPCODE(op_add) { @@ -1511,14 +1534,14 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi numeric add, depending on the types of the operands.) */ int dst = (++vPC)->u.operand; - JSValue src1 = callFrame[(++vPC)->u.operand].jsValue(); - JSValue src2 = callFrame[(++vPC)->u.operand].jsValue(); - if (JSFastMath::canDoFastAdditiveOperations(src1, src2)) - callFrame[dst] = JSValue(JSFastMath::addImmediateNumbers(src1, src2)); + JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue(); + JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue(); + if (src1.isInt32() && src2.isInt32() && !(src1.asInt32() | src2.asInt32() & 0xc0000000)) // no overflow + callFrame->r(dst) = jsNumber(callFrame, src1.asInt32() + src2.asInt32()); else { JSValue result = jsAdd(callFrame, src1, src2); CHECK_FOR_EXCEPTION(); - callFrame[dst] = result; + callFrame->r(dst) = result; } vPC += 2; NEXT_INSTRUCTION(); @@ -1530,23 +1553,14 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi numbers), and puts the product in register dst. */ int dst = (++vPC)->u.operand; - JSValue src1 = callFrame[(++vPC)->u.operand].jsValue(); - JSValue src2 = callFrame[(++vPC)->u.operand].jsValue(); - double left; - double right; - if (JSValue::areBothInt32Fast(src1, src2)) { - int32_t left = src1.getInt32Fast(); - int32_t right = src2.getInt32Fast(); - if ((left | right) >> 15 == 0) - callFrame[dst] = JSValue(jsNumber(callFrame, left * right)); - else - callFrame[dst] = JSValue(jsNumber(callFrame, static_cast<double>(left) * static_cast<double>(right))); - } else if (src1.getNumber(left) && src2.getNumber(right)) - callFrame[dst] = JSValue(jsNumber(callFrame, left * right)); + JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue(); + JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue(); + if (src1.isInt32() && src2.isInt32() && !(src1.asInt32() | src2.asInt32() >> 15)) // no overflow + callFrame->r(dst) = jsNumber(callFrame, src1.asInt32() * src2.asInt32()); else { JSValue result = jsNumber(callFrame, src1.toNumber(callFrame) * src2.toNumber(callFrame)); CHECK_FOR_EXCEPTION(); - callFrame[dst] = result; + callFrame->r(dst) = result; } vPC += 2; @@ -1560,18 +1574,14 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi quotient in register dst. */ int dst = (++vPC)->u.operand; - JSValue dividend = callFrame[(++vPC)->u.operand].jsValue(); - JSValue divisor = callFrame[(++vPC)->u.operand].jsValue(); - double left; - double right; - if (dividend.getNumber(left) && divisor.getNumber(right)) - callFrame[dst] = JSValue(jsNumber(callFrame, left / right)); - else { - JSValue result = jsNumber(callFrame, dividend.toNumber(callFrame) / divisor.toNumber(callFrame)); - CHECK_FOR_EXCEPTION(); - callFrame[dst] = result; - } - ++vPC; + JSValue dividend = callFrame->r((++vPC)->u.operand).jsValue(); + JSValue divisor = callFrame->r((++vPC)->u.operand).jsValue(); + + JSValue result = jsNumber(callFrame, dividend.toNumber(callFrame) / divisor.toNumber(callFrame)); + CHECK_FOR_EXCEPTION(); + callFrame->r(dst) = result; + + vPC += 2; NEXT_INSTRUCTION(); } DEFINE_OPCODE(op_mod) { @@ -1582,26 +1592,24 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi remainder in register dst. */ int dst = (++vPC)->u.operand; - int dividend = (++vPC)->u.operand; - int divisor = (++vPC)->u.operand; - - JSValue dividendValue = callFrame[dividend].jsValue(); - JSValue divisorValue = callFrame[divisor].jsValue(); + JSValue dividend = callFrame->r((++vPC)->u.operand).jsValue(); + JSValue divisor = callFrame->r((++vPC)->u.operand).jsValue(); - if (JSValue::areBothInt32Fast(dividendValue, divisorValue) && divisorValue != jsNumber(callFrame, 0)) { - // We expect the result of the modulus of a number that was representable as an int32 to also be representable - // as an int32. - JSValue result = JSValue::makeInt32Fast(dividendValue.getInt32Fast() % divisorValue.getInt32Fast()); + if (dividend.isInt32() && divisor.isInt32() && divisor.asInt32() != 0) { + JSValue result = jsNumber(callFrame, dividend.asInt32() % divisor.asInt32()); ASSERT(result); - callFrame[dst] = result; + callFrame->r(dst) = result; ++vPC; NEXT_INSTRUCTION(); } - double d = dividendValue.toNumber(callFrame); - JSValue result = jsNumber(callFrame, fmod(d, divisorValue.toNumber(callFrame))); + // Conversion to double must happen outside the call to fmod since the + // order of argument evaluation is not guaranteed. + double d1 = dividend.toNumber(callFrame); + double d2 = divisor.toNumber(callFrame); + JSValue result = jsNumber(callFrame, fmod(d1, d2)); CHECK_FOR_EXCEPTION(); - callFrame[dst] = result; + callFrame->r(dst) = result; ++vPC; NEXT_INSTRUCTION(); } @@ -1613,18 +1621,14 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi register dst. */ int dst = (++vPC)->u.operand; - JSValue src1 = callFrame[(++vPC)->u.operand].jsValue(); - JSValue src2 = callFrame[(++vPC)->u.operand].jsValue(); - double left; - double right; - if (JSFastMath::canDoFastAdditiveOperations(src1, src2)) - callFrame[dst] = JSValue(JSFastMath::subImmediateNumbers(src1, src2)); - else if (src1.getNumber(left) && src2.getNumber(right)) - callFrame[dst] = JSValue(jsNumber(callFrame, left - right)); + JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue(); + JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue(); + if (src1.isInt32() && src2.isInt32() && !(src1.asInt32() | src2.asInt32() & 0xc0000000)) // no overflow + callFrame->r(dst) = jsNumber(callFrame, src1.asInt32() - src2.asInt32()); else { JSValue result = jsNumber(callFrame, src1.toNumber(callFrame) - src2.toNumber(callFrame)); CHECK_FOR_EXCEPTION(); - callFrame[dst] = result; + callFrame->r(dst) = result; } vPC += 2; NEXT_INSTRUCTION(); @@ -1637,18 +1641,15 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi in register dst. */ int dst = (++vPC)->u.operand; - JSValue val = callFrame[(++vPC)->u.operand].jsValue(); - JSValue shift = callFrame[(++vPC)->u.operand].jsValue(); - int32_t left; - uint32_t right; - if (JSValue::areBothInt32Fast(val, shift)) - callFrame[dst] = JSValue(jsNumber(callFrame, val.getInt32Fast() << (shift.getInt32Fast() & 0x1f))); - else if (val.numberToInt32(left) && shift.numberToUInt32(right)) - callFrame[dst] = JSValue(jsNumber(callFrame, left << (right & 0x1f))); + JSValue val = callFrame->r((++vPC)->u.operand).jsValue(); + JSValue shift = callFrame->r((++vPC)->u.operand).jsValue(); + + if (val.isInt32() && shift.isInt32()) + callFrame->r(dst) = jsNumber(callFrame, val.asInt32() << (shift.asInt32() & 0x1f)); else { JSValue result = jsNumber(callFrame, (val.toInt32(callFrame)) << (shift.toUInt32(callFrame) & 0x1f)); CHECK_FOR_EXCEPTION(); - callFrame[dst] = result; + callFrame->r(dst) = result; } ++vPC; @@ -1662,18 +1663,15 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi uint32), and puts the result in register dst. */ int dst = (++vPC)->u.operand; - JSValue val = callFrame[(++vPC)->u.operand].jsValue(); - JSValue shift = callFrame[(++vPC)->u.operand].jsValue(); - int32_t left; - uint32_t right; - if (JSFastMath::canDoFastRshift(val, shift)) - callFrame[dst] = JSValue(JSFastMath::rightShiftImmediateNumbers(val, shift)); - else if (val.numberToInt32(left) && shift.numberToUInt32(right)) - callFrame[dst] = JSValue(jsNumber(callFrame, left >> (right & 0x1f))); + JSValue val = callFrame->r((++vPC)->u.operand).jsValue(); + JSValue shift = callFrame->r((++vPC)->u.operand).jsValue(); + + if (val.isInt32() && shift.isInt32()) + callFrame->r(dst) = jsNumber(callFrame, val.asInt32() >> (shift.asInt32() & 0x1f)); else { JSValue result = jsNumber(callFrame, (val.toInt32(callFrame)) >> (shift.toUInt32(callFrame) & 0x1f)); CHECK_FOR_EXCEPTION(); - callFrame[dst] = result; + callFrame->r(dst) = result; } ++vPC; @@ -1687,14 +1685,14 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi uint32), and puts the result in register dst. */ int dst = (++vPC)->u.operand; - JSValue val = callFrame[(++vPC)->u.operand].jsValue(); - JSValue shift = callFrame[(++vPC)->u.operand].jsValue(); - if (JSFastMath::canDoFastUrshift(val, shift)) - callFrame[dst] = JSValue(JSFastMath::rightShiftImmediateNumbers(val, shift)); + JSValue val = callFrame->r((++vPC)->u.operand).jsValue(); + JSValue shift = callFrame->r((++vPC)->u.operand).jsValue(); + if (val.isUInt32() && shift.isInt32()) + callFrame->r(dst) = jsNumber(callFrame, val.asInt32() >> (shift.asInt32() & 0x1f)); else { JSValue result = jsNumber(callFrame, (val.toUInt32(callFrame)) >> (shift.toUInt32(callFrame) & 0x1f)); CHECK_FOR_EXCEPTION(); - callFrame[dst] = result; + callFrame->r(dst) = result; } ++vPC; @@ -1708,18 +1706,14 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi in register dst. */ int dst = (++vPC)->u.operand; - JSValue src1 = callFrame[(++vPC)->u.operand].jsValue(); - JSValue src2 = callFrame[(++vPC)->u.operand].jsValue(); - int32_t left; - int32_t right; - if (JSFastMath::canDoFastBitwiseOperations(src1, src2)) - callFrame[dst] = JSValue(JSFastMath::andImmediateNumbers(src1, src2)); - else if (src1.numberToInt32(left) && src2.numberToInt32(right)) - callFrame[dst] = JSValue(jsNumber(callFrame, left & right)); + JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue(); + JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue(); + if (src1.isInt32() && src2.isInt32()) + callFrame->r(dst) = jsNumber(callFrame, src1.asInt32() & src2.asInt32()); else { JSValue result = jsNumber(callFrame, src1.toInt32(callFrame) & src2.toInt32(callFrame)); CHECK_FOR_EXCEPTION(); - callFrame[dst] = result; + callFrame->r(dst) = result; } vPC += 2; @@ -1733,18 +1727,14 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi in register dst. */ int dst = (++vPC)->u.operand; - JSValue src1 = callFrame[(++vPC)->u.operand].jsValue(); - JSValue src2 = callFrame[(++vPC)->u.operand].jsValue(); - int32_t left; - int32_t right; - if (JSFastMath::canDoFastBitwiseOperations(src1, src2)) - callFrame[dst] = JSValue(JSFastMath::xorImmediateNumbers(src1, src2)); - else if (src1.numberToInt32(left) && src2.numberToInt32(right)) - callFrame[dst] = JSValue(jsNumber(callFrame, left ^ right)); + JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue(); + JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue(); + if (src1.isInt32() && src2.isInt32()) + callFrame->r(dst) = jsNumber(callFrame, src1.asInt32() ^ src2.asInt32()); else { JSValue result = jsNumber(callFrame, src1.toInt32(callFrame) ^ src2.toInt32(callFrame)); CHECK_FOR_EXCEPTION(); - callFrame[dst] = result; + callFrame->r(dst) = result; } vPC += 2; @@ -1758,18 +1748,14 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi result in register dst. */ int dst = (++vPC)->u.operand; - JSValue src1 = callFrame[(++vPC)->u.operand].jsValue(); - JSValue src2 = callFrame[(++vPC)->u.operand].jsValue(); - int32_t left; - int32_t right; - if (JSFastMath::canDoFastBitwiseOperations(src1, src2)) - callFrame[dst] = JSValue(JSFastMath::orImmediateNumbers(src1, src2)); - else if (src1.numberToInt32(left) && src2.numberToInt32(right)) - callFrame[dst] = JSValue(jsNumber(callFrame, left | right)); + JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue(); + JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue(); + if (src1.isInt32() && src2.isInt32()) + callFrame->r(dst) = jsNumber(callFrame, src1.asInt32() | src2.asInt32()); else { JSValue result = jsNumber(callFrame, src1.toInt32(callFrame) | src2.toInt32(callFrame)); CHECK_FOR_EXCEPTION(); - callFrame[dst] = result; + callFrame->r(dst) = result; } vPC += 2; @@ -1782,14 +1768,13 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi and puts the result in register dst. */ int dst = (++vPC)->u.operand; - JSValue src = callFrame[(++vPC)->u.operand].jsValue(); - int32_t value; - if (src.numberToInt32(value)) - callFrame[dst] = JSValue(jsNumber(callFrame, ~value)); + JSValue src = callFrame->r((++vPC)->u.operand).jsValue(); + if (src.isInt32()) + callFrame->r(dst) = jsNumber(callFrame, ~src.asInt32()); else { JSValue result = jsNumber(callFrame, ~src.toInt32(callFrame)); CHECK_FOR_EXCEPTION(); - callFrame[dst] = result; + callFrame->r(dst) = result; } ++vPC; NEXT_INSTRUCTION(); @@ -1802,9 +1787,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int dst = (++vPC)->u.operand; int src = (++vPC)->u.operand; - JSValue result = jsBoolean(!callFrame[src].jsValue().toBoolean(callFrame)); + JSValue result = jsBoolean(!callFrame->r(src).jsValue().toBoolean(callFrame)); CHECK_FOR_EXCEPTION(); - callFrame[dst] = result; + callFrame->r(dst) = result; ++vPC; NEXT_INSTRUCTION(); @@ -1827,14 +1812,14 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int base = vPC[3].u.operand; int baseProto = vPC[4].u.operand; - JSValue baseVal = callFrame[base].jsValue(); + JSValue baseVal = callFrame->r(base).jsValue(); if (isInvalidParamForInstanceOf(callFrame, callFrame->codeBlock(), vPC, baseVal, exceptionValue)) goto vm_throw; - bool result = asObject(baseVal)->hasInstance(callFrame, callFrame[value].jsValue(), callFrame[baseProto].jsValue()); + bool result = asObject(baseVal)->hasInstance(callFrame, callFrame->r(value).jsValue(), callFrame->r(baseProto).jsValue()); CHECK_FOR_EXCEPTION(); - callFrame[dst] = jsBoolean(result); + callFrame->r(dst) = jsBoolean(result); vPC += 5; NEXT_INSTRUCTION(); @@ -1847,7 +1832,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int dst = (++vPC)->u.operand; int src = (++vPC)->u.operand; - callFrame[dst] = JSValue(jsTypeStringForValue(callFrame, callFrame[src].jsValue())); + callFrame->r(dst) = JSValue(jsTypeStringForValue(callFrame, callFrame->r(src).jsValue())); ++vPC; NEXT_INSTRUCTION(); @@ -1861,8 +1846,8 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int dst = (++vPC)->u.operand; int src = (++vPC)->u.operand; - JSValue v = callFrame[src].jsValue(); - callFrame[dst] = jsBoolean(v.isCell() ? v.asCell()->structure()->typeInfo().masqueradesAsUndefined() : v.isUndefined()); + JSValue v = callFrame->r(src).jsValue(); + callFrame->r(dst) = jsBoolean(v.isCell() ? v.asCell()->structure()->typeInfo().masqueradesAsUndefined() : v.isUndefined()); ++vPC; NEXT_INSTRUCTION(); @@ -1876,7 +1861,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int dst = (++vPC)->u.operand; int src = (++vPC)->u.operand; - callFrame[dst] = jsBoolean(callFrame[src].jsValue().isBoolean()); + callFrame->r(dst) = jsBoolean(callFrame->r(src).jsValue().isBoolean()); ++vPC; NEXT_INSTRUCTION(); @@ -1890,7 +1875,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int dst = (++vPC)->u.operand; int src = (++vPC)->u.operand; - callFrame[dst] = jsBoolean(callFrame[src].jsValue().isNumber()); + callFrame->r(dst) = jsBoolean(callFrame->r(src).jsValue().isNumber()); ++vPC; NEXT_INSTRUCTION(); @@ -1904,7 +1889,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int dst = (++vPC)->u.operand; int src = (++vPC)->u.operand; - callFrame[dst] = jsBoolean(callFrame[src].jsValue().isString()); + callFrame->r(dst) = jsBoolean(callFrame->r(src).jsValue().isString()); ++vPC; NEXT_INSTRUCTION(); @@ -1918,7 +1903,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int dst = (++vPC)->u.operand; int src = (++vPC)->u.operand; - callFrame[dst] = jsBoolean(jsIsObjectType(callFrame[src].jsValue())); + callFrame->r(dst) = jsBoolean(jsIsObjectType(callFrame->r(src).jsValue())); ++vPC; NEXT_INSTRUCTION(); @@ -1932,7 +1917,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int dst = (++vPC)->u.operand; int src = (++vPC)->u.operand; - callFrame[dst] = jsBoolean(jsIsFunctionType(callFrame[src].jsValue())); + callFrame->r(dst) = jsBoolean(jsIsFunctionType(callFrame->r(src).jsValue())); ++vPC; NEXT_INSTRUCTION(); @@ -1950,21 +1935,21 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int property = (++vPC)->u.operand; int base = (++vPC)->u.operand; - JSValue baseVal = callFrame[base].jsValue(); + JSValue baseVal = callFrame->r(base).jsValue(); if (isInvalidParamForIn(callFrame, callFrame->codeBlock(), vPC, baseVal, exceptionValue)) goto vm_throw; JSObject* baseObj = asObject(baseVal); - JSValue propName = callFrame[property].jsValue(); + JSValue propName = callFrame->r(property).jsValue(); uint32_t i; if (propName.getUInt32(i)) - callFrame[dst] = jsBoolean(baseObj->hasProperty(callFrame, i)); + callFrame->r(dst) = jsBoolean(baseObj->hasProperty(callFrame, i)); else { Identifier property(callFrame, propName.toString(callFrame)); CHECK_FOR_EXCEPTION(); - callFrame[dst] = jsBoolean(baseObj->hasProperty(callFrame, property)); + callFrame->r(dst) = jsBoolean(baseObj->hasProperty(callFrame, property)); } ++vPC; @@ -2022,7 +2007,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi ASSERT(scope->isGlobalObject()); int index = (++vPC)->u.operand; - callFrame[dst] = scope->registerAt(index); + callFrame->r(dst) = scope->registerAt(index); ++vPC; NEXT_INSTRUCTION(); } @@ -2036,7 +2021,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int index = (++vPC)->u.operand; int value = (++vPC)->u.operand; - scope->registerAt(index) = JSValue(callFrame[value].jsValue()); + scope->registerAt(index) = JSValue(callFrame->r(value).jsValue()); ++vPC; NEXT_INSTRUCTION(); } @@ -2061,7 +2046,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi ASSERT((*iter)->isVariableObject()); JSVariableObject* scope = static_cast<JSVariableObject*>(*iter); - callFrame[dst] = scope->registerAt(index); + callFrame->r(dst) = scope->registerAt(index); ++vPC; NEXT_INSTRUCTION(); } @@ -2084,7 +2069,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi ASSERT((*iter)->isVariableObject()); JSVariableObject* scope = static_cast<JSVariableObject*>(*iter); - scope->registerAt(index) = JSValue(callFrame[value].jsValue()); + scope->registerAt(index) = JSValue(callFrame->r(value).jsValue()); ++vPC; NEXT_INSTRUCTION(); } @@ -2119,27 +2104,6 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi vPC += 4; NEXT_INSTRUCTION(); } - DEFINE_OPCODE(op_resolve_func) { - /* resolve_func baseDst(r) funcDst(r) property(id) - - Searches the scope chain for an object containing - identifier property, and if one is found, writes the - appropriate object to use as "this" when calling its - properties to register baseDst; and the retrieved property - value to register propDst. If the property is not found, - raises an exception. - - This differs from resolve_with_base, because the - global this value will be substituted for activations or - the global object, which is the right behavior for function - calls but not for other property lookup. - */ - if (UNLIKELY(!resolveBaseAndFunc(callFrame, vPC, exceptionValue))) - goto vm_throw; - - vPC += 4; - NEXT_INSTRUCTION(); - } DEFINE_OPCODE(op_get_by_id) { /* get_by_id dst(r) base(r) property(id) structure(sID) nop(n) nop(n) nop(n) @@ -2152,14 +2116,14 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi CodeBlock* codeBlock = callFrame->codeBlock(); Identifier& ident = codeBlock->identifier(property); - JSValue baseValue = callFrame[base].jsValue(); + JSValue baseValue = callFrame->r(base).jsValue(); PropertySlot slot(baseValue); JSValue result = baseValue.get(callFrame, ident, slot); CHECK_FOR_EXCEPTION(); tryCacheGetByID(callFrame, codeBlock, vPC, baseValue, ident, slot); - callFrame[dst] = result; + callFrame->r(dst) = result; vPC += 8; NEXT_INSTRUCTION(); } @@ -2171,7 +2135,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi op_get_by_id. */ int base = vPC[2].u.operand; - JSValue baseValue = callFrame[base].jsValue(); + JSValue baseValue = callFrame->r(base).jsValue(); if (LIKELY(baseValue.isCell())) { JSCell* baseCell = asCell(baseValue); @@ -2184,7 +2148,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int offset = vPC[5].u.operand; ASSERT(baseObject->get(callFrame, callFrame->codeBlock()->identifier(vPC[3].u.operand)) == baseObject->getDirectOffset(offset)); - callFrame[dst] = JSValue(baseObject->getDirectOffset(offset)); + callFrame->r(dst) = JSValue(baseObject->getDirectOffset(offset)); vPC += 8; NEXT_INSTRUCTION(); @@ -2202,7 +2166,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi reverts to op_get_by_id. */ int base = vPC[2].u.operand; - JSValue baseValue = callFrame[base].jsValue(); + JSValue baseValue = callFrame->r(base).jsValue(); if (LIKELY(baseValue.isCell())) { JSCell* baseCell = asCell(baseValue); @@ -2218,7 +2182,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int offset = vPC[6].u.operand; ASSERT(protoObject->get(callFrame, callFrame->codeBlock()->identifier(vPC[3].u.operand)) == protoObject->getDirectOffset(offset)); - callFrame[dst] = JSValue(protoObject->getDirectOffset(offset)); + callFrame->r(dst) = JSValue(protoObject->getDirectOffset(offset)); vPC += 8; NEXT_INSTRUCTION(); @@ -2251,7 +2215,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi reverts to op_get_by_id. */ int base = vPC[2].u.operand; - JSValue baseValue = callFrame[base].jsValue(); + JSValue baseValue = callFrame->r(base).jsValue(); if (LIKELY(baseValue.isCell())) { JSCell* baseCell = asCell(baseValue); @@ -2273,7 +2237,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int offset = vPC[7].u.operand; ASSERT(baseObject->get(callFrame, callFrame->codeBlock()->identifier(vPC[3].u.operand)) == baseObject->getDirectOffset(offset)); - callFrame[dst] = JSValue(baseObject->getDirectOffset(offset)); + callFrame->r(dst) = JSValue(baseObject->getDirectOffset(offset)); vPC += 8; NEXT_INSTRUCTION(); @@ -2299,12 +2263,12 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int property = vPC[3].u.operand; Identifier& ident = callFrame->codeBlock()->identifier(property); - JSValue baseValue = callFrame[base].jsValue(); + JSValue baseValue = callFrame->r(base).jsValue(); PropertySlot slot(baseValue); JSValue result = baseValue.get(callFrame, ident, slot); CHECK_FOR_EXCEPTION(); - callFrame[dst] = result; + callFrame->r(dst) = result; vPC += 8; NEXT_INSTRUCTION(); } @@ -2317,10 +2281,10 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int base = vPC[2].u.operand; - JSValue baseValue = callFrame[base].jsValue(); + JSValue baseValue = callFrame->r(base).jsValue(); if (LIKELY(isJSArray(globalData, baseValue))) { int dst = vPC[1].u.operand; - callFrame[dst] = JSValue(jsNumber(callFrame, asArray(baseValue)->length())); + callFrame->r(dst) = jsNumber(callFrame, asArray(baseValue)->length()); vPC += 8; NEXT_INSTRUCTION(); } @@ -2337,10 +2301,10 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int base = vPC[2].u.operand; - JSValue baseValue = callFrame[base].jsValue(); + JSValue baseValue = callFrame->r(base).jsValue(); if (LIKELY(isJSString(globalData, baseValue))) { int dst = vPC[1].u.operand; - callFrame[dst] = JSValue(jsNumber(callFrame, asString(baseValue)->value().size())); + callFrame->r(dst) = jsNumber(callFrame, asString(baseValue)->value().size()); vPC += 8; NEXT_INSTRUCTION(); } @@ -2363,10 +2327,10 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int value = vPC[3].u.operand; CodeBlock* codeBlock = callFrame->codeBlock(); - JSValue baseValue = callFrame[base].jsValue(); + JSValue baseValue = callFrame->r(base).jsValue(); Identifier& ident = codeBlock->identifier(property); PutPropertySlot slot; - baseValue.put(callFrame, ident, callFrame[value].jsValue(), slot); + baseValue.put(callFrame, ident, callFrame->r(value).jsValue(), slot); CHECK_FOR_EXCEPTION(); tryCachePutByID(callFrame, codeBlock, vPC, baseValue, slot); @@ -2386,7 +2350,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi the register file. */ int base = vPC[1].u.operand; - JSValue baseValue = callFrame[base].jsValue(); + JSValue baseValue = callFrame->r(base).jsValue(); if (LIKELY(baseValue.isCell())) { JSCell* baseCell = asCell(baseValue); @@ -2414,7 +2378,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int value = vPC[3].u.operand; unsigned offset = vPC[7].u.operand; ASSERT(baseObject->offsetForLocation(baseObject->getDirectLocation(callFrame->codeBlock()->identifier(vPC[2].u.operand))) == offset); - baseObject->putDirectOffset(offset, callFrame[value].jsValue()); + baseObject->putDirectOffset(offset, callFrame->r(value).jsValue()); vPC += 8; NEXT_INSTRUCTION(); @@ -2436,7 +2400,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi the register file. */ int base = vPC[1].u.operand; - JSValue baseValue = callFrame[base].jsValue(); + JSValue baseValue = callFrame->r(base).jsValue(); if (LIKELY(baseValue.isCell())) { JSCell* baseCell = asCell(baseValue); @@ -2449,7 +2413,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi unsigned offset = vPC[5].u.operand; ASSERT(baseObject->offsetForLocation(baseObject->getDirectLocation(callFrame->codeBlock()->identifier(vPC[2].u.operand))) == offset); - baseObject->putDirectOffset(offset, callFrame[value].jsValue()); + baseObject->putDirectOffset(offset, callFrame->r(value).jsValue()); vPC += 8; NEXT_INSTRUCTION(); @@ -2472,10 +2436,10 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int property = vPC[2].u.operand; int value = vPC[3].u.operand; - JSValue baseValue = callFrame[base].jsValue(); + JSValue baseValue = callFrame->r(base).jsValue(); Identifier& ident = callFrame->codeBlock()->identifier(property); PutPropertySlot slot; - baseValue.put(callFrame, ident, callFrame[value].jsValue(), slot); + baseValue.put(callFrame, ident, callFrame->r(value).jsValue(), slot); CHECK_FOR_EXCEPTION(); vPC += 8; @@ -2493,11 +2457,11 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int base = (++vPC)->u.operand; int property = (++vPC)->u.operand; - JSObject* baseObj = callFrame[base].jsValue().toObject(callFrame); + JSObject* baseObj = callFrame->r(base).jsValue().toObject(callFrame); Identifier& ident = callFrame->codeBlock()->identifier(property); JSValue result = jsBoolean(baseObj->deleteProperty(callFrame, ident)); CHECK_FOR_EXCEPTION(); - callFrame[dst] = result; + callFrame->r(dst) = result; ++vPC; NEXT_INSTRUCTION(); } @@ -2513,13 +2477,13 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int base = (++vPC)->u.operand; int property = (++vPC)->u.operand; - JSValue baseValue = callFrame[base].jsValue(); - JSValue subscript = callFrame[property].jsValue(); + JSValue baseValue = callFrame->r(base).jsValue(); + JSValue subscript = callFrame->r(property).jsValue(); JSValue result; - if (LIKELY(subscript.isUInt32Fast())) { - uint32_t i = subscript.getUInt32Fast(); + if (LIKELY(subscript.isUInt32())) { + uint32_t i = subscript.asUInt32(); if (isJSArray(globalData, baseValue)) { JSArray* jsArray = asArray(baseValue); if (jsArray->canGetIndex(i)) @@ -2538,7 +2502,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi } CHECK_FOR_EXCEPTION(); - callFrame[dst] = result; + callFrame->r(dst) = result; ++vPC; NEXT_INSTRUCTION(); } @@ -2557,34 +2521,34 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int property = (++vPC)->u.operand; int value = (++vPC)->u.operand; - JSValue baseValue = callFrame[base].jsValue(); - JSValue subscript = callFrame[property].jsValue(); + JSValue baseValue = callFrame->r(base).jsValue(); + JSValue subscript = callFrame->r(property).jsValue(); - if (LIKELY(subscript.isUInt32Fast())) { - uint32_t i = subscript.getUInt32Fast(); + if (LIKELY(subscript.isUInt32())) { + uint32_t i = subscript.asUInt32(); if (isJSArray(globalData, baseValue)) { JSArray* jsArray = asArray(baseValue); if (jsArray->canSetIndex(i)) - jsArray->setIndex(i, callFrame[value].jsValue()); + jsArray->setIndex(i, callFrame->r(value).jsValue()); else - jsArray->JSArray::put(callFrame, i, callFrame[value].jsValue()); + jsArray->JSArray::put(callFrame, i, callFrame->r(value).jsValue()); } else if (isJSByteArray(globalData, baseValue) && asByteArray(baseValue)->canAccessIndex(i)) { JSByteArray* jsByteArray = asByteArray(baseValue); double dValue = 0; - JSValue jsValue = callFrame[value].jsValue(); - if (jsValue.isInt32Fast()) - jsByteArray->setIndex(i, jsValue.getInt32Fast()); + JSValue jsValue = callFrame->r(value).jsValue(); + if (jsValue.isInt32()) + jsByteArray->setIndex(i, jsValue.asInt32()); else if (jsValue.getNumber(dValue)) jsByteArray->setIndex(i, dValue); else baseValue.put(callFrame, i, jsValue); } else - baseValue.put(callFrame, i, callFrame[value].jsValue()); + baseValue.put(callFrame, i, callFrame->r(value).jsValue()); } else { Identifier property(callFrame, subscript.toString(callFrame)); if (!globalData->exception) { // Don't put to an object if toString threw an exception. PutPropertySlot slot; - baseValue.put(callFrame, property, callFrame[value].jsValue(), slot); + baseValue.put(callFrame, property, callFrame->r(value).jsValue(), slot); } } @@ -2604,9 +2568,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int base = (++vPC)->u.operand; int property = (++vPC)->u.operand; - JSObject* baseObj = callFrame[base].jsValue().toObject(callFrame); // may throw + JSObject* baseObj = callFrame->r(base).jsValue().toObject(callFrame); // may throw - JSValue subscript = callFrame[property].jsValue(); + JSValue subscript = callFrame->r(property).jsValue(); JSValue result; uint32_t i; if (subscript.getUInt32(i)) @@ -2619,7 +2583,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi } CHECK_FOR_EXCEPTION(); - callFrame[dst] = result; + callFrame->r(dst) = result; ++vPC; NEXT_INSTRUCTION(); } @@ -2639,7 +2603,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi unsigned property = (++vPC)->u.operand; int value = (++vPC)->u.operand; - callFrame[base].jsValue().put(callFrame, property, callFrame[value].jsValue()); + callFrame->r(base).jsValue().put(callFrame, property, callFrame->r(value).jsValue()); ++vPC; NEXT_INSTRUCTION(); @@ -2686,7 +2650,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int cond = (++vPC)->u.operand; int target = (++vPC)->u.operand; - if (callFrame[cond].jsValue().toBoolean(callFrame)) { + if (callFrame->r(cond).jsValue().toBoolean(callFrame)) { vPC += target; CHECK_FOR_TIMEOUT(); NEXT_INSTRUCTION(); @@ -2703,7 +2667,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int cond = (++vPC)->u.operand; int target = (++vPC)->u.operand; - if (callFrame[cond].jsValue().toBoolean(callFrame)) { + if (callFrame->r(cond).jsValue().toBoolean(callFrame)) { vPC += target; NEXT_INSTRUCTION(); } @@ -2719,7 +2683,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int cond = (++vPC)->u.operand; int target = (++vPC)->u.operand; - if (!callFrame[cond].jsValue().toBoolean(callFrame)) { + if (!callFrame->r(cond).jsValue().toBoolean(callFrame)) { vPC += target; NEXT_INSTRUCTION(); } @@ -2735,7 +2699,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int src = (++vPC)->u.operand; int target = (++vPC)->u.operand; - JSValue srcValue = callFrame[src].jsValue(); + JSValue srcValue = callFrame->r(src).jsValue(); if (srcValue.isUndefinedOrNull() || (srcValue.isCell() && srcValue.asCell()->structure()->typeInfo().masqueradesAsUndefined())) { vPC += target; @@ -2753,7 +2717,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int src = (++vPC)->u.operand; int target = (++vPC)->u.operand; - JSValue srcValue = callFrame[src].jsValue(); + JSValue srcValue = callFrame->r(src).jsValue(); if (!srcValue.isUndefinedOrNull() || (srcValue.isCell() && !srcValue.asCell()->structure()->typeInfo().masqueradesAsUndefined())) { vPC += target; @@ -2772,7 +2736,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int src = (++vPC)->u.operand; JSValue ptr = JSValue((++vPC)->u.jsCell); int target = (++vPC)->u.operand; - JSValue srcValue = callFrame[src].jsValue(); + JSValue srcValue = callFrame->r(src).jsValue(); if (srcValue != ptr) { vPC += target; NEXT_INSTRUCTION(); @@ -2792,8 +2756,8 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi Additionally this loop instruction may terminate JS execution is the JS timeout is reached. */ - JSValue src1 = callFrame[(++vPC)->u.operand].jsValue(); - JSValue src2 = callFrame[(++vPC)->u.operand].jsValue(); + JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue(); + JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue(); int target = (++vPC)->u.operand; bool result = jsLess(callFrame, src1, src2); @@ -2819,8 +2783,8 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi Additionally this loop instruction may terminate JS execution is the JS timeout is reached. */ - JSValue src1 = callFrame[(++vPC)->u.operand].jsValue(); - JSValue src2 = callFrame[(++vPC)->u.operand].jsValue(); + JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue(); + JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue(); int target = (++vPC)->u.operand; bool result = jsLessEq(callFrame, src1, src2); @@ -2843,8 +2807,8 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi target from the current instruction, if and only if the result of the comparison is false. */ - JSValue src1 = callFrame[(++vPC)->u.operand].jsValue(); - JSValue src2 = callFrame[(++vPC)->u.operand].jsValue(); + JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue(); + JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue(); int target = (++vPC)->u.operand; bool result = jsLess(callFrame, src1, src2); @@ -2866,8 +2830,8 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi and then jumps to offset target from the current instruction, if and only if theresult of the comparison is false. */ - JSValue src1 = callFrame[(++vPC)->u.operand].jsValue(); - JSValue src2 = callFrame[(++vPC)->u.operand].jsValue(); + JSValue src1 = callFrame->r((++vPC)->u.operand).jsValue(); + JSValue src2 = callFrame->r((++vPC)->u.operand).jsValue(); int target = (++vPC)->u.operand; bool result = jsLessEq(callFrame, src1, src2); @@ -2892,9 +2856,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int tableIndex = (++vPC)->u.operand; int defaultOffset = (++vPC)->u.operand; - JSValue scrutinee = callFrame[(++vPC)->u.operand].jsValue(); - if (scrutinee.isInt32Fast()) - vPC += callFrame->codeBlock()->immediateSwitchJumpTable(tableIndex).offsetForValue(scrutinee.getInt32Fast(), defaultOffset); + JSValue scrutinee = callFrame->r((++vPC)->u.operand).jsValue(); + if (scrutinee.isInt32()) + vPC += callFrame->codeBlock()->immediateSwitchJumpTable(tableIndex).offsetForValue(scrutinee.asInt32(), defaultOffset); else { double value; int32_t intValue; @@ -2916,7 +2880,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int tableIndex = (++vPC)->u.operand; int defaultOffset = (++vPC)->u.operand; - JSValue scrutinee = callFrame[(++vPC)->u.operand].jsValue(); + JSValue scrutinee = callFrame->r((++vPC)->u.operand).jsValue(); if (!scrutinee.isString()) vPC += defaultOffset; else { @@ -2939,7 +2903,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int tableIndex = (++vPC)->u.operand; int defaultOffset = (++vPC)->u.operand; - JSValue scrutinee = callFrame[(++vPC)->u.operand].jsValue(); + JSValue scrutinee = callFrame->r((++vPC)->u.operand).jsValue(); if (!scrutinee.isString()) vPC += defaultOffset; else @@ -2957,7 +2921,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int dst = (++vPC)->u.operand; int func = (++vPC)->u.operand; - callFrame[dst] = callFrame->codeBlock()->function(func)->makeFunction(callFrame, callFrame->scopeChain()); + callFrame->r(dst) = JSValue(callFrame->codeBlock()->function(func)->makeFunction(callFrame, callFrame->scopeChain())); ++vPC; NEXT_INSTRUCTION(); @@ -2973,7 +2937,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int dst = (++vPC)->u.operand; int func = (++vPC)->u.operand; - callFrame[dst] = callFrame->codeBlock()->functionExpression(func)->makeFunction(callFrame, callFrame->scopeChain()); + callFrame->r(dst) = JSValue(callFrame->codeBlock()->functionExpression(func)->makeFunction(callFrame, callFrame->scopeChain())); ++vPC; NEXT_INSTRUCTION(); @@ -2995,7 +2959,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int argCount = vPC[3].u.operand; int registerOffset = vPC[4].u.operand; - JSValue funcVal = callFrame[func].jsValue(); + JSValue funcVal = callFrame->r(func).jsValue(); Register* newCallFrame = callFrame->registers() + registerOffset; Register* argv = newCallFrame - RegisterFile::CallFrameHeaderSize - argCount; @@ -3006,7 +2970,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi JSValue result = callEval(callFrame, registerFile, argv, argCount, registerOffset, exceptionValue); if (exceptionValue) goto vm_throw; - callFrame[dst] = result; + callFrame->r(dst) = result; vPC += 5; NEXT_INSTRUCTION(); @@ -3032,7 +2996,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int argCount = vPC[3].u.operand; int registerOffset = vPC[4].u.operand; - JSValue v = callFrame[func].jsValue(); + JSValue v = callFrame->r(func).jsValue(); CallData callData; CallType callType = v.getCallData(callData); @@ -3081,7 +3045,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi } CHECK_FOR_EXCEPTION(); - callFrame[dst] = JSValue(returnValue); + callFrame->r(dst) = returnValue; vPC += 5; NEXT_INSTRUCTION(); @@ -3096,19 +3060,19 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int argCountDst = (++vPC)->u.operand; int argsOffset = (++vPC)->u.operand; - JSValue arguments = callFrame[argsOffset].jsValue(); - uint32_t argCount = 0; + JSValue arguments = callFrame->r(argsOffset).jsValue(); + int32_t argCount = 0; if (!arguments) { - argCount = (uint32_t)(callFrame[RegisterFile::ArgumentCount].u.i) - 1; + argCount = (uint32_t)(callFrame->argumentCount()) - 1; int32_t sizeDelta = argsOffset + argCount + RegisterFile::CallFrameHeaderSize; Register* newEnd = callFrame->registers() + sizeDelta; if (!registerFile->grow(newEnd) || ((newEnd - callFrame->registers()) != sizeDelta)) { exceptionValue = createStackOverflowError(callFrame); goto vm_throw; } - uint32_t expectedParams = asFunction(callFrame[RegisterFile::Callee].jsValue())->body()->parameterCount(); - uint32_t inplaceArgs = min(argCount, expectedParams); - uint32_t i = 0; + int32_t expectedParams = callFrame->callee()->body()->parameterCount(); + int32_t inplaceArgs = min(argCount, expectedParams); + int32_t i = 0; Register* argStore = callFrame->registers() + argsOffset; // First step is to copy the "expected" parameters from their normal location relative to the callframe @@ -3152,7 +3116,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi goto vm_throw; } Register* argsBuffer = callFrame->registers() + argsOffset; - for (unsigned i = 0; i < argCount; ++i) { + for (int32_t i = 0; i < argCount; ++i) { argsBuffer[i] = asObject(arguments)->get(callFrame, i); CHECK_FOR_EXCEPTION(); } @@ -3164,7 +3128,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi } } CHECK_FOR_EXCEPTION(); - callFrame[argCountDst] = argCount + 1; + callFrame->r(argCountDst) = Register::withInt(argCount + 1); ++vPC; NEXT_INSTRUCTION(); } @@ -3185,8 +3149,8 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int argCountReg = vPC[3].u.operand; int registerOffset = vPC[4].u.operand; - JSValue v = callFrame[func].jsValue(); - int argCount = callFrame[argCountReg].i(); + JSValue v = callFrame->r(func).jsValue(); + int argCount = callFrame->r(argCountReg).i(); registerOffset += argCount; CallData callData; CallType callType = v.getCallData(callData); @@ -3235,7 +3199,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi } CHECK_FOR_EXCEPTION(); - callFrame[dst] = JSValue(returnValue); + callFrame->r(dst) = returnValue; vPC += 5; NEXT_INSTRUCTION(); @@ -3262,7 +3226,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int src = (++vPC)->u.operand; ASSERT(callFrame->codeBlock()->needsFullScopeChain()); - asActivation(callFrame[src].jsValue())->copyRegisters(callFrame->optionalCalleeArguments()); + asActivation(callFrame->r(src).jsValue())->copyRegisters(callFrame->optionalCalleeArguments()); ++vPC; NEXT_INSTRUCTION(); @@ -3281,6 +3245,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ ASSERT(callFrame->codeBlock()->usesArguments() && !callFrame->codeBlock()->needsFullScopeChain()); + if (callFrame->optionalCalleeArguments()) callFrame->optionalCalleeArguments()->copyRegisters(); @@ -3302,7 +3267,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi if (callFrame->codeBlock()->needsFullScopeChain()) callFrame->scopeChain()->deref(); - JSValue returnValue = callFrame[result].jsValue(); + JSValue returnValue = callFrame->r(result).jsValue(); vPC = callFrame->returnPC(); int dst = callFrame->returnValueRegister(); @@ -3311,7 +3276,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi if (callFrame->hasHostCallFrameFlag()) return returnValue; - callFrame[dst] = JSValue(returnValue); + callFrame->r(dst) = returnValue; NEXT_INSTRUCTION(); } @@ -3330,10 +3295,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi CodeBlock* codeBlock = callFrame->codeBlock(); for (size_t count = codeBlock->m_numVars; i < count; ++i) - callFrame[i] = jsUndefined(); - - for (size_t count = codeBlock->numberOfConstantRegisters(), j = 0; j < count; ++i, ++j) - callFrame[i] = codeBlock->constantRegister(j); + callFrame->r(i) = jsUndefined(); ++vPC; NEXT_INSTRUCTION(); @@ -3355,14 +3317,11 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi CodeBlock* codeBlock = callFrame->codeBlock(); for (size_t count = codeBlock->m_numVars; i < count; ++i) - callFrame[i] = jsUndefined(); - - for (size_t count = codeBlock->numberOfConstantRegisters(), j = 0; j < count; ++i, ++j) - callFrame[i] = codeBlock->constantRegister(j); + callFrame->r(i) = jsUndefined(); int dst = (++vPC)->u.operand; JSActivation* activation = new (globalData) JSActivation(callFrame, static_cast<FunctionBodyNode*>(codeBlock->ownerNode())); - callFrame[dst] = activation; + callFrame->r(dst) = JSValue(activation); callFrame->setScopeChain(callFrame->scopeChain()->copy()->push(activation)); ++vPC; @@ -3381,9 +3340,9 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int thisRegister = (++vPC)->u.operand; - JSValue thisVal = callFrame[thisRegister].jsValue(); + JSValue thisVal = callFrame->r(thisRegister).jsValue(); if (thisVal.needsThisConversion()) - callFrame[thisRegister] = JSValue(thisVal.toThisObject(callFrame)); + callFrame->r(thisRegister) = JSValue(thisVal.toThisObject(callFrame)); ++vPC; NEXT_INSTRUCTION(); @@ -3398,7 +3357,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi This opcode should only be used at the beginning of a code block. */ - callFrame[RegisterFile::ArgumentsRegister] = JSValue(); + callFrame->r(RegisterFile::ArgumentsRegister) = JSValue(); ++vPC; NEXT_INSTRUCTION(); } @@ -3410,10 +3369,10 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi register, if it has not already been initialised. */ - if (!callFrame->optionalCalleeArguments()) { + if (!callFrame->r(RegisterFile::ArgumentsRegister).jsValue()) { Arguments* arguments = new (globalData) Arguments(callFrame); callFrame->setCalleeArguments(arguments); - callFrame[RegisterFile::ArgumentsRegister] = arguments; + callFrame->r(RegisterFile::ArgumentsRegister) = JSValue(arguments); } ++vPC; NEXT_INSTRUCTION(); @@ -3440,7 +3399,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int proto = vPC[5].u.operand; int thisRegister = vPC[6].u.operand; - JSValue v = callFrame[func].jsValue(); + JSValue v = callFrame->r(func).jsValue(); ConstructData constructData; ConstructType constructType = v.getConstructData(constructData); @@ -3451,14 +3410,14 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi CodeBlock* newCodeBlock = &functionBodyNode->bytecode(callDataScopeChain); Structure* structure; - JSValue prototype = callFrame[proto].jsValue(); + JSValue prototype = callFrame->r(proto).jsValue(); if (prototype.isObject()) structure = asObject(prototype)->inheritorID(); else structure = callDataScopeChain->globalObject()->emptyObjectStructure(); JSObject* newObject = new (globalData) JSObject(structure); - callFrame[thisRegister] = JSValue(newObject); // "this" value + callFrame->r(thisRegister) = JSValue(newObject); // "this" value CallFrame* previousCallFrame = callFrame; @@ -3492,7 +3451,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi returnValue = constructData.native.function(newCallFrame, asObject(v), args); } CHECK_FOR_EXCEPTION(); - callFrame[dst] = JSValue(returnValue); + callFrame->r(dst) = JSValue(returnValue); vPC += 7; NEXT_INSTRUCTION(); @@ -3511,13 +3470,13 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int dst = vPC[1].u.operand; - if (LIKELY(callFrame[dst].jsValue().isObject())) { + if (LIKELY(callFrame->r(dst).jsValue().isObject())) { vPC += 3; NEXT_INSTRUCTION(); } int override = vPC[2].u.operand; - callFrame[dst] = callFrame[override]; + callFrame->r(dst) = callFrame->r(override); vPC += 3; NEXT_INSTRUCTION(); @@ -3527,7 +3486,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int src = (++vPC)->u.operand; int count = (++vPC)->u.operand; - callFrame[dst] = concatenateStrings(callFrame, &callFrame->registers()[src], count); + callFrame->r(dst) = concatenateStrings(callFrame, &callFrame->registers()[src], count); ++vPC; NEXT_INSTRUCTION(); @@ -3536,7 +3495,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int dst = (++vPC)->u.operand; int src = (++vPC)->u.operand; - callFrame[dst] = callFrame[src].jsValue().toPrimitive(callFrame); + callFrame->r(dst) = callFrame->r(src).jsValue().toPrimitive(callFrame); ++vPC; NEXT_INSTRUCTION(); @@ -3549,11 +3508,11 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi are replaced by the result of toObject conversion of the scope. */ int scope = (++vPC)->u.operand; - JSValue v = callFrame[scope].jsValue(); + JSValue v = callFrame->r(scope).jsValue(); JSObject* o = v.toObject(callFrame); CHECK_FOR_EXCEPTION(); - callFrame[scope] = JSValue(o); + callFrame->r(scope) = JSValue(o); callFrame->setScopeChain(callFrame->scopeChain()->push(o)); ++vPC; @@ -3580,7 +3539,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int dst = (++vPC)->u.operand; int base = (++vPC)->u.operand; - callFrame[dst] = JSPropertyNameIterator::create(callFrame, callFrame[base].jsValue()); + callFrame->r(dst) = JSPropertyNameIterator::create(callFrame, callFrame->r(base).jsValue()); ++vPC; NEXT_INSTRUCTION(); } @@ -3597,10 +3556,10 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int iter = (++vPC)->u.operand; int target = (++vPC)->u.operand; - JSPropertyNameIterator* it = callFrame[iter].propertyNameIterator(); + JSPropertyNameIterator* it = callFrame->r(iter).propertyNameIterator(); if (JSValue temp = it->next(callFrame)) { CHECK_FOR_TIMEOUT(); - callFrame[dst] = JSValue(temp); + callFrame->r(dst) = JSValue(temp); vPC += target; NEXT_INSTRUCTION(); } @@ -3656,7 +3615,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi ASSERT(exceptionValue); ASSERT(!globalData->exception); int ex = (++vPC)->u.operand; - callFrame[ex] = exceptionValue; + callFrame->r(ex) = exceptionValue; exceptionValue = JSValue(); ++vPC; @@ -3674,7 +3633,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int ex = (++vPC)->u.operand; - exceptionValue = callFrame[ex].jsValue(); + exceptionValue = callFrame->r(ex).jsValue(); handler = throwException(callFrame, exceptionValue, vPC - callFrame->codeBlock()->instructions().begin(), true); if (!handler) { @@ -3685,18 +3644,6 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi vPC = callFrame->codeBlock()->instructions().begin() + handler->target; NEXT_INSTRUCTION(); } - DEFINE_OPCODE(op_unexpected_load) { - /* unexpected_load load dst(r) src(k) - - Copies constant src to register dst. - */ - int dst = (++vPC)->u.operand; - int src = (++vPC)->u.operand; - callFrame[dst] = JSValue(callFrame->codeBlock()->unexpectedConstant(src)); - - ++vPC; - NEXT_INSTRUCTION(); - } DEFINE_OPCODE(op_new_error) { /* new_error dst(r) type(n) message(k) @@ -3710,7 +3657,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int message = (++vPC)->u.operand; CodeBlock* codeBlock = callFrame->codeBlock(); - callFrame[dst] = JSValue(Error::create(callFrame, (ErrorType)type, codeBlock->unexpectedConstant(message).toString(callFrame), codeBlock->lineNumberForBytecodeOffset(callFrame, vPC - codeBlock->instructions().begin()), codeBlock->ownerNode()->sourceID(), codeBlock->ownerNode()->sourceURL())); + callFrame->r(dst) = JSValue(Error::create(callFrame, (ErrorType)type, callFrame->r(message).jsValue().toString(callFrame), codeBlock->lineNumberForBytecodeOffset(callFrame, vPC - codeBlock->instructions().begin()), codeBlock->ownerNode()->sourceID(), codeBlock->ownerNode()->sourceURL())); ++vPC; NEXT_INSTRUCTION(); @@ -3728,7 +3675,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi scopeChain->deref(); } int result = (++vPC)->u.operand; - return callFrame[result].jsValue(); + return callFrame->r(result).jsValue(); } DEFINE_OPCODE(op_put_getter) { /* put_getter base(r) property(id) function(r) @@ -3745,11 +3692,11 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int property = (++vPC)->u.operand; int function = (++vPC)->u.operand; - ASSERT(callFrame[base].jsValue().isObject()); - JSObject* baseObj = asObject(callFrame[base].jsValue()); + ASSERT(callFrame->r(base).jsValue().isObject()); + JSObject* baseObj = asObject(callFrame->r(base).jsValue()); Identifier& ident = callFrame->codeBlock()->identifier(property); - ASSERT(callFrame[function].jsValue().isObject()); - baseObj->defineGetter(callFrame, ident, asObject(callFrame[function].jsValue())); + ASSERT(callFrame->r(function).jsValue().isObject()); + baseObj->defineGetter(callFrame, ident, asObject(callFrame->r(function).jsValue())); ++vPC; NEXT_INSTRUCTION(); @@ -3769,11 +3716,11 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int property = (++vPC)->u.operand; int function = (++vPC)->u.operand; - ASSERT(callFrame[base].jsValue().isObject()); - JSObject* baseObj = asObject(callFrame[base].jsValue()); + ASSERT(callFrame->r(base).jsValue().isObject()); + JSObject* baseObj = asObject(callFrame->r(base).jsValue()); Identifier& ident = callFrame->codeBlock()->identifier(property); - ASSERT(callFrame[function].jsValue().isObject()); - baseObj->defineSetter(callFrame, ident, asObject(callFrame[function].jsValue())); + ASSERT(callFrame->r(function).jsValue().isObject()); + baseObj->defineSetter(callFrame, ident, asObject(callFrame->r(function).jsValue())); ++vPC; NEXT_INSTRUCTION(); @@ -3790,7 +3737,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi */ int retAddrDst = (++vPC)->u.operand; int target = (++vPC)->u.operand; - callFrame[retAddrDst] = vPC + 1; + callFrame->r(retAddrDst) = vPC + 1; vPC += target; NEXT_INSTRUCTION(); @@ -3803,7 +3750,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi register, not as an immediate. */ int retAddrSrc = (++vPC)->u.operand; - vPC = callFrame[retAddrSrc].vPC(); + vPC = callFrame->r(retAddrSrc).vPC(); NEXT_INSTRUCTION(); } DEFINE_OPCODE(op_debug) { @@ -3830,7 +3777,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int function = vPC[1].u.operand; if (*enabledProfilerReference) - (*enabledProfilerReference)->willExecute(callFrame, callFrame[function].jsValue()); + (*enabledProfilerReference)->willExecute(callFrame, callFrame->r(function).jsValue()); vPC += 2; NEXT_INSTRUCTION(); @@ -3844,7 +3791,7 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi int function = vPC[1].u.operand; if (*enabledProfilerReference) - (*enabledProfilerReference)->didExecute(callFrame, callFrame[function].jsValue()); + (*enabledProfilerReference)->didExecute(callFrame, callFrame->r(function).jsValue()); vPC += 2; NEXT_INSTRUCTION(); @@ -3887,12 +3834,12 @@ JSValue Interpreter::retrieveArguments(CallFrame* callFrame, JSFunction* functio ASSERT(codeBlock->codeType() == FunctionCode); SymbolTable& symbolTable = codeBlock->symbolTable(); int argumentsIndex = symbolTable.get(functionCallFrame->propertyNames().arguments.ustring().rep()).getIndex(); - if (!functionCallFrame[argumentsIndex].arguments()) { + if (!functionCallFrame->r(argumentsIndex).jsValue()) { Arguments* arguments = new (callFrame) Arguments(functionCallFrame); functionCallFrame->setCalleeArguments(arguments); - functionCallFrame[RegisterFile::ArgumentsRegister] = arguments; + functionCallFrame->r(RegisterFile::ArgumentsRegister) = JSValue(arguments); } - return functionCallFrame[argumentsIndex].jsValue(); + return functionCallFrame->r(argumentsIndex).jsValue(); } Arguments* arguments = functionCallFrame->optionalCalleeArguments(); diff --git a/JavaScriptCore/interpreter/Interpreter.h b/JavaScriptCore/interpreter/Interpreter.h index 7cab254..519c508 100644 --- a/JavaScriptCore/interpreter/Interpreter.h +++ b/JavaScriptCore/interpreter/Interpreter.h @@ -31,21 +31,20 @@ #include "ArgList.h" #include "FastAllocBase.h" -#include "HashMap.h" #include "JSCell.h" #include "JSValue.h" #include "JSObject.h" #include "Opcode.h" #include "RegisterFile.h" +#include <wtf/HashMap.h> + namespace JSC { class CodeBlock; class EvalNode; class FunctionBodyNode; - class Instruction; class InternalFunction; - class AssemblerBuffer; class JSFunction; class JSGlobalObject; class ProgramNode; @@ -54,7 +53,8 @@ namespace JSC { class SamplingTool; struct CallFrameClosure; struct HandlerInfo; - + struct Instruction; + enum DebugHookID { WillExecuteProgram, DidExecuteProgram, @@ -66,7 +66,7 @@ namespace JSC { enum { MaxMainThreadReentryDepth = 256, MaxSecondaryThreadReentryDepth = 32 }; - class Interpreter : public WTF::FastAllocBase { + class Interpreter : public FastAllocBase { friend class JIT; friend class CachedCall; public: diff --git a/JavaScriptCore/interpreter/Register.h b/JavaScriptCore/interpreter/Register.h index cceac74..95ae5f6 100644 --- a/JavaScriptCore/interpreter/Register.h +++ b/JavaScriptCore/interpreter/Register.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 Apple Inc. All rights reserved. + * Copyright (C) 2008, 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 @@ -31,6 +31,7 @@ #include "JSValue.h" #include <wtf/Assertions.h> +#include <wtf/FastAllocBase.h> #include <wtf/VectorTraits.h> namespace JSC { @@ -47,28 +48,16 @@ namespace JSC { typedef ExecState CallFrame; - class Register { + class Register : public WTF::FastAllocBase { public: Register(); Register(JSValue); - Register(Arguments*); JSValue jsValue() const; bool marked() const; - void mark(); + void markChildren(MarkStack&); - int32_t i() const; - void* v() const; - - private: - friend class ExecState; - friend class Interpreter; - - // Only CallFrame, Interpreter, and JITStubs should use these functions. - - Register(intptr_t); - Register(JSActivation*); Register(CallFrame*); Register(CodeBlock*); @@ -77,6 +66,7 @@ namespace JSC { Register(ScopeChainNode*); Register(Instruction*); + int32_t i() const; JSActivation* activation() const; Arguments* arguments() const; CallFrame* callFrame() const; @@ -86,13 +76,19 @@ namespace JSC { ScopeChainNode* scopeChain() const; Instruction* vPC() const; + static Register withInt(int32_t i) + { + return Register(i); + } + + private: + Register(int32_t); + union { - intptr_t i; - void* v; + int32_t i; EncodedJSValue value; JSActivation* activation; - Arguments* arguments; CallFrame* callFrame; CodeBlock* codeBlock; JSFunction* function; @@ -124,18 +120,8 @@ namespace JSC { return jsValue().marked(); } - ALWAYS_INLINE void Register::mark() - { - jsValue().mark(); - } - // Interpreter functions - ALWAYS_INLINE Register::Register(Arguments* arguments) - { - u.arguments = arguments; - } - ALWAYS_INLINE Register::Register(JSActivation* activation) { u.activation = activation; @@ -171,35 +157,21 @@ namespace JSC { u.propertyNameIterator = propertyNameIterator; } - ALWAYS_INLINE Register::Register(intptr_t i) + ALWAYS_INLINE Register::Register(int32_t i) { - // See comment on 'i()' below. - ASSERT(i == static_cast<int32_t>(i)); u.i = i; } - // Read 'i' as a 32-bit integer; we only use it to hold 32-bit values, - // and we only write 32-bits when writing the arg count from JIT code. ALWAYS_INLINE int32_t Register::i() const { - return static_cast<int32_t>(u.i); + return u.i; } - ALWAYS_INLINE void* Register::v() const - { - return u.v; - } - ALWAYS_INLINE JSActivation* Register::activation() const { return u.activation; } - ALWAYS_INLINE Arguments* Register::arguments() const - { - return u.arguments; - } - ALWAYS_INLINE CallFrame* Register::callFrame() const { return u.callFrame; diff --git a/JavaScriptCore/interpreter/RegisterFile.h b/JavaScriptCore/interpreter/RegisterFile.h index 09a3963..b5f7452 100644 --- a/JavaScriptCore/interpreter/RegisterFile.h +++ b/JavaScriptCore/interpreter/RegisterFile.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 Apple Inc. All rights reserved. + * Copyright (C) 2008, 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 @@ -32,12 +32,12 @@ #include "Collector.h" #include "ExecutableAllocator.h" #include "Register.h" +#include <stdio.h> #include <wtf/Noncopyable.h> #include <wtf/VMTags.h> #if HAVE(MMAP) #include <errno.h> -#include <stdio.h> #include <sys/mman.h> #endif @@ -92,7 +92,7 @@ namespace JSC { class JSGlobalObject; - class RegisterFile : Noncopyable { + class RegisterFile : public Noncopyable { friend class JIT; public: enum CallFrameHeaderEntry { @@ -136,8 +136,8 @@ namespace JSC { Register* lastGlobal() const { return m_start - m_numGlobals; } - void markGlobals(Heap* heap) { heap->markConservatively(lastGlobal(), m_start); } - void markCallFrames(Heap* heap) { heap->markConservatively(m_start, m_end); } + void markGlobals(MarkStack& markStack, Heap* heap) { heap->markConservatively(markStack, lastGlobal(), m_start); } + void markCallFrames(MarkStack& markStack, Heap* heap) { heap->markConservatively(markStack, m_start, m_end); } private: void releaseExcessCapacity(); @@ -176,19 +176,31 @@ namespace JSC { #if HAVE(MMAP) m_buffer = static_cast<Register*>(mmap(0, bufferLength, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, VM_TAG_FOR_REGISTERFILE_MEMORY, 0)); if (m_buffer == MAP_FAILED) { +#if PLATFORM(WINCE) + fprintf(stderr, "Could not allocate register file: %d\n", GetLastError()); +#else fprintf(stderr, "Could not allocate register file: %d\n", errno); +#endif CRASH(); } #elif HAVE(VIRTUALALLOC) m_buffer = static_cast<Register*>(VirtualAlloc(0, roundUpAllocationSize(bufferLength, commitSize), MEM_RESERVE, PAGE_READWRITE)); if (!m_buffer) { +#if PLATFORM(WINCE) + fprintf(stderr, "Could not allocate register file: %d\n", GetLastError()); +#else fprintf(stderr, "Could not allocate register file: %d\n", errno); +#endif CRASH(); } size_t committedSize = roundUpAllocationSize(maxGlobals * sizeof(Register), commitSize); void* commitCheck = VirtualAlloc(m_buffer, committedSize, MEM_COMMIT, PAGE_READWRITE); if (commitCheck != m_buffer) { +#if PLATFORM(WINCE) + fprintf(stderr, "Could not allocate register file: %d\n", GetLastError()); +#else fprintf(stderr, "Could not allocate register file: %d\n", errno); +#endif CRASH(); } m_commitEnd = reinterpret_cast<Register*>(reinterpret_cast<char*>(m_buffer) + committedSize); @@ -222,7 +234,11 @@ namespace JSC { if (newEnd > m_commitEnd) { size_t size = roundUpAllocationSize(reinterpret_cast<char*>(newEnd) - reinterpret_cast<char*>(m_commitEnd), commitSize); if (!VirtualAlloc(m_commitEnd, size, MEM_COMMIT, PAGE_READWRITE)) { +#if PLATFORM(WINCE) + fprintf(stderr, "Could not allocate register file: %d\n", GetLastError()); +#else fprintf(stderr, "Could not allocate register file: %d\n", errno); +#endif CRASH(); } m_commitEnd = reinterpret_cast<Register*>(reinterpret_cast<char*>(m_commitEnd) + size); diff --git a/JavaScriptCore/jit/ExecutableAllocator.h b/JavaScriptCore/jit/ExecutableAllocator.h index a545b0c..4ed47e3 100644 --- a/JavaScriptCore/jit/ExecutableAllocator.h +++ b/JavaScriptCore/jit/ExecutableAllocator.h @@ -156,7 +156,7 @@ public: return pool.release(); } -#if ENABLE(ASSEMBLER_WX_EXCLUSIVE) || !(PLATFORM(X86) || PLATFORM(X86_64)) +#if ENABLE(ASSEMBLER_WX_EXCLUSIVE) static void makeWritable(void* start, size_t size) { reprotectRegion(start, size, Writable); @@ -165,58 +165,47 @@ public: static void makeExecutable(void* start, size_t size) { reprotectRegion(start, size, Executable); - cacheFlush(start, size); } - - // If ASSEMBLER_WX_EXCLUSIVE protection is turned on, or on non-x86 platforms, - // we need to track start & size so we can makeExecutable/cacheFlush at the end. - class MakeWritable { - public: - MakeWritable(void* start, size_t size) - : m_start(start) - , m_size(size) - { - makeWritable(start, size); - } - - ~MakeWritable() - { - makeExecutable(m_start, m_size); - } - - private: - void* m_start; - size_t m_size; - }; #else static void makeWritable(void*, size_t) {} static void makeExecutable(void*, size_t) {} - - // On x86, without ASSEMBLER_WX_EXCLUSIVE, there is nothing to do here. - class MakeWritable { public: MakeWritable(void*, size_t) {} }; #endif -private: - -#if ENABLE(ASSEMBLER_WX_EXCLUSIVE) || !(PLATFORM(X86) || PLATFORM(X86_64)) -#if ENABLE(ASSEMBLER_WX_EXCLUSIVE) - static void reprotectRegion(void*, size_t, ProtectionSeting); -#else - static void reprotectRegion(void*, size_t, ProtectionSeting) {} -#endif - static void cacheFlush(void* code, size_t size) - { #if PLATFORM(X86) || PLATFORM(X86_64) - UNUSED_PARAM(code); - UNUSED_PARAM(size); -#elif PLATFORM(ARM_V7) && PLATFORM(IPHONE) + static void cacheFlush(void*, size_t) + { + } +#elif PLATFORM_ARM_ARCH(7) && PLATFORM(IPHONE) + static void cacheFlush(void* code, size_t size) + { sys_dcache_flush(code, size); sys_icache_invalidate(code, size); -#else -#error "ExecutableAllocator::cacheFlush not implemented on this platform." -#endif } +#elif PLATFORM(ARM) + static void cacheFlush(void* code, size_t size) + { + #if COMPILER(GCC) && (GCC_VERSION >= 30406) + __clear_cache(reinterpret_cast<char*>(code), reinterpret_cast<char*>(code) + size); + #else + const int syscall = 0xf0002; + __asm __volatile ( + "mov r0, %0\n" + "mov r1, %1\n" + "mov r7, %2\n" + "mov r2, #0x0\n" + "swi 0x00000000\n" + : + : "r" (code), "r" (reinterpret_cast<char*>(code) + size), "r" (syscall) + : "r0", "r1", "r7"); + #endif // COMPILER(GCC) && (GCC_VERSION >= 30406) + } +#endif + +private: + +#if ENABLE(ASSEMBLER_WX_EXCLUSIVE) + static void reprotectRegion(void*, size_t, ProtectionSeting); #endif RefPtr<ExecutablePool> m_smallAllocationPool; diff --git a/JavaScriptCore/jit/JIT.cpp b/JavaScriptCore/jit/JIT.cpp index 0cfb535..0d6d1b8 100644 --- a/JavaScriptCore/jit/JIT.cpp +++ b/JavaScriptCore/jit/JIT.cpp @@ -1,4 +1,3 @@ - /* * Copyright (C) 2008, 2009 Apple Inc. All rights reserved. * @@ -27,14 +26,23 @@ #include "config.h" #include "JIT.h" +// This probably does not belong here; adding here for now as a quick Windows build fix. +#if ENABLE(ASSEMBLER) && PLATFORM(X86) && !PLATFORM(MAC) +#include "MacroAssembler.h" +JSC::MacroAssemblerX86Common::SSE2CheckState JSC::MacroAssemblerX86Common::s_sse2CheckState = NotCheckedSSE2; +#endif + #if ENABLE(JIT) #include "CodeBlock.h" #include "Interpreter.h" #include "JITInlineMethods.h" +#include "JITStubs.h" #include "JITStubCall.h" #include "JSArray.h" #include "JSFunction.h" +#include "LinkBuffer.h" +#include "RepatchBuffer.h" #include "ResultType.h" #include "SamplingTool.h" @@ -46,19 +54,22 @@ using namespace std; namespace JSC { -void ctiPatchNearCallByReturnAddress(MacroAssembler::ProcessorReturnAddress returnAddress, MacroAssemblerCodePtr newCalleeFunction) +void ctiPatchNearCallByReturnAddress(CodeBlock* codeblock, ReturnAddressPtr returnAddress, MacroAssemblerCodePtr newCalleeFunction) { - returnAddress.relinkNearCallerToTrampoline(newCalleeFunction); + RepatchBuffer repatchBuffer(codeblock); + repatchBuffer.relinkNearCallerToTrampoline(returnAddress, newCalleeFunction); } -void ctiPatchCallByReturnAddress(MacroAssembler::ProcessorReturnAddress returnAddress, MacroAssemblerCodePtr newCalleeFunction) +void ctiPatchCallByReturnAddress(CodeBlock* codeblock, ReturnAddressPtr returnAddress, MacroAssemblerCodePtr newCalleeFunction) { - returnAddress.relinkCallerToTrampoline(newCalleeFunction); + RepatchBuffer repatchBuffer(codeblock); + repatchBuffer.relinkCallerToTrampoline(returnAddress, newCalleeFunction); } -void ctiPatchCallByReturnAddress(MacroAssembler::ProcessorReturnAddress returnAddress, FunctionPtr newCalleeFunction) +void ctiPatchCallByReturnAddress(CodeBlock* codeblock, ReturnAddressPtr returnAddress, FunctionPtr newCalleeFunction) { - returnAddress.relinkCallerToFunction(newCalleeFunction); + RepatchBuffer repatchBuffer(codeblock); + repatchBuffer.relinkCallerToFunction(returnAddress, newCalleeFunction); } JIT::JIT(JSGlobalData* globalData, CodeBlock* codeBlock) @@ -68,51 +79,68 @@ JIT::JIT(JSGlobalData* globalData, CodeBlock* codeBlock) , m_labels(codeBlock ? codeBlock->instructions().size() : 0) , m_propertyAccessCompilationInfo(codeBlock ? codeBlock->numberOfStructureStubInfos() : 0) , m_callStructureStubCompilationInfo(codeBlock ? codeBlock->numberOfCallLinkInfos() : 0) + , m_bytecodeIndex((unsigned)-1) +#if USE(JSVALUE32_64) + , m_jumpTargetIndex(0) + , m_mappedBytecodeIndex((unsigned)-1) + , m_mappedVirtualRegisterIndex((unsigned)-1) + , m_mappedTag((RegisterID)-1) + , m_mappedPayload((RegisterID)-1) +#else , m_lastResultBytecodeRegister(std::numeric_limits<int>::max()) , m_jumpTargetsPosition(0) +#endif { } -void JIT::compileOpStrictEq(Instruction* currentInstruction, CompileOpStrictEqType type) +#if USE(JSVALUE32_64) +void JIT::emitTimeoutCheck() { - unsigned dst = currentInstruction[1].u.operand; - unsigned src1 = currentInstruction[2].u.operand; - unsigned src2 = currentInstruction[3].u.operand; - - emitGetVirtualRegisters(src1, regT0, src2, regT1); - - // Jump to a slow case if either operand is a number, or if both are JSCell*s. - move(regT0, regT2); - orPtr(regT1, regT2); - addSlowCase(emitJumpIfJSCell(regT2)); - addSlowCase(emitJumpIfImmediateNumber(regT2)); - - if (type == OpStrictEq) - set32(Equal, regT1, regT0, regT0); - else - set32(NotEqual, regT1, regT0, regT0); - emitTagAsBoolImmediate(regT0); - - emitPutVirtualRegister(dst); + Jump skipTimeout = branchSub32(NonZero, Imm32(1), timeoutCheckRegister); + JITStubCall stubCall(this, cti_timeout_check); + stubCall.addArgument(regT1, regT0); // save last result registers. + stubCall.call(timeoutCheckRegister); + stubCall.getArgument(0, regT1, regT0); // reload last result registers. + skipTimeout.link(this); } - +#else void JIT::emitTimeoutCheck() { Jump skipTimeout = branchSub32(NonZero, Imm32(1), timeoutCheckRegister); - JITStubCall(this, JITStubs::cti_timeout_check).call(timeoutCheckRegister); + JITStubCall(this, cti_timeout_check).call(timeoutCheckRegister); skipTimeout.link(this); killLastResultRegister(); } - +#endif #define NEXT_OPCODE(name) \ m_bytecodeIndex += OPCODE_LENGTH(name); \ break; +#if USE(JSVALUE32_64) +#define DEFINE_BINARY_OP(name) \ + case name: { \ + JITStubCall stubCall(this, cti_##name); \ + stubCall.addArgument(currentInstruction[2].u.operand); \ + stubCall.addArgument(currentInstruction[3].u.operand); \ + stubCall.call(currentInstruction[1].u.operand); \ + NEXT_OPCODE(name); \ + } + +#define DEFINE_UNARY_OP(name) \ + case name: { \ + JITStubCall stubCall(this, cti_##name); \ + stubCall.addArgument(currentInstruction[2].u.operand); \ + stubCall.call(currentInstruction[1].u.operand); \ + NEXT_OPCODE(name); \ + } + +#else // USE(JSVALUE32_64) + #define DEFINE_BINARY_OP(name) \ case name: { \ - JITStubCall stubCall(this, JITStubs::cti_##name); \ + JITStubCall stubCall(this, cti_##name); \ stubCall.addArgument(currentInstruction[2].u.operand, regT2); \ stubCall.addArgument(currentInstruction[3].u.operand, regT2); \ stubCall.call(currentInstruction[1].u.operand); \ @@ -121,11 +149,12 @@ void JIT::emitTimeoutCheck() #define DEFINE_UNARY_OP(name) \ case name: { \ - JITStubCall stubCall(this, JITStubs::cti_##name); \ + JITStubCall stubCall(this, cti_##name); \ stubCall.addArgument(currentInstruction[2].u.operand, regT2); \ stubCall.call(currentInstruction[1].u.operand); \ NEXT_OPCODE(name); \ } +#endif // USE(JSVALUE32_64) #define DEFINE_OP(name) \ case name: { \ @@ -157,14 +186,18 @@ void JIT::privateCompileMainPass() sampleInstruction(currentInstruction); #endif +#if !USE(JSVALUE32_64) if (m_labels[m_bytecodeIndex].isUsed()) killLastResultRegister(); - +#endif + m_labels[m_bytecodeIndex] = label(); switch (m_interpreter->getOpcodeID(currentInstruction->u.opcode)) { DEFINE_BINARY_OP(op_del_by_val) +#if !USE(JSVALUE32_64) DEFINE_BINARY_OP(op_div) +#endif DEFINE_BINARY_OP(op_in) DEFINE_BINARY_OP(op_less) DEFINE_BINARY_OP(op_lesseq) @@ -176,7 +209,9 @@ void JIT::privateCompileMainPass() DEFINE_UNARY_OP(op_is_object) DEFINE_UNARY_OP(op_is_string) DEFINE_UNARY_OP(op_is_undefined) +#if !USE(JSVALUE32_64) DEFINE_UNARY_OP(op_negate) +#endif DEFINE_UNARY_OP(op_typeof) DEFINE_OP(op_add) @@ -195,6 +230,9 @@ void JIT::privateCompileMainPass() DEFINE_OP(op_create_arguments) DEFINE_OP(op_debug) DEFINE_OP(op_del_by_id) +#if USE(JSVALUE32_64) + DEFINE_OP(op_div) +#endif DEFINE_OP(op_end) DEFINE_OP(op_enter) DEFINE_OP(op_enter_with_activation) @@ -225,6 +263,9 @@ void JIT::privateCompileMainPass() DEFINE_OP(op_mod) DEFINE_OP(op_mov) DEFINE_OP(op_mul) +#if USE(JSVALUE32_64) + DEFINE_OP(op_negate) +#endif DEFINE_OP(op_neq) DEFINE_OP(op_neq_null) DEFINE_OP(op_new_array) @@ -254,7 +295,6 @@ void JIT::privateCompileMainPass() DEFINE_OP(op_put_setter) DEFINE_OP(op_resolve) DEFINE_OP(op_resolve_base) - DEFINE_OP(op_resolve_func) DEFINE_OP(op_resolve_global) DEFINE_OP(op_resolve_skip) DEFINE_OP(op_resolve_with_base) @@ -272,7 +312,6 @@ void JIT::privateCompileMainPass() DEFINE_OP(op_throw) DEFINE_OP(op_to_jsnumber) DEFINE_OP(op_to_primitive) - DEFINE_OP(op_unexpected_load) case op_get_array_length: case op_get_by_id_chain: @@ -312,11 +351,15 @@ void JIT::privateCompileSlowCases() Instruction* instructionsBegin = m_codeBlock->instructions().begin(); m_propertyAccessInstructionIndex = 0; +#if USE(JSVALUE32_64) + m_globalResolveInfoIndex = 0; +#endif m_callLinkInfoIndex = 0; for (Vector<SlowCaseEntry>::iterator iter = m_slowCases.begin(); iter != m_slowCases.end();) { - // FIXME: enable peephole optimizations for slow cases when applicable +#if !USE(JSVALUE32_64) killLastResultRegister(); +#endif m_bytecodeIndex = iter->to; #ifndef NDEBUG @@ -336,6 +379,9 @@ void JIT::privateCompileSlowCases() DEFINE_SLOWCASE_OP(op_construct) DEFINE_SLOWCASE_OP(op_construct_verify) DEFINE_SLOWCASE_OP(op_convert_this) +#if USE(JSVALUE32_64) + DEFINE_SLOWCASE_OP(op_div) +#endif DEFINE_SLOWCASE_OP(op_eq) DEFINE_SLOWCASE_OP(op_get_by_id) DEFINE_SLOWCASE_OP(op_get_by_val) @@ -348,9 +394,12 @@ void JIT::privateCompileSlowCases() DEFINE_SLOWCASE_OP(op_loop_if_lesseq) DEFINE_SLOWCASE_OP(op_loop_if_true) DEFINE_SLOWCASE_OP(op_lshift) + DEFINE_SLOWCASE_OP(op_method_check) DEFINE_SLOWCASE_OP(op_mod) DEFINE_SLOWCASE_OP(op_mul) - DEFINE_SLOWCASE_OP(op_method_check) +#if USE(JSVALUE32_64) + DEFINE_SLOWCASE_OP(op_negate) +#endif DEFINE_SLOWCASE_OP(op_neq) DEFINE_SLOWCASE_OP(op_not) DEFINE_SLOWCASE_OP(op_nstricteq) @@ -360,6 +409,9 @@ void JIT::privateCompileSlowCases() DEFINE_SLOWCASE_OP(op_pre_inc) DEFINE_SLOWCASE_OP(op_put_by_id) DEFINE_SLOWCASE_OP(op_put_by_val) +#if USE(JSVALUE32_64) + DEFINE_SLOWCASE_OP(op_resolve_global) +#endif DEFINE_SLOWCASE_OP(op_rshift) DEFINE_SLOWCASE_OP(op_stricteq) DEFINE_SLOWCASE_OP(op_sub) @@ -394,7 +446,7 @@ void JIT::privateCompile() #endif // Could use a pop_m, but would need to offset the following instruction if so. - preverveReturnAddressAfterCall(regT2); + preserveReturnAddressAfterCall(regT2); emitPutToCallFrameHeader(regT2, RegisterFile::ReturnPC); Jump slowRegisterFileCheck; @@ -403,10 +455,10 @@ void JIT::privateCompile() // In the case of a fast linked call, we do not set this up in the caller. emitPutImmediateToCallFrameHeader(m_codeBlock, RegisterFile::CodeBlock); - peek(regT0, FIELD_OFFSET(JITStackFrame, registerFile) / sizeof (void*)); + peek(regT0, OBJECT_OFFSETOF(JITStackFrame, registerFile) / sizeof (void*)); addPtr(Imm32(m_codeBlock->m_numCalleeRegisters * sizeof(Register)), callFrameRegister, regT1); - slowRegisterFileCheck = branchPtr(Above, regT1, Address(regT0, FIELD_OFFSET(RegisterFile, m_end))); + slowRegisterFileCheck = branchPtr(Above, regT1, Address(regT0, OBJECT_OFFSETOF(RegisterFile, m_end))); afterRegisterFileCheck = label(); } @@ -417,7 +469,7 @@ void JIT::privateCompile() if (m_codeBlock->codeType() == FunctionCode) { slowRegisterFileCheck.link(this); m_bytecodeIndex = 0; - JITStubCall(this, JITStubs::cti_register_file_check).call(); + JITStubCall(this, cti_register_file_check).call(); #ifndef NDEBUG m_bytecodeIndex = (unsigned)-1; // Reset this, in order to guard its use with ASSERTs. #endif @@ -426,7 +478,7 @@ void JIT::privateCompile() ASSERT(m_jmpTable.isEmpty()); - PatchBuffer patchBuffer(this, m_globalData->executableAllocator.poolForSize(m_assembler.size())); + LinkBuffer patchBuffer(this, m_globalData->executableAllocator.poolForSize(m_assembler.size())); // Translate vPC offsets into addresses in JIT generated code, for switch tables. for (unsigned i = 0; i < m_switches.size(); ++i) { @@ -474,7 +526,7 @@ void JIT::privateCompile() // Link absolute addresses for jsr for (Vector<JSRInfo>::iterator iter = m_jsrSites.begin(); iter != m_jsrSites.end(); ++iter) - patchBuffer.patch(iter->storeLocation, patchBuffer.locationOf(iter->target).addressForJSR()); + patchBuffer.patch(iter->storeLocation, patchBuffer.locationOf(iter->target).executableAddress()); #if ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) for (unsigned i = 0; i < m_codeBlock->numberOfStructureStubInfos(); ++i) { @@ -486,10 +538,10 @@ void JIT::privateCompile() #if ENABLE(JIT_OPTIMIZE_CALL) for (unsigned i = 0; i < m_codeBlock->numberOfCallLinkInfos(); ++i) { CallLinkInfo& info = m_codeBlock->callLinkInfo(i); + info.ownerCodeBlock = m_codeBlock; info.callReturnLocation = patchBuffer.locationOfNearCall(m_callStructureStubCompilationInfo[i].callReturnLocation); info.hotPathBegin = patchBuffer.locationOf(m_callStructureStubCompilationInfo[i].hotPathBegin); info.hotPathOther = patchBuffer.locationOfNearCall(m_callStructureStubCompilationInfo[i].hotPathOther); - info.coldPathOther = patchBuffer.locationOf(m_callStructureStubCompilationInfo[i].coldPathOther); } #endif unsigned methodCallCount = m_methodCallCompilationInfo.size(); @@ -503,436 +555,58 @@ void JIT::privateCompile() m_codeBlock->setJITCode(patchBuffer.finalizeCode()); } -void JIT::privateCompileCTIMachineTrampolines(RefPtr<ExecutablePool>* executablePool, JSGlobalData* globalData, CodePtr* ctiArrayLengthTrampoline, CodePtr* ctiStringLengthTrampoline, CodePtr* ctiVirtualCallPreLink, CodePtr* ctiVirtualCallLink, CodePtr* ctiVirtualCall, CodePtr* ctiNativeCallThunk) -{ -#if ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) - // (1) The first function provides fast property access for array length - Label arrayLengthBegin = align(); - - // Check eax is an array - Jump array_failureCases1 = emitJumpIfNotJSCell(regT0); - Jump array_failureCases2 = branchPtr(NotEqual, Address(regT0), ImmPtr(m_globalData->jsArrayVPtr)); - - // Checks out okay! - get the length from the storage - loadPtr(Address(regT0, FIELD_OFFSET(JSArray, m_storage)), regT0); - load32(Address(regT0, FIELD_OFFSET(ArrayStorage, m_length)), regT0); - - Jump array_failureCases3 = branch32(Above, regT0, Imm32(JSImmediate::maxImmediateInt)); - - // regT0 contains a 64 bit value (is positive, is zero extended) so we don't need sign extend here. - emitFastArithIntToImmNoCheck(regT0, regT0); - - ret(); - - // (2) The second function provides fast property access for string length - Label stringLengthBegin = align(); - - // Check eax is a string - Jump string_failureCases1 = emitJumpIfNotJSCell(regT0); - Jump string_failureCases2 = branchPtr(NotEqual, Address(regT0), ImmPtr(m_globalData->jsStringVPtr)); - - // Checks out okay! - get the length from the Ustring. - loadPtr(Address(regT0, FIELD_OFFSET(JSString, m_value) + FIELD_OFFSET(UString, m_rep)), regT0); - load32(Address(regT0, FIELD_OFFSET(UString::Rep, len)), regT0); - - Jump string_failureCases3 = branch32(Above, regT0, Imm32(JSImmediate::maxImmediateInt)); - - // regT0 contains a 64 bit value (is positive, is zero extended) so we don't need sign extend here. - emitFastArithIntToImmNoCheck(regT0, regT0); - - ret(); -#endif - - // (3) Trampolines for the slow cases of op_call / op_call_eval / op_construct. - - Label virtualCallPreLinkBegin = align(); - - // Load the callee CodeBlock* into eax - loadPtr(Address(regT2, FIELD_OFFSET(JSFunction, m_body)), regT3); - loadPtr(Address(regT3, FIELD_OFFSET(FunctionBodyNode, m_code)), regT0); - Jump hasCodeBlock1 = branchTestPtr(NonZero, regT0); - // If m_code is null and m_jitCode is not, then we have a native function, so arity is irrelevant - loadPtr(Address(regT3, FIELD_OFFSET(FunctionBodyNode, m_jitCode)), regT0); - Jump isNativeFunc1 = branchTestPtr(NonZero, regT0); - preverveReturnAddressAfterCall(regT3); - restoreArgumentReference(); - Call callJSFunction1 = call(); - emitGetJITStubArg(1, regT2); - emitGetJITStubArg(3, regT1); - restoreReturnAddressBeforeReturn(regT3); - hasCodeBlock1.link(this); - - // Check argCount matches callee arity. - Jump arityCheckOkay1 = branch32(Equal, Address(regT0, FIELD_OFFSET(CodeBlock, m_numParameters)), regT1); - preverveReturnAddressAfterCall(regT3); - emitPutJITStubArg(regT3, 2); - emitPutJITStubArg(regT0, 4); - restoreArgumentReference(); - Call callArityCheck1 = call(); - move(regT1, callFrameRegister); - emitGetJITStubArg(1, regT2); - emitGetJITStubArg(3, regT1); - restoreReturnAddressBeforeReturn(regT3); - arityCheckOkay1.link(this); - isNativeFunc1.link(this); - - compileOpCallInitializeCallFrame(); - - preverveReturnAddressAfterCall(regT3); - emitPutJITStubArg(regT3, 2); - restoreArgumentReference(); - Call callDontLazyLinkCall = call(); - emitGetJITStubArg(1, regT2); - restoreReturnAddressBeforeReturn(regT3); - - jump(regT0); - - Label virtualCallLinkBegin = align(); - - // Load the callee CodeBlock* into eax - loadPtr(Address(regT2, FIELD_OFFSET(JSFunction, m_body)), regT3); - loadPtr(Address(regT3, FIELD_OFFSET(FunctionBodyNode, m_code)), regT0); - Jump hasCodeBlock2 = branchTestPtr(NonZero, regT0); - // If m_code is null and m_jitCode is not, then we have a native function, so arity is irrelevant - loadPtr(Address(regT3, FIELD_OFFSET(FunctionBodyNode, m_jitCode)), regT0); - Jump isNativeFunc2 = branchTestPtr(NonZero, regT0); - preverveReturnAddressAfterCall(regT3); - restoreArgumentReference(); - Call callJSFunction2 = call(); - emitGetJITStubArg(1, regT2); - emitGetJITStubArg(3, regT1); - restoreReturnAddressBeforeReturn(regT3); - hasCodeBlock2.link(this); - - // Check argCount matches callee arity. - Jump arityCheckOkay2 = branch32(Equal, Address(regT0, FIELD_OFFSET(CodeBlock, m_numParameters)), regT1); - preverveReturnAddressAfterCall(regT3); - emitPutJITStubArg(regT3, 2); - emitPutJITStubArg(regT0, 4); - restoreArgumentReference(); - Call callArityCheck2 = call(); - move(regT1, callFrameRegister); - emitGetJITStubArg(1, regT2); - emitGetJITStubArg(3, regT1); - restoreReturnAddressBeforeReturn(regT3); - arityCheckOkay2.link(this); - isNativeFunc2.link(this); - - compileOpCallInitializeCallFrame(); - - preverveReturnAddressAfterCall(regT3); - emitPutJITStubArg(regT3, 2); - restoreArgumentReference(); - Call callLazyLinkCall = call(); - restoreReturnAddressBeforeReturn(regT3); - - jump(regT0); - - Label virtualCallBegin = align(); - - // Load the callee CodeBlock* into eax - loadPtr(Address(regT2, FIELD_OFFSET(JSFunction, m_body)), regT3); - loadPtr(Address(regT3, FIELD_OFFSET(FunctionBodyNode, m_code)), regT0); - Jump hasCodeBlock3 = branchTestPtr(NonZero, regT0); - // If m_code is null and m_jitCode is not, then we have a native function, so arity is irrelevant - loadPtr(Address(regT3, FIELD_OFFSET(FunctionBodyNode, m_jitCode)), regT0); - Jump isNativeFunc3 = branchTestPtr(NonZero, regT0); - preverveReturnAddressAfterCall(regT3); - restoreArgumentReference(); - Call callJSFunction3 = call(); - emitGetJITStubArg(1, regT2); - emitGetJITStubArg(3, regT1); - restoreReturnAddressBeforeReturn(regT3); - loadPtr(Address(regT2, FIELD_OFFSET(JSFunction, m_body)), regT3); // reload the function body nody, so we can reload the code pointer. - hasCodeBlock3.link(this); - - // Check argCount matches callee arity. - Jump arityCheckOkay3 = branch32(Equal, Address(regT0, FIELD_OFFSET(CodeBlock, m_numParameters)), regT1); - preverveReturnAddressAfterCall(regT3); - emitPutJITStubArg(regT3, 2); - emitPutJITStubArg(regT0, 4); - restoreArgumentReference(); - Call callArityCheck3 = call(); - move(regT1, callFrameRegister); - emitGetJITStubArg(1, regT2); - emitGetJITStubArg(3, regT1); - restoreReturnAddressBeforeReturn(regT3); - loadPtr(Address(regT2, FIELD_OFFSET(JSFunction, m_body)), regT3); // reload the function body nody, so we can reload the code pointer. - arityCheckOkay3.link(this); - // load ctiCode from the new codeBlock. - loadPtr(Address(regT3, FIELD_OFFSET(FunctionBodyNode, m_jitCode)), regT0); - isNativeFunc3.link(this); - - compileOpCallInitializeCallFrame(); - jump(regT0); - - - Label nativeCallThunk = align(); - preverveReturnAddressAfterCall(regT0); - emitPutToCallFrameHeader(regT0, RegisterFile::ReturnPC); // Push return address - - // Load caller frame's scope chain into this callframe so that whatever we call can - // get to its global data. - emitGetFromCallFrameHeaderPtr(RegisterFile::CallerFrame, regT1); - emitGetFromCallFrameHeaderPtr(RegisterFile::ScopeChain, regT1, regT1); - emitPutToCallFrameHeader(regT1, RegisterFile::ScopeChain); - - -#if PLATFORM(X86_64) - emitGetFromCallFrameHeader32(RegisterFile::ArgumentCount, X86::ecx); - - // Allocate stack space for our arglist - subPtr(Imm32(sizeof(ArgList)), stackPointerRegister); - COMPILE_ASSERT((sizeof(ArgList) & 0xf) == 0, ArgList_should_by_16byte_aligned); - - // Set up arguments - subPtr(Imm32(1), X86::ecx); // Don't include 'this' in argcount - - // Push argcount - storePtr(X86::ecx, Address(stackPointerRegister, FIELD_OFFSET(ArgList, m_argCount))); - - // Calculate the start of the callframe header, and store in edx - addPtr(Imm32(-RegisterFile::CallFrameHeaderSize * (int32_t)sizeof(Register)), callFrameRegister, X86::edx); - - // Calculate start of arguments as callframe header - sizeof(Register) * argcount (ecx) - mul32(Imm32(sizeof(Register)), X86::ecx, X86::ecx); - subPtr(X86::ecx, X86::edx); - - // push pointer to arguments - storePtr(X86::edx, Address(stackPointerRegister, FIELD_OFFSET(ArgList, m_args))); - - // ArgList is passed by reference so is stackPointerRegister - move(stackPointerRegister, X86::ecx); - - // edx currently points to the first argument, edx-sizeof(Register) points to 'this' - loadPtr(Address(X86::edx, -(int32_t)sizeof(Register)), X86::edx); - - emitGetFromCallFrameHeaderPtr(RegisterFile::Callee, X86::esi); - - move(callFrameRegister, X86::edi); - - call(Address(X86::esi, FIELD_OFFSET(JSFunction, m_data))); - - addPtr(Imm32(sizeof(ArgList)), stackPointerRegister); -#elif PLATFORM(X86) - emitGetFromCallFrameHeader32(RegisterFile::ArgumentCount, regT0); - - /* We have two structs that we use to describe the stackframe we set up for our - * call to native code. NativeCallFrameStructure describes the how we set up the stack - * in advance of the call. NativeFunctionCalleeSignature describes the callframe - * as the native code expects it. We do this as we are using the fastcall calling - * convention which results in the callee popping its arguments off the stack, but - * not the rest of the callframe so we need a nice way to ensure we increment the - * stack pointer by the right amount after the call. - */ -#if COMPILER(MSVC) || PLATFORM(LINUX) - struct NativeCallFrameStructure { - // CallFrame* callFrame; // passed in EDX - JSObject* callee; - JSValue thisValue; - ArgList* argPointer; - ArgList args; - JSValue result; - }; - struct NativeFunctionCalleeSignature { - JSObject* callee; - JSValue thisValue; - ArgList* argPointer; - }; -#else - struct NativeCallFrameStructure { - // CallFrame* callFrame; // passed in ECX - // JSObject* callee; // passed in EDX - JSValue thisValue; - ArgList* argPointer; - ArgList args; - }; - struct NativeFunctionCalleeSignature { - JSValue thisValue; - ArgList* argPointer; - }; -#endif - const int NativeCallFrameSize = (sizeof(NativeCallFrameStructure) + 15) & ~15; - // Allocate system stack frame - subPtr(Imm32(NativeCallFrameSize), stackPointerRegister); - - // Set up arguments - subPtr(Imm32(1), regT0); // Don't include 'this' in argcount - - // push argcount - storePtr(regT0, Address(stackPointerRegister, FIELD_OFFSET(NativeCallFrameStructure, args) + FIELD_OFFSET(ArgList, m_argCount))); - - // Calculate the start of the callframe header, and store in regT1 - addPtr(Imm32(-RegisterFile::CallFrameHeaderSize * (int)sizeof(Register)), callFrameRegister, regT1); - - // Calculate start of arguments as callframe header - sizeof(Register) * argcount (regT0) - mul32(Imm32(sizeof(Register)), regT0, regT0); - subPtr(regT0, regT1); - storePtr(regT1, Address(stackPointerRegister, FIELD_OFFSET(NativeCallFrameStructure, args) + FIELD_OFFSET(ArgList, m_args))); - - // ArgList is passed by reference so is stackPointerRegister + 4 * sizeof(Register) - addPtr(Imm32(FIELD_OFFSET(NativeCallFrameStructure, args)), stackPointerRegister, regT0); - storePtr(regT0, Address(stackPointerRegister, FIELD_OFFSET(NativeCallFrameStructure, argPointer))); - - // regT1 currently points to the first argument, regT1 - sizeof(Register) points to 'this' - loadPtr(Address(regT1, -(int)sizeof(Register)), regT1); - storePtr(regT1, Address(stackPointerRegister, FIELD_OFFSET(NativeCallFrameStructure, thisValue))); - -#if COMPILER(MSVC) || PLATFORM(LINUX) - // ArgList is passed by reference so is stackPointerRegister + 4 * sizeof(Register) - addPtr(Imm32(FIELD_OFFSET(NativeCallFrameStructure, result)), stackPointerRegister, X86::ecx); - - // Plant callee - emitGetFromCallFrameHeaderPtr(RegisterFile::Callee, X86::eax); - storePtr(X86::eax, Address(stackPointerRegister, FIELD_OFFSET(NativeCallFrameStructure, callee))); - - // Plant callframe - move(callFrameRegister, X86::edx); - - call(Address(X86::eax, FIELD_OFFSET(JSFunction, m_data))); - - // JSValue is a non-POD type - loadPtr(Address(X86::eax), X86::eax); -#else - // Plant callee - emitGetFromCallFrameHeaderPtr(RegisterFile::Callee, X86::edx); - - // Plant callframe - move(callFrameRegister, X86::ecx); - call(Address(X86::edx, FIELD_OFFSET(JSFunction, m_data))); -#endif - - // We've put a few temporaries on the stack in addition to the actual arguments - // so pull them off now - addPtr(Imm32(NativeCallFrameSize - sizeof(NativeFunctionCalleeSignature)), stackPointerRegister); - -#elif ENABLE(JIT_OPTIMIZE_NATIVE_CALL) -#error "JIT_OPTIMIZE_NATIVE_CALL not yet supported on this platform." -#else - breakpoint(); -#endif - - // Check for an exception - loadPtr(&(globalData->exception), regT2); - Jump exceptionHandler = branchTestPtr(NonZero, regT2); - - // Grab the return address. - emitGetFromCallFrameHeaderPtr(RegisterFile::ReturnPC, regT1); - - // Restore our caller's "r". - emitGetFromCallFrameHeaderPtr(RegisterFile::CallerFrame, callFrameRegister); - - // Return. - restoreReturnAddressBeforeReturn(regT1); - ret(); - - // Handle an exception - exceptionHandler.link(this); - // Grab the return address. - emitGetFromCallFrameHeaderPtr(RegisterFile::ReturnPC, regT1); - move(ImmPtr(&globalData->exceptionLocation), regT2); - storePtr(regT1, regT2); - move(ImmPtr(reinterpret_cast<void*>(ctiVMThrowTrampoline)), regT2); - emitGetFromCallFrameHeaderPtr(RegisterFile::CallerFrame, callFrameRegister); - poke(callFrameRegister, offsetof(struct JITStackFrame, callFrame) / sizeof (void*)); - restoreReturnAddressBeforeReturn(regT2); - ret(); - - -#if ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) - Call array_failureCases1Call = makeTailRecursiveCall(array_failureCases1); - Call array_failureCases2Call = makeTailRecursiveCall(array_failureCases2); - Call array_failureCases3Call = makeTailRecursiveCall(array_failureCases3); - Call string_failureCases1Call = makeTailRecursiveCall(string_failureCases1); - Call string_failureCases2Call = makeTailRecursiveCall(string_failureCases2); - Call string_failureCases3Call = makeTailRecursiveCall(string_failureCases3); -#endif - - // All trampolines constructed! copy the code, link up calls, and set the pointers on the Machine object. - PatchBuffer patchBuffer(this, m_globalData->executableAllocator.poolForSize(m_assembler.size())); - -#if ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) - patchBuffer.link(array_failureCases1Call, FunctionPtr(JITStubs::cti_op_get_by_id_array_fail)); - patchBuffer.link(array_failureCases2Call, FunctionPtr(JITStubs::cti_op_get_by_id_array_fail)); - patchBuffer.link(array_failureCases3Call, FunctionPtr(JITStubs::cti_op_get_by_id_array_fail)); - patchBuffer.link(string_failureCases1Call, FunctionPtr(JITStubs::cti_op_get_by_id_string_fail)); - patchBuffer.link(string_failureCases2Call, FunctionPtr(JITStubs::cti_op_get_by_id_string_fail)); - patchBuffer.link(string_failureCases3Call, FunctionPtr(JITStubs::cti_op_get_by_id_string_fail)); -#endif - patchBuffer.link(callArityCheck1, FunctionPtr(JITStubs::cti_op_call_arityCheck)); - patchBuffer.link(callArityCheck2, FunctionPtr(JITStubs::cti_op_call_arityCheck)); - patchBuffer.link(callArityCheck3, FunctionPtr(JITStubs::cti_op_call_arityCheck)); - patchBuffer.link(callJSFunction1, FunctionPtr(JITStubs::cti_op_call_JSFunction)); - patchBuffer.link(callJSFunction2, FunctionPtr(JITStubs::cti_op_call_JSFunction)); - patchBuffer.link(callJSFunction3, FunctionPtr(JITStubs::cti_op_call_JSFunction)); - patchBuffer.link(callDontLazyLinkCall, FunctionPtr(JITStubs::cti_vm_dontLazyLinkCall)); - patchBuffer.link(callLazyLinkCall, FunctionPtr(JITStubs::cti_vm_lazyLinkCall)); - - CodeRef finalCode = patchBuffer.finalizeCode(); - *executablePool = finalCode.m_executablePool; - - *ctiVirtualCallPreLink = trampolineAt(finalCode, virtualCallPreLinkBegin); - *ctiVirtualCallLink = trampolineAt(finalCode, virtualCallLinkBegin); - *ctiVirtualCall = trampolineAt(finalCode, virtualCallBegin); - *ctiNativeCallThunk = trampolineAt(finalCode, nativeCallThunk); -#if ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) - *ctiArrayLengthTrampoline = trampolineAt(finalCode, arrayLengthBegin); - *ctiStringLengthTrampoline = trampolineAt(finalCode, stringLengthBegin); -#else - UNUSED_PARAM(ctiArrayLengthTrampoline); - UNUSED_PARAM(ctiStringLengthTrampoline); -#endif -} - +#if !USE(JSVALUE32_64) void JIT::emitGetVariableObjectRegister(RegisterID variableObject, int index, RegisterID dst) { - loadPtr(Address(variableObject, FIELD_OFFSET(JSVariableObject, d)), dst); - loadPtr(Address(dst, FIELD_OFFSET(JSVariableObject::JSVariableObjectData, registers)), dst); + loadPtr(Address(variableObject, OBJECT_OFFSETOF(JSVariableObject, d)), dst); + loadPtr(Address(dst, OBJECT_OFFSETOF(JSVariableObject::JSVariableObjectData, registers)), dst); loadPtr(Address(dst, index * sizeof(Register)), dst); } void JIT::emitPutVariableObjectRegister(RegisterID src, RegisterID variableObject, int index) { - loadPtr(Address(variableObject, FIELD_OFFSET(JSVariableObject, d)), variableObject); - loadPtr(Address(variableObject, FIELD_OFFSET(JSVariableObject::JSVariableObjectData, registers)), variableObject); + loadPtr(Address(variableObject, OBJECT_OFFSETOF(JSVariableObject, d)), variableObject); + loadPtr(Address(variableObject, OBJECT_OFFSETOF(JSVariableObject::JSVariableObjectData, registers)), variableObject); storePtr(src, Address(variableObject, index * sizeof(Register))); } +#endif +#if ENABLE(JIT_OPTIMIZE_CALL) void JIT::unlinkCall(CallLinkInfo* callLinkInfo) { // When the JSFunction is deleted the pointer embedded in the instruction stream will no longer be valid // (and, if a new JSFunction happened to be constructed at the same location, we could get a false positive // match). Reset the check so it no longer matches. - callLinkInfo->hotPathBegin.repatch(JSValue::encode(JSValue())); + RepatchBuffer repatchBuffer(callLinkInfo->ownerCodeBlock.get()); +#if USE(JSVALUE32_64) + repatchBuffer.repatch(callLinkInfo->hotPathBegin, 0); +#else + repatchBuffer.repatch(callLinkInfo->hotPathBegin, JSValue::encode(JSValue())); +#endif } -void JIT::linkCall(JSFunction* callee, CodeBlock* calleeCodeBlock, JITCode& code, CallLinkInfo* callLinkInfo, int callerArgCount) +void JIT::linkCall(JSFunction* callee, CodeBlock* callerCodeBlock, CodeBlock* calleeCodeBlock, JITCode& code, CallLinkInfo* callLinkInfo, int callerArgCount, JSGlobalData* globalData) { + ASSERT(calleeCodeBlock); + RepatchBuffer repatchBuffer(callerCodeBlock); + // Currently we only link calls with the exact number of arguments. // If this is a native call calleeCodeBlock is null so the number of parameters is unimportant - if (!calleeCodeBlock || callerArgCount == calleeCodeBlock->m_numParameters) { + if (callerArgCount == calleeCodeBlock->m_numParameters || calleeCodeBlock->codeType() == NativeCode) { ASSERT(!callLinkInfo->isLinked()); if (calleeCodeBlock) calleeCodeBlock->addCaller(callLinkInfo); - callLinkInfo->hotPathBegin.repatch(callee); - callLinkInfo->hotPathOther.relink(code.addressForCall()); + repatchBuffer.repatch(callLinkInfo->hotPathBegin, callee); + repatchBuffer.relink(callLinkInfo->hotPathOther, code.addressForCall()); } - // patch the instruction that jumps out to the cold path, so that we only try to link once. - callLinkInfo->hotPathBegin.jumpAtOffset(patchOffsetOpCallCompareToJump).relink(callLinkInfo->coldPathOther); + // patch the call so we do not continue to try to link. + repatchBuffer.relink(callLinkInfo->callReturnLocation, globalData->jitStubs.ctiVirtualCall()); } +#endif // ENABLE(JIT_OPTIMIZE_CALL) } // namespace JSC #endif // ENABLE(JIT) - -// This probably does not belong here; adding here for now as a quick Windows build fix. -#if ENABLE(ASSEMBLER) - -#if PLATFORM(X86) && !PLATFORM(MAC) -JSC::MacroAssemblerX86Common::SSE2CheckState JSC::MacroAssemblerX86Common::s_sse2CheckState = NotCheckedSSE2; -#endif - -#endif diff --git a/JavaScriptCore/jit/JIT.h b/JavaScriptCore/jit/JIT.h index 81f804a..93f47d9 100644 --- a/JavaScriptCore/jit/JIT.h +++ b/JavaScriptCore/jit/JIT.h @@ -59,14 +59,14 @@ namespace JSC { class Register; class RegisterFile; class ScopeChainNode; - class SimpleJumpTable; - class StringJumpTable; class StructureChain; struct CallLinkInfo; struct Instruction; struct OperandTypes; struct PolymorphicAccessStructureList; + struct SimpleJumpTable; + struct StringJumpTable; struct StructureStubInfo; struct CallRecord { @@ -153,7 +153,6 @@ namespace JSC { MacroAssembler::DataLabelPtr hotPathBegin; MacroAssembler::Call hotPathOther; MacroAssembler::Call callReturnLocation; - MacroAssembler::Label coldPathOther; }; struct MethodCallCompilationInfo { @@ -167,13 +166,12 @@ namespace JSC { }; // Near calls can only be patched to other JIT code, regular calls can be patched to JIT code or relinked to stub functions. - void ctiPatchNearCallByReturnAddress(MacroAssembler::ProcessorReturnAddress returnAddress, MacroAssemblerCodePtr newCalleeFunction); - void ctiPatchCallByReturnAddress(MacroAssembler::ProcessorReturnAddress returnAddress, MacroAssemblerCodePtr newCalleeFunction); - void ctiPatchCallByReturnAddress(MacroAssembler::ProcessorReturnAddress returnAddress, FunctionPtr newCalleeFunction); + void ctiPatchNearCallByReturnAddress(CodeBlock* codeblock, ReturnAddressPtr returnAddress, MacroAssemblerCodePtr newCalleeFunction); + void ctiPatchCallByReturnAddress(CodeBlock* codeblock, ReturnAddressPtr returnAddress, MacroAssemblerCodePtr newCalleeFunction); + void ctiPatchCallByReturnAddress(CodeBlock* codeblock, ReturnAddressPtr returnAddress, FunctionPtr newCalleeFunction); class JIT : private MacroAssembler { friend class JITStubCall; - friend class CallEvalJITStub; using MacroAssembler::Jump; using MacroAssembler::JumpList; @@ -228,7 +226,7 @@ namespace JSC { static const FPRegisterID fpRegT0 = X86::xmm0; static const FPRegisterID fpRegT1 = X86::xmm1; static const FPRegisterID fpRegT2 = X86::xmm2; -#elif PLATFORM(ARM_V7) +#elif PLATFORM_ARM_ARCH(7) static const RegisterID returnValueRegister = ARM::r0; static const RegisterID cachedResultRegister = ARM::r0; static const RegisterID firstArgumentRegister = ARM::r0; @@ -244,6 +242,31 @@ namespace JSC { static const FPRegisterID fpRegT0 = ARM::d0; static const FPRegisterID fpRegT1 = ARM::d1; static const FPRegisterID fpRegT2 = ARM::d2; +#elif PLATFORM(ARM) + static const RegisterID returnValueRegister = ARM::r0; + static const RegisterID cachedResultRegister = ARM::r0; + static const RegisterID firstArgumentRegister = ARM::r0; + + static const RegisterID timeoutCheckRegister = ARM::r5; + static const RegisterID callFrameRegister = ARM::r4; + static const RegisterID ctiReturnRegister = ARM::r6; + + static const RegisterID regT0 = ARM::r0; + static const RegisterID regT1 = ARM::r1; + static const RegisterID regT2 = ARM::r2; + // Callee preserved + static const RegisterID regT3 = ARM::r7; + + static const RegisterID regS0 = ARM::S0; + // Callee preserved + static const RegisterID regS1 = ARM::S1; + + static const RegisterID regStackPtr = ARM::sp; + static const RegisterID regLink = ARM::lr; + + static const FPRegisterID fpRegT0 = ARM::d0; + static const FPRegisterID fpRegT1 = ARM::d1; + static const FPRegisterID fpRegT2 = ARM::d2; #else #error "JIT not supported on this platform." #endif @@ -253,81 +276,6 @@ namespace JSC { // will compress the displacement, and we may not be able to fit a patched offset. static const int patchGetByIdDefaultOffset = 256; -#if PLATFORM(X86_64) - // These architecture specific value are used to enable patching - see comment on op_put_by_id. - static const int patchOffsetPutByIdStructure = 10; - static const int patchOffsetPutByIdExternalLoad = 20; - static const int patchLengthPutByIdExternalLoad = 4; - static const int patchOffsetPutByIdPropertyMapOffset = 31; - // These architecture specific value are used to enable patching - see comment on op_get_by_id. - static const int patchOffsetGetByIdStructure = 10; - static const int patchOffsetGetByIdBranchToSlowCase = 20; - static const int patchOffsetGetByIdExternalLoad = 20; - static const int patchLengthGetByIdExternalLoad = 4; - static const int patchOffsetGetByIdPropertyMapOffset = 31; - static const int patchOffsetGetByIdPutResult = 31; -#if ENABLE(OPCODE_SAMPLING) - static const int patchOffsetGetByIdSlowCaseCall = 66; -#else - static const int patchOffsetGetByIdSlowCaseCall = 44; -#endif - static const int patchOffsetOpCallCompareToJump = 9; - - static const int patchOffsetMethodCheckProtoObj = 20; - static const int patchOffsetMethodCheckProtoStruct = 30; - static const int patchOffsetMethodCheckPutFunction = 50; -#elif PLATFORM(X86) - // These architecture specific value are used to enable patching - see comment on op_put_by_id. - static const int patchOffsetPutByIdStructure = 7; - static const int patchOffsetPutByIdExternalLoad = 13; - static const int patchLengthPutByIdExternalLoad = 3; - static const int patchOffsetPutByIdPropertyMapOffset = 22; - // These architecture specific value are used to enable patching - see comment on op_get_by_id. - static const int patchOffsetGetByIdStructure = 7; - static const int patchOffsetGetByIdBranchToSlowCase = 13; - static const int patchOffsetGetByIdExternalLoad = 13; - static const int patchLengthGetByIdExternalLoad = 3; - static const int patchOffsetGetByIdPropertyMapOffset = 22; - static const int patchOffsetGetByIdPutResult = 22; -#if ENABLE(OPCODE_SAMPLING) && USE(JIT_STUB_ARGUMENT_VA_LIST) - static const int patchOffsetGetByIdSlowCaseCall = 31; -#elif ENABLE(OPCODE_SAMPLING) - static const int patchOffsetGetByIdSlowCaseCall = 33; -#elif USE(JIT_STUB_ARGUMENT_VA_LIST) - static const int patchOffsetGetByIdSlowCaseCall = 21; -#else - static const int patchOffsetGetByIdSlowCaseCall = 23; -#endif - static const int patchOffsetOpCallCompareToJump = 6; - - static const int patchOffsetMethodCheckProtoObj = 11; - static const int patchOffsetMethodCheckProtoStruct = 18; - static const int patchOffsetMethodCheckPutFunction = 29; -#elif PLATFORM(ARM_V7) - // These architecture specific value are used to enable patching - see comment on op_put_by_id. - static const int patchOffsetPutByIdStructure = 10; - static const int patchOffsetPutByIdExternalLoad = 20; - static const int patchLengthPutByIdExternalLoad = 12; - static const int patchOffsetPutByIdPropertyMapOffset = 40; - // These architecture specific value are used to enable patching - see comment on op_get_by_id. - static const int patchOffsetGetByIdStructure = 10; - static const int patchOffsetGetByIdBranchToSlowCase = 20; - static const int patchOffsetGetByIdExternalLoad = 20; - static const int patchLengthGetByIdExternalLoad = 12; - static const int patchOffsetGetByIdPropertyMapOffset = 40; - static const int patchOffsetGetByIdPutResult = 44; -#if ENABLE(OPCODE_SAMPLING) - static const int patchOffsetGetByIdSlowCaseCall = 0; // FIMXE -#else - static const int patchOffsetGetByIdSlowCaseCall = 28; -#endif - static const int patchOffsetOpCallCompareToJump = 10; - - static const int patchOffsetMethodCheckProtoObj = 18; - static const int patchOffsetMethodCheckProtoStruct = 28; - static const int patchOffsetMethodCheckPutFunction = 46; -#endif - public: static void compile(JSGlobalData* globalData, CodeBlock* codeBlock) { @@ -335,7 +283,7 @@ namespace JSC { jit.privateCompile(); } - static void compileGetByIdProto(JSGlobalData* globalData, CallFrame* callFrame, CodeBlock* codeBlock, StructureStubInfo* stubInfo, Structure* structure, Structure* prototypeStructure, size_t cachedOffset, ProcessorReturnAddress returnAddress) + static void compileGetByIdProto(JSGlobalData* globalData, CallFrame* callFrame, CodeBlock* codeBlock, StructureStubInfo* stubInfo, Structure* structure, Structure* prototypeStructure, size_t cachedOffset, ReturnAddressPtr returnAddress) { JIT jit(globalData, codeBlock); jit.privateCompileGetByIdProto(stubInfo, structure, prototypeStructure, cachedOffset, returnAddress, callFrame); @@ -357,35 +305,35 @@ namespace JSC { jit.privateCompileGetByIdChainList(stubInfo, prototypeStructureList, currentIndex, structure, chain, count, cachedOffset, callFrame); } - static void compileGetByIdChain(JSGlobalData* globalData, CallFrame* callFrame, CodeBlock* codeBlock, StructureStubInfo* stubInfo, Structure* structure, StructureChain* chain, size_t count, size_t cachedOffset, ProcessorReturnAddress returnAddress) + static void compileGetByIdChain(JSGlobalData* globalData, CallFrame* callFrame, CodeBlock* codeBlock, StructureStubInfo* stubInfo, Structure* structure, StructureChain* chain, size_t count, size_t cachedOffset, ReturnAddressPtr returnAddress) { JIT jit(globalData, codeBlock); jit.privateCompileGetByIdChain(stubInfo, structure, chain, count, cachedOffset, returnAddress, callFrame); } - static void compilePutByIdTransition(JSGlobalData* globalData, CodeBlock* codeBlock, StructureStubInfo* stubInfo, Structure* oldStructure, Structure* newStructure, size_t cachedOffset, StructureChain* chain, ProcessorReturnAddress returnAddress) + static void compilePutByIdTransition(JSGlobalData* globalData, CodeBlock* codeBlock, StructureStubInfo* stubInfo, Structure* oldStructure, Structure* newStructure, size_t cachedOffset, StructureChain* chain, ReturnAddressPtr returnAddress) { JIT jit(globalData, codeBlock); jit.privateCompilePutByIdTransition(stubInfo, oldStructure, newStructure, cachedOffset, chain, returnAddress); } - static void compileCTIMachineTrampolines(JSGlobalData* globalData, RefPtr<ExecutablePool>* executablePool, CodePtr* ctiArrayLengthTrampoline, CodePtr* ctiStringLengthTrampoline, CodePtr* ctiVirtualCallPreLink, CodePtr* ctiVirtualCallLink, CodePtr* ctiVirtualCall, CodePtr* ctiNativeCallThunk) + static void compileCTIMachineTrampolines(JSGlobalData* globalData, RefPtr<ExecutablePool>* executablePool, CodePtr* ctiStringLengthTrampoline, CodePtr* ctiVirtualCallLink, CodePtr* ctiVirtualCall, CodePtr* ctiNativeCallThunk) { JIT jit(globalData); - jit.privateCompileCTIMachineTrampolines(executablePool, globalData, ctiArrayLengthTrampoline, ctiStringLengthTrampoline, ctiVirtualCallPreLink, ctiVirtualCallLink, ctiVirtualCall, ctiNativeCallThunk); + jit.privateCompileCTIMachineTrampolines(executablePool, globalData, ctiStringLengthTrampoline, ctiVirtualCallLink, ctiVirtualCall, ctiNativeCallThunk); } - static void patchGetByIdSelf(StructureStubInfo*, Structure*, size_t cachedOffset, ProcessorReturnAddress returnAddress); - static void patchPutByIdReplace(StructureStubInfo*, Structure*, size_t cachedOffset, ProcessorReturnAddress returnAddress); - static void patchMethodCallProto(MethodCallLinkInfo&, JSFunction*, Structure*, JSObject*); + static void patchGetByIdSelf(CodeBlock* codeblock, StructureStubInfo*, Structure*, size_t cachedOffset, ReturnAddressPtr returnAddress); + static void patchPutByIdReplace(CodeBlock* codeblock, StructureStubInfo*, Structure*, size_t cachedOffset, ReturnAddressPtr returnAddress); + static void patchMethodCallProto(CodeBlock* codeblock, MethodCallLinkInfo&, JSFunction*, Structure*, JSObject*, ReturnAddressPtr); - static void compilePatchGetArrayLength(JSGlobalData* globalData, CodeBlock* codeBlock, ProcessorReturnAddress returnAddress) + static void compilePatchGetArrayLength(JSGlobalData* globalData, CodeBlock* codeBlock, ReturnAddressPtr returnAddress) { JIT jit(globalData, codeBlock); return jit.privateCompilePatchGetArrayLength(returnAddress); } - static void linkCall(JSFunction* callee, CodeBlock* calleeCodeBlock, JITCode&, CallLinkInfo*, int callerArgCount); + static void linkCall(JSFunction* callee, CodeBlock* callerCodeBlock, CodeBlock* calleeCodeBlock, JITCode&, CallLinkInfo*, int callerArgCount, JSGlobalData*); static void unlinkCall(CallLinkInfo*); private: @@ -406,24 +354,21 @@ namespace JSC { void privateCompileLinkPass(); void privateCompileSlowCases(); void privateCompile(); - void privateCompileGetByIdProto(StructureStubInfo*, Structure*, Structure* prototypeStructure, size_t cachedOffset, ProcessorReturnAddress returnAddress, CallFrame* callFrame); + void privateCompileGetByIdProto(StructureStubInfo*, Structure*, Structure* prototypeStructure, size_t cachedOffset, ReturnAddressPtr returnAddress, CallFrame* callFrame); void privateCompileGetByIdSelfList(StructureStubInfo*, PolymorphicAccessStructureList*, int, Structure*, size_t cachedOffset); void privateCompileGetByIdProtoList(StructureStubInfo*, PolymorphicAccessStructureList*, int, Structure*, Structure* prototypeStructure, size_t cachedOffset, CallFrame* callFrame); void privateCompileGetByIdChainList(StructureStubInfo*, PolymorphicAccessStructureList*, int, Structure*, StructureChain* chain, size_t count, size_t cachedOffset, CallFrame* callFrame); - void privateCompileGetByIdChain(StructureStubInfo*, Structure*, StructureChain*, size_t count, size_t cachedOffset, ProcessorReturnAddress returnAddress, CallFrame* callFrame); - void privateCompilePutByIdTransition(StructureStubInfo*, Structure*, Structure*, size_t cachedOffset, StructureChain*, ProcessorReturnAddress returnAddress); + void privateCompileGetByIdChain(StructureStubInfo*, Structure*, StructureChain*, size_t count, size_t cachedOffset, ReturnAddressPtr returnAddress, CallFrame* callFrame); + void privateCompilePutByIdTransition(StructureStubInfo*, Structure*, Structure*, size_t cachedOffset, StructureChain*, ReturnAddressPtr returnAddress); - void privateCompileCTIMachineTrampolines(RefPtr<ExecutablePool>* executablePool, JSGlobalData* data, CodePtr* ctiArrayLengthTrampoline, CodePtr* ctiStringLengthTrampoline, CodePtr* ctiVirtualCallPreLink, CodePtr* ctiVirtualCallLink, CodePtr* ctiVirtualCall, CodePtr* ctiNativeCallThunk); - void privateCompilePatchGetArrayLength(ProcessorReturnAddress returnAddress); + void privateCompileCTIMachineTrampolines(RefPtr<ExecutablePool>* executablePool, JSGlobalData* data, CodePtr* ctiStringLengthTrampoline, CodePtr* ctiVirtualCallLink, CodePtr* ctiVirtualCall, CodePtr* ctiNativeCallThunk); + void privateCompilePatchGetArrayLength(ReturnAddressPtr returnAddress); void addSlowCase(Jump); + void addSlowCase(JumpList); void addJump(Jump, int); void emitJumpSlowToHot(Jump, int); -#if ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) - void compileGetByIdHotPath(int resultVReg, int baseVReg, Identifier* ident, unsigned propertyAccessInstructionIndex); - void compileGetByIdSlowCase(int resultVReg, int baseVReg, Identifier* ident, Vector<SlowCaseEntry>::iterator& iter, unsigned propertyAccessInstructionIndex, bool isMethodCheck = false); -#endif void compileOpCall(OpcodeID, Instruction* instruction, unsigned callLinkInfoIndex); void compileOpCallVarargs(Instruction* instruction); void compileOpCallInitializeCallFrame(); @@ -432,164 +377,374 @@ namespace JSC { void compileOpCallSlowCase(Instruction* instruction, Vector<SlowCaseEntry>::iterator& iter, unsigned callLinkInfoIndex, OpcodeID opcodeID); void compileOpCallVarargsSlowCase(Instruction* instruction, Vector<SlowCaseEntry>::iterator& iter); void compileOpConstructSetupArgs(Instruction*); + enum CompileOpStrictEqType { OpStrictEq, OpNStrictEq }; void compileOpStrictEq(Instruction* instruction, CompileOpStrictEqType type); +#if USE(JSVALUE32_64) + Address tagFor(unsigned index, RegisterID base = callFrameRegister); + Address payloadFor(unsigned index, RegisterID base = callFrameRegister); + Address addressFor(unsigned index, RegisterID base = callFrameRegister); + + bool getOperandConstantImmediateInt(unsigned op1, unsigned op2, unsigned& op, int32_t& constant); + bool isOperandConstantImmediateDouble(unsigned src); + + void emitLoadTag(unsigned index, RegisterID tag); + void emitLoadPayload(unsigned index, RegisterID payload); + + void emitLoad(const JSValue& v, RegisterID tag, RegisterID payload); + void emitLoad(unsigned index, RegisterID tag, RegisterID payload, RegisterID base = callFrameRegister); + void emitLoad2(unsigned index1, RegisterID tag1, RegisterID payload1, unsigned index2, RegisterID tag2, RegisterID payload2); + void emitLoadDouble(unsigned index, FPRegisterID value); + void emitLoadInt32ToDouble(unsigned index, FPRegisterID value); + + void emitStore(unsigned index, RegisterID tag, RegisterID payload, RegisterID base = callFrameRegister); + void emitStore(unsigned index, const JSValue constant, RegisterID base = callFrameRegister); + void emitStoreInt32(unsigned index, RegisterID payload, bool indexIsInt32 = false); + void emitStoreInt32(unsigned index, Imm32 payload, bool indexIsInt32 = false); + void emitStoreCell(unsigned index, RegisterID payload, bool indexIsCell = false); + void emitStoreBool(unsigned index, RegisterID tag, bool indexIsBool = false); + void emitStoreDouble(unsigned index, FPRegisterID value); + + bool isLabeled(unsigned bytecodeIndex); + void map(unsigned bytecodeIndex, unsigned virtualRegisterIndex, RegisterID tag, RegisterID payload); + void unmap(RegisterID); + void unmap(); + bool isMapped(unsigned virtualRegisterIndex); + bool getMappedPayload(unsigned virtualRegisterIndex, RegisterID& payload); + bool getMappedTag(unsigned virtualRegisterIndex, RegisterID& tag); + + void emitJumpSlowCaseIfNotJSCell(unsigned virtualRegisterIndex); + void emitJumpSlowCaseIfNotJSCell(unsigned virtualRegisterIndex, RegisterID tag); + void linkSlowCaseIfNotJSCell(Vector<SlowCaseEntry>::iterator&, unsigned virtualRegisterIndex); + +#if ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) + void compileGetByIdHotPath(); + void compileGetByIdSlowCase(int resultVReg, int baseVReg, Identifier* ident, Vector<SlowCaseEntry>::iterator& iter, bool isMethodCheck = false); +#endif + void compileGetDirectOffset(RegisterID base, RegisterID resultTag, RegisterID resultPayload, Structure* structure, size_t cachedOffset); + void compileGetDirectOffset(JSObject* base, RegisterID temp, RegisterID resultTag, RegisterID resultPayload, size_t cachedOffset); + void compilePutDirectOffset(RegisterID base, RegisterID valueTag, RegisterID valuePayload, Structure* structure, size_t cachedOffset); + + // Arithmetic opcode helpers + void emitAdd32Constant(unsigned dst, unsigned op, int32_t constant, ResultType opType); + void emitSub32Constant(unsigned dst, unsigned op, int32_t constant, ResultType opType); + void emitBinaryDoubleOp(OpcodeID, unsigned dst, unsigned op1, unsigned op2, OperandTypes, JumpList& notInt32Op1, JumpList& notInt32Op2, bool op1IsInRegisters = true, bool op2IsInRegisters = true); + +#if PLATFORM(X86) + // These architecture specific value are used to enable patching - see comment on op_put_by_id. + static const int patchOffsetPutByIdStructure = 7; + static const int patchOffsetPutByIdExternalLoad = 13; + static const int patchLengthPutByIdExternalLoad = 3; + static const int patchOffsetPutByIdPropertyMapOffset1 = 22; + static const int patchOffsetPutByIdPropertyMapOffset2 = 28; + // These architecture specific value are used to enable patching - see comment on op_get_by_id. + static const int patchOffsetGetByIdStructure = 7; + static const int patchOffsetGetByIdBranchToSlowCase = 13; + static const int patchOffsetGetByIdExternalLoad = 13; + static const int patchLengthGetByIdExternalLoad = 3; + static const int patchOffsetGetByIdPropertyMapOffset1 = 22; + static const int patchOffsetGetByIdPropertyMapOffset2 = 28; + static const int patchOffsetGetByIdPutResult = 28; +#if ENABLE(OPCODE_SAMPLING) && USE(JIT_STUB_ARGUMENT_VA_LIST) + static const int patchOffsetGetByIdSlowCaseCall = 35; +#elif ENABLE(OPCODE_SAMPLING) + static const int patchOffsetGetByIdSlowCaseCall = 37; +#elif USE(JIT_STUB_ARGUMENT_VA_LIST) + static const int patchOffsetGetByIdSlowCaseCall = 25; +#else + static const int patchOffsetGetByIdSlowCaseCall = 27; +#endif + static const int patchOffsetOpCallCompareToJump = 6; + + static const int patchOffsetMethodCheckProtoObj = 11; + static const int patchOffsetMethodCheckProtoStruct = 18; + static const int patchOffsetMethodCheckPutFunction = 29; +#else +#error "JSVALUE32_64 not supported on this platform." +#endif + +#else // USE(JSVALUE32_64) + void emitGetVirtualRegister(int src, RegisterID dst); + void emitGetVirtualRegisters(int src1, RegisterID dst1, int src2, RegisterID dst2); + void emitPutVirtualRegister(unsigned dst, RegisterID from = regT0); + + int32_t getConstantOperandImmediateInt(unsigned src); + + void emitGetVariableObjectRegister(RegisterID variableObject, int index, RegisterID dst); + void emitPutVariableObjectRegister(RegisterID src, RegisterID variableObject, int index); + + void killLastResultRegister(); + + Jump emitJumpIfJSCell(RegisterID); + Jump emitJumpIfBothJSCells(RegisterID, RegisterID, RegisterID); + void emitJumpSlowCaseIfJSCell(RegisterID); + Jump emitJumpIfNotJSCell(RegisterID); + void emitJumpSlowCaseIfNotJSCell(RegisterID); + void emitJumpSlowCaseIfNotJSCell(RegisterID, int VReg); +#if USE(JSVALUE64) + JIT::Jump emitJumpIfImmediateNumber(RegisterID); + JIT::Jump emitJumpIfNotImmediateNumber(RegisterID); +#else + JIT::Jump emitJumpIfImmediateNumber(RegisterID reg) + { + return emitJumpIfImmediateInteger(reg); + } + + JIT::Jump emitJumpIfNotImmediateNumber(RegisterID reg) + { + return emitJumpIfNotImmediateInteger(reg); + } +#endif + JIT::Jump emitJumpIfImmediateInteger(RegisterID); + JIT::Jump emitJumpIfNotImmediateInteger(RegisterID); + JIT::Jump emitJumpIfNotImmediateIntegers(RegisterID, RegisterID, RegisterID); + void emitJumpSlowCaseIfNotImmediateInteger(RegisterID); + void emitJumpSlowCaseIfNotImmediateIntegers(RegisterID, RegisterID, RegisterID); + +#if !USE(JSVALUE64) + void emitFastArithDeTagImmediate(RegisterID); + Jump emitFastArithDeTagImmediateJumpIfZero(RegisterID); +#endif + void emitFastArithReTagImmediate(RegisterID src, RegisterID dest); + void emitFastArithImmToInt(RegisterID); + void emitFastArithIntToImmNoCheck(RegisterID src, RegisterID dest); + + void emitTagAsBoolImmediate(RegisterID reg); + void compileBinaryArithOp(OpcodeID, unsigned dst, unsigned src1, unsigned src2, OperandTypes opi); + void compileBinaryArithOpSlowCase(OpcodeID, Vector<SlowCaseEntry>::iterator&, unsigned dst, unsigned src1, unsigned src2, OperandTypes opi); + +#if ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) + void compileGetByIdHotPath(int resultVReg, int baseVReg, Identifier* ident, unsigned propertyAccessInstructionIndex); + void compileGetByIdSlowCase(int resultVReg, int baseVReg, Identifier* ident, Vector<SlowCaseEntry>::iterator& iter, bool isMethodCheck = false); +#endif void compileGetDirectOffset(RegisterID base, RegisterID result, Structure* structure, size_t cachedOffset); - void compileGetDirectOffset(JSObject* base, RegisterID result, size_t cachedOffset); + void compileGetDirectOffset(JSObject* base, RegisterID temp, RegisterID result, size_t cachedOffset); void compilePutDirectOffset(RegisterID base, RegisterID value, Structure* structure, size_t cachedOffset); - // Arithmetic Ops +#if PLATFORM(X86_64) + // These architecture specific value are used to enable patching - see comment on op_put_by_id. + static const int patchOffsetPutByIdStructure = 10; + static const int patchOffsetPutByIdExternalLoad = 20; + static const int patchLengthPutByIdExternalLoad = 4; + static const int patchOffsetPutByIdPropertyMapOffset = 31; + // These architecture specific value are used to enable patching - see comment on op_get_by_id. + static const int patchOffsetGetByIdStructure = 10; + static const int patchOffsetGetByIdBranchToSlowCase = 20; + static const int patchOffsetGetByIdExternalLoad = 20; + static const int patchLengthGetByIdExternalLoad = 4; + static const int patchOffsetGetByIdPropertyMapOffset = 31; + static const int patchOffsetGetByIdPutResult = 31; +#if ENABLE(OPCODE_SAMPLING) + static const int patchOffsetGetByIdSlowCaseCall = 63; +#else + static const int patchOffsetGetByIdSlowCaseCall = 41; +#endif + static const int patchOffsetOpCallCompareToJump = 9; - void emit_op_add(Instruction*); - void emit_op_sub(Instruction*); - void emit_op_mul(Instruction*); - void emit_op_mod(Instruction*); - void emit_op_bitand(Instruction*); - void emit_op_lshift(Instruction*); - void emit_op_rshift(Instruction*); - void emit_op_jnless(Instruction*); - void emit_op_jnlesseq(Instruction*); - void emit_op_pre_inc(Instruction*); - void emit_op_pre_dec(Instruction*); - void emit_op_post_inc(Instruction*); - void emit_op_post_dec(Instruction*); - void emitSlow_op_add(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_sub(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_mul(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_mod(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_bitand(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_lshift(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_rshift(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_jnless(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_jnlesseq(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_pre_inc(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_pre_dec(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_post_inc(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_post_dec(Instruction*, Vector<SlowCaseEntry>::iterator&); + static const int patchOffsetMethodCheckProtoObj = 20; + static const int patchOffsetMethodCheckProtoStruct = 30; + static const int patchOffsetMethodCheckPutFunction = 50; +#elif PLATFORM(X86) + // These architecture specific value are used to enable patching - see comment on op_put_by_id. + static const int patchOffsetPutByIdStructure = 7; + static const int patchOffsetPutByIdExternalLoad = 13; + static const int patchLengthPutByIdExternalLoad = 3; + static const int patchOffsetPutByIdPropertyMapOffset = 22; + // These architecture specific value are used to enable patching - see comment on op_get_by_id. + static const int patchOffsetGetByIdStructure = 7; + static const int patchOffsetGetByIdBranchToSlowCase = 13; + static const int patchOffsetGetByIdExternalLoad = 13; + static const int patchLengthGetByIdExternalLoad = 3; + static const int patchOffsetGetByIdPropertyMapOffset = 22; + static const int patchOffsetGetByIdPutResult = 22; +#if ENABLE(OPCODE_SAMPLING) && USE(JIT_STUB_ARGUMENT_VA_LIST) + static const int patchOffsetGetByIdSlowCaseCall = 31; +#elif ENABLE(OPCODE_SAMPLING) + static const int patchOffsetGetByIdSlowCaseCall = 33; +#elif USE(JIT_STUB_ARGUMENT_VA_LIST) + static const int patchOffsetGetByIdSlowCaseCall = 21; +#else + static const int patchOffsetGetByIdSlowCaseCall = 23; +#endif + static const int patchOffsetOpCallCompareToJump = 6; - void emit_op_get_by_val(Instruction*); - void emit_op_put_by_val(Instruction*); - void emit_op_put_by_index(Instruction*); - void emit_op_put_getter(Instruction*); - void emit_op_put_setter(Instruction*); - void emit_op_del_by_id(Instruction*); + static const int patchOffsetMethodCheckProtoObj = 11; + static const int patchOffsetMethodCheckProtoStruct = 18; + static const int patchOffsetMethodCheckPutFunction = 29; +#elif PLATFORM_ARM_ARCH(7) + // These architecture specific value are used to enable patching - see comment on op_put_by_id. + static const int patchOffsetPutByIdStructure = 10; + static const int patchOffsetPutByIdExternalLoad = 20; + static const int patchLengthPutByIdExternalLoad = 12; + static const int patchOffsetPutByIdPropertyMapOffset = 40; + // These architecture specific value are used to enable patching - see comment on op_get_by_id. + static const int patchOffsetGetByIdStructure = 10; + static const int patchOffsetGetByIdBranchToSlowCase = 20; + static const int patchOffsetGetByIdExternalLoad = 20; + static const int patchLengthGetByIdExternalLoad = 12; + static const int patchOffsetGetByIdPropertyMapOffset = 40; + static const int patchOffsetGetByIdPutResult = 44; +#if ENABLE(OPCODE_SAMPLING) + static const int patchOffsetGetByIdSlowCaseCall = 0; // FIMXE +#else + static const int patchOffsetGetByIdSlowCaseCall = 28; +#endif + static const int patchOffsetOpCallCompareToJump = 10; - void emit_op_mov(Instruction*); - void emit_op_end(Instruction*); - void emit_op_jmp(Instruction*); - void emit_op_loop(Instruction*); - void emit_op_loop_if_less(Instruction*); - void emit_op_loop_if_lesseq(Instruction*); - void emit_op_new_object(Instruction*); - void emit_op_put_by_id(Instruction*); - void emit_op_get_by_id(Instruction*); - void emit_op_instanceof(Instruction*); - void emit_op_new_func(Instruction*); + static const int patchOffsetMethodCheckProtoObj = 18; + static const int patchOffsetMethodCheckProtoStruct = 28; + static const int patchOffsetMethodCheckPutFunction = 46; +#endif +#endif // USE(JSVALUE32_64) + + void emit_op_add(Instruction*); + void emit_op_bitand(Instruction*); + void emit_op_bitnot(Instruction*); + void emit_op_bitor(Instruction*); + void emit_op_bitxor(Instruction*); void emit_op_call(Instruction*); void emit_op_call_eval(Instruction*); - void emit_op_method_check(Instruction*); - void emit_op_load_varargs(Instruction*); void emit_op_call_varargs(Instruction*); + void emit_op_catch(Instruction*); void emit_op_construct(Instruction*); + void emit_op_construct_verify(Instruction*); + void emit_op_convert_this(Instruction*); + void emit_op_create_arguments(Instruction*); + void emit_op_debug(Instruction*); + void emit_op_del_by_id(Instruction*); + void emit_op_div(Instruction*); + void emit_op_end(Instruction*); + void emit_op_enter(Instruction*); + void emit_op_enter_with_activation(Instruction*); + void emit_op_eq(Instruction*); + void emit_op_eq_null(Instruction*); + void emit_op_get_by_id(Instruction*); + void emit_op_get_by_val(Instruction*); void emit_op_get_global_var(Instruction*); - void emit_op_put_global_var(Instruction*); void emit_op_get_scoped_var(Instruction*); - void emit_op_put_scoped_var(Instruction*); - void emit_op_tear_off_activation(Instruction*); - void emit_op_tear_off_arguments(Instruction*); - void emit_op_ret(Instruction*); - void emit_op_new_array(Instruction*); - void emit_op_resolve(Instruction*); - void emit_op_construct_verify(Instruction*); - void emit_op_to_primitive(Instruction*); - void emit_op_strcat(Instruction*); - void emit_op_resolve_func(Instruction*); - void emit_op_loop_if_true(Instruction*); - void emit_op_resolve_base(Instruction*); - void emit_op_resolve_skip(Instruction*); - void emit_op_resolve_global(Instruction*); - void emit_op_not(Instruction*); - void emit_op_jfalse(Instruction*); + void emit_op_init_arguments(Instruction*); + void emit_op_instanceof(Instruction*); void emit_op_jeq_null(Instruction*); + void emit_op_jfalse(Instruction*); + void emit_op_jmp(Instruction*); + void emit_op_jmp_scopes(Instruction*); void emit_op_jneq_null(Instruction*); void emit_op_jneq_ptr(Instruction*); - void emit_op_unexpected_load(Instruction*); + void emit_op_jnless(Instruction*); + void emit_op_jnlesseq(Instruction*); void emit_op_jsr(Instruction*); - void emit_op_sret(Instruction*); - void emit_op_eq(Instruction*); - void emit_op_bitnot(Instruction*); - void emit_op_resolve_with_base(Instruction*); - void emit_op_new_func_exp(Instruction*); void emit_op_jtrue(Instruction*); + void emit_op_load_varargs(Instruction*); + void emit_op_loop(Instruction*); + void emit_op_loop_if_less(Instruction*); + void emit_op_loop_if_lesseq(Instruction*); + void emit_op_loop_if_true(Instruction*); + void emit_op_lshift(Instruction*); + void emit_op_method_check(Instruction*); + void emit_op_mod(Instruction*); + void emit_op_mov(Instruction*); + void emit_op_mul(Instruction*); + void emit_op_negate(Instruction*); void emit_op_neq(Instruction*); - void emit_op_bitxor(Instruction*); + void emit_op_neq_null(Instruction*); + void emit_op_new_array(Instruction*); + void emit_op_new_error(Instruction*); + void emit_op_new_func(Instruction*); + void emit_op_new_func_exp(Instruction*); + void emit_op_new_object(Instruction*); void emit_op_new_regexp(Instruction*); - void emit_op_bitor(Instruction*); - void emit_op_throw(Instruction*); void emit_op_next_pname(Instruction*); - void emit_op_push_scope(Instruction*); - void emit_op_pop_scope(Instruction*); - void emit_op_stricteq(Instruction*); + void emit_op_not(Instruction*); void emit_op_nstricteq(Instruction*); - void emit_op_to_jsnumber(Instruction*); + void emit_op_pop_scope(Instruction*); + void emit_op_post_dec(Instruction*); + void emit_op_post_inc(Instruction*); + void emit_op_pre_dec(Instruction*); + void emit_op_pre_inc(Instruction*); + void emit_op_profile_did_call(Instruction*); + void emit_op_profile_will_call(Instruction*); void emit_op_push_new_scope(Instruction*); - void emit_op_catch(Instruction*); - void emit_op_jmp_scopes(Instruction*); - void emit_op_switch_imm(Instruction*); + void emit_op_push_scope(Instruction*); + void emit_op_put_by_id(Instruction*); + void emit_op_put_by_index(Instruction*); + void emit_op_put_by_val(Instruction*); + void emit_op_put_getter(Instruction*); + void emit_op_put_global_var(Instruction*); + void emit_op_put_scoped_var(Instruction*); + void emit_op_put_setter(Instruction*); + void emit_op_resolve(Instruction*); + void emit_op_resolve_base(Instruction*); + void emit_op_resolve_global(Instruction*); + void emit_op_resolve_skip(Instruction*); + void emit_op_resolve_with_base(Instruction*); + void emit_op_ret(Instruction*); + void emit_op_rshift(Instruction*); + void emit_op_sret(Instruction*); + void emit_op_strcat(Instruction*); + void emit_op_stricteq(Instruction*); + void emit_op_sub(Instruction*); void emit_op_switch_char(Instruction*); + void emit_op_switch_imm(Instruction*); void emit_op_switch_string(Instruction*); - void emit_op_new_error(Instruction*); - void emit_op_debug(Instruction*); - void emit_op_eq_null(Instruction*); - void emit_op_neq_null(Instruction*); - void emit_op_enter(Instruction*); - void emit_op_enter_with_activation(Instruction*); - void emit_op_init_arguments(Instruction*); - void emit_op_create_arguments(Instruction*); - void emit_op_convert_this(Instruction*); - void emit_op_profile_will_call(Instruction*); - void emit_op_profile_did_call(Instruction*); + void emit_op_tear_off_activation(Instruction*); + void emit_op_tear_off_arguments(Instruction*); + void emit_op_throw(Instruction*); + void emit_op_to_jsnumber(Instruction*); + void emit_op_to_primitive(Instruction*); + void emit_op_unexpected_load(Instruction*); - void emitSlow_op_convert_this(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_add(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_bitand(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_bitnot(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_bitor(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_bitxor(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_call(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_call_eval(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_call_varargs(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_construct(Instruction*, Vector<SlowCaseEntry>::iterator&); void emitSlow_op_construct_verify(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_to_primitive(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_convert_this(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_div(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_eq(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_get_by_id(Instruction*, Vector<SlowCaseEntry>::iterator&); void emitSlow_op_get_by_val(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_instanceof(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_jfalse(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_jnless(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_jnlesseq(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_jtrue(Instruction*, Vector<SlowCaseEntry>::iterator&); void emitSlow_op_loop_if_less(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_put_by_id(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_get_by_id(Instruction*, Vector<SlowCaseEntry>::iterator&); void emitSlow_op_loop_if_lesseq(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_put_by_val(Instruction*, Vector<SlowCaseEntry>::iterator&); void emitSlow_op_loop_if_true(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_not(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_jfalse(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_bitnot(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_jtrue(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_bitxor(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_bitor(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_eq(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_lshift(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_method_check(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_mod(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_mul(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_negate(Instruction*, Vector<SlowCaseEntry>::iterator&); void emitSlow_op_neq(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_stricteq(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_not(Instruction*, Vector<SlowCaseEntry>::iterator&); void emitSlow_op_nstricteq(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_instanceof(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_call(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_call_eval(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_method_check(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_call_varargs(Instruction*, Vector<SlowCaseEntry>::iterator&); - void emitSlow_op_construct(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_post_dec(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_post_inc(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_pre_dec(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_pre_inc(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_put_by_id(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_put_by_val(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_resolve_global(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_rshift(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_stricteq(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_sub(Instruction*, Vector<SlowCaseEntry>::iterator&); void emitSlow_op_to_jsnumber(Instruction*, Vector<SlowCaseEntry>::iterator&); + void emitSlow_op_to_primitive(Instruction*, Vector<SlowCaseEntry>::iterator&); -#if ENABLE(JIT_OPTIMIZE_ARITHMETIC) - void compileBinaryArithOp(OpcodeID, unsigned dst, unsigned src1, unsigned src2, OperandTypes opi); - void compileBinaryArithOpSlowCase(OpcodeID, Vector<SlowCaseEntry>::iterator&, unsigned dst, unsigned src1, unsigned src2, OperandTypes opi); -#endif - - void emitGetVirtualRegister(int src, RegisterID dst); - void emitGetVirtualRegisters(int src1, RegisterID dst1, int src2, RegisterID dst2); - void emitPutVirtualRegister(unsigned dst, RegisterID from = regT0); - + /* These functions are deprecated: Please use JITStubCall instead. */ void emitPutJITStubArg(RegisterID src, unsigned argumentNumber); +#if USE(JSVALUE32_64) + void emitPutJITStubArgFromVirtualRegister(unsigned src, unsigned argumentNumber, RegisterID scratch1, RegisterID scratch2); +#else void emitPutJITStubArgFromVirtualRegister(unsigned src, unsigned argumentNumber, RegisterID scratch); +#endif void emitPutJITStubArgConstant(unsigned value, unsigned argumentNumber); void emitPutJITStubArgConstant(void* value, unsigned argumentNumber); void emitGetJITStubArg(unsigned argumentNumber, RegisterID dst); @@ -602,30 +757,8 @@ namespace JSC { void emitGetFromCallFrameHeader32(RegisterFile::CallFrameHeaderEntry entry, RegisterID to, RegisterID from = callFrameRegister); JSValue getConstantOperand(unsigned src); - int32_t getConstantOperandImmediateInt(unsigned src); bool isOperandConstantImmediateInt(unsigned src); - Jump emitJumpIfJSCell(RegisterID); - Jump emitJumpIfBothJSCells(RegisterID, RegisterID, RegisterID); - void emitJumpSlowCaseIfJSCell(RegisterID); - Jump emitJumpIfNotJSCell(RegisterID); - void emitJumpSlowCaseIfNotJSCell(RegisterID); - void emitJumpSlowCaseIfNotJSCell(RegisterID, int VReg); -#if USE(ALTERNATE_JSIMMEDIATE) - JIT::Jump emitJumpIfImmediateNumber(RegisterID); - JIT::Jump emitJumpIfNotImmediateNumber(RegisterID); -#else - JIT::Jump emitJumpIfImmediateNumber(RegisterID reg) - { - return emitJumpIfImmediateInteger(reg); - } - - JIT::Jump emitJumpIfNotImmediateNumber(RegisterID reg) - { - return emitJumpIfNotImmediateInteger(reg); - } -#endif - Jump getSlowCase(Vector<SlowCaseEntry>::iterator& iter) { return iter++->from; @@ -637,43 +770,22 @@ namespace JSC { } void linkSlowCaseIfNotJSCell(Vector<SlowCaseEntry>::iterator&, int vReg); - JIT::Jump emitJumpIfImmediateInteger(RegisterID); - JIT::Jump emitJumpIfNotImmediateInteger(RegisterID); - JIT::Jump emitJumpIfNotImmediateIntegers(RegisterID, RegisterID, RegisterID); - void emitJumpSlowCaseIfNotImmediateInteger(RegisterID); - void emitJumpSlowCaseIfNotImmediateIntegers(RegisterID, RegisterID, RegisterID); - Jump checkStructure(RegisterID reg, Structure* structure); -#if !USE(ALTERNATE_JSIMMEDIATE) - void emitFastArithDeTagImmediate(RegisterID); - Jump emitFastArithDeTagImmediateJumpIfZero(RegisterID); -#endif - void emitFastArithReTagImmediate(RegisterID src, RegisterID dest); - void emitFastArithImmToInt(RegisterID); - void emitFastArithIntToImmNoCheck(RegisterID src, RegisterID dest); - - void emitTagAsBoolImmediate(RegisterID reg); - void restoreArgumentReference(); void restoreArgumentReferenceForTrampoline(); Call emitNakedCall(CodePtr function = CodePtr()); - void preverveReturnAddressAfterCall(RegisterID); + + void preserveReturnAddressAfterCall(RegisterID); void restoreReturnAddressBeforeReturn(RegisterID); void restoreReturnAddressBeforeReturn(Address); - void emitGetVariableObjectRegister(RegisterID variableObject, int index, RegisterID dst); - void emitPutVariableObjectRegister(RegisterID src, RegisterID variableObject, int index); - void emitTimeoutCheck(); #ifndef NDEBUG void printBytecodeOperandTypes(unsigned src1, unsigned src2); #endif - void killLastResultRegister(); - - #if ENABLE(SAMPLING_FLAGS) void setSamplingFlag(int32_t); void clearSamplingFlag(int32_t); @@ -709,15 +821,22 @@ namespace JSC { Vector<SlowCaseEntry> m_slowCases; Vector<SwitchRecord> m_switches; - int m_lastResultBytecodeRegister; - unsigned m_jumpTargetsPosition; - unsigned m_propertyAccessInstructionIndex; unsigned m_globalResolveInfoIndex; unsigned m_callLinkInfoIndex; - } JIT_CLASS_ALIGNMENT; -} +#if USE(JSVALUE32_64) + unsigned m_jumpTargetIndex; + unsigned m_mappedBytecodeIndex; + unsigned m_mappedVirtualRegisterIndex; + RegisterID m_mappedTag; + RegisterID m_mappedPayload; +#else + int m_lastResultBytecodeRegister; + unsigned m_jumpTargetsPosition; +#endif + } JIT_CLASS_ALIGNMENT; +} // namespace JSC #endif // ENABLE(JIT) diff --git a/JavaScriptCore/jit/JITArithmetic.cpp b/JavaScriptCore/jit/JITArithmetic.cpp index 86c01d9..ea343d8 100644 --- a/JavaScriptCore/jit/JITArithmetic.cpp +++ b/JavaScriptCore/jit/JITArithmetic.cpp @@ -41,11 +41,1095 @@ #include <stdio.h> #endif - using namespace std; namespace JSC { +#if USE(JSVALUE32_64) + +void JIT::emit_op_negate(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned src = currentInstruction[2].u.operand; + + emitLoad(src, regT1, regT0); + + Jump srcNotInt = branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag)); + addSlowCase(branch32(Equal, regT0, Imm32(0))); + + neg32(regT0); + emitStoreInt32(dst, regT0, (dst == src)); + + Jump end = jump(); + + srcNotInt.link(this); + addSlowCase(branch32(Above, regT1, Imm32(JSValue::LowestTag))); + + xor32(Imm32(1 << 31), regT1); + store32(regT1, tagFor(dst)); + if (dst != src) + store32(regT0, payloadFor(dst)); + + end.link(this); +} + +void JIT::emitSlow_op_negate(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned dst = currentInstruction[1].u.operand; + + linkSlowCase(iter); // 0 check + linkSlowCase(iter); // double check + + JITStubCall stubCall(this, cti_op_negate); + stubCall.addArgument(regT1, regT0); + stubCall.call(dst); +} + +void JIT::emit_op_jnless(Instruction* currentInstruction) +{ + unsigned op1 = currentInstruction[1].u.operand; + unsigned op2 = currentInstruction[2].u.operand; + unsigned target = currentInstruction[3].u.operand; + + JumpList notInt32Op1; + JumpList notInt32Op2; + + // Int32 less. + if (isOperandConstantImmediateInt(op1)) { + emitLoad(op2, regT3, regT2); + notInt32Op2.append(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag))); + addJump(branch32(LessThanOrEqual, regT2, Imm32(getConstantOperand(op1).asInt32())), target + 3); + } else if (isOperandConstantImmediateInt(op2)) { + emitLoad(op1, regT1, regT0); + notInt32Op1.append(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + addJump(branch32(GreaterThanOrEqual, regT0, Imm32(getConstantOperand(op2).asInt32())), target + 3); + } else { + emitLoad2(op1, regT1, regT0, op2, regT3, regT2); + notInt32Op1.append(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + notInt32Op2.append(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag))); + addJump(branch32(GreaterThanOrEqual, regT0, regT2), target + 3); + } + + if (!supportsFloatingPoint()) { + addSlowCase(notInt32Op1); + addSlowCase(notInt32Op2); + return; + } + Jump end = jump(); + + // Double less. + emitBinaryDoubleOp(op_jnless, target, op1, op2, OperandTypes(), notInt32Op1, notInt32Op2, !isOperandConstantImmediateInt(op1), isOperandConstantImmediateInt(op1) || !isOperandConstantImmediateInt(op2)); + end.link(this); +} + +void JIT::emitSlow_op_jnless(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned op1 = currentInstruction[1].u.operand; + unsigned op2 = currentInstruction[2].u.operand; + unsigned target = currentInstruction[3].u.operand; + + if (!supportsFloatingPoint()) { + if (!isOperandConstantImmediateInt(op1) && !isOperandConstantImmediateInt(op2)) + linkSlowCase(iter); // int32 check + linkSlowCase(iter); // int32 check + } else { + if (!isOperandConstantImmediateInt(op1)) { + linkSlowCase(iter); // double check + linkSlowCase(iter); // int32 check + } + if (isOperandConstantImmediateInt(op1) || !isOperandConstantImmediateInt(op2)) + linkSlowCase(iter); // double check + } + + JITStubCall stubCall(this, cti_op_jless); + stubCall.addArgument(op1); + stubCall.addArgument(op2); + stubCall.call(); + emitJumpSlowToHot(branchTest32(Zero, regT0), target + 3); +} + +void JIT::emit_op_jnlesseq(Instruction* currentInstruction) +{ + unsigned op1 = currentInstruction[1].u.operand; + unsigned op2 = currentInstruction[2].u.operand; + unsigned target = currentInstruction[3].u.operand; + + JumpList notInt32Op1; + JumpList notInt32Op2; + + // Int32 less. + if (isOperandConstantImmediateInt(op1)) { + emitLoad(op2, regT3, regT2); + notInt32Op2.append(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag))); + addJump(branch32(LessThan, regT2, Imm32(getConstantOperand(op1).asInt32())), target + 3); + } else if (isOperandConstantImmediateInt(op2)) { + emitLoad(op1, regT1, regT0); + notInt32Op1.append(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + addJump(branch32(GreaterThan, regT0, Imm32(getConstantOperand(op2).asInt32())), target + 3); + } else { + emitLoad2(op1, regT1, regT0, op2, regT3, regT2); + notInt32Op1.append(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + notInt32Op2.append(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag))); + addJump(branch32(GreaterThan, regT0, regT2), target + 3); + } + + if (!supportsFloatingPoint()) { + addSlowCase(notInt32Op1); + addSlowCase(notInt32Op2); + return; + } + Jump end = jump(); + + // Double less. + emitBinaryDoubleOp(op_jnlesseq, target, op1, op2, OperandTypes(), notInt32Op1, notInt32Op2, !isOperandConstantImmediateInt(op1), isOperandConstantImmediateInt(op1) || !isOperandConstantImmediateInt(op2)); + end.link(this); +} + +void JIT::emitSlow_op_jnlesseq(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned op1 = currentInstruction[1].u.operand; + unsigned op2 = currentInstruction[2].u.operand; + unsigned target = currentInstruction[3].u.operand; + + if (!supportsFloatingPoint()) { + if (!isOperandConstantImmediateInt(op1) && !isOperandConstantImmediateInt(op2)) + linkSlowCase(iter); // int32 check + linkSlowCase(iter); // int32 check + } else { + if (!isOperandConstantImmediateInt(op1)) { + linkSlowCase(iter); // double check + linkSlowCase(iter); // int32 check + } + if (isOperandConstantImmediateInt(op1) || !isOperandConstantImmediateInt(op2)) + linkSlowCase(iter); // double check + } + + JITStubCall stubCall(this, cti_op_jlesseq); + stubCall.addArgument(op1); + stubCall.addArgument(op2); + stubCall.call(); + emitJumpSlowToHot(branchTest32(Zero, regT0), target + 3); +} + +// LeftShift (<<) + +void JIT::emit_op_lshift(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned op1 = currentInstruction[2].u.operand; + unsigned op2 = currentInstruction[3].u.operand; + + if (isOperandConstantImmediateInt(op2)) { + emitLoad(op1, regT1, regT0); + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + lshift32(Imm32(getConstantOperand(op2).asInt32()), regT0); + emitStoreInt32(dst, regT0, dst == op1); + return; + } + + emitLoad2(op1, regT1, regT0, op2, regT3, regT2); + if (!isOperandConstantImmediateInt(op1)) + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + addSlowCase(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag))); + lshift32(regT2, regT0); + emitStoreInt32(dst, regT0, dst == op1 || dst == op2); +} + +void JIT::emitSlow_op_lshift(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned op1 = currentInstruction[2].u.operand; + unsigned op2 = currentInstruction[3].u.operand; + + if (!isOperandConstantImmediateInt(op1) && !isOperandConstantImmediateInt(op2)) + linkSlowCase(iter); // int32 check + linkSlowCase(iter); // int32 check + + JITStubCall stubCall(this, cti_op_lshift); + stubCall.addArgument(op1); + stubCall.addArgument(op2); + stubCall.call(dst); +} + +// RightShift (>>) + +void JIT::emit_op_rshift(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned op1 = currentInstruction[2].u.operand; + unsigned op2 = currentInstruction[3].u.operand; + + if (isOperandConstantImmediateInt(op2)) { + emitLoad(op1, regT1, regT0); + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + rshift32(Imm32(getConstantOperand(op2).asInt32()), regT0); + emitStoreInt32(dst, regT0, dst == op1); + return; + } + + emitLoad2(op1, regT1, regT0, op2, regT3, regT2); + if (!isOperandConstantImmediateInt(op1)) + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + addSlowCase(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag))); + rshift32(regT2, regT0); + emitStoreInt32(dst, regT0, dst == op1 || dst == op2); +} + +void JIT::emitSlow_op_rshift(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned op1 = currentInstruction[2].u.operand; + unsigned op2 = currentInstruction[3].u.operand; + + if (!isOperandConstantImmediateInt(op1) && !isOperandConstantImmediateInt(op2)) + linkSlowCase(iter); // int32 check + linkSlowCase(iter); // int32 check + + JITStubCall stubCall(this, cti_op_rshift); + stubCall.addArgument(op1); + stubCall.addArgument(op2); + stubCall.call(dst); +} + +// BitAnd (&) + +void JIT::emit_op_bitand(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned op1 = currentInstruction[2].u.operand; + unsigned op2 = currentInstruction[3].u.operand; + + unsigned op; + int32_t constant; + if (getOperandConstantImmediateInt(op1, op2, op, constant)) { + emitLoad(op, regT1, regT0); + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + and32(Imm32(constant), regT0); + emitStoreInt32(dst, regT0, (op == dst)); + return; + } + + emitLoad2(op1, regT1, regT0, op2, regT3, regT2); + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + addSlowCase(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag))); + and32(regT2, regT0); + emitStoreInt32(dst, regT0, (op1 == dst || op2 == dst)); +} + +void JIT::emitSlow_op_bitand(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned op1 = currentInstruction[2].u.operand; + unsigned op2 = currentInstruction[3].u.operand; + + if (!isOperandConstantImmediateInt(op1) && !isOperandConstantImmediateInt(op2)) + linkSlowCase(iter); // int32 check + linkSlowCase(iter); // int32 check + + JITStubCall stubCall(this, cti_op_bitand); + stubCall.addArgument(op1); + stubCall.addArgument(op2); + stubCall.call(dst); +} + +// BitOr (|) + +void JIT::emit_op_bitor(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned op1 = currentInstruction[2].u.operand; + unsigned op2 = currentInstruction[3].u.operand; + + unsigned op; + int32_t constant; + if (getOperandConstantImmediateInt(op1, op2, op, constant)) { + emitLoad(op, regT1, regT0); + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + or32(Imm32(constant), regT0); + emitStoreInt32(dst, regT0, (op == dst)); + return; + } + + emitLoad2(op1, regT1, regT0, op2, regT3, regT2); + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + addSlowCase(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag))); + or32(regT2, regT0); + emitStoreInt32(dst, regT0, (op1 == dst || op2 == dst)); +} + +void JIT::emitSlow_op_bitor(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned op1 = currentInstruction[2].u.operand; + unsigned op2 = currentInstruction[3].u.operand; + + if (!isOperandConstantImmediateInt(op1) && !isOperandConstantImmediateInt(op2)) + linkSlowCase(iter); // int32 check + linkSlowCase(iter); // int32 check + + JITStubCall stubCall(this, cti_op_bitor); + stubCall.addArgument(op1); + stubCall.addArgument(op2); + stubCall.call(dst); +} + +// BitXor (^) + +void JIT::emit_op_bitxor(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned op1 = currentInstruction[2].u.operand; + unsigned op2 = currentInstruction[3].u.operand; + + unsigned op; + int32_t constant; + if (getOperandConstantImmediateInt(op1, op2, op, constant)) { + emitLoad(op, regT1, regT0); + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + xor32(Imm32(constant), regT0); + emitStoreInt32(dst, regT0, (op == dst)); + return; + } + + emitLoad2(op1, regT1, regT0, op2, regT3, regT2); + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + addSlowCase(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag))); + xor32(regT2, regT0); + emitStoreInt32(dst, regT0, (op1 == dst || op2 == dst)); +} + +void JIT::emitSlow_op_bitxor(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned op1 = currentInstruction[2].u.operand; + unsigned op2 = currentInstruction[3].u.operand; + + if (!isOperandConstantImmediateInt(op1) && !isOperandConstantImmediateInt(op2)) + linkSlowCase(iter); // int32 check + linkSlowCase(iter); // int32 check + + JITStubCall stubCall(this, cti_op_bitxor); + stubCall.addArgument(op1); + stubCall.addArgument(op2); + stubCall.call(dst); +} + +// BitNot (~) + +void JIT::emit_op_bitnot(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned src = currentInstruction[2].u.operand; + + emitLoad(src, regT1, regT0); + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + + not32(regT0); + emitStoreInt32(dst, regT0, (dst == src)); +} + +void JIT::emitSlow_op_bitnot(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned dst = currentInstruction[1].u.operand; + + linkSlowCase(iter); // int32 check + + JITStubCall stubCall(this, cti_op_bitnot); + stubCall.addArgument(regT1, regT0); + stubCall.call(dst); +} + +// PostInc (i++) + +void JIT::emit_op_post_inc(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned srcDst = currentInstruction[2].u.operand; + + emitLoad(srcDst, regT1, regT0); + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + + if (dst == srcDst) // x = x++ is a noop for ints. + return; + + emitStoreInt32(dst, regT0); + + addSlowCase(branchAdd32(Overflow, Imm32(1), regT0)); + emitStoreInt32(srcDst, regT0, true); +} + +void JIT::emitSlow_op_post_inc(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned srcDst = currentInstruction[2].u.operand; + + linkSlowCase(iter); // int32 check + if (dst != srcDst) + linkSlowCase(iter); // overflow check + + JITStubCall stubCall(this, cti_op_post_inc); + stubCall.addArgument(srcDst); + stubCall.addArgument(Imm32(srcDst)); + stubCall.call(dst); +} + +// PostDec (i--) + +void JIT::emit_op_post_dec(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned srcDst = currentInstruction[2].u.operand; + + emitLoad(srcDst, regT1, regT0); + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + + if (dst == srcDst) // x = x-- is a noop for ints. + return; + + emitStoreInt32(dst, regT0); + + addSlowCase(branchSub32(Overflow, Imm32(1), regT0)); + emitStoreInt32(srcDst, regT0, true); +} + +void JIT::emitSlow_op_post_dec(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned srcDst = currentInstruction[2].u.operand; + + linkSlowCase(iter); // int32 check + if (dst != srcDst) + linkSlowCase(iter); // overflow check + + JITStubCall stubCall(this, cti_op_post_dec); + stubCall.addArgument(srcDst); + stubCall.addArgument(Imm32(srcDst)); + stubCall.call(dst); +} + +// PreInc (++i) + +void JIT::emit_op_pre_inc(Instruction* currentInstruction) +{ + unsigned srcDst = currentInstruction[1].u.operand; + + emitLoad(srcDst, regT1, regT0); + + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + addSlowCase(branchAdd32(Overflow, Imm32(1), regT0)); + emitStoreInt32(srcDst, regT0, true); +} + +void JIT::emitSlow_op_pre_inc(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned srcDst = currentInstruction[1].u.operand; + + linkSlowCase(iter); // int32 check + linkSlowCase(iter); // overflow check + + JITStubCall stubCall(this, cti_op_pre_inc); + stubCall.addArgument(srcDst); + stubCall.call(srcDst); +} + +// PreDec (--i) + +void JIT::emit_op_pre_dec(Instruction* currentInstruction) +{ + unsigned srcDst = currentInstruction[1].u.operand; + + emitLoad(srcDst, regT1, regT0); + + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + addSlowCase(branchSub32(Overflow, Imm32(1), regT0)); + emitStoreInt32(srcDst, regT0, true); +} + +void JIT::emitSlow_op_pre_dec(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned srcDst = currentInstruction[1].u.operand; + + linkSlowCase(iter); // int32 check + linkSlowCase(iter); // overflow check + + JITStubCall stubCall(this, cti_op_pre_dec); + stubCall.addArgument(srcDst); + stubCall.call(srcDst); +} + +// Addition (+) + +void JIT::emit_op_add(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned op1 = currentInstruction[2].u.operand; + unsigned op2 = currentInstruction[3].u.operand; + OperandTypes types = OperandTypes::fromInt(currentInstruction[4].u.operand); + + JumpList notInt32Op1; + JumpList notInt32Op2; + + unsigned op; + int32_t constant; + if (getOperandConstantImmediateInt(op1, op2, op, constant)) { + emitAdd32Constant(dst, op, constant, op == op1 ? types.first() : types.second()); + return; + } + + emitLoad2(op1, regT1, regT0, op2, regT3, regT2); + notInt32Op1.append(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + notInt32Op2.append(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag))); + + // Int32 case. + addSlowCase(branchAdd32(Overflow, regT2, regT0)); + emitStoreInt32(dst, regT0, (op1 == dst || op2 == dst)); + + if (!supportsFloatingPoint()) { + addSlowCase(notInt32Op1); + addSlowCase(notInt32Op2); + return; + } + Jump end = jump(); + + // Double case. + emitBinaryDoubleOp(op_add, dst, op1, op2, types, notInt32Op1, notInt32Op2); + end.link(this); +} + +void JIT::emitAdd32Constant(unsigned dst, unsigned op, int32_t constant, ResultType opType) +{ + // Int32 case. + emitLoad(op, regT1, regT0); + Jump notInt32 = branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag)); + addSlowCase(branchAdd32(Overflow, Imm32(constant), regT0)); + emitStoreInt32(dst, regT0, (op == dst)); + + // Double case. + if (!supportsFloatingPoint()) { + addSlowCase(notInt32); + return; + } + Jump end = jump(); + + notInt32.link(this); + if (!opType.definitelyIsNumber()) + addSlowCase(branch32(Above, regT1, Imm32(JSValue::LowestTag))); + move(Imm32(constant), regT2); + convertInt32ToDouble(regT2, fpRegT0); + emitLoadDouble(op, fpRegT1); + addDouble(fpRegT1, fpRegT0); + emitStoreDouble(dst, fpRegT0); + + end.link(this); +} + +void JIT::emitSlow_op_add(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned op1 = currentInstruction[2].u.operand; + unsigned op2 = currentInstruction[3].u.operand; + OperandTypes types = OperandTypes::fromInt(currentInstruction[4].u.operand); + + unsigned op; + int32_t constant; + if (getOperandConstantImmediateInt(op1, op2, op, constant)) { + linkSlowCase(iter); // overflow check + + if (!supportsFloatingPoint()) { + linkSlowCase(iter); // non-sse case + return; + } + + ResultType opType = op == op1 ? types.first() : types.second(); + if (!opType.definitelyIsNumber()) + linkSlowCase(iter); // double check + } else { + linkSlowCase(iter); // overflow check + + if (!supportsFloatingPoint()) { + linkSlowCase(iter); // int32 check + linkSlowCase(iter); // int32 check + } else { + if (!types.first().definitelyIsNumber()) + linkSlowCase(iter); // double check + + if (!types.second().definitelyIsNumber()) { + linkSlowCase(iter); // int32 check + linkSlowCase(iter); // double check + } + } + } + + JITStubCall stubCall(this, cti_op_add); + stubCall.addArgument(op1); + stubCall.addArgument(op2); + stubCall.call(dst); +} + +// Subtraction (-) + +void JIT::emit_op_sub(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned op1 = currentInstruction[2].u.operand; + unsigned op2 = currentInstruction[3].u.operand; + OperandTypes types = OperandTypes::fromInt(currentInstruction[4].u.operand); + + JumpList notInt32Op1; + JumpList notInt32Op2; + + if (isOperandConstantImmediateInt(op2)) { + emitSub32Constant(dst, op1, getConstantOperand(op2).asInt32(), types.first()); + return; + } + + emitLoad2(op1, regT1, regT0, op2, regT3, regT2); + notInt32Op1.append(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + notInt32Op2.append(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag))); + + // Int32 case. + addSlowCase(branchSub32(Overflow, regT2, regT0)); + emitStoreInt32(dst, regT0, (op1 == dst || op2 == dst)); + + if (!supportsFloatingPoint()) { + addSlowCase(notInt32Op1); + addSlowCase(notInt32Op2); + return; + } + Jump end = jump(); + + // Double case. + emitBinaryDoubleOp(op_sub, dst, op1, op2, types, notInt32Op1, notInt32Op2); + end.link(this); +} + +void JIT::emitSub32Constant(unsigned dst, unsigned op, int32_t constant, ResultType opType) +{ + // Int32 case. + emitLoad(op, regT1, regT0); + Jump notInt32 = branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag)); + addSlowCase(branchSub32(Overflow, Imm32(constant), regT0)); + emitStoreInt32(dst, regT0, (op == dst)); + + // Double case. + if (!supportsFloatingPoint()) { + addSlowCase(notInt32); + return; + } + Jump end = jump(); + + notInt32.link(this); + if (!opType.definitelyIsNumber()) + addSlowCase(branch32(Above, regT1, Imm32(JSValue::LowestTag))); + move(Imm32(constant), regT2); + convertInt32ToDouble(regT2, fpRegT0); + emitLoadDouble(op, fpRegT1); + subDouble(fpRegT0, fpRegT1); + emitStoreDouble(dst, fpRegT1); + + end.link(this); +} + +void JIT::emitSlow_op_sub(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned op1 = currentInstruction[2].u.operand; + unsigned op2 = currentInstruction[3].u.operand; + OperandTypes types = OperandTypes::fromInt(currentInstruction[4].u.operand); + + if (isOperandConstantImmediateInt(op2)) { + linkSlowCase(iter); // overflow check + + if (!supportsFloatingPoint() || !types.first().definitelyIsNumber()) + linkSlowCase(iter); // int32 or double check + } else { + linkSlowCase(iter); // overflow check + + if (!supportsFloatingPoint()) { + linkSlowCase(iter); // int32 check + linkSlowCase(iter); // int32 check + } else { + if (!types.first().definitelyIsNumber()) + linkSlowCase(iter); // double check + + if (!types.second().definitelyIsNumber()) { + linkSlowCase(iter); // int32 check + linkSlowCase(iter); // double check + } + } + } + + JITStubCall stubCall(this, cti_op_sub); + stubCall.addArgument(op1); + stubCall.addArgument(op2); + stubCall.call(dst); +} + +void JIT::emitBinaryDoubleOp(OpcodeID opcodeID, unsigned dst, unsigned op1, unsigned op2, OperandTypes types, JumpList& notInt32Op1, JumpList& notInt32Op2, bool op1IsInRegisters, bool op2IsInRegisters) +{ + JumpList end; + + if (!notInt32Op1.empty()) { + // Double case 1: Op1 is not int32; Op2 is unknown. + notInt32Op1.link(this); + + ASSERT(op1IsInRegisters); + + // Verify Op1 is double. + if (!types.first().definitelyIsNumber()) + addSlowCase(branch32(Above, regT1, Imm32(JSValue::LowestTag))); + + if (!op2IsInRegisters) + emitLoad(op2, regT3, regT2); + + Jump doubleOp2 = branch32(Below, regT3, Imm32(JSValue::LowestTag)); + + if (!types.second().definitelyIsNumber()) + addSlowCase(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag))); + + convertInt32ToDouble(regT2, fpRegT0); + Jump doTheMath = jump(); + + // Load Op2 as double into double register. + doubleOp2.link(this); + emitLoadDouble(op2, fpRegT0); + + // Do the math. + doTheMath.link(this); + switch (opcodeID) { + case op_mul: + emitLoadDouble(op1, fpRegT2); + mulDouble(fpRegT2, fpRegT0); + emitStoreDouble(dst, fpRegT0); + break; + case op_add: + emitLoadDouble(op1, fpRegT2); + addDouble(fpRegT2, fpRegT0); + emitStoreDouble(dst, fpRegT0); + break; + case op_sub: + emitLoadDouble(op1, fpRegT1); + subDouble(fpRegT0, fpRegT1); + emitStoreDouble(dst, fpRegT1); + break; + case op_div: + emitLoadDouble(op1, fpRegT1); + divDouble(fpRegT0, fpRegT1); + emitStoreDouble(dst, fpRegT1); + break; + case op_jnless: + emitLoadDouble(op1, fpRegT2); + addJump(branchDouble(DoubleLessThanOrEqual, fpRegT0, fpRegT2), dst + 3); + break; + case op_jnlesseq: + emitLoadDouble(op1, fpRegT2); + addJump(branchDouble(DoubleLessThan, fpRegT0, fpRegT2), dst + 3); + break; + default: + ASSERT_NOT_REACHED(); + } + + if (!notInt32Op2.empty()) + end.append(jump()); + } + + if (!notInt32Op2.empty()) { + // Double case 2: Op1 is int32; Op2 is not int32. + notInt32Op2.link(this); + + ASSERT(op2IsInRegisters); + + if (!op1IsInRegisters) + emitLoadPayload(op1, regT0); + + convertInt32ToDouble(regT0, fpRegT0); + + // Verify op2 is double. + if (!types.second().definitelyIsNumber()) + addSlowCase(branch32(Above, regT3, Imm32(JSValue::LowestTag))); + + // Do the math. + switch (opcodeID) { + case op_mul: + emitLoadDouble(op2, fpRegT2); + mulDouble(fpRegT2, fpRegT0); + emitStoreDouble(dst, fpRegT0); + break; + case op_add: + emitLoadDouble(op2, fpRegT2); + addDouble(fpRegT2, fpRegT0); + emitStoreDouble(dst, fpRegT0); + break; + case op_sub: + emitLoadDouble(op2, fpRegT2); + subDouble(fpRegT2, fpRegT0); + emitStoreDouble(dst, fpRegT0); + break; + case op_div: + emitLoadDouble(op2, fpRegT2); + divDouble(fpRegT2, fpRegT0); + emitStoreDouble(dst, fpRegT0); + break; + case op_jnless: + emitLoadDouble(op2, fpRegT1); + addJump(branchDouble(DoubleLessThanOrEqual, fpRegT1, fpRegT0), dst + 3); + break; + case op_jnlesseq: + emitLoadDouble(op2, fpRegT1); + addJump(branchDouble(DoubleLessThan, fpRegT1, fpRegT0), dst + 3); + break; + default: + ASSERT_NOT_REACHED(); + } + } + + end.link(this); +} + +// Multiplication (*) + +void JIT::emit_op_mul(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned op1 = currentInstruction[2].u.operand; + unsigned op2 = currentInstruction[3].u.operand; + OperandTypes types = OperandTypes::fromInt(currentInstruction[4].u.operand); + + JumpList notInt32Op1; + JumpList notInt32Op2; + + emitLoad2(op1, regT1, regT0, op2, regT3, regT2); + notInt32Op1.append(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + notInt32Op2.append(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag))); + + // Int32 case. + move(regT0, regT3); + addSlowCase(branchMul32(Overflow, regT2, regT0)); + addSlowCase(branchTest32(Zero, regT0)); + emitStoreInt32(dst, regT0, (op1 == dst || op2 == dst)); + + if (!supportsFloatingPoint()) { + addSlowCase(notInt32Op1); + addSlowCase(notInt32Op2); + return; + } + Jump end = jump(); + + // Double case. + emitBinaryDoubleOp(op_mul, dst, op1, op2, types, notInt32Op1, notInt32Op2); + end.link(this); +} + +void JIT::emitSlow_op_mul(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned op1 = currentInstruction[2].u.operand; + unsigned op2 = currentInstruction[3].u.operand; + OperandTypes types = OperandTypes::fromInt(currentInstruction[4].u.operand); + + Jump overflow = getSlowCase(iter); // overflow check + linkSlowCase(iter); // zero result check + + Jump negZero = branchOr32(Signed, regT2, regT3); + emitStoreInt32(dst, Imm32(0), (op1 == dst || op2 == dst)); + + emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_mul)); + + negZero.link(this); + overflow.link(this); + + if (!supportsFloatingPoint()) { + linkSlowCase(iter); // int32 check + linkSlowCase(iter); // int32 check + } + + if (supportsFloatingPoint()) { + if (!types.first().definitelyIsNumber()) + linkSlowCase(iter); // double check + + if (!types.second().definitelyIsNumber()) { + linkSlowCase(iter); // int32 check + linkSlowCase(iter); // double check + } + } + + Label jitStubCall(this); + JITStubCall stubCall(this, cti_op_mul); + stubCall.addArgument(op1); + stubCall.addArgument(op2); + stubCall.call(dst); +} + +// Division (/) + +void JIT::emit_op_div(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned op1 = currentInstruction[2].u.operand; + unsigned op2 = currentInstruction[3].u.operand; + OperandTypes types = OperandTypes::fromInt(currentInstruction[4].u.operand); + + if (!supportsFloatingPoint()) { + addSlowCase(jump()); + return; + } + + // Int32 divide. + JumpList notInt32Op1; + JumpList notInt32Op2; + + JumpList end; + + emitLoad2(op1, regT1, regT0, op2, regT3, regT2); + + notInt32Op1.append(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + notInt32Op2.append(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag))); + + convertInt32ToDouble(regT0, fpRegT0); + convertInt32ToDouble(regT2, fpRegT1); + divDouble(fpRegT1, fpRegT0); + + JumpList doubleResult; + if (!isOperandConstantImmediateInt(op1) || getConstantOperand(op1).asInt32() > 1) { + m_assembler.cvttsd2si_rr(fpRegT0, regT0); + convertInt32ToDouble(regT0, fpRegT1); + m_assembler.ucomisd_rr(fpRegT1, fpRegT0); + + doubleResult.append(m_assembler.jne()); + doubleResult.append(m_assembler.jp()); + + doubleResult.append(branchTest32(Zero, regT0)); + + // Int32 result. + emitStoreInt32(dst, regT0, (op1 == dst || op2 == dst)); + end.append(jump()); + } + + // Double result. + doubleResult.link(this); + emitStoreDouble(dst, fpRegT0); + end.append(jump()); + + // Double divide. + emitBinaryDoubleOp(op_div, dst, op1, op2, types, notInt32Op1, notInt32Op2); + end.link(this); +} + +void JIT::emitSlow_op_div(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned op1 = currentInstruction[2].u.operand; + unsigned op2 = currentInstruction[3].u.operand; + OperandTypes types = OperandTypes::fromInt(currentInstruction[4].u.operand); + + if (!supportsFloatingPoint()) + linkSlowCase(iter); + else { + if (!types.first().definitelyIsNumber()) + linkSlowCase(iter); // double check + + if (!types.second().definitelyIsNumber()) { + linkSlowCase(iter); // int32 check + linkSlowCase(iter); // double check + } + } + + JITStubCall stubCall(this, cti_op_div); + stubCall.addArgument(op1); + stubCall.addArgument(op2); + stubCall.call(dst); +} + +// Mod (%) + +/* ------------------------------ BEGIN: OP_MOD ------------------------------ */ + +#if PLATFORM(X86) || PLATFORM(X86_64) + +void JIT::emit_op_mod(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned op1 = currentInstruction[2].u.operand; + unsigned op2 = currentInstruction[3].u.operand; + + if (isOperandConstantImmediateInt(op2) && getConstantOperand(op2).asInt32() != 0) { + emitLoad(op1, X86::edx, X86::eax); + move(Imm32(getConstantOperand(op2).asInt32()), X86::ecx); + addSlowCase(branch32(NotEqual, X86::edx, Imm32(JSValue::Int32Tag))); + if (getConstantOperand(op2).asInt32() == -1) + addSlowCase(branch32(Equal, X86::eax, Imm32(0x80000000))); // -2147483648 / -1 => EXC_ARITHMETIC + } else { + emitLoad2(op1, X86::edx, X86::eax, op2, X86::ebx, X86::ecx); + addSlowCase(branch32(NotEqual, X86::edx, Imm32(JSValue::Int32Tag))); + addSlowCase(branch32(NotEqual, X86::ebx, Imm32(JSValue::Int32Tag))); + + addSlowCase(branch32(Equal, X86::eax, Imm32(0x80000000))); // -2147483648 / -1 => EXC_ARITHMETIC + addSlowCase(branch32(Equal, X86::ecx, Imm32(0))); // divide by 0 + } + + move(X86::eax, X86::ebx); // Save dividend payload, in case of 0. + m_assembler.cdq(); + m_assembler.idivl_r(X86::ecx); + + // If the remainder is zero and the dividend is negative, the result is -0. + Jump storeResult1 = branchTest32(NonZero, X86::edx); + Jump storeResult2 = branchTest32(Zero, X86::ebx, Imm32(0x80000000)); // not negative + emitStore(dst, jsNumber(m_globalData, -0.0)); + Jump end = jump(); + + storeResult1.link(this); + storeResult2.link(this); + emitStoreInt32(dst, X86::edx, (op1 == dst || op2 == dst)); + end.link(this); +} + +void JIT::emitSlow_op_mod(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned op1 = currentInstruction[2].u.operand; + unsigned op2 = currentInstruction[3].u.operand; + + if (isOperandConstantImmediateInt(op2) && getConstantOperand(op2).asInt32() != 0) { + linkSlowCase(iter); // int32 check + if (getConstantOperand(op2).asInt32() == -1) + linkSlowCase(iter); // 0x80000000 check + } else { + linkSlowCase(iter); // int32 check + linkSlowCase(iter); // int32 check + linkSlowCase(iter); // 0 check + linkSlowCase(iter); // 0x80000000 check + } + + JITStubCall stubCall(this, cti_op_mod); + stubCall.addArgument(op1); + stubCall.addArgument(op2); + stubCall.call(dst); +} + +#else // PLATFORM(X86) || PLATFORM(X86_64) + +void JIT::emit_op_mod(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned op1 = currentInstruction[2].u.operand; + unsigned op2 = currentInstruction[3].u.operand; + + JITStubCall stubCall(this, cti_op_mod); + stubCall.addArgument(op1); + stubCall.addArgument(op2); + stubCall.call(dst); +} + +void JIT::emitSlow_op_mod(Instruction*, Vector<SlowCaseEntry>::iterator&) +{ +} + +#endif // PLATFORM(X86) || PLATFORM(X86_64) + +/* ------------------------------ END: OP_MOD ------------------------------ */ + +#else // USE(JSVALUE32_64) + void JIT::emit_op_lshift(Instruction* currentInstruction) { unsigned result = currentInstruction[1].u.operand; @@ -64,7 +1148,7 @@ void JIT::emit_op_lshift(Instruction* currentInstruction) and32(Imm32(0x1f), regT2); #endif lshift32(regT2, regT0); -#if !USE(ALTERNATE_JSIMMEDIATE) +#if !USE(JSVALUE64) addSlowCase(branchAdd32(Overflow, regT0, regT0)); signExtend32ToPtr(regT0, regT0); #endif @@ -78,7 +1162,7 @@ void JIT::emitSlow_op_lshift(Instruction* currentInstruction, Vector<SlowCaseEnt unsigned op1 = currentInstruction[2].u.operand; unsigned op2 = currentInstruction[3].u.operand; -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) UNUSED_PARAM(op1); UNUSED_PARAM(op2); linkSlowCase(iter); @@ -92,7 +1176,7 @@ void JIT::emitSlow_op_lshift(Instruction* currentInstruction, Vector<SlowCaseEnt notImm1.link(this); notImm2.link(this); #endif - JITStubCall stubCall(this, JITStubs::cti_op_lshift); + JITStubCall stubCall(this, cti_op_lshift); stubCall.addArgument(regT0); stubCall.addArgument(regT2); stubCall.call(result); @@ -109,7 +1193,7 @@ void JIT::emit_op_rshift(Instruction* currentInstruction) emitGetVirtualRegister(op1, regT0); emitJumpSlowCaseIfNotImmediateInteger(regT0); // Mask with 0x1f as per ecma-262 11.7.2 step 7. -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) rshift32(Imm32(getConstantOperandImmediateInt(op2) & 0x1f), regT0); #else rshiftPtr(Imm32(getConstantOperandImmediateInt(op2) & 0x1f), regT0); @@ -118,16 +1202,17 @@ void JIT::emit_op_rshift(Instruction* currentInstruction) emitGetVirtualRegisters(op1, regT0, op2, regT2); if (supportsFloatingPointTruncate()) { Jump lhsIsInt = emitJumpIfImmediateInteger(regT0); -#if USE(ALTERNATE_JSIMMEDIATE) - // supportsFloatingPoint() && USE(ALTERNATE_JSIMMEDIATE) => 3 SlowCases +#if USE(JSVALUE64) + // supportsFloatingPoint() && USE(JSVALUE64) => 3 SlowCases addSlowCase(emitJumpIfNotImmediateNumber(regT0)); + addPtr(tagTypeNumberRegister, regT0); movePtrToDouble(regT0, fpRegT0); addSlowCase(branchTruncateDoubleToInt32(fpRegT0, regT0)); #else - // supportsFloatingPoint() && !USE(ALTERNATE_JSIMMEDIATE) => 5 SlowCases (of which 1 IfNotJSCell) + // supportsFloatingPoint() && !USE(JSVALUE64) => 5 SlowCases (of which 1 IfNotJSCell) emitJumpSlowCaseIfNotJSCell(regT0, op1); addSlowCase(checkStructure(regT0, m_globalData->numberStructure.get())); - loadDouble(Address(regT0, FIELD_OFFSET(JSNumberCell, m_value)), fpRegT0); + loadDouble(Address(regT0, OBJECT_OFFSETOF(JSNumberCell, m_value)), fpRegT0); addSlowCase(branchTruncateDoubleToInt32(fpRegT0, regT0)); addSlowCase(branchAdd32(Overflow, regT0, regT0)); #endif @@ -144,13 +1229,13 @@ void JIT::emit_op_rshift(Instruction* currentInstruction) // On 32-bit x86 this is not necessary, since the shift anount is implicitly masked in the instruction. and32(Imm32(0x1f), regT2); #endif -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) rshift32(regT2, regT0); #else rshiftPtr(regT2, regT0); #endif } -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) emitFastArithIntToImmNoCheck(regT0, regT0); #else orPtr(Imm32(JSImmediate::TagTypeNumber), regT0); @@ -164,7 +1249,7 @@ void JIT::emitSlow_op_rshift(Instruction* currentInstruction, Vector<SlowCaseEnt unsigned op1 = currentInstruction[2].u.operand; unsigned op2 = currentInstruction[3].u.operand; - JITStubCall stubCall(this, JITStubs::cti_op_rshift); + JITStubCall stubCall(this, cti_op_rshift); if (isOperandConstantImmediateInt(op2)) { linkSlowCase(iter); @@ -172,7 +1257,7 @@ void JIT::emitSlow_op_rshift(Instruction* currentInstruction, Vector<SlowCaseEnt stubCall.addArgument(op2, regT2); } else { if (supportsFloatingPointTruncate()) { -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) linkSlowCase(iter); linkSlowCase(iter); linkSlowCase(iter); @@ -213,7 +1298,7 @@ void JIT::emit_op_jnless(Instruction* currentInstruction) if (isOperandConstantImmediateInt(op2)) { emitGetVirtualRegister(op1, regT0); emitJumpSlowCaseIfNotImmediateInteger(regT0); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) int32_t op2imm = getConstantOperandImmediateInt(op2); #else int32_t op2imm = static_cast<int32_t>(JSImmediate::rawValue(getConstantOperand(op2))); @@ -222,7 +1307,7 @@ void JIT::emit_op_jnless(Instruction* currentInstruction) } else if (isOperandConstantImmediateInt(op1)) { emitGetVirtualRegister(op2, regT1); emitJumpSlowCaseIfNotImmediateInteger(regT1); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) int32_t op1imm = getConstantOperandImmediateInt(op1); #else int32_t op1imm = static_cast<int32_t>(JSImmediate::rawValue(getConstantOperand(op1))); @@ -252,7 +1337,7 @@ void JIT::emitSlow_op_jnless(Instruction* currentInstruction, Vector<SlowCaseEnt linkSlowCase(iter); if (supportsFloatingPoint()) { -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) Jump fail1 = emitJumpIfNotImmediateNumber(regT0); addPtr(tagTypeNumberRegister, regT0); movePtrToDouble(regT0, fpRegT0); @@ -262,10 +1347,10 @@ void JIT::emitSlow_op_jnless(Instruction* currentInstruction, Vector<SlowCaseEnt fail1 = emitJumpIfNotJSCell(regT0); Jump fail2 = checkStructure(regT0, m_globalData->numberStructure.get()); - loadDouble(Address(regT0, FIELD_OFFSET(JSNumberCell, m_value)), fpRegT0); + loadDouble(Address(regT0, OBJECT_OFFSETOF(JSNumberCell, m_value)), fpRegT0); #endif - int32_t op2imm = getConstantOperand(op2).getInt32Fast();; + int32_t op2imm = getConstantOperand(op2).asInt32();; move(Imm32(op2imm), regT1); convertInt32ToDouble(regT1, fpRegT1); @@ -274,7 +1359,7 @@ void JIT::emitSlow_op_jnless(Instruction* currentInstruction, Vector<SlowCaseEnt emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_jnless)); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) fail1.link(this); #else if (!m_codeBlock->isKnownNotImmediate(op1)) @@ -283,7 +1368,7 @@ void JIT::emitSlow_op_jnless(Instruction* currentInstruction, Vector<SlowCaseEnt #endif } - JITStubCall stubCall(this, JITStubs::cti_op_jless); + JITStubCall stubCall(this, cti_op_jless); stubCall.addArgument(regT0); stubCall.addArgument(op2, regT2); stubCall.call(); @@ -293,7 +1378,7 @@ void JIT::emitSlow_op_jnless(Instruction* currentInstruction, Vector<SlowCaseEnt linkSlowCase(iter); if (supportsFloatingPoint()) { -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) Jump fail1 = emitJumpIfNotImmediateNumber(regT1); addPtr(tagTypeNumberRegister, regT1); movePtrToDouble(regT1, fpRegT1); @@ -303,10 +1388,10 @@ void JIT::emitSlow_op_jnless(Instruction* currentInstruction, Vector<SlowCaseEnt fail1 = emitJumpIfNotJSCell(regT1); Jump fail2 = checkStructure(regT1, m_globalData->numberStructure.get()); - loadDouble(Address(regT1, FIELD_OFFSET(JSNumberCell, m_value)), fpRegT1); + loadDouble(Address(regT1, OBJECT_OFFSETOF(JSNumberCell, m_value)), fpRegT1); #endif - int32_t op1imm = getConstantOperand(op1).getInt32Fast();; + int32_t op1imm = getConstantOperand(op1).asInt32();; move(Imm32(op1imm), regT0); convertInt32ToDouble(regT0, fpRegT0); @@ -315,7 +1400,7 @@ void JIT::emitSlow_op_jnless(Instruction* currentInstruction, Vector<SlowCaseEnt emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_jnless)); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) fail1.link(this); #else if (!m_codeBlock->isKnownNotImmediate(op2)) @@ -324,7 +1409,7 @@ void JIT::emitSlow_op_jnless(Instruction* currentInstruction, Vector<SlowCaseEnt #endif } - JITStubCall stubCall(this, JITStubs::cti_op_jless); + JITStubCall stubCall(this, cti_op_jless); stubCall.addArgument(op1, regT2); stubCall.addArgument(regT1); stubCall.call(); @@ -334,7 +1419,7 @@ void JIT::emitSlow_op_jnless(Instruction* currentInstruction, Vector<SlowCaseEnt linkSlowCase(iter); if (supportsFloatingPoint()) { -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) Jump fail1 = emitJumpIfNotImmediateNumber(regT0); Jump fail2 = emitJumpIfNotImmediateNumber(regT1); Jump fail3 = emitJumpIfImmediateInteger(regT1); @@ -353,15 +1438,15 @@ void JIT::emitSlow_op_jnless(Instruction* currentInstruction, Vector<SlowCaseEnt Jump fail3 = checkStructure(regT0, m_globalData->numberStructure.get()); Jump fail4 = checkStructure(regT1, m_globalData->numberStructure.get()); - loadDouble(Address(regT0, FIELD_OFFSET(JSNumberCell, m_value)), fpRegT0); - loadDouble(Address(regT1, FIELD_OFFSET(JSNumberCell, m_value)), fpRegT1); + loadDouble(Address(regT0, OBJECT_OFFSETOF(JSNumberCell, m_value)), fpRegT0); + loadDouble(Address(regT1, OBJECT_OFFSETOF(JSNumberCell, m_value)), fpRegT1); #endif emitJumpSlowToHot(branchDouble(DoubleLessThanOrEqual, fpRegT1, fpRegT0), target + 3); emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_jnless)); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) fail1.link(this); fail2.link(this); fail3.link(this); @@ -376,7 +1461,7 @@ void JIT::emitSlow_op_jnless(Instruction* currentInstruction, Vector<SlowCaseEnt } linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_jless); + JITStubCall stubCall(this, cti_op_jless); stubCall.addArgument(regT0); stubCall.addArgument(regT1); stubCall.call(); @@ -398,7 +1483,7 @@ void JIT::emit_op_jnlesseq(Instruction* currentInstruction) if (isOperandConstantImmediateInt(op2)) { emitGetVirtualRegister(op1, regT0); emitJumpSlowCaseIfNotImmediateInteger(regT0); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) int32_t op2imm = getConstantOperandImmediateInt(op2); #else int32_t op2imm = static_cast<int32_t>(JSImmediate::rawValue(getConstantOperand(op2))); @@ -407,7 +1492,7 @@ void JIT::emit_op_jnlesseq(Instruction* currentInstruction) } else if (isOperandConstantImmediateInt(op1)) { emitGetVirtualRegister(op2, regT1); emitJumpSlowCaseIfNotImmediateInteger(regT1); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) int32_t op1imm = getConstantOperandImmediateInt(op1); #else int32_t op1imm = static_cast<int32_t>(JSImmediate::rawValue(getConstantOperand(op1))); @@ -437,7 +1522,7 @@ void JIT::emitSlow_op_jnlesseq(Instruction* currentInstruction, Vector<SlowCaseE linkSlowCase(iter); if (supportsFloatingPoint()) { -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) Jump fail1 = emitJumpIfNotImmediateNumber(regT0); addPtr(tagTypeNumberRegister, regT0); movePtrToDouble(regT0, fpRegT0); @@ -447,10 +1532,10 @@ void JIT::emitSlow_op_jnlesseq(Instruction* currentInstruction, Vector<SlowCaseE fail1 = emitJumpIfNotJSCell(regT0); Jump fail2 = checkStructure(regT0, m_globalData->numberStructure.get()); - loadDouble(Address(regT0, FIELD_OFFSET(JSNumberCell, m_value)), fpRegT0); + loadDouble(Address(regT0, OBJECT_OFFSETOF(JSNumberCell, m_value)), fpRegT0); #endif - int32_t op2imm = getConstantOperand(op2).getInt32Fast();; + int32_t op2imm = getConstantOperand(op2).asInt32();; move(Imm32(op2imm), regT1); convertInt32ToDouble(regT1, fpRegT1); @@ -459,7 +1544,7 @@ void JIT::emitSlow_op_jnlesseq(Instruction* currentInstruction, Vector<SlowCaseE emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_jnlesseq)); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) fail1.link(this); #else if (!m_codeBlock->isKnownNotImmediate(op1)) @@ -468,7 +1553,7 @@ void JIT::emitSlow_op_jnlesseq(Instruction* currentInstruction, Vector<SlowCaseE #endif } - JITStubCall stubCall(this, JITStubs::cti_op_jlesseq); + JITStubCall stubCall(this, cti_op_jlesseq); stubCall.addArgument(regT0); stubCall.addArgument(op2, regT2); stubCall.call(); @@ -478,7 +1563,7 @@ void JIT::emitSlow_op_jnlesseq(Instruction* currentInstruction, Vector<SlowCaseE linkSlowCase(iter); if (supportsFloatingPoint()) { -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) Jump fail1 = emitJumpIfNotImmediateNumber(regT1); addPtr(tagTypeNumberRegister, regT1); movePtrToDouble(regT1, fpRegT1); @@ -488,10 +1573,10 @@ void JIT::emitSlow_op_jnlesseq(Instruction* currentInstruction, Vector<SlowCaseE fail1 = emitJumpIfNotJSCell(regT1); Jump fail2 = checkStructure(regT1, m_globalData->numberStructure.get()); - loadDouble(Address(regT1, FIELD_OFFSET(JSNumberCell, m_value)), fpRegT1); + loadDouble(Address(regT1, OBJECT_OFFSETOF(JSNumberCell, m_value)), fpRegT1); #endif - int32_t op1imm = getConstantOperand(op1).getInt32Fast();; + int32_t op1imm = getConstantOperand(op1).asInt32();; move(Imm32(op1imm), regT0); convertInt32ToDouble(regT0, fpRegT0); @@ -500,7 +1585,7 @@ void JIT::emitSlow_op_jnlesseq(Instruction* currentInstruction, Vector<SlowCaseE emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_jnlesseq)); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) fail1.link(this); #else if (!m_codeBlock->isKnownNotImmediate(op2)) @@ -509,7 +1594,7 @@ void JIT::emitSlow_op_jnlesseq(Instruction* currentInstruction, Vector<SlowCaseE #endif } - JITStubCall stubCall(this, JITStubs::cti_op_jlesseq); + JITStubCall stubCall(this, cti_op_jlesseq); stubCall.addArgument(op1, regT2); stubCall.addArgument(regT1); stubCall.call(); @@ -519,7 +1604,7 @@ void JIT::emitSlow_op_jnlesseq(Instruction* currentInstruction, Vector<SlowCaseE linkSlowCase(iter); if (supportsFloatingPoint()) { -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) Jump fail1 = emitJumpIfNotImmediateNumber(regT0); Jump fail2 = emitJumpIfNotImmediateNumber(regT1); Jump fail3 = emitJumpIfImmediateInteger(regT1); @@ -538,15 +1623,15 @@ void JIT::emitSlow_op_jnlesseq(Instruction* currentInstruction, Vector<SlowCaseE Jump fail3 = checkStructure(regT0, m_globalData->numberStructure.get()); Jump fail4 = checkStructure(regT1, m_globalData->numberStructure.get()); - loadDouble(Address(regT0, FIELD_OFFSET(JSNumberCell, m_value)), fpRegT0); - loadDouble(Address(regT1, FIELD_OFFSET(JSNumberCell, m_value)), fpRegT1); + loadDouble(Address(regT0, OBJECT_OFFSETOF(JSNumberCell, m_value)), fpRegT0); + loadDouble(Address(regT1, OBJECT_OFFSETOF(JSNumberCell, m_value)), fpRegT1); #endif emitJumpSlowToHot(branchDouble(DoubleLessThan, fpRegT1, fpRegT0), target + 3); emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_jnlesseq)); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) fail1.link(this); fail2.link(this); fail3.link(this); @@ -561,7 +1646,7 @@ void JIT::emitSlow_op_jnlesseq(Instruction* currentInstruction, Vector<SlowCaseE } linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_jlesseq); + JITStubCall stubCall(this, cti_op_jlesseq); stubCall.addArgument(regT0); stubCall.addArgument(regT1); stubCall.call(); @@ -578,7 +1663,7 @@ void JIT::emit_op_bitand(Instruction* currentInstruction) if (isOperandConstantImmediateInt(op1)) { emitGetVirtualRegister(op2, regT0); emitJumpSlowCaseIfNotImmediateInteger(regT0); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) int32_t imm = getConstantOperandImmediateInt(op1); andPtr(Imm32(imm), regT0); if (imm >= 0) @@ -589,7 +1674,7 @@ void JIT::emit_op_bitand(Instruction* currentInstruction) } else if (isOperandConstantImmediateInt(op2)) { emitGetVirtualRegister(op1, regT0); emitJumpSlowCaseIfNotImmediateInteger(regT0); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) int32_t imm = getConstantOperandImmediateInt(op2); andPtr(Imm32(imm), regT0); if (imm >= 0) @@ -613,17 +1698,17 @@ void JIT::emitSlow_op_bitand(Instruction* currentInstruction, Vector<SlowCaseEnt linkSlowCase(iter); if (isOperandConstantImmediateInt(op1)) { - JITStubCall stubCall(this, JITStubs::cti_op_bitand); + JITStubCall stubCall(this, cti_op_bitand); stubCall.addArgument(op1, regT2); stubCall.addArgument(regT0); stubCall.call(result); } else if (isOperandConstantImmediateInt(op2)) { - JITStubCall stubCall(this, JITStubs::cti_op_bitand); + JITStubCall stubCall(this, cti_op_bitand); stubCall.addArgument(regT0); stubCall.addArgument(op2, regT2); stubCall.call(result); } else { - JITStubCall stubCall(this, JITStubs::cti_op_bitand); + JITStubCall stubCall(this, cti_op_bitand); stubCall.addArgument(op1, regT2); stubCall.addArgument(regT1); stubCall.call(result); @@ -638,7 +1723,7 @@ void JIT::emit_op_post_inc(Instruction* currentInstruction) emitGetVirtualRegister(srcDst, regT0); move(regT0, regT1); emitJumpSlowCaseIfNotImmediateInteger(regT0); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) addSlowCase(branchAdd32(Overflow, Imm32(1), regT1)); emitFastArithIntToImmNoCheck(regT1, regT1); #else @@ -656,7 +1741,7 @@ void JIT::emitSlow_op_post_inc(Instruction* currentInstruction, Vector<SlowCaseE linkSlowCase(iter); linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_post_inc); + JITStubCall stubCall(this, cti_op_post_inc); stubCall.addArgument(regT0); stubCall.addArgument(Imm32(srcDst)); stubCall.call(result); @@ -670,7 +1755,7 @@ void JIT::emit_op_post_dec(Instruction* currentInstruction) emitGetVirtualRegister(srcDst, regT0); move(regT0, regT1); emitJumpSlowCaseIfNotImmediateInteger(regT0); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) addSlowCase(branchSub32(Zero, Imm32(1), regT1)); emitFastArithIntToImmNoCheck(regT1, regT1); #else @@ -688,7 +1773,7 @@ void JIT::emitSlow_op_post_dec(Instruction* currentInstruction, Vector<SlowCaseE linkSlowCase(iter); linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_post_dec); + JITStubCall stubCall(this, cti_op_post_dec); stubCall.addArgument(regT0); stubCall.addArgument(Imm32(srcDst)); stubCall.call(result); @@ -700,7 +1785,7 @@ void JIT::emit_op_pre_inc(Instruction* currentInstruction) emitGetVirtualRegister(srcDst, regT0); emitJumpSlowCaseIfNotImmediateInteger(regT0); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) addSlowCase(branchAdd32(Overflow, Imm32(1), regT0)); emitFastArithIntToImmNoCheck(regT0, regT0); #else @@ -718,7 +1803,7 @@ void JIT::emitSlow_op_pre_inc(Instruction* currentInstruction, Vector<SlowCaseEn linkSlowCase(iter); emitGetVirtualRegister(srcDst, regT0); notImm.link(this); - JITStubCall stubCall(this, JITStubs::cti_op_pre_inc); + JITStubCall stubCall(this, cti_op_pre_inc); stubCall.addArgument(regT0); stubCall.call(srcDst); } @@ -729,7 +1814,7 @@ void JIT::emit_op_pre_dec(Instruction* currentInstruction) emitGetVirtualRegister(srcDst, regT0); emitJumpSlowCaseIfNotImmediateInteger(regT0); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) addSlowCase(branchSub32(Zero, Imm32(1), regT0)); emitFastArithIntToImmNoCheck(regT0, regT0); #else @@ -747,7 +1832,7 @@ void JIT::emitSlow_op_pre_dec(Instruction* currentInstruction, Vector<SlowCaseEn linkSlowCase(iter); emitGetVirtualRegister(srcDst, regT0); notImm.link(this); - JITStubCall stubCall(this, JITStubs::cti_op_pre_dec); + JITStubCall stubCall(this, cti_op_pre_dec); stubCall.addArgument(regT0); stubCall.call(srcDst); } @@ -765,7 +1850,7 @@ void JIT::emit_op_mod(Instruction* currentInstruction) emitGetVirtualRegisters(op1, X86::eax, op2, X86::ecx); emitJumpSlowCaseIfNotImmediateInteger(X86::eax); emitJumpSlowCaseIfNotImmediateInteger(X86::ecx); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) addSlowCase(branchPtr(Equal, X86::ecx, ImmPtr(JSValue::encode(jsNumber(m_globalData, 0))))); m_assembler.cdq(); m_assembler.idivl_r(X86::ecx); @@ -784,7 +1869,7 @@ void JIT::emitSlow_op_mod(Instruction* currentInstruction, Vector<SlowCaseEntry> { unsigned result = currentInstruction[1].u.operand; -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) linkSlowCase(iter); linkSlowCase(iter); linkSlowCase(iter); @@ -797,7 +1882,7 @@ void JIT::emitSlow_op_mod(Instruction* currentInstruction, Vector<SlowCaseEntry> notImm1.link(this); notImm2.link(this); #endif - JITStubCall stubCall(this, JITStubs::cti_op_mod); + JITStubCall stubCall(this, cti_op_mod); stubCall.addArgument(X86::eax); stubCall.addArgument(X86::ecx); stubCall.call(result); @@ -811,7 +1896,7 @@ void JIT::emit_op_mod(Instruction* currentInstruction) unsigned op1 = currentInstruction[2].u.operand; unsigned op2 = currentInstruction[3].u.operand; - JITStubCall stubCall(this, JITStubs::cti_op_mod); + JITStubCall stubCall(this, cti_op_mod); stubCall.addArgument(op1, regT2); stubCall.addArgument(op2, regT2); stubCall.call(result); @@ -826,64 +1911,9 @@ void JIT::emitSlow_op_mod(Instruction*, Vector<SlowCaseEntry>::iterator&) /* ------------------------------ END: OP_MOD ------------------------------ */ -#if !ENABLE(JIT_OPTIMIZE_ARITHMETIC) +#if USE(JSVALUE64) -/* ------------------------------ BEGIN: !ENABLE(JIT_OPTIMIZE_ARITHMETIC) (OP_ADD, OP_SUB, OP_MUL) ------------------------------ */ - -void JIT::emit_op_add(Instruction* currentInstruction) -{ - unsigned result = currentInstruction[1].u.operand; - unsigned op1 = currentInstruction[2].u.operand; - unsigned op2 = currentInstruction[3].u.operand; - - JITStubCall stubCall(this, JITStubs::cti_op_add); - stubCall.addArgument(op1, regT2); - stubCall.addArgument(op2, regT2); - stubCall.call(result); -} - -void JIT::emitSlow_op_add(Instruction*, Vector<SlowCaseEntry>::iterator&) -{ - ASSERT_NOT_REACHED(); -} - -void JIT::emit_op_mul(Instruction* currentInstruction) -{ - unsigned result = currentInstruction[1].u.operand; - unsigned op1 = currentInstruction[2].u.operand; - unsigned op2 = currentInstruction[3].u.operand; - - JITStubCall stubCall(this, JITStubs::cti_op_mul); - stubCall.addArgument(op1, regT2); - stubCall.addArgument(op2, regT2); - stubCall.call(result); -} - -void JIT::emitSlow_op_mul(Instruction*, Vector<SlowCaseEntry>::iterator&) -{ - ASSERT_NOT_REACHED(); -} - -void JIT::emit_op_sub(Instruction* currentInstruction) -{ - unsigned result = currentInstruction[1].u.operand; - unsigned op1 = currentInstruction[2].u.operand; - unsigned op2 = currentInstruction[3].u.operand; - - JITStubCall stubCall(this, JITStubs::cti_op_sub); - stubCall.addArgument(op1, regT2); - stubCall.addArgument(op2, regT2); - stubCall.call(result); -} - -void JIT::emitSlow_op_sub(Instruction*, Vector<SlowCaseEntry>::iterator&) -{ - ASSERT_NOT_REACHED(); -} - -#elif USE(ALTERNATE_JSIMMEDIATE) // *AND* ENABLE(JIT_OPTIMIZE_ARITHMETIC) - -/* ------------------------------ BEGIN: USE(ALTERNATE_JSIMMEDIATE) (OP_ADD, OP_SUB, OP_MUL) ------------------------------ */ +/* ------------------------------ BEGIN: USE(JSVALUE64) (OP_ADD, OP_SUB, OP_MUL) ------------------------------ */ void JIT::compileBinaryArithOp(OpcodeID opcodeID, unsigned, unsigned op1, unsigned op2, OperandTypes) { @@ -916,7 +1946,7 @@ void JIT::compileBinaryArithOpSlowCase(OpcodeID opcodeID, Vector<SlowCaseEntry>: emitGetVirtualRegister(op1, regT0); Label stubFunctionCall(this); - JITStubCall stubCall(this, opcodeID == op_add ? JITStubs::cti_op_add : opcodeID == op_sub ? JITStubs::cti_op_sub : JITStubs::cti_op_mul); + JITStubCall stubCall(this, opcodeID == op_add ? cti_op_add : opcodeID == op_sub ? cti_op_sub : cti_op_mul); stubCall.addArgument(regT0); stubCall.addArgument(regT1); stubCall.call(result); @@ -967,7 +1997,7 @@ void JIT::emit_op_add(Instruction* currentInstruction) OperandTypes types = OperandTypes::fromInt(currentInstruction[4].u.operand); if (!types.first().mightBeNumber() || !types.second().mightBeNumber()) { - JITStubCall stubCall(this, JITStubs::cti_op_add); + JITStubCall stubCall(this, cti_op_add); stubCall.addArgument(op1, regT2); stubCall.addArgument(op2, regT2); stubCall.call(result); @@ -999,7 +2029,7 @@ void JIT::emitSlow_op_add(Instruction* currentInstruction, Vector<SlowCaseEntry> if (isOperandConstantImmediateInt(op1) || isOperandConstantImmediateInt(op2)) { linkSlowCase(iter); linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_add); + JITStubCall stubCall(this, cti_op_add); stubCall.addArgument(op1, regT2); stubCall.addArgument(op2, regT2); stubCall.call(result); @@ -1044,7 +2074,7 @@ void JIT::emitSlow_op_mul(Instruction* currentInstruction, Vector<SlowCaseEntry> linkSlowCase(iter); linkSlowCase(iter); // There is an extra slow case for (op1 * -N) or (-N * op2), to check for 0 since this should produce a result of -0. - JITStubCall stubCall(this, JITStubs::cti_op_mul); + JITStubCall stubCall(this, cti_op_mul); stubCall.addArgument(op1, regT2); stubCall.addArgument(op2, regT2); stubCall.call(result); @@ -1074,9 +2104,9 @@ void JIT::emitSlow_op_sub(Instruction* currentInstruction, Vector<SlowCaseEntry> compileBinaryArithOpSlowCase(op_sub, iter, result, op1, op2, types); } -#else // !ENABLE(JIT_OPTIMIZE_ARITHMETIC) +#else // USE(JSVALUE64) -/* ------------------------------ BEGIN: !ENABLE(JIT_OPTIMIZE_ARITHMETIC) (OP_ADD, OP_SUB, OP_MUL) ------------------------------ */ +/* ------------------------------ BEGIN: !USE(JSVALUE64) (OP_ADD, OP_SUB, OP_MUL) ------------------------------ */ void JIT::compileBinaryArithOp(OpcodeID opcodeID, unsigned dst, unsigned src1, unsigned src2, OperandTypes types) { @@ -1105,7 +2135,7 @@ void JIT::compileBinaryArithOp(OpcodeID opcodeID, unsigned dst, unsigned src1, u } // (1a) if we get here, src1 is also a number cell - loadDouble(Address(regT0, FIELD_OFFSET(JSNumberCell, m_value)), fpRegT0); + loadDouble(Address(regT0, OBJECT_OFFSETOF(JSNumberCell, m_value)), fpRegT0); Jump loadedDouble = jump(); // (1b) if we get here, src1 is an immediate op1imm.link(this); @@ -1114,16 +2144,16 @@ void JIT::compileBinaryArithOp(OpcodeID opcodeID, unsigned dst, unsigned src1, u // (1c) loadedDouble.link(this); if (opcodeID == op_add) - addDouble(Address(regT1, FIELD_OFFSET(JSNumberCell, m_value)), fpRegT0); + addDouble(Address(regT1, OBJECT_OFFSETOF(JSNumberCell, m_value)), fpRegT0); else if (opcodeID == op_sub) - subDouble(Address(regT1, FIELD_OFFSET(JSNumberCell, m_value)), fpRegT0); + subDouble(Address(regT1, OBJECT_OFFSETOF(JSNumberCell, m_value)), fpRegT0); else { ASSERT(opcodeID == op_mul); - mulDouble(Address(regT1, FIELD_OFFSET(JSNumberCell, m_value)), fpRegT0); + mulDouble(Address(regT1, OBJECT_OFFSETOF(JSNumberCell, m_value)), fpRegT0); } // Store the result to the JSNumberCell and jump. - storeDouble(fpRegT0, Address(regT1, FIELD_OFFSET(JSNumberCell, m_value))); + storeDouble(fpRegT0, Address(regT1, OBJECT_OFFSETOF(JSNumberCell, m_value))); move(regT1, regT0); emitPutVirtualRegister(dst); wasJSNumberCell2 = jump(); @@ -1151,7 +2181,7 @@ void JIT::compileBinaryArithOp(OpcodeID opcodeID, unsigned dst, unsigned src1, u } // (1a) if we get here, src2 is also a number cell - loadDouble(Address(regT1, FIELD_OFFSET(JSNumberCell, m_value)), fpRegT1); + loadDouble(Address(regT1, OBJECT_OFFSETOF(JSNumberCell, m_value)), fpRegT1); Jump loadedDouble = jump(); // (1b) if we get here, src2 is an immediate op2imm.link(this); @@ -1159,7 +2189,7 @@ void JIT::compileBinaryArithOp(OpcodeID opcodeID, unsigned dst, unsigned src1, u convertInt32ToDouble(regT1, fpRegT1); // (1c) loadedDouble.link(this); - loadDouble(Address(regT0, FIELD_OFFSET(JSNumberCell, m_value)), fpRegT0); + loadDouble(Address(regT0, OBJECT_OFFSETOF(JSNumberCell, m_value)), fpRegT0); if (opcodeID == op_add) addDouble(fpRegT1, fpRegT0); else if (opcodeID == op_sub) @@ -1168,11 +2198,11 @@ void JIT::compileBinaryArithOp(OpcodeID opcodeID, unsigned dst, unsigned src1, u ASSERT(opcodeID == op_mul); mulDouble(fpRegT1, fpRegT0); } - storeDouble(fpRegT0, Address(regT0, FIELD_OFFSET(JSNumberCell, m_value))); + storeDouble(fpRegT0, Address(regT0, OBJECT_OFFSETOF(JSNumberCell, m_value))); emitPutVirtualRegister(dst); // Store the result to the JSNumberCell and jump. - storeDouble(fpRegT0, Address(regT0, FIELD_OFFSET(JSNumberCell, m_value))); + storeDouble(fpRegT0, Address(regT0, OBJECT_OFFSETOF(JSNumberCell, m_value))); emitPutVirtualRegister(dst); wasJSNumberCell1 = jump(); @@ -1243,7 +2273,7 @@ void JIT::compileBinaryArithOpSlowCase(OpcodeID opcodeID, Vector<SlowCaseEntry>: if (opcodeID == op_mul) linkSlowCase(iter); - JITStubCall stubCall(this, opcodeID == op_add ? JITStubs::cti_op_add : opcodeID == op_sub ? JITStubs::cti_op_sub : JITStubs::cti_op_mul); + JITStubCall stubCall(this, opcodeID == op_add ? cti_op_add : opcodeID == op_sub ? cti_op_sub : cti_op_mul); stubCall.addArgument(src1, regT2); stubCall.addArgument(src2, regT2); stubCall.call(dst); @@ -1272,7 +2302,7 @@ void JIT::emit_op_add(Instruction* currentInstruction) if (types.first().mightBeNumber() && types.second().mightBeNumber()) compileBinaryArithOp(op_add, result, op1, op2, OperandTypes::fromInt(currentInstruction[4].u.operand)); else { - JITStubCall stubCall(this, JITStubs::cti_op_add); + JITStubCall stubCall(this, cti_op_add); stubCall.addArgument(op1, regT2); stubCall.addArgument(op2, regT2); stubCall.call(result); @@ -1291,7 +2321,7 @@ void JIT::emitSlow_op_add(Instruction* currentInstruction, Vector<SlowCaseEntry> linkSlowCase(iter); sub32(Imm32(getConstantOperandImmediateInt(op1) << JSImmediate::IntegerPayloadShift), regT0); notImm.link(this); - JITStubCall stubCall(this, JITStubs::cti_op_add); + JITStubCall stubCall(this, cti_op_add); stubCall.addArgument(op1, regT2); stubCall.addArgument(regT0); stubCall.call(result); @@ -1300,7 +2330,7 @@ void JIT::emitSlow_op_add(Instruction* currentInstruction, Vector<SlowCaseEntry> linkSlowCase(iter); sub32(Imm32(getConstantOperandImmediateInt(op2) << JSImmediate::IntegerPayloadShift), regT0); notImm.link(this); - JITStubCall stubCall(this, JITStubs::cti_op_add); + JITStubCall stubCall(this, cti_op_add); stubCall.addArgument(regT0); stubCall.addArgument(op2, regT2); stubCall.call(result); @@ -1350,7 +2380,7 @@ void JIT::emitSlow_op_mul(Instruction* currentInstruction, Vector<SlowCaseEntry> linkSlowCase(iter); linkSlowCase(iter); // There is an extra slow case for (op1 * -N) or (-N * op2), to check for 0 since this should produce a result of -0. - JITStubCall stubCall(this, JITStubs::cti_op_mul); + JITStubCall stubCall(this, cti_op_mul); stubCall.addArgument(op1, regT2); stubCall.addArgument(op2, regT2); stubCall.call(result); @@ -1368,10 +2398,12 @@ void JIT::emitSlow_op_sub(Instruction* currentInstruction, Vector<SlowCaseEntry> compileBinaryArithOpSlowCase(op_sub, iter, currentInstruction[1].u.operand, currentInstruction[2].u.operand, currentInstruction[3].u.operand, OperandTypes::fromInt(currentInstruction[4].u.operand)); } -#endif // !ENABLE(JIT_OPTIMIZE_ARITHMETIC) +#endif // USE(JSVALUE64) /* ------------------------------ END: OP_ADD, OP_SUB, OP_MUL ------------------------------ */ +#endif // USE(JSVALUE32_64) + } // namespace JSC #endif // ENABLE(JIT) diff --git a/JavaScriptCore/jit/JITCall.cpp b/JavaScriptCore/jit/JITCall.cpp index cf852be..7fdb845 100644 --- a/JavaScriptCore/jit/JITCall.cpp +++ b/JavaScriptCore/jit/JITCall.cpp @@ -45,11 +45,401 @@ using namespace std; namespace JSC { +#if USE(JSVALUE32_64) + void JIT::compileOpCallInitializeCallFrame() { + // regT0 holds callee, regT1 holds argCount store32(regT1, Address(callFrameRegister, RegisterFile::ArgumentCount * static_cast<int>(sizeof(Register)))); - loadPtr(Address(regT2, FIELD_OFFSET(JSFunction, m_data) + FIELD_OFFSET(ScopeChain, m_node)), regT1); // newScopeChain + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSFunction, m_data) + OBJECT_OFFSETOF(ScopeChain, m_node)), regT1); // scopeChain + + emitStore(static_cast<unsigned>(RegisterFile::OptionalCalleeArguments), JSValue()); + storePtr(regT0, Address(callFrameRegister, RegisterFile::Callee * static_cast<int>(sizeof(Register)))); // callee + storePtr(regT1, Address(callFrameRegister, RegisterFile::ScopeChain * static_cast<int>(sizeof(Register)))); // scopeChain +} + +void JIT::compileOpCallSetupArgs(Instruction* instruction) +{ + int argCount = instruction[3].u.operand; + int registerOffset = instruction[4].u.operand; + + emitPutJITStubArg(regT0, 1); + emitPutJITStubArg(regT1, 2); + emitPutJITStubArgConstant(registerOffset, 3); + emitPutJITStubArgConstant(argCount, 5); +} + +void JIT::compileOpConstructSetupArgs(Instruction* instruction) +{ + int argCount = instruction[3].u.operand; + int registerOffset = instruction[4].u.operand; + int proto = instruction[5].u.operand; + int thisRegister = instruction[6].u.operand; + + emitPutJITStubArg(regT0, 1); + emitPutJITStubArg(regT1, 2); + emitPutJITStubArgConstant(registerOffset, 3); + emitPutJITStubArgConstant(argCount, 5); + emitPutJITStubArgFromVirtualRegister(proto, 7, regT2, regT3); + emitPutJITStubArgConstant(thisRegister, 9); +} + +void JIT::compileOpCallVarargsSetupArgs(Instruction*) +{ + emitPutJITStubArg(regT0, 1); + emitPutJITStubArg(regT1, 2); + emitPutJITStubArg(regT3, 3); // registerOffset + emitPutJITStubArg(regT2, 5); // argCount +} + +void JIT::compileOpCallVarargs(Instruction* instruction) +{ + int dst = instruction[1].u.operand; + int callee = instruction[2].u.operand; + int argCountRegister = instruction[3].u.operand; + int registerOffset = instruction[4].u.operand; + + emitLoad(callee, regT1, regT0); + emitLoadPayload(argCountRegister, regT2); // argCount + addPtr(Imm32(registerOffset), regT2, regT3); // registerOffset + + compileOpCallVarargsSetupArgs(instruction); + + emitJumpSlowCaseIfNotJSCell(callee, regT1); + addSlowCase(branchPtr(NotEqual, Address(regT0), ImmPtr(m_globalData->jsFunctionVPtr))); + + // Speculatively roll the callframe, assuming argCount will match the arity. + mul32(Imm32(sizeof(Register)), regT3, regT3); + addPtr(callFrameRegister, regT3); + storePtr(callFrameRegister, Address(regT3, RegisterFile::CallerFrame * static_cast<int>(sizeof(Register)))); + move(regT3, callFrameRegister); + + move(regT2, regT1); // argCount + + emitNakedCall(m_globalData->jitStubs.ctiVirtualCall()); + + emitStore(dst, regT1, regT0); + + sampleCodeBlock(m_codeBlock); +} + +void JIT::compileOpCallVarargsSlowCase(Instruction* instruction, Vector<SlowCaseEntry>::iterator& iter) +{ + int dst = instruction[1].u.operand; + int callee = instruction[2].u.operand; + + linkSlowCaseIfNotJSCell(iter, callee); + linkSlowCase(iter); + + JITStubCall stubCall(this, cti_op_call_NotJSFunction); + stubCall.call(dst); // In the interpreter, the callee puts the return value in dst. + + map(m_bytecodeIndex + OPCODE_LENGTH(op_call_varargs), dst, regT1, regT0); + sampleCodeBlock(m_codeBlock); +} + +void JIT::emit_op_ret(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + + // We could JIT generate the deref, only calling out to C when the refcount hits zero. + if (m_codeBlock->needsFullScopeChain()) + JITStubCall(this, cti_op_ret_scopeChain).call(); + + emitLoad(dst, regT1, regT0); + emitGetFromCallFrameHeaderPtr(RegisterFile::ReturnPC, regT2); + emitGetFromCallFrameHeaderPtr(RegisterFile::CallerFrame, callFrameRegister); + + restoreReturnAddressBeforeReturn(regT2); + ret(); +} + +void JIT::emit_op_construct_verify(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + + emitLoad(dst, regT1, regT0); + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::CellTag))); + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT2); + addSlowCase(branch32(NotEqual, Address(regT2, OBJECT_OFFSETOF(Structure, m_typeInfo) + OBJECT_OFFSETOF(TypeInfo, m_type)), Imm32(ObjectType))); +} + +void JIT::emitSlow_op_construct_verify(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned src = currentInstruction[2].u.operand; + + linkSlowCase(iter); + linkSlowCase(iter); + emitLoad(src, regT1, regT0); + emitStore(dst, regT1, regT0); +} + +void JIT::emitSlow_op_call(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + compileOpCallSlowCase(currentInstruction, iter, m_callLinkInfoIndex++, op_call); +} + +void JIT::emitSlow_op_call_eval(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + compileOpCallSlowCase(currentInstruction, iter, m_callLinkInfoIndex++, op_call_eval); +} + +void JIT::emitSlow_op_call_varargs(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + compileOpCallVarargsSlowCase(currentInstruction, iter); +} + +void JIT::emitSlow_op_construct(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + compileOpCallSlowCase(currentInstruction, iter, m_callLinkInfoIndex++, op_construct); +} + +void JIT::emit_op_call(Instruction* currentInstruction) +{ + compileOpCall(op_call, currentInstruction, m_callLinkInfoIndex++); +} + +void JIT::emit_op_call_eval(Instruction* currentInstruction) +{ + compileOpCall(op_call_eval, currentInstruction, m_callLinkInfoIndex++); +} + +void JIT::emit_op_load_varargs(Instruction* currentInstruction) +{ + int argCountDst = currentInstruction[1].u.operand; + int argsOffset = currentInstruction[2].u.operand; + + JITStubCall stubCall(this, cti_op_load_varargs); + stubCall.addArgument(Imm32(argsOffset)); + stubCall.call(); + // Stores a naked int32 in the register file. + store32(returnValueRegister, Address(callFrameRegister, argCountDst * sizeof(Register))); +} + +void JIT::emit_op_call_varargs(Instruction* currentInstruction) +{ + compileOpCallVarargs(currentInstruction); +} + +void JIT::emit_op_construct(Instruction* currentInstruction) +{ + compileOpCall(op_construct, currentInstruction, m_callLinkInfoIndex++); +} + +#if !ENABLE(JIT_OPTIMIZE_CALL) + +/* ------------------------------ BEGIN: !ENABLE(JIT_OPTIMIZE_CALL) ------------------------------ */ + +void JIT::compileOpCall(OpcodeID opcodeID, Instruction* instruction, unsigned) +{ + int dst = instruction[1].u.operand; + int callee = instruction[2].u.operand; + int argCount = instruction[3].u.operand; + int registerOffset = instruction[4].u.operand; + + Jump wasEval1; + Jump wasEval2; + if (opcodeID == op_call_eval) { + JITStubCall stubCall(this, cti_op_call_eval); + stubCall.addArgument(callee); + stubCall.addArgument(JIT::Imm32(registerOffset)); + stubCall.addArgument(JIT::Imm32(argCount)); + stubCall.call(); + wasEval1 = branchTest32(NonZero, regT0); + wasEval2 = branch32(NotEqual, regT1, Imm32(JSValue::CellTag)); + } + + emitLoad(callee, regT1, regT2); + + if (opcodeID == op_call) + compileOpCallSetupArgs(instruction); + else if (opcodeID == op_construct) + compileOpConstructSetupArgs(instruction); + + emitJumpSlowCaseIfNotJSCell(callee, regT1); + addSlowCase(branchPtr(NotEqual, Address(regT2), ImmPtr(m_globalData->jsFunctionVPtr))); + + // First, in the case of a construct, allocate the new object. + if (opcodeID == op_construct) { + JITStubCall(this, cti_op_construct_JSConstruct).call(registerOffset - RegisterFile::CallFrameHeaderSize - argCount); + emitLoad(callee, regT1, regT2); + } + + // Speculatively roll the callframe, assuming argCount will match the arity. + storePtr(callFrameRegister, Address(callFrameRegister, (RegisterFile::CallerFrame + registerOffset) * static_cast<int>(sizeof(Register)))); + addPtr(Imm32(registerOffset * static_cast<int>(sizeof(Register))), callFrameRegister); + move(Imm32(argCount), regT1); + + emitNakedCall(m_globalData->jitStubs.ctiVirtualCall()); + + if (opcodeID == op_call_eval) { + wasEval1.link(this); + wasEval2.link(this); + } + + emitStore(dst, regT1, regT0);; + + sampleCodeBlock(m_codeBlock); +} + +void JIT::compileOpCallSlowCase(Instruction* instruction, Vector<SlowCaseEntry>::iterator& iter, unsigned, OpcodeID opcodeID) +{ + int dst = instruction[1].u.operand; + int callee = instruction[2].u.operand; + + linkSlowCaseIfNotJSCell(iter, callee); + linkSlowCase(iter); + + JITStubCall stubCall(this, opcodeID == op_construct ? cti_op_construct_NotJSConstruct : cti_op_call_NotJSFunction); + stubCall.call(dst); // In the interpreter, the callee puts the return value in dst. + + sampleCodeBlock(m_codeBlock); +} + +#else // !ENABLE(JIT_OPTIMIZE_CALL) + +/* ------------------------------ BEGIN: ENABLE(JIT_OPTIMIZE_CALL) ------------------------------ */ + +void JIT::compileOpCall(OpcodeID opcodeID, Instruction* instruction, unsigned callLinkInfoIndex) +{ + int dst = instruction[1].u.operand; + int callee = instruction[2].u.operand; + int argCount = instruction[3].u.operand; + int registerOffset = instruction[4].u.operand; + + Jump wasEval1; + Jump wasEval2; + if (opcodeID == op_call_eval) { + JITStubCall stubCall(this, cti_op_call_eval); + stubCall.addArgument(callee); + stubCall.addArgument(JIT::Imm32(registerOffset)); + stubCall.addArgument(JIT::Imm32(argCount)); + stubCall.call(); + wasEval1 = branchTest32(NonZero, regT0); + wasEval2 = branch32(NotEqual, regT1, Imm32(JSValue::CellTag)); + } + + emitLoad(callee, regT1, regT0); + + DataLabelPtr addressOfLinkedFunctionCheck; + Jump jumpToSlow = branchPtrWithPatch(NotEqual, regT0, addressOfLinkedFunctionCheck, ImmPtr(0)); + addSlowCase(jumpToSlow); + ASSERT(differenceBetween(addressOfLinkedFunctionCheck, jumpToSlow) == patchOffsetOpCallCompareToJump); + m_callStructureStubCompilationInfo[callLinkInfoIndex].hotPathBegin = addressOfLinkedFunctionCheck; + + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::CellTag))); + + // The following is the fast case, only used whan a callee can be linked. + + // In the case of OpConstruct, call out to a cti_ function to create the new object. + if (opcodeID == op_construct) { + int proto = instruction[5].u.operand; + int thisRegister = instruction[6].u.operand; + + JITStubCall stubCall(this, cti_op_construct_JSConstruct); + stubCall.addArgument(regT1, regT0); + stubCall.addArgument(Imm32(0)); // FIXME: Remove this unused JITStub argument. + stubCall.addArgument(Imm32(0)); // FIXME: Remove this unused JITStub argument. + stubCall.addArgument(proto); + stubCall.call(thisRegister); + + emitLoad(callee, regT1, regT0); + } + + // Fast version of stack frame initialization, directly relative to edi. + // Note that this omits to set up RegisterFile::CodeBlock, which is set in the callee + emitStore(registerOffset + RegisterFile::OptionalCalleeArguments, JSValue()); + emitStore(registerOffset + RegisterFile::Callee, regT1, regT0); + + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSFunction, m_data) + OBJECT_OFFSETOF(ScopeChain, m_node)), regT1); // newScopeChain + store32(Imm32(argCount), Address(callFrameRegister, (registerOffset + RegisterFile::ArgumentCount) * static_cast<int>(sizeof(Register)))); + storePtr(callFrameRegister, Address(callFrameRegister, (registerOffset + RegisterFile::CallerFrame) * static_cast<int>(sizeof(Register)))); + storePtr(regT1, Address(callFrameRegister, (registerOffset + RegisterFile::ScopeChain) * static_cast<int>(sizeof(Register)))); + addPtr(Imm32(registerOffset * sizeof(Register)), callFrameRegister); + + // Call to the callee + m_callStructureStubCompilationInfo[callLinkInfoIndex].hotPathOther = emitNakedCall(); + + if (opcodeID == op_call_eval) { + wasEval1.link(this); + wasEval2.link(this); + } + + // Put the return value in dst. In the interpreter, op_ret does this. + emitStore(dst, regT1, regT0); + map(m_bytecodeIndex + opcodeLengths[opcodeID], dst, regT1, regT0); + + sampleCodeBlock(m_codeBlock); +} + +void JIT::compileOpCallSlowCase(Instruction* instruction, Vector<SlowCaseEntry>::iterator& iter, unsigned callLinkInfoIndex, OpcodeID opcodeID) +{ + int dst = instruction[1].u.operand; + int callee = instruction[2].u.operand; + int argCount = instruction[3].u.operand; + int registerOffset = instruction[4].u.operand; + + linkSlowCase(iter); + linkSlowCase(iter); + + // The arguments have been set up on the hot path for op_call_eval + if (opcodeID == op_call) + compileOpCallSetupArgs(instruction); + else if (opcodeID == op_construct) + compileOpConstructSetupArgs(instruction); + + // Fast check for JS function. + Jump callLinkFailNotObject = branch32(NotEqual, regT1, Imm32(JSValue::CellTag)); + Jump callLinkFailNotJSFunction = branchPtr(NotEqual, Address(regT0), ImmPtr(m_globalData->jsFunctionVPtr)); + + // First, in the case of a construct, allocate the new object. + if (opcodeID == op_construct) { + JITStubCall(this, cti_op_construct_JSConstruct).call(registerOffset - RegisterFile::CallFrameHeaderSize - argCount); + emitLoad(callee, regT1, regT0); + } + + // Speculatively roll the callframe, assuming argCount will match the arity. + storePtr(callFrameRegister, Address(callFrameRegister, (RegisterFile::CallerFrame + registerOffset) * static_cast<int>(sizeof(Register)))); + addPtr(Imm32(registerOffset * static_cast<int>(sizeof(Register))), callFrameRegister); + move(Imm32(argCount), regT1); + + m_callStructureStubCompilationInfo[callLinkInfoIndex].callReturnLocation = emitNakedCall(m_globalData->jitStubs.ctiVirtualCallLink()); + + // Put the return value in dst. + emitStore(dst, regT1, regT0);; + sampleCodeBlock(m_codeBlock); + + // If not, we need an extra case in the if below! + ASSERT(OPCODE_LENGTH(op_call) == OPCODE_LENGTH(op_call_eval)); + + // Done! - return back to the hot path. + if (opcodeID == op_construct) + emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_construct)); + else + emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_call)); + + // This handles host functions + callLinkFailNotObject.link(this); + callLinkFailNotJSFunction.link(this); + JITStubCall(this, opcodeID == op_construct ? cti_op_construct_NotJSConstruct : cti_op_call_NotJSFunction).call(); + + emitStore(dst, regT1, regT0);; + sampleCodeBlock(m_codeBlock); +} + +/* ------------------------------ END: !ENABLE / ENABLE(JIT_OPTIMIZE_CALL) ------------------------------ */ + +#endif // !ENABLE(JIT_OPTIMIZE_CALL) + +#else // USE(JSVALUE32_64) + +void JIT::compileOpCallInitializeCallFrame() +{ + store32(regT1, Address(callFrameRegister, RegisterFile::ArgumentCount * static_cast<int>(sizeof(Register)))); + + loadPtr(Address(regT2, OBJECT_OFFSETOF(JSFunction, m_data) + OBJECT_OFFSETOF(ScopeChain, m_node)), regT1); // newScopeChain storePtr(ImmPtr(JSValue::encode(JSValue())), Address(callFrameRegister, RegisterFile::OptionalCalleeArguments * static_cast<int>(sizeof(Register)))); storePtr(regT2, Address(callFrameRegister, RegisterFile::Callee * static_cast<int>(sizeof(Register)))); @@ -128,7 +518,7 @@ void JIT::compileOpCallVarargsSlowCase(Instruction* instruction, Vector<SlowCase linkSlowCase(iter); linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_call_NotJSFunction); + JITStubCall stubCall(this, cti_op_call_NotJSFunction); stubCall.call(dst); // In the interpreter, the callee puts the return value in dst. sampleCodeBlock(m_codeBlock); @@ -148,7 +538,11 @@ void JIT::compileOpCall(OpcodeID opcodeID, Instruction* instruction, unsigned) // Handle eval Jump wasEval; if (opcodeID == op_call_eval) { - CallEvalJITStub(this, instruction).call(); + JITStubCall stubCall(this, cti_op_call_eval); + stubCall.addArgument(callee, regT2); + stubCall.addArgument(JIT::Imm32(registerOffset)); + stubCall.addArgument(JIT::Imm32(argCount)); + stubCall.call(); wasEval = branchPtr(NotEqual, regT0, ImmPtr(JSValue::encode(JSValue()))); } @@ -165,7 +559,7 @@ void JIT::compileOpCall(OpcodeID opcodeID, Instruction* instruction, unsigned) // First, in the case of a construct, allocate the new object. if (opcodeID == op_construct) { - JITStubCall(this, JITStubs::cti_op_construct_JSConstruct).call(registerOffset - RegisterFile::CallFrameHeaderSize - argCount); + JITStubCall(this, cti_op_construct_JSConstruct).call(registerOffset - RegisterFile::CallFrameHeaderSize - argCount); emitGetVirtualRegister(callee, regT2); } @@ -191,7 +585,7 @@ void JIT::compileOpCallSlowCase(Instruction* instruction, Vector<SlowCaseEntry>: linkSlowCase(iter); linkSlowCase(iter); - JITStubCall stubCall(this, opcodeID == op_construct ? JITStubs::cti_op_construct_NotJSConstruct : JITStubs::cti_op_call_NotJSFunction); + JITStubCall stubCall(this, opcodeID == op_construct ? cti_op_construct_NotJSConstruct : cti_op_call_NotJSFunction); stubCall.call(dst); // In the interpreter, the callee puts the return value in dst. sampleCodeBlock(m_codeBlock); @@ -211,7 +605,11 @@ void JIT::compileOpCall(OpcodeID opcodeID, Instruction* instruction, unsigned ca // Handle eval Jump wasEval; if (opcodeID == op_call_eval) { - CallEvalJITStub(this, instruction).call(); + JITStubCall stubCall(this, cti_op_call_eval); + stubCall.addArgument(callee, regT2); + stubCall.addArgument(JIT::Imm32(registerOffset)); + stubCall.addArgument(JIT::Imm32(argCount)); + stubCall.call(); wasEval = branchPtr(NotEqual, regT0, ImmPtr(JSValue::encode(JSValue()))); } @@ -233,7 +631,7 @@ void JIT::compileOpCall(OpcodeID opcodeID, Instruction* instruction, unsigned ca emitPutJITStubArg(regT2, 1); emitPutJITStubArgFromVirtualRegister(proto, 4, regT0); - JITStubCall stubCall(this, JITStubs::cti_op_construct_JSConstruct); + JITStubCall stubCall(this, cti_op_construct_JSConstruct); stubCall.call(thisRegister); emitGetVirtualRegister(callee, regT2); } @@ -242,7 +640,7 @@ void JIT::compileOpCall(OpcodeID opcodeID, Instruction* instruction, unsigned ca // Note that this omits to set up RegisterFile::CodeBlock, which is set in the callee storePtr(ImmPtr(JSValue::encode(JSValue())), Address(callFrameRegister, (registerOffset + RegisterFile::OptionalCalleeArguments) * static_cast<int>(sizeof(Register)))); storePtr(regT2, Address(callFrameRegister, (registerOffset + RegisterFile::Callee) * static_cast<int>(sizeof(Register)))); - loadPtr(Address(regT2, FIELD_OFFSET(JSFunction, m_data) + FIELD_OFFSET(ScopeChain, m_node)), regT1); // newScopeChain + loadPtr(Address(regT2, OBJECT_OFFSETOF(JSFunction, m_data) + OBJECT_OFFSETOF(ScopeChain, m_node)), regT1); // newScopeChain store32(Imm32(argCount), Address(callFrameRegister, (registerOffset + RegisterFile::ArgumentCount) * static_cast<int>(sizeof(Register)))); storePtr(callFrameRegister, Address(callFrameRegister, (registerOffset + RegisterFile::CallerFrame) * static_cast<int>(sizeof(Register)))); storePtr(regT1, Address(callFrameRegister, (registerOffset + RegisterFile::ScopeChain) * static_cast<int>(sizeof(Register)))); @@ -281,64 +679,36 @@ void JIT::compileOpCallSlowCase(Instruction* instruction, Vector<SlowCaseEntry>: // First, in the case of a construct, allocate the new object. if (opcodeID == op_construct) { - JITStubCall(this, JITStubs::cti_op_construct_JSConstruct).call(registerOffset - RegisterFile::CallFrameHeaderSize - argCount); + JITStubCall(this, cti_op_construct_JSConstruct).call(registerOffset - RegisterFile::CallFrameHeaderSize - argCount); emitGetVirtualRegister(callee, regT2); } - move(Imm32(argCount), regT1); - // Speculatively roll the callframe, assuming argCount will match the arity. storePtr(callFrameRegister, Address(callFrameRegister, (RegisterFile::CallerFrame + registerOffset) * static_cast<int>(sizeof(Register)))); addPtr(Imm32(registerOffset * static_cast<int>(sizeof(Register))), callFrameRegister); + move(Imm32(argCount), regT1); - m_callStructureStubCompilationInfo[callLinkInfoIndex].callReturnLocation = - emitNakedCall(m_globalData->jitStubs.ctiVirtualCallPreLink()); - - Jump storeResultForFirstRun = jump(); + m_callStructureStubCompilationInfo[callLinkInfoIndex].callReturnLocation = emitNakedCall(m_globalData->jitStubs.ctiVirtualCallLink()); - // This is the address for the cold path *after* the first run (which tries to link the call). - m_callStructureStubCompilationInfo[callLinkInfoIndex].coldPathOther = MacroAssembler::Label(this); + // Put the return value in dst. + emitPutVirtualRegister(dst); + sampleCodeBlock(m_codeBlock); - // The arguments have been set up on the hot path for op_call_eval - if (opcodeID == op_call) - compileOpCallSetupArgs(instruction); - else if (opcodeID == op_construct) - compileOpConstructSetupArgs(instruction); + // If not, we need an extra case in the if below! + ASSERT(OPCODE_LENGTH(op_call) == OPCODE_LENGTH(op_call_eval)); - // Check for JSFunctions. - Jump isNotObject = emitJumpIfNotJSCell(regT2); - Jump isJSFunction = branchPtr(Equal, Address(regT2), ImmPtr(m_globalData->jsFunctionVPtr)); + // Done! - return back to the hot path. + if (opcodeID == op_construct) + emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_construct)); + else + emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_call)); // This handles host functions - isNotObject.link(this); callLinkFailNotObject.link(this); callLinkFailNotJSFunction.link(this); - JITStubCall stubCall(this, opcodeID == op_construct ? JITStubs::cti_op_construct_NotJSConstruct : JITStubs::cti_op_call_NotJSFunction); - stubCall.call(); - Jump wasNotJSFunction = jump(); - - // Next, handle JSFunctions... - isJSFunction.link(this); + JITStubCall(this, opcodeID == op_construct ? cti_op_construct_NotJSConstruct : cti_op_call_NotJSFunction).call(); - // First, in the case of a construct, allocate the new object. - if (opcodeID == op_construct) { - JITStubCall stubCall(this, JITStubs::cti_op_construct_JSConstruct); - stubCall.call(registerOffset - RegisterFile::CallFrameHeaderSize - argCount); - emitGetVirtualRegister(callee, regT2); - } - - // Speculatively roll the callframe, assuming argCount will match the arity. - storePtr(callFrameRegister, Address(callFrameRegister, (RegisterFile::CallerFrame + registerOffset) * static_cast<int>(sizeof(Register)))); - addPtr(Imm32(registerOffset * static_cast<int>(sizeof(Register))), callFrameRegister); - move(Imm32(argCount), regT1); - - emitNakedCall(m_globalData->jitStubs.ctiVirtualCall()); - - // Put the return value in dst. In the interpreter, op_ret does this. - wasNotJSFunction.link(this); - storeResultForFirstRun.link(this); emitPutVirtualRegister(dst); - sampleCodeBlock(m_codeBlock); } @@ -346,6 +716,8 @@ void JIT::compileOpCallSlowCase(Instruction* instruction, Vector<SlowCaseEntry>: #endif // !ENABLE(JIT_OPTIMIZE_CALL) +#endif // USE(JSVALUE32_64) + } // namespace JSC #endif // ENABLE(JIT) diff --git a/JavaScriptCore/jit/JITCode.h b/JavaScriptCore/jit/JITCode.h index 7ee644b..69cf167 100644 --- a/JavaScriptCore/jit/JITCode.h +++ b/JavaScriptCore/jit/JITCode.h @@ -76,20 +76,19 @@ namespace JSC { // Execute the code! inline JSValue execute(RegisterFile* registerFile, CallFrame* callFrame, JSGlobalData* globalData, JSValue* exception) { - return JSValue::decode(ctiTrampoline( -#if PLATFORM(X86_64) - 0, 0, 0, 0, 0, 0, -#endif - m_ref.m_code.executableAddress(), registerFile, callFrame, exception, Profiler::enabledProfilerReference(), globalData)); + return JSValue::decode(ctiTrampoline(m_ref.m_code.executableAddress(), registerFile, callFrame, exception, Profiler::enabledProfilerReference(), globalData)); + } + + void* start() + { + return m_ref.m_code.dataLocation(); } -#ifndef NDEBUG size_t size() { ASSERT(m_ref.m_code.executableAddress()); return m_ref.m_size; } -#endif ExecutablePool* getExecutablePool() { diff --git a/JavaScriptCore/jit/JITInlineMethods.h b/JavaScriptCore/jit/JITInlineMethods.h index b3dc418..b5aaafc 100644 --- a/JavaScriptCore/jit/JITInlineMethods.h +++ b/JavaScriptCore/jit/JITInlineMethods.h @@ -30,66 +30,9 @@ #if ENABLE(JIT) -#if PLATFORM(WIN) -#undef FIELD_OFFSET // Fix conflict with winnt.h. -#endif - -// FIELD_OFFSET: Like the C++ offsetof macro, but you can use it with classes. -// The magic number 0x4000 is insignificant. We use it to avoid using NULL, since -// NULL can cause compiler problems, especially in cases of multiple inheritance. -#define FIELD_OFFSET(class, field) (reinterpret_cast<ptrdiff_t>(&(reinterpret_cast<class*>(0x4000)->field)) - 0x4000) - namespace JSC { -ALWAYS_INLINE void JIT::killLastResultRegister() -{ - m_lastResultBytecodeRegister = std::numeric_limits<int>::max(); -} - -// get arg puts an arg from the SF register array into a h/w register -ALWAYS_INLINE void JIT::emitGetVirtualRegister(int src, RegisterID dst) -{ - ASSERT(m_bytecodeIndex != (unsigned)-1); // This method should only be called during hot/cold path generation, so that m_bytecodeIndex is set. - - // TODO: we want to reuse values that are already in registers if we can - add a register allocator! - if (m_codeBlock->isConstantRegisterIndex(src)) { - JSValue value = m_codeBlock->getConstant(src); - move(ImmPtr(JSValue::encode(value)), dst); - killLastResultRegister(); - return; - } - - if (src == m_lastResultBytecodeRegister && m_codeBlock->isTemporaryRegisterIndex(src)) { - bool atJumpTarget = false; - while (m_jumpTargetsPosition < m_codeBlock->numberOfJumpTargets() && m_codeBlock->jumpTarget(m_jumpTargetsPosition) <= m_bytecodeIndex) { - if (m_codeBlock->jumpTarget(m_jumpTargetsPosition) == m_bytecodeIndex) - atJumpTarget = true; - ++m_jumpTargetsPosition; - } - - if (!atJumpTarget) { - // The argument we want is already stored in eax - if (dst != cachedResultRegister) - move(cachedResultRegister, dst); - killLastResultRegister(); - return; - } - } - - loadPtr(Address(callFrameRegister, src * sizeof(Register)), dst); - killLastResultRegister(); -} - -ALWAYS_INLINE void JIT::emitGetVirtualRegisters(int src1, RegisterID dst1, int src2, RegisterID dst2) -{ - if (src2 == m_lastResultBytecodeRegister) { - emitGetVirtualRegister(src2, dst2); - emitGetVirtualRegister(src1, dst1); - } else { - emitGetVirtualRegister(src1, dst1); - emitGetVirtualRegister(src2, dst2); - } -} +/* Deprecated: Please use JITStubCall instead. */ // puts an arg onto the stack, as an arg to a context threaded function. ALWAYS_INLINE void JIT::emitPutJITStubArg(RegisterID src, unsigned argumentNumber) @@ -97,16 +40,22 @@ ALWAYS_INLINE void JIT::emitPutJITStubArg(RegisterID src, unsigned argumentNumbe poke(src, argumentNumber); } +/* Deprecated: Please use JITStubCall instead. */ + ALWAYS_INLINE void JIT::emitPutJITStubArgConstant(unsigned value, unsigned argumentNumber) { poke(Imm32(value), argumentNumber); } +/* Deprecated: Please use JITStubCall instead. */ + ALWAYS_INLINE void JIT::emitPutJITStubArgConstant(void* value, unsigned argumentNumber) { poke(ImmPtr(value), argumentNumber); } +/* Deprecated: Please use JITStubCall instead. */ + ALWAYS_INLINE void JIT::emitGetJITStubArg(unsigned argumentNumber, RegisterID dst) { peek(dst, argumentNumber); @@ -118,30 +67,6 @@ ALWAYS_INLINE JSValue JIT::getConstantOperand(unsigned src) return m_codeBlock->getConstant(src); } -ALWAYS_INLINE int32_t JIT::getConstantOperandImmediateInt(unsigned src) -{ - return getConstantOperand(src).getInt32Fast(); -} - -ALWAYS_INLINE bool JIT::isOperandConstantImmediateInt(unsigned src) -{ - return m_codeBlock->isConstantRegisterIndex(src) && getConstantOperand(src).isInt32Fast(); -} - -// get arg puts an arg from the SF register array onto the stack, as an arg to a context threaded function. -ALWAYS_INLINE void JIT::emitPutJITStubArgFromVirtualRegister(unsigned src, unsigned argumentNumber, RegisterID scratch) -{ - if (m_codeBlock->isConstantRegisterIndex(src)) { - JSValue value = m_codeBlock->getConstant(src); - emitPutJITStubArgConstant(JSValue::encode(value), argumentNumber); - } else { - loadPtr(Address(callFrameRegister, src * sizeof(Register)), scratch); - emitPutJITStubArg(scratch, argumentNumber); - } - - killLastResultRegister(); -} - ALWAYS_INLINE void JIT::emitPutToCallFrameHeader(RegisterID from, RegisterFile::CallFrameHeaderEntry entry) { storePtr(from, Address(callFrameRegister, entry * sizeof(Register))); @@ -155,26 +80,17 @@ ALWAYS_INLINE void JIT::emitPutImmediateToCallFrameHeader(void* value, RegisterF ALWAYS_INLINE void JIT::emitGetFromCallFrameHeaderPtr(RegisterFile::CallFrameHeaderEntry entry, RegisterID to, RegisterID from) { loadPtr(Address(from, entry * sizeof(Register)), to); +#if !USE(JSVALUE32_64) killLastResultRegister(); +#endif } ALWAYS_INLINE void JIT::emitGetFromCallFrameHeader32(RegisterFile::CallFrameHeaderEntry entry, RegisterID to, RegisterID from) { load32(Address(from, entry * sizeof(Register)), to); +#if !USE(JSVALUE32_64) killLastResultRegister(); -} - -ALWAYS_INLINE void JIT::emitPutVirtualRegister(unsigned dst, RegisterID from) -{ - storePtr(from, Address(callFrameRegister, dst * sizeof(Register))); - m_lastResultBytecodeRegister = (from == cachedResultRegister) ? dst : std::numeric_limits<int>::max(); - // FIXME: #ifndef NDEBUG, Write the correct m_type to the register. -} - -ALWAYS_INLINE void JIT::emitInitRegister(unsigned dst) -{ - storePtr(ImmPtr(JSValue::encode(jsUndefined())), Address(callFrameRegister, dst * sizeof(Register))); - // FIXME: #ifndef NDEBUG, Write the correct m_type to the register. +#endif } ALWAYS_INLINE JIT::Call JIT::emitNakedCall(CodePtr function) @@ -186,9 +102,9 @@ ALWAYS_INLINE JIT::Call JIT::emitNakedCall(CodePtr function) return nakedCall; } -#if PLATFORM(X86) || PLATFORM(X86_64) +#if PLATFORM(X86) || PLATFORM(X86_64) || (PLATFORM(ARM) && !PLATFORM_ARM_ARCH(7)) -ALWAYS_INLINE void JIT::preverveReturnAddressAfterCall(RegisterID reg) +ALWAYS_INLINE void JIT::preserveReturnAddressAfterCall(RegisterID reg) { pop(reg); } @@ -203,9 +119,9 @@ ALWAYS_INLINE void JIT::restoreReturnAddressBeforeReturn(Address address) push(address); } -#elif PLATFORM(ARM_V7) +#elif PLATFORM_ARM_ARCH(7) -ALWAYS_INLINE void JIT::preverveReturnAddressAfterCall(RegisterID reg) +ALWAYS_INLINE void JIT::preserveReturnAddressAfterCall(RegisterID reg) { move(linkRegister, reg); } @@ -225,21 +141,24 @@ ALWAYS_INLINE void JIT::restoreReturnAddressBeforeReturn(Address address) #if USE(JIT_STUB_ARGUMENT_VA_LIST) ALWAYS_INLINE void JIT::restoreArgumentReference() { - poke(callFrameRegister, offsetof(struct JITStackFrame, callFrame) / sizeof (void*)); + poke(callFrameRegister, OBJECT_OFFSETOF(struct JITStackFrame, callFrame) / sizeof (void*)); } ALWAYS_INLINE void JIT::restoreArgumentReferenceForTrampoline() {} #else ALWAYS_INLINE void JIT::restoreArgumentReference() { move(stackPointerRegister, firstArgumentRegister); - poke(callFrameRegister, offsetof(struct JITStackFrame, callFrame) / sizeof (void*)); + poke(callFrameRegister, OBJECT_OFFSETOF(struct JITStackFrame, callFrame) / sizeof (void*)); +#if PLATFORM(ARM) && !PLATFORM_ARM_ARCH(7) + move(ctiReturnRegister, ARM::lr); +#endif } ALWAYS_INLINE void JIT::restoreArgumentReferenceForTrampoline() { #if PLATFORM(X86) // Within a trampoline the return address will be on the stack at this point. addPtr(Imm32(sizeof(void*)), stackPointerRegister, firstArgumentRegister); -#elif PLATFORM(ARM_V7) +#elif PLATFORM_ARM_ARCH(7) move(stackPointerRegister, firstArgumentRegister); #endif // In the trampoline on x86-64, the first argument register is not overwritten. @@ -248,12 +167,477 @@ ALWAYS_INLINE void JIT::restoreArgumentReferenceForTrampoline() ALWAYS_INLINE JIT::Jump JIT::checkStructure(RegisterID reg, Structure* structure) { - return branchPtr(NotEqual, Address(reg, FIELD_OFFSET(JSCell, m_structure)), ImmPtr(structure)); + return branchPtr(NotEqual, Address(reg, OBJECT_OFFSETOF(JSCell, m_structure)), ImmPtr(structure)); +} + +ALWAYS_INLINE void JIT::linkSlowCaseIfNotJSCell(Vector<SlowCaseEntry>::iterator& iter, int vReg) +{ + if (!m_codeBlock->isKnownNotImmediate(vReg)) + linkSlowCase(iter); +} + +ALWAYS_INLINE void JIT::addSlowCase(Jump jump) +{ + ASSERT(m_bytecodeIndex != (unsigned)-1); // This method should only be called during hot/cold path generation, so that m_bytecodeIndex is set. + + m_slowCases.append(SlowCaseEntry(jump, m_bytecodeIndex)); +} + +ALWAYS_INLINE void JIT::addSlowCase(JumpList jumpList) +{ + ASSERT(m_bytecodeIndex != (unsigned)-1); // This method should only be called during hot/cold path generation, so that m_bytecodeIndex is set. + + const JumpList::JumpVector& jumpVector = jumpList.jumps(); + size_t size = jumpVector.size(); + for (size_t i = 0; i < size; ++i) + m_slowCases.append(SlowCaseEntry(jumpVector[i], m_bytecodeIndex)); +} + +ALWAYS_INLINE void JIT::addJump(Jump jump, int relativeOffset) +{ + ASSERT(m_bytecodeIndex != (unsigned)-1); // This method should only be called during hot/cold path generation, so that m_bytecodeIndex is set. + + m_jmpTable.append(JumpTable(jump, m_bytecodeIndex + relativeOffset)); +} + +ALWAYS_INLINE void JIT::emitJumpSlowToHot(Jump jump, int relativeOffset) +{ + ASSERT(m_bytecodeIndex != (unsigned)-1); // This method should only be called during hot/cold path generation, so that m_bytecodeIndex is set. + + jump.linkTo(m_labels[m_bytecodeIndex + relativeOffset], this); +} + +#if ENABLE(SAMPLING_FLAGS) +ALWAYS_INLINE void JIT::setSamplingFlag(int32_t flag) +{ + ASSERT(flag >= 1); + ASSERT(flag <= 32); + or32(Imm32(1u << (flag - 1)), AbsoluteAddress(&SamplingFlags::s_flags)); +} + +ALWAYS_INLINE void JIT::clearSamplingFlag(int32_t flag) +{ + ASSERT(flag >= 1); + ASSERT(flag <= 32); + and32(Imm32(~(1u << (flag - 1))), AbsoluteAddress(&SamplingFlags::s_flags)); +} +#endif + +#if ENABLE(SAMPLING_COUNTERS) +ALWAYS_INLINE void JIT::emitCount(AbstractSamplingCounter& counter, uint32_t count) +{ +#if PLATFORM(X86_64) // Or any other 64-bit plattform. + addPtr(Imm32(count), AbsoluteAddress(&counter.m_counter)); +#elif PLATFORM(X86) // Or any other little-endian 32-bit plattform. + intptr_t hiWord = reinterpret_cast<intptr_t>(&counter.m_counter) + sizeof(int32_t); + add32(Imm32(count), AbsoluteAddress(&counter.m_counter)); + addWithCarry32(Imm32(0), AbsoluteAddress(reinterpret_cast<void*>(hiWord))); +#else +#error "SAMPLING_FLAGS not implemented on this platform." +#endif +} +#endif + +#if ENABLE(OPCODE_SAMPLING) +#if PLATFORM(X86_64) +ALWAYS_INLINE void JIT::sampleInstruction(Instruction* instruction, bool inHostFunction) +{ + move(ImmPtr(m_interpreter->sampler()->sampleSlot()), X86::ecx); + storePtr(ImmPtr(m_interpreter->sampler()->encodeSample(instruction, inHostFunction)), X86::ecx); +} +#else +ALWAYS_INLINE void JIT::sampleInstruction(Instruction* instruction, bool inHostFunction) +{ + storePtr(ImmPtr(m_interpreter->sampler()->encodeSample(instruction, inHostFunction)), m_interpreter->sampler()->sampleSlot()); +} +#endif +#endif + +#if ENABLE(CODEBLOCK_SAMPLING) +#if PLATFORM(X86_64) +ALWAYS_INLINE void JIT::sampleCodeBlock(CodeBlock* codeBlock) +{ + move(ImmPtr(m_interpreter->sampler()->codeBlockSlot()), X86::ecx); + storePtr(ImmPtr(codeBlock), X86::ecx); +} +#else +ALWAYS_INLINE void JIT::sampleCodeBlock(CodeBlock* codeBlock) +{ + storePtr(ImmPtr(codeBlock), m_interpreter->sampler()->codeBlockSlot()); +} +#endif +#endif + +#if USE(JSVALUE32_64) + +inline JIT::Address JIT::tagFor(unsigned index, RegisterID base) +{ + return Address(base, (index * sizeof(Register)) + OBJECT_OFFSETOF(JSValue, u.asBits.tag)); +} + +inline JIT::Address JIT::payloadFor(unsigned index, RegisterID base) +{ + return Address(base, (index * sizeof(Register)) + OBJECT_OFFSETOF(JSValue, u.asBits.payload)); +} + +inline JIT::Address JIT::addressFor(unsigned index, RegisterID base) +{ + return Address(base, (index * sizeof(Register))); +} + +inline void JIT::emitLoadTag(unsigned index, RegisterID tag) +{ + RegisterID mappedTag; + if (getMappedTag(index, mappedTag)) { + move(mappedTag, tag); + unmap(tag); + return; + } + + if (m_codeBlock->isConstantRegisterIndex(index)) { + move(Imm32(getConstantOperand(index).tag()), tag); + unmap(tag); + return; + } + + load32(tagFor(index), tag); + unmap(tag); +} + +inline void JIT::emitLoadPayload(unsigned index, RegisterID payload) +{ + RegisterID mappedPayload; + if (getMappedPayload(index, mappedPayload)) { + move(mappedPayload, payload); + unmap(payload); + return; + } + + if (m_codeBlock->isConstantRegisterIndex(index)) { + move(Imm32(getConstantOperand(index).payload()), payload); + unmap(payload); + return; + } + + load32(payloadFor(index), payload); + unmap(payload); +} + +inline void JIT::emitLoad(const JSValue& v, RegisterID tag, RegisterID payload) +{ + move(Imm32(v.payload()), payload); + move(Imm32(v.tag()), tag); +} + +inline void JIT::emitLoad(unsigned index, RegisterID tag, RegisterID payload, RegisterID base) +{ + ASSERT(tag != payload); + + if (base == callFrameRegister) { + ASSERT(payload != base); + emitLoadPayload(index, payload); + emitLoadTag(index, tag); + return; + } + + if (payload == base) { // avoid stomping base + load32(tagFor(index, base), tag); + load32(payloadFor(index, base), payload); + return; + } + + load32(payloadFor(index, base), payload); + load32(tagFor(index, base), tag); +} + +inline void JIT::emitLoad2(unsigned index1, RegisterID tag1, RegisterID payload1, unsigned index2, RegisterID tag2, RegisterID payload2) +{ + if (isMapped(index1)) { + emitLoad(index1, tag1, payload1); + emitLoad(index2, tag2, payload2); + return; + } + emitLoad(index2, tag2, payload2); + emitLoad(index1, tag1, payload1); +} + +inline void JIT::emitLoadDouble(unsigned index, FPRegisterID value) +{ + if (m_codeBlock->isConstantRegisterIndex(index)) { + Register& inConstantPool = m_codeBlock->constantRegister(index); + loadDouble(&inConstantPool, value); + } else + loadDouble(addressFor(index), value); +} + +inline void JIT::emitLoadInt32ToDouble(unsigned index, FPRegisterID value) +{ + if (m_codeBlock->isConstantRegisterIndex(index)) { + Register& inConstantPool = m_codeBlock->constantRegister(index); + char* bytePointer = reinterpret_cast<char*>(&inConstantPool); + convertInt32ToDouble(AbsoluteAddress(bytePointer + OBJECT_OFFSETOF(JSValue, u.asBits.payload)), value); + } else + convertInt32ToDouble(payloadFor(index), value); +} + +inline void JIT::emitStore(unsigned index, RegisterID tag, RegisterID payload, RegisterID base) +{ + store32(payload, payloadFor(index, base)); + store32(tag, tagFor(index, base)); +} + +inline void JIT::emitStoreInt32(unsigned index, RegisterID payload, bool indexIsInt32) +{ + store32(payload, payloadFor(index, callFrameRegister)); + if (!indexIsInt32) + store32(Imm32(JSValue::Int32Tag), tagFor(index, callFrameRegister)); +} + +inline void JIT::emitStoreInt32(unsigned index, Imm32 payload, bool indexIsInt32) +{ + store32(payload, payloadFor(index, callFrameRegister)); + if (!indexIsInt32) + store32(Imm32(JSValue::Int32Tag), tagFor(index, callFrameRegister)); +} + +inline void JIT::emitStoreCell(unsigned index, RegisterID payload, bool indexIsCell) +{ + store32(payload, payloadFor(index, callFrameRegister)); + if (!indexIsCell) + store32(Imm32(JSValue::CellTag), tagFor(index, callFrameRegister)); +} + +inline void JIT::emitStoreBool(unsigned index, RegisterID tag, bool indexIsBool) +{ + if (!indexIsBool) + store32(Imm32(0), payloadFor(index, callFrameRegister)); + store32(tag, tagFor(index, callFrameRegister)); +} + +inline void JIT::emitStoreDouble(unsigned index, FPRegisterID value) +{ + storeDouble(value, addressFor(index)); +} + +inline void JIT::emitStore(unsigned index, const JSValue constant, RegisterID base) +{ + store32(Imm32(constant.payload()), payloadFor(index, base)); + store32(Imm32(constant.tag()), tagFor(index, base)); +} + +ALWAYS_INLINE void JIT::emitInitRegister(unsigned dst) +{ + emitStore(dst, jsUndefined()); +} + +inline bool JIT::isLabeled(unsigned bytecodeIndex) +{ + for (size_t numberOfJumpTargets = m_codeBlock->numberOfJumpTargets(); m_jumpTargetIndex != numberOfJumpTargets; ++m_jumpTargetIndex) { + unsigned jumpTarget = m_codeBlock->jumpTarget(m_jumpTargetIndex); + if (jumpTarget == bytecodeIndex) + return true; + if (jumpTarget > bytecodeIndex) + return false; + } + return false; +} + +inline void JIT::map(unsigned bytecodeIndex, unsigned virtualRegisterIndex, RegisterID tag, RegisterID payload) +{ + if (isLabeled(bytecodeIndex)) + return; + + m_mappedBytecodeIndex = bytecodeIndex; + m_mappedVirtualRegisterIndex = virtualRegisterIndex; + m_mappedTag = tag; + m_mappedPayload = payload; +} + +inline void JIT::unmap(RegisterID registerID) +{ + if (m_mappedTag == registerID) + m_mappedTag = (RegisterID)-1; + else if (m_mappedPayload == registerID) + m_mappedPayload = (RegisterID)-1; +} + +inline void JIT::unmap() +{ + m_mappedBytecodeIndex = (unsigned)-1; + m_mappedVirtualRegisterIndex = (unsigned)-1; + m_mappedTag = (RegisterID)-1; + m_mappedPayload = (RegisterID)-1; +} + +inline bool JIT::isMapped(unsigned virtualRegisterIndex) +{ + if (m_mappedBytecodeIndex != m_bytecodeIndex) + return false; + if (m_mappedVirtualRegisterIndex != virtualRegisterIndex) + return false; + return true; +} + +inline bool JIT::getMappedPayload(unsigned virtualRegisterIndex, RegisterID& payload) +{ + if (m_mappedBytecodeIndex != m_bytecodeIndex) + return false; + if (m_mappedVirtualRegisterIndex != virtualRegisterIndex) + return false; + if (m_mappedPayload == (RegisterID)-1) + return false; + payload = m_mappedPayload; + return true; +} + +inline bool JIT::getMappedTag(unsigned virtualRegisterIndex, RegisterID& tag) +{ + if (m_mappedBytecodeIndex != m_bytecodeIndex) + return false; + if (m_mappedVirtualRegisterIndex != virtualRegisterIndex) + return false; + if (m_mappedTag == (RegisterID)-1) + return false; + tag = m_mappedTag; + return true; +} + +inline void JIT::emitJumpSlowCaseIfNotJSCell(unsigned virtualRegisterIndex) +{ + if (!m_codeBlock->isKnownNotImmediate(virtualRegisterIndex)) + addSlowCase(branch32(NotEqual, tagFor(virtualRegisterIndex), Imm32(JSValue::CellTag))); +} + +inline void JIT::emitJumpSlowCaseIfNotJSCell(unsigned virtualRegisterIndex, RegisterID tag) +{ + if (!m_codeBlock->isKnownNotImmediate(virtualRegisterIndex)) + addSlowCase(branch32(NotEqual, tag, Imm32(JSValue::CellTag))); +} + +inline void JIT::linkSlowCaseIfNotJSCell(Vector<SlowCaseEntry>::iterator& iter, unsigned virtualRegisterIndex) +{ + if (!m_codeBlock->isKnownNotImmediate(virtualRegisterIndex)) + linkSlowCase(iter); +} + +ALWAYS_INLINE bool JIT::isOperandConstantImmediateInt(unsigned src) +{ + return m_codeBlock->isConstantRegisterIndex(src) && getConstantOperand(src).isInt32(); +} + +ALWAYS_INLINE bool JIT::getOperandConstantImmediateInt(unsigned op1, unsigned op2, unsigned& op, int32_t& constant) +{ + if (isOperandConstantImmediateInt(op1)) { + constant = getConstantOperand(op1).asInt32(); + op = op2; + return true; + } + + if (isOperandConstantImmediateInt(op2)) { + constant = getConstantOperand(op2).asInt32(); + op = op1; + return true; + } + + return false; +} + +ALWAYS_INLINE bool JIT::isOperandConstantImmediateDouble(unsigned src) +{ + return m_codeBlock->isConstantRegisterIndex(src) && getConstantOperand(src).isDouble(); +} + +/* Deprecated: Please use JITStubCall instead. */ + +ALWAYS_INLINE void JIT::emitPutJITStubArgFromVirtualRegister(unsigned src, unsigned argumentNumber, RegisterID scratch1, RegisterID scratch2) +{ + if (m_codeBlock->isConstantRegisterIndex(src)) { + JSValue constant = m_codeBlock->getConstant(src); + poke(Imm32(constant.payload()), argumentNumber); + poke(Imm32(constant.tag()), argumentNumber + 1); + } else { + emitLoad(src, scratch1, scratch2); + poke(scratch2, argumentNumber); + poke(scratch1, argumentNumber + 1); + } +} + +#else // USE(JSVALUE32_64) + +ALWAYS_INLINE void JIT::killLastResultRegister() +{ + m_lastResultBytecodeRegister = std::numeric_limits<int>::max(); +} + +// get arg puts an arg from the SF register array into a h/w register +ALWAYS_INLINE void JIT::emitGetVirtualRegister(int src, RegisterID dst) +{ + ASSERT(m_bytecodeIndex != (unsigned)-1); // This method should only be called during hot/cold path generation, so that m_bytecodeIndex is set. + + // TODO: we want to reuse values that are already in registers if we can - add a register allocator! + if (m_codeBlock->isConstantRegisterIndex(src)) { + JSValue value = m_codeBlock->getConstant(src); + move(ImmPtr(JSValue::encode(value)), dst); + killLastResultRegister(); + return; + } + + if (src == m_lastResultBytecodeRegister && m_codeBlock->isTemporaryRegisterIndex(src)) { + bool atJumpTarget = false; + while (m_jumpTargetsPosition < m_codeBlock->numberOfJumpTargets() && m_codeBlock->jumpTarget(m_jumpTargetsPosition) <= m_bytecodeIndex) { + if (m_codeBlock->jumpTarget(m_jumpTargetsPosition) == m_bytecodeIndex) + atJumpTarget = true; + ++m_jumpTargetsPosition; + } + + if (!atJumpTarget) { + // The argument we want is already stored in eax + if (dst != cachedResultRegister) + move(cachedResultRegister, dst); + killLastResultRegister(); + return; + } + } + + loadPtr(Address(callFrameRegister, src * sizeof(Register)), dst); + killLastResultRegister(); +} + +ALWAYS_INLINE void JIT::emitGetVirtualRegisters(int src1, RegisterID dst1, int src2, RegisterID dst2) +{ + if (src2 == m_lastResultBytecodeRegister) { + emitGetVirtualRegister(src2, dst2); + emitGetVirtualRegister(src1, dst1); + } else { + emitGetVirtualRegister(src1, dst1); + emitGetVirtualRegister(src2, dst2); + } +} + +ALWAYS_INLINE int32_t JIT::getConstantOperandImmediateInt(unsigned src) +{ + return getConstantOperand(src).asInt32(); +} + +ALWAYS_INLINE bool JIT::isOperandConstantImmediateInt(unsigned src) +{ + return m_codeBlock->isConstantRegisterIndex(src) && getConstantOperand(src).isInt32(); +} + +ALWAYS_INLINE void JIT::emitPutVirtualRegister(unsigned dst, RegisterID from) +{ + storePtr(from, Address(callFrameRegister, dst * sizeof(Register))); + m_lastResultBytecodeRegister = (from == cachedResultRegister) ? dst : std::numeric_limits<int>::max(); +} + +ALWAYS_INLINE void JIT::emitInitRegister(unsigned dst) +{ + storePtr(ImmPtr(JSValue::encode(jsUndefined())), Address(callFrameRegister, dst * sizeof(Register))); } ALWAYS_INLINE JIT::Jump JIT::emitJumpIfJSCell(RegisterID reg) { -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) return branchTestPtr(Zero, reg, tagMaskRegister); #else return branchTest32(Zero, reg, Imm32(JSImmediate::TagMask)); @@ -274,7 +658,7 @@ ALWAYS_INLINE void JIT::emitJumpSlowCaseIfJSCell(RegisterID reg) ALWAYS_INLINE JIT::Jump JIT::emitJumpIfNotJSCell(RegisterID reg) { -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) return branchTestPtr(NonZero, reg, tagMaskRegister); #else return branchTest32(NonZero, reg, Imm32(JSImmediate::TagMask)); @@ -292,13 +676,7 @@ ALWAYS_INLINE void JIT::emitJumpSlowCaseIfNotJSCell(RegisterID reg, int vReg) emitJumpSlowCaseIfNotJSCell(reg); } -ALWAYS_INLINE void JIT::linkSlowCaseIfNotJSCell(Vector<SlowCaseEntry>::iterator& iter, int vReg) -{ - if (!m_codeBlock->isKnownNotImmediate(vReg)) - linkSlowCase(iter); -} - -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) ALWAYS_INLINE JIT::Jump JIT::emitJumpIfImmediateNumber(RegisterID reg) { return branchTestPtr(NonZero, reg, tagTypeNumberRegister); @@ -311,7 +689,7 @@ ALWAYS_INLINE JIT::Jump JIT::emitJumpIfNotImmediateNumber(RegisterID reg) ALWAYS_INLINE JIT::Jump JIT::emitJumpIfImmediateInteger(RegisterID reg) { -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) return branchPtr(AboveOrEqual, reg, tagTypeNumberRegister); #else return branchTest32(NonZero, reg, Imm32(JSImmediate::TagTypeNumber)); @@ -320,7 +698,7 @@ ALWAYS_INLINE JIT::Jump JIT::emitJumpIfImmediateInteger(RegisterID reg) ALWAYS_INLINE JIT::Jump JIT::emitJumpIfNotImmediateInteger(RegisterID reg) { -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) return branchPtr(Below, reg, tagTypeNumberRegister); #else return branchTest32(Zero, reg, Imm32(JSImmediate::TagTypeNumber)); @@ -344,7 +722,7 @@ ALWAYS_INLINE void JIT::emitJumpSlowCaseIfNotImmediateIntegers(RegisterID reg1, addSlowCase(emitJumpIfNotImmediateIntegers(reg1, reg2, scratch)); } -#if !USE(ALTERNATE_JSIMMEDIATE) +#if !USE(JSVALUE64) ALWAYS_INLINE void JIT::emitFastArithDeTagImmediate(RegisterID reg) { subPtr(Imm32(JSImmediate::TagTypeNumber), reg); @@ -358,7 +736,7 @@ ALWAYS_INLINE JIT::Jump JIT::emitFastArithDeTagImmediateJumpIfZero(RegisterID re ALWAYS_INLINE void JIT::emitFastArithReTagImmediate(RegisterID src, RegisterID dest) { -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) emitFastArithIntToImmNoCheck(src, dest); #else if (src != dest) @@ -369,7 +747,7 @@ ALWAYS_INLINE void JIT::emitFastArithReTagImmediate(RegisterID src, RegisterID d ALWAYS_INLINE void JIT::emitFastArithImmToInt(RegisterID reg) { -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) UNUSED_PARAM(reg); #else rshiftPtr(Imm32(JSImmediate::IntegerPayloadShift), reg); @@ -379,7 +757,7 @@ ALWAYS_INLINE void JIT::emitFastArithImmToInt(RegisterID reg) // operand is int32_t, must have been zero-extended if register is 64-bit. ALWAYS_INLINE void JIT::emitFastArithIntToImmNoCheck(RegisterID src, RegisterID dest) { -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) if (src != dest) move(src, dest); orPtr(tagTypeNumberRegister, dest); @@ -396,88 +774,25 @@ ALWAYS_INLINE void JIT::emitTagAsBoolImmediate(RegisterID reg) or32(Imm32(static_cast<int32_t>(JSImmediate::FullTagTypeBool)), reg); } -ALWAYS_INLINE void JIT::addSlowCase(Jump jump) -{ - ASSERT(m_bytecodeIndex != (unsigned)-1); // This method should only be called during hot/cold path generation, so that m_bytecodeIndex is set. - - m_slowCases.append(SlowCaseEntry(jump, m_bytecodeIndex)); -} - -ALWAYS_INLINE void JIT::addJump(Jump jump, int relativeOffset) -{ - ASSERT(m_bytecodeIndex != (unsigned)-1); // This method should only be called during hot/cold path generation, so that m_bytecodeIndex is set. - - m_jmpTable.append(JumpTable(jump, m_bytecodeIndex + relativeOffset)); -} - -ALWAYS_INLINE void JIT::emitJumpSlowToHot(Jump jump, int relativeOffset) -{ - ASSERT(m_bytecodeIndex != (unsigned)-1); // This method should only be called during hot/cold path generation, so that m_bytecodeIndex is set. - - jump.linkTo(m_labels[m_bytecodeIndex + relativeOffset], this); -} +/* Deprecated: Please use JITStubCall instead. */ -#if ENABLE(SAMPLING_FLAGS) -ALWAYS_INLINE void JIT::setSamplingFlag(int32_t flag) -{ - ASSERT(flag >= 1); - ASSERT(flag <= 32); - or32(Imm32(1u << (flag - 1)), AbsoluteAddress(&SamplingFlags::s_flags)); -} - -ALWAYS_INLINE void JIT::clearSamplingFlag(int32_t flag) +// get arg puts an arg from the SF register array onto the stack, as an arg to a context threaded function. +ALWAYS_INLINE void JIT::emitPutJITStubArgFromVirtualRegister(unsigned src, unsigned argumentNumber, RegisterID scratch) { - ASSERT(flag >= 1); - ASSERT(flag <= 32); - and32(Imm32(~(1u << (flag - 1))), AbsoluteAddress(&SamplingFlags::s_flags)); -} -#endif + if (m_codeBlock->isConstantRegisterIndex(src)) { + JSValue value = m_codeBlock->getConstant(src); + emitPutJITStubArgConstant(JSValue::encode(value), argumentNumber); + } else { + loadPtr(Address(callFrameRegister, src * sizeof(Register)), scratch); + emitPutJITStubArg(scratch, argumentNumber); + } -#if ENABLE(SAMPLING_COUNTERS) -ALWAYS_INLINE void JIT::emitCount(AbstractSamplingCounter& counter, uint32_t count) -{ -#if PLATFORM(X86_64) // Or any other 64-bit plattform. - addPtr(Imm32(count), AbsoluteAddress(&counter.m_counter)); -#elif PLATFORM(X86) // Or any other little-endian 32-bit plattform. - intptr_t hiWord = reinterpret_cast<intptr_t>(&counter.m_counter) + sizeof(int32_t); - add32(Imm32(count), AbsoluteAddress(&counter.m_counter)); - addWithCarry32(Imm32(0), AbsoluteAddress(reinterpret_cast<void*>(hiWord))); -#else -#error "SAMPLING_FLAGS not implemented on this platform." -#endif + killLastResultRegister(); } -#endif -#if ENABLE(OPCODE_SAMPLING) -#if PLATFORM(X86_64) -ALWAYS_INLINE void JIT::sampleInstruction(Instruction* instruction, bool inHostFunction) -{ - move(ImmPtr(m_interpreter->sampler()->sampleSlot()), X86::ecx); - storePtr(ImmPtr(m_interpreter->sampler()->encodeSample(instruction, inHostFunction)), X86::ecx); -} -#else -ALWAYS_INLINE void JIT::sampleInstruction(Instruction* instruction, bool inHostFunction) -{ - storePtr(ImmPtr(m_interpreter->sampler()->encodeSample(instruction, inHostFunction)), m_interpreter->sampler()->sampleSlot()); -} -#endif -#endif +#endif // USE(JSVALUE32_64) -#if ENABLE(CODEBLOCK_SAMPLING) -#if PLATFORM(X86_64) -ALWAYS_INLINE void JIT::sampleCodeBlock(CodeBlock* codeBlock) -{ - move(ImmPtr(m_interpreter->sampler()->codeBlockSlot()), X86::ecx); - storePtr(ImmPtr(codeBlock), X86::ecx); -} -#else -ALWAYS_INLINE void JIT::sampleCodeBlock(CodeBlock* codeBlock) -{ - storePtr(ImmPtr(codeBlock), m_interpreter->sampler()->codeBlockSlot()); -} -#endif -#endif -} +} // namespace JSC #endif // ENABLE(JIT) diff --git a/JavaScriptCore/jit/JITOpcodes.cpp b/JavaScriptCore/jit/JITOpcodes.cpp index 1737551..13fc981 100644 --- a/JavaScriptCore/jit/JITOpcodes.cpp +++ b/JavaScriptCore/jit/JITOpcodes.cpp @@ -32,12 +32,1785 @@ #include "JITStubCall.h" #include "JSArray.h" #include "JSCell.h" +#include "JSFunction.h" +#include "LinkBuffer.h" namespace JSC { +#if USE(JSVALUE32_64) + +void JIT::privateCompileCTIMachineTrampolines(RefPtr<ExecutablePool>* executablePool, JSGlobalData* globalData, CodePtr* ctiStringLengthTrampoline, CodePtr* ctiVirtualCallLink, CodePtr* ctiVirtualCall, CodePtr* ctiNativeCallThunk) +{ +#if ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) + // (1) This function provides fast property access for string length + Label stringLengthBegin = align(); + + // regT0 holds payload, regT1 holds tag + + Jump string_failureCases1 = branch32(NotEqual, regT1, Imm32(JSValue::CellTag)); + Jump string_failureCases2 = branchPtr(NotEqual, Address(regT0), ImmPtr(m_globalData->jsStringVPtr)); + + // Checks out okay! - get the length from the Ustring. + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSString, m_value) + OBJECT_OFFSETOF(UString, m_rep)), regT2); + load32(Address(regT2, OBJECT_OFFSETOF(UString::Rep, len)), regT2); + + Jump string_failureCases3 = branch32(Above, regT2, Imm32(INT_MAX)); + move(regT2, regT0); + move(Imm32(JSValue::Int32Tag), regT1); + + ret(); +#endif + + // (2) Trampolines for the slow cases of op_call / op_call_eval / op_construct. + +#if ENABLE(JIT_OPTIMIZE_CALL) + /* VirtualCallLink Trampoline */ + Label virtualCallLinkBegin = align(); + + // regT0 holds callee, regT1 holds argCount. + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSFunction, m_body)), regT2); + loadPtr(Address(regT2, OBJECT_OFFSETOF(FunctionBodyNode, m_code)), regT2); + Jump hasCodeBlock2 = branchTestPtr(NonZero, regT2); + + // Lazily generate a CodeBlock. + preserveReturnAddressAfterCall(regT3); // return address + restoreArgumentReference(); + Call callJSFunction2 = call(); + move(regT0, regT2); + emitGetJITStubArg(1, regT0); // callee + emitGetJITStubArg(5, regT1); // argCount + restoreReturnAddressBeforeReturn(regT3); // return address + hasCodeBlock2.link(this); + + // regT2 holds codeBlock. + Jump isNativeFunc2 = branch32(Equal, Address(regT2, OBJECT_OFFSETOF(CodeBlock, m_codeType)), Imm32(NativeCode)); + + // Check argCount matches callee arity. + Jump arityCheckOkay2 = branch32(Equal, Address(regT2, OBJECT_OFFSETOF(CodeBlock, m_numParameters)), regT1); + preserveReturnAddressAfterCall(regT3); + emitPutJITStubArg(regT3, 3); // return address + emitPutJITStubArg(regT2, 7); // codeBlock + restoreArgumentReference(); + Call callArityCheck2 = call(); + move(regT1, callFrameRegister); + emitGetJITStubArg(1, regT0); // callee + emitGetJITStubArg(5, regT1); // argCount + restoreReturnAddressBeforeReturn(regT3); // return address + + arityCheckOkay2.link(this); + isNativeFunc2.link(this); + + compileOpCallInitializeCallFrame(); + + preserveReturnAddressAfterCall(regT3); + emitPutJITStubArg(regT3, 3); + restoreArgumentReference(); + Call callLazyLinkCall = call(); + restoreReturnAddressBeforeReturn(regT3); + jump(regT0); +#endif // ENABLE(JIT_OPTIMIZE_CALL) + + /* VirtualCall Trampoline */ + Label virtualCallBegin = align(); + + // regT0 holds callee, regT1 holds argCount. + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSFunction, m_body)), regT2); + loadPtr(Address(regT2, OBJECT_OFFSETOF(FunctionBodyNode, m_code)), regT2); + Jump hasCodeBlock3 = branchTestPtr(NonZero, regT2); + + // Lazily generate a CodeBlock. + preserveReturnAddressAfterCall(regT3); // return address + restoreArgumentReference(); + Call callJSFunction1 = call(); + move(regT0, regT2); + emitGetJITStubArg(1, regT0); // callee + emitGetJITStubArg(5, regT1); // argCount + restoreReturnAddressBeforeReturn(regT3); // return address + hasCodeBlock3.link(this); + + // regT2 holds codeBlock. + Jump isNativeFunc3 = branch32(Equal, Address(regT2, OBJECT_OFFSETOF(CodeBlock, m_codeType)), Imm32(NativeCode)); + + // Check argCount matches callee. + Jump arityCheckOkay3 = branch32(Equal, Address(regT2, OBJECT_OFFSETOF(CodeBlock, m_numParameters)), regT1); + preserveReturnAddressAfterCall(regT3); + emitPutJITStubArg(regT3, 3); // return address + emitPutJITStubArg(regT2, 7); // codeBlock + restoreArgumentReference(); + Call callArityCheck1 = call(); + move(regT1, callFrameRegister); + emitGetJITStubArg(1, regT0); // callee + emitGetJITStubArg(5, regT1); // argCount + restoreReturnAddressBeforeReturn(regT3); // return address + + arityCheckOkay3.link(this); + isNativeFunc3.link(this); + compileOpCallInitializeCallFrame(); + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSFunction, m_body)), regT0); + loadPtr(Address(regT0, OBJECT_OFFSETOF(FunctionBodyNode, m_jitCode)), regT0); + jump(regT0); + +#if PLATFORM(X86) + Label nativeCallThunk = align(); + preserveReturnAddressAfterCall(regT0); + emitPutToCallFrameHeader(regT0, RegisterFile::ReturnPC); // Push return address + + // Load caller frame's scope chain into this callframe so that whatever we call can + // get to its global data. + emitGetFromCallFrameHeaderPtr(RegisterFile::CallerFrame, regT1); + emitGetFromCallFrameHeaderPtr(RegisterFile::ScopeChain, regT1, regT1); + emitPutToCallFrameHeader(regT1, RegisterFile::ScopeChain); + + emitGetFromCallFrameHeader32(RegisterFile::ArgumentCount, regT0); + + /* We have two structs that we use to describe the stackframe we set up for our + * call to native code. NativeCallFrameStructure describes the how we set up the stack + * in advance of the call. NativeFunctionCalleeSignature describes the callframe + * as the native code expects it. We do this as we are using the fastcall calling + * convention which results in the callee popping its arguments off the stack, but + * not the rest of the callframe so we need a nice way to ensure we increment the + * stack pointer by the right amount after the call. + */ + +#if COMPILER(MSVC) || PLATFORM(LINUX) +#if COMPILER(MSVC) +#pragma pack(push) +#pragma pack(4) +#endif // COMPILER(MSVC) + struct NativeCallFrameStructure { + // CallFrame* callFrame; // passed in EDX + JSObject* callee; + JSValue thisValue; + ArgList* argPointer; + ArgList args; + JSValue result; + }; + struct NativeFunctionCalleeSignature { + JSObject* callee; + JSValue thisValue; + ArgList* argPointer; + }; +#if COMPILER(MSVC) +#pragma pack(pop) +#endif // COMPILER(MSVC) +#else + struct NativeCallFrameStructure { + // CallFrame* callFrame; // passed in ECX + // JSObject* callee; // passed in EDX + JSValue thisValue; + ArgList* argPointer; + ArgList args; + }; + struct NativeFunctionCalleeSignature { + JSValue thisValue; + ArgList* argPointer; + }; +#endif + + const int NativeCallFrameSize = (sizeof(NativeCallFrameStructure) + 15) & ~15; + // Allocate system stack frame + subPtr(Imm32(NativeCallFrameSize), stackPointerRegister); + + // Set up arguments + subPtr(Imm32(1), regT0); // Don't include 'this' in argcount + + // push argcount + storePtr(regT0, Address(stackPointerRegister, OBJECT_OFFSETOF(NativeCallFrameStructure, args) + OBJECT_OFFSETOF(ArgList, m_argCount))); + + // Calculate the start of the callframe header, and store in regT1 + addPtr(Imm32(-RegisterFile::CallFrameHeaderSize * (int)sizeof(Register)), callFrameRegister, regT1); + + // Calculate start of arguments as callframe header - sizeof(Register) * argcount (regT0) + mul32(Imm32(sizeof(Register)), regT0, regT0); + subPtr(regT0, regT1); + storePtr(regT1, Address(stackPointerRegister, OBJECT_OFFSETOF(NativeCallFrameStructure, args) + OBJECT_OFFSETOF(ArgList, m_args))); + + // ArgList is passed by reference so is stackPointerRegister + 4 * sizeof(Register) + addPtr(Imm32(OBJECT_OFFSETOF(NativeCallFrameStructure, args)), stackPointerRegister, regT0); + storePtr(regT0, Address(stackPointerRegister, OBJECT_OFFSETOF(NativeCallFrameStructure, argPointer))); + + // regT1 currently points to the first argument, regT1 - sizeof(Register) points to 'this' + loadPtr(Address(regT1, -(int)sizeof(Register) + OBJECT_OFFSETOF(JSValue, u.asBits.payload)), regT2); + loadPtr(Address(regT1, -(int)sizeof(Register) + OBJECT_OFFSETOF(JSValue, u.asBits.tag)), regT3); + storePtr(regT2, Address(stackPointerRegister, OBJECT_OFFSETOF(NativeCallFrameStructure, thisValue) + OBJECT_OFFSETOF(JSValue, u.asBits.payload))); + storePtr(regT3, Address(stackPointerRegister, OBJECT_OFFSETOF(NativeCallFrameStructure, thisValue) + OBJECT_OFFSETOF(JSValue, u.asBits.tag))); + +#if COMPILER(MSVC) || PLATFORM(LINUX) + // ArgList is passed by reference so is stackPointerRegister + 4 * sizeof(Register) + addPtr(Imm32(OBJECT_OFFSETOF(NativeCallFrameStructure, result)), stackPointerRegister, X86::ecx); + + // Plant callee + emitGetFromCallFrameHeaderPtr(RegisterFile::Callee, X86::eax); + storePtr(X86::eax, Address(stackPointerRegister, OBJECT_OFFSETOF(NativeCallFrameStructure, callee))); + + // Plant callframe + move(callFrameRegister, X86::edx); + + call(Address(X86::eax, OBJECT_OFFSETOF(JSFunction, m_data))); + + // JSValue is a non-POD type, so eax points to it + emitLoad(0, regT1, regT0, X86::eax); +#else + emitGetFromCallFrameHeaderPtr(RegisterFile::Callee, X86::edx); // callee + move(callFrameRegister, X86::ecx); // callFrame + call(Address(X86::edx, OBJECT_OFFSETOF(JSFunction, m_data))); +#endif + + // We've put a few temporaries on the stack in addition to the actual arguments + // so pull them off now + addPtr(Imm32(NativeCallFrameSize - sizeof(NativeFunctionCalleeSignature)), stackPointerRegister); + + // Check for an exception + // FIXME: Maybe we can optimize this comparison to JSValue(). + move(ImmPtr(&globalData->exception), regT2); + Jump sawException1 = branch32(NotEqual, tagFor(0, regT2), Imm32(JSValue::CellTag)); + Jump sawException2 = branch32(NonZero, payloadFor(0, regT2), Imm32(0)); + + // Grab the return address. + emitGetFromCallFrameHeaderPtr(RegisterFile::ReturnPC, regT3); + + // Restore our caller's "r". + emitGetFromCallFrameHeaderPtr(RegisterFile::CallerFrame, callFrameRegister); + + // Return. + restoreReturnAddressBeforeReturn(regT3); + ret(); + + // Handle an exception + sawException1.link(this); + sawException2.link(this); + // Grab the return address. + emitGetFromCallFrameHeaderPtr(RegisterFile::ReturnPC, regT1); + move(ImmPtr(&globalData->exceptionLocation), regT2); + storePtr(regT1, regT2); + move(ImmPtr(reinterpret_cast<void*>(ctiVMThrowTrampoline)), regT2); + emitGetFromCallFrameHeaderPtr(RegisterFile::CallerFrame, callFrameRegister); + poke(callFrameRegister, OBJECT_OFFSETOF(struct JITStackFrame, callFrame) / sizeof (void*)); + restoreReturnAddressBeforeReturn(regT2); + ret(); + +#elif ENABLE(JIT_OPTIMIZE_NATIVE_CALL) +#error "JIT_OPTIMIZE_NATIVE_CALL not yet supported on this platform." +#else + breakpoint(); +#endif + +#if ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) + Call string_failureCases1Call = makeTailRecursiveCall(string_failureCases1); + Call string_failureCases2Call = makeTailRecursiveCall(string_failureCases2); + Call string_failureCases3Call = makeTailRecursiveCall(string_failureCases3); +#endif + + // All trampolines constructed! copy the code, link up calls, and set the pointers on the Machine object. + LinkBuffer patchBuffer(this, m_globalData->executableAllocator.poolForSize(m_assembler.size())); + +#if ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) + patchBuffer.link(string_failureCases1Call, FunctionPtr(cti_op_get_by_id_string_fail)); + patchBuffer.link(string_failureCases2Call, FunctionPtr(cti_op_get_by_id_string_fail)); + patchBuffer.link(string_failureCases3Call, FunctionPtr(cti_op_get_by_id_string_fail)); +#endif + patchBuffer.link(callArityCheck1, FunctionPtr(cti_op_call_arityCheck)); + patchBuffer.link(callJSFunction1, FunctionPtr(cti_op_call_JSFunction)); +#if ENABLE(JIT_OPTIMIZE_CALL) + patchBuffer.link(callArityCheck2, FunctionPtr(cti_op_call_arityCheck)); + patchBuffer.link(callJSFunction2, FunctionPtr(cti_op_call_JSFunction)); + patchBuffer.link(callLazyLinkCall, FunctionPtr(cti_vm_lazyLinkCall)); +#endif + + CodeRef finalCode = patchBuffer.finalizeCode(); + *executablePool = finalCode.m_executablePool; + + *ctiVirtualCall = trampolineAt(finalCode, virtualCallBegin); + *ctiNativeCallThunk = trampolineAt(finalCode, nativeCallThunk); +#if ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) + *ctiStringLengthTrampoline = trampolineAt(finalCode, stringLengthBegin); +#else + UNUSED_PARAM(ctiStringLengthTrampoline); +#endif +#if ENABLE(JIT_OPTIMIZE_CALL) + *ctiVirtualCallLink = trampolineAt(finalCode, virtualCallLinkBegin); +#else + UNUSED_PARAM(ctiVirtualCallLink); +#endif +} + +void JIT::emit_op_mov(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned src = currentInstruction[2].u.operand; + + if (m_codeBlock->isConstantRegisterIndex(src)) + emitStore(dst, getConstantOperand(src)); + else { + emitLoad(src, regT1, regT0); + emitStore(dst, regT1, regT0); + map(m_bytecodeIndex + OPCODE_LENGTH(op_mov), dst, regT1, regT0); + } +} + +void JIT::emit_op_end(Instruction* currentInstruction) +{ + if (m_codeBlock->needsFullScopeChain()) + JITStubCall(this, cti_op_end).call(); + ASSERT(returnValueRegister != callFrameRegister); + emitLoad(currentInstruction[1].u.operand, regT1, regT0); + restoreReturnAddressBeforeReturn(Address(callFrameRegister, RegisterFile::ReturnPC * static_cast<int>(sizeof(Register)))); + ret(); +} + +void JIT::emit_op_jmp(Instruction* currentInstruction) +{ + unsigned target = currentInstruction[1].u.operand; + addJump(jump(), target + 1); +} + +void JIT::emit_op_loop(Instruction* currentInstruction) +{ + unsigned target = currentInstruction[1].u.operand; + emitTimeoutCheck(); + addJump(jump(), target + 1); +} + +void JIT::emit_op_loop_if_less(Instruction* currentInstruction) +{ + unsigned op1 = currentInstruction[1].u.operand; + unsigned op2 = currentInstruction[2].u.operand; + unsigned target = currentInstruction[3].u.operand; + + emitTimeoutCheck(); + + if (isOperandConstantImmediateInt(op1)) { + emitLoad(op2, regT1, regT0); + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + addJump(branch32(GreaterThan, regT0, Imm32(getConstantOperand(op1).asInt32())), target + 3); + return; + } + + if (isOperandConstantImmediateInt(op2)) { + emitLoad(op1, regT1, regT0); + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + addJump(branch32(LessThan, regT0, Imm32(getConstantOperand(op2).asInt32())), target + 3); + return; + } + + emitLoad2(op1, regT1, regT0, op2, regT3, regT2); + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + addSlowCase(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag))); + addJump(branch32(LessThan, regT0, regT2), target + 3); +} + +void JIT::emitSlow_op_loop_if_less(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned op1 = currentInstruction[1].u.operand; + unsigned op2 = currentInstruction[2].u.operand; + unsigned target = currentInstruction[3].u.operand; + + if (!isOperandConstantImmediateInt(op1) && !isOperandConstantImmediateInt(op2)) + linkSlowCase(iter); // int32 check + linkSlowCase(iter); // int32 check + + JITStubCall stubCall(this, cti_op_loop_if_less); + stubCall.addArgument(op1); + stubCall.addArgument(op2); + stubCall.call(); + emitJumpSlowToHot(branchTest32(NonZero, regT0), target + 3); +} + +void JIT::emit_op_loop_if_lesseq(Instruction* currentInstruction) +{ + unsigned op1 = currentInstruction[1].u.operand; + unsigned op2 = currentInstruction[2].u.operand; + unsigned target = currentInstruction[3].u.operand; + + emitTimeoutCheck(); + + if (isOperandConstantImmediateInt(op1)) { + emitLoad(op2, regT1, regT0); + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + addJump(branch32(GreaterThanOrEqual, regT0, Imm32(getConstantOperand(op1).asInt32())), target + 3); + return; + } + + if (isOperandConstantImmediateInt(op2)) { + emitLoad(op1, regT1, regT0); + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + addJump(branch32(LessThanOrEqual, regT0, Imm32(getConstantOperand(op2).asInt32())), target + 3); + return; + } + + emitLoad2(op1, regT1, regT0, op2, regT3, regT2); + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag))); + addSlowCase(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag))); + addJump(branch32(LessThanOrEqual, regT0, regT2), target + 3); +} + +void JIT::emitSlow_op_loop_if_lesseq(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned op1 = currentInstruction[1].u.operand; + unsigned op2 = currentInstruction[2].u.operand; + unsigned target = currentInstruction[3].u.operand; + + if (!isOperandConstantImmediateInt(op1) && !isOperandConstantImmediateInt(op2)) + linkSlowCase(iter); // int32 check + linkSlowCase(iter); // int32 check + + JITStubCall stubCall(this, cti_op_loop_if_lesseq); + stubCall.addArgument(op1); + stubCall.addArgument(op2); + stubCall.call(); + emitJumpSlowToHot(branchTest32(NonZero, regT0), target + 3); +} + +void JIT::emit_op_new_object(Instruction* currentInstruction) +{ + JITStubCall(this, cti_op_new_object).call(currentInstruction[1].u.operand); +} + +void JIT::emit_op_instanceof(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned value = currentInstruction[2].u.operand; + unsigned baseVal = currentInstruction[3].u.operand; + unsigned proto = currentInstruction[4].u.operand; + + // Load the operands (baseVal, proto, and value respectively) into registers. + // We use regT0 for baseVal since we will be done with this first, and we can then use it for the result. + emitLoadPayload(proto, regT1); + emitLoadPayload(baseVal, regT0); + emitLoadPayload(value, regT2); + + // Check that baseVal & proto are cells. + emitJumpSlowCaseIfNotJSCell(proto); + emitJumpSlowCaseIfNotJSCell(baseVal); + + // Check that baseVal is an object, that it 'ImplementsHasInstance' but that it does not 'OverridesHasInstance'. + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT0); + addSlowCase(branch32(NotEqual, Address(regT0, OBJECT_OFFSETOF(Structure, m_typeInfo.m_type)), Imm32(ObjectType))); // FIXME: Maybe remove this test. + addSlowCase(branchTest32(Zero, Address(regT0, OBJECT_OFFSETOF(Structure, m_typeInfo.m_flags)), Imm32(ImplementsHasInstance))); // FIXME: TOT checks ImplementsDefaultHasInstance. + + // If value is not an Object, return false. + emitLoadTag(value, regT0); + Jump valueIsImmediate = branch32(NotEqual, regT0, Imm32(JSValue::CellTag)); + loadPtr(Address(regT2, OBJECT_OFFSETOF(JSCell, m_structure)), regT0); + Jump valueIsNotObject = branch32(NotEqual, Address(regT0, OBJECT_OFFSETOF(Structure, m_typeInfo.m_type)), Imm32(ObjectType)); // FIXME: Maybe remove this test. + + // Check proto is object. + loadPtr(Address(regT1, OBJECT_OFFSETOF(JSCell, m_structure)), regT0); + addSlowCase(branch32(NotEqual, Address(regT0, OBJECT_OFFSETOF(Structure, m_typeInfo.m_type)), Imm32(ObjectType))); + + // Optimistically load the result true, and start looping. + // Initially, regT1 still contains proto and regT2 still contains value. + // As we loop regT2 will be updated with its prototype, recursively walking the prototype chain. + move(Imm32(JSValue::TrueTag), regT0); + Label loop(this); + + // Load the prototype of the object in regT2. If this is equal to regT1 - WIN! + // Otherwise, check if we've hit null - if we have then drop out of the loop, if not go again. + loadPtr(Address(regT2, OBJECT_OFFSETOF(JSCell, m_structure)), regT2); + load32(Address(regT2, OBJECT_OFFSETOF(Structure, m_prototype) + OBJECT_OFFSETOF(JSValue, u.asBits.payload)), regT2); + Jump isInstance = branchPtr(Equal, regT2, regT1); + branch32(NotEqual, regT2, Imm32(0), loop); + + // We get here either by dropping out of the loop, or if value was not an Object. Result is false. + valueIsImmediate.link(this); + valueIsNotObject.link(this); + move(Imm32(JSValue::FalseTag), regT0); + + // isInstance jumps right down to here, to skip setting the result to false (it has already set true). + isInstance.link(this); + emitStoreBool(dst, regT0); +} + +void JIT::emitSlow_op_instanceof(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned value = currentInstruction[2].u.operand; + unsigned baseVal = currentInstruction[3].u.operand; + unsigned proto = currentInstruction[4].u.operand; + + linkSlowCaseIfNotJSCell(iter, baseVal); + linkSlowCaseIfNotJSCell(iter, proto); + linkSlowCase(iter); + linkSlowCase(iter); + linkSlowCase(iter); + + JITStubCall stubCall(this, cti_op_instanceof); + stubCall.addArgument(value); + stubCall.addArgument(baseVal); + stubCall.addArgument(proto); + stubCall.call(dst); +} + +void JIT::emit_op_new_func(Instruction* currentInstruction) +{ + JITStubCall stubCall(this, cti_op_new_func); + stubCall.addArgument(ImmPtr(m_codeBlock->function(currentInstruction[2].u.operand))); + stubCall.call(currentInstruction[1].u.operand); +} + +void JIT::emit_op_get_global_var(Instruction* currentInstruction) +{ + int dst = currentInstruction[1].u.operand; + JSGlobalObject* globalObject = static_cast<JSGlobalObject*>(currentInstruction[2].u.jsCell); + ASSERT(globalObject->isGlobalObject()); + int index = currentInstruction[3].u.operand; + + loadPtr(&globalObject->d()->registers, regT2); + + emitLoad(index, regT1, regT0, regT2); + emitStore(dst, regT1, regT0); + map(m_bytecodeIndex + OPCODE_LENGTH(op_get_global_var), dst, regT1, regT0); +} + +void JIT::emit_op_put_global_var(Instruction* currentInstruction) +{ + JSGlobalObject* globalObject = static_cast<JSGlobalObject*>(currentInstruction[1].u.jsCell); + ASSERT(globalObject->isGlobalObject()); + int index = currentInstruction[2].u.operand; + int value = currentInstruction[3].u.operand; + + emitLoad(value, regT1, regT0); + + loadPtr(&globalObject->d()->registers, regT2); + emitStore(index, regT1, regT0, regT2); + map(m_bytecodeIndex + OPCODE_LENGTH(op_put_global_var), value, regT1, regT0); +} + +void JIT::emit_op_get_scoped_var(Instruction* currentInstruction) +{ + int dst = currentInstruction[1].u.operand; + int index = currentInstruction[2].u.operand; + int skip = currentInstruction[3].u.operand + m_codeBlock->needsFullScopeChain(); + + emitGetFromCallFrameHeaderPtr(RegisterFile::ScopeChain, regT2); + while (skip--) + loadPtr(Address(regT2, OBJECT_OFFSETOF(ScopeChainNode, next)), regT2); + + loadPtr(Address(regT2, OBJECT_OFFSETOF(ScopeChainNode, object)), regT2); + loadPtr(Address(regT2, OBJECT_OFFSETOF(JSVariableObject, d)), regT2); + loadPtr(Address(regT2, OBJECT_OFFSETOF(JSVariableObject::JSVariableObjectData, registers)), regT2); + + emitLoad(index, regT1, regT0, regT2); + emitStore(dst, regT1, regT0); + map(m_bytecodeIndex + OPCODE_LENGTH(op_get_scoped_var), dst, regT1, regT0); +} + +void JIT::emit_op_put_scoped_var(Instruction* currentInstruction) +{ + int index = currentInstruction[1].u.operand; + int skip = currentInstruction[2].u.operand + m_codeBlock->needsFullScopeChain(); + int value = currentInstruction[3].u.operand; + + emitLoad(value, regT1, regT0); + + emitGetFromCallFrameHeaderPtr(RegisterFile::ScopeChain, regT2); + while (skip--) + loadPtr(Address(regT2, OBJECT_OFFSETOF(ScopeChainNode, next)), regT2); + + loadPtr(Address(regT2, OBJECT_OFFSETOF(ScopeChainNode, object)), regT2); + loadPtr(Address(regT2, OBJECT_OFFSETOF(JSVariableObject, d)), regT2); + loadPtr(Address(regT2, OBJECT_OFFSETOF(JSVariableObject::JSVariableObjectData, registers)), regT2); + + emitStore(index, regT1, regT0, regT2); + map(m_bytecodeIndex + OPCODE_LENGTH(op_put_scoped_var), value, regT1, regT0); +} + +void JIT::emit_op_tear_off_activation(Instruction* currentInstruction) +{ + JITStubCall stubCall(this, cti_op_tear_off_activation); + stubCall.addArgument(currentInstruction[1].u.operand); + stubCall.call(); +} + +void JIT::emit_op_tear_off_arguments(Instruction*) +{ + JITStubCall(this, cti_op_tear_off_arguments).call(); +} + +void JIT::emit_op_new_array(Instruction* currentInstruction) +{ + JITStubCall stubCall(this, cti_op_new_array); + stubCall.addArgument(Imm32(currentInstruction[2].u.operand)); + stubCall.addArgument(Imm32(currentInstruction[3].u.operand)); + stubCall.call(currentInstruction[1].u.operand); +} + +void JIT::emit_op_resolve(Instruction* currentInstruction) +{ + JITStubCall stubCall(this, cti_op_resolve); + stubCall.addArgument(ImmPtr(&m_codeBlock->identifier(currentInstruction[2].u.operand))); + stubCall.call(currentInstruction[1].u.operand); +} + +void JIT::emit_op_to_primitive(Instruction* currentInstruction) +{ + int dst = currentInstruction[1].u.operand; + int src = currentInstruction[2].u.operand; + + emitLoad(src, regT1, regT0); + + Jump isImm = branch32(NotEqual, regT1, Imm32(JSValue::CellTag)); + addSlowCase(branchPtr(NotEqual, Address(regT0), ImmPtr(m_globalData->jsStringVPtr))); + isImm.link(this); + + if (dst != src) + emitStore(dst, regT1, regT0); + map(m_bytecodeIndex + OPCODE_LENGTH(op_to_primitive), dst, regT1, regT0); +} + +void JIT::emitSlow_op_to_primitive(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + int dst = currentInstruction[1].u.operand; + + linkSlowCase(iter); + + JITStubCall stubCall(this, cti_op_to_primitive); + stubCall.addArgument(regT1, regT0); + stubCall.call(dst); +} + +void JIT::emit_op_strcat(Instruction* currentInstruction) +{ + JITStubCall stubCall(this, cti_op_strcat); + stubCall.addArgument(Imm32(currentInstruction[2].u.operand)); + stubCall.addArgument(Imm32(currentInstruction[3].u.operand)); + stubCall.call(currentInstruction[1].u.operand); +} + +void JIT::emit_op_loop_if_true(Instruction* currentInstruction) +{ + unsigned cond = currentInstruction[1].u.operand; + unsigned target = currentInstruction[2].u.operand; + + emitTimeoutCheck(); + + emitLoad(cond, regT1, regT0); + + Jump isNotInteger = branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag)); + addJump(branch32(NotEqual, regT0, Imm32(0)), target + 2); + Jump isNotZero = jump(); + + isNotInteger.link(this); + + addJump(branch32(Equal, regT1, Imm32(JSValue::TrueTag)), target + 2); + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::FalseTag))); + + isNotZero.link(this); +} + +void JIT::emitSlow_op_loop_if_true(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned cond = currentInstruction[1].u.operand; + unsigned target = currentInstruction[2].u.operand; + + linkSlowCase(iter); + + JITStubCall stubCall(this, cti_op_jtrue); + stubCall.addArgument(cond); + stubCall.call(); + emitJumpSlowToHot(branchTest32(NonZero, regT0), target + 2); +} + +void JIT::emit_op_resolve_base(Instruction* currentInstruction) +{ + JITStubCall stubCall(this, cti_op_resolve_base); + stubCall.addArgument(ImmPtr(&m_codeBlock->identifier(currentInstruction[2].u.operand))); + stubCall.call(currentInstruction[1].u.operand); +} + +void JIT::emit_op_resolve_skip(Instruction* currentInstruction) +{ + JITStubCall stubCall(this, cti_op_resolve_skip); + stubCall.addArgument(ImmPtr(&m_codeBlock->identifier(currentInstruction[2].u.operand))); + stubCall.addArgument(Imm32(currentInstruction[3].u.operand + m_codeBlock->needsFullScopeChain())); + stubCall.call(currentInstruction[1].u.operand); +} + +void JIT::emit_op_resolve_global(Instruction* currentInstruction) +{ + // FIXME: Optimize to use patching instead of so many memory accesses. + + unsigned dst = currentInstruction[1].u.operand; + void* globalObject = currentInstruction[2].u.jsCell; + + unsigned currentIndex = m_globalResolveInfoIndex++; + void* structureAddress = &(m_codeBlock->globalResolveInfo(currentIndex).structure); + void* offsetAddr = &(m_codeBlock->globalResolveInfo(currentIndex).offset); + + // Verify structure. + move(ImmPtr(globalObject), regT0); + loadPtr(structureAddress, regT1); + addSlowCase(branchPtr(NotEqual, regT1, Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)))); + + // Load property. + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSGlobalObject, m_externalStorage)), regT2); + load32(offsetAddr, regT3); + load32(BaseIndex(regT2, regT3, TimesEight), regT0); // payload + load32(BaseIndex(regT2, regT3, TimesEight, 4), regT1); // tag + emitStore(dst, regT1, regT0); + map(m_bytecodeIndex + OPCODE_LENGTH(op_resolve_global), dst, regT1, regT0); +} + +void JIT::emitSlow_op_resolve_global(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned dst = currentInstruction[1].u.operand; + void* globalObject = currentInstruction[2].u.jsCell; + Identifier* ident = &m_codeBlock->identifier(currentInstruction[3].u.operand); + + unsigned currentIndex = m_globalResolveInfoIndex++; + + linkSlowCase(iter); + JITStubCall stubCall(this, cti_op_resolve_global); + stubCall.addArgument(ImmPtr(globalObject)); + stubCall.addArgument(ImmPtr(ident)); + stubCall.addArgument(Imm32(currentIndex)); + stubCall.call(dst); +} + +void JIT::emit_op_not(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned src = currentInstruction[2].u.operand; + + emitLoadTag(src, regT0); + + xor32(Imm32(JSValue::FalseTag), regT0); + addSlowCase(branchTest32(NonZero, regT0, Imm32(~1))); + xor32(Imm32(JSValue::TrueTag), regT0); + + emitStoreBool(dst, regT0, (dst == src)); +} + +void JIT::emitSlow_op_not(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned src = currentInstruction[2].u.operand; + + linkSlowCase(iter); + + JITStubCall stubCall(this, cti_op_not); + stubCall.addArgument(src); + stubCall.call(dst); +} + +void JIT::emit_op_jfalse(Instruction* currentInstruction) +{ + unsigned cond = currentInstruction[1].u.operand; + unsigned target = currentInstruction[2].u.operand; + + emitLoad(cond, regT1, regT0); + + Jump isTrue = branch32(Equal, regT1, Imm32(JSValue::TrueTag)); + addJump(branch32(Equal, regT1, Imm32(JSValue::FalseTag)), target + 2); + + Jump isNotInteger = branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag)); + Jump isTrue2 = branch32(NotEqual, regT0, Imm32(0)); + addJump(jump(), target + 2); + + isNotInteger.link(this); + + addSlowCase(branch32(Above, regT1, Imm32(JSValue::LowestTag))); + + zeroDouble(fpRegT0); + emitLoadDouble(cond, fpRegT1); + addJump(branchDouble(DoubleEqual, fpRegT0, fpRegT1), target + 2); + + isTrue.link(this); + isTrue2.link(this); +} + +void JIT::emitSlow_op_jfalse(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned cond = currentInstruction[1].u.operand; + unsigned target = currentInstruction[2].u.operand; + + linkSlowCase(iter); + JITStubCall stubCall(this, cti_op_jtrue); + stubCall.addArgument(cond); + stubCall.call(); + emitJumpSlowToHot(branchTest32(Zero, regT0), target + 2); // Inverted. +} + +void JIT::emit_op_jtrue(Instruction* currentInstruction) +{ + unsigned cond = currentInstruction[1].u.operand; + unsigned target = currentInstruction[2].u.operand; + + emitLoad(cond, regT1, regT0); + + Jump isFalse = branch32(Equal, regT1, Imm32(JSValue::FalseTag)); + addJump(branch32(Equal, regT1, Imm32(JSValue::TrueTag)), target + 2); + + Jump isNotInteger = branch32(NotEqual, regT1, Imm32(JSValue::Int32Tag)); + Jump isFalse2 = branch32(Equal, regT0, Imm32(0)); + addJump(jump(), target + 2); + + isNotInteger.link(this); + + addSlowCase(branch32(Above, regT1, Imm32(JSValue::LowestTag))); + + zeroDouble(fpRegT0); + emitLoadDouble(cond, fpRegT1); + addJump(branchDouble(DoubleNotEqual, fpRegT0, fpRegT1), target + 2); + + isFalse.link(this); + isFalse2.link(this); +} + +void JIT::emitSlow_op_jtrue(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned cond = currentInstruction[1].u.operand; + unsigned target = currentInstruction[2].u.operand; + + linkSlowCase(iter); + JITStubCall stubCall(this, cti_op_jtrue); + stubCall.addArgument(cond); + stubCall.call(); + emitJumpSlowToHot(branchTest32(NonZero, regT0), target + 2); +} + +void JIT::emit_op_jeq_null(Instruction* currentInstruction) +{ + unsigned src = currentInstruction[1].u.operand; + unsigned target = currentInstruction[2].u.operand; + + emitLoad(src, regT1, regT0); + + Jump isImmediate = branch32(NotEqual, regT1, Imm32(JSValue::CellTag)); + + // First, handle JSCell cases - check MasqueradesAsUndefined bit on the structure. + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT2); + addJump(branchTest32(NonZero, Address(regT2, OBJECT_OFFSETOF(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined)), target + 2); + + Jump wasNotImmediate = jump(); + + // Now handle the immediate cases - undefined & null + isImmediate.link(this); + + set32(Equal, regT1, Imm32(JSValue::NullTag), regT2); + set32(Equal, regT1, Imm32(JSValue::UndefinedTag), regT1); + or32(regT2, regT1); + + addJump(branchTest32(NonZero, regT1), target + 2); + + wasNotImmediate.link(this); +} + +void JIT::emit_op_jneq_null(Instruction* currentInstruction) +{ + unsigned src = currentInstruction[1].u.operand; + unsigned target = currentInstruction[2].u.operand; + + emitLoad(src, regT1, regT0); + + Jump isImmediate = branch32(NotEqual, regT1, Imm32(JSValue::CellTag)); + + // First, handle JSCell cases - check MasqueradesAsUndefined bit on the structure. + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT2); + addJump(branchTest32(Zero, Address(regT2, OBJECT_OFFSETOF(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined)), target + 2); + + Jump wasNotImmediate = jump(); + + // Now handle the immediate cases - undefined & null + isImmediate.link(this); + + set32(Equal, regT1, Imm32(JSValue::NullTag), regT2); + set32(Equal, regT1, Imm32(JSValue::UndefinedTag), regT1); + or32(regT2, regT1); + + addJump(branchTest32(Zero, regT1), target + 2); + + wasNotImmediate.link(this); +} + +void JIT::emit_op_jneq_ptr(Instruction* currentInstruction) +{ + unsigned src = currentInstruction[1].u.operand; + JSCell* ptr = currentInstruction[2].u.jsCell; + unsigned target = currentInstruction[3].u.operand; + + emitLoad(src, regT1, regT0); + addJump(branch32(NotEqual, regT1, Imm32(JSValue::CellTag)), target + 3); + addJump(branchPtr(NotEqual, regT0, ImmPtr(ptr)), target + 3); +} + +void JIT::emit_op_jsr(Instruction* currentInstruction) +{ + int retAddrDst = currentInstruction[1].u.operand; + int target = currentInstruction[2].u.operand; + DataLabelPtr storeLocation = storePtrWithPatch(ImmPtr(0), Address(callFrameRegister, sizeof(Register) * retAddrDst)); + addJump(jump(), target + 2); + m_jsrSites.append(JSRInfo(storeLocation, label())); +} + +void JIT::emit_op_sret(Instruction* currentInstruction) +{ + jump(Address(callFrameRegister, sizeof(Register) * currentInstruction[1].u.operand)); +} + +void JIT::emit_op_eq(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned src1 = currentInstruction[2].u.operand; + unsigned src2 = currentInstruction[3].u.operand; + + emitLoad2(src1, regT1, regT0, src2, regT3, regT2); + addSlowCase(branch32(NotEqual, regT1, regT3)); + addSlowCase(branch32(Equal, regT1, Imm32(JSValue::CellTag))); + addSlowCase(branch32(Below, regT1, Imm32(JSValue::LowestTag))); + + set8(Equal, regT0, regT2, regT0); + or32(Imm32(JSValue::FalseTag), regT0); + + emitStoreBool(dst, regT0); +} + +void JIT::emitSlow_op_eq(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned op1 = currentInstruction[2].u.operand; + unsigned op2 = currentInstruction[3].u.operand; + + JumpList storeResult; + JumpList genericCase; + + genericCase.append(getSlowCase(iter)); // tags not equal + + linkSlowCase(iter); // tags equal and JSCell + genericCase.append(branchPtr(NotEqual, Address(regT0), ImmPtr(m_globalData->jsStringVPtr))); + genericCase.append(branchPtr(NotEqual, Address(regT2), ImmPtr(m_globalData->jsStringVPtr))); + + // String case. + JITStubCall stubCallEqStrings(this, cti_op_eq_strings); + stubCallEqStrings.addArgument(regT0); + stubCallEqStrings.addArgument(regT2); + stubCallEqStrings.call(); + storeResult.append(jump()); + + // Generic case. + genericCase.append(getSlowCase(iter)); // doubles + genericCase.link(this); + JITStubCall stubCallEq(this, cti_op_eq); + stubCallEq.addArgument(op1); + stubCallEq.addArgument(op2); + stubCallEq.call(regT0); + + storeResult.link(this); + or32(Imm32(JSValue::FalseTag), regT0); + emitStoreBool(dst, regT0); +} + +void JIT::emit_op_neq(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned src1 = currentInstruction[2].u.operand; + unsigned src2 = currentInstruction[3].u.operand; + + emitLoad2(src1, regT1, regT0, src2, regT3, regT2); + addSlowCase(branch32(NotEqual, regT1, regT3)); + addSlowCase(branch32(Equal, regT1, Imm32(JSValue::CellTag))); + addSlowCase(branch32(Below, regT1, Imm32(JSValue::LowestTag))); + + set8(NotEqual, regT0, regT2, regT0); + or32(Imm32(JSValue::FalseTag), regT0); + + emitStoreBool(dst, regT0); +} + +void JIT::emitSlow_op_neq(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned dst = currentInstruction[1].u.operand; + + JumpList storeResult; + JumpList genericCase; + + genericCase.append(getSlowCase(iter)); // tags not equal + + linkSlowCase(iter); // tags equal and JSCell + genericCase.append(branchPtr(NotEqual, Address(regT0), ImmPtr(m_globalData->jsStringVPtr))); + genericCase.append(branchPtr(NotEqual, Address(regT2), ImmPtr(m_globalData->jsStringVPtr))); + + // String case. + JITStubCall stubCallEqStrings(this, cti_op_eq_strings); + stubCallEqStrings.addArgument(regT0); + stubCallEqStrings.addArgument(regT2); + stubCallEqStrings.call(regT0); + storeResult.append(jump()); + + // Generic case. + genericCase.append(getSlowCase(iter)); // doubles + genericCase.link(this); + JITStubCall stubCallEq(this, cti_op_eq); + stubCallEq.addArgument(regT1, regT0); + stubCallEq.addArgument(regT3, regT2); + stubCallEq.call(regT0); + + storeResult.link(this); + xor32(Imm32(0x1), regT0); + or32(Imm32(JSValue::FalseTag), regT0); + emitStoreBool(dst, regT0); +} + +void JIT::compileOpStrictEq(Instruction* currentInstruction, CompileOpStrictEqType type) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned src1 = currentInstruction[2].u.operand; + unsigned src2 = currentInstruction[3].u.operand; + + emitLoadTag(src1, regT0); + emitLoadTag(src2, regT1); + + // Jump to a slow case if either operand is double, or if both operands are + // cells and/or Int32s. + move(regT0, regT2); + and32(regT1, regT2); + addSlowCase(branch32(Below, regT2, Imm32(JSValue::LowestTag))); + addSlowCase(branch32(AboveOrEqual, regT2, Imm32(JSValue::CellTag))); + + if (type == OpStrictEq) + set8(Equal, regT0, regT1, regT0); + else + set8(NotEqual, regT0, regT1, regT0); + + or32(Imm32(JSValue::FalseTag), regT0); + + emitStoreBool(dst, regT0); +} + +void JIT::emit_op_stricteq(Instruction* currentInstruction) +{ + compileOpStrictEq(currentInstruction, OpStrictEq); +} + +void JIT::emitSlow_op_stricteq(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned src1 = currentInstruction[2].u.operand; + unsigned src2 = currentInstruction[3].u.operand; + + linkSlowCase(iter); + linkSlowCase(iter); + + JITStubCall stubCall(this, cti_op_stricteq); + stubCall.addArgument(src1); + stubCall.addArgument(src2); + stubCall.call(dst); +} + +void JIT::emit_op_nstricteq(Instruction* currentInstruction) +{ + compileOpStrictEq(currentInstruction, OpNStrictEq); +} + +void JIT::emitSlow_op_nstricteq(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned src1 = currentInstruction[2].u.operand; + unsigned src2 = currentInstruction[3].u.operand; + + linkSlowCase(iter); + linkSlowCase(iter); + + JITStubCall stubCall(this, cti_op_nstricteq); + stubCall.addArgument(src1); + stubCall.addArgument(src2); + stubCall.call(dst); +} + +void JIT::emit_op_eq_null(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned src = currentInstruction[2].u.operand; + + emitLoad(src, regT1, regT0); + Jump isImmediate = branch32(NotEqual, regT1, Imm32(JSValue::CellTag)); + + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT1); + setTest8(NonZero, Address(regT1, OBJECT_OFFSETOF(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined), regT1); + + Jump wasNotImmediate = jump(); + + isImmediate.link(this); + + set8(Equal, regT1, Imm32(JSValue::NullTag), regT2); + set8(Equal, regT1, Imm32(JSValue::UndefinedTag), regT1); + or32(regT2, regT1); + + wasNotImmediate.link(this); + + or32(Imm32(JSValue::FalseTag), regT1); + + emitStoreBool(dst, regT1); +} + +void JIT::emit_op_neq_null(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned src = currentInstruction[2].u.operand; + + emitLoad(src, regT1, regT0); + Jump isImmediate = branch32(NotEqual, regT1, Imm32(JSValue::CellTag)); + + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT1); + setTest8(Zero, Address(regT1, OBJECT_OFFSETOF(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined), regT1); + + Jump wasNotImmediate = jump(); + + isImmediate.link(this); + + set8(NotEqual, regT1, Imm32(JSValue::NullTag), regT2); + set8(NotEqual, regT1, Imm32(JSValue::UndefinedTag), regT1); + and32(regT2, regT1); + + wasNotImmediate.link(this); + + or32(Imm32(JSValue::FalseTag), regT1); + + emitStoreBool(dst, regT1); +} + +void JIT::emit_op_resolve_with_base(Instruction* currentInstruction) +{ + JITStubCall stubCall(this, cti_op_resolve_with_base); + stubCall.addArgument(ImmPtr(&m_codeBlock->identifier(currentInstruction[3].u.operand))); + stubCall.addArgument(Imm32(currentInstruction[1].u.operand)); + stubCall.call(currentInstruction[2].u.operand); +} + +void JIT::emit_op_new_func_exp(Instruction* currentInstruction) +{ + JITStubCall stubCall(this, cti_op_new_func_exp); + stubCall.addArgument(ImmPtr(m_codeBlock->functionExpression(currentInstruction[2].u.operand))); + stubCall.call(currentInstruction[1].u.operand); +} + +void JIT::emit_op_new_regexp(Instruction* currentInstruction) +{ + JITStubCall stubCall(this, cti_op_new_regexp); + stubCall.addArgument(ImmPtr(m_codeBlock->regexp(currentInstruction[2].u.operand))); + stubCall.call(currentInstruction[1].u.operand); +} + +void JIT::emit_op_throw(Instruction* currentInstruction) +{ + unsigned exception = currentInstruction[1].u.operand; + JITStubCall stubCall(this, cti_op_throw); + stubCall.addArgument(exception); + stubCall.call(); + +#ifndef NDEBUG + // cti_op_throw always changes it's return address, + // this point in the code should never be reached. + breakpoint(); +#endif +} + +void JIT::emit_op_next_pname(Instruction* currentInstruction) +{ + int dst = currentInstruction[1].u.operand; + int iter = currentInstruction[2].u.operand; + int target = currentInstruction[3].u.operand; + + load32(Address(callFrameRegister, (iter * sizeof(Register))), regT0); + + JITStubCall stubCall(this, cti_op_next_pname); + stubCall.addArgument(regT0); + stubCall.call(); + + Jump endOfIter = branchTestPtr(Zero, regT0); + emitStore(dst, regT1, regT0); + map(m_bytecodeIndex + OPCODE_LENGTH(op_next_pname), dst, regT1, regT0); + addJump(jump(), target + 3); + endOfIter.link(this); +} + +void JIT::emit_op_push_scope(Instruction* currentInstruction) +{ + JITStubCall stubCall(this, cti_op_push_scope); + stubCall.addArgument(currentInstruction[1].u.operand); + stubCall.call(currentInstruction[1].u.operand); +} + +void JIT::emit_op_pop_scope(Instruction*) +{ + JITStubCall(this, cti_op_pop_scope).call(); +} + +void JIT::emit_op_to_jsnumber(Instruction* currentInstruction) +{ + int dst = currentInstruction[1].u.operand; + int src = currentInstruction[2].u.operand; + + emitLoad(src, regT1, regT0); + + Jump isInt32 = branch32(Equal, regT1, Imm32(JSValue::Int32Tag)); + addSlowCase(branch32(AboveOrEqual, regT1, Imm32(JSValue::DeletedValueTag))); + isInt32.link(this); + + if (src != dst) + emitStore(dst, regT1, regT0); + map(m_bytecodeIndex + OPCODE_LENGTH(op_to_jsnumber), dst, regT1, regT0); +} + +void JIT::emitSlow_op_to_jsnumber(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + int dst = currentInstruction[1].u.operand; + + linkSlowCase(iter); + + JITStubCall stubCall(this, cti_op_to_jsnumber); + stubCall.addArgument(regT1, regT0); + stubCall.call(dst); +} + +void JIT::emit_op_push_new_scope(Instruction* currentInstruction) +{ + JITStubCall stubCall(this, cti_op_push_new_scope); + stubCall.addArgument(ImmPtr(&m_codeBlock->identifier(currentInstruction[2].u.operand))); + stubCall.addArgument(currentInstruction[3].u.operand); + stubCall.call(currentInstruction[1].u.operand); +} + +void JIT::emit_op_catch(Instruction* currentInstruction) +{ + unsigned exception = currentInstruction[1].u.operand; + + // This opcode only executes after a return from cti_op_throw. + + // cti_op_throw may have taken us to a call frame further up the stack; reload + // the call frame pointer to adjust. + peek(callFrameRegister, OBJECT_OFFSETOF(struct JITStackFrame, callFrame) / sizeof (void*)); + + // Now store the exception returned by cti_op_throw. + emitStore(exception, regT1, regT0); + map(m_bytecodeIndex + OPCODE_LENGTH(op_catch), exception, regT1, regT0); +} + +void JIT::emit_op_jmp_scopes(Instruction* currentInstruction) +{ + JITStubCall stubCall(this, cti_op_jmp_scopes); + stubCall.addArgument(Imm32(currentInstruction[1].u.operand)); + stubCall.call(); + addJump(jump(), currentInstruction[2].u.operand + 2); +} + +void JIT::emit_op_switch_imm(Instruction* currentInstruction) +{ + unsigned tableIndex = currentInstruction[1].u.operand; + unsigned defaultOffset = currentInstruction[2].u.operand; + unsigned scrutinee = currentInstruction[3].u.operand; + + // create jump table for switch destinations, track this switch statement. + SimpleJumpTable* jumpTable = &m_codeBlock->immediateSwitchJumpTable(tableIndex); + m_switches.append(SwitchRecord(jumpTable, m_bytecodeIndex, defaultOffset, SwitchRecord::Immediate)); + jumpTable->ctiOffsets.grow(jumpTable->branchOffsets.size()); + + JITStubCall stubCall(this, cti_op_switch_imm); + stubCall.addArgument(scrutinee); + stubCall.addArgument(Imm32(tableIndex)); + stubCall.call(); + jump(regT0); +} + +void JIT::emit_op_switch_char(Instruction* currentInstruction) +{ + unsigned tableIndex = currentInstruction[1].u.operand; + unsigned defaultOffset = currentInstruction[2].u.operand; + unsigned scrutinee = currentInstruction[3].u.operand; + + // create jump table for switch destinations, track this switch statement. + SimpleJumpTable* jumpTable = &m_codeBlock->characterSwitchJumpTable(tableIndex); + m_switches.append(SwitchRecord(jumpTable, m_bytecodeIndex, defaultOffset, SwitchRecord::Character)); + jumpTable->ctiOffsets.grow(jumpTable->branchOffsets.size()); + + JITStubCall stubCall(this, cti_op_switch_char); + stubCall.addArgument(scrutinee); + stubCall.addArgument(Imm32(tableIndex)); + stubCall.call(); + jump(regT0); +} + +void JIT::emit_op_switch_string(Instruction* currentInstruction) +{ + unsigned tableIndex = currentInstruction[1].u.operand; + unsigned defaultOffset = currentInstruction[2].u.operand; + unsigned scrutinee = currentInstruction[3].u.operand; + + // create jump table for switch destinations, track this switch statement. + StringJumpTable* jumpTable = &m_codeBlock->stringSwitchJumpTable(tableIndex); + m_switches.append(SwitchRecord(jumpTable, m_bytecodeIndex, defaultOffset)); + + JITStubCall stubCall(this, cti_op_switch_string); + stubCall.addArgument(scrutinee); + stubCall.addArgument(Imm32(tableIndex)); + stubCall.call(); + jump(regT0); +} + +void JIT::emit_op_new_error(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned type = currentInstruction[2].u.operand; + unsigned message = currentInstruction[3].u.operand; + + JITStubCall stubCall(this, cti_op_new_error); + stubCall.addArgument(Imm32(type)); + stubCall.addArgument(m_codeBlock->getConstant(message)); + stubCall.addArgument(Imm32(m_bytecodeIndex)); + stubCall.call(dst); +} + +void JIT::emit_op_debug(Instruction* currentInstruction) +{ + JITStubCall stubCall(this, cti_op_debug); + stubCall.addArgument(Imm32(currentInstruction[1].u.operand)); + stubCall.addArgument(Imm32(currentInstruction[2].u.operand)); + stubCall.addArgument(Imm32(currentInstruction[3].u.operand)); + stubCall.call(); +} + + +void JIT::emit_op_enter(Instruction*) +{ + // Even though JIT code doesn't use them, we initialize our constant + // registers to zap stale pointers, to avoid unnecessarily prolonging + // object lifetime and increasing GC pressure. + for (int i = 0; i < m_codeBlock->m_numVars; ++i) + emitStore(i, jsUndefined()); +} + +void JIT::emit_op_enter_with_activation(Instruction* currentInstruction) +{ + emit_op_enter(currentInstruction); + + JITStubCall(this, cti_op_push_activation).call(currentInstruction[1].u.operand); +} + +void JIT::emit_op_create_arguments(Instruction*) +{ + Jump argsNotCell = branch32(NotEqual, tagFor(RegisterFile::ArgumentsRegister, callFrameRegister), Imm32(JSValue::CellTag)); + Jump argsNotNull = branchTestPtr(NonZero, payloadFor(RegisterFile::ArgumentsRegister, callFrameRegister)); + + // If we get here the arguments pointer is a null cell - i.e. arguments need lazy creation. + if (m_codeBlock->m_numParameters == 1) + JITStubCall(this, cti_op_create_arguments_no_params).call(); + else + JITStubCall(this, cti_op_create_arguments).call(); + + argsNotCell.link(this); + argsNotNull.link(this); +} + +void JIT::emit_op_init_arguments(Instruction*) +{ + emitStore(RegisterFile::ArgumentsRegister, JSValue(), callFrameRegister); +} + +void JIT::emit_op_convert_this(Instruction* currentInstruction) +{ + unsigned thisRegister = currentInstruction[1].u.operand; + + emitLoad(thisRegister, regT1, regT0); + + addSlowCase(branch32(NotEqual, regT1, Imm32(JSValue::CellTag))); + + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT2); + addSlowCase(branchTest32(NonZero, Address(regT2, OBJECT_OFFSETOF(Structure, m_typeInfo.m_flags)), Imm32(NeedsThisConversion))); + + map(m_bytecodeIndex + OPCODE_LENGTH(op_convert_this), thisRegister, regT1, regT0); +} + +void JIT::emitSlow_op_convert_this(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned thisRegister = currentInstruction[1].u.operand; + + linkSlowCase(iter); + linkSlowCase(iter); + + JITStubCall stubCall(this, cti_op_convert_this); + stubCall.addArgument(regT1, regT0); + stubCall.call(thisRegister); +} + +void JIT::emit_op_profile_will_call(Instruction* currentInstruction) +{ + peek(regT2, OBJECT_OFFSETOF(JITStackFrame, enabledProfilerReference) / sizeof (void*)); + Jump noProfiler = branchTestPtr(Zero, Address(regT2)); + + JITStubCall stubCall(this, cti_op_profile_will_call); + stubCall.addArgument(currentInstruction[1].u.operand); + stubCall.call(); + noProfiler.link(this); +} + +void JIT::emit_op_profile_did_call(Instruction* currentInstruction) +{ + peek(regT2, OBJECT_OFFSETOF(JITStackFrame, enabledProfilerReference) / sizeof (void*)); + Jump noProfiler = branchTestPtr(Zero, Address(regT2)); + + JITStubCall stubCall(this, cti_op_profile_did_call); + stubCall.addArgument(currentInstruction[1].u.operand); + stubCall.call(); + noProfiler.link(this); +} + +#else // USE(JSVALUE32_64) + #define RECORD_JUMP_TARGET(targetOffset) \ do { m_labels[m_bytecodeIndex + (targetOffset)].used(); } while (false) +void JIT::privateCompileCTIMachineTrampolines(RefPtr<ExecutablePool>* executablePool, JSGlobalData* globalData, CodePtr* ctiStringLengthTrampoline, CodePtr* ctiVirtualCallLink, CodePtr* ctiVirtualCall, CodePtr* ctiNativeCallThunk) +{ +#if ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) + // (2) The second function provides fast property access for string length + Label stringLengthBegin = align(); + + // Check eax is a string + Jump string_failureCases1 = emitJumpIfNotJSCell(regT0); + Jump string_failureCases2 = branchPtr(NotEqual, Address(regT0), ImmPtr(m_globalData->jsStringVPtr)); + + // Checks out okay! - get the length from the Ustring. + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSString, m_value) + OBJECT_OFFSETOF(UString, m_rep)), regT0); + load32(Address(regT0, OBJECT_OFFSETOF(UString::Rep, len)), regT0); + + Jump string_failureCases3 = branch32(Above, regT0, Imm32(JSImmediate::maxImmediateInt)); + + // regT0 contains a 64 bit value (is positive, is zero extended) so we don't need sign extend here. + emitFastArithIntToImmNoCheck(regT0, regT0); + + ret(); +#endif + + // (3) Trampolines for the slow cases of op_call / op_call_eval / op_construct. + COMPILE_ASSERT(sizeof(CodeType) == 4, CodeTypeEnumMustBe32Bit); + + Label virtualCallLinkBegin = align(); + + // Load the callee CodeBlock* into eax + loadPtr(Address(regT2, OBJECT_OFFSETOF(JSFunction, m_body)), regT3); + loadPtr(Address(regT3, OBJECT_OFFSETOF(FunctionBodyNode, m_code)), regT0); + Jump hasCodeBlock2 = branchTestPtr(NonZero, regT0); + preserveReturnAddressAfterCall(regT3); + restoreArgumentReference(); + Call callJSFunction2 = call(); + emitGetJITStubArg(1, regT2); + emitGetJITStubArg(3, regT1); + restoreReturnAddressBeforeReturn(regT3); + hasCodeBlock2.link(this); + + Jump isNativeFunc2 = branch32(Equal, Address(regT0, OBJECT_OFFSETOF(CodeBlock, m_codeType)), Imm32(NativeCode)); + + // Check argCount matches callee arity. + Jump arityCheckOkay2 = branch32(Equal, Address(regT0, OBJECT_OFFSETOF(CodeBlock, m_numParameters)), regT1); + preserveReturnAddressAfterCall(regT3); + emitPutJITStubArg(regT3, 2); + emitPutJITStubArg(regT0, 4); + restoreArgumentReference(); + Call callArityCheck2 = call(); + move(regT1, callFrameRegister); + emitGetJITStubArg(1, regT2); + emitGetJITStubArg(3, regT1); + restoreReturnAddressBeforeReturn(regT3); + arityCheckOkay2.link(this); + isNativeFunc2.link(this); + + compileOpCallInitializeCallFrame(); + + preserveReturnAddressAfterCall(regT3); + emitPutJITStubArg(regT3, 2); + restoreArgumentReference(); + Call callLazyLinkCall = call(); + restoreReturnAddressBeforeReturn(regT3); + + jump(regT0); + + Label virtualCallBegin = align(); + + // Load the callee CodeBlock* into eax + loadPtr(Address(regT2, OBJECT_OFFSETOF(JSFunction, m_body)), regT3); + loadPtr(Address(regT3, OBJECT_OFFSETOF(FunctionBodyNode, m_code)), regT0); + Jump hasCodeBlock3 = branchTestPtr(NonZero, regT0); + preserveReturnAddressAfterCall(regT3); + restoreArgumentReference(); + Call callJSFunction1 = call(); + emitGetJITStubArg(1, regT2); + emitGetJITStubArg(3, regT1); + restoreReturnAddressBeforeReturn(regT3); + loadPtr(Address(regT2, OBJECT_OFFSETOF(JSFunction, m_body)), regT3); // reload the function body nody, so we can reload the code pointer. + hasCodeBlock3.link(this); + + Jump isNativeFunc3 = branch32(Equal, Address(regT0, OBJECT_OFFSETOF(CodeBlock, m_codeType)), Imm32(NativeCode)); + + // Check argCount matches callee arity. + Jump arityCheckOkay3 = branch32(Equal, Address(regT0, OBJECT_OFFSETOF(CodeBlock, m_numParameters)), regT1); + preserveReturnAddressAfterCall(regT3); + emitPutJITStubArg(regT3, 2); + emitPutJITStubArg(regT0, 4); + restoreArgumentReference(); + Call callArityCheck1 = call(); + move(regT1, callFrameRegister); + emitGetJITStubArg(1, regT2); + emitGetJITStubArg(3, regT1); + restoreReturnAddressBeforeReturn(regT3); + loadPtr(Address(regT2, OBJECT_OFFSETOF(JSFunction, m_body)), regT3); // reload the function body nody, so we can reload the code pointer. + arityCheckOkay3.link(this); + isNativeFunc3.link(this); + + // load ctiCode from the new codeBlock. + loadPtr(Address(regT3, OBJECT_OFFSETOF(FunctionBodyNode, m_jitCode)), regT0); + + compileOpCallInitializeCallFrame(); + jump(regT0); + + + Label nativeCallThunk = align(); + preserveReturnAddressAfterCall(regT0); + emitPutToCallFrameHeader(regT0, RegisterFile::ReturnPC); // Push return address + + // Load caller frame's scope chain into this callframe so that whatever we call can + // get to its global data. + emitGetFromCallFrameHeaderPtr(RegisterFile::CallerFrame, regT1); + emitGetFromCallFrameHeaderPtr(RegisterFile::ScopeChain, regT1, regT1); + emitPutToCallFrameHeader(regT1, RegisterFile::ScopeChain); + + +#if PLATFORM(X86_64) + emitGetFromCallFrameHeader32(RegisterFile::ArgumentCount, X86::ecx); + + // Allocate stack space for our arglist + subPtr(Imm32(sizeof(ArgList)), stackPointerRegister); + COMPILE_ASSERT((sizeof(ArgList) & 0xf) == 0, ArgList_should_by_16byte_aligned); + + // Set up arguments + subPtr(Imm32(1), X86::ecx); // Don't include 'this' in argcount + + // Push argcount + storePtr(X86::ecx, Address(stackPointerRegister, OBJECT_OFFSETOF(ArgList, m_argCount))); + + // Calculate the start of the callframe header, and store in edx + addPtr(Imm32(-RegisterFile::CallFrameHeaderSize * (int32_t)sizeof(Register)), callFrameRegister, X86::edx); + + // Calculate start of arguments as callframe header - sizeof(Register) * argcount (ecx) + mul32(Imm32(sizeof(Register)), X86::ecx, X86::ecx); + subPtr(X86::ecx, X86::edx); + + // push pointer to arguments + storePtr(X86::edx, Address(stackPointerRegister, OBJECT_OFFSETOF(ArgList, m_args))); + + // ArgList is passed by reference so is stackPointerRegister + move(stackPointerRegister, X86::ecx); + + // edx currently points to the first argument, edx-sizeof(Register) points to 'this' + loadPtr(Address(X86::edx, -(int32_t)sizeof(Register)), X86::edx); + + emitGetFromCallFrameHeaderPtr(RegisterFile::Callee, X86::esi); + + move(callFrameRegister, X86::edi); + + call(Address(X86::esi, OBJECT_OFFSETOF(JSFunction, m_data))); + + addPtr(Imm32(sizeof(ArgList)), stackPointerRegister); +#elif PLATFORM(X86) + emitGetFromCallFrameHeader32(RegisterFile::ArgumentCount, regT0); + + /* We have two structs that we use to describe the stackframe we set up for our + * call to native code. NativeCallFrameStructure describes the how we set up the stack + * in advance of the call. NativeFunctionCalleeSignature describes the callframe + * as the native code expects it. We do this as we are using the fastcall calling + * convention which results in the callee popping its arguments off the stack, but + * not the rest of the callframe so we need a nice way to ensure we increment the + * stack pointer by the right amount after the call. + */ +#if COMPILER(MSVC) || PLATFORM(LINUX) + struct NativeCallFrameStructure { + // CallFrame* callFrame; // passed in EDX + JSObject* callee; + JSValue thisValue; + ArgList* argPointer; + ArgList args; + JSValue result; + }; + struct NativeFunctionCalleeSignature { + JSObject* callee; + JSValue thisValue; + ArgList* argPointer; + }; +#else + struct NativeCallFrameStructure { + // CallFrame* callFrame; // passed in ECX + // JSObject* callee; // passed in EDX + JSValue thisValue; + ArgList* argPointer; + ArgList args; + }; + struct NativeFunctionCalleeSignature { + JSValue thisValue; + ArgList* argPointer; + }; +#endif + const int NativeCallFrameSize = (sizeof(NativeCallFrameStructure) + 15) & ~15; + // Allocate system stack frame + subPtr(Imm32(NativeCallFrameSize), stackPointerRegister); + + // Set up arguments + subPtr(Imm32(1), regT0); // Don't include 'this' in argcount + + // push argcount + storePtr(regT0, Address(stackPointerRegister, OBJECT_OFFSETOF(NativeCallFrameStructure, args) + OBJECT_OFFSETOF(ArgList, m_argCount))); + + // Calculate the start of the callframe header, and store in regT1 + addPtr(Imm32(-RegisterFile::CallFrameHeaderSize * (int)sizeof(Register)), callFrameRegister, regT1); + + // Calculate start of arguments as callframe header - sizeof(Register) * argcount (regT0) + mul32(Imm32(sizeof(Register)), regT0, regT0); + subPtr(regT0, regT1); + storePtr(regT1, Address(stackPointerRegister, OBJECT_OFFSETOF(NativeCallFrameStructure, args) + OBJECT_OFFSETOF(ArgList, m_args))); + + // ArgList is passed by reference so is stackPointerRegister + 4 * sizeof(Register) + addPtr(Imm32(OBJECT_OFFSETOF(NativeCallFrameStructure, args)), stackPointerRegister, regT0); + storePtr(regT0, Address(stackPointerRegister, OBJECT_OFFSETOF(NativeCallFrameStructure, argPointer))); + + // regT1 currently points to the first argument, regT1 - sizeof(Register) points to 'this' + loadPtr(Address(regT1, -(int)sizeof(Register)), regT1); + storePtr(regT1, Address(stackPointerRegister, OBJECT_OFFSETOF(NativeCallFrameStructure, thisValue))); + +#if COMPILER(MSVC) || PLATFORM(LINUX) + // ArgList is passed by reference so is stackPointerRegister + 4 * sizeof(Register) + addPtr(Imm32(OBJECT_OFFSETOF(NativeCallFrameStructure, result)), stackPointerRegister, X86::ecx); + + // Plant callee + emitGetFromCallFrameHeaderPtr(RegisterFile::Callee, X86::eax); + storePtr(X86::eax, Address(stackPointerRegister, OBJECT_OFFSETOF(NativeCallFrameStructure, callee))); + + // Plant callframe + move(callFrameRegister, X86::edx); + + call(Address(X86::eax, OBJECT_OFFSETOF(JSFunction, m_data))); + + // JSValue is a non-POD type + loadPtr(Address(X86::eax), X86::eax); +#else + // Plant callee + emitGetFromCallFrameHeaderPtr(RegisterFile::Callee, X86::edx); + + // Plant callframe + move(callFrameRegister, X86::ecx); + call(Address(X86::edx, OBJECT_OFFSETOF(JSFunction, m_data))); +#endif + + // We've put a few temporaries on the stack in addition to the actual arguments + // so pull them off now + addPtr(Imm32(NativeCallFrameSize - sizeof(NativeFunctionCalleeSignature)), stackPointerRegister); + +#elif PLATFORM(ARM) && !PLATFORM_ARM_ARCH(7) + emitGetFromCallFrameHeader32(RegisterFile::ArgumentCount, regT0); + + // Allocate stack space for our arglist + COMPILE_ASSERT((sizeof(ArgList) & 0x7) == 0, ArgList_should_by_8byte_aligned); + subPtr(Imm32(sizeof(ArgList)), stackPointerRegister); + + // Set up arguments + subPtr(Imm32(1), regT0); // Don't include 'this' in argcount + + // Push argcount + storePtr(regT0, Address(stackPointerRegister, OBJECT_OFFSETOF(ArgList, m_argCount))); + + // Calculate the start of the callframe header, and store in regT1 + move(callFrameRegister, regT1); + sub32(Imm32(RegisterFile::CallFrameHeaderSize * (int32_t)sizeof(Register)), regT1); + + // Calculate start of arguments as callframe header - sizeof(Register) * argcount (regT1) + mul32(Imm32(sizeof(Register)), regT0, regT0); + subPtr(regT0, regT1); + + // push pointer to arguments + storePtr(regT1, Address(stackPointerRegister, OBJECT_OFFSETOF(ArgList, m_args))); + + // Setup arg3: regT1 currently points to the first argument, regT1-sizeof(Register) points to 'this' + loadPtr(Address(regT1, -(int32_t)sizeof(Register)), regT2); + + // Setup arg2: + emitGetFromCallFrameHeaderPtr(RegisterFile::Callee, regT1); + + // Setup arg1: + move(callFrameRegister, regT0); + + // Setup arg4: This is a plain hack + move(stackPointerRegister, ARM::S0); + + move(ctiReturnRegister, ARM::lr); + call(Address(regT1, OBJECT_OFFSETOF(JSFunction, m_data))); + + addPtr(Imm32(sizeof(ArgList)), stackPointerRegister); + +#elif ENABLE(JIT_OPTIMIZE_NATIVE_CALL) +#error "JIT_OPTIMIZE_NATIVE_CALL not yet supported on this platform." +#else + breakpoint(); +#endif + + // Check for an exception + loadPtr(&(globalData->exception), regT2); + Jump exceptionHandler = branchTestPtr(NonZero, regT2); + + // Grab the return address. + emitGetFromCallFrameHeaderPtr(RegisterFile::ReturnPC, regT1); + + // Restore our caller's "r". + emitGetFromCallFrameHeaderPtr(RegisterFile::CallerFrame, callFrameRegister); + + // Return. + restoreReturnAddressBeforeReturn(regT1); + ret(); + + // Handle an exception + exceptionHandler.link(this); + // Grab the return address. + emitGetFromCallFrameHeaderPtr(RegisterFile::ReturnPC, regT1); + move(ImmPtr(&globalData->exceptionLocation), regT2); + storePtr(regT1, regT2); + move(ImmPtr(reinterpret_cast<void*>(ctiVMThrowTrampoline)), regT2); + emitGetFromCallFrameHeaderPtr(RegisterFile::CallerFrame, callFrameRegister); + poke(callFrameRegister, OBJECT_OFFSETOF(struct JITStackFrame, callFrame) / sizeof (void*)); + restoreReturnAddressBeforeReturn(regT2); + ret(); + + +#if ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) + Call string_failureCases1Call = makeTailRecursiveCall(string_failureCases1); + Call string_failureCases2Call = makeTailRecursiveCall(string_failureCases2); + Call string_failureCases3Call = makeTailRecursiveCall(string_failureCases3); +#endif + + // All trampolines constructed! copy the code, link up calls, and set the pointers on the Machine object. + LinkBuffer patchBuffer(this, m_globalData->executableAllocator.poolForSize(m_assembler.size())); + +#if ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) + patchBuffer.link(string_failureCases1Call, FunctionPtr(cti_op_get_by_id_string_fail)); + patchBuffer.link(string_failureCases2Call, FunctionPtr(cti_op_get_by_id_string_fail)); + patchBuffer.link(string_failureCases3Call, FunctionPtr(cti_op_get_by_id_string_fail)); +#endif + patchBuffer.link(callArityCheck1, FunctionPtr(cti_op_call_arityCheck)); + patchBuffer.link(callJSFunction1, FunctionPtr(cti_op_call_JSFunction)); +#if ENABLE(JIT_OPTIMIZE_CALL) + patchBuffer.link(callArityCheck2, FunctionPtr(cti_op_call_arityCheck)); + patchBuffer.link(callJSFunction2, FunctionPtr(cti_op_call_JSFunction)); + patchBuffer.link(callLazyLinkCall, FunctionPtr(cti_vm_lazyLinkCall)); +#endif + + CodeRef finalCode = patchBuffer.finalizeCode(); + *executablePool = finalCode.m_executablePool; + + *ctiVirtualCallLink = trampolineAt(finalCode, virtualCallLinkBegin); + *ctiVirtualCall = trampolineAt(finalCode, virtualCallBegin); + *ctiNativeCallThunk = trampolineAt(finalCode, nativeCallThunk); +#if ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) + *ctiStringLengthTrampoline = trampolineAt(finalCode, stringLengthBegin); +#else + UNUSED_PARAM(ctiStringLengthTrampoline); +#endif +} + void JIT::emit_op_mov(Instruction* currentInstruction) { int dst = currentInstruction[1].u.operand; @@ -62,7 +1835,7 @@ void JIT::emit_op_mov(Instruction* currentInstruction) void JIT::emit_op_end(Instruction* currentInstruction) { if (m_codeBlock->needsFullScopeChain()) - JITStubCall(this, JITStubs::cti_op_end).call(); + JITStubCall(this, cti_op_end).call(); ASSERT(returnValueRegister != callFrameRegister); emitGetVirtualRegister(currentInstruction[1].u.operand, returnValueRegister); restoreReturnAddressBeforeReturn(Address(callFrameRegister, RegisterFile::ReturnPC * static_cast<int>(sizeof(Register)))); @@ -94,7 +1867,7 @@ void JIT::emit_op_loop_if_less(Instruction* currentInstruction) if (isOperandConstantImmediateInt(op2)) { emitGetVirtualRegister(op1, regT0); emitJumpSlowCaseIfNotImmediateInteger(regT0); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) int32_t op2imm = getConstantOperandImmediateInt(op2); #else int32_t op2imm = static_cast<int32_t>(JSImmediate::rawValue(getConstantOperand(op2))); @@ -103,7 +1876,7 @@ void JIT::emit_op_loop_if_less(Instruction* currentInstruction) } else if (isOperandConstantImmediateInt(op1)) { emitGetVirtualRegister(op2, regT0); emitJumpSlowCaseIfNotImmediateInteger(regT0); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) int32_t op1imm = getConstantOperandImmediateInt(op1); #else int32_t op1imm = static_cast<int32_t>(JSImmediate::rawValue(getConstantOperand(op1))); @@ -127,7 +1900,7 @@ void JIT::emit_op_loop_if_lesseq(Instruction* currentInstruction) if (isOperandConstantImmediateInt(op2)) { emitGetVirtualRegister(op1, regT0); emitJumpSlowCaseIfNotImmediateInteger(regT0); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) int32_t op2imm = getConstantOperandImmediateInt(op2); #else int32_t op2imm = static_cast<int32_t>(JSImmediate::rawValue(getConstantOperand(op2))); @@ -143,7 +1916,7 @@ void JIT::emit_op_loop_if_lesseq(Instruction* currentInstruction) void JIT::emit_op_new_object(Instruction* currentInstruction) { - JITStubCall(this, JITStubs::cti_op_new_object).call(currentInstruction[1].u.operand); + JITStubCall(this, cti_op_new_object).call(currentInstruction[1].u.operand); } void JIT::emit_op_instanceof(Instruction* currentInstruction) @@ -159,18 +1932,18 @@ void JIT::emit_op_instanceof(Instruction* currentInstruction) emitJumpSlowCaseIfNotJSCell(regT1); // Check that baseVal is an object, that it 'ImplementsHasInstance' but that it does not 'OverridesHasInstance'. - loadPtr(Address(regT0, FIELD_OFFSET(JSCell, m_structure)), regT0); - addSlowCase(branch32(NotEqual, Address(regT0, FIELD_OFFSET(Structure, m_typeInfo.m_type)), Imm32(ObjectType))); - addSlowCase(branchTest32(Zero, Address(regT0, FIELD_OFFSET(Structure, m_typeInfo.m_flags)), Imm32(ImplementsDefaultHasInstance))); + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT0); + addSlowCase(branch32(NotEqual, Address(regT0, OBJECT_OFFSETOF(Structure, m_typeInfo.m_type)), Imm32(ObjectType))); + addSlowCase(branchTest32(Zero, Address(regT0, OBJECT_OFFSETOF(Structure, m_typeInfo.m_flags)), Imm32(ImplementsDefaultHasInstance))); // If value is not an Object, return false. Jump valueIsImmediate = emitJumpIfNotJSCell(regT2); - loadPtr(Address(regT2, FIELD_OFFSET(JSCell, m_structure)), regT0); - Jump valueIsNotObject = branch32(NotEqual, Address(regT0, FIELD_OFFSET(Structure, m_typeInfo.m_type)), Imm32(ObjectType)); + loadPtr(Address(regT2, OBJECT_OFFSETOF(JSCell, m_structure)), regT0); + Jump valueIsNotObject = branch32(NotEqual, Address(regT0, OBJECT_OFFSETOF(Structure, m_typeInfo.m_type)), Imm32(ObjectType)); // Check proto is object. - loadPtr(Address(regT1, FIELD_OFFSET(JSCell, m_structure)), regT0); - addSlowCase(branch32(NotEqual, Address(regT0, FIELD_OFFSET(Structure, m_typeInfo.m_type)), Imm32(ObjectType))); + loadPtr(Address(regT1, OBJECT_OFFSETOF(JSCell, m_structure)), regT0); + addSlowCase(branch32(NotEqual, Address(regT0, OBJECT_OFFSETOF(Structure, m_typeInfo.m_type)), Imm32(ObjectType))); // Optimistically load the result true, and start looping. // Initially, regT1 still contains proto and regT2 still contains value. @@ -180,8 +1953,8 @@ void JIT::emit_op_instanceof(Instruction* currentInstruction) // Load the prototype of the object in regT2. If this is equal to regT1 - WIN! // Otherwise, check if we've hit null - if we have then drop out of the loop, if not go again. - loadPtr(Address(regT2, FIELD_OFFSET(JSCell, m_structure)), regT2); - loadPtr(Address(regT2, FIELD_OFFSET(Structure, m_prototype)), regT2); + loadPtr(Address(regT2, OBJECT_OFFSETOF(JSCell, m_structure)), regT2); + loadPtr(Address(regT2, OBJECT_OFFSETOF(Structure, m_prototype)), regT2); Jump isInstance = branchPtr(Equal, regT2, regT1); branchPtr(NotEqual, regT2, ImmPtr(JSValue::encode(jsNull())), loop); @@ -197,7 +1970,7 @@ void JIT::emit_op_instanceof(Instruction* currentInstruction) void JIT::emit_op_new_func(Instruction* currentInstruction) { - JITStubCall stubCall(this, JITStubs::cti_op_new_func); + JITStubCall stubCall(this, cti_op_new_func); stubCall.addArgument(ImmPtr(m_codeBlock->function(currentInstruction[2].u.operand))); stubCall.call(currentInstruction[1].u.operand); } @@ -214,9 +1987,14 @@ void JIT::emit_op_call_eval(Instruction* currentInstruction) void JIT::emit_op_load_varargs(Instruction* currentInstruction) { - JITStubCall stubCall(this, JITStubs::cti_op_load_varargs); - stubCall.addArgument(Imm32(currentInstruction[2].u.operand)); - stubCall.call(currentInstruction[1].u.operand); + int argCountDst = currentInstruction[1].u.operand; + int argsOffset = currentInstruction[2].u.operand; + + JITStubCall stubCall(this, cti_op_load_varargs); + stubCall.addArgument(Imm32(argsOffset)); + stubCall.call(); + // Stores a naked int32 in the register file. + store32(returnValueRegister, Address(callFrameRegister, argCountDst * sizeof(Register))); } void JIT::emit_op_call_varargs(Instruction* currentInstruction) @@ -251,9 +2029,9 @@ void JIT::emit_op_get_scoped_var(Instruction* currentInstruction) emitGetFromCallFrameHeaderPtr(RegisterFile::ScopeChain, regT0); while (skip--) - loadPtr(Address(regT0, FIELD_OFFSET(ScopeChainNode, next)), regT0); + loadPtr(Address(regT0, OBJECT_OFFSETOF(ScopeChainNode, next)), regT0); - loadPtr(Address(regT0, FIELD_OFFSET(ScopeChainNode, object)), regT0); + loadPtr(Address(regT0, OBJECT_OFFSETOF(ScopeChainNode, object)), regT0); emitGetVariableObjectRegister(regT0, currentInstruction[2].u.operand, regT0); emitPutVirtualRegister(currentInstruction[1].u.operand); } @@ -265,29 +2043,29 @@ void JIT::emit_op_put_scoped_var(Instruction* currentInstruction) emitGetFromCallFrameHeaderPtr(RegisterFile::ScopeChain, regT1); emitGetVirtualRegister(currentInstruction[3].u.operand, regT0); while (skip--) - loadPtr(Address(regT1, FIELD_OFFSET(ScopeChainNode, next)), regT1); + loadPtr(Address(regT1, OBJECT_OFFSETOF(ScopeChainNode, next)), regT1); - loadPtr(Address(regT1, FIELD_OFFSET(ScopeChainNode, object)), regT1); + loadPtr(Address(regT1, OBJECT_OFFSETOF(ScopeChainNode, object)), regT1); emitPutVariableObjectRegister(regT0, regT1, currentInstruction[1].u.operand); } void JIT::emit_op_tear_off_activation(Instruction* currentInstruction) { - JITStubCall stubCall(this, JITStubs::cti_op_tear_off_activation); + JITStubCall stubCall(this, cti_op_tear_off_activation); stubCall.addArgument(currentInstruction[1].u.operand, regT2); stubCall.call(); } void JIT::emit_op_tear_off_arguments(Instruction*) { - JITStubCall(this, JITStubs::cti_op_tear_off_arguments).call(); + JITStubCall(this, cti_op_tear_off_arguments).call(); } void JIT::emit_op_ret(Instruction* currentInstruction) { // We could JIT generate the deref, only calling out to C when the refcount hits zero. if (m_codeBlock->needsFullScopeChain()) - JITStubCall(this, JITStubs::cti_op_ret_scopeChain).call(); + JITStubCall(this, cti_op_ret_scopeChain).call(); ASSERT(callFrameRegister != regT1); ASSERT(regT1 != returnValueRegister); @@ -309,7 +2087,7 @@ void JIT::emit_op_ret(Instruction* currentInstruction) void JIT::emit_op_new_array(Instruction* currentInstruction) { - JITStubCall stubCall(this, JITStubs::cti_op_new_array); + JITStubCall stubCall(this, cti_op_new_array); stubCall.addArgument(Imm32(currentInstruction[2].u.operand)); stubCall.addArgument(Imm32(currentInstruction[3].u.operand)); stubCall.call(currentInstruction[1].u.operand); @@ -317,7 +2095,7 @@ void JIT::emit_op_new_array(Instruction* currentInstruction) void JIT::emit_op_resolve(Instruction* currentInstruction) { - JITStubCall stubCall(this, JITStubs::cti_op_resolve); + JITStubCall stubCall(this, cti_op_resolve); stubCall.addArgument(ImmPtr(&m_codeBlock->identifier(currentInstruction[2].u.operand))); stubCall.call(currentInstruction[1].u.operand); } @@ -327,8 +2105,8 @@ void JIT::emit_op_construct_verify(Instruction* currentInstruction) emitGetVirtualRegister(currentInstruction[1].u.operand, regT0); emitJumpSlowCaseIfNotJSCell(regT0); - loadPtr(Address(regT0, FIELD_OFFSET(JSCell, m_structure)), regT2); - addSlowCase(branch32(NotEqual, Address(regT2, FIELD_OFFSET(Structure, m_typeInfo) + FIELD_OFFSET(TypeInfo, m_type)), Imm32(ObjectType))); + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT2); + addSlowCase(branch32(NotEqual, Address(regT2, OBJECT_OFFSETOF(Structure, m_typeInfo) + OBJECT_OFFSETOF(TypeInfo, m_type)), Imm32(ObjectType))); } @@ -350,20 +2128,12 @@ void JIT::emit_op_to_primitive(Instruction* currentInstruction) void JIT::emit_op_strcat(Instruction* currentInstruction) { - JITStubCall stubCall(this, JITStubs::cti_op_strcat); + JITStubCall stubCall(this, cti_op_strcat); stubCall.addArgument(Imm32(currentInstruction[2].u.operand)); stubCall.addArgument(Imm32(currentInstruction[3].u.operand)); stubCall.call(currentInstruction[1].u.operand); } -void JIT::emit_op_resolve_func(Instruction* currentInstruction) -{ - JITStubCall stubCall(this, JITStubs::cti_op_resolve_func); - stubCall.addArgument(ImmPtr(&m_codeBlock->identifier(currentInstruction[3].u.operand))); - stubCall.addArgument(Imm32(currentInstruction[1].u.operand)); - stubCall.call(currentInstruction[2].u.operand); -} - void JIT::emit_op_loop_if_true(Instruction* currentInstruction) { emitTimeoutCheck(); @@ -381,14 +2151,14 @@ void JIT::emit_op_loop_if_true(Instruction* currentInstruction) }; void JIT::emit_op_resolve_base(Instruction* currentInstruction) { - JITStubCall stubCall(this, JITStubs::cti_op_resolve_base); + JITStubCall stubCall(this, cti_op_resolve_base); stubCall.addArgument(ImmPtr(&m_codeBlock->identifier(currentInstruction[2].u.operand))); stubCall.call(currentInstruction[1].u.operand); } void JIT::emit_op_resolve_skip(Instruction* currentInstruction) { - JITStubCall stubCall(this, JITStubs::cti_op_resolve_skip); + JITStubCall stubCall(this, cti_op_resolve_skip); stubCall.addArgument(ImmPtr(&m_codeBlock->identifier(currentInstruction[2].u.operand))); stubCall.addArgument(Imm32(currentInstruction[3].u.operand + m_codeBlock->needsFullScopeChain())); stubCall.call(currentInstruction[1].u.operand); @@ -407,11 +2177,11 @@ void JIT::emit_op_resolve_global(Instruction* currentInstruction) // Check Structure of global object move(ImmPtr(globalObject), regT0); loadPtr(structureAddress, regT1); - Jump noMatch = branchPtr(NotEqual, regT1, Address(regT0, FIELD_OFFSET(JSCell, m_structure))); // Structures don't match + Jump noMatch = branchPtr(NotEqual, regT1, Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure))); // Structures don't match // Load cached property // Assume that the global object always uses external storage. - loadPtr(Address(regT0, FIELD_OFFSET(JSGlobalObject, m_externalStorage)), regT0); + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSGlobalObject, m_externalStorage)), regT0); load32(offsetAddr, regT1); loadPtr(BaseIndex(regT0, regT1, ScalePtr), regT0); emitPutVirtualRegister(currentInstruction[1].u.operand); @@ -419,7 +2189,7 @@ void JIT::emit_op_resolve_global(Instruction* currentInstruction) // Slow case noMatch.link(this); - JITStubCall stubCall(this, JITStubs::cti_op_resolve_global); + JITStubCall stubCall(this, cti_op_resolve_global); stubCall.addArgument(ImmPtr(globalObject)); stubCall.addArgument(ImmPtr(ident)); stubCall.addArgument(Imm32(currentIndex)); @@ -459,8 +2229,8 @@ void JIT::emit_op_jeq_null(Instruction* currentInstruction) Jump isImmediate = emitJumpIfNotJSCell(regT0); // First, handle JSCell cases - check MasqueradesAsUndefined bit on the structure. - loadPtr(Address(regT0, FIELD_OFFSET(JSCell, m_structure)), regT2); - addJump(branchTest32(NonZero, Address(regT2, FIELD_OFFSET(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined)), target + 2); + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT2); + addJump(branchTest32(NonZero, Address(regT2, OBJECT_OFFSETOF(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined)), target + 2); Jump wasNotImmediate = jump(); // Now handle the immediate cases - undefined & null @@ -480,8 +2250,8 @@ void JIT::emit_op_jneq_null(Instruction* currentInstruction) Jump isImmediate = emitJumpIfNotJSCell(regT0); // First, handle JSCell cases - check MasqueradesAsUndefined bit on the structure. - loadPtr(Address(regT0, FIELD_OFFSET(JSCell, m_structure)), regT2); - addJump(branchTest32(Zero, Address(regT2, FIELD_OFFSET(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined)), target + 2); + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT2); + addJump(branchTest32(Zero, Address(regT2, OBJECT_OFFSETOF(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined)), target + 2); Jump wasNotImmediate = jump(); // Now handle the immediate cases - undefined & null @@ -505,13 +2275,6 @@ void JIT::emit_op_jneq_ptr(Instruction* currentInstruction) RECORD_JUMP_TARGET(target + 3); } -void JIT::emit_op_unexpected_load(Instruction* currentInstruction) -{ - JSValue v = m_codeBlock->unexpectedConstant(currentInstruction[2].u.operand); - move(ImmPtr(JSValue::encode(v)), regT0); - emitPutVirtualRegister(currentInstruction[1].u.operand); -} - void JIT::emit_op_jsr(Instruction* currentInstruction) { int retAddrDst = currentInstruction[1].u.operand; @@ -542,7 +2305,7 @@ void JIT::emit_op_bitnot(Instruction* currentInstruction) { emitGetVirtualRegister(currentInstruction[2].u.operand, regT0); emitJumpSlowCaseIfNotImmediateInteger(regT0); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) not32(regT0); emitFastArithIntToImmNoCheck(regT0, regT0); #else @@ -553,7 +2316,7 @@ void JIT::emit_op_bitnot(Instruction* currentInstruction) void JIT::emit_op_resolve_with_base(Instruction* currentInstruction) { - JITStubCall stubCall(this, JITStubs::cti_op_resolve_with_base); + JITStubCall stubCall(this, cti_op_resolve_with_base); stubCall.addArgument(ImmPtr(&m_codeBlock->identifier(currentInstruction[3].u.operand))); stubCall.addArgument(Imm32(currentInstruction[1].u.operand)); stubCall.call(currentInstruction[2].u.operand); @@ -561,7 +2324,7 @@ void JIT::emit_op_resolve_with_base(Instruction* currentInstruction) void JIT::emit_op_new_func_exp(Instruction* currentInstruction) { - JITStubCall stubCall(this, JITStubs::cti_op_new_func_exp); + JITStubCall stubCall(this, cti_op_new_func_exp); stubCall.addArgument(ImmPtr(m_codeBlock->functionExpression(currentInstruction[2].u.operand))); stubCall.call(currentInstruction[1].u.operand); } @@ -603,7 +2366,7 @@ void JIT::emit_op_bitxor(Instruction* currentInstruction) void JIT::emit_op_new_regexp(Instruction* currentInstruction) { - JITStubCall stubCall(this, JITStubs::cti_op_new_regexp); + JITStubCall stubCall(this, cti_op_new_regexp); stubCall.addArgument(ImmPtr(m_codeBlock->regexp(currentInstruction[2].u.operand))); stubCall.call(currentInstruction[1].u.operand); } @@ -618,7 +2381,7 @@ void JIT::emit_op_bitor(Instruction* currentInstruction) void JIT::emit_op_throw(Instruction* currentInstruction) { - JITStubCall stubCall(this, JITStubs::cti_op_throw); + JITStubCall stubCall(this, cti_op_throw); stubCall.addArgument(currentInstruction[1].u.operand, regT2); stubCall.call(); ASSERT(regT0 == returnValueRegister); @@ -631,7 +2394,7 @@ void JIT::emit_op_throw(Instruction* currentInstruction) void JIT::emit_op_next_pname(Instruction* currentInstruction) { - JITStubCall stubCall(this, JITStubs::cti_op_next_pname); + JITStubCall stubCall(this, cti_op_next_pname); stubCall.addArgument(currentInstruction[2].u.operand, regT2); stubCall.call(); Jump endOfIter = branchTestPtr(Zero, regT0); @@ -642,14 +2405,37 @@ void JIT::emit_op_next_pname(Instruction* currentInstruction) void JIT::emit_op_push_scope(Instruction* currentInstruction) { - JITStubCall stubCall(this, JITStubs::cti_op_push_scope); + JITStubCall stubCall(this, cti_op_push_scope); stubCall.addArgument(currentInstruction[1].u.operand, regT2); stubCall.call(currentInstruction[1].u.operand); } void JIT::emit_op_pop_scope(Instruction*) { - JITStubCall(this, JITStubs::cti_op_pop_scope).call(); + JITStubCall(this, cti_op_pop_scope).call(); +} + +void JIT::compileOpStrictEq(Instruction* currentInstruction, CompileOpStrictEqType type) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned src1 = currentInstruction[2].u.operand; + unsigned src2 = currentInstruction[3].u.operand; + + emitGetVirtualRegisters(src1, regT0, src2, regT1); + + // Jump to a slow case if either operand is a number, or if both are JSCell*s. + move(regT0, regT2); + orPtr(regT1, regT2); + addSlowCase(emitJumpIfJSCell(regT2)); + addSlowCase(emitJumpIfImmediateNumber(regT2)); + + if (type == OpStrictEq) + set32(Equal, regT1, regT0, regT0); + else + set32(NotEqual, regT1, regT0, regT0); + emitTagAsBoolImmediate(regT0); + + emitPutVirtualRegister(dst); } void JIT::emit_op_stricteq(Instruction* currentInstruction) @@ -670,8 +2456,8 @@ void JIT::emit_op_to_jsnumber(Instruction* currentInstruction) Jump wasImmediate = emitJumpIfImmediateInteger(regT0); emitJumpSlowCaseIfNotJSCell(regT0, srcVReg); - loadPtr(Address(regT0, FIELD_OFFSET(JSCell, m_structure)), regT2); - addSlowCase(branch32(NotEqual, Address(regT2, FIELD_OFFSET(Structure, m_typeInfo.m_type)), Imm32(NumberType))); + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT2); + addSlowCase(branch32(NotEqual, Address(regT2, OBJECT_OFFSETOF(Structure, m_typeInfo.m_type)), Imm32(NumberType))); wasImmediate.link(this); @@ -680,7 +2466,7 @@ void JIT::emit_op_to_jsnumber(Instruction* currentInstruction) void JIT::emit_op_push_new_scope(Instruction* currentInstruction) { - JITStubCall stubCall(this, JITStubs::cti_op_push_new_scope); + JITStubCall stubCall(this, cti_op_push_new_scope); stubCall.addArgument(ImmPtr(&m_codeBlock->identifier(currentInstruction[2].u.operand))); stubCall.addArgument(currentInstruction[3].u.operand, regT2); stubCall.call(currentInstruction[1].u.operand); @@ -689,13 +2475,13 @@ void JIT::emit_op_push_new_scope(Instruction* currentInstruction) void JIT::emit_op_catch(Instruction* currentInstruction) { killLastResultRegister(); // FIXME: Implicitly treat op_catch as a labeled statement, and remove this line of code. - peek(callFrameRegister, offsetof(struct JITStackFrame, callFrame) / sizeof (void*)); + peek(callFrameRegister, OBJECT_OFFSETOF(struct JITStackFrame, callFrame) / sizeof (void*)); emitPutVirtualRegister(currentInstruction[1].u.operand); } void JIT::emit_op_jmp_scopes(Instruction* currentInstruction) { - JITStubCall stubCall(this, JITStubs::cti_op_jmp_scopes); + JITStubCall stubCall(this, cti_op_jmp_scopes); stubCall.addArgument(Imm32(currentInstruction[1].u.operand)); stubCall.call(); addJump(jump(), currentInstruction[2].u.operand + 2); @@ -713,7 +2499,7 @@ void JIT::emit_op_switch_imm(Instruction* currentInstruction) m_switches.append(SwitchRecord(jumpTable, m_bytecodeIndex, defaultOffset, SwitchRecord::Immediate)); jumpTable->ctiOffsets.grow(jumpTable->branchOffsets.size()); - JITStubCall stubCall(this, JITStubs::cti_op_switch_imm); + JITStubCall stubCall(this, cti_op_switch_imm); stubCall.addArgument(scrutinee, regT2); stubCall.addArgument(Imm32(tableIndex)); stubCall.call(); @@ -731,7 +2517,7 @@ void JIT::emit_op_switch_char(Instruction* currentInstruction) m_switches.append(SwitchRecord(jumpTable, m_bytecodeIndex, defaultOffset, SwitchRecord::Character)); jumpTable->ctiOffsets.grow(jumpTable->branchOffsets.size()); - JITStubCall stubCall(this, JITStubs::cti_op_switch_char); + JITStubCall stubCall(this, cti_op_switch_char); stubCall.addArgument(scrutinee, regT2); stubCall.addArgument(Imm32(tableIndex)); stubCall.call(); @@ -748,7 +2534,7 @@ void JIT::emit_op_switch_string(Instruction* currentInstruction) StringJumpTable* jumpTable = &m_codeBlock->stringSwitchJumpTable(tableIndex); m_switches.append(SwitchRecord(jumpTable, m_bytecodeIndex, defaultOffset)); - JITStubCall stubCall(this, JITStubs::cti_op_switch_string); + JITStubCall stubCall(this, cti_op_switch_string); stubCall.addArgument(scrutinee, regT2); stubCall.addArgument(Imm32(tableIndex)); stubCall.call(); @@ -757,16 +2543,16 @@ void JIT::emit_op_switch_string(Instruction* currentInstruction) void JIT::emit_op_new_error(Instruction* currentInstruction) { - JITStubCall stubCall(this, JITStubs::cti_op_new_error); + JITStubCall stubCall(this, cti_op_new_error); stubCall.addArgument(Imm32(currentInstruction[2].u.operand)); - stubCall.addArgument(ImmPtr(JSValue::encode(m_codeBlock->unexpectedConstant(currentInstruction[3].u.operand)))); + stubCall.addArgument(ImmPtr(JSValue::encode(m_codeBlock->getConstant(currentInstruction[3].u.operand)))); stubCall.addArgument(Imm32(m_bytecodeIndex)); stubCall.call(currentInstruction[1].u.operand); } void JIT::emit_op_debug(Instruction* currentInstruction) { - JITStubCall stubCall(this, JITStubs::cti_op_debug); + JITStubCall stubCall(this, cti_op_debug); stubCall.addArgument(Imm32(currentInstruction[1].u.operand)); stubCall.addArgument(Imm32(currentInstruction[2].u.operand)); stubCall.addArgument(Imm32(currentInstruction[3].u.operand)); @@ -781,8 +2567,8 @@ void JIT::emit_op_eq_null(Instruction* currentInstruction) emitGetVirtualRegister(src1, regT0); Jump isImmediate = emitJumpIfNotJSCell(regT0); - loadPtr(Address(regT0, FIELD_OFFSET(JSCell, m_structure)), regT2); - setTest32(NonZero, Address(regT2, FIELD_OFFSET(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined), regT0); + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT2); + setTest32(NonZero, Address(regT2, OBJECT_OFFSETOF(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined), regT0); Jump wasNotImmediate = jump(); @@ -806,8 +2592,8 @@ void JIT::emit_op_neq_null(Instruction* currentInstruction) emitGetVirtualRegister(src1, regT0); Jump isImmediate = emitJumpIfNotJSCell(regT0); - loadPtr(Address(regT0, FIELD_OFFSET(JSCell, m_structure)), regT2); - setTest32(Zero, Address(regT2, FIELD_OFFSET(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined), regT0); + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT2); + setTest32(Zero, Address(regT2, OBJECT_OFFSETOF(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined), regT0); Jump wasNotImmediate = jump(); @@ -828,7 +2614,7 @@ void JIT::emit_op_enter(Instruction*) // Even though CTI doesn't use them, we initialize our constant // registers to zap stale pointers, to avoid unnecessarily prolonging // object lifetime and increasing GC pressure. - size_t count = m_codeBlock->m_numVars + m_codeBlock->numberOfConstantRegisters(); + size_t count = m_codeBlock->m_numVars; for (size_t j = 0; j < count; ++j) emitInitRegister(j); @@ -839,20 +2625,20 @@ void JIT::emit_op_enter_with_activation(Instruction* currentInstruction) // Even though CTI doesn't use them, we initialize our constant // registers to zap stale pointers, to avoid unnecessarily prolonging // object lifetime and increasing GC pressure. - size_t count = m_codeBlock->m_numVars + m_codeBlock->numberOfConstantRegisters(); + size_t count = m_codeBlock->m_numVars; for (size_t j = 0; j < count; ++j) emitInitRegister(j); - JITStubCall(this, JITStubs::cti_op_push_activation).call(currentInstruction[1].u.operand); + JITStubCall(this, cti_op_push_activation).call(currentInstruction[1].u.operand); } void JIT::emit_op_create_arguments(Instruction*) { Jump argsCreated = branchTestPtr(NonZero, Address(callFrameRegister, sizeof(Register) * RegisterFile::ArgumentsRegister)); if (m_codeBlock->m_numParameters == 1) - JITStubCall(this, JITStubs::cti_op_create_arguments_no_params).call(); + JITStubCall(this, cti_op_create_arguments_no_params).call(); else - JITStubCall(this, JITStubs::cti_op_create_arguments).call(); + JITStubCall(this, cti_op_create_arguments).call(); argsCreated.link(this); } @@ -866,17 +2652,17 @@ void JIT::emit_op_convert_this(Instruction* currentInstruction) emitGetVirtualRegister(currentInstruction[1].u.operand, regT0); emitJumpSlowCaseIfNotJSCell(regT0); - loadPtr(Address(regT0, FIELD_OFFSET(JSCell, m_structure)), regT1); - addSlowCase(branchTest32(NonZero, Address(regT1, FIELD_OFFSET(Structure, m_typeInfo.m_flags)), Imm32(NeedsThisConversion))); + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT1); + addSlowCase(branchTest32(NonZero, Address(regT1, OBJECT_OFFSETOF(Structure, m_typeInfo.m_flags)), Imm32(NeedsThisConversion))); } void JIT::emit_op_profile_will_call(Instruction* currentInstruction) { - peek(regT1, FIELD_OFFSET(JITStackFrame, enabledProfilerReference) / sizeof (void*)); + peek(regT1, OBJECT_OFFSETOF(JITStackFrame, enabledProfilerReference) / sizeof (void*)); Jump noProfiler = branchTestPtr(Zero, Address(regT1)); - JITStubCall stubCall(this, JITStubs::cti_op_profile_will_call); + JITStubCall stubCall(this, cti_op_profile_will_call); stubCall.addArgument(currentInstruction[1].u.operand, regT1); stubCall.call(); noProfiler.link(this); @@ -885,10 +2671,10 @@ void JIT::emit_op_profile_will_call(Instruction* currentInstruction) void JIT::emit_op_profile_did_call(Instruction* currentInstruction) { - peek(regT1, FIELD_OFFSET(JITStackFrame, enabledProfilerReference) / sizeof (void*)); + peek(regT1, OBJECT_OFFSETOF(JITStackFrame, enabledProfilerReference) / sizeof (void*)); Jump noProfiler = branchTestPtr(Zero, Address(regT1)); - JITStubCall stubCall(this, JITStubs::cti_op_profile_did_call); + JITStubCall stubCall(this, cti_op_profile_did_call); stubCall.addArgument(currentInstruction[1].u.operand, regT1); stubCall.call(); noProfiler.link(this); @@ -901,7 +2687,7 @@ void JIT::emitSlow_op_convert_this(Instruction* currentInstruction, Vector<SlowC { linkSlowCase(iter); linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_convert_this); + JITStubCall stubCall(this, cti_op_convert_this); stubCall.addArgument(regT0); stubCall.call(currentInstruction[1].u.operand); } @@ -918,7 +2704,7 @@ void JIT::emitSlow_op_to_primitive(Instruction* currentInstruction, Vector<SlowC { linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_to_primitive); + JITStubCall stubCall(this, cti_op_to_primitive); stubCall.addArgument(regT0); stubCall.call(currentInstruction[1].u.operand); } @@ -934,7 +2720,7 @@ void JIT::emitSlow_op_get_by_val(Instruction* currentInstruction, Vector<SlowCas emitFastArithIntToImmNoCheck(regT1, regT1); notImm.link(this); - JITStubCall stubCall(this, JITStubs::cti_op_get_by_val); + JITStubCall stubCall(this, cti_op_get_by_val); stubCall.addArgument(regT0); stubCall.addArgument(regT1); stubCall.call(currentInstruction[1].u.operand); @@ -943,10 +2729,10 @@ void JIT::emitSlow_op_get_by_val(Instruction* currentInstruction, Vector<SlowCas // This is slow void JIT::emitSlow_that handles accesses to arrays above the fast cut-off. // First, check if this is an access to the vector linkSlowCase(iter); - branch32(AboveOrEqual, regT1, Address(regT2, FIELD_OFFSET(ArrayStorage, m_vectorLength)), beginGetByValSlow); + branch32(AboveOrEqual, regT1, Address(regT2, OBJECT_OFFSETOF(ArrayStorage, m_vectorLength)), beginGetByValSlow); // okay, missed the fast region, but it is still in the vector. Get the value. - loadPtr(BaseIndex(regT2, regT1, ScalePtr, FIELD_OFFSET(ArrayStorage, m_vector[0])), regT2); + loadPtr(BaseIndex(regT2, regT1, ScalePtr, OBJECT_OFFSETOF(ArrayStorage, m_vector[0])), regT2); // Check whether the value loaded is zero; if so we need to return undefined. branchTestPtr(Zero, regT2, beginGetByValSlow); move(regT2, regT0); @@ -960,14 +2746,14 @@ void JIT::emitSlow_op_loop_if_less(Instruction* currentInstruction, Vector<SlowC unsigned target = currentInstruction[3].u.operand; if (isOperandConstantImmediateInt(op2)) { linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_loop_if_less); + JITStubCall stubCall(this, cti_op_loop_if_less); stubCall.addArgument(regT0); stubCall.addArgument(op2, regT2); stubCall.call(); emitJumpSlowToHot(branchTest32(NonZero, regT0), target + 3); } else if (isOperandConstantImmediateInt(op1)) { linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_loop_if_less); + JITStubCall stubCall(this, cti_op_loop_if_less); stubCall.addArgument(op1, regT2); stubCall.addArgument(regT0); stubCall.call(); @@ -975,7 +2761,7 @@ void JIT::emitSlow_op_loop_if_less(Instruction* currentInstruction, Vector<SlowC } else { linkSlowCase(iter); linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_loop_if_less); + JITStubCall stubCall(this, cti_op_loop_if_less); stubCall.addArgument(regT0); stubCall.addArgument(regT1); stubCall.call(); @@ -989,7 +2775,7 @@ void JIT::emitSlow_op_loop_if_lesseq(Instruction* currentInstruction, Vector<Slo unsigned target = currentInstruction[3].u.operand; if (isOperandConstantImmediateInt(op2)) { linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_loop_if_lesseq); + JITStubCall stubCall(this, cti_op_loop_if_lesseq); stubCall.addArgument(regT0); stubCall.addArgument(currentInstruction[2].u.operand, regT2); stubCall.call(); @@ -997,7 +2783,7 @@ void JIT::emitSlow_op_loop_if_lesseq(Instruction* currentInstruction, Vector<Slo } else { linkSlowCase(iter); linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_loop_if_lesseq); + JITStubCall stubCall(this, cti_op_loop_if_lesseq); stubCall.addArgument(regT0); stubCall.addArgument(regT1); stubCall.call(); @@ -1014,7 +2800,7 @@ void JIT::emitSlow_op_put_by_val(Instruction* currentInstruction, Vector<SlowCas emitFastArithIntToImmNoCheck(regT1, regT1); notImm.link(this); { - JITStubCall stubCall(this, JITStubs::cti_op_put_by_val); + JITStubCall stubCall(this, cti_op_put_by_val); stubCall.addArgument(regT0); stubCall.addArgument(regT1); stubCall.addArgument(currentInstruction[3].u.operand, regT2); @@ -1025,7 +2811,7 @@ void JIT::emitSlow_op_put_by_val(Instruction* currentInstruction, Vector<SlowCas // slow cases for immediate int accesses to arrays linkSlowCase(iter); linkSlowCase(iter); { - JITStubCall stubCall(this, JITStubs::cti_op_put_by_val_array); + JITStubCall stubCall(this, cti_op_put_by_val_array); stubCall.addArgument(regT0); stubCall.addArgument(regT1); stubCall.addArgument(currentInstruction[3].u.operand, regT2); @@ -1036,7 +2822,7 @@ void JIT::emitSlow_op_put_by_val(Instruction* currentInstruction, Vector<SlowCas void JIT::emitSlow_op_loop_if_true(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) { linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_jtrue); + JITStubCall stubCall(this, cti_op_jtrue); stubCall.addArgument(regT0); stubCall.call(); emitJumpSlowToHot(branchTest32(NonZero, regT0), currentInstruction[2].u.operand + 2); @@ -1046,7 +2832,7 @@ void JIT::emitSlow_op_not(Instruction* currentInstruction, Vector<SlowCaseEntry> { linkSlowCase(iter); xorPtr(Imm32(static_cast<int32_t>(JSImmediate::FullTagTypeBool)), regT0); - JITStubCall stubCall(this, JITStubs::cti_op_not); + JITStubCall stubCall(this, cti_op_not); stubCall.addArgument(regT0); stubCall.call(currentInstruction[1].u.operand); } @@ -1054,7 +2840,7 @@ void JIT::emitSlow_op_not(Instruction* currentInstruction, Vector<SlowCaseEntry> void JIT::emitSlow_op_jfalse(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) { linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_jtrue); + JITStubCall stubCall(this, cti_op_jtrue); stubCall.addArgument(regT0); stubCall.call(); emitJumpSlowToHot(branchTest32(Zero, regT0), currentInstruction[2].u.operand + 2); // inverted! @@ -1063,7 +2849,7 @@ void JIT::emitSlow_op_jfalse(Instruction* currentInstruction, Vector<SlowCaseEnt void JIT::emitSlow_op_bitnot(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) { linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_bitnot); + JITStubCall stubCall(this, cti_op_bitnot); stubCall.addArgument(regT0); stubCall.call(currentInstruction[1].u.operand); } @@ -1071,7 +2857,7 @@ void JIT::emitSlow_op_bitnot(Instruction* currentInstruction, Vector<SlowCaseEnt void JIT::emitSlow_op_jtrue(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) { linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_jtrue); + JITStubCall stubCall(this, cti_op_jtrue); stubCall.addArgument(regT0); stubCall.call(); emitJumpSlowToHot(branchTest32(NonZero, regT0), currentInstruction[2].u.operand + 2); @@ -1080,7 +2866,7 @@ void JIT::emitSlow_op_jtrue(Instruction* currentInstruction, Vector<SlowCaseEntr void JIT::emitSlow_op_bitxor(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) { linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_bitxor); + JITStubCall stubCall(this, cti_op_bitxor); stubCall.addArgument(regT0); stubCall.addArgument(regT1); stubCall.call(currentInstruction[1].u.operand); @@ -1089,7 +2875,7 @@ void JIT::emitSlow_op_bitxor(Instruction* currentInstruction, Vector<SlowCaseEnt void JIT::emitSlow_op_bitor(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) { linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_bitor); + JITStubCall stubCall(this, cti_op_bitor); stubCall.addArgument(regT0); stubCall.addArgument(regT1); stubCall.call(currentInstruction[1].u.operand); @@ -1098,26 +2884,31 @@ void JIT::emitSlow_op_bitor(Instruction* currentInstruction, Vector<SlowCaseEntr void JIT::emitSlow_op_eq(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) { linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_eq); + JITStubCall stubCall(this, cti_op_eq); stubCall.addArgument(regT0); stubCall.addArgument(regT1); - stubCall.call(currentInstruction[1].u.operand); + stubCall.call(); + emitTagAsBoolImmediate(regT0); + emitPutVirtualRegister(currentInstruction[1].u.operand); } void JIT::emitSlow_op_neq(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) { linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_neq); + JITStubCall stubCall(this, cti_op_eq); stubCall.addArgument(regT0); stubCall.addArgument(regT1); - stubCall.call(currentInstruction[1].u.operand); + stubCall.call(); + xor32(Imm32(0x1), regT0); + emitTagAsBoolImmediate(regT0); + emitPutVirtualRegister(currentInstruction[1].u.operand); } void JIT::emitSlow_op_stricteq(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) { linkSlowCase(iter); linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_stricteq); + JITStubCall stubCall(this, cti_op_stricteq); stubCall.addArgument(regT0); stubCall.addArgument(regT1); stubCall.call(currentInstruction[1].u.operand); @@ -1127,7 +2918,7 @@ void JIT::emitSlow_op_nstricteq(Instruction* currentInstruction, Vector<SlowCase { linkSlowCase(iter); linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_nstricteq); + JITStubCall stubCall(this, cti_op_nstricteq); stubCall.addArgument(regT0); stubCall.addArgument(regT1); stubCall.call(currentInstruction[1].u.operand); @@ -1140,7 +2931,7 @@ void JIT::emitSlow_op_instanceof(Instruction* currentInstruction, Vector<SlowCas linkSlowCase(iter); linkSlowCase(iter); linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_instanceof); + JITStubCall stubCall(this, cti_op_instanceof); stubCall.addArgument(currentInstruction[2].u.operand, regT2); stubCall.addArgument(currentInstruction[3].u.operand, regT2); stubCall.addArgument(currentInstruction[4].u.operand, regT2); @@ -1172,11 +2963,12 @@ void JIT::emitSlow_op_to_jsnumber(Instruction* currentInstruction, Vector<SlowCa linkSlowCaseIfNotJSCell(iter, currentInstruction[2].u.operand); linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_to_jsnumber); + JITStubCall stubCall(this, cti_op_to_jsnumber); stubCall.addArgument(regT0); stubCall.call(currentInstruction[1].u.operand); } +#endif // USE(JSVALUE32_64) } // namespace JSC diff --git a/JavaScriptCore/jit/JITPropertyAccess.cpp b/JavaScriptCore/jit/JITPropertyAccess.cpp index 3a6f9b3..9dba2e2 100644 --- a/JavaScriptCore/jit/JITPropertyAccess.cpp +++ b/JavaScriptCore/jit/JITPropertyAccess.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 Apple Inc. All rights reserved. + * Copyright (C) 2008, 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 @@ -34,6 +34,8 @@ #include "JSArray.h" #include "JSFunction.h" #include "Interpreter.h" +#include "LinkBuffer.h" +#include "RepatchBuffer.h" #include "ResultType.h" #include "SamplingTool.h" @@ -45,11 +47,920 @@ using namespace std; namespace JSC { +#if USE(JSVALUE32_64) + +void JIT::emit_op_put_by_index(Instruction* currentInstruction) +{ + unsigned base = currentInstruction[1].u.operand; + unsigned property = currentInstruction[2].u.operand; + unsigned value = currentInstruction[3].u.operand; + + JITStubCall stubCall(this, cti_op_put_by_index); + stubCall.addArgument(base); + stubCall.addArgument(Imm32(property)); + stubCall.addArgument(value); + stubCall.call(); +} + +void JIT::emit_op_put_getter(Instruction* currentInstruction) +{ + unsigned base = currentInstruction[1].u.operand; + unsigned property = currentInstruction[2].u.operand; + unsigned function = currentInstruction[3].u.operand; + + JITStubCall stubCall(this, cti_op_put_getter); + stubCall.addArgument(base); + stubCall.addArgument(ImmPtr(&m_codeBlock->identifier(property))); + stubCall.addArgument(function); + stubCall.call(); +} + +void JIT::emit_op_put_setter(Instruction* currentInstruction) +{ + unsigned base = currentInstruction[1].u.operand; + unsigned property = currentInstruction[2].u.operand; + unsigned function = currentInstruction[3].u.operand; + + JITStubCall stubCall(this, cti_op_put_setter); + stubCall.addArgument(base); + stubCall.addArgument(ImmPtr(&m_codeBlock->identifier(property))); + stubCall.addArgument(function); + stubCall.call(); +} + +void JIT::emit_op_del_by_id(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned base = currentInstruction[2].u.operand; + unsigned property = currentInstruction[3].u.operand; + + JITStubCall stubCall(this, cti_op_del_by_id); + stubCall.addArgument(base); + stubCall.addArgument(ImmPtr(&m_codeBlock->identifier(property))); + stubCall.call(dst); +} + + +#if !ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) + +/* ------------------------------ BEGIN: !ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) ------------------------------ */ + +// Treat these as nops - the call will be handed as a regular get_by_id/op_call pair. +void JIT::emit_op_method_check(Instruction*) {} +void JIT::emitSlow_op_method_check(Instruction*, Vector<SlowCaseEntry>::iterator&) { ASSERT_NOT_REACHED(); } +#if ENABLE(JIT_OPTIMIZE_METHOD_CALLS) +#error "JIT_OPTIMIZE_METHOD_CALLS requires JIT_OPTIMIZE_PROPERTY_ACCESS" +#endif + +void JIT::emit_op_get_by_val(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned base = currentInstruction[2].u.operand; + unsigned property = currentInstruction[3].u.operand; + + JITStubCall stubCall(this, cti_op_get_by_val); + stubCall.addArgument(base); + stubCall.addArgument(property); + stubCall.call(dst); +} + +void JIT::emitSlow_op_get_by_val(Instruction*, Vector<SlowCaseEntry>::iterator&) +{ + ASSERT_NOT_REACHED(); +} + +void JIT::emit_op_put_by_val(Instruction* currentInstruction) +{ + unsigned base = currentInstruction[1].u.operand; + unsigned property = currentInstruction[2].u.operand; + unsigned value = currentInstruction[3].u.operand; + + JITStubCall stubCall(this, cti_op_put_by_val); + stubCall.addArgument(base); + stubCall.addArgument(property); + stubCall.addArgument(value); + stubCall.call(); +} + +void JIT::emitSlow_op_put_by_val(Instruction*, Vector<SlowCaseEntry>::iterator&) +{ + ASSERT_NOT_REACHED(); +} + +void JIT::emit_op_get_by_id(Instruction* currentInstruction) +{ + int dst = currentInstruction[1].u.operand; + int base = currentInstruction[2].u.operand; + int ident = currentInstruction[3].u.operand; + + JITStubCall stubCall(this, cti_op_get_by_id_generic); + stubCall.addArgument(base); + stubCall.addArgument(ImmPtr(&(m_codeBlock->identifier(ident)))); + stubCall.call(dst); + + m_propertyAccessInstructionIndex++; +} + +void JIT::emitSlow_op_get_by_id(Instruction*, Vector<SlowCaseEntry>::iterator&) +{ + m_propertyAccessInstructionIndex++; + ASSERT_NOT_REACHED(); +} + +void JIT::emit_op_put_by_id(Instruction* currentInstruction) +{ + int base = currentInstruction[1].u.operand; + int ident = currentInstruction[2].u.operand; + int value = currentInstruction[3].u.operand; + + JITStubCall stubCall(this, cti_op_put_by_id_generic); + stubCall.addArgument(base); + stubCall.addArgument(ImmPtr(&(m_codeBlock->identifier(ident)))); + stubCall.addArgument(value); + stubCall.call(); + + m_propertyAccessInstructionIndex++; +} + +void JIT::emitSlow_op_put_by_id(Instruction*, Vector<SlowCaseEntry>::iterator&) +{ + m_propertyAccessInstructionIndex++; + ASSERT_NOT_REACHED(); +} + +#else // !ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) + +/* ------------------------------ BEGIN: ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) ------------------------------ */ + +#if ENABLE(JIT_OPTIMIZE_METHOD_CALLS) + +void JIT::emit_op_method_check(Instruction* currentInstruction) +{ + // Assert that the following instruction is a get_by_id. + ASSERT(m_interpreter->getOpcodeID((currentInstruction + OPCODE_LENGTH(op_method_check))->u.opcode) == op_get_by_id); + + currentInstruction += OPCODE_LENGTH(op_method_check); + + // Do the method check - check the object & its prototype's structure inline (this is the common case). + m_methodCallCompilationInfo.append(MethodCallCompilationInfo(m_propertyAccessInstructionIndex)); + MethodCallCompilationInfo& info = m_methodCallCompilationInfo.last(); + + int dst = currentInstruction[1].u.operand; + int base = currentInstruction[2].u.operand; + + emitLoad(base, regT1, regT0); + emitJumpSlowCaseIfNotJSCell(base, regT1); + + Jump structureCheck = branchPtrWithPatch(NotEqual, Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), info.structureToCompare, ImmPtr(reinterpret_cast<void*>(patchGetByIdDefaultStructure))); + DataLabelPtr protoStructureToCompare, protoObj = moveWithPatch(ImmPtr(0), regT2); + Jump protoStructureCheck = branchPtrWithPatch(NotEqual, Address(regT2, OBJECT_OFFSETOF(JSCell, m_structure)), protoStructureToCompare, ImmPtr(reinterpret_cast<void*>(patchGetByIdDefaultStructure))); + + // This will be relinked to load the function without doing a load. + DataLabelPtr putFunction = moveWithPatch(ImmPtr(0), regT0); + move(Imm32(JSValue::CellTag), regT1); + Jump match = jump(); + + ASSERT(differenceBetween(info.structureToCompare, protoObj) == patchOffsetMethodCheckProtoObj); + ASSERT(differenceBetween(info.structureToCompare, protoStructureToCompare) == patchOffsetMethodCheckProtoStruct); + ASSERT(differenceBetween(info.structureToCompare, putFunction) == patchOffsetMethodCheckPutFunction); + + // Link the failure cases here. + structureCheck.link(this); + protoStructureCheck.link(this); + + // Do a regular(ish) get_by_id (the slow case will be link to + // cti_op_get_by_id_method_check instead of cti_op_get_by_id. + compileGetByIdHotPath(); + + match.link(this); + emitStore(dst, regT1, regT0); + map(m_bytecodeIndex + OPCODE_LENGTH(op_method_check), dst, regT1, regT0); + + // We've already generated the following get_by_id, so make sure it's skipped over. + m_bytecodeIndex += OPCODE_LENGTH(op_get_by_id); +} + +void JIT::emitSlow_op_method_check(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + currentInstruction += OPCODE_LENGTH(op_method_check); + + int dst = currentInstruction[1].u.operand; + int base = currentInstruction[2].u.operand; + int ident = currentInstruction[3].u.operand; + + compileGetByIdSlowCase(dst, base, &(m_codeBlock->identifier(ident)), iter, true); + + // We've already generated the following get_by_id, so make sure it's skipped over. + m_bytecodeIndex += OPCODE_LENGTH(op_get_by_id); +} + +#else //!ENABLE(JIT_OPTIMIZE_METHOD_CALLS) + +// Treat these as nops - the call will be handed as a regular get_by_id/op_call pair. +void JIT::emit_op_method_check(Instruction*) {} +void JIT::emitSlow_op_method_check(Instruction*, Vector<SlowCaseEntry>::iterator&) { ASSERT_NOT_REACHED(); } + +#endif + +void JIT::emit_op_get_by_val(Instruction* currentInstruction) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned base = currentInstruction[2].u.operand; + unsigned property = currentInstruction[3].u.operand; + + emitLoad2(base, regT1, regT0, property, regT3, regT2); + + addSlowCase(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag))); + emitJumpSlowCaseIfNotJSCell(base, regT1); + addSlowCase(branchPtr(NotEqual, Address(regT0), ImmPtr(m_globalData->jsArrayVPtr))); + addSlowCase(branch32(AboveOrEqual, regT2, Address(regT0, OBJECT_OFFSETOF(JSArray, m_fastAccessCutoff)))); + + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSArray, m_storage)), regT0); + load32(BaseIndex(regT0, regT2, TimesEight, OBJECT_OFFSETOF(ArrayStorage, m_vector[0]) + 4), regT1); // tag + load32(BaseIndex(regT0, regT2, TimesEight, OBJECT_OFFSETOF(ArrayStorage, m_vector[0])), regT0); // payload + emitStore(dst, regT1, regT0); + map(m_bytecodeIndex + OPCODE_LENGTH(op_get_by_val), dst, regT1, regT0); +} + +void JIT::emitSlow_op_get_by_val(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned dst = currentInstruction[1].u.operand; + unsigned base = currentInstruction[2].u.operand; + unsigned property = currentInstruction[3].u.operand; + + // The slow void JIT::emitSlow_that handles accesses to arrays (below) may jump back up to here. + Label callGetByValJITStub(this); + + linkSlowCase(iter); // property int32 check + linkSlowCaseIfNotJSCell(iter, base); // base cell check + linkSlowCase(iter); // base array check + + JITStubCall stubCall(this, cti_op_get_by_val); + stubCall.addArgument(base); + stubCall.addArgument(property); + stubCall.call(dst); + + emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_get_by_val)); + + linkSlowCase(iter); // array fast cut-off check + + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSArray, m_storage)), regT0); + branch32(AboveOrEqual, regT2, Address(regT0, OBJECT_OFFSETOF(ArrayStorage, m_vectorLength)), callGetByValJITStub); + + // Missed the fast region, but it is still in the vector. + load32(BaseIndex(regT0, regT2, TimesEight, OBJECT_OFFSETOF(ArrayStorage, m_vector[0]) + 4), regT1); // tag + load32(BaseIndex(regT0, regT2, TimesEight, OBJECT_OFFSETOF(ArrayStorage, m_vector[0])), regT0); // payload + + // FIXME: Maybe we can optimize this comparison to JSValue(). + Jump skip = branch32(NotEqual, regT0, Imm32(0)); + branch32(Equal, regT1, Imm32(JSValue::CellTag), callGetByValJITStub); + + skip.link(this); + emitStore(dst, regT1, regT0); +} + +void JIT::emit_op_put_by_val(Instruction* currentInstruction) +{ + unsigned base = currentInstruction[1].u.operand; + unsigned property = currentInstruction[2].u.operand; + unsigned value = currentInstruction[3].u.operand; + + emitLoad2(base, regT1, regT0, property, regT3, regT2); + + addSlowCase(branch32(NotEqual, regT3, Imm32(JSValue::Int32Tag))); + emitJumpSlowCaseIfNotJSCell(base, regT1); + addSlowCase(branchPtr(NotEqual, Address(regT0), ImmPtr(m_globalData->jsArrayVPtr))); + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSArray, m_storage)), regT3); + + Jump inFastVector = branch32(Below, regT2, Address(regT0, OBJECT_OFFSETOF(JSArray, m_fastAccessCutoff))); + + // Check if the access is within the vector. + addSlowCase(branch32(AboveOrEqual, regT2, Address(regT3, OBJECT_OFFSETOF(ArrayStorage, m_vectorLength)))); + + // This is a write to the slow part of the vector; first, we have to check if this would be the first write to this location. + // FIXME: should be able to handle initial write to array; increment the the number of items in the array, and potentially update fast access cutoff. + Jump skip = branch32(NotEqual, BaseIndex(regT3, regT2, TimesEight, OBJECT_OFFSETOF(ArrayStorage, m_vector[0]) + 4), Imm32(JSValue::CellTag)); + addSlowCase(branch32(Equal, BaseIndex(regT3, regT2, TimesEight, OBJECT_OFFSETOF(ArrayStorage, m_vector[0])), Imm32(0))); + skip.link(this); + + inFastVector.link(this); + + emitLoad(value, regT1, regT0); + store32(regT0, BaseIndex(regT3, regT2, TimesEight, OBJECT_OFFSETOF(ArrayStorage, m_vector[0]))); // payload + store32(regT1, BaseIndex(regT3, regT2, TimesEight, OBJECT_OFFSETOF(ArrayStorage, m_vector[0]) + 4)); // tag +} + +void JIT::emitSlow_op_put_by_val(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + unsigned base = currentInstruction[1].u.operand; + unsigned property = currentInstruction[2].u.operand; + unsigned value = currentInstruction[3].u.operand; + + linkSlowCase(iter); // property int32 check + linkSlowCaseIfNotJSCell(iter, base); // base cell check + linkSlowCase(iter); // base not array check + + JITStubCall stubPutByValCall(this, cti_op_put_by_val); + stubPutByValCall.addArgument(base); + stubPutByValCall.addArgument(property); + stubPutByValCall.addArgument(value); + stubPutByValCall.call(); + + emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_get_by_val)); + + // Slow cases for immediate int accesses to arrays. + linkSlowCase(iter); // in vector check + linkSlowCase(iter); // written to slot check + + JITStubCall stubCall(this, cti_op_put_by_val_array); + stubCall.addArgument(regT1, regT0); + stubCall.addArgument(regT2); + stubCall.addArgument(value); + stubCall.call(); +} + +void JIT::emit_op_get_by_id(Instruction* currentInstruction) +{ + int dst = currentInstruction[1].u.operand; + int base = currentInstruction[2].u.operand; + + emitLoad(base, regT1, regT0); + emitJumpSlowCaseIfNotJSCell(base, regT1); + compileGetByIdHotPath(); + emitStore(dst, regT1, regT0); + map(m_bytecodeIndex + OPCODE_LENGTH(op_get_by_id), dst, regT1, regT0); +} + +void JIT::compileGetByIdHotPath() +{ + // As for put_by_id, get_by_id requires the offset of the Structure and the offset of the access to be patched. + // Additionally, for get_by_id we need patch the offset of the branch to the slow case (we patch this to jump + // to array-length / prototype access tranpolines, and finally we also the the property-map access offset as a label + // to jump back to if one of these trampolies finds a match. + Label hotPathBegin(this); + m_propertyAccessCompilationInfo[m_propertyAccessInstructionIndex].hotPathBegin = hotPathBegin; + m_propertyAccessInstructionIndex++; + + DataLabelPtr structureToCompare; + Jump structureCheck = branchPtrWithPatch(NotEqual, Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), structureToCompare, ImmPtr(reinterpret_cast<void*>(patchGetByIdDefaultStructure))); + addSlowCase(structureCheck); + ASSERT(differenceBetween(hotPathBegin, structureToCompare) == patchOffsetGetByIdStructure); + ASSERT(differenceBetween(hotPathBegin, structureCheck) == patchOffsetGetByIdBranchToSlowCase); + + Label externalLoad = loadPtrWithPatchToLEA(Address(regT0, OBJECT_OFFSETOF(JSObject, m_externalStorage)), regT2); + Label externalLoadComplete(this); + ASSERT(differenceBetween(hotPathBegin, externalLoad) == patchOffsetGetByIdExternalLoad); + ASSERT(differenceBetween(externalLoad, externalLoadComplete) == patchLengthGetByIdExternalLoad); + + DataLabel32 displacementLabel1 = loadPtrWithAddressOffsetPatch(Address(regT2, patchGetByIdDefaultOffset), regT0); // payload + ASSERT(differenceBetween(hotPathBegin, displacementLabel1) == patchOffsetGetByIdPropertyMapOffset1); + DataLabel32 displacementLabel2 = loadPtrWithAddressOffsetPatch(Address(regT2, patchGetByIdDefaultOffset), regT1); // tag + ASSERT(differenceBetween(hotPathBegin, displacementLabel2) == patchOffsetGetByIdPropertyMapOffset2); + + Label putResult(this); + ASSERT(differenceBetween(hotPathBegin, putResult) == patchOffsetGetByIdPutResult); +} + +void JIT::emitSlow_op_get_by_id(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + int dst = currentInstruction[1].u.operand; + int base = currentInstruction[2].u.operand; + int ident = currentInstruction[3].u.operand; + + compileGetByIdSlowCase(dst, base, &(m_codeBlock->identifier(ident)), iter); +} + +void JIT::compileGetByIdSlowCase(int dst, int base, Identifier* ident, Vector<SlowCaseEntry>::iterator& iter, bool isMethodCheck) +{ + // As for the hot path of get_by_id, above, we ensure that we can use an architecture specific offset + // so that we only need track one pointer into the slow case code - we track a pointer to the location + // of the call (which we can use to look up the patch information), but should a array-length or + // prototype access trampoline fail we want to bail out back to here. To do so we can subtract back + // the distance from the call to the head of the slow case. + linkSlowCaseIfNotJSCell(iter, base); + linkSlowCase(iter); + + Label coldPathBegin(this); + + JITStubCall stubCall(this, isMethodCheck ? cti_op_get_by_id_method_check : cti_op_get_by_id); + stubCall.addArgument(regT1, regT0); + stubCall.addArgument(ImmPtr(ident)); + Call call = stubCall.call(dst); + + ASSERT(differenceBetween(coldPathBegin, call) == patchOffsetGetByIdSlowCaseCall); + + // Track the location of the call; this will be used to recover patch information. + m_propertyAccessCompilationInfo[m_propertyAccessInstructionIndex].callReturnLocation = call; + m_propertyAccessInstructionIndex++; +} + +void JIT::emit_op_put_by_id(Instruction* currentInstruction) +{ + // In order to be able to patch both the Structure, and the object offset, we store one pointer, + // to just after the arguments have been loaded into registers 'hotPathBegin', and we generate code + // such that the Structure & offset are always at the same distance from this. + + int base = currentInstruction[1].u.operand; + int value = currentInstruction[3].u.operand; + + emitLoad2(base, regT1, regT0, value, regT3, regT2); + + emitJumpSlowCaseIfNotJSCell(base, regT1); + + Label hotPathBegin(this); + m_propertyAccessCompilationInfo[m_propertyAccessInstructionIndex].hotPathBegin = hotPathBegin; + m_propertyAccessInstructionIndex++; + + // It is important that the following instruction plants a 32bit immediate, in order that it can be patched over. + DataLabelPtr structureToCompare; + addSlowCase(branchPtrWithPatch(NotEqual, Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), structureToCompare, ImmPtr(reinterpret_cast<void*>(patchGetByIdDefaultStructure)))); + ASSERT(differenceBetween(hotPathBegin, structureToCompare) == patchOffsetPutByIdStructure); + + // Plant a load from a bogus ofset in the object's property map; we will patch this later, if it is to be used. + Label externalLoad = loadPtrWithPatchToLEA(Address(regT0, OBJECT_OFFSETOF(JSObject, m_externalStorage)), regT0); + Label externalLoadComplete(this); + ASSERT(differenceBetween(hotPathBegin, externalLoad) == patchOffsetPutByIdExternalLoad); + ASSERT(differenceBetween(externalLoad, externalLoadComplete) == patchLengthPutByIdExternalLoad); + + DataLabel32 displacementLabel1 = storePtrWithAddressOffsetPatch(regT2, Address(regT0, patchGetByIdDefaultOffset)); // payload + DataLabel32 displacementLabel2 = storePtrWithAddressOffsetPatch(regT3, Address(regT0, patchGetByIdDefaultOffset)); // tag + ASSERT(differenceBetween(hotPathBegin, displacementLabel1) == patchOffsetPutByIdPropertyMapOffset1); + ASSERT(differenceBetween(hotPathBegin, displacementLabel2) == patchOffsetPutByIdPropertyMapOffset2); +} + +void JIT::emitSlow_op_put_by_id(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) +{ + int base = currentInstruction[1].u.operand; + int ident = currentInstruction[2].u.operand; + + linkSlowCaseIfNotJSCell(iter, base); + linkSlowCase(iter); + + JITStubCall stubCall(this, cti_op_put_by_id); + stubCall.addArgument(regT1, regT0); + stubCall.addArgument(ImmPtr(&(m_codeBlock->identifier(ident)))); + stubCall.addArgument(regT3, regT2); + Call call = stubCall.call(); + + // Track the location of the call; this will be used to recover patch information. + m_propertyAccessCompilationInfo[m_propertyAccessInstructionIndex].callReturnLocation = call; + m_propertyAccessInstructionIndex++; +} + +// Compile a store into an object's property storage. May overwrite base. +void JIT::compilePutDirectOffset(RegisterID base, RegisterID valueTag, RegisterID valuePayload, Structure* structure, size_t cachedOffset) +{ + int offset = cachedOffset; + if (structure->isUsingInlineStorage()) + offset += OBJECT_OFFSETOF(JSObject, m_inlineStorage) / sizeof(Register); + else + loadPtr(Address(base, OBJECT_OFFSETOF(JSObject, m_externalStorage)), base); + emitStore(offset, valueTag, valuePayload, base); +} + +// Compile a load from an object's property storage. May overwrite base. +void JIT::compileGetDirectOffset(RegisterID base, RegisterID resultTag, RegisterID resultPayload, Structure* structure, size_t cachedOffset) +{ + int offset = cachedOffset; + if (structure->isUsingInlineStorage()) + offset += OBJECT_OFFSETOF(JSObject, m_inlineStorage) / sizeof(Register); + else + loadPtr(Address(base, OBJECT_OFFSETOF(JSObject, m_externalStorage)), base); + emitLoad(offset, resultTag, resultPayload, base); +} + +void JIT::compileGetDirectOffset(JSObject* base, RegisterID temp, RegisterID resultTag, RegisterID resultPayload, size_t cachedOffset) +{ + if (base->isUsingInlineStorage()) { + load32(reinterpret_cast<char*>(&base->m_inlineStorage[cachedOffset]), resultPayload); + load32(reinterpret_cast<char*>(&base->m_inlineStorage[cachedOffset]) + 4, resultTag); + return; + } + + size_t offset = cachedOffset * sizeof(JSValue); + + PropertyStorage* protoPropertyStorage = &base->m_externalStorage; + loadPtr(static_cast<void*>(protoPropertyStorage), temp); + load32(Address(temp, offset), resultPayload); + load32(Address(temp, offset + 4), resultTag); +} + +void JIT::privateCompilePutByIdTransition(StructureStubInfo* stubInfo, Structure* oldStructure, Structure* newStructure, size_t cachedOffset, StructureChain* chain, ReturnAddressPtr returnAddress) +{ + // It is assumed that regT0 contains the basePayload and regT1 contains the baseTag. The value can be found on the stack. + + JumpList failureCases; + failureCases.append(branch32(NotEqual, regT1, Imm32(JSValue::CellTag))); + + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT2); + failureCases.append(branchPtr(NotEqual, regT2, ImmPtr(oldStructure))); + + // Verify that nothing in the prototype chain has a setter for this property. + for (RefPtr<Structure>* it = chain->head(); *it; ++it) { + loadPtr(Address(regT2, OBJECT_OFFSETOF(Structure, m_prototype)), regT2); + loadPtr(Address(regT2, OBJECT_OFFSETOF(JSCell, m_structure)), regT2); + failureCases.append(branchPtr(NotEqual, regT2, ImmPtr(it->get()))); + } + + // Reallocate property storage if needed. + Call callTarget; + bool willNeedStorageRealloc = oldStructure->propertyStorageCapacity() != newStructure->propertyStorageCapacity(); + if (willNeedStorageRealloc) { + // This trampoline was called to like a JIT stub; before we can can call again we need to + // remove the return address from the stack, to prevent the stack from becoming misaligned. + preserveReturnAddressAfterCall(regT3); + + JITStubCall stubCall(this, cti_op_put_by_id_transition_realloc); + stubCall.skipArgument(); // base + stubCall.skipArgument(); // ident + stubCall.skipArgument(); // value + stubCall.addArgument(Imm32(oldStructure->propertyStorageCapacity())); + stubCall.addArgument(Imm32(newStructure->propertyStorageCapacity())); + stubCall.call(regT0); + + restoreReturnAddressBeforeReturn(regT3); + } + + sub32(Imm32(1), AbsoluteAddress(oldStructure->addressOfCount())); + add32(Imm32(1), AbsoluteAddress(newStructure->addressOfCount())); + storePtr(ImmPtr(newStructure), Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure))); + + load32(Address(stackPointerRegister, offsetof(struct JITStackFrame, args[2]) + sizeof(void*)), regT3); + load32(Address(stackPointerRegister, offsetof(struct JITStackFrame, args[2]) + sizeof(void*) + 4), regT2); + + // Write the value + compilePutDirectOffset(regT0, regT2, regT3, newStructure, cachedOffset); + + ret(); + + ASSERT(!failureCases.empty()); + failureCases.link(this); + restoreArgumentReferenceForTrampoline(); + Call failureCall = tailRecursiveCall(); + + LinkBuffer patchBuffer(this, m_codeBlock->executablePool()); + + patchBuffer.link(failureCall, FunctionPtr(cti_op_put_by_id_fail)); + + if (willNeedStorageRealloc) { + ASSERT(m_calls.size() == 1); + patchBuffer.link(m_calls[0].from, FunctionPtr(cti_op_put_by_id_transition_realloc)); + } + + CodeLocationLabel entryLabel = patchBuffer.finalizeCodeAddendum(); + stubInfo->stubRoutine = entryLabel; + RepatchBuffer repatchBuffer(m_codeBlock); + repatchBuffer.relinkCallerToTrampoline(returnAddress, entryLabel); +} + +void JIT::patchGetByIdSelf(CodeBlock* codeBlock, StructureStubInfo* stubInfo, Structure* structure, size_t cachedOffset, ReturnAddressPtr returnAddress) +{ + RepatchBuffer repatchBuffer(codeBlock); + + // We don't want to patch more than once - in future go to cti_op_get_by_id_generic. + // Should probably go to JITStubs::cti_op_get_by_id_fail, but that doesn't do anything interesting right now. + repatchBuffer.relinkCallerToFunction(returnAddress, FunctionPtr(cti_op_get_by_id_self_fail)); + + int offset = sizeof(JSValue) * cachedOffset; + + // If we're patching to use inline storage, convert the initial load to a lea; this avoids the extra load + // and makes the subsequent load's offset automatically correct + if (structure->isUsingInlineStorage()) + repatchBuffer.repatchLoadPtrToLEA(stubInfo->hotPathBegin.instructionAtOffset(patchOffsetGetByIdExternalLoad)); + + // Patch the offset into the propoerty map to load from, then patch the Structure to look for. + repatchBuffer.repatch(stubInfo->hotPathBegin.dataLabelPtrAtOffset(patchOffsetGetByIdStructure), structure); + repatchBuffer.repatch(stubInfo->hotPathBegin.dataLabel32AtOffset(patchOffsetGetByIdPropertyMapOffset1), offset); // payload + repatchBuffer.repatch(stubInfo->hotPathBegin.dataLabel32AtOffset(patchOffsetGetByIdPropertyMapOffset2), offset + 4); // tag +} + +void JIT::patchMethodCallProto(CodeBlock* codeBlock, MethodCallLinkInfo& methodCallLinkInfo, JSFunction* callee, Structure* structure, JSObject* proto, ReturnAddressPtr returnAddress) +{ + RepatchBuffer repatchBuffer(codeBlock); + + ASSERT(!methodCallLinkInfo.cachedStructure); + methodCallLinkInfo.cachedStructure = structure; + structure->ref(); + + Structure* prototypeStructure = proto->structure(); + ASSERT(!methodCallLinkInfo.cachedPrototypeStructure); + methodCallLinkInfo.cachedPrototypeStructure = prototypeStructure; + prototypeStructure->ref(); + + repatchBuffer.repatch(methodCallLinkInfo.structureLabel, structure); + repatchBuffer.repatch(methodCallLinkInfo.structureLabel.dataLabelPtrAtOffset(patchOffsetMethodCheckProtoObj), proto); + repatchBuffer.repatch(methodCallLinkInfo.structureLabel.dataLabelPtrAtOffset(patchOffsetMethodCheckProtoStruct), prototypeStructure); + repatchBuffer.repatch(methodCallLinkInfo.structureLabel.dataLabelPtrAtOffset(patchOffsetMethodCheckPutFunction), callee); + + repatchBuffer.relinkCallerToFunction(returnAddress, FunctionPtr(cti_op_get_by_id)); +} + +void JIT::patchPutByIdReplace(CodeBlock* codeBlock, StructureStubInfo* stubInfo, Structure* structure, size_t cachedOffset, ReturnAddressPtr returnAddress) +{ + RepatchBuffer repatchBuffer(codeBlock); + + // We don't want to patch more than once - in future go to cti_op_put_by_id_generic. + // Should probably go to cti_op_put_by_id_fail, but that doesn't do anything interesting right now. + repatchBuffer.relinkCallerToFunction(returnAddress, FunctionPtr(cti_op_put_by_id_generic)); + + int offset = sizeof(JSValue) * cachedOffset; + + // If we're patching to use inline storage, convert the initial load to a lea; this avoids the extra load + // and makes the subsequent load's offset automatically correct + if (structure->isUsingInlineStorage()) + repatchBuffer.repatchLoadPtrToLEA(stubInfo->hotPathBegin.instructionAtOffset(patchOffsetPutByIdExternalLoad)); + + // Patch the offset into the propoerty map to load from, then patch the Structure to look for. + repatchBuffer.repatch(stubInfo->hotPathBegin.dataLabelPtrAtOffset(patchOffsetPutByIdStructure), structure); + repatchBuffer.repatch(stubInfo->hotPathBegin.dataLabel32AtOffset(patchOffsetPutByIdPropertyMapOffset1), offset); // payload + repatchBuffer.repatch(stubInfo->hotPathBegin.dataLabel32AtOffset(patchOffsetPutByIdPropertyMapOffset2), offset + 4); // tag +} + +void JIT::privateCompilePatchGetArrayLength(ReturnAddressPtr returnAddress) +{ + StructureStubInfo* stubInfo = &m_codeBlock->getStubInfo(returnAddress); + + // regT0 holds a JSCell* + + // Check for array + Jump failureCases1 = branchPtr(NotEqual, Address(regT0), ImmPtr(m_globalData->jsArrayVPtr)); + + // Checks out okay! - get the length from the storage + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSArray, m_storage)), regT2); + load32(Address(regT2, OBJECT_OFFSETOF(ArrayStorage, m_length)), regT2); + + Jump failureCases2 = branch32(Above, regT2, Imm32(INT_MAX)); + move(regT2, regT0); + move(Imm32(JSValue::Int32Tag), regT1); + Jump success = jump(); + + LinkBuffer patchBuffer(this, m_codeBlock->executablePool()); + + // Use the patch information to link the failure cases back to the original slow case routine. + CodeLocationLabel slowCaseBegin = stubInfo->callReturnLocation.labelAtOffset(-patchOffsetGetByIdSlowCaseCall); + patchBuffer.link(failureCases1, slowCaseBegin); + patchBuffer.link(failureCases2, slowCaseBegin); + + // On success return back to the hot patch code, at a point it will perform the store to dest for us. + patchBuffer.link(success, stubInfo->hotPathBegin.labelAtOffset(patchOffsetGetByIdPutResult)); + + // Track the stub we have created so that it will be deleted later. + CodeLocationLabel entryLabel = patchBuffer.finalizeCodeAddendum(); + stubInfo->stubRoutine = entryLabel; + + // Finally patch the jump to slow case back in the hot path to jump here instead. + CodeLocationJump jumpLocation = stubInfo->hotPathBegin.jumpAtOffset(patchOffsetGetByIdBranchToSlowCase); + RepatchBuffer repatchBuffer(m_codeBlock); + repatchBuffer.relink(jumpLocation, entryLabel); + + // We don't want to patch more than once - in future go to cti_op_put_by_id_generic. + repatchBuffer.relinkCallerToFunction(returnAddress, FunctionPtr(cti_op_get_by_id_array_fail)); +} + +void JIT::privateCompileGetByIdProto(StructureStubInfo* stubInfo, Structure* structure, Structure* prototypeStructure, size_t cachedOffset, ReturnAddressPtr returnAddress, CallFrame* callFrame) +{ + // regT0 holds a JSCell* + + // The prototype object definitely exists (if this stub exists the CodeBlock is referencing a Structure that is + // referencing the prototype object - let's speculatively load it's table nice and early!) + JSObject* protoObject = asObject(structure->prototypeForLookup(callFrame)); + + Jump failureCases1 = checkStructure(regT0, structure); + + // Check the prototype object's Structure had not changed. + Structure** prototypeStructureAddress = &(protoObject->m_structure); +#if PLATFORM(X86_64) + move(ImmPtr(prototypeStructure), regT3); + Jump failureCases2 = branchPtr(NotEqual, AbsoluteAddress(prototypeStructureAddress), regT3); +#else + Jump failureCases2 = branchPtr(NotEqual, AbsoluteAddress(prototypeStructureAddress), ImmPtr(prototypeStructure)); +#endif + + // Checks out okay! - getDirectOffset + compileGetDirectOffset(protoObject, regT2, regT1, regT0, cachedOffset); + + Jump success = jump(); + + LinkBuffer patchBuffer(this, m_codeBlock->executablePool()); + + // Use the patch information to link the failure cases back to the original slow case routine. + CodeLocationLabel slowCaseBegin = stubInfo->callReturnLocation.labelAtOffset(-patchOffsetGetByIdSlowCaseCall); + patchBuffer.link(failureCases1, slowCaseBegin); + patchBuffer.link(failureCases2, slowCaseBegin); + + // On success return back to the hot patch code, at a point it will perform the store to dest for us. + patchBuffer.link(success, stubInfo->hotPathBegin.labelAtOffset(patchOffsetGetByIdPutResult)); + + // Track the stub we have created so that it will be deleted later. + CodeLocationLabel entryLabel = patchBuffer.finalizeCodeAddendum(); + stubInfo->stubRoutine = entryLabel; + + // Finally patch the jump to slow case back in the hot path to jump here instead. + CodeLocationJump jumpLocation = stubInfo->hotPathBegin.jumpAtOffset(patchOffsetGetByIdBranchToSlowCase); + RepatchBuffer repatchBuffer(m_codeBlock); + repatchBuffer.relink(jumpLocation, entryLabel); + + // We don't want to patch more than once - in future go to cti_op_put_by_id_generic. + repatchBuffer.relinkCallerToFunction(returnAddress, FunctionPtr(cti_op_get_by_id_proto_list)); +} + + +void JIT::privateCompileGetByIdSelfList(StructureStubInfo* stubInfo, PolymorphicAccessStructureList* polymorphicStructures, int currentIndex, Structure* structure, size_t cachedOffset) +{ + // regT0 holds a JSCell* + + Jump failureCase = checkStructure(regT0, structure); + compileGetDirectOffset(regT0, regT1, regT0, structure, cachedOffset); + Jump success = jump(); + + LinkBuffer patchBuffer(this, m_codeBlock->executablePool()); + + // Use the patch information to link the failure cases back to the original slow case routine. + CodeLocationLabel lastProtoBegin = polymorphicStructures->list[currentIndex - 1].stubRoutine; + if (!lastProtoBegin) + lastProtoBegin = stubInfo->callReturnLocation.labelAtOffset(-patchOffsetGetByIdSlowCaseCall); + + patchBuffer.link(failureCase, lastProtoBegin); + + // On success return back to the hot patch code, at a point it will perform the store to dest for us. + patchBuffer.link(success, stubInfo->hotPathBegin.labelAtOffset(patchOffsetGetByIdPutResult)); + + CodeLocationLabel entryLabel = patchBuffer.finalizeCodeAddendum(); + + structure->ref(); + polymorphicStructures->list[currentIndex].set(entryLabel, structure); + + // Finally patch the jump to slow case back in the hot path to jump here instead. + CodeLocationJump jumpLocation = stubInfo->hotPathBegin.jumpAtOffset(patchOffsetGetByIdBranchToSlowCase); + RepatchBuffer repatchBuffer(m_codeBlock); + repatchBuffer.relink(jumpLocation, entryLabel); +} + +void JIT::privateCompileGetByIdProtoList(StructureStubInfo* stubInfo, PolymorphicAccessStructureList* prototypeStructures, int currentIndex, Structure* structure, Structure* prototypeStructure, size_t cachedOffset, CallFrame* callFrame) +{ + // regT0 holds a JSCell* + + // The prototype object definitely exists (if this stub exists the CodeBlock is referencing a Structure that is + // referencing the prototype object - let's speculatively load it's table nice and early!) + JSObject* protoObject = asObject(structure->prototypeForLookup(callFrame)); + + // Check eax is an object of the right Structure. + Jump failureCases1 = checkStructure(regT0, structure); + + // Check the prototype object's Structure had not changed. + Structure** prototypeStructureAddress = &(protoObject->m_structure); +#if PLATFORM(X86_64) + move(ImmPtr(prototypeStructure), regT3); + Jump failureCases2 = branchPtr(NotEqual, AbsoluteAddress(prototypeStructureAddress), regT3); +#else + Jump failureCases2 = branchPtr(NotEqual, AbsoluteAddress(prototypeStructureAddress), ImmPtr(prototypeStructure)); +#endif + + compileGetDirectOffset(protoObject, regT2, regT1, regT0, cachedOffset); + + Jump success = jump(); + + LinkBuffer patchBuffer(this, m_codeBlock->executablePool()); + + // Use the patch information to link the failure cases back to the original slow case routine. + CodeLocationLabel lastProtoBegin = prototypeStructures->list[currentIndex - 1].stubRoutine; + patchBuffer.link(failureCases1, lastProtoBegin); + patchBuffer.link(failureCases2, lastProtoBegin); + + // On success return back to the hot patch code, at a point it will perform the store to dest for us. + patchBuffer.link(success, stubInfo->hotPathBegin.labelAtOffset(patchOffsetGetByIdPutResult)); + + CodeLocationLabel entryLabel = patchBuffer.finalizeCodeAddendum(); + + structure->ref(); + prototypeStructure->ref(); + prototypeStructures->list[currentIndex].set(entryLabel, structure, prototypeStructure); + + // Finally patch the jump to slow case back in the hot path to jump here instead. + CodeLocationJump jumpLocation = stubInfo->hotPathBegin.jumpAtOffset(patchOffsetGetByIdBranchToSlowCase); + RepatchBuffer repatchBuffer(m_codeBlock); + repatchBuffer.relink(jumpLocation, entryLabel); +} + +void JIT::privateCompileGetByIdChainList(StructureStubInfo* stubInfo, PolymorphicAccessStructureList* prototypeStructures, int currentIndex, Structure* structure, StructureChain* chain, size_t count, size_t cachedOffset, CallFrame* callFrame) +{ + // regT0 holds a JSCell* + + ASSERT(count); + + JumpList bucketsOfFail; + + // Check eax is an object of the right Structure. + bucketsOfFail.append(checkStructure(regT0, structure)); + + Structure* currStructure = structure; + RefPtr<Structure>* chainEntries = chain->head(); + JSObject* protoObject = 0; + for (unsigned i = 0; i < count; ++i) { + protoObject = asObject(currStructure->prototypeForLookup(callFrame)); + currStructure = chainEntries[i].get(); + + // Check the prototype object's Structure had not changed. + Structure** prototypeStructureAddress = &(protoObject->m_structure); +#if PLATFORM(X86_64) + move(ImmPtr(currStructure), regT3); + bucketsOfFail.append(branchPtr(NotEqual, AbsoluteAddress(prototypeStructureAddress), regT3)); +#else + bucketsOfFail.append(branchPtr(NotEqual, AbsoluteAddress(prototypeStructureAddress), ImmPtr(currStructure))); +#endif + } + ASSERT(protoObject); + + compileGetDirectOffset(protoObject, regT2, regT1, regT0, cachedOffset); + Jump success = jump(); + + LinkBuffer patchBuffer(this, m_codeBlock->executablePool()); + + // Use the patch information to link the failure cases back to the original slow case routine. + CodeLocationLabel lastProtoBegin = prototypeStructures->list[currentIndex - 1].stubRoutine; + + patchBuffer.link(bucketsOfFail, lastProtoBegin); + + // On success return back to the hot patch code, at a point it will perform the store to dest for us. + patchBuffer.link(success, stubInfo->hotPathBegin.labelAtOffset(patchOffsetGetByIdPutResult)); + + CodeLocationLabel entryLabel = patchBuffer.finalizeCodeAddendum(); + + // Track the stub we have created so that it will be deleted later. + structure->ref(); + chain->ref(); + prototypeStructures->list[currentIndex].set(entryLabel, structure, chain); + + // Finally patch the jump to slow case back in the hot path to jump here instead. + CodeLocationJump jumpLocation = stubInfo->hotPathBegin.jumpAtOffset(patchOffsetGetByIdBranchToSlowCase); + RepatchBuffer repatchBuffer(m_codeBlock); + repatchBuffer.relink(jumpLocation, entryLabel); +} + +void JIT::privateCompileGetByIdChain(StructureStubInfo* stubInfo, Structure* structure, StructureChain* chain, size_t count, size_t cachedOffset, ReturnAddressPtr returnAddress, CallFrame* callFrame) +{ + // regT0 holds a JSCell* + + ASSERT(count); + + JumpList bucketsOfFail; + + // Check eax is an object of the right Structure. + bucketsOfFail.append(checkStructure(regT0, structure)); + + Structure* currStructure = structure; + RefPtr<Structure>* chainEntries = chain->head(); + JSObject* protoObject = 0; + for (unsigned i = 0; i < count; ++i) { + protoObject = asObject(currStructure->prototypeForLookup(callFrame)); + currStructure = chainEntries[i].get(); + + // Check the prototype object's Structure had not changed. + Structure** prototypeStructureAddress = &(protoObject->m_structure); +#if PLATFORM(X86_64) + move(ImmPtr(currStructure), regT3); + bucketsOfFail.append(branchPtr(NotEqual, AbsoluteAddress(prototypeStructureAddress), regT3)); +#else + bucketsOfFail.append(branchPtr(NotEqual, AbsoluteAddress(prototypeStructureAddress), ImmPtr(currStructure))); +#endif + } + ASSERT(protoObject); + + compileGetDirectOffset(protoObject, regT2, regT1, regT0, cachedOffset); + Jump success = jump(); + + LinkBuffer patchBuffer(this, m_codeBlock->executablePool()); + + // Use the patch information to link the failure cases back to the original slow case routine. + patchBuffer.link(bucketsOfFail, stubInfo->callReturnLocation.labelAtOffset(-patchOffsetGetByIdSlowCaseCall)); + + // On success return back to the hot patch code, at a point it will perform the store to dest for us. + patchBuffer.link(success, stubInfo->hotPathBegin.labelAtOffset(patchOffsetGetByIdPutResult)); + + // Track the stub we have created so that it will be deleted later. + CodeLocationLabel entryLabel = patchBuffer.finalizeCodeAddendum(); + stubInfo->stubRoutine = entryLabel; + + // Finally patch the jump to slow case back in the hot path to jump here instead. + CodeLocationJump jumpLocation = stubInfo->hotPathBegin.jumpAtOffset(patchOffsetGetByIdBranchToSlowCase); + RepatchBuffer repatchBuffer(m_codeBlock); + repatchBuffer.relink(jumpLocation, entryLabel); + + // We don't want to patch more than once - in future go to cti_op_put_by_id_generic. + repatchBuffer.relinkCallerToFunction(returnAddress, FunctionPtr(cti_op_get_by_id_proto_list)); +} + +/* ------------------------------ END: !ENABLE / ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) ------------------------------ */ + +#endif // !ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) + +#else // USE(JSVALUE32_64) + void JIT::emit_op_get_by_val(Instruction* currentInstruction) { emitGetVirtualRegisters(currentInstruction[2].u.operand, regT0, currentInstruction[3].u.operand, regT1); emitJumpSlowCaseIfNotImmediateInteger(regT1); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) // This is technically incorrect - we're zero-extending an int32. On the hot path this doesn't matter. // We check the value as if it was a uint32 against the m_fastAccessCutoff - which will always fail if // number was signed since m_fastAccessCutoff is always less than intmax (since the total allocation @@ -64,11 +975,11 @@ void JIT::emit_op_get_by_val(Instruction* currentInstruction) addSlowCase(branchPtr(NotEqual, Address(regT0), ImmPtr(m_globalData->jsArrayVPtr))); // This is an array; get the m_storage pointer into ecx, then check if the index is below the fast cutoff - loadPtr(Address(regT0, FIELD_OFFSET(JSArray, m_storage)), regT2); - addSlowCase(branch32(AboveOrEqual, regT1, Address(regT0, FIELD_OFFSET(JSArray, m_fastAccessCutoff)))); + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSArray, m_storage)), regT2); + addSlowCase(branch32(AboveOrEqual, regT1, Address(regT0, OBJECT_OFFSETOF(JSArray, m_fastAccessCutoff)))); // Get the value from the vector - loadPtr(BaseIndex(regT2, regT1, ScalePtr, FIELD_OFFSET(ArrayStorage, m_vector[0])), regT0); + loadPtr(BaseIndex(regT2, regT1, ScalePtr, OBJECT_OFFSETOF(ArrayStorage, m_vector[0])), regT0); emitPutVirtualRegister(currentInstruction[1].u.operand); } @@ -76,7 +987,7 @@ void JIT::emit_op_put_by_val(Instruction* currentInstruction) { emitGetVirtualRegisters(currentInstruction[1].u.operand, regT0, currentInstruction[2].u.operand, regT1); emitJumpSlowCaseIfNotImmediateInteger(regT1); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) // See comment in op_get_by_val. zeroExtend32ToPtr(regT1, regT1); #else @@ -86,24 +997,24 @@ void JIT::emit_op_put_by_val(Instruction* currentInstruction) addSlowCase(branchPtr(NotEqual, Address(regT0), ImmPtr(m_globalData->jsArrayVPtr))); // This is an array; get the m_storage pointer into ecx, then check if the index is below the fast cutoff - loadPtr(Address(regT0, FIELD_OFFSET(JSArray, m_storage)), regT2); - Jump inFastVector = branch32(Below, regT1, Address(regT0, FIELD_OFFSET(JSArray, m_fastAccessCutoff))); + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSArray, m_storage)), regT2); + Jump inFastVector = branch32(Below, regT1, Address(regT0, OBJECT_OFFSETOF(JSArray, m_fastAccessCutoff))); // No; oh well, check if the access if within the vector - if so, we may still be okay. - addSlowCase(branch32(AboveOrEqual, regT1, Address(regT2, FIELD_OFFSET(ArrayStorage, m_vectorLength)))); + addSlowCase(branch32(AboveOrEqual, regT1, Address(regT2, OBJECT_OFFSETOF(ArrayStorage, m_vectorLength)))); // This is a write to the slow part of the vector; first, we have to check if this would be the first write to this location. // FIXME: should be able to handle initial write to array; increment the the number of items in the array, and potentially update fast access cutoff. - addSlowCase(branchTestPtr(Zero, BaseIndex(regT2, regT1, ScalePtr, FIELD_OFFSET(ArrayStorage, m_vector[0])))); + addSlowCase(branchTestPtr(Zero, BaseIndex(regT2, regT1, ScalePtr, OBJECT_OFFSETOF(ArrayStorage, m_vector[0])))); // All good - put the value into the array. inFastVector.link(this); emitGetVirtualRegister(currentInstruction[3].u.operand, regT0); - storePtr(regT0, BaseIndex(regT2, regT1, ScalePtr, FIELD_OFFSET(ArrayStorage, m_vector[0]))); + storePtr(regT0, BaseIndex(regT2, regT1, ScalePtr, OBJECT_OFFSETOF(ArrayStorage, m_vector[0]))); } void JIT::emit_op_put_by_index(Instruction* currentInstruction) { - JITStubCall stubCall(this, JITStubs::cti_op_put_by_index); + JITStubCall stubCall(this, cti_op_put_by_index); stubCall.addArgument(currentInstruction[1].u.operand, regT2); stubCall.addArgument(Imm32(currentInstruction[2].u.operand)); stubCall.addArgument(currentInstruction[3].u.operand, regT2); @@ -112,7 +1023,7 @@ void JIT::emit_op_put_by_index(Instruction* currentInstruction) void JIT::emit_op_put_getter(Instruction* currentInstruction) { - JITStubCall stubCall(this, JITStubs::cti_op_put_getter); + JITStubCall stubCall(this, cti_op_put_getter); stubCall.addArgument(currentInstruction[1].u.operand, regT2); stubCall.addArgument(ImmPtr(&m_codeBlock->identifier(currentInstruction[2].u.operand))); stubCall.addArgument(currentInstruction[3].u.operand, regT2); @@ -121,7 +1032,7 @@ void JIT::emit_op_put_getter(Instruction* currentInstruction) void JIT::emit_op_put_setter(Instruction* currentInstruction) { - JITStubCall stubCall(this, JITStubs::cti_op_put_setter); + JITStubCall stubCall(this, cti_op_put_setter); stubCall.addArgument(currentInstruction[1].u.operand, regT2); stubCall.addArgument(ImmPtr(&m_codeBlock->identifier(currentInstruction[2].u.operand))); stubCall.addArgument(currentInstruction[3].u.operand, regT2); @@ -130,7 +1041,7 @@ void JIT::emit_op_put_setter(Instruction* currentInstruction) void JIT::emit_op_del_by_id(Instruction* currentInstruction) { - JITStubCall stubCall(this, JITStubs::cti_op_del_by_id); + JITStubCall stubCall(this, cti_op_del_by_id); stubCall.addArgument(currentInstruction[2].u.operand, regT2); stubCall.addArgument(ImmPtr(&m_codeBlock->identifier(currentInstruction[3].u.operand))); stubCall.call(currentInstruction[1].u.operand); @@ -155,7 +1066,7 @@ void JIT::emit_op_get_by_id(Instruction* currentInstruction) Identifier* ident = &(m_codeBlock->identifier(currentInstruction[3].u.operand)); emitGetVirtualRegister(baseVReg, regT0); - JITStubCall stubCall(this, JITStubs::cti_op_get_by_id_generic); + JITStubCall stubCall(this, cti_op_get_by_id_generic); stubCall.addArgument(regT0); stubCall.addArgument(ImmPtr(ident)); stubCall.call(resultVReg); @@ -176,7 +1087,7 @@ void JIT::emit_op_put_by_id(Instruction* currentInstruction) emitGetVirtualRegisters(baseVReg, regT0, valueVReg, regT1); - JITStubCall stubCall(this, JITStubs::cti_op_put_by_id_generic); + JITStubCall stubCall(this, cti_op_put_by_id_generic); stubCall.addArgument(regT0); stubCall.addArgument(ImmPtr(ident)); stubCall.addArgument(regT1); @@ -212,9 +1123,9 @@ void JIT::emit_op_method_check(Instruction* currentInstruction) m_methodCallCompilationInfo.append(MethodCallCompilationInfo(m_propertyAccessInstructionIndex)); MethodCallCompilationInfo& info = m_methodCallCompilationInfo.last(); Jump notCell = emitJumpIfNotJSCell(regT0); - Jump structureCheck = branchPtrWithPatch(NotEqual, Address(regT0, FIELD_OFFSET(JSCell, m_structure)), info.structureToCompare, ImmPtr(reinterpret_cast<void*>(patchGetByIdDefaultStructure))); + Jump structureCheck = branchPtrWithPatch(NotEqual, Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), info.structureToCompare, ImmPtr(reinterpret_cast<void*>(patchGetByIdDefaultStructure))); DataLabelPtr protoStructureToCompare, protoObj = moveWithPatch(ImmPtr(0), regT1); - Jump protoStructureCheck = branchPtrWithPatch(NotEqual, Address(regT1, FIELD_OFFSET(JSCell, m_structure)), protoStructureToCompare, ImmPtr(reinterpret_cast<void*>(patchGetByIdDefaultStructure))); + Jump protoStructureCheck = branchPtrWithPatch(NotEqual, Address(regT1, OBJECT_OFFSETOF(JSCell, m_structure)), protoStructureToCompare, ImmPtr(reinterpret_cast<void*>(patchGetByIdDefaultStructure))); // This will be relinked to load the function without doing a load. DataLabelPtr putFunction = moveWithPatch(ImmPtr(0), regT0); @@ -247,7 +1158,7 @@ void JIT::emitSlow_op_method_check(Instruction* currentInstruction, Vector<SlowC unsigned baseVReg = currentInstruction[2].u.operand; Identifier* ident = &(m_codeBlock->identifier(currentInstruction[3].u.operand)); - compileGetByIdSlowCase(resultVReg, baseVReg, ident, iter, m_propertyAccessInstructionIndex++, true); + compileGetByIdSlowCase(resultVReg, baseVReg, ident, iter, true); // We've already generated the following get_by_id, so make sure it's skipped over. m_bytecodeIndex += OPCODE_LENGTH(op_get_by_id); @@ -285,12 +1196,12 @@ void JIT::compileGetByIdHotPath(int, int baseVReg, Identifier*, unsigned propert m_propertyAccessCompilationInfo[propertyAccessInstructionIndex].hotPathBegin = hotPathBegin; DataLabelPtr structureToCompare; - Jump structureCheck = branchPtrWithPatch(NotEqual, Address(regT0, FIELD_OFFSET(JSCell, m_structure)), structureToCompare, ImmPtr(reinterpret_cast<void*>(patchGetByIdDefaultStructure))); + Jump structureCheck = branchPtrWithPatch(NotEqual, Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), structureToCompare, ImmPtr(reinterpret_cast<void*>(patchGetByIdDefaultStructure))); addSlowCase(structureCheck); ASSERT(differenceBetween(hotPathBegin, structureToCompare) == patchOffsetGetByIdStructure); ASSERT(differenceBetween(hotPathBegin, structureCheck) == patchOffsetGetByIdBranchToSlowCase); - Label externalLoad = loadPtrWithPatchToLEA(Address(regT0, FIELD_OFFSET(JSObject, m_externalStorage)), regT0); + Label externalLoad = loadPtrWithPatchToLEA(Address(regT0, OBJECT_OFFSETOF(JSObject, m_externalStorage)), regT0); Label externalLoadComplete(this); ASSERT(differenceBetween(hotPathBegin, externalLoad) == patchOffsetGetByIdExternalLoad); ASSERT(differenceBetween(externalLoad, externalLoadComplete) == patchLengthGetByIdExternalLoad); @@ -308,10 +1219,10 @@ void JIT::emitSlow_op_get_by_id(Instruction* currentInstruction, Vector<SlowCase unsigned baseVReg = currentInstruction[2].u.operand; Identifier* ident = &(m_codeBlock->identifier(currentInstruction[3].u.operand)); - compileGetByIdSlowCase(resultVReg, baseVReg, ident, iter, m_propertyAccessInstructionIndex++, false); + compileGetByIdSlowCase(resultVReg, baseVReg, ident, iter, false); } -void JIT::compileGetByIdSlowCase(int resultVReg, int baseVReg, Identifier* ident, Vector<SlowCaseEntry>::iterator& iter, unsigned propertyAccessInstructionIndex, bool isMethodCheck) +void JIT::compileGetByIdSlowCase(int resultVReg, int baseVReg, Identifier* ident, Vector<SlowCaseEntry>::iterator& iter, bool isMethodCheck) { // As for the hot path of get_by_id, above, we ensure that we can use an architecture specific offset // so that we only need track one pointer into the slow case code - we track a pointer to the location @@ -325,7 +1236,7 @@ void JIT::compileGetByIdSlowCase(int resultVReg, int baseVReg, Identifier* ident #ifndef NDEBUG Label coldPathBegin(this); #endif - JITStubCall stubCall(this, isMethodCheck ? JITStubs::cti_op_get_by_id_method_check : JITStubs::cti_op_get_by_id); + JITStubCall stubCall(this, isMethodCheck ? cti_op_get_by_id_method_check : cti_op_get_by_id); stubCall.addArgument(regT0); stubCall.addArgument(ImmPtr(ident)); Call call = stubCall.call(resultVReg); @@ -333,7 +1244,8 @@ void JIT::compileGetByIdSlowCase(int resultVReg, int baseVReg, Identifier* ident ASSERT(differenceBetween(coldPathBegin, call) == patchOffsetGetByIdSlowCaseCall); // Track the location of the call; this will be used to recover patch information. - m_propertyAccessCompilationInfo[propertyAccessInstructionIndex].callReturnLocation = call; + m_propertyAccessCompilationInfo[m_propertyAccessInstructionIndex].callReturnLocation = call; + m_propertyAccessInstructionIndex++; } void JIT::emit_op_put_by_id(Instruction* currentInstruction) @@ -357,11 +1269,11 @@ void JIT::emit_op_put_by_id(Instruction* currentInstruction) // It is important that the following instruction plants a 32bit immediate, in order that it can be patched over. DataLabelPtr structureToCompare; - addSlowCase(branchPtrWithPatch(NotEqual, Address(regT0, FIELD_OFFSET(JSCell, m_structure)), structureToCompare, ImmPtr(reinterpret_cast<void*>(patchGetByIdDefaultStructure)))); + addSlowCase(branchPtrWithPatch(NotEqual, Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), structureToCompare, ImmPtr(reinterpret_cast<void*>(patchGetByIdDefaultStructure)))); ASSERT(differenceBetween(hotPathBegin, structureToCompare) == patchOffsetPutByIdStructure); // Plant a load from a bogus ofset in the object's property map; we will patch this later, if it is to be used. - Label externalLoad = loadPtrWithPatchToLEA(Address(regT0, FIELD_OFFSET(JSObject, m_externalStorage)), regT0); + Label externalLoad = loadPtrWithPatchToLEA(Address(regT0, OBJECT_OFFSETOF(JSObject, m_externalStorage)), regT0); Label externalLoadComplete(this); ASSERT(differenceBetween(hotPathBegin, externalLoad) == patchOffsetPutByIdExternalLoad); ASSERT(differenceBetween(externalLoad, externalLoadComplete) == patchLengthPutByIdExternalLoad); @@ -380,7 +1292,7 @@ void JIT::emitSlow_op_put_by_id(Instruction* currentInstruction, Vector<SlowCase linkSlowCaseIfNotJSCell(iter, baseVReg); linkSlowCase(iter); - JITStubCall stubCall(this, JITStubs::cti_op_put_by_id); + JITStubCall stubCall(this, cti_op_put_by_id); stubCall.addArgument(regT0); stubCall.addArgument(ImmPtr(ident)); stubCall.addArgument(regT1); @@ -396,9 +1308,9 @@ void JIT::compilePutDirectOffset(RegisterID base, RegisterID value, Structure* s { int offset = cachedOffset * sizeof(JSValue); if (structure->isUsingInlineStorage()) - offset += FIELD_OFFSET(JSObject, m_inlineStorage); + offset += OBJECT_OFFSETOF(JSObject, m_inlineStorage); else - loadPtr(Address(base, FIELD_OFFSET(JSObject, m_externalStorage)), base); + loadPtr(Address(base, OBJECT_OFFSETOF(JSObject, m_externalStorage)), base); storePtr(value, Address(base, offset)); } @@ -407,34 +1319,37 @@ void JIT::compileGetDirectOffset(RegisterID base, RegisterID result, Structure* { int offset = cachedOffset * sizeof(JSValue); if (structure->isUsingInlineStorage()) - offset += FIELD_OFFSET(JSObject, m_inlineStorage); + offset += OBJECT_OFFSETOF(JSObject, m_inlineStorage); else - loadPtr(Address(base, FIELD_OFFSET(JSObject, m_externalStorage)), base); + loadPtr(Address(base, OBJECT_OFFSETOF(JSObject, m_externalStorage)), base); loadPtr(Address(base, offset), result); } -void JIT::compileGetDirectOffset(JSObject* base, RegisterID result, size_t cachedOffset) +void JIT::compileGetDirectOffset(JSObject* base, RegisterID temp, RegisterID result, size_t cachedOffset) { if (base->isUsingInlineStorage()) loadPtr(static_cast<void*>(&base->m_inlineStorage[cachedOffset]), result); - else - loadPtr(static_cast<void*>(&base->m_externalStorage[cachedOffset]), result); + else { + PropertyStorage* protoPropertyStorage = &base->m_externalStorage; + loadPtr(static_cast<void*>(protoPropertyStorage), temp); + loadPtr(Address(temp, cachedOffset * sizeof(JSValue)), result); + } } -void JIT::privateCompilePutByIdTransition(StructureStubInfo* stubInfo, Structure* oldStructure, Structure* newStructure, size_t cachedOffset, StructureChain* chain, ProcessorReturnAddress returnAddress) +void JIT::privateCompilePutByIdTransition(StructureStubInfo* stubInfo, Structure* oldStructure, Structure* newStructure, size_t cachedOffset, StructureChain* chain, ReturnAddressPtr returnAddress) { JumpList failureCases; // Check eax is an object of the right Structure. failureCases.append(emitJumpIfNotJSCell(regT0)); - failureCases.append(branchPtr(NotEqual, Address(regT0, FIELD_OFFSET(JSCell, m_structure)), ImmPtr(oldStructure))); + failureCases.append(branchPtr(NotEqual, Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), ImmPtr(oldStructure))); JumpList successCases; // ecx = baseObject - loadPtr(Address(regT0, FIELD_OFFSET(JSCell, m_structure)), regT2); + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure)), regT2); // proto(ecx) = baseObject->structure()->prototype() - failureCases.append(branch32(NotEqual, Address(regT2, FIELD_OFFSET(Structure, m_typeInfo) + FIELD_OFFSET(TypeInfo, m_type)), Imm32(ObjectType))); + failureCases.append(branch32(NotEqual, Address(regT2, OBJECT_OFFSETOF(Structure, m_typeInfo) + OBJECT_OFFSETOF(TypeInfo, m_type)), Imm32(ObjectType))); - loadPtr(Address(regT2, FIELD_OFFSET(Structure, m_prototype)), regT2); + loadPtr(Address(regT2, OBJECT_OFFSETOF(Structure, m_prototype)), regT2); // ecx = baseObject->m_structure for (RefPtr<Structure>* it = chain->head(); *it; ++it) { @@ -442,11 +1357,11 @@ void JIT::privateCompilePutByIdTransition(StructureStubInfo* stubInfo, Structure successCases.append(branchPtr(Equal, regT2, ImmPtr(JSValue::encode(jsNull())))); // Check the structure id - failureCases.append(branchPtr(NotEqual, Address(regT2, FIELD_OFFSET(JSCell, m_structure)), ImmPtr(it->get()))); + failureCases.append(branchPtr(NotEqual, Address(regT2, OBJECT_OFFSETOF(JSCell, m_structure)), ImmPtr(it->get()))); - loadPtr(Address(regT2, FIELD_OFFSET(JSCell, m_structure)), regT2); - failureCases.append(branch32(NotEqual, Address(regT2, FIELD_OFFSET(Structure, m_typeInfo) + FIELD_OFFSET(TypeInfo, m_type)), Imm32(ObjectType))); - loadPtr(Address(regT2, FIELD_OFFSET(Structure, m_prototype)), regT2); + loadPtr(Address(regT2, OBJECT_OFFSETOF(JSCell, m_structure)), regT2); + failureCases.append(branch32(NotEqual, Address(regT2, OBJECT_OFFSETOF(Structure, m_typeInfo) + OBJECT_OFFSETOF(TypeInfo, m_type)), Imm32(ObjectType))); + loadPtr(Address(regT2, OBJECT_OFFSETOF(Structure, m_prototype)), regT2); } successCases.link(this); @@ -458,15 +1373,16 @@ void JIT::privateCompilePutByIdTransition(StructureStubInfo* stubInfo, Structure if (willNeedStorageRealloc) { // This trampoline was called to like a JIT stub; before we can can call again we need to // remove the return address from the stack, to prevent the stack from becoming misaligned. - preverveReturnAddressAfterCall(regT3); + preserveReturnAddressAfterCall(regT3); - JITStubCall stubCall(this, JITStubs::cti_op_put_by_id_transition_realloc); - stubCall.addArgument(regT0); + JITStubCall stubCall(this, cti_op_put_by_id_transition_realloc); + stubCall.skipArgument(); // base + stubCall.skipArgument(); // ident + stubCall.skipArgument(); // value stubCall.addArgument(Imm32(oldStructure->propertyStorageCapacity())); stubCall.addArgument(Imm32(newStructure->propertyStorageCapacity())); - stubCall.addArgument(regT1); // This argument is not used in the stub; we set it up on the stack so that it can be restored, below. stubCall.call(regT0); - emitGetJITStubArg(4, regT1); + emitGetJITStubArg(3, regT1); restoreReturnAddressBeforeReturn(regT3); } @@ -475,7 +1391,7 @@ void JIT::privateCompilePutByIdTransition(StructureStubInfo* stubInfo, Structure // codeblock should ensure oldStructure->m_refCount > 0 sub32(Imm32(1), AbsoluteAddress(oldStructure->addressOfCount())); add32(Imm32(1), AbsoluteAddress(newStructure->addressOfCount())); - storePtr(ImmPtr(newStructure), Address(regT0, FIELD_OFFSET(JSCell, m_structure))); + storePtr(ImmPtr(newStructure), Address(regT0, OBJECT_OFFSETOF(JSCell, m_structure))); // write the value compilePutDirectOffset(regT0, regT1, newStructure, cachedOffset); @@ -487,88 +1403,99 @@ void JIT::privateCompilePutByIdTransition(StructureStubInfo* stubInfo, Structure restoreArgumentReferenceForTrampoline(); Call failureCall = tailRecursiveCall(); - PatchBuffer patchBuffer(this, m_codeBlock->executablePool()); + LinkBuffer patchBuffer(this, m_codeBlock->executablePool()); - patchBuffer.link(failureCall, FunctionPtr(JITStubs::cti_op_put_by_id_fail)); + patchBuffer.link(failureCall, FunctionPtr(cti_op_put_by_id_fail)); if (willNeedStorageRealloc) { ASSERT(m_calls.size() == 1); - patchBuffer.link(m_calls[0].from, FunctionPtr(JITStubs::cti_op_put_by_id_transition_realloc)); + patchBuffer.link(m_calls[0].from, FunctionPtr(cti_op_put_by_id_transition_realloc)); } CodeLocationLabel entryLabel = patchBuffer.finalizeCodeAddendum(); stubInfo->stubRoutine = entryLabel; - returnAddress.relinkCallerToTrampoline(entryLabel); + RepatchBuffer repatchBuffer(m_codeBlock); + repatchBuffer.relinkCallerToTrampoline(returnAddress, entryLabel); } -void JIT::patchGetByIdSelf(StructureStubInfo* stubInfo, Structure* structure, size_t cachedOffset, ProcessorReturnAddress returnAddress) +void JIT::patchGetByIdSelf(CodeBlock* codeBlock, StructureStubInfo* stubInfo, Structure* structure, size_t cachedOffset, ReturnAddressPtr returnAddress) { + RepatchBuffer repatchBuffer(codeBlock); + // We don't want to patch more than once - in future go to cti_op_get_by_id_generic. - // Should probably go to JITStubs::cti_op_get_by_id_fail, but that doesn't do anything interesting right now. - returnAddress.relinkCallerToFunction(FunctionPtr(JITStubs::cti_op_get_by_id_self_fail)); + // Should probably go to cti_op_get_by_id_fail, but that doesn't do anything interesting right now. + repatchBuffer.relinkCallerToFunction(returnAddress, FunctionPtr(cti_op_get_by_id_self_fail)); int offset = sizeof(JSValue) * cachedOffset; // If we're patching to use inline storage, convert the initial load to a lea; this avoids the extra load // and makes the subsequent load's offset automatically correct if (structure->isUsingInlineStorage()) - stubInfo->hotPathBegin.instructionAtOffset(patchOffsetGetByIdExternalLoad).repatchLoadPtrToLEA(); + repatchBuffer.repatchLoadPtrToLEA(stubInfo->hotPathBegin.instructionAtOffset(patchOffsetGetByIdExternalLoad)); // Patch the offset into the propoerty map to load from, then patch the Structure to look for. - stubInfo->hotPathBegin.dataLabelPtrAtOffset(patchOffsetGetByIdStructure).repatch(structure); - stubInfo->hotPathBegin.dataLabel32AtOffset(patchOffsetGetByIdPropertyMapOffset).repatch(offset); + repatchBuffer.repatch(stubInfo->hotPathBegin.dataLabelPtrAtOffset(patchOffsetGetByIdStructure), structure); + repatchBuffer.repatch(stubInfo->hotPathBegin.dataLabel32AtOffset(patchOffsetGetByIdPropertyMapOffset), offset); } -void JIT::patchMethodCallProto(MethodCallLinkInfo& methodCallLinkInfo, JSFunction* callee, Structure* structure, JSObject* proto) +void JIT::patchMethodCallProto(CodeBlock* codeBlock, MethodCallLinkInfo& methodCallLinkInfo, JSFunction* callee, Structure* structure, JSObject* proto, ReturnAddressPtr returnAddress) { + RepatchBuffer repatchBuffer(codeBlock); + ASSERT(!methodCallLinkInfo.cachedStructure); methodCallLinkInfo.cachedStructure = structure; structure->ref(); - methodCallLinkInfo.structureLabel.repatch(structure); - methodCallLinkInfo.structureLabel.dataLabelPtrAtOffset(patchOffsetMethodCheckProtoObj).repatch(proto); - methodCallLinkInfo.structureLabel.dataLabelPtrAtOffset(patchOffsetMethodCheckProtoStruct).repatch(proto->structure()); - methodCallLinkInfo.structureLabel.dataLabelPtrAtOffset(patchOffsetMethodCheckPutFunction).repatch(callee); + Structure* prototypeStructure = proto->structure(); + ASSERT(!methodCallLinkInfo.cachedPrototypeStructure); + methodCallLinkInfo.cachedPrototypeStructure = prototypeStructure; + prototypeStructure->ref(); + + repatchBuffer.repatch(methodCallLinkInfo.structureLabel, structure); + repatchBuffer.repatch(methodCallLinkInfo.structureLabel.dataLabelPtrAtOffset(patchOffsetMethodCheckProtoObj), proto); + repatchBuffer.repatch(methodCallLinkInfo.structureLabel.dataLabelPtrAtOffset(patchOffsetMethodCheckProtoStruct), prototypeStructure); + repatchBuffer.repatch(methodCallLinkInfo.structureLabel.dataLabelPtrAtOffset(patchOffsetMethodCheckPutFunction), callee); + + repatchBuffer.relinkCallerToFunction(returnAddress, FunctionPtr(cti_op_get_by_id)); } -void JIT::patchPutByIdReplace(StructureStubInfo* stubInfo, Structure* structure, size_t cachedOffset, ProcessorReturnAddress returnAddress) +void JIT::patchPutByIdReplace(CodeBlock* codeBlock, StructureStubInfo* stubInfo, Structure* structure, size_t cachedOffset, ReturnAddressPtr returnAddress) { + RepatchBuffer repatchBuffer(codeBlock); + // We don't want to patch more than once - in future go to cti_op_put_by_id_generic. - // Should probably go to JITStubs::cti_op_put_by_id_fail, but that doesn't do anything interesting right now. - returnAddress.relinkCallerToFunction(FunctionPtr(JITStubs::cti_op_put_by_id_generic)); + // Should probably go to cti_op_put_by_id_fail, but that doesn't do anything interesting right now. + repatchBuffer.relinkCallerToFunction(returnAddress, FunctionPtr(cti_op_put_by_id_generic)); int offset = sizeof(JSValue) * cachedOffset; // If we're patching to use inline storage, convert the initial load to a lea; this avoids the extra load // and makes the subsequent load's offset automatically correct if (structure->isUsingInlineStorage()) - stubInfo->hotPathBegin.instructionAtOffset(patchOffsetPutByIdExternalLoad).repatchLoadPtrToLEA(); + repatchBuffer.repatchLoadPtrToLEA(stubInfo->hotPathBegin.instructionAtOffset(patchOffsetPutByIdExternalLoad)); // Patch the offset into the propoerty map to load from, then patch the Structure to look for. - stubInfo->hotPathBegin.dataLabelPtrAtOffset(patchOffsetPutByIdStructure).repatch(structure); - stubInfo->hotPathBegin.dataLabel32AtOffset(patchOffsetPutByIdPropertyMapOffset).repatch(offset); + repatchBuffer.repatch(stubInfo->hotPathBegin.dataLabelPtrAtOffset(patchOffsetPutByIdStructure), structure); + repatchBuffer.repatch(stubInfo->hotPathBegin.dataLabel32AtOffset(patchOffsetPutByIdPropertyMapOffset), offset); } -void JIT::privateCompilePatchGetArrayLength(ProcessorReturnAddress returnAddress) +void JIT::privateCompilePatchGetArrayLength(ReturnAddressPtr returnAddress) { - StructureStubInfo* stubInfo = &m_codeBlock->getStubInfo(returnAddress.addressForLookup()); - - // We don't want to patch more than once - in future go to cti_op_put_by_id_generic. - returnAddress.relinkCallerToFunction(FunctionPtr(JITStubs::cti_op_get_by_id_array_fail)); + StructureStubInfo* stubInfo = &m_codeBlock->getStubInfo(returnAddress); // Check eax is an array Jump failureCases1 = branchPtr(NotEqual, Address(regT0), ImmPtr(m_globalData->jsArrayVPtr)); // Checks out okay! - get the length from the storage - loadPtr(Address(regT0, FIELD_OFFSET(JSArray, m_storage)), regT2); - load32(Address(regT2, FIELD_OFFSET(ArrayStorage, m_length)), regT2); + loadPtr(Address(regT0, OBJECT_OFFSETOF(JSArray, m_storage)), regT2); + load32(Address(regT2, OBJECT_OFFSETOF(ArrayStorage, m_length)), regT2); Jump failureCases2 = branch32(Above, regT2, Imm32(JSImmediate::maxImmediateInt)); emitFastArithIntToImmNoCheck(regT2, regT0); Jump success = jump(); - PatchBuffer patchBuffer(this, m_codeBlock->executablePool()); + LinkBuffer patchBuffer(this, m_codeBlock->executablePool()); // Use the patch information to link the failure cases back to the original slow case routine. CodeLocationLabel slowCaseBegin = stubInfo->callReturnLocation.labelAtOffset(-patchOffsetGetByIdSlowCaseCall); @@ -584,14 +1511,15 @@ void JIT::privateCompilePatchGetArrayLength(ProcessorReturnAddress returnAddress // Finally patch the jump to slow case back in the hot path to jump here instead. CodeLocationJump jumpLocation = stubInfo->hotPathBegin.jumpAtOffset(patchOffsetGetByIdBranchToSlowCase); - jumpLocation.relink(entryLabel); -} + RepatchBuffer repatchBuffer(m_codeBlock); + repatchBuffer.relink(jumpLocation, entryLabel); -void JIT::privateCompileGetByIdProto(StructureStubInfo* stubInfo, Structure* structure, Structure* prototypeStructure, size_t cachedOffset, ProcessorReturnAddress returnAddress, CallFrame* callFrame) -{ // We don't want to patch more than once - in future go to cti_op_put_by_id_generic. - returnAddress.relinkCallerToFunction(FunctionPtr(JITStubs::cti_op_get_by_id_proto_list)); + repatchBuffer.relinkCallerToFunction(returnAddress, FunctionPtr(cti_op_get_by_id_array_fail)); +} +void JIT::privateCompileGetByIdProto(StructureStubInfo* stubInfo, Structure* structure, Structure* prototypeStructure, size_t cachedOffset, ReturnAddressPtr returnAddress, CallFrame* callFrame) +{ // The prototype object definitely exists (if this stub exists the CodeBlock is referencing a Structure that is // referencing the prototype object - let's speculatively load it's table nice and early!) JSObject* protoObject = asObject(structure->prototypeForLookup(callFrame)); @@ -609,11 +1537,11 @@ void JIT::privateCompileGetByIdProto(StructureStubInfo* stubInfo, Structure* str #endif // Checks out okay! - getDirectOffset - compileGetDirectOffset(protoObject, regT0, cachedOffset); + compileGetDirectOffset(protoObject, regT1, regT0, cachedOffset); Jump success = jump(); - PatchBuffer patchBuffer(this, m_codeBlock->executablePool()); + LinkBuffer patchBuffer(this, m_codeBlock->executablePool()); // Use the patch information to link the failure cases back to the original slow case routine. CodeLocationLabel slowCaseBegin = stubInfo->callReturnLocation.labelAtOffset(-patchOffsetGetByIdSlowCaseCall); @@ -629,7 +1557,11 @@ void JIT::privateCompileGetByIdProto(StructureStubInfo* stubInfo, Structure* str // Finally patch the jump to slow case back in the hot path to jump here instead. CodeLocationJump jumpLocation = stubInfo->hotPathBegin.jumpAtOffset(patchOffsetGetByIdBranchToSlowCase); - jumpLocation.relink(entryLabel); + RepatchBuffer repatchBuffer(m_codeBlock); + repatchBuffer.relink(jumpLocation, entryLabel); + + // We don't want to patch more than once - in future go to cti_op_put_by_id_generic. + repatchBuffer.relinkCallerToFunction(returnAddress, FunctionPtr(cti_op_get_by_id_proto_list)); } void JIT::privateCompileGetByIdSelfList(StructureStubInfo* stubInfo, PolymorphicAccessStructureList* polymorphicStructures, int currentIndex, Structure* structure, size_t cachedOffset) @@ -638,7 +1570,7 @@ void JIT::privateCompileGetByIdSelfList(StructureStubInfo* stubInfo, Polymorphic compileGetDirectOffset(regT0, regT0, structure, cachedOffset); Jump success = jump(); - PatchBuffer patchBuffer(this, m_codeBlock->executablePool()); + LinkBuffer patchBuffer(this, m_codeBlock->executablePool()); // Use the patch information to link the failure cases back to the original slow case routine. CodeLocationLabel lastProtoBegin = polymorphicStructures->list[currentIndex - 1].stubRoutine; @@ -657,7 +1589,8 @@ void JIT::privateCompileGetByIdSelfList(StructureStubInfo* stubInfo, Polymorphic // Finally patch the jump to slow case back in the hot path to jump here instead. CodeLocationJump jumpLocation = stubInfo->hotPathBegin.jumpAtOffset(patchOffsetGetByIdBranchToSlowCase); - jumpLocation.relink(entryLabel); + RepatchBuffer repatchBuffer(m_codeBlock); + repatchBuffer.relink(jumpLocation, entryLabel); } void JIT::privateCompileGetByIdProtoList(StructureStubInfo* stubInfo, PolymorphicAccessStructureList* prototypeStructures, int currentIndex, Structure* structure, Structure* prototypeStructure, size_t cachedOffset, CallFrame* callFrame) @@ -679,11 +1612,11 @@ void JIT::privateCompileGetByIdProtoList(StructureStubInfo* stubInfo, Polymorphi #endif // Checks out okay! - getDirectOffset - compileGetDirectOffset(protoObject, regT0, cachedOffset); + compileGetDirectOffset(protoObject, regT1, regT0, cachedOffset); Jump success = jump(); - PatchBuffer patchBuffer(this, m_codeBlock->executablePool()); + LinkBuffer patchBuffer(this, m_codeBlock->executablePool()); // Use the patch information to link the failure cases back to the original slow case routine. CodeLocationLabel lastProtoBegin = prototypeStructures->list[currentIndex - 1].stubRoutine; @@ -701,7 +1634,8 @@ void JIT::privateCompileGetByIdProtoList(StructureStubInfo* stubInfo, Polymorphi // Finally patch the jump to slow case back in the hot path to jump here instead. CodeLocationJump jumpLocation = stubInfo->hotPathBegin.jumpAtOffset(patchOffsetGetByIdBranchToSlowCase); - jumpLocation.relink(entryLabel); + RepatchBuffer repatchBuffer(m_codeBlock); + repatchBuffer.relink(jumpLocation, entryLabel); } void JIT::privateCompileGetByIdChainList(StructureStubInfo* stubInfo, PolymorphicAccessStructureList* prototypeStructures, int currentIndex, Structure* structure, StructureChain* chain, size_t count, size_t cachedOffset, CallFrame* callFrame) @@ -732,10 +1666,10 @@ void JIT::privateCompileGetByIdChainList(StructureStubInfo* stubInfo, Polymorphi } ASSERT(protoObject); - compileGetDirectOffset(protoObject, regT0, cachedOffset); + compileGetDirectOffset(protoObject, regT1, regT0, cachedOffset); Jump success = jump(); - PatchBuffer patchBuffer(this, m_codeBlock->executablePool()); + LinkBuffer patchBuffer(this, m_codeBlock->executablePool()); // Use the patch information to link the failure cases back to the original slow case routine. CodeLocationLabel lastProtoBegin = prototypeStructures->list[currentIndex - 1].stubRoutine; @@ -754,14 +1688,12 @@ void JIT::privateCompileGetByIdChainList(StructureStubInfo* stubInfo, Polymorphi // Finally patch the jump to slow case back in the hot path to jump here instead. CodeLocationJump jumpLocation = stubInfo->hotPathBegin.jumpAtOffset(patchOffsetGetByIdBranchToSlowCase); - jumpLocation.relink(entryLabel); + RepatchBuffer repatchBuffer(m_codeBlock); + repatchBuffer.relink(jumpLocation, entryLabel); } -void JIT::privateCompileGetByIdChain(StructureStubInfo* stubInfo, Structure* structure, StructureChain* chain, size_t count, size_t cachedOffset, ProcessorReturnAddress returnAddress, CallFrame* callFrame) +void JIT::privateCompileGetByIdChain(StructureStubInfo* stubInfo, Structure* structure, StructureChain* chain, size_t count, size_t cachedOffset, ReturnAddressPtr returnAddress, CallFrame* callFrame) { - // We don't want to patch more than once - in future go to cti_op_put_by_id_generic. - returnAddress.relinkCallerToFunction(FunctionPtr(JITStubs::cti_op_get_by_id_proto_list)); - ASSERT(count); JumpList bucketsOfFail; @@ -787,10 +1719,10 @@ void JIT::privateCompileGetByIdChain(StructureStubInfo* stubInfo, Structure* str } ASSERT(protoObject); - compileGetDirectOffset(protoObject, regT0, cachedOffset); + compileGetDirectOffset(protoObject, regT1, regT0, cachedOffset); Jump success = jump(); - PatchBuffer patchBuffer(this, m_codeBlock->executablePool()); + LinkBuffer patchBuffer(this, m_codeBlock->executablePool()); // Use the patch information to link the failure cases back to the original slow case routine. patchBuffer.link(bucketsOfFail, stubInfo->callReturnLocation.labelAtOffset(-patchOffsetGetByIdSlowCaseCall)); @@ -804,13 +1736,19 @@ void JIT::privateCompileGetByIdChain(StructureStubInfo* stubInfo, Structure* str // Finally patch the jump to slow case back in the hot path to jump here instead. CodeLocationJump jumpLocation = stubInfo->hotPathBegin.jumpAtOffset(patchOffsetGetByIdBranchToSlowCase); - jumpLocation.relink(entryLabel); + RepatchBuffer repatchBuffer(m_codeBlock); + repatchBuffer.relink(jumpLocation, entryLabel); + + // We don't want to patch more than once - in future go to cti_op_put_by_id_generic. + repatchBuffer.relinkCallerToFunction(returnAddress, FunctionPtr(cti_op_get_by_id_proto_list)); } /* ------------------------------ END: !ENABLE / ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) ------------------------------ */ #endif // !ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) +#endif // USE(JSVALUE32_64) + } // namespace JSC #endif // ENABLE(JIT) diff --git a/JavaScriptCore/jit/JITStubCall.h b/JavaScriptCore/jit/JITStubCall.h index 6c9ccc1..cb5354b 100644 --- a/JavaScriptCore/jit/JITStubCall.h +++ b/JavaScriptCore/jit/JITStubCall.h @@ -37,32 +37,40 @@ namespace JSC { JITStubCall(JIT* jit, JSObject* (JIT_STUB *stub)(STUB_ARGS_DECLARATION)) : m_jit(jit) , m_stub(reinterpret_cast<void*>(stub)) - , m_returnType(Value) - , m_argumentIndex(1) // Index 0 is reserved for restoreArgumentReference(); + , m_returnType(Cell) + , m_stackIndex(stackIndexStart) { } JITStubCall(JIT* jit, JSPropertyNameIterator* (JIT_STUB *stub)(STUB_ARGS_DECLARATION)) : m_jit(jit) , m_stub(reinterpret_cast<void*>(stub)) - , m_returnType(Value) - , m_argumentIndex(1) // Index 0 is reserved for restoreArgumentReference(); + , m_returnType(Cell) + , m_stackIndex(stackIndexStart) { } JITStubCall(JIT* jit, void* (JIT_STUB *stub)(STUB_ARGS_DECLARATION)) : m_jit(jit) , m_stub(reinterpret_cast<void*>(stub)) - , m_returnType(Value) - , m_argumentIndex(1) // Index 0 is reserved for restoreArgumentReference(); + , m_returnType(VoidPtr) + , m_stackIndex(stackIndexStart) { } JITStubCall(JIT* jit, int (JIT_STUB *stub)(STUB_ARGS_DECLARATION)) : m_jit(jit) , m_stub(reinterpret_cast<void*>(stub)) - , m_returnType(Value) - , m_argumentIndex(1) // Index 0 is reserved for restoreArgumentReference(); + , m_returnType(Int) + , m_stackIndex(stackIndexStart) + { + } + + JITStubCall(JIT* jit, bool (JIT_STUB *stub)(STUB_ARGS_DECLARATION)) + : m_jit(jit) + , m_stub(reinterpret_cast<void*>(stub)) + , m_returnType(Int) + , m_stackIndex(stackIndexStart) { } @@ -70,30 +78,78 @@ namespace JSC { : m_jit(jit) , m_stub(reinterpret_cast<void*>(stub)) , m_returnType(Void) - , m_argumentIndex(1) // Index 0 is reserved for restoreArgumentReference(); + , m_stackIndex(stackIndexStart) { } +#if USE(JSVALUE32_64) + JITStubCall(JIT* jit, EncodedJSValue (JIT_STUB *stub)(STUB_ARGS_DECLARATION)) + : m_jit(jit) + , m_stub(reinterpret_cast<void*>(stub)) + , m_returnType(Value) + , m_stackIndex(stackIndexStart) + { + } +#endif + // Arguments are added first to last. + void skipArgument() + { + m_stackIndex += stackIndexStep; + } + void addArgument(JIT::Imm32 argument) { - m_jit->poke(argument, m_argumentIndex); - ++m_argumentIndex; + m_jit->poke(argument, m_stackIndex); + m_stackIndex += stackIndexStep; } void addArgument(JIT::ImmPtr argument) { - m_jit->poke(argument, m_argumentIndex); - ++m_argumentIndex; + m_jit->poke(argument, m_stackIndex); + m_stackIndex += stackIndexStep; } void addArgument(JIT::RegisterID argument) { - m_jit->poke(argument, m_argumentIndex); - ++m_argumentIndex; + m_jit->poke(argument, m_stackIndex); + m_stackIndex += stackIndexStep; + } + + void addArgument(const JSValue& value) + { + m_jit->poke(JIT::Imm32(value.payload()), m_stackIndex); + m_jit->poke(JIT::Imm32(value.tag()), m_stackIndex + 1); + m_stackIndex += stackIndexStep; + } + + void addArgument(JIT::RegisterID tag, JIT::RegisterID payload) + { + m_jit->poke(payload, m_stackIndex); + m_jit->poke(tag, m_stackIndex + 1); + m_stackIndex += stackIndexStep; } +#if USE(JSVALUE32_64) + void addArgument(unsigned srcVirtualRegister) + { + if (m_jit->m_codeBlock->isConstantRegisterIndex(srcVirtualRegister)) { + addArgument(m_jit->getConstantOperand(srcVirtualRegister)); + return; + } + + m_jit->emitLoad(srcVirtualRegister, JIT::regT1, JIT::regT0); + addArgument(JIT::regT1, JIT::regT0); + } + + void getArgument(size_t argumentNumber, JIT::RegisterID tag, JIT::RegisterID payload) + { + size_t stackIndex = stackIndexStart + (argumentNumber * stackIndexStep); + m_jit->peek(payload, stackIndex); + m_jit->peek(tag, stackIndex + 1); + } +#else void addArgument(unsigned src, JIT::RegisterID scratchRegister) // src is a virtual register. { if (m_jit->m_codeBlock->isConstantRegisterIndex(src)) @@ -104,13 +160,13 @@ namespace JSC { } m_jit->killLastResultRegister(); } +#endif JIT::Call call() { - ASSERT(m_jit->m_bytecodeIndex != (unsigned)-1); // This method should only be called during hot/cold path generation, so that m_bytecodeIndex is set. - #if ENABLE(OPCODE_SAMPLING) - m_jit->sampleInstruction(m_jit->m_codeBlock->instructions().begin() + m_jit->m_bytecodeIndex, true); + if (m_jit->m_bytecodeIndex != (unsigned)-1) + m_jit->sampleInstruction(m_jit->m_codeBlock->instructions().begin() + m_jit->m_bytecodeIndex, true); #endif m_jit->restoreArgumentReference(); @@ -118,24 +174,46 @@ namespace JSC { m_jit->m_calls.append(CallRecord(call, m_jit->m_bytecodeIndex, m_stub)); #if ENABLE(OPCODE_SAMPLING) - m_jit->sampleInstruction(m_jit->m_codeBlock->instructions().begin() + m_jit->m_bytecodeIndex, false); + if (m_jit->m_bytecodeIndex != (unsigned)-1) + m_jit->sampleInstruction(m_jit->m_codeBlock->instructions().begin() + m_jit->m_bytecodeIndex, false); #endif +#if USE(JSVALUE32_64) + m_jit->unmap(); +#else m_jit->killLastResultRegister(); +#endif return call; } +#if USE(JSVALUE32_64) + JIT::Call call(unsigned dst) // dst is a virtual register. + { + ASSERT(m_returnType == Value || m_returnType == Cell); + JIT::Call call = this->call(); + if (m_returnType == Value) + m_jit->emitStore(dst, JIT::regT1, JIT::regT0); + else + m_jit->emitStoreCell(dst, JIT::returnValueRegister); + return call; + } +#else JIT::Call call(unsigned dst) // dst is a virtual register. { - ASSERT(m_returnType == Value); + ASSERT(m_returnType == VoidPtr || m_returnType == Cell); JIT::Call call = this->call(); m_jit->emitPutVirtualRegister(dst); return call; } +#endif - JIT::Call call(JIT::RegisterID dst) + JIT::Call call(JIT::RegisterID dst) // dst is a machine register. { - ASSERT(m_returnType == Value); +#if USE(JSVALUE32_64) + ASSERT(m_returnType == Value || m_returnType == VoidPtr || m_returnType == Int || m_returnType == Cell); +#else + ASSERT(m_returnType == VoidPtr || m_returnType == Int || m_returnType == Cell); +#endif JIT::Call call = this->call(); if (dst != JIT::returnValueRegister) m_jit->move(JIT::returnValueRegister, dst); @@ -143,25 +221,13 @@ namespace JSC { } private: + static const size_t stackIndexStep = sizeof(EncodedJSValue) == 2 * sizeof(void*) ? 2 : 1; + static const size_t stackIndexStart = 1; // Index 0 is reserved for restoreArgumentReference(). + JIT* m_jit; void* m_stub; - enum { Value, Void } m_returnType; - size_t m_argumentIndex; - }; - - class CallEvalJITStub : public JITStubCall { - public: - CallEvalJITStub(JIT* jit, Instruction* instruction) - : JITStubCall(jit, JITStubs::cti_op_call_eval) - { - int callee = instruction[2].u.operand; - int argCount = instruction[3].u.operand; - int registerOffset = instruction[4].u.operand; - - addArgument(callee, JIT::regT2); - addArgument(JIT::Imm32(registerOffset)); - addArgument(JIT::Imm32(argCount)); - } + enum { Void, VoidPtr, Int, Value, Cell } m_returnType; + size_t m_stackIndex; }; } diff --git a/JavaScriptCore/jit/JITStubs.cpp b/JavaScriptCore/jit/JITStubs.cpp index a40d1ba..d563f58 100644 --- a/JavaScriptCore/jit/JITStubs.cpp +++ b/JavaScriptCore/jit/JITStubs.cpp @@ -56,28 +56,31 @@ #include "RegExpPrototype.h" #include "Register.h" #include "SamplingTool.h" +#include <stdarg.h> #include <stdio.h> using namespace std; namespace JSC { - #if PLATFORM(DARWIN) || PLATFORM(WIN_OS) #define SYMBOL_STRING(name) "_" #name #else #define SYMBOL_STRING(name) #name #endif +#if USE(JSVALUE32_64) + #if COMPILER(GCC) && PLATFORM(X86) // These ASSERTs remind you that, if you change the layout of JITStackFrame, you // need to change the assembly trampolines below to match. -COMPILE_ASSERT(offsetof(struct JITStackFrame, callFrame) == 0x38, JITStackFrame_callFrame_offset_matches_ctiTrampoline); -COMPILE_ASSERT(offsetof(struct JITStackFrame, code) == 0x30, JITStackFrame_code_offset_matches_ctiTrampoline); -COMPILE_ASSERT(offsetof(struct JITStackFrame, savedEBX) == 0x1c, JITStackFrame_stub_argument_space_matches_ctiTrampoline); +COMPILE_ASSERT(offsetof(struct JITStackFrame, code) % 16 == 0x0, JITStackFrame_maintains_16byte_stack_alignment); +COMPILE_ASSERT(offsetof(struct JITStackFrame, savedEBX) == 0x3c, JITStackFrame_stub_argument_space_matches_ctiTrampoline); +COMPILE_ASSERT(offsetof(struct JITStackFrame, callFrame) == 0x58, JITStackFrame_callFrame_offset_matches_ctiTrampoline); +COMPILE_ASSERT(offsetof(struct JITStackFrame, code) == 0x50, JITStackFrame_code_offset_matches_ctiTrampoline); -asm( +asm volatile ( ".globl " SYMBOL_STRING(ctiTrampoline) "\n" SYMBOL_STRING(ctiTrampoline) ":" "\n" "pushl %ebp" "\n" @@ -85,11 +88,11 @@ SYMBOL_STRING(ctiTrampoline) ":" "\n" "pushl %esi" "\n" "pushl %edi" "\n" "pushl %ebx" "\n" - "subl $0x1c, %esp" "\n" + "subl $0x3c, %esp" "\n" "movl $512, %esi" "\n" - "movl 0x38(%esp), %edi" "\n" - "call *0x30(%esp)" "\n" - "addl $0x1c, %esp" "\n" + "movl 0x58(%esp), %edi" "\n" + "call *0x50(%esp)" "\n" + "addl $0x3c, %esp" "\n" "popl %ebx" "\n" "popl %edi" "\n" "popl %esi" "\n" @@ -97,16 +100,25 @@ SYMBOL_STRING(ctiTrampoline) ":" "\n" "ret" "\n" ); -asm( +asm volatile ( ".globl " SYMBOL_STRING(ctiVMThrowTrampoline) "\n" SYMBOL_STRING(ctiVMThrowTrampoline) ":" "\n" #if !USE(JIT_STUB_ARGUMENT_VA_LIST) "movl %esp, %ecx" "\n" #endif "call " SYMBOL_STRING(cti_vm_throw) "\n" + "addl $0x3c, %esp" "\n" + "popl %ebx" "\n" + "popl %edi" "\n" + "popl %esi" "\n" + "popl %ebp" "\n" + "ret" "\n" +); + +asm volatile ( ".globl " SYMBOL_STRING(ctiOpThrowNotCaught) "\n" SYMBOL_STRING(ctiOpThrowNotCaught) ":" "\n" - "addl $0x1c, %esp" "\n" + "addl $0x3c, %esp" "\n" "popl %ebx" "\n" "popl %edi" "\n" "popl %esi" "\n" @@ -122,11 +134,12 @@ SYMBOL_STRING(ctiOpThrowNotCaught) ":" "\n" // These ASSERTs remind you that, if you change the layout of JITStackFrame, you // need to change the assembly trampolines below to match. +COMPILE_ASSERT(offsetof(struct JITStackFrame, code) % 32 == 0x0, JITStackFrame_maintains_32byte_stack_alignment); +COMPILE_ASSERT(offsetof(struct JITStackFrame, savedRBX) == 0x48, JITStackFrame_stub_argument_space_matches_ctiTrampoline); COMPILE_ASSERT(offsetof(struct JITStackFrame, callFrame) == 0x90, JITStackFrame_callFrame_offset_matches_ctiTrampoline); COMPILE_ASSERT(offsetof(struct JITStackFrame, code) == 0x80, JITStackFrame_code_offset_matches_ctiTrampoline); -COMPILE_ASSERT(offsetof(struct JITStackFrame, savedRBX) == 0x48, JITStackFrame_stub_argument_space_matches_ctiTrampoline); -asm( +asm volatile ( ".globl " SYMBOL_STRING(ctiTrampoline) "\n" SYMBOL_STRING(ctiTrampoline) ":" "\n" "pushq %rbp" "\n" @@ -152,11 +165,22 @@ SYMBOL_STRING(ctiTrampoline) ":" "\n" "ret" "\n" ); -asm( +asm volatile ( ".globl " SYMBOL_STRING(ctiVMThrowTrampoline) "\n" SYMBOL_STRING(ctiVMThrowTrampoline) ":" "\n" "movq %rsp, %rdi" "\n" "call " SYMBOL_STRING(cti_vm_throw) "\n" + "addq $0x48, %rsp" "\n" + "popq %rbx" "\n" + "popq %r15" "\n" + "popq %r14" "\n" + "popq %r13" "\n" + "popq %r12" "\n" + "popq %rbp" "\n" + "ret" "\n" +); + +asm volatile ( ".globl " SYMBOL_STRING(ctiOpThrowNotCaught) "\n" SYMBOL_STRING(ctiOpThrowNotCaught) ":" "\n" "addq $0x48, %rsp" "\n" @@ -169,24 +193,13 @@ SYMBOL_STRING(ctiOpThrowNotCaught) ":" "\n" "ret" "\n" ); -#elif COMPILER(GCC) && PLATFORM(ARM_V7) +#elif COMPILER(GCC) && PLATFORM_ARM_ARCH(7) #if USE(JIT_STUB_ARGUMENT_VA_LIST) #error "JIT_STUB_ARGUMENT_VA_LIST not supported on ARMv7." #endif -COMPILE_ASSERT(offsetof(struct JITStackFrame, preservedReturnAddress) == 0x20, JITStackFrame_outerReturnAddress_offset_matches_ctiTrampoline); -COMPILE_ASSERT(offsetof(struct JITStackFrame, preservedR4) == 0x24, JITStackFrame_outerReturnAddress_offset_matches_ctiTrampoline); -COMPILE_ASSERT(offsetof(struct JITStackFrame, preservedR5) == 0x28, JITStackFrame_outerReturnAddress_offset_matches_ctiTrampoline); -COMPILE_ASSERT(offsetof(struct JITStackFrame, preservedR6) == 0x2c, JITStackFrame_outerReturnAddress_offset_matches_ctiTrampoline); - -COMPILE_ASSERT(offsetof(struct JITStackFrame, registerFile) == 0x30, JITStackFrame_registerFile_offset_matches_ctiTrampoline); -COMPILE_ASSERT(offsetof(struct JITStackFrame, callFrame) == 0x34, JITStackFrame_callFrame_offset_matches_ctiTrampoline); -COMPILE_ASSERT(offsetof(struct JITStackFrame, exception) == 0x38, JITStackFrame_exception_offset_matches_ctiTrampoline); -// The fifth argument is the first item already on the stack. -COMPILE_ASSERT(offsetof(struct JITStackFrame, enabledProfilerReference) == 0x3c, JITStackFrame_enabledProfilerReference_offset_matches_ctiTrampoline); - -asm volatile ( +asm volatile ( ".text" "\n" ".align 2" "\n" ".globl " SYMBOL_STRING(ctiTrampoline) "\n" @@ -252,9 +265,10 @@ SYMBOL_STRING(ctiOpThrowNotCaught) ":" "\n" // These ASSERTs remind you that, if you change the layout of JITStackFrame, you // need to change the assembly trampolines below to match. -COMPILE_ASSERT(offsetof(struct JITStackFrame, callFrame) == 0x38, JITStackFrame_callFrame_offset_matches_ctiTrampoline); -COMPILE_ASSERT(offsetof(struct JITStackFrame, code) == 0x30, JITStackFrame_code_offset_matches_ctiTrampoline); -COMPILE_ASSERT(offsetof(struct JITStackFrame, savedEBX) == 0x1c, JITStackFrame_stub_argument_space_matches_ctiTrampoline); +COMPILE_ASSERT(offsetof(struct JITStackFrame, code) % 16 == 0x0, JITStackFrame_maintains_16byte_stack_alignment); +COMPILE_ASSERT(offsetof(struct JITStackFrame, savedEBX) == 0x3c, JITStackFrame_stub_argument_space_matches_ctiTrampoline); +COMPILE_ASSERT(offsetof(struct JITStackFrame, callFrame) == 0x58, JITStackFrame_callFrame_offset_matches_ctiTrampoline); +COMPILE_ASSERT(offsetof(struct JITStackFrame, code) == 0x50, JITStackFrame_code_offset_matches_ctiTrampoline); extern "C" { @@ -266,12 +280,12 @@ extern "C" { push esi; push edi; push ebx; - sub esp, 0x1c; + sub esp, 0x3c; mov esi, 512; mov ecx, esp; - mov edi, [esp + 0x38]; - call [esp + 0x30]; - add esp, 0x1c; + mov edi, [esp + 0x58]; + call [esp + 0x50]; + add esp, 0x3c; pop ebx; pop edi; pop esi; @@ -284,8 +298,8 @@ extern "C" { { __asm { mov ecx, esp; - call JITStubs::cti_vm_throw; - add esp, 0x1c; + call cti_vm_throw; + add esp, 0x3c; pop ebx; pop edi; pop esi; @@ -297,7 +311,7 @@ extern "C" { __declspec(naked) void ctiOpThrowNotCaught() { __asm { - add esp, 0x1c; + add esp, 0x3c; pop ebx; pop edi; pop esi; @@ -307,8 +321,311 @@ extern "C" { } } +#endif // COMPILER(GCC) && PLATFORM(X86) + +#else // USE(JSVALUE32_64) + +#if COMPILER(GCC) && PLATFORM(X86) + +// These ASSERTs remind you that, if you change the layout of JITStackFrame, you +// need to change the assembly trampolines below to match. +COMPILE_ASSERT(offsetof(struct JITStackFrame, callFrame) == 0x38, JITStackFrame_callFrame_offset_matches_ctiTrampoline); +COMPILE_ASSERT(offsetof(struct JITStackFrame, code) == 0x30, JITStackFrame_code_offset_matches_ctiTrampoline); +COMPILE_ASSERT(offsetof(struct JITStackFrame, savedEBX) == 0x1c, JITStackFrame_stub_argument_space_matches_ctiTrampoline); + +asm volatile ( +".globl " SYMBOL_STRING(ctiTrampoline) "\n" +SYMBOL_STRING(ctiTrampoline) ":" "\n" + "pushl %ebp" "\n" + "movl %esp, %ebp" "\n" + "pushl %esi" "\n" + "pushl %edi" "\n" + "pushl %ebx" "\n" + "subl $0x1c, %esp" "\n" + "movl $512, %esi" "\n" + "movl 0x38(%esp), %edi" "\n" + "call *0x30(%esp)" "\n" + "addl $0x1c, %esp" "\n" + "popl %ebx" "\n" + "popl %edi" "\n" + "popl %esi" "\n" + "popl %ebp" "\n" + "ret" "\n" +); + +asm volatile ( +".globl " SYMBOL_STRING(ctiVMThrowTrampoline) "\n" +SYMBOL_STRING(ctiVMThrowTrampoline) ":" "\n" +#if !USE(JIT_STUB_ARGUMENT_VA_LIST) + "movl %esp, %ecx" "\n" +#endif + "call " SYMBOL_STRING(cti_vm_throw) "\n" + "addl $0x1c, %esp" "\n" + "popl %ebx" "\n" + "popl %edi" "\n" + "popl %esi" "\n" + "popl %ebp" "\n" + "ret" "\n" +); + +asm volatile ( +".globl " SYMBOL_STRING(ctiOpThrowNotCaught) "\n" +SYMBOL_STRING(ctiOpThrowNotCaught) ":" "\n" + "addl $0x1c, %esp" "\n" + "popl %ebx" "\n" + "popl %edi" "\n" + "popl %esi" "\n" + "popl %ebp" "\n" + "ret" "\n" +); + +#elif COMPILER(GCC) && PLATFORM(X86_64) + +#if USE(JIT_STUB_ARGUMENT_VA_LIST) +#error "JIT_STUB_ARGUMENT_VA_LIST not supported on x86-64." #endif +// These ASSERTs remind you that, if you change the layout of JITStackFrame, you +// need to change the assembly trampolines below to match. +COMPILE_ASSERT(offsetof(struct JITStackFrame, callFrame) == 0x58, JITStackFrame_callFrame_offset_matches_ctiTrampoline); +COMPILE_ASSERT(offsetof(struct JITStackFrame, code) == 0x48, JITStackFrame_code_offset_matches_ctiTrampoline); +COMPILE_ASSERT(offsetof(struct JITStackFrame, savedRBX) == 0x78, JITStackFrame_stub_argument_space_matches_ctiTrampoline); + +asm volatile ( +".globl " SYMBOL_STRING(ctiTrampoline) "\n" +SYMBOL_STRING(ctiTrampoline) ":" "\n" + "pushq %rbp" "\n" + "movq %rsp, %rbp" "\n" + "pushq %r12" "\n" + "pushq %r13" "\n" + "pushq %r14" "\n" + "pushq %r15" "\n" + "pushq %rbx" "\n" + // Form the JIT stubs area + "pushq %r9" "\n" + "pushq %r8" "\n" + "pushq %rcx" "\n" + "pushq %rdx" "\n" + "pushq %rsi" "\n" + "pushq %rdi" "\n" + "subq $0x48, %rsp" "\n" + "movq $512, %r12" "\n" + "movq $0xFFFF000000000000, %r14" "\n" + "movq $0xFFFF000000000002, %r15" "\n" + "movq %rdx, %r13" "\n" + "call *%rdi" "\n" + "addq $0x78, %rsp" "\n" + "popq %rbx" "\n" + "popq %r15" "\n" + "popq %r14" "\n" + "popq %r13" "\n" + "popq %r12" "\n" + "popq %rbp" "\n" + "ret" "\n" +); + +asm volatile ( +".globl " SYMBOL_STRING(ctiVMThrowTrampoline) "\n" +SYMBOL_STRING(ctiVMThrowTrampoline) ":" "\n" + "movq %rsp, %rdi" "\n" + "call " SYMBOL_STRING(cti_vm_throw) "\n" + "addq $0x78, %rsp" "\n" + "popq %rbx" "\n" + "popq %r15" "\n" + "popq %r14" "\n" + "popq %r13" "\n" + "popq %r12" "\n" + "popq %rbp" "\n" + "ret" "\n" +); + +asm volatile ( +".globl " SYMBOL_STRING(ctiOpThrowNotCaught) "\n" +SYMBOL_STRING(ctiOpThrowNotCaught) ":" "\n" + "addq $0x78, %rsp" "\n" + "popq %rbx" "\n" + "popq %r15" "\n" + "popq %r14" "\n" + "popq %r13" "\n" + "popq %r12" "\n" + "popq %rbp" "\n" + "ret" "\n" +); + +#elif COMPILER(GCC) && PLATFORM_ARM_ARCH(7) + +#if USE(JIT_STUB_ARGUMENT_VA_LIST) +#error "JIT_STUB_ARGUMENT_VA_LIST not supported on ARMv7." +#endif + +asm volatile ( +".text" "\n" +".align 2" "\n" +".globl " SYMBOL_STRING(ctiTrampoline) "\n" +".thumb" "\n" +".thumb_func " SYMBOL_STRING(ctiTrampoline) "\n" +SYMBOL_STRING(ctiTrampoline) ":" "\n" + "sub sp, sp, #0x3c" "\n" + "str lr, [sp, #0x20]" "\n" + "str r4, [sp, #0x24]" "\n" + "str r5, [sp, #0x28]" "\n" + "str r6, [sp, #0x2c]" "\n" + "str r1, [sp, #0x30]" "\n" + "str r2, [sp, #0x34]" "\n" + "str r3, [sp, #0x38]" "\n" + "cpy r5, r2" "\n" + "mov r6, #512" "\n" + "blx r0" "\n" + "ldr r6, [sp, #0x2c]" "\n" + "ldr r5, [sp, #0x28]" "\n" + "ldr r4, [sp, #0x24]" "\n" + "ldr lr, [sp, #0x20]" "\n" + "add sp, sp, #0x3c" "\n" + "bx lr" "\n" +); + +asm volatile ( +".text" "\n" +".align 2" "\n" +".globl " SYMBOL_STRING(ctiVMThrowTrampoline) "\n" +".thumb" "\n" +".thumb_func " SYMBOL_STRING(ctiVMThrowTrampoline) "\n" +SYMBOL_STRING(ctiVMThrowTrampoline) ":" "\n" + "cpy r0, sp" "\n" + "bl " SYMBOL_STRING(cti_vm_throw) "\n" + "ldr r6, [sp, #0x2c]" "\n" + "ldr r5, [sp, #0x28]" "\n" + "ldr r4, [sp, #0x24]" "\n" + "ldr lr, [sp, #0x20]" "\n" + "add sp, sp, #0x3c" "\n" + "bx lr" "\n" +); + +asm volatile ( +".text" "\n" +".align 2" "\n" +".globl " SYMBOL_STRING(ctiOpThrowNotCaught) "\n" +".thumb" "\n" +".thumb_func " SYMBOL_STRING(ctiOpThrowNotCaught) "\n" +SYMBOL_STRING(ctiOpThrowNotCaught) ":" "\n" + "ldr r6, [sp, #0x2c]" "\n" + "ldr r5, [sp, #0x28]" "\n" + "ldr r4, [sp, #0x24]" "\n" + "ldr lr, [sp, #0x20]" "\n" + "add sp, sp, #0x3c" "\n" + "bx lr" "\n" +); + +#elif COMPILER(GCC) && PLATFORM(ARM) + +asm volatile ( +".globl " SYMBOL_STRING(ctiTrampoline) "\n" +SYMBOL_STRING(ctiTrampoline) ":" "\n" + "stmdb sp!, {r1-r3}" "\n" + "stmdb sp!, {r4-r8, lr}" "\n" + "mov r6, pc" "\n" + "add r6, r6, #40" "\n" + "sub sp, sp, #32" "\n" + "ldr r4, [sp, #60]" "\n" + "mov r5, #512" "\n" + // r0 contains the code + "add r8, pc, #4" "\n" + "str r8, [sp, #-4]!" "\n" + "mov pc, r0" "\n" + "add sp, sp, #32" "\n" + "ldmia sp!, {r4-r8, lr}" "\n" + "add sp, sp, #12" "\n" + "mov pc, lr" "\n" + + // the return instruction + "ldr pc, [sp], #4" "\n" +); + +asm volatile ( +".globl " SYMBOL_STRING(ctiVMThrowTrampoline) "\n" +SYMBOL_STRING(ctiVMThrowTrampoline) ":" "\n" + "mov r0, sp" "\n" + "mov lr, r6" "\n" + "add r8, pc, #4" "\n" + "str r8, [sp, #-4]!" "\n" + "b " SYMBOL_STRING(cti_vm_throw) "\n" + +// Both has the same return sequence +".globl " SYMBOL_STRING(ctiOpThrowNotCaught) "\n" +SYMBOL_STRING(ctiOpThrowNotCaught) ":" "\n" + "add sp, sp, #32" "\n" + "ldmia sp!, {r4-r8, lr}" "\n" + "add sp, sp, #12" "\n" + "mov pc, lr" "\n" +); + +#elif COMPILER(MSVC) + +#if USE(JIT_STUB_ARGUMENT_VA_LIST) +#error "JIT_STUB_ARGUMENT_VA_LIST configuration not supported on MSVC." +#endif + +// These ASSERTs remind you that, if you change the layout of JITStackFrame, you +// need to change the assembly trampolines below to match. +COMPILE_ASSERT(offsetof(struct JITStackFrame, callFrame) == 0x38, JITStackFrame_callFrame_offset_matches_ctiTrampoline); +COMPILE_ASSERT(offsetof(struct JITStackFrame, code) == 0x30, JITStackFrame_code_offset_matches_ctiTrampoline); +COMPILE_ASSERT(offsetof(struct JITStackFrame, savedEBX) == 0x1c, JITStackFrame_stub_argument_space_matches_ctiTrampoline); + +extern "C" { + + __declspec(naked) EncodedJSValue ctiTrampoline(void* code, RegisterFile*, CallFrame*, JSValue* exception, Profiler**, JSGlobalData*) + { + __asm { + push ebp; + mov ebp, esp; + push esi; + push edi; + push ebx; + sub esp, 0x1c; + mov esi, 512; + mov ecx, esp; + mov edi, [esp + 0x38]; + call [esp + 0x30]; + add esp, 0x1c; + pop ebx; + pop edi; + pop esi; + pop ebp; + ret; + } + } + + __declspec(naked) void ctiVMThrowTrampoline() + { + __asm { + mov ecx, esp; + call cti_vm_throw; + add esp, 0x1c; + pop ebx; + pop edi; + pop esi; + pop ebp; + ret; + } + } + + __declspec(naked) void ctiOpThrowNotCaught() + { + __asm { + add esp, 0x1c; + pop ebx; + pop edi; + pop esi; + pop ebp; + ret; + } + } +} + +#endif // COMPILER(GCC) && PLATFORM(X86) + +#endif // USE(JSVALUE32_64) + #if ENABLE(OPCODE_SAMPLING) #define CTI_SAMPLER stackFrame.globalData->interpreter->sampler() #else @@ -317,12 +634,30 @@ extern "C" { JITThunks::JITThunks(JSGlobalData* globalData) { - JIT::compileCTIMachineTrampolines(globalData, &m_executablePool, &m_ctiArrayLengthTrampoline, &m_ctiStringLengthTrampoline, &m_ctiVirtualCallPreLink, &m_ctiVirtualCallLink, &m_ctiVirtualCall, &m_ctiNativeCallThunk); + JIT::compileCTIMachineTrampolines(globalData, &m_executablePool, &m_ctiStringLengthTrampoline, &m_ctiVirtualCallLink, &m_ctiVirtualCall, &m_ctiNativeCallThunk); + +#if PLATFORM_ARM_ARCH(7) + // Unfortunate the arm compiler does not like the use of offsetof on JITStackFrame (since it contains non POD types), + // and the OBJECT_OFFSETOF macro does not appear constantish enough for it to be happy with its use in COMPILE_ASSERT + // macros. + ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, preservedReturnAddress) == 0x20); + ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, preservedR4) == 0x24); + ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, preservedR5) == 0x28); + ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, preservedR6) == 0x2c); + + ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, registerFile) == 0x30); + ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, callFrame) == 0x34); + ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, exception) == 0x38); + // The fifth argument is the first item already on the stack. + ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, enabledProfilerReference) == 0x3c); + + ASSERT(OBJECT_OFFSETOF(struct JITStackFrame, thunkReturnAddress) == 0x1C); +#endif } #if ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) -NEVER_INLINE void JITThunks::tryCachePutByID(CallFrame* callFrame, CodeBlock* codeBlock, void* returnAddress, JSValue baseValue, const PutPropertySlot& slot) +NEVER_INLINE void JITThunks::tryCachePutByID(CallFrame* callFrame, CodeBlock* codeBlock, ReturnAddressPtr returnAddress, JSValue baseValue, const PutPropertySlot& slot, StructureStubInfo* stubInfo) { // The interpreter checks for recursion here; I do not believe this can occur in CTI. @@ -331,7 +666,7 @@ NEVER_INLINE void JITThunks::tryCachePutByID(CallFrame* callFrame, CodeBlock* co // Uncacheable: give up. if (!slot.isCacheable()) { - ctiPatchCallByReturnAddress(returnAddress, FunctionPtr(JITStubs::cti_op_put_by_id_generic)); + ctiPatchCallByReturnAddress(codeBlock, returnAddress, FunctionPtr(cti_op_put_by_id_generic)); return; } @@ -339,23 +674,25 @@ NEVER_INLINE void JITThunks::tryCachePutByID(CallFrame* callFrame, CodeBlock* co Structure* structure = baseCell->structure(); if (structure->isDictionary()) { - ctiPatchCallByReturnAddress(returnAddress, FunctionPtr(JITStubs::cti_op_put_by_id_generic)); + ctiPatchCallByReturnAddress(codeBlock, returnAddress, FunctionPtr(cti_op_put_by_id_generic)); return; } // If baseCell != base, then baseCell must be a proxy for another object. if (baseCell != slot.base()) { - ctiPatchCallByReturnAddress(returnAddress, FunctionPtr(JITStubs::cti_op_put_by_id_generic)); + ctiPatchCallByReturnAddress(codeBlock, returnAddress, FunctionPtr(cti_op_put_by_id_generic)); return; } - StructureStubInfo* stubInfo = &codeBlock->getStubInfo(returnAddress); - // Cache hit: Specialize instruction and ref Structures. // Structure transition, cache transition info if (slot.type() == PutPropertySlot::NewProperty) { StructureChain* prototypeChain = structure->prototypeChain(callFrame); + if (!prototypeChain->isCacheable()) { + ctiPatchCallByReturnAddress(codeBlock, returnAddress, FunctionPtr(cti_op_put_by_id_generic)); + return; + } stubInfo->initPutByIdTransition(structure->previousID(), structure, prototypeChain); JIT::compilePutByIdTransition(callFrame->scopeChain()->globalData, codeBlock, stubInfo, structure->previousID(), structure, slot.cachedOffset(), prototypeChain, returnAddress); return; @@ -363,17 +700,17 @@ NEVER_INLINE void JITThunks::tryCachePutByID(CallFrame* callFrame, CodeBlock* co stubInfo->initPutByIdReplace(structure); - JIT::patchPutByIdReplace(stubInfo, structure, slot.cachedOffset(), returnAddress); + JIT::patchPutByIdReplace(codeBlock, stubInfo, structure, slot.cachedOffset(), returnAddress); } -NEVER_INLINE void JITThunks::tryCacheGetByID(CallFrame* callFrame, CodeBlock* codeBlock, void* returnAddress, JSValue baseValue, const Identifier& propertyName, const PropertySlot& slot) +NEVER_INLINE void JITThunks::tryCacheGetByID(CallFrame* callFrame, CodeBlock* codeBlock, ReturnAddressPtr returnAddress, JSValue baseValue, const Identifier& propertyName, const PropertySlot& slot, StructureStubInfo* stubInfo) { // FIXME: Write a test that proves we need to check for recursion here just // like the interpreter does, then add a check for recursion. // FIXME: Cache property access for immediates. if (!baseValue.isCell()) { - ctiPatchCallByReturnAddress(returnAddress, FunctionPtr(JITStubs::cti_op_get_by_id_generic)); + ctiPatchCallByReturnAddress(codeBlock, returnAddress, FunctionPtr(cti_op_get_by_id_generic)); return; } @@ -387,13 +724,13 @@ NEVER_INLINE void JITThunks::tryCacheGetByID(CallFrame* callFrame, CodeBlock* co if (isJSString(globalData, baseValue) && propertyName == callFrame->propertyNames().length) { // The tradeoff of compiling an patched inline string length access routine does not seem // to pay off, so we currently only do this for arrays. - ctiPatchCallByReturnAddress(returnAddress, globalData->jitStubs.ctiStringLengthTrampoline()); + ctiPatchCallByReturnAddress(codeBlock, returnAddress, globalData->jitStubs.ctiStringLengthTrampoline()); return; } // Uncacheable: give up. if (!slot.isCacheable()) { - ctiPatchCallByReturnAddress(returnAddress, FunctionPtr(JITStubs::cti_op_get_by_id_generic)); + ctiPatchCallByReturnAddress(codeBlock, returnAddress, FunctionPtr(cti_op_get_by_id_generic)); return; } @@ -401,22 +738,17 @@ NEVER_INLINE void JITThunks::tryCacheGetByID(CallFrame* callFrame, CodeBlock* co Structure* structure = baseCell->structure(); if (structure->isDictionary()) { - ctiPatchCallByReturnAddress(returnAddress, FunctionPtr(JITStubs::cti_op_get_by_id_generic)); + ctiPatchCallByReturnAddress(codeBlock, returnAddress, FunctionPtr(cti_op_get_by_id_generic)); return; } - // In the interpreter the last structure is trapped here; in CTI we use the - // *_second method to achieve a similar (but not quite the same) effect. - - StructureStubInfo* stubInfo = &codeBlock->getStubInfo(returnAddress); - // Cache hit: Specialize instruction and ref Structures. if (slot.slotBase() == baseValue) { // set this up, so derefStructures can do it's job. stubInfo->initGetByIdSelf(structure); - JIT::patchGetByIdSelf(stubInfo, structure, slot.cachedOffset(), returnAddress); + JIT::patchGetByIdSelf(codeBlock, stubInfo, structure, slot.cachedOffset(), returnAddress); return; } @@ -438,16 +770,20 @@ NEVER_INLINE void JITThunks::tryCacheGetByID(CallFrame* callFrame, CodeBlock* co size_t count = countPrototypeChainEntriesAndCheckForProxies(callFrame, baseValue, slot); if (!count) { - stubInfo->opcodeID = op_get_by_id_generic; + stubInfo->accessType = access_get_by_id_generic; return; } StructureChain* prototypeChain = structure->prototypeChain(callFrame); + if (!prototypeChain->isCacheable()) { + ctiPatchCallByReturnAddress(codeBlock, returnAddress, FunctionPtr(cti_op_get_by_id_generic)); + return; + } stubInfo->initGetByIdChain(structure, prototypeChain); JIT::compileGetByIdChain(callFrame->scopeChain()->globalData, callFrame, codeBlock, stubInfo, structure, prototypeChain, count, slot.cachedOffset(), returnAddress); } -#endif +#endif // ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) #if USE(JIT_STUB_ARGUMENT_VA_LIST) #define SETUP_VA_LISTL_ARGS va_list vl_args; va_start(vl_args, args) @@ -473,7 +809,7 @@ struct StackHack { : stackFrame(stackFrame) , savedReturnAddress(*stackFrame.returnAddressSlot()) { - *stackFrame.returnAddressSlot() = reinterpret_cast<void*>(jscGeneratedNativeCode); + *stackFrame.returnAddressSlot() = ReturnAddressPtr(FunctionPtr(jscGeneratedNativeCode)); } ALWAYS_INLINE ~StackHack() @@ -482,17 +818,17 @@ struct StackHack { } JITStackFrame& stackFrame; - void* savedReturnAddress; + ReturnAddressPtr savedReturnAddress; }; #define STUB_INIT_STACK_FRAME(stackFrame) SETUP_VA_LISTL_ARGS; JITStackFrame& stackFrame = *reinterpret_cast<JITStackFrame*>(STUB_ARGS); StackHack stackHack(stackFrame) -#define STUB_SET_RETURN_ADDRESS(returnAddress) stackHack.savedReturnAddress = returnAddress +#define STUB_SET_RETURN_ADDRESS(returnAddress) stackHack.savedReturnAddress = ReturnAddressPtr(returnAddress) #define STUB_RETURN_ADDRESS stackHack.savedReturnAddress #else #define STUB_INIT_STACK_FRAME(stackFrame) SETUP_VA_LISTL_ARGS; JITStackFrame& stackFrame = *reinterpret_cast<JITStackFrame*>(STUB_ARGS) -#define STUB_SET_RETURN_ADDRESS(returnAddress) *stackFrame.returnAddressSlot() = returnAddress +#define STUB_SET_RETURN_ADDRESS(returnAddress) *stackFrame.returnAddressSlot() = ReturnAddressPtr(returnAddress) #define STUB_RETURN_ADDRESS *stackFrame.returnAddressSlot() #endif @@ -501,14 +837,14 @@ struct StackHack { // to get the address of the ctiVMThrowTrampoline function. It's also // good to keep the code size down by leaving as much of the exception // handling code out of line as possible. -static NEVER_INLINE void returnToThrowTrampoline(JSGlobalData* globalData, void* exceptionLocation, void*& returnAddressSlot) +static NEVER_INLINE void returnToThrowTrampoline(JSGlobalData* globalData, ReturnAddressPtr exceptionLocation, ReturnAddressPtr& returnAddressSlot) { ASSERT(globalData->exception); globalData->exceptionLocation = exceptionLocation; - returnAddressSlot = reinterpret_cast<void*>(ctiVMThrowTrampoline); + returnAddressSlot = ReturnAddressPtr(FunctionPtr(ctiVMThrowTrampoline)); } -static NEVER_INLINE void throwStackOverflowError(CallFrame* callFrame, JSGlobalData* globalData, void* exceptionLocation, void*& returnAddressSlot) +static NEVER_INLINE void throwStackOverflowError(CallFrame* callFrame, JSGlobalData* globalData, ReturnAddressPtr exceptionLocation, ReturnAddressPtr& returnAddressSlot) { globalData->exception = createStackOverflowError(callFrame); returnToThrowTrampoline(globalData, exceptionLocation, returnAddressSlot); @@ -524,27 +860,23 @@ static NEVER_INLINE void throwStackOverflowError(CallFrame* callFrame, JSGlobalD #define CHECK_FOR_EXCEPTION() \ do { \ - if (UNLIKELY(stackFrame.globalData->exception != JSValue())) \ + if (UNLIKELY(stackFrame.globalData->exception)) \ VM_THROW_EXCEPTION(); \ } while (0) #define CHECK_FOR_EXCEPTION_AT_END() \ do { \ - if (UNLIKELY(stackFrame.globalData->exception != JSValue())) \ + if (UNLIKELY(stackFrame.globalData->exception)) \ VM_THROW_EXCEPTION_AT_END(); \ } while (0) #define CHECK_FOR_EXCEPTION_VOID() \ do { \ - if (UNLIKELY(stackFrame.globalData->exception != JSValue())) { \ + if (UNLIKELY(stackFrame.globalData->exception)) { \ VM_THROW_EXCEPTION_AT_END(); \ return; \ } \ } while (0) -namespace JITStubs { - -#if PLATFORM(ARM_V7) - -COMPILE_ASSERT(offsetof(struct JITStackFrame, thunkReturnAddress) == 0x1C, JITStackFrame_outerReturnAddress_offset_matches_ctiTrampoline); +#if PLATFORM_ARM_ARCH(7) #define DEFINE_STUB_FUNCTION(rtype, op) \ extern "C" { \ @@ -568,7 +900,7 @@ COMPILE_ASSERT(offsetof(struct JITStackFrame, thunkReturnAddress) == 0x1C, JITSt #define DEFINE_STUB_FUNCTION(rtype, op) rtype JIT_STUB cti_##op(STUB_ARGS_DECLARATION) #endif -DEFINE_STUB_FUNCTION(JSObject*, op_convert_this) +DEFINE_STUB_FUNCTION(EncodedJSValue, op_convert_this) { STUB_INIT_STACK_FRAME(stackFrame); @@ -577,7 +909,7 @@ DEFINE_STUB_FUNCTION(JSObject*, op_convert_this) JSObject* result = v1.toThisObject(callFrame); CHECK_FOR_EXCEPTION_AT_END(); - return result; + return JSValue::encode(result); } DEFINE_STUB_FUNCTION(void, op_end) @@ -617,8 +949,8 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_add) } if (rightIsNumber & leftIsString) { - RefPtr<UString::Rep> value = v2.isInt32Fast() ? - concatenate(asString(v1)->value().rep(), v2.getInt32Fast()) : + RefPtr<UString::Rep> value = v2.isInt32() ? + concatenate(asString(v1)->value().rep(), v2.asInt32()) : concatenate(asString(v1)->value().rep(), right); if (UNLIKELY(!value)) { @@ -672,7 +1004,7 @@ DEFINE_STUB_FUNCTION(void, register_file_check) // moved the call frame forward. CallFrame* oldCallFrame = stackFrame.callFrame->callerFrame(); stackFrame.callFrame = oldCallFrame; - throwStackOverflowError(oldCallFrame, stackFrame.globalData, oldCallFrame->returnPC(), STUB_RETURN_ADDRESS); + throwStackOverflowError(oldCallFrame, stackFrame.globalData, ReturnAddressPtr(oldCallFrame->returnPC()), STUB_RETURN_ADDRESS); } DEFINE_STUB_FUNCTION(int, op_loop_if_less) @@ -737,25 +1069,19 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_by_id_generic) DEFINE_STUB_FUNCTION(void, op_put_by_id) { STUB_INIT_STACK_FRAME(stackFrame); - CallFrame* callFrame = stackFrame.callFrame; Identifier& ident = stackFrame.args[1].identifier(); PutPropertySlot slot; stackFrame.args[0].jsValue().put(callFrame, ident, stackFrame.args[2].jsValue(), slot); - ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, FunctionPtr(cti_op_put_by_id_second)); - - CHECK_FOR_EXCEPTION_AT_END(); -} - -DEFINE_STUB_FUNCTION(void, op_put_by_id_second) -{ - STUB_INIT_STACK_FRAME(stackFrame); + CodeBlock* codeBlock = stackFrame.callFrame->codeBlock(); + StructureStubInfo* stubInfo = &codeBlock->getStubInfo(STUB_RETURN_ADDRESS); + if (!stubInfo->seenOnce()) + stubInfo->setSeen(); + else + JITThunks::tryCachePutByID(callFrame, codeBlock, STUB_RETURN_ADDRESS, stackFrame.args[0].jsValue(), slot, stubInfo); - PutPropertySlot slot; - stackFrame.args[0].jsValue().put(stackFrame.callFrame, stackFrame.args[1].identifier(), stackFrame.args[2].jsValue(), slot); - JITThunks::tryCachePutByID(stackFrame.callFrame, stackFrame.callFrame->codeBlock(), STUB_RETURN_ADDRESS, stackFrame.args[0].jsValue(), slot); CHECK_FOR_EXCEPTION_AT_END(); } @@ -772,36 +1098,19 @@ DEFINE_STUB_FUNCTION(void, op_put_by_id_fail) CHECK_FOR_EXCEPTION_AT_END(); } - -DEFINE_STUB_FUNCTION(EncodedJSValue, op_put_by_id_transition_realloc) +DEFINE_STUB_FUNCTION(JSObject*, op_put_by_id_transition_realloc) { STUB_INIT_STACK_FRAME(stackFrame); JSValue baseValue = stackFrame.args[0].jsValue(); - int32_t oldSize = stackFrame.args[1].int32(); - int32_t newSize = stackFrame.args[2].int32(); + int32_t oldSize = stackFrame.args[3].int32(); + int32_t newSize = stackFrame.args[4].int32(); ASSERT(baseValue.isObject()); - asObject(baseValue)->allocatePropertyStorage(oldSize, newSize); + JSObject* base = asObject(baseValue); + base->allocatePropertyStorage(oldSize, newSize); - return JSValue::encode(baseValue); -} - -DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_by_id) -{ - STUB_INIT_STACK_FRAME(stackFrame); - - CallFrame* callFrame = stackFrame.callFrame; - Identifier& ident = stackFrame.args[1].identifier(); - - JSValue baseValue = stackFrame.args[0].jsValue(); - PropertySlot slot(baseValue); - JSValue result = baseValue.get(callFrame, ident, slot); - - ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_id_second)); - - CHECK_FOR_EXCEPTION_AT_END(); - return JSValue::encode(result); + return base; } DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_by_id_method_check) @@ -814,25 +1123,15 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_by_id_method_check) JSValue baseValue = stackFrame.args[0].jsValue(); PropertySlot slot(baseValue); JSValue result = baseValue.get(callFrame, ident, slot); + CHECK_FOR_EXCEPTION(); - ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_id_method_check_second)); - - CHECK_FOR_EXCEPTION_AT_END(); - return JSValue::encode(result); -} - -DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_by_id_method_check_second) -{ - STUB_INIT_STACK_FRAME(stackFrame); - - CallFrame* callFrame = stackFrame.callFrame; - Identifier& ident = stackFrame.args[1].identifier(); - - JSValue baseValue = stackFrame.args[0].jsValue(); - PropertySlot slot(baseValue); - JSValue result = baseValue.get(callFrame, ident, slot); + CodeBlock* codeBlock = stackFrame.callFrame->codeBlock(); + MethodCallLinkInfo& methodCallLinkInfo = codeBlock->getMethodCallLinkInfo(STUB_RETURN_ADDRESS); - CHECK_FOR_EXCEPTION(); + if (!methodCallLinkInfo.seenOnce()) { + methodCallLinkInfo.setSeen(); + return JSValue::encode(result); + } // If we successfully got something, then the base from which it is being accessed must // be an object. (Assertion to ensure asObject() call below is safe, which comes after @@ -863,33 +1162,33 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_by_id_method_check_second) // The result fetched should always be the callee! ASSERT(result == JSValue(callee)); - MethodCallLinkInfo& methodCallLinkInfo = callFrame->codeBlock()->getMethodCallLinkInfo(STUB_RETURN_ADDRESS); // Check to see if the function is on the object's prototype. Patch up the code to optimize. - if (slot.slotBase() == structure->prototypeForLookup(callFrame)) - JIT::patchMethodCallProto(methodCallLinkInfo, callee, structure, slotBaseObject); + if (slot.slotBase() == structure->prototypeForLookup(callFrame)) { + JIT::patchMethodCallProto(codeBlock, methodCallLinkInfo, callee, structure, slotBaseObject, STUB_RETURN_ADDRESS); + return JSValue::encode(result); + } + // Check to see if the function is on the object itself. // Since we generate the method-check to check both the structure and a prototype-structure (since this // is the common case) we have a problem - we need to patch the prototype structure check to do something // useful. We could try to nop it out altogether, but that's a little messy, so lets do something simpler // for now. For now it performs a check on a special object on the global object only used for this // purpose. The object is in no way exposed, and as such the check will always pass. - else if (slot.slotBase() == baseValue) - JIT::patchMethodCallProto(methodCallLinkInfo, callee, structure, callFrame->scopeChain()->globalObject()->methodCallDummy()); - - // For now let any other case be cached as a normal get_by_id. + if (slot.slotBase() == baseValue) { + JIT::patchMethodCallProto(codeBlock, methodCallLinkInfo, callee, structure, callFrame->scopeChain()->globalObject()->methodCallDummy(), STUB_RETURN_ADDRESS); + return JSValue::encode(result); + } } // Revert the get_by_id op back to being a regular get_by_id - allow it to cache like normal, if it needs to. - ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_id)); - + ctiPatchCallByReturnAddress(codeBlock, STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_id)); return JSValue::encode(result); } -DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_by_id_second) +DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_by_id) { STUB_INIT_STACK_FRAME(stackFrame); - CallFrame* callFrame = stackFrame.callFrame; Identifier& ident = stackFrame.args[1].identifier(); @@ -897,7 +1196,12 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_by_id_second) PropertySlot slot(baseValue); JSValue result = baseValue.get(callFrame, ident, slot); - JITThunks::tryCacheGetByID(callFrame, callFrame->codeBlock(), STUB_RETURN_ADDRESS, baseValue, ident, slot); + CodeBlock* codeBlock = stackFrame.callFrame->codeBlock(); + StructureStubInfo* stubInfo = &codeBlock->getStubInfo(STUB_RETURN_ADDRESS); + if (!stubInfo->seenOnce()) + stubInfo->setSeen(); + else + JITThunks::tryCacheGetByID(callFrame, codeBlock, STUB_RETURN_ADDRESS, baseValue, ident, slot, stubInfo); CHECK_FOR_EXCEPTION_AT_END(); return JSValue::encode(result); @@ -929,9 +1233,9 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_by_id_self_fail) PolymorphicAccessStructureList* polymorphicStructureList; int listIndex = 1; - if (stubInfo->opcodeID == op_get_by_id_self) { + if (stubInfo->accessType == access_get_by_id_self) { ASSERT(!stubInfo->stubRoutine); - polymorphicStructureList = new PolymorphicAccessStructureList(MacroAssembler::CodeLocationLabel(), stubInfo->u.getByIdSelf.baseObjectStructure); + polymorphicStructureList = new PolymorphicAccessStructureList(CodeLocationLabel(), stubInfo->u.getByIdSelf.baseObjectStructure); stubInfo->initGetByIdSelfList(polymorphicStructureList, 2); } else { polymorphicStructureList = stubInfo->u.getByIdSelfList.structureList; @@ -942,10 +1246,9 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_by_id_self_fail) JIT::compileGetByIdSelfList(callFrame->scopeChain()->globalData, codeBlock, stubInfo, polymorphicStructureList, listIndex, asCell(baseValue)->structure(), slot.cachedOffset()); if (listIndex == (POLYMORPHIC_LIST_CACHE_SIZE - 1)) - ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_id_generic)); - } else { - ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_id_generic)); - } + ctiPatchCallByReturnAddress(codeBlock, STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_id_generic)); + } else + ctiPatchCallByReturnAddress(callFrame->codeBlock(), STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_id_generic)); return JSValue::encode(result); } @@ -954,18 +1257,18 @@ static PolymorphicAccessStructureList* getPolymorphicAccessStructureListSlot(Str PolymorphicAccessStructureList* prototypeStructureList = 0; listIndex = 1; - switch (stubInfo->opcodeID) { - case op_get_by_id_proto: + switch (stubInfo->accessType) { + case access_get_by_id_proto: prototypeStructureList = new PolymorphicAccessStructureList(stubInfo->stubRoutine, stubInfo->u.getByIdProto.baseObjectStructure, stubInfo->u.getByIdProto.prototypeStructure); - stubInfo->stubRoutine.reset(); + stubInfo->stubRoutine = CodeLocationLabel(); stubInfo->initGetByIdProtoList(prototypeStructureList, 2); break; - case op_get_by_id_chain: + case access_get_by_id_chain: prototypeStructureList = new PolymorphicAccessStructureList(stubInfo->stubRoutine, stubInfo->u.getByIdChain.baseObjectStructure, stubInfo->u.getByIdChain.chain); - stubInfo->stubRoutine.reset(); + stubInfo->stubRoutine = CodeLocationLabel(); stubInfo->initGetByIdProtoList(prototypeStructureList, 2); break; - case op_get_by_id_proto_list: + case access_get_by_id_proto_list: prototypeStructureList = stubInfo->u.getByIdProtoList.structureList; listIndex = stubInfo->u.getByIdProtoList.listSize; stubInfo->u.getByIdProtoList.listSize++; @@ -991,7 +1294,7 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_by_id_proto_list) CHECK_FOR_EXCEPTION(); if (!baseValue.isCell() || !slot.isCacheable() || asCell(baseValue)->structure()->isDictionary()) { - ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_id_proto_fail)); + ctiPatchCallByReturnAddress(callFrame->codeBlock(), STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_id_proto_fail)); return JSValue::encode(result); } @@ -1003,7 +1306,7 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_by_id_proto_list) JSObject* slotBaseObject = asObject(slot.slotBase()); if (slot.slotBase() == baseValue) - ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_id_proto_fail)); + ctiPatchCallByReturnAddress(codeBlock, STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_id_proto_fail)); else if (slot.slotBase() == asCell(baseValue)->structure()->prototypeForLookup(callFrame)) { // Since we're accessing a prototype in a loop, it's a good bet that it // should not be treated as a dictionary. @@ -1016,16 +1319,22 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_by_id_proto_list) JIT::compileGetByIdProtoList(callFrame->scopeChain()->globalData, callFrame, codeBlock, stubInfo, prototypeStructureList, listIndex, structure, slotBaseObject->structure(), slot.cachedOffset()); if (listIndex == (POLYMORPHIC_LIST_CACHE_SIZE - 1)) - ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_id_proto_list_full)); + ctiPatchCallByReturnAddress(codeBlock, STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_id_proto_list_full)); } else if (size_t count = countPrototypeChainEntriesAndCheckForProxies(callFrame, baseValue, slot)) { + StructureChain* protoChain = structure->prototypeChain(callFrame); + if (!protoChain->isCacheable()) { + ctiPatchCallByReturnAddress(codeBlock, STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_id_proto_fail)); + return JSValue::encode(result); + } + int listIndex; PolymorphicAccessStructureList* prototypeStructureList = getPolymorphicAccessStructureListSlot(stubInfo, listIndex); - JIT::compileGetByIdChainList(callFrame->scopeChain()->globalData, callFrame, codeBlock, stubInfo, prototypeStructureList, listIndex, structure, structure->prototypeChain(callFrame), count, slot.cachedOffset()); + JIT::compileGetByIdChainList(callFrame->scopeChain()->globalData, callFrame, codeBlock, stubInfo, prototypeStructureList, listIndex, structure, protoChain, count, slot.cachedOffset()); if (listIndex == (POLYMORPHIC_LIST_CACHE_SIZE - 1)) - ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_id_proto_list_full)); + ctiPatchCallByReturnAddress(codeBlock, STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_id_proto_list_full)); } else - ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_id_proto_fail)); + ctiPatchCallByReturnAddress(codeBlock, STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_id_proto_fail)); return JSValue::encode(result); } @@ -1078,7 +1387,7 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_by_id_string_fail) return JSValue::encode(result); } -#endif +#endif // ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) DEFINE_STUB_FUNCTION(EncodedJSValue, op_instanceof) { @@ -1171,6 +1480,7 @@ DEFINE_STUB_FUNCTION(void*, op_call_JSFunction) #endif JSFunction* function = asFunction(stackFrame.args[0].jsValue()); + ASSERT(!function->isHostFunction()); FunctionBodyNode* body = function->body(); ScopeChainNode* callDataScopeChain = function->scope().node(); body->jitCode(callDataScopeChain); @@ -1184,6 +1494,7 @@ DEFINE_STUB_FUNCTION(VoidPtrPair, op_call_arityCheck) CallFrame* callFrame = stackFrame.callFrame; CodeBlock* newCodeBlock = stackFrame.args[3].codeBlock(); + ASSERT(newCodeBlock->codeType() != NativeCode); int argCount = stackFrame.args[2].int32(); ASSERT(argCount != newCodeBlock->m_numParameters); @@ -1223,34 +1534,28 @@ DEFINE_STUB_FUNCTION(VoidPtrPair, op_call_arityCheck) RETURN_POINTER_PAIR(newCodeBlock, callFrame); } -DEFINE_STUB_FUNCTION(void*, vm_dontLazyLinkCall) -{ - STUB_INIT_STACK_FRAME(stackFrame); - - JSGlobalData* globalData = stackFrame.globalData; - JSFunction* callee = asFunction(stackFrame.args[0].jsValue()); - - ctiPatchNearCallByReturnAddress(stackFrame.args[1].returnAddress(), globalData->jitStubs.ctiVirtualCallLink()); - - return callee->body()->generatedJITCode().addressForCall().executableAddress(); -} - +#if ENABLE(JIT_OPTIMIZE_CALL) DEFINE_STUB_FUNCTION(void*, vm_lazyLinkCall) { STUB_INIT_STACK_FRAME(stackFrame); - JSFunction* callee = asFunction(stackFrame.args[0].jsValue()); JITCode& jitCode = callee->body()->generatedJITCode(); CodeBlock* codeBlock = 0; if (!callee->isHostFunction()) codeBlock = &callee->body()->bytecode(callee->scope().node()); - + else + codeBlock = &callee->body()->generatedBytecode(); CallLinkInfo* callLinkInfo = &stackFrame.callFrame->callerFrame()->codeBlock()->getCallLinkInfo(stackFrame.args[1].returnAddress()); - JIT::linkCall(callee, codeBlock, jitCode, callLinkInfo, stackFrame.args[2].int32()); + + if (!callLinkInfo->seenOnce()) + callLinkInfo->setSeen(); + else + JIT::linkCall(callee, stackFrame.callFrame->callerFrame()->codeBlock(), codeBlock, jitCode, callLinkInfo, stackFrame.args[2].int32(), stackFrame.globalData); return jitCode.addressForCall().executableAddress(); } +#endif // !ENABLE(JIT_OPTIMIZE_CALL) DEFINE_STUB_FUNCTION(JSObject*, op_push_activation) { @@ -1278,7 +1583,7 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_call_NotJSFunction) CallFrame* previousCallFrame = stackFrame.callFrame; CallFrame* callFrame = CallFrame::create(previousCallFrame->registers() + registerOffset); - callFrame->init(0, static_cast<Instruction*>(STUB_RETURN_ADDRESS), previousCallFrame->scopeChain(), previousCallFrame, 0, argCount, 0); + callFrame->init(0, static_cast<Instruction*>((STUB_RETURN_ADDRESS).value()), previousCallFrame->scopeChain(), previousCallFrame, 0, argCount, 0); stackFrame.callFrame = callFrame; Register* argv = stackFrame.callFrame->registers() - RegisterFile::CallFrameHeaderSize - argCount; @@ -1316,7 +1621,7 @@ DEFINE_STUB_FUNCTION(void, op_create_arguments) Arguments* arguments = new (stackFrame.globalData) Arguments(stackFrame.callFrame); stackFrame.callFrame->setCalleeArguments(arguments); - stackFrame.callFrame[RegisterFile::ArgumentsRegister] = arguments; + stackFrame.callFrame[RegisterFile::ArgumentsRegister] = JSValue(arguments); } DEFINE_STUB_FUNCTION(void, op_create_arguments_no_params) @@ -1325,7 +1630,7 @@ DEFINE_STUB_FUNCTION(void, op_create_arguments_no_params) Arguments* arguments = new (stackFrame.globalData) Arguments(stackFrame.callFrame, Arguments::NoParameters); stackFrame.callFrame->setCalleeArguments(arguments); - stackFrame.callFrame[RegisterFile::ArgumentsRegister] = arguments; + stackFrame.callFrame[RegisterFile::ArgumentsRegister] = JSValue(arguments); } DEFINE_STUB_FUNCTION(void, op_tear_off_activation) @@ -1477,8 +1782,8 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_by_val) JSValue result; - if (LIKELY(subscript.isUInt32Fast())) { - uint32_t i = subscript.getUInt32Fast(); + if (LIKELY(subscript.isUInt32())) { + uint32_t i = subscript.asUInt32(); if (isJSArray(globalData, baseValue)) { JSArray* jsArray = asArray(baseValue); if (jsArray->canGetIndex(i)) @@ -1487,11 +1792,11 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_by_val) result = jsArray->JSArray::get(callFrame, i); } else if (isJSString(globalData, baseValue) && asString(baseValue)->canGetIndex(i)) { // All fast byte array accesses are safe from exceptions so return immediately to avoid exception checks. - ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_val_string)); + ctiPatchCallByReturnAddress(callFrame->codeBlock(), STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_val_string)); result = asString(baseValue)->getIndex(stackFrame.globalData, i); } else if (isJSByteArray(globalData, baseValue) && asByteArray(baseValue)->canAccessIndex(i)) { // All fast byte array accesses are safe from exceptions so return immediately to avoid exception checks. - ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_val_byte_array)); + ctiPatchCallByReturnAddress(callFrame->codeBlock(), STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_val_byte_array)); return JSValue::encode(asByteArray(baseValue)->getIndex(callFrame, i)); } else result = baseValue.get(callFrame, i); @@ -1516,14 +1821,14 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_by_val_string) JSValue result; - if (LIKELY(subscript.isUInt32Fast())) { - uint32_t i = subscript.getUInt32Fast(); + if (LIKELY(subscript.isUInt32())) { + uint32_t i = subscript.asUInt32(); if (isJSString(globalData, baseValue) && asString(baseValue)->canGetIndex(i)) result = asString(baseValue)->getIndex(stackFrame.globalData, i); else { result = baseValue.get(callFrame, i); if (!isJSString(globalData, baseValue)) - ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_val)); + ctiPatchCallByReturnAddress(callFrame->codeBlock(), STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_val)); } } else { Identifier property(callFrame, subscript.toString(callFrame)); @@ -1534,7 +1839,6 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_by_val_string) return JSValue::encode(result); } - DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_by_val_byte_array) { STUB_INIT_STACK_FRAME(stackFrame); @@ -1547,8 +1851,8 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_by_val_byte_array) JSValue result; - if (LIKELY(subscript.isUInt32Fast())) { - uint32_t i = subscript.getUInt32Fast(); + if (LIKELY(subscript.isUInt32())) { + uint32_t i = subscript.asUInt32(); if (isJSByteArray(globalData, baseValue) && asByteArray(baseValue)->canAccessIndex(i)) { // All fast byte array accesses are safe from exceptions so return immediately to avoid exception checks. return JSValue::encode(asByteArray(baseValue)->getIndex(callFrame, i)); @@ -1556,7 +1860,7 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_by_val_byte_array) result = baseValue.get(callFrame, i); if (!isJSByteArray(globalData, baseValue)) - ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_val)); + ctiPatchCallByReturnAddress(callFrame->codeBlock(), STUB_RETURN_ADDRESS, FunctionPtr(cti_op_get_by_val)); } else { Identifier property(callFrame, subscript.toString(callFrame)); result = baseValue.get(callFrame, property); @@ -1566,50 +1870,6 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_by_val_byte_array) return JSValue::encode(result); } -DEFINE_STUB_FUNCTION(EncodedJSValue, op_resolve_func) -{ - STUB_INIT_STACK_FRAME(stackFrame); - - CallFrame* callFrame = stackFrame.callFrame; - ScopeChainNode* scopeChain = callFrame->scopeChain(); - - ScopeChainIterator iter = scopeChain->begin(); - ScopeChainIterator end = scopeChain->end(); - - // FIXME: add scopeDepthIsZero optimization - - ASSERT(iter != end); - - Identifier& ident = stackFrame.args[0].identifier(); - JSObject* base; - do { - base = *iter; - PropertySlot slot(base); - if (base->getPropertySlot(callFrame, ident, slot)) { - // ECMA 11.2.3 says that if we hit an activation the this value should be null. - // However, section 10.2.3 says that in the case where the value provided - // by the caller is null, the global object should be used. It also says - // that the section does not apply to internal functions, but for simplicity - // of implementation we use the global object anyway here. This guarantees - // that in host objects you always get a valid object for this. - // We also handle wrapper substitution for the global object at the same time. - JSObject* thisObj = base->toThisObject(callFrame); - JSValue result = slot.getValue(callFrame, ident); - CHECK_FOR_EXCEPTION_AT_END(); - - callFrame->registers()[stackFrame.args[1].int32()] = JSValue(thisObj); - return JSValue::encode(result); - } - ++iter; - } while (iter != end); - - CodeBlock* codeBlock = callFrame->codeBlock(); - unsigned vPCIndex = codeBlock->getBytecodeIndex(callFrame, STUB_RETURN_ADDRESS); - stackFrame.globalData->exception = createUndefinedVariableError(callFrame, ident, vPCIndex, codeBlock); - VM_THROW_EXCEPTION_AT_END(); - return JSValue::encode(JSValue()); -} - DEFINE_STUB_FUNCTION(EncodedJSValue, op_sub) { STUB_INIT_STACK_FRAME(stackFrame); @@ -1639,8 +1899,8 @@ DEFINE_STUB_FUNCTION(void, op_put_by_val) JSValue subscript = stackFrame.args[1].jsValue(); JSValue value = stackFrame.args[2].jsValue(); - if (LIKELY(subscript.isUInt32Fast())) { - uint32_t i = subscript.getUInt32Fast(); + if (LIKELY(subscript.isUInt32())) { + uint32_t i = subscript.asUInt32(); if (isJSArray(globalData, baseValue)) { JSArray* jsArray = asArray(baseValue); if (jsArray->canSetIndex(i)) @@ -1649,10 +1909,10 @@ DEFINE_STUB_FUNCTION(void, op_put_by_val) jsArray->JSArray::put(callFrame, i, value); } else if (isJSByteArray(globalData, baseValue) && asByteArray(baseValue)->canAccessIndex(i)) { JSByteArray* jsByteArray = asByteArray(baseValue); - ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, FunctionPtr(cti_op_put_by_val_byte_array)); + ctiPatchCallByReturnAddress(callFrame->codeBlock(), STUB_RETURN_ADDRESS, FunctionPtr(cti_op_put_by_val_byte_array)); // All fast byte array accesses are safe from exceptions so return immediately to avoid exception checks. - if (value.isInt32Fast()) { - jsByteArray->setIndex(i, value.getInt32Fast()); + if (value.isInt32()) { + jsByteArray->setIndex(i, value.asInt32()); return; } else { double dValue = 0; @@ -1690,14 +1950,9 @@ DEFINE_STUB_FUNCTION(void, op_put_by_val_array) if (LIKELY(i >= 0)) asArray(baseValue)->JSArray::put(callFrame, i, value); else { - // This should work since we're re-boxing an immediate unboxed in JIT code. - ASSERT(JSValue::makeInt32Fast(i)); - Identifier property(callFrame, JSValue::makeInt32Fast(i).toString(callFrame)); - // FIXME: can toString throw an exception here? - if (!stackFrame.globalData->exception) { // Don't put to an object if toString threw an exception. - PutPropertySlot slot; - baseValue.put(callFrame, property, value, slot); - } + Identifier property(callFrame, UString::from(i)); + PutPropertySlot slot; + baseValue.put(callFrame, property, value, slot); } CHECK_FOR_EXCEPTION_AT_END(); @@ -1714,14 +1969,14 @@ DEFINE_STUB_FUNCTION(void, op_put_by_val_byte_array) JSValue subscript = stackFrame.args[1].jsValue(); JSValue value = stackFrame.args[2].jsValue(); - if (LIKELY(subscript.isUInt32Fast())) { - uint32_t i = subscript.getUInt32Fast(); + if (LIKELY(subscript.isUInt32())) { + uint32_t i = subscript.asUInt32(); if (isJSByteArray(globalData, baseValue) && asByteArray(baseValue)->canAccessIndex(i)) { JSByteArray* jsByteArray = asByteArray(baseValue); // All fast byte array accesses are safe from exceptions so return immediately to avoid exception checks. - if (value.isInt32Fast()) { - jsByteArray->setIndex(i, value.getInt32Fast()); + if (value.isInt32()) { + jsByteArray->setIndex(i, value.asInt32()); return; } else { double dValue = 0; @@ -1733,7 +1988,7 @@ DEFINE_STUB_FUNCTION(void, op_put_by_val_byte_array) } if (!isJSByteArray(globalData, baseValue)) - ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, FunctionPtr(cti_op_put_by_val)); + ctiPatchCallByReturnAddress(callFrame->codeBlock(), STUB_RETURN_ADDRESS, FunctionPtr(cti_op_put_by_val)); baseValue.put(callFrame, i, value); } else { Identifier property(callFrame, subscript.toString(callFrame)); @@ -1772,6 +2027,7 @@ DEFINE_STUB_FUNCTION(int, op_loop_if_true) DEFINE_STUB_FUNCTION(int, op_load_varargs) { STUB_INIT_STACK_FRAME(stackFrame); + CallFrame* callFrame = stackFrame.callFrame; RegisterFile* registerFile = stackFrame.registerFile; int argsOffset = stackFrame.args[0].int32(); @@ -1786,7 +2042,7 @@ DEFINE_STUB_FUNCTION(int, op_load_varargs) stackFrame.globalData->exception = createStackOverflowError(callFrame); VM_THROW_EXCEPTION(); } - int32_t expectedParams = asFunction(callFrame->registers()[RegisterFile::Callee].jsValue())->body()->parameterCount(); + int32_t expectedParams = callFrame->callee()->body()->parameterCount(); int32_t inplaceArgs = min(providedParams, expectedParams); Register* inplaceArgsDst = callFrame->registers() + argsOffset; @@ -1918,7 +2174,7 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_resolve_global) STUB_INIT_STACK_FRAME(stackFrame); CallFrame* callFrame = stackFrame.callFrame; - JSGlobalObject* globalObject = asGlobalObject(stackFrame.args[0].jsValue()); + JSGlobalObject* globalObject = stackFrame.args[0].globalObject(); Identifier& ident = stackFrame.args[1].identifier(); unsigned globalResolveInfoIndex = stackFrame.args[2].int32(); ASSERT(globalObject->isGlobalObject()); @@ -2042,7 +2298,117 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_post_inc) return JSValue::encode(number); } -DEFINE_STUB_FUNCTION(EncodedJSValue, op_eq) +#if USE(JSVALUE32_64) + +DEFINE_STUB_FUNCTION(int, op_eq) +{ + STUB_INIT_STACK_FRAME(stackFrame); + + JSValue src1 = stackFrame.args[0].jsValue(); + JSValue src2 = stackFrame.args[1].jsValue(); + + start: + if (src2.isUndefined()) { + return src1.isNull() || + (src1.isCell() && asCell(src1)->structure()->typeInfo().masqueradesAsUndefined()) || + src1.isUndefined(); + } + + if (src2.isNull()) { + return src1.isUndefined() || + (src1.isCell() && asCell(src1)->structure()->typeInfo().masqueradesAsUndefined()) || + src1.isNull(); + } + + if (src1.isInt32()) { + if (src2.isDouble()) + return src1.asInt32() == src2.asDouble(); + double d = src2.toNumber(stackFrame.callFrame); + CHECK_FOR_EXCEPTION(); + return src1.asInt32() == d; + } + + if (src1.isDouble()) { + if (src2.isInt32()) + return src1.asDouble() == src2.asInt32(); + double d = src2.toNumber(stackFrame.callFrame); + CHECK_FOR_EXCEPTION(); + return src1.asDouble() == d; + } + + if (src1.isTrue()) { + if (src2.isFalse()) + return false; + double d = src2.toNumber(stackFrame.callFrame); + CHECK_FOR_EXCEPTION(); + return d == 1.0; + } + + if (src1.isFalse()) { + if (src2.isTrue()) + return false; + double d = src2.toNumber(stackFrame.callFrame); + CHECK_FOR_EXCEPTION(); + return d == 0.0; + } + + if (src1.isUndefined()) + return src2.isCell() && asCell(src2)->structure()->typeInfo().masqueradesAsUndefined(); + + if (src1.isNull()) + return src2.isCell() && asCell(src2)->structure()->typeInfo().masqueradesAsUndefined(); + + ASSERT(src1.isCell()); + + JSCell* cell1 = asCell(src1); + + if (cell1->isString()) { + if (src2.isInt32()) + return static_cast<JSString*>(cell1)->value().toDouble() == src2.asInt32(); + + if (src2.isDouble()) + return static_cast<JSString*>(cell1)->value().toDouble() == src2.asDouble(); + + if (src2.isTrue()) + return static_cast<JSString*>(cell1)->value().toDouble() == 1.0; + + if (src2.isFalse()) + return static_cast<JSString*>(cell1)->value().toDouble() == 0.0; + + ASSERT(src2.isCell()); + JSCell* cell2 = asCell(src2); + if (cell2->isString()) + return static_cast<JSString*>(cell1)->value() == static_cast<JSString*>(cell2)->value(); + + ASSERT(cell2->isObject()); + src2 = static_cast<JSObject*>(cell2)->toPrimitive(stackFrame.callFrame); + CHECK_FOR_EXCEPTION(); + goto start; + } + + ASSERT(cell1->isObject()); + if (src2.isObject()) + return static_cast<JSObject*>(cell1) == asObject(src2); + src1 = static_cast<JSObject*>(cell1)->toPrimitive(stackFrame.callFrame); + CHECK_FOR_EXCEPTION(); + goto start; +} + +DEFINE_STUB_FUNCTION(int, op_eq_strings) +{ + STUB_INIT_STACK_FRAME(stackFrame); + + JSString* string1 = stackFrame.args[0].jsString(); + JSString* string2 = stackFrame.args[1].jsString(); + + ASSERT(string1->isString()); + ASSERT(string2->isString()); + return string1->value() == string2->value(); +} + +#else // USE(JSVALUE32_64) + +DEFINE_STUB_FUNCTION(int, op_eq) { STUB_INIT_STACK_FRAME(stackFrame); @@ -2051,12 +2417,13 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_eq) CallFrame* callFrame = stackFrame.callFrame; - ASSERT(!JSValue::areBothInt32Fast(src1, src2)); - JSValue result = jsBoolean(JSValue::equalSlowCaseInline(callFrame, src1, src2)); + bool result = JSValue::equalSlowCaseInline(callFrame, src1, src2); CHECK_FOR_EXCEPTION_AT_END(); - return JSValue::encode(result); + return result; } +#endif // USE(JSVALUE32_64) + DEFINE_STUB_FUNCTION(EncodedJSValue, op_lshift) { STUB_INIT_STACK_FRAME(stackFrame); @@ -2064,13 +2431,6 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_lshift) JSValue val = stackFrame.args[0].jsValue(); JSValue shift = stackFrame.args[1].jsValue(); - int32_t left; - uint32_t right; - if (JSValue::areBothInt32Fast(val, shift)) - return JSValue::encode(jsNumber(stackFrame.globalData, val.getInt32Fast() << (shift.getInt32Fast() & 0x1f))); - if (val.numberToInt32(left) && shift.numberToUInt32(right)) - return JSValue::encode(jsNumber(stackFrame.globalData, left << (right & 0x1f))); - CallFrame* callFrame = stackFrame.callFrame; JSValue result = jsNumber(stackFrame.globalData, (val.toInt32(callFrame)) << (shift.toUInt32(callFrame) & 0x1f)); CHECK_FOR_EXCEPTION_AT_END(); @@ -2084,11 +2444,7 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_bitand) JSValue src1 = stackFrame.args[0].jsValue(); JSValue src2 = stackFrame.args[1].jsValue(); - int32_t left; - int32_t right; - if (src1.numberToInt32(left) && src2.numberToInt32(right)) - return JSValue::encode(jsNumber(stackFrame.globalData, left & right)); - + ASSERT(!src1.isInt32() || !src2.isInt32()); CallFrame* callFrame = stackFrame.callFrame; JSValue result = jsNumber(stackFrame.globalData, src1.toInt32(callFrame) & src2.toInt32(callFrame)); CHECK_FOR_EXCEPTION_AT_END(); @@ -2102,15 +2458,9 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_rshift) JSValue val = stackFrame.args[0].jsValue(); JSValue shift = stackFrame.args[1].jsValue(); - int32_t left; - uint32_t right; - if (JSFastMath::canDoFastRshift(val, shift)) - return JSValue::encode(JSFastMath::rightShiftImmediateNumbers(val, shift)); - if (val.numberToInt32(left) && shift.numberToUInt32(right)) - return JSValue::encode(jsNumber(stackFrame.globalData, left >> (right & 0x1f))); - CallFrame* callFrame = stackFrame.callFrame; JSValue result = jsNumber(stackFrame.globalData, (val.toInt32(callFrame)) >> (shift.toUInt32(callFrame) & 0x1f)); + CHECK_FOR_EXCEPTION_AT_END(); return JSValue::encode(result); } @@ -2121,10 +2471,7 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_bitnot) JSValue src = stackFrame.args[0].jsValue(); - int value; - if (src.numberToInt32(value)) - return JSValue::encode(jsNumber(stackFrame.globalData, ~value)); - + ASSERT(!src.isInt32()); CallFrame* callFrame = stackFrame.callFrame; JSValue result = jsNumber(stackFrame.globalData, ~src.toInt32(callFrame)); CHECK_FOR_EXCEPTION_AT_END(); @@ -2198,21 +2545,6 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_less) return JSValue::encode(result); } -DEFINE_STUB_FUNCTION(EncodedJSValue, op_neq) -{ - STUB_INIT_STACK_FRAME(stackFrame); - - JSValue src1 = stackFrame.args[0].jsValue(); - JSValue src2 = stackFrame.args[1].jsValue(); - - ASSERT(!JSValue::areBothInt32Fast(src1, src2)); - - CallFrame* callFrame = stackFrame.callFrame; - JSValue result = jsBoolean(!JSValue::equalSlowCaseInline(callFrame, src1, src2)); - CHECK_FOR_EXCEPTION_AT_END(); - return JSValue::encode(result); -} - DEFINE_STUB_FUNCTION(EncodedJSValue, op_post_dec) { STUB_INIT_STACK_FRAME(stackFrame); @@ -2236,14 +2568,9 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_urshift) JSValue shift = stackFrame.args[1].jsValue(); CallFrame* callFrame = stackFrame.callFrame; - - if (JSFastMath::canDoFastUrshift(val, shift)) - return JSValue::encode(JSFastMath::rightShiftImmediateNumbers(val, shift)); - else { - JSValue result = jsNumber(stackFrame.globalData, (val.toUInt32(callFrame)) >> (shift.toUInt32(callFrame) & 0x1f)); - CHECK_FOR_EXCEPTION_AT_END(); - return JSValue::encode(result); - } + JSValue result = jsNumber(stackFrame.globalData, (val.toUInt32(callFrame)) >> (shift.toUInt32(callFrame) & 0x1f)); + CHECK_FOR_EXCEPTION_AT_END(); + return JSValue::encode(result); } DEFINE_STUB_FUNCTION(EncodedJSValue, op_bitxor) @@ -2302,7 +2629,7 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_call_eval) if (thisValue == globalObject && funcVal == globalObject->evalFunction()) { JSValue exceptionValue; JSValue result = interpreter->callEval(callFrame, registerFile, argv, argCount, registerOffset, exceptionValue); - if (UNLIKELY(exceptionValue != JSValue())) { + if (UNLIKELY(exceptionValue)) { stackFrame.globalData->exception = exceptionValue; VM_THROW_EXCEPTION_AT_END(); } @@ -2333,7 +2660,7 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, op_throw) } stackFrame.callFrame = callFrame; - void* catchRoutine = handler->nativeCode.addressForExceptionHandler(); + void* catchRoutine = handler->nativeCode.executableAddress(); ASSERT(catchRoutine); STUB_SET_RETURN_ADDRESS(catchRoutine); return JSValue::encode(exceptionValue); @@ -2540,15 +2867,15 @@ DEFINE_STUB_FUNCTION(void*, op_switch_imm) CallFrame* callFrame = stackFrame.callFrame; CodeBlock* codeBlock = callFrame->codeBlock(); - if (scrutinee.isInt32Fast()) - return codeBlock->immediateSwitchJumpTable(tableIndex).ctiForValue(scrutinee.getInt32Fast()).addressForSwitch(); + if (scrutinee.isInt32()) + return codeBlock->immediateSwitchJumpTable(tableIndex).ctiForValue(scrutinee.asInt32()).executableAddress(); else { double value; int32_t intValue; if (scrutinee.getNumber(value) && ((intValue = static_cast<int32_t>(value)) == value)) - return codeBlock->immediateSwitchJumpTable(tableIndex).ctiForValue(intValue).addressForSwitch(); + return codeBlock->immediateSwitchJumpTable(tableIndex).ctiForValue(intValue).executableAddress(); else - return codeBlock->immediateSwitchJumpTable(tableIndex).ctiDefault.addressForSwitch(); + return codeBlock->immediateSwitchJumpTable(tableIndex).ctiDefault.executableAddress(); } } @@ -2561,12 +2888,12 @@ DEFINE_STUB_FUNCTION(void*, op_switch_char) CallFrame* callFrame = stackFrame.callFrame; CodeBlock* codeBlock = callFrame->codeBlock(); - void* result = codeBlock->characterSwitchJumpTable(tableIndex).ctiDefault.addressForSwitch(); + void* result = codeBlock->characterSwitchJumpTable(tableIndex).ctiDefault.executableAddress(); if (scrutinee.isString()) { UString::Rep* value = asString(scrutinee)->value().rep(); if (value->size() == 1) - result = codeBlock->characterSwitchJumpTable(tableIndex).ctiForValue(value->data()[0]).addressForSwitch(); + result = codeBlock->characterSwitchJumpTable(tableIndex).ctiForValue(value->data()[0]).executableAddress(); } return result; @@ -2581,11 +2908,11 @@ DEFINE_STUB_FUNCTION(void*, op_switch_string) CallFrame* callFrame = stackFrame.callFrame; CodeBlock* codeBlock = callFrame->codeBlock(); - void* result = codeBlock->stringSwitchJumpTable(tableIndex).ctiDefault.addressForSwitch(); + void* result = codeBlock->stringSwitchJumpTable(tableIndex).ctiDefault.executableAddress(); if (scrutinee.isString()) { UString::Rep* value = asString(scrutinee)->value().rep(); - result = codeBlock->stringSwitchJumpTable(tableIndex).ctiForValue(value).addressForSwitch(); + result = codeBlock->stringSwitchJumpTable(tableIndex).ctiForValue(value).executableAddress(); } return result; @@ -2689,14 +3016,12 @@ DEFINE_STUB_FUNCTION(EncodedJSValue, vm_throw) } stackFrame.callFrame = callFrame; - void* catchRoutine = handler->nativeCode.addressForExceptionHandler(); + void* catchRoutine = handler->nativeCode.executableAddress(); ASSERT(catchRoutine); STUB_SET_RETURN_ADDRESS(catchRoutine); return JSValue::encode(exceptionValue); } -} // namespace JITStubs - } // namespace JSC #endif // ENABLE(JIT) diff --git a/JavaScriptCore/jit/JITStubs.h b/JavaScriptCore/jit/JITStubs.h index 8e81ade..8f02435 100644 --- a/JavaScriptCore/jit/JITStubs.h +++ b/JavaScriptCore/jit/JITStubs.h @@ -38,6 +38,8 @@ namespace JSC { + struct StructureStubInfo; + class CodeBlock; class ExecutablePool; class Identifier; @@ -53,6 +55,7 @@ namespace JSC { class RegisterFile; class FuncDeclNode; class FuncExprNode; + class JSGlobalObject; class RegExp; union JITStubArg { @@ -68,13 +71,23 @@ namespace JSC { FuncExprNode* funcExprNode() { return static_cast<FuncExprNode*>(asPointer); } RegExp* regExp() { return static_cast<RegExp*>(asPointer); } JSPropertyNameIterator* propertyNameIterator() { return static_cast<JSPropertyNameIterator*>(asPointer); } - void* returnAddress() { return asPointer; } + JSGlobalObject* globalObject() { return static_cast<JSGlobalObject*>(asPointer); } + JSString* jsString() { return static_cast<JSString*>(asPointer); } + ReturnAddressPtr returnAddress() { return ReturnAddressPtr(asPointer); } }; #if PLATFORM(X86_64) struct JITStackFrame { - JITStubArg padding; // Unused - JITStubArg args[8]; + void* reserved; // Unused + JITStubArg args[6]; + void* padding[2]; // Maintain 32-byte stack alignment (possibly overkill). + + void* code; + RegisterFile* registerFile; + CallFrame* callFrame; + JSValue* exception; + Profiler** enabledProfilerReference; + JSGlobalData* globalData; void* savedRBX; void* savedR15; @@ -84,20 +97,20 @@ namespace JSC { void* savedRBP; void* savedRIP; - void* code; - RegisterFile* registerFile; - CallFrame* callFrame; - JSValue* exception; - Profiler** enabledProfilerReference; - JSGlobalData* globalData; - // When JIT code makes a call, it pushes its return address just below the rest of the stack. - void** returnAddressSlot() { return reinterpret_cast<void**>(this) - 1; } + ReturnAddressPtr* returnAddressSlot() { return reinterpret_cast<ReturnAddressPtr*>(this) - 1; } }; #elif PLATFORM(X86) +#if COMPILER(MSVC) +#pragma pack(push) +#pragma pack(4) +#endif // COMPILER(MSVC) struct JITStackFrame { - JITStubArg padding; // Unused + void* reserved; // Unused JITStubArg args[6]; +#if USE(JSVALUE32_64) + void* padding[2]; // Maintain 16-byte stack alignment. +#endif void* savedEBX; void* savedEDI; @@ -113,14 +126,20 @@ namespace JSC { JSGlobalData* globalData; // When JIT code makes a call, it pushes its return address just below the rest of the stack. - void** returnAddressSlot() { return reinterpret_cast<void**>(this) - 1; } + ReturnAddressPtr* returnAddressSlot() { return reinterpret_cast<ReturnAddressPtr*>(this) - 1; } }; -#elif PLATFORM(ARM_V7) +#if COMPILER(MSVC) +#pragma pack(pop) +#endif // COMPILER(MSVC) +#elif PLATFORM_ARM_ARCH(7) struct JITStackFrame { - JITStubArg padding; // Unused + void* reserved; // Unused JITStubArg args[6]; +#if USE(JSVALUE32_64) + void* padding[2]; // Maintain 16-byte stack alignment. +#endif - void* thunkReturnAddress; + ReturnAddressPtr thunkReturnAddress; void* preservedReturnAddress; void* preservedR4; @@ -136,7 +155,28 @@ namespace JSC { Profiler** enabledProfilerReference; JSGlobalData* globalData; - void** returnAddressSlot() { return &thunkReturnAddress; } + ReturnAddressPtr* returnAddressSlot() { return &thunkReturnAddress; } + }; +#elif PLATFORM(ARM) + struct JITStackFrame { + JITStubArg padding; // Unused + JITStubArg args[7]; + + void* preservedR4; + void* preservedR5; + void* preservedR6; + void* preservedR7; + void* preservedR8; + void* preservedLink; + + RegisterFile* registerFile; + CallFrame* callFrame; + JSValue* exception; + Profiler** enabledProfilerReference; + JSGlobalData* globalData; + + // When JIT code makes a call, it pushes its return address just below the rest of the stack. + ReturnAddressPtr* returnAddressSlot() { return reinterpret_cast<ReturnAddressPtr*>(this) - 1; } }; #else #error "JITStackFrame not defined for this platform." @@ -183,24 +223,16 @@ namespace JSC { extern "C" void ctiVMThrowTrampoline(); extern "C" void ctiOpThrowNotCaught(); - extern "C" EncodedJSValue ctiTrampoline( -#if PLATFORM(X86_64) - // FIXME: (bug #22910) this will force all arguments onto the stack (regparm(0) does not appear to have any effect). - // We can allow register passing here, and move the writes of these values into the trampoline. - void*, void*, void*, void*, void*, void*, -#endif - void* code, RegisterFile*, CallFrame*, JSValue* exception, Profiler**, JSGlobalData*); + extern "C" EncodedJSValue ctiTrampoline(void* code, RegisterFile*, CallFrame*, JSValue* exception, Profiler**, JSGlobalData*); class JITThunks { public: JITThunks(JSGlobalData*); - static void tryCacheGetByID(CallFrame*, CodeBlock*, void* returnAddress, JSValue baseValue, const Identifier& propertyName, const PropertySlot&); - static void tryCachePutByID(CallFrame*, CodeBlock*, void* returnAddress, JSValue baseValue, const PutPropertySlot&); - - MacroAssemblerCodePtr ctiArrayLengthTrampoline() { return m_ctiArrayLengthTrampoline; } + static void tryCacheGetByID(CallFrame*, CodeBlock*, ReturnAddressPtr returnAddress, JSValue baseValue, const Identifier& propertyName, const PropertySlot&, StructureStubInfo* stubInfo); + static void tryCachePutByID(CallFrame*, CodeBlock*, ReturnAddressPtr returnAddress, JSValue baseValue, const PutPropertySlot&, StructureStubInfo* stubInfo); + MacroAssemblerCodePtr ctiStringLengthTrampoline() { return m_ctiStringLengthTrampoline; } - MacroAssemblerCodePtr ctiVirtualCallPreLink() { return m_ctiVirtualCallPreLink; } MacroAssemblerCodePtr ctiVirtualCallLink() { return m_ctiVirtualCallLink; } MacroAssemblerCodePtr ctiVirtualCall() { return m_ctiVirtualCall; } MacroAssemblerCodePtr ctiNativeCallThunk() { return m_ctiNativeCallThunk; } @@ -208,64 +240,13 @@ namespace JSC { private: RefPtr<ExecutablePool> m_executablePool; - MacroAssemblerCodePtr m_ctiArrayLengthTrampoline; MacroAssemblerCodePtr m_ctiStringLengthTrampoline; - MacroAssemblerCodePtr m_ctiVirtualCallPreLink; MacroAssemblerCodePtr m_ctiVirtualCallLink; MacroAssemblerCodePtr m_ctiVirtualCall; MacroAssemblerCodePtr m_ctiNativeCallThunk; }; -namespace JITStubs { extern "C" { - - void JIT_STUB cti_op_create_arguments(STUB_ARGS_DECLARATION); - void JIT_STUB cti_op_create_arguments_no_params(STUB_ARGS_DECLARATION); - void JIT_STUB cti_op_debug(STUB_ARGS_DECLARATION); - void JIT_STUB cti_op_end(STUB_ARGS_DECLARATION); - void JIT_STUB cti_op_jmp_scopes(STUB_ARGS_DECLARATION); - void JIT_STUB cti_op_pop_scope(STUB_ARGS_DECLARATION); - void JIT_STUB cti_op_profile_did_call(STUB_ARGS_DECLARATION); - void JIT_STUB cti_op_profile_will_call(STUB_ARGS_DECLARATION); - void JIT_STUB cti_op_put_by_id(STUB_ARGS_DECLARATION); - void JIT_STUB cti_op_put_by_id_fail(STUB_ARGS_DECLARATION); - void JIT_STUB cti_op_put_by_id_generic(STUB_ARGS_DECLARATION); - void JIT_STUB cti_op_put_by_id_second(STUB_ARGS_DECLARATION); - void JIT_STUB cti_op_put_by_index(STUB_ARGS_DECLARATION); - void JIT_STUB cti_op_put_by_val(STUB_ARGS_DECLARATION); - void JIT_STUB cti_op_put_by_val_array(STUB_ARGS_DECLARATION); - void JIT_STUB cti_op_put_by_val_byte_array(STUB_ARGS_DECLARATION); - void JIT_STUB cti_op_put_getter(STUB_ARGS_DECLARATION); - void JIT_STUB cti_op_put_setter(STUB_ARGS_DECLARATION); - void JIT_STUB cti_op_ret_scopeChain(STUB_ARGS_DECLARATION); - void JIT_STUB cti_op_tear_off_activation(STUB_ARGS_DECLARATION); - void JIT_STUB cti_op_tear_off_arguments(STUB_ARGS_DECLARATION); - void JIT_STUB cti_register_file_check(STUB_ARGS_DECLARATION); - int JIT_STUB cti_op_jless(STUB_ARGS_DECLARATION); - int JIT_STUB cti_op_jlesseq(STUB_ARGS_DECLARATION); - int JIT_STUB cti_op_jtrue(STUB_ARGS_DECLARATION); - int JIT_STUB cti_op_load_varargs(STUB_ARGS_DECLARATION); - int JIT_STUB cti_op_loop_if_less(STUB_ARGS_DECLARATION); - int JIT_STUB cti_op_loop_if_lesseq(STUB_ARGS_DECLARATION); - int JIT_STUB cti_op_loop_if_true(STUB_ARGS_DECLARATION); - int JIT_STUB cti_timeout_check(STUB_ARGS_DECLARATION); - void* JIT_STUB cti_op_call_JSFunction(STUB_ARGS_DECLARATION); - void* JIT_STUB cti_op_switch_char(STUB_ARGS_DECLARATION); - void* JIT_STUB cti_op_switch_imm(STUB_ARGS_DECLARATION); - void* JIT_STUB cti_op_switch_string(STUB_ARGS_DECLARATION); - void* JIT_STUB cti_vm_dontLazyLinkCall(STUB_ARGS_DECLARATION); - void* JIT_STUB cti_vm_lazyLinkCall(STUB_ARGS_DECLARATION); - JSObject* JIT_STUB cti_op_construct_JSConstruct(STUB_ARGS_DECLARATION); - JSObject* JIT_STUB cti_op_convert_this(STUB_ARGS_DECLARATION); - JSObject* JIT_STUB cti_op_new_array(STUB_ARGS_DECLARATION); - JSObject* JIT_STUB cti_op_new_error(STUB_ARGS_DECLARATION); - JSObject* JIT_STUB cti_op_new_func(STUB_ARGS_DECLARATION); - JSObject* JIT_STUB cti_op_new_func_exp(STUB_ARGS_DECLARATION); - JSObject* JIT_STUB cti_op_new_object(STUB_ARGS_DECLARATION); - JSObject* JIT_STUB cti_op_new_regexp(STUB_ARGS_DECLARATION); - JSObject* JIT_STUB cti_op_push_activation(STUB_ARGS_DECLARATION); - JSObject* JIT_STUB cti_op_push_new_scope(STUB_ARGS_DECLARATION); - JSObject* JIT_STUB cti_op_push_scope(STUB_ARGS_DECLARATION); - JSPropertyNameIterator* JIT_STUB cti_op_get_pnames(STUB_ARGS_DECLARATION); +extern "C" { EncodedJSValue JIT_STUB cti_op_add(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_bitand(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_bitnot(STUB_ARGS_DECLARATION); @@ -274,25 +255,22 @@ namespace JITStubs { extern "C" { EncodedJSValue JIT_STUB cti_op_call_NotJSFunction(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_call_eval(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_construct_NotJSConstruct(STUB_ARGS_DECLARATION); + EncodedJSValue JIT_STUB cti_op_convert_this(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_del_by_id(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_del_by_val(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_div(STUB_ARGS_DECLARATION); - EncodedJSValue JIT_STUB cti_op_eq(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_get_by_id(STUB_ARGS_DECLARATION); - EncodedJSValue JIT_STUB cti_op_get_by_id_method_check(STUB_ARGS_DECLARATION); - EncodedJSValue JIT_STUB cti_op_get_by_id_method_check_second(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_get_by_id_array_fail(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_get_by_id_generic(STUB_ARGS_DECLARATION); + EncodedJSValue JIT_STUB cti_op_get_by_id_method_check(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_get_by_id_proto_fail(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_get_by_id_proto_list(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_get_by_id_proto_list_full(STUB_ARGS_DECLARATION); - EncodedJSValue JIT_STUB cti_op_get_by_id_second(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_get_by_id_self_fail(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_get_by_id_string_fail(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_get_by_val(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_get_by_val_byte_array(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_get_by_val_string(STUB_ARGS_DECLARATION); - EncodedJSValue JIT_STUB cti_op_put_by_id_transition_realloc(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_in(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_instanceof(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_is_boolean(STUB_ARGS_DECLARATION); @@ -307,16 +285,18 @@ namespace JITStubs { extern "C" { EncodedJSValue JIT_STUB cti_op_mod(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_mul(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_negate(STUB_ARGS_DECLARATION); - EncodedJSValue JIT_STUB cti_op_neq(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_next_pname(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_not(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_nstricteq(STUB_ARGS_DECLARATION); + EncodedJSValue JIT_STUB cti_op_post_dec(STUB_ARGS_DECLARATION); + EncodedJSValue JIT_STUB cti_op_post_inc(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_pre_dec(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_pre_inc(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_resolve(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_resolve_base(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_resolve_global(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_resolve_skip(STUB_ARGS_DECLARATION); + EncodedJSValue JIT_STUB cti_op_resolve_with_base(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_rshift(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_strcat(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_stricteq(STUB_ARGS_DECLARATION); @@ -327,13 +307,58 @@ namespace JITStubs { extern "C" { EncodedJSValue JIT_STUB cti_op_typeof(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_op_urshift(STUB_ARGS_DECLARATION); EncodedJSValue JIT_STUB cti_vm_throw(STUB_ARGS_DECLARATION); - EncodedJSValue JIT_STUB cti_op_post_dec(STUB_ARGS_DECLARATION); - EncodedJSValue JIT_STUB cti_op_post_inc(STUB_ARGS_DECLARATION); - EncodedJSValue JIT_STUB cti_op_resolve_func(STUB_ARGS_DECLARATION); - EncodedJSValue JIT_STUB cti_op_resolve_with_base(STUB_ARGS_DECLARATION); + JSObject* JIT_STUB cti_op_construct_JSConstruct(STUB_ARGS_DECLARATION); + JSObject* JIT_STUB cti_op_new_array(STUB_ARGS_DECLARATION); + JSObject* JIT_STUB cti_op_new_error(STUB_ARGS_DECLARATION); + JSObject* JIT_STUB cti_op_new_func(STUB_ARGS_DECLARATION); + JSObject* JIT_STUB cti_op_new_func_exp(STUB_ARGS_DECLARATION); + JSObject* JIT_STUB cti_op_new_object(STUB_ARGS_DECLARATION); + JSObject* JIT_STUB cti_op_new_regexp(STUB_ARGS_DECLARATION); + JSObject* JIT_STUB cti_op_push_activation(STUB_ARGS_DECLARATION); + JSObject* JIT_STUB cti_op_push_new_scope(STUB_ARGS_DECLARATION); + JSObject* JIT_STUB cti_op_push_scope(STUB_ARGS_DECLARATION); + JSObject* JIT_STUB cti_op_put_by_id_transition_realloc(STUB_ARGS_DECLARATION); + JSPropertyNameIterator* JIT_STUB cti_op_get_pnames(STUB_ARGS_DECLARATION); VoidPtrPair JIT_STUB cti_op_call_arityCheck(STUB_ARGS_DECLARATION); - -}; } // extern "C" namespace JITStubs + int JIT_STUB cti_op_eq(STUB_ARGS_DECLARATION); +#if USE(JSVALUE32_64) + int JIT_STUB cti_op_eq_strings(STUB_ARGS_DECLARATION); +#endif + int JIT_STUB cti_op_jless(STUB_ARGS_DECLARATION); + int JIT_STUB cti_op_jlesseq(STUB_ARGS_DECLARATION); + int JIT_STUB cti_op_jtrue(STUB_ARGS_DECLARATION); + int JIT_STUB cti_op_load_varargs(STUB_ARGS_DECLARATION); + int JIT_STUB cti_op_loop_if_less(STUB_ARGS_DECLARATION); + int JIT_STUB cti_op_loop_if_lesseq(STUB_ARGS_DECLARATION); + int JIT_STUB cti_op_loop_if_true(STUB_ARGS_DECLARATION); + int JIT_STUB cti_timeout_check(STUB_ARGS_DECLARATION); + void JIT_STUB cti_op_create_arguments(STUB_ARGS_DECLARATION); + void JIT_STUB cti_op_create_arguments_no_params(STUB_ARGS_DECLARATION); + void JIT_STUB cti_op_debug(STUB_ARGS_DECLARATION); + void JIT_STUB cti_op_end(STUB_ARGS_DECLARATION); + void JIT_STUB cti_op_jmp_scopes(STUB_ARGS_DECLARATION); + void JIT_STUB cti_op_pop_scope(STUB_ARGS_DECLARATION); + void JIT_STUB cti_op_profile_did_call(STUB_ARGS_DECLARATION); + void JIT_STUB cti_op_profile_will_call(STUB_ARGS_DECLARATION); + void JIT_STUB cti_op_put_by_id(STUB_ARGS_DECLARATION); + void JIT_STUB cti_op_put_by_id_fail(STUB_ARGS_DECLARATION); + void JIT_STUB cti_op_put_by_id_generic(STUB_ARGS_DECLARATION); + void JIT_STUB cti_op_put_by_index(STUB_ARGS_DECLARATION); + void JIT_STUB cti_op_put_by_val(STUB_ARGS_DECLARATION); + void JIT_STUB cti_op_put_by_val_array(STUB_ARGS_DECLARATION); + void JIT_STUB cti_op_put_by_val_byte_array(STUB_ARGS_DECLARATION); + void JIT_STUB cti_op_put_getter(STUB_ARGS_DECLARATION); + void JIT_STUB cti_op_put_setter(STUB_ARGS_DECLARATION); + void JIT_STUB cti_op_ret_scopeChain(STUB_ARGS_DECLARATION); + void JIT_STUB cti_op_tear_off_activation(STUB_ARGS_DECLARATION); + void JIT_STUB cti_op_tear_off_arguments(STUB_ARGS_DECLARATION); + void JIT_STUB cti_register_file_check(STUB_ARGS_DECLARATION); + void* JIT_STUB cti_op_call_JSFunction(STUB_ARGS_DECLARATION); + void* JIT_STUB cti_op_switch_char(STUB_ARGS_DECLARATION); + void* JIT_STUB cti_op_switch_imm(STUB_ARGS_DECLARATION); + void* JIT_STUB cti_op_switch_string(STUB_ARGS_DECLARATION); + void* JIT_STUB cti_vm_lazyLinkCall(STUB_ARGS_DECLARATION); +} // extern "C" } // namespace JSC diff --git a/JavaScriptCore/jsc.cpp b/JavaScriptCore/jsc.cpp index 21a8c18..92b1e58 100644 --- a/JavaScriptCore/jsc.cpp +++ b/JavaScriptCore/jsc.cpp @@ -48,11 +48,11 @@ #include <sys/time.h> #endif -#if PLATFORM(UNIX) +#if HAVE(SIGNAL_H) #include <signal.h> #endif -#if COMPILER(MSVC) && !PLATFORM(WIN_CE) +#if COMPILER(MSVC) && !PLATFORM(WINCE) #include <crtdbg.h> #include <windows.h> #include <mmsystem.h> @@ -75,6 +75,7 @@ static JSValue JSC_HOST_CALL functionGC(ExecState*, JSObject*, JSValue, const Ar static JSValue JSC_HOST_CALL functionVersion(ExecState*, JSObject*, JSValue, const ArgList&); static JSValue JSC_HOST_CALL functionRun(ExecState*, JSObject*, JSValue, const ArgList&); static JSValue JSC_HOST_CALL functionLoad(ExecState*, JSObject*, JSValue, const ArgList&); +static JSValue JSC_HOST_CALL functionCheckSyntax(ExecState*, JSObject*, JSValue, const ArgList&); static JSValue JSC_HOST_CALL functionReadline(ExecState*, JSObject*, JSValue, const ArgList&); static NO_RETURN JSValue JSC_HOST_CALL functionQuit(ExecState*, JSObject*, JSValue, const ArgList&); @@ -184,6 +185,7 @@ GlobalObject::GlobalObject(const Vector<UString>& arguments) putDirectFunction(globalExec(), new (globalExec()) NativeFunctionWrapper(globalExec(), prototypeFunctionStructure(), 1, Identifier(globalExec(), "version"), functionVersion)); putDirectFunction(globalExec(), new (globalExec()) NativeFunctionWrapper(globalExec(), prototypeFunctionStructure(), 1, Identifier(globalExec(), "run"), functionRun)); putDirectFunction(globalExec(), new (globalExec()) NativeFunctionWrapper(globalExec(), prototypeFunctionStructure(), 1, Identifier(globalExec(), "load"), functionLoad)); + putDirectFunction(globalExec(), new (globalExec()) NativeFunctionWrapper(globalExec(), prototypeFunctionStructure(), 1, Identifier(globalExec(), "checkSyntax"), functionCheckSyntax)); putDirectFunction(globalExec(), new (globalExec()) NativeFunctionWrapper(globalExec(), prototypeFunctionStructure(), 0, Identifier(globalExec(), "readline"), functionReadline)); #if ENABLE(SAMPLING_FLAGS) @@ -219,7 +221,7 @@ JSValue JSC_HOST_CALL functionDebug(ExecState* exec, JSObject*, JSValue, const A JSValue JSC_HOST_CALL functionGC(ExecState* exec, JSObject*, JSValue, const ArgList&) { - JSLock lock(false); + JSLock lock(SilenceAssertionsOnly); exec->heap()->collect(); return jsUndefined(); } @@ -264,6 +266,22 @@ JSValue JSC_HOST_CALL functionLoad(ExecState* exec, JSObject* o, JSValue v, cons return result.value(); } +JSValue JSC_HOST_CALL functionCheckSyntax(ExecState* exec, JSObject* o, JSValue v, const ArgList& args) +{ + UNUSED_PARAM(o); + UNUSED_PARAM(v); + UString fileName = args.at(0).toString(exec); + Vector<char> script; + if (!fillBufferWithContentsOfFile(fileName, script)) + return throwError(exec, GeneralError, "Could not open file."); + + JSGlobalObject* globalObject = exec->lexicalGlobalObject(); + Completion result = checkSyntax(globalObject->globalExec(), makeSource(script.data(), fileName)); + if (result.complType() == Throw) + exec->setException(result.value()); + return result.value(); +} + #if ENABLE(SAMPLING_FLAGS) JSValue JSC_HOST_CALL functionSetSamplingFlags(ExecState* exec, JSObject*, JSValue, const ArgList& args) { @@ -332,7 +350,7 @@ int main(int argc, char** argv) _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE); #endif -#if COMPILER(MSVC) && !PLATFORM(WIN_CE) +#if COMPILER(MSVC) && !PLATFORM(WINCE) timeBeginPeriod(1); #endif @@ -357,7 +375,7 @@ int main(int argc, char** argv) static void cleanupGlobalData(JSGlobalData* globalData) { - JSLock lock(false); + JSLock lock(SilenceAssertionsOnly); globalData->heap.destroy(); globalData->deref(); } @@ -425,14 +443,12 @@ static bool runWithScripts(GlobalObject* globalObject, const Vector<Script>& scr return success; } -static -#if !HAVE(READLINE) -NO_RETURN -#endif -void runInteractive(GlobalObject* globalObject) +#define RUNNING_FROM_XCODE 0 + +static void runInteractive(GlobalObject* globalObject) { while (true) { -#if HAVE(READLINE) +#if HAVE(READLINE) && !RUNNING_FROM_XCODE char* line = readline(interactivePrompt); if (!line) break; @@ -441,7 +457,7 @@ void runInteractive(GlobalObject* globalObject) Completion completion = evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), makeSource(line, interpreterName)); free(line); #else - puts(interactivePrompt); + printf("%s", interactivePrompt); Vector<char, 256> line; int c; while ((c = getchar()) != EOF) { @@ -450,6 +466,8 @@ void runInteractive(GlobalObject* globalObject) break; line.append(c); } + if (line.isEmpty()) + break; line.append('\0'); Completion completion = evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), makeSource(line.data(), interpreterName)); #endif @@ -471,7 +489,9 @@ static NO_RETURN void printUsageStatement(JSGlobalData* globalData, bool help = fprintf(stderr, " -f Specifies a source file (deprecated)\n"); fprintf(stderr, " -h|--help Prints this help message\n"); fprintf(stderr, " -i Enables interactive mode (default if no files are specified)\n"); +#if HAVE(SIGNAL_H) fprintf(stderr, " -s Installs signal handlers that exit on a crash (Unix platforms only)\n"); +#endif cleanupGlobalData(globalData); exit(help ? EXIT_SUCCESS : EXIT_FAILURE); @@ -506,7 +526,7 @@ static void parseArguments(int argc, char** argv, Options& options, JSGlobalData continue; } if (strcmp(arg, "-s") == 0) { -#if PLATFORM(UNIX) +#if HAVE(SIGNAL_H) signal(SIGILL, _exit); signal(SIGFPE, _exit); signal(SIGBUS, _exit); @@ -530,7 +550,7 @@ static void parseArguments(int argc, char** argv, Options& options, JSGlobalData int jscmain(int argc, char** argv, JSGlobalData* globalData) { - JSLock lock(false); + JSLock lock(SilenceAssertionsOnly); Options options; parseArguments(argc, argv, options, globalData); diff --git a/JavaScriptCore/jsc.pro b/JavaScriptCore/jsc.pro index 35c9e63..ba880ff 100644 --- a/JavaScriptCore/jsc.pro +++ b/JavaScriptCore/jsc.pro @@ -5,6 +5,8 @@ SOURCES = jsc.cpp QT -= gui CONFIG -= app_bundle CONFIG += building-libs +win32-*: CONFIG += console +win32-msvc*: CONFIG += exceptions_off stl_off include($$PWD/../WebKit.pri) @@ -13,7 +15,6 @@ CONFIG += link_pkgconfig QMAKE_RPATHDIR += $$OUTPUT_DIR/lib isEmpty(OUTPUT_DIR):OUTPUT_DIR=$$PWD/.. -include($$OUTPUT_DIR/config.pri) CONFIG(debug, debug|release) { OBJECTS_DIR = obj/debug } else { # Release diff --git a/JavaScriptCore/parser/Grammar.y b/JavaScriptCore/parser/Grammar.y index 52dddde..354c786 100644 --- a/JavaScriptCore/parser/Grammar.y +++ b/JavaScriptCore/parser/Grammar.y @@ -36,8 +36,12 @@ #include "CommonIdentifiers.h" #include "NodeInfo.h" #include "Parser.h" +#include <wtf/FastMalloc.h> #include <wtf/MathExtras.h> +#define YYMALLOC fastMalloc +#define YYFREE fastFree + #define YYMAXDEPTH 10000 #define YYENABLE_NLS 0 @@ -80,7 +84,7 @@ static ExpressionNode* makeSubNode(void*, ExpressionNode*, ExpressionNode*, bool static ExpressionNode* makeLeftShiftNode(void*, ExpressionNode*, ExpressionNode*, bool rightHasAssignments); static ExpressionNode* makeRightShiftNode(void*, ExpressionNode*, ExpressionNode*, bool rightHasAssignments); static StatementNode* makeVarStatementNode(void*, ExpressionNode*); -static ExpressionNode* combineVarInitializers(void*, ExpressionNode* list, AssignResolveNode* init); +static ExpressionNode* combineCommaNodes(void*, ExpressionNode* list, ExpressionNode* init); #if COMPILER(MSVC) @@ -88,12 +92,6 @@ static ExpressionNode* combineVarInitializers(void*, ExpressionNode* list, Assig #pragma warning(disable: 4244) #pragma warning(disable: 4702) -// At least some of the time, the declarations of malloc and free that bison -// generates are causing warnings. A way to avoid this is to explicitly define -// the macros so that bison doesn't try to declare malloc and free. -#define YYMALLOC malloc -#define YYFREE free - #endif #define YYPARSE_PARAM globalPtr @@ -778,17 +776,17 @@ AssignmentOperator: Expr: AssignmentExpr - | Expr ',' AssignmentExpr { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) CommaNode(GLOBAL_DATA, $1.m_node, $3.m_node), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); } + | Expr ',' AssignmentExpr { $$ = createNodeInfo<ExpressionNode*>(combineCommaNodes(GLOBAL_DATA, $1.m_node, $3.m_node), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); } ; ExprNoIn: AssignmentExprNoIn - | ExprNoIn ',' AssignmentExprNoIn { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) CommaNode(GLOBAL_DATA, $1.m_node, $3.m_node), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); } + | ExprNoIn ',' AssignmentExprNoIn { $$ = createNodeInfo<ExpressionNode*>(combineCommaNodes(GLOBAL_DATA, $1.m_node, $3.m_node), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); } ; ExprNoBF: AssignmentExprNoBF - | ExprNoBF ',' AssignmentExpr { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) CommaNode(GLOBAL_DATA, $1.m_node, $3.m_node), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); } + | ExprNoBF ',' AssignmentExpr { $$ = createNodeInfo<ExpressionNode*>(combineCommaNodes(GLOBAL_DATA, $1.m_node, $3.m_node), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); } ; Statement: @@ -854,7 +852,7 @@ VariableDeclarationList: | VariableDeclarationList ',' IDENT Initializer { AssignResolveNode* node = new (GLOBAL_DATA) AssignResolveNode(GLOBAL_DATA, *$3, $4.m_node, $4.m_features & AssignFeature); SET_EXCEPTION_LOCATION(node, @3.first_column, @4.first_column + 1, @4.last_column); - $$.m_node = combineVarInitializers(GLOBAL_DATA, $1.m_node, node); + $$.m_node = combineCommaNodes(GLOBAL_DATA, $1.m_node, node); $$.m_varDeclarations = $1.m_varDeclarations; appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, *$3, DeclarationStacks::HasInitializer); $$.m_funcDeclarations = 0; @@ -891,7 +889,7 @@ VariableDeclarationListNoIn: | VariableDeclarationListNoIn ',' IDENT InitializerNoIn { AssignResolveNode* node = new (GLOBAL_DATA) AssignResolveNode(GLOBAL_DATA, *$3, $4.m_node, $4.m_features & AssignFeature); SET_EXCEPTION_LOCATION(node, @3.first_column, @4.first_column + 1, @4.last_column); - $$.m_node = combineVarInitializers(GLOBAL_DATA, $1.m_node, node); + $$.m_node = combineCommaNodes(GLOBAL_DATA, $1.m_node, node); $$.m_varDeclarations = $1.m_varDeclarations; appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, *$3, DeclarationStacks::HasInitializer); $$.m_funcDeclarations = 0; @@ -2071,10 +2069,14 @@ static bool allowAutomaticSemicolon(Lexer& lexer, int yychar) return yychar == CLOSEBRACE || yychar == 0 || lexer.prevTerminator(); } -static ExpressionNode* combineVarInitializers(void* globalPtr, ExpressionNode* list, AssignResolveNode* init) +static ExpressionNode* combineCommaNodes(void* globalPtr, ExpressionNode* list, ExpressionNode* init) { if (!list) return init; + if (list->isCommaNode()) { + static_cast<CommaNode*>(list)->append(init); + return list; + } return new (GLOBAL_DATA) CommaNode(GLOBAL_DATA, list, init); } diff --git a/JavaScriptCore/parser/Lexer.h b/JavaScriptCore/parser/Lexer.h index 9c22a9c..2583162 100644 --- a/JavaScriptCore/parser/Lexer.h +++ b/JavaScriptCore/parser/Lexer.h @@ -23,9 +23,9 @@ #define Lexer_h #include "Lookup.h" -#include "SegmentedVector.h" #include "SourceCode.h" #include <wtf/ASCIICType.h> +#include <wtf/SegmentedVector.h> #include <wtf/Vector.h> #include <wtf/unicode/Unicode.h> @@ -33,7 +33,7 @@ namespace JSC { class RegExp; - class Lexer : Noncopyable { + class Lexer : public Noncopyable { public: // Character manipulation functions. static bool isWhiteSpace(int character); @@ -108,7 +108,7 @@ namespace JSC { int m_next2; int m_next3; - SegmentedVector<JSC::Identifier, initialIdentifierTableCapacity> m_identifiers; + WTF::SegmentedVector<JSC::Identifier, initialIdentifierTableCapacity> m_identifiers; JSGlobalData* m_globalData; diff --git a/JavaScriptCore/parser/NodeConstructors.h b/JavaScriptCore/parser/NodeConstructors.h index ea1579b..780a624 100644 --- a/JavaScriptCore/parser/NodeConstructors.h +++ b/JavaScriptCore/parser/NodeConstructors.h @@ -39,6 +39,11 @@ namespace JSC { return fastMalloc(size); } + inline void ParserArenaDeletable::operator delete(void* p) + { + fastFree(p); + } + inline ParserArenaRefCounted::ParserArenaRefCounted(JSGlobalData* globalData) { globalData->parser->arena().derefWithArena(adoptRef(this)); @@ -659,9 +664,9 @@ namespace JSC { inline CommaNode::CommaNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2) : ExpressionNode(globalData) - , m_expr1(expr1) - , m_expr2(expr2) { + m_expressions.append(expr1); + m_expressions.append(expr2); } inline ConstStatementNode::ConstStatementNode(JSGlobalData* globalData, ConstDeclNode* next) diff --git a/JavaScriptCore/parser/Nodes.cpp b/JavaScriptCore/parser/Nodes.cpp index 4ddf13a..4324a06 100644 --- a/JavaScriptCore/parser/Nodes.cpp +++ b/JavaScriptCore/parser/Nodes.cpp @@ -355,7 +355,7 @@ RegisterID* FunctionCallResolveNode::emitBytecode(BytecodeGenerator& generator, RefPtr<RegisterID> thisRegister = generator.newTemporary(); int identifierStart = divot() - startOffset(); generator.emitExpressionInfo(identifierStart + m_ident.size(), m_ident.size(), 0); - generator.emitResolveFunction(thisRegister.get(), func.get(), m_ident); + generator.emitResolveWithBase(thisRegister.get(), func.get(), m_ident); return generator.emitCall(generator.finalDestination(dst, func.get()), func.get(), thisRegister.get(), m_args, divot(), startOffset(), endOffset()); } @@ -375,11 +375,12 @@ RegisterID* FunctionCallBracketNode::emitBytecode(BytecodeGenerator& generator, RegisterID* FunctionCallDotNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) { - RefPtr<RegisterID> base = generator.emitNode(m_base); + RefPtr<RegisterID> function = generator.tempDestination(dst); + RefPtr<RegisterID> thisRegister = generator.newTemporary(); + generator.emitNode(thisRegister.get(), m_base); generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffset() - m_subexpressionDivotOffset, m_subexpressionEndOffset); generator.emitMethodCheck(); - RefPtr<RegisterID> function = generator.emitGetById(generator.tempDestination(dst), base.get(), m_ident); - RefPtr<RegisterID> thisRegister = generator.emitMove(generator.newTemporary(), base.get()); + generator.emitGetById(function.get(), thisRegister.get(), m_ident); return generator.emitCall(generator.finalDestination(dst, function.get()), function.get(), thisRegister.get(), m_args, divot(), startOffset(), endOffset()); } @@ -495,6 +496,8 @@ static RegisterID* emitPreIncOrDec(BytecodeGenerator& generator, RegisterID* src static RegisterID* emitPostIncOrDec(BytecodeGenerator& generator, RegisterID* dst, RegisterID* srcDst, Operator oper) { + if (srcDst == dst) + return generator.emitToJSNumber(dst, srcDst); return (oper == OpPlusPlus) ? generator.emitPostInc(dst, srcDst) : generator.emitPostDec(dst, srcDst); } @@ -601,7 +604,7 @@ RegisterID* PostfixErrorNode::emitBytecode(BytecodeGenerator& generator, Registe RegisterID* DeleteResolveNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) { if (generator.registerFor(m_ident)) - return generator.emitUnexpectedLoad(generator.finalDestination(dst), false); + return generator.emitLoad(generator.finalDestination(dst), false); generator.emitExpressionInfo(divot(), startOffset(), endOffset()); RegisterID* base = generator.emitResolveBase(generator.tempDestination(dst), m_ident); @@ -636,7 +639,7 @@ RegisterID* DeleteValueNode::emitBytecode(BytecodeGenerator& generator, Register generator.emitNode(generator.ignoredResult(), m_expr); // delete on a non-location expression ignores the value and returns true - return generator.emitUnexpectedLoad(generator.finalDestination(dst), true); + return generator.emitLoad(generator.finalDestination(dst), true); } // ------------------------------ VoidNode ------------------------------------- @@ -688,7 +691,7 @@ RegisterID* PrefixResolveNode::emitBytecode(BytecodeGenerator& generator, Regist if (generator.isLocalConstant(m_ident)) { if (dst == generator.ignoredResult()) return 0; - RefPtr<RegisterID> r0 = generator.emitUnexpectedLoad(generator.finalDestination(dst), (m_operator == OpPlusPlus) ? 1.0 : -1.0); + RefPtr<RegisterID> r0 = generator.emitLoad(generator.finalDestination(dst), (m_operator == OpPlusPlus) ? 1.0 : -1.0); return generator.emitBinaryOp(op_add, r0.get(), local, r0.get(), OperandTypes()); } @@ -1186,8 +1189,10 @@ RegisterID* ReadModifyBracketNode::emitBytecode(BytecodeGenerator& generator, Re RegisterID* CommaNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) { - generator.emitNode(generator.ignoredResult(), m_expr1); - return generator.emitNode(dst, m_expr2); + ASSERT(m_expressions.size() > 1); + for (size_t i = 0; i < m_expressions.size() - 1; i++) + generator.emitNode(generator.ignoredResult(), m_expressions[i]); + return generator.emitNode(dst, m_expressions.last()); } // ------------------------------ ConstDeclNode ------------------------------------ @@ -1369,9 +1374,6 @@ RegisterID* WhileNode::emitBytecode(BytecodeGenerator& generator, RegisterID* ds RegisterID* ForNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) { - if (dst == generator.ignoredResult()) - dst = 0; - RefPtr<LabelScope> scope = generator.newLabelScope(LabelScope::Loop); generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); @@ -1559,13 +1561,11 @@ static void processClauseList(ClauseListNode* list, Vector<ExpressionNode*, 8>& literalVector.append(clauseExpression); if (clauseExpression->isNumber()) { double value = static_cast<NumberNode*>(clauseExpression)->value(); - JSValue jsValue = JSValue::makeInt32Fast(static_cast<int32_t>(value)); - if ((typeForTable & ~SwitchNumber) || !jsValue || (jsValue.getInt32Fast() != value)) { + int32_t intVal = static_cast<int32_t>(value); + if ((typeForTable & ~SwitchNumber) || (intVal != value)) { typeForTable = SwitchNeither; break; } - int32_t intVal = static_cast<int32_t>(value); - ASSERT(intVal == value); if (intVal < min_num) min_num = intVal; if (intVal > max_num) @@ -1736,10 +1736,12 @@ RegisterID* ThrowNode::emitBytecode(BytecodeGenerator& generator, RegisterID* ds RegisterID* TryNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) { + // NOTE: The catch and finally blocks must be labeled explicitly, so the + // optimizer knows they may be jumped to from anywhere. + generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); RefPtr<Label> tryStartLabel = generator.newLabel(); - RefPtr<Label> tryEndLabel = generator.newLabel(); RefPtr<Label> finallyStart; RefPtr<RegisterID> finallyReturnAddr; if (m_finallyBlock) { @@ -1747,14 +1749,19 @@ RegisterID* TryNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) finallyReturnAddr = generator.newTemporary(); generator.pushFinallyContext(finallyStart.get(), finallyReturnAddr.get()); } + generator.emitLabel(tryStartLabel.get()); generator.emitNode(dst, m_tryBlock); - generator.emitLabel(tryEndLabel.get()); if (m_catchBlock) { - RefPtr<Label> handlerEndLabel = generator.newLabel(); - generator.emitJump(handlerEndLabel.get()); - RefPtr<RegisterID> exceptionRegister = generator.emitCatch(generator.newTemporary(), tryStartLabel.get(), tryEndLabel.get()); + RefPtr<Label> catchEndLabel = generator.newLabel(); + + // Normal path: jump over the catch block. + generator.emitJump(catchEndLabel.get()); + + // Uncaught exception path: the catch block. + RefPtr<Label> here = generator.emitLabel(generator.newLabel().get()); + RefPtr<RegisterID> exceptionRegister = generator.emitCatch(generator.newTemporary(), tryStartLabel.get(), here.get()); if (m_catchHasEval) { RefPtr<RegisterID> dynamicScopeObject = generator.emitNewObject(generator.newTemporary()); generator.emitPutById(dynamicScopeObject.get(), m_exceptionIdent, exceptionRegister.get()); @@ -1764,7 +1771,7 @@ RegisterID* TryNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) generator.emitPushNewScope(exceptionRegister.get(), m_exceptionIdent, exceptionRegister.get()); generator.emitNode(dst, m_catchBlock); generator.emitPopScope(); - generator.emitLabel(handlerEndLabel.get()); + generator.emitLabel(catchEndLabel.get()); } if (m_finallyBlock) { @@ -1775,21 +1782,18 @@ RegisterID* TryNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) // approach to not clobbering anything important RefPtr<RegisterID> highestUsedRegister = generator.highestUsedRegister(); RefPtr<Label> finallyEndLabel = generator.newLabel(); + + // Normal path: invoke the finally block, then jump over it. generator.emitJumpSubroutine(finallyReturnAddr.get(), finallyStart.get()); - // Use a label to record the subtle fact that sret will return to the - // next instruction. sret is the only way to jump without an explicit label. - generator.emitLabel(generator.newLabel().get()); generator.emitJump(finallyEndLabel.get()); - // Finally block for exception path - RefPtr<RegisterID> tempExceptionRegister = generator.emitCatch(generator.newTemporary(), tryStartLabel.get(), generator.emitLabel(generator.newLabel().get()).get()); + // Uncaught exception path: invoke the finally block, then re-throw the exception. + RefPtr<Label> here = generator.emitLabel(generator.newLabel().get()); + RefPtr<RegisterID> tempExceptionRegister = generator.emitCatch(generator.newTemporary(), tryStartLabel.get(), here.get()); generator.emitJumpSubroutine(finallyReturnAddr.get(), finallyStart.get()); - // Use a label to record the subtle fact that sret will return to the - // next instruction. sret is the only way to jump without an explicit label. - generator.emitLabel(generator.newLabel().get()); generator.emitThrow(tempExceptionRegister.get()); - // emit the finally block itself + // The finally block. generator.emitLabel(finallyStart.get()); generator.emitNode(dst, m_finallyBlock); generator.emitSubroutineReturn(finallyReturnAddr.get()); @@ -1814,14 +1818,14 @@ ScopeNodeData::ScopeNodeData(ParserArena& arena, SourceElements* children, VarSt children->releaseContentsIntoVector(m_children); } -void ScopeNodeData::mark() +void ScopeNodeData::markAggregate(MarkStack& markStack) { FunctionStack::iterator end = m_functionStack.end(); for (FunctionStack::iterator ptr = m_functionStack.begin(); ptr != end; ++ptr) { FunctionBodyNode* body = (*ptr)->body(); if (!body->isGenerated()) continue; - body->generatedBytecode().mark(); + body->generatedBytecode().markAggregate(markStack); } } @@ -1889,8 +1893,8 @@ void ProgramNode::generateBytecode(ScopeChainNode* scopeChainNode) m_code.set(new ProgramCodeBlock(this, GlobalCode, globalObject, source().provider())); - BytecodeGenerator generator(this, globalObject->debugger(), scopeChain, &globalObject->symbolTable(), m_code.get()); - generator.generate(); + OwnPtr<BytecodeGenerator> generator(new BytecodeGenerator(this, globalObject->debugger(), scopeChain, &globalObject->symbolTable(), m_code.get())); + generator->generate(); destroyData(); } @@ -1944,8 +1948,8 @@ void EvalNode::generateBytecode(ScopeChainNode* scopeChainNode) m_code.set(new EvalCodeBlock(this, globalObject, source().provider(), scopeChain.localDepth())); - BytecodeGenerator generator(this, globalObject->debugger(), scopeChain, &m_code->symbolTable(), m_code.get()); - generator.generate(); + OwnPtr<BytecodeGenerator> generator(new BytecodeGenerator(this, globalObject->debugger(), scopeChain, &m_code->symbolTable(), m_code.get())); + generator->generate(); // Eval code needs to hang on to its declaration stacks to keep declaration info alive until Interpreter::execute time, // so the entire ScopeNodeData cannot be destoyed. @@ -1961,17 +1965,17 @@ EvalCodeBlock& EvalNode::bytecodeForExceptionInfoReparse(ScopeChainNode* scopeCh m_code.set(new EvalCodeBlock(this, globalObject, source().provider(), scopeChain.localDepth())); - BytecodeGenerator generator(this, globalObject->debugger(), scopeChain, &m_code->symbolTable(), m_code.get()); - generator.setRegeneratingForExceptionInfo(codeBlockBeingRegeneratedFrom); - generator.generate(); + OwnPtr<BytecodeGenerator> generator(new BytecodeGenerator(this, globalObject->debugger(), scopeChain, &m_code->symbolTable(), m_code.get())); + generator->setRegeneratingForExceptionInfo(codeBlockBeingRegeneratedFrom); + generator->generate(); return *m_code; } -void EvalNode::mark() +void EvalNode::markAggregate(MarkStack& markStack) { // We don't need to mark our own CodeBlock as the JSGlobalObject takes care of that - data()->mark(); + data()->markAggregate(markStack); } #if ENABLE(JIT) @@ -2026,10 +2030,10 @@ void FunctionBodyNode::finishParsing(Identifier* parameters, size_t parameterCou m_parameterCount = parameterCount; } -void FunctionBodyNode::mark() +void FunctionBodyNode::markAggregate(MarkStack& markStack) { if (m_code) - m_code->mark(); + m_code->markAggregate(markStack); } #if ENABLE(JIT) @@ -2037,11 +2041,17 @@ PassRefPtr<FunctionBodyNode> FunctionBodyNode::createNativeThunk(JSGlobalData* g { RefPtr<FunctionBodyNode> body = new FunctionBodyNode(globalData); globalData->parser->arena().reset(); + body->m_code.set(new CodeBlock(body.get())); body->m_jitCode = JITCode(JITCode::HostFunction(globalData->jitStubs.ctiNativeCallThunk())); return body.release(); } #endif +bool FunctionBodyNode::isHostFunction() const +{ + return m_code && m_code->codeType() == NativeCode; +} + FunctionBodyNode* FunctionBodyNode::create(JSGlobalData* globalData) { return new FunctionBodyNode(globalData); @@ -2071,8 +2081,8 @@ void FunctionBodyNode::generateBytecode(ScopeChainNode* scopeChainNode) m_code.set(new CodeBlock(this, FunctionCode, source().provider(), source().startOffset())); - BytecodeGenerator generator(this, globalObject->debugger(), scopeChain, &m_code->symbolTable(), m_code.get()); - generator.generate(); + OwnPtr<BytecodeGenerator> generator(new BytecodeGenerator(this, globalObject->debugger(), scopeChain, &m_code->symbolTable(), m_code.get())); + generator->generate(); destroyData(); } @@ -2097,9 +2107,9 @@ CodeBlock& FunctionBodyNode::bytecodeForExceptionInfoReparse(ScopeChainNode* sco m_code.set(new CodeBlock(this, FunctionCode, source().provider(), source().startOffset())); - BytecodeGenerator generator(this, globalObject->debugger(), scopeChain, &m_code->symbolTable(), m_code.get()); - generator.setRegeneratingForExceptionInfo(codeBlockBeingRegeneratedFrom); - generator.generate(); + OwnPtr<BytecodeGenerator> generator(new BytecodeGenerator(this, globalObject->debugger(), scopeChain, &m_code->symbolTable(), m_code.get())); + generator->setRegeneratingForExceptionInfo(codeBlockBeingRegeneratedFrom); + generator->generate(); return *m_code; } diff --git a/JavaScriptCore/parser/Nodes.h b/JavaScriptCore/parser/Nodes.h index cda1ee4..703b384 100644 --- a/JavaScriptCore/parser/Nodes.h +++ b/JavaScriptCore/parser/Nodes.h @@ -109,9 +109,11 @@ namespace JSC { // Objects created with this version of new are not deleted when the arena is deleted. // Other arrangements must be made. void* operator new(size_t); + + void operator delete(void*); }; - class ParserArenaRefCounted : public RefCounted<ParserArenaRefCounted> { + class ParserArenaRefCounted : public RefCountedCustomAllocated<ParserArenaRefCounted> { protected: ParserArenaRefCounted(JSGlobalData*); @@ -169,7 +171,8 @@ namespace JSC { virtual bool isResolveNode() const { return false; } virtual bool isBracketAccessorNode() const { return false; } virtual bool isDotAccessorNode() const { return false; } - virtual bool isFuncExprNode() const { return false; } + virtual bool isFuncExprNode() const { return false; } + virtual bool isCommaNode() const { return false; } virtual bool isSimpleArray() const { return false; } virtual bool isAdd() const { return false; } @@ -1087,16 +1090,20 @@ namespace JSC { Operator m_operator; ExpressionNode* m_right; }; + + typedef Vector<ExpressionNode*, 8> ExpressionVector; class CommaNode : public ExpressionNode { public: CommaNode(JSGlobalData*, ExpressionNode* expr1, ExpressionNode* expr2); + void append(ExpressionNode* expr) { m_expressions.append(expr); } + private: + virtual bool isCommaNode() const { return true; } virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0); - ExpressionNode* m_expr1; - ExpressionNode* m_expr2; + ExpressionVector m_expressions; }; class ConstDeclNode : public ExpressionNode { @@ -1371,7 +1378,7 @@ namespace JSC { ParameterNode* m_next; }; - struct ScopeNodeData { + struct ScopeNodeData : FastAllocBase { typedef DeclarationStacks::VarStack VarStack; typedef DeclarationStacks::FunctionStack FunctionStack; @@ -1383,7 +1390,7 @@ namespace JSC { int m_numConstants; StatementVector m_children; - void mark(); + void markAggregate(MarkStack&); }; class ScopeNode : public StatementNode, public ParserArenaRefCounted { @@ -1429,7 +1436,7 @@ namespace JSC { return m_data->m_numConstants + 2; } - virtual void mark() { } + virtual void markAggregate(MarkStack&) { } #if ENABLE(JIT) JITCode& generatedJITCode() @@ -1508,7 +1515,7 @@ namespace JSC { EvalCodeBlock& bytecodeForExceptionInfoReparse(ScopeChainNode*, CodeBlock*); - virtual void mark(); + virtual void markAggregate(MarkStack&); #if ENABLE(JIT) JITCode& jitCode(ScopeChainNode* scopeChain) @@ -1554,16 +1561,9 @@ namespace JSC { return m_code; } - bool isHostFunction() const - { -#if ENABLE(JIT) - return !!m_jitCode && !m_code; -#else - return true; -#endif - } + bool isHostFunction() const; - virtual void mark(); + virtual void markAggregate(MarkStack&); void finishParsing(const SourceCode&, ParameterNode*); void finishParsing(Identifier* parameters, size_t parameterCount); diff --git a/JavaScriptCore/parser/Parser.h b/JavaScriptCore/parser/Parser.h index 6f4c2b7..373dc00 100644 --- a/JavaScriptCore/parser/Parser.h +++ b/JavaScriptCore/parser/Parser.h @@ -39,7 +39,7 @@ namespace JSC { template <typename T> struct ParserArenaData : ParserArenaDeletable { T data; }; - class Parser : Noncopyable { + class Parser : public Noncopyable { public: template <class ParsedNode> PassRefPtr<ParsedNode> parse(ExecState*, Debugger*, const SourceCode&, int* errLine = 0, UString* errMsg = 0); template <class ParsedNode> PassRefPtr<ParsedNode> reparse(JSGlobalData*, ParsedNode*); diff --git a/JavaScriptCore/pcre/pcre_exec.cpp b/JavaScriptCore/pcre/pcre_exec.cpp index af770f3..16619d4 100644 --- a/JavaScriptCore/pcre/pcre_exec.cpp +++ b/JavaScriptCore/pcre/pcre_exec.cpp @@ -112,7 +112,7 @@ struct BracketChainNode { const UChar* bracketStart; }; -struct MatchFrame { +struct MatchFrame : FastAllocBase { ReturnLocation returnLocation; struct MatchFrame* previousFrame; diff --git a/JavaScriptCore/profiler/CallIdentifier.h b/JavaScriptCore/profiler/CallIdentifier.h index c2c25d5..ba48c55 100644 --- a/JavaScriptCore/profiler/CallIdentifier.h +++ b/JavaScriptCore/profiler/CallIdentifier.h @@ -28,10 +28,11 @@ #define CallIdentifier_h #include <runtime/UString.h> +#include "FastAllocBase.h" namespace JSC { - struct CallIdentifier { + struct CallIdentifier : public FastAllocBase { UString m_name; UString m_url; unsigned m_lineNumber; diff --git a/JavaScriptCore/profiler/ProfileGenerator.h b/JavaScriptCore/profiler/ProfileGenerator.h index cccb502..82149b3 100644 --- a/JavaScriptCore/profiler/ProfileGenerator.h +++ b/JavaScriptCore/profiler/ProfileGenerator.h @@ -33,11 +33,11 @@ namespace JSC { - class CallIdentifier; class ExecState; class Profile; class ProfileNode; class UString; + struct CallIdentifier; class ProfileGenerator : public RefCounted<ProfileGenerator> { public: diff --git a/JavaScriptCore/profiler/Profiler.h b/JavaScriptCore/profiler/Profiler.h index b37f613..21621bf 100644 --- a/JavaScriptCore/profiler/Profiler.h +++ b/JavaScriptCore/profiler/Profiler.h @@ -36,15 +36,15 @@ namespace JSC { - class CallIdentifier; class ExecState; class JSGlobalData; class JSObject; class JSValue; class ProfileGenerator; class UString; + struct CallIdentifier; - class Profiler { + class Profiler : public FastAllocBase { public: static Profiler** enabledProfilerReference() { diff --git a/JavaScriptCore/runtime/ArgList.cpp b/JavaScriptCore/runtime/ArgList.cpp index 0b5d958..ab2b5d7 100644 --- a/JavaScriptCore/runtime/ArgList.cpp +++ b/JavaScriptCore/runtime/ArgList.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003, 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. + * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -37,16 +37,12 @@ void ArgList::getSlice(int startIndex, ArgList& result) const result = ArgList(m_args + startIndex, m_argCount - startIndex); } -void MarkedArgumentBuffer::markLists(ListSet& markSet) +void MarkedArgumentBuffer::markLists(MarkStack& markStack, ListSet& markSet) { ListSet::iterator end = markSet.end(); for (ListSet::iterator it = markSet.begin(); it != end; ++it) { MarkedArgumentBuffer* list = *it; - - iterator end2 = list->end(); - for (iterator it2 = list->begin(); it2 != end2; ++it2) - if (!(*it2).marked()) - (*it2).mark(); + markStack.appendValues(reinterpret_cast<JSValue*>(list->m_buffer), list->m_size); } } diff --git a/JavaScriptCore/runtime/ArgList.h b/JavaScriptCore/runtime/ArgList.h index 8e85d7f..ab501b6 100644 --- a/JavaScriptCore/runtime/ArgList.h +++ b/JavaScriptCore/runtime/ArgList.h @@ -22,7 +22,6 @@ #ifndef ArgList_h #define ArgList_h -#include "JSImmediate.h" #include "Register.h" #include <wtf/HashSet.h> @@ -31,7 +30,7 @@ namespace JSC { - class MarkedArgumentBuffer : Noncopyable { + class MarkedArgumentBuffer : public Noncopyable { private: static const unsigned inlineCapacity = 8; typedef Vector<Register, inlineCapacity> VectorType; @@ -44,7 +43,8 @@ namespace JSC { // Constructor for a read-write list, to which you may append values. // FIXME: Remove all clients of this API, then remove this API. MarkedArgumentBuffer() - : m_markSet(0) + : m_isUsingInlineBuffer(true) + , m_markSet(0) #ifndef NDEBUG , m_isReadOnly(false) #endif @@ -57,6 +57,7 @@ namespace JSC { MarkedArgumentBuffer(Register* buffer, size_t size) : m_buffer(buffer) , m_size(size) + , m_isUsingInlineBuffer(true) , m_markSet(0) #ifndef NDEBUG , m_isReadOnly(true) @@ -103,7 +104,7 @@ namespace JSC { { ASSERT(!m_isReadOnly); - if (m_size < inlineCapacity) { + if (m_isUsingInlineBuffer && m_size < inlineCapacity) { m_vector.uncheckedAppend(v); ++m_size; } else { @@ -111,22 +112,37 @@ namespace JSC { // the performance of the fast "just append to inline buffer" case. slowAppend(v); ++m_size; + m_isUsingInlineBuffer = false; } } + void removeLast() + { + ASSERT(m_size); + m_size--; + m_vector.removeLast(); + } + + JSValue last() + { + ASSERT(m_size); + return m_buffer[m_size - 1].jsValue(); + } + iterator begin() { return m_buffer; } iterator end() { return m_buffer + m_size; } const_iterator begin() const { return m_buffer; } const_iterator end() const { return m_buffer + m_size; } - static void markLists(ListSet&); + static void markLists(MarkStack&, ListSet&); private: void slowAppend(JSValue); Register* m_buffer; size_t m_size; + bool m_isUsingInlineBuffer; VectorType m_vector; ListSet* m_markSet; diff --git a/JavaScriptCore/runtime/Arguments.cpp b/JavaScriptCore/runtime/Arguments.cpp index f867fe8..ec9c450 100644 --- a/JavaScriptCore/runtime/Arguments.cpp +++ b/JavaScriptCore/runtime/Arguments.cpp @@ -1,7 +1,7 @@ /* * Copyright (C) 1999-2002 Harri Porten (porten@kde.org) * Copyright (C) 2001 Peter Kelly (pmk@post.com) - * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. * Copyright (C) 2007 Cameron Zwarich (cwzwarich@uwaterloo.ca) * Copyright (C) 2007 Maks Orlovich * @@ -43,30 +43,22 @@ Arguments::~Arguments() delete [] d->extraArguments; } -void Arguments::mark() +void Arguments::markChildren(MarkStack& markStack) { - JSObject::mark(); + JSObject::markChildren(markStack); - if (d->registerArray) { - for (unsigned i = 0; i < d->numParameters; ++i) { - if (!d->registerArray[i].marked()) - d->registerArray[i].mark(); - } - } + if (d->registerArray) + markStack.appendValues(reinterpret_cast<JSValue*>(d->registerArray.get()), d->numParameters); if (d->extraArguments) { unsigned numExtraArguments = d->numArguments - d->numParameters; - for (unsigned i = 0; i < numExtraArguments; ++i) { - if (!d->extraArguments[i].marked()) - d->extraArguments[i].mark(); - } + markStack.appendValues(reinterpret_cast<JSValue*>(d->extraArguments), numExtraArguments); } - if (!d->callee->marked()) - d->callee->mark(); + markStack.append(d->callee); - if (d->activation && !d->activation->marked()) - d->activation->mark(); + if (d->activation) + markStack.append(d->activation); } void Arguments::copyToRegisters(ExecState* exec, Register* buffer, uint32_t maxSize) diff --git a/JavaScriptCore/runtime/Arguments.h b/JavaScriptCore/runtime/Arguments.h index 72697eb..79fe720 100644 --- a/JavaScriptCore/runtime/Arguments.h +++ b/JavaScriptCore/runtime/Arguments.h @@ -1,6 +1,6 @@ /* * Copyright (C) 1999-2000 Harri Porten (porten@kde.org) - * Copyright (C) 2003, 2006, 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2003, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. * Copyright (C) 2007 Cameron Zwarich (cwzwarich@uwaterloo.ca) * Copyright (C) 2007 Maks Orlovich * @@ -61,7 +61,7 @@ namespace JSC { static const ClassInfo info; - virtual void mark(); + virtual void markChildren(MarkStack&); void fillArgList(ExecState*, MarkedArgumentBuffer&); @@ -230,6 +230,14 @@ namespace JSC { static_cast<Arguments*>(arguments)->setActivation(this); } + ALWAYS_INLINE Arguments* Register::arguments() const + { + if (jsValue() == JSValue()) + return 0; + return asArguments(jsValue()); + } + + } // namespace JSC #endif // Arguments_h diff --git a/JavaScriptCore/runtime/BatchedTransitionOptimizer.h b/JavaScriptCore/runtime/BatchedTransitionOptimizer.h index 13dd95c..b9f738f 100644 --- a/JavaScriptCore/runtime/BatchedTransitionOptimizer.h +++ b/JavaScriptCore/runtime/BatchedTransitionOptimizer.h @@ -32,7 +32,7 @@ namespace JSC { - class BatchedTransitionOptimizer : Noncopyable { + class BatchedTransitionOptimizer : public Noncopyable { public: BatchedTransitionOptimizer(JSObject* object) : m_object(object) diff --git a/JavaScriptCore/runtime/ClassInfo.h b/JavaScriptCore/runtime/ClassInfo.h index 097fb09..acec4e7 100644 --- a/JavaScriptCore/runtime/ClassInfo.h +++ b/JavaScriptCore/runtime/ClassInfo.h @@ -27,7 +27,7 @@ namespace JSC { - struct HashEntry; + class HashEntry; struct HashTable; struct ClassInfo { diff --git a/JavaScriptCore/runtime/Collector.cpp b/JavaScriptCore/runtime/Collector.cpp index c799424..c188016 100644 --- a/JavaScriptCore/runtime/Collector.cpp +++ b/JavaScriptCore/runtime/Collector.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. * Copyright (C) 2007 Eric Seidel <eric@webkit.org> * * This library is free software; you can redistribute it and/or @@ -27,11 +27,14 @@ #include "Interpreter.h" #include "JSGlobalObject.h" #include "JSLock.h" +#include "JSONObject.h" #include "JSString.h" #include "JSValue.h" +#include "MarkStack.h" #include "Nodes.h" #include "Tracing.h" #include <algorithm> +#include <limits.h> #include <setjmp.h> #include <stdlib.h> #include <wtf/FastMalloc.h> @@ -47,6 +50,11 @@ #include <mach/thread_act.h> #include <mach/vm_map.h> +#elif PLATFORM(SYMBIAN) +#include <e32std.h> +#include <e32cmn.h> +#include <unistd.h> + #elif PLATFORM(WIN_OS) #include <windows.h> @@ -86,6 +94,11 @@ const size_t ALLOCATIONS_PER_COLLECTION = 4000; // a PIC branch in Mach-O binaries, see <rdar://problem/5971391>. #define MIN_ARRAY_SIZE (static_cast<size_t>(14)) +#if PLATFORM(SYMBIAN) +const size_t MAX_NUM_BLOCKS = 256; // Max size of collector heap set to 16 MB +static RHeap* userChunk = 0; +#endif + static void freeHeap(CollectorHeap*); #if ENABLE(JSC_MULTIPLE_THREADS) @@ -127,6 +140,26 @@ Heap::Heap(JSGlobalData* globalData) { ASSERT(globalData); +#if PLATFORM(SYMBIAN) + // Symbian OpenC supports mmap but currently not the MAP_ANON flag. + // Using fastMalloc() does not properly align blocks on 64k boundaries + // and previous implementation was flawed/incomplete. + // UserHeap::ChunkHeap allows allocation of continuous memory and specification + // of alignment value for (symbian) cells within that heap. + // + // Clarification and mapping of terminology: + // RHeap (created by UserHeap::ChunkHeap below) is continuos memory chunk, + // which can dynamically grow up to 8 MB, + // that holds all CollectorBlocks of this session (static). + // Each symbian cell within RHeap maps to a 64kb aligned CollectorBlock. + // JSCell objects are maintained as usual within CollectorBlocks. + if (!userChunk) { + userChunk = UserHeap::ChunkHeap(0, 0, MAX_NUM_BLOCKS * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE); + if (!userChunk) + CRASH(); + } +#endif // PLATFORM(SYMBIAN) + memset(&primaryHeap, 0, sizeof(CollectorHeap)); memset(&numberHeap, 0, sizeof(CollectorHeap)); } @@ -139,7 +172,7 @@ Heap::~Heap() void Heap::destroy() { - JSLock lock(false); + JSLock lock(SilenceAssertionsOnly); if (!m_globalData) return; @@ -184,8 +217,12 @@ static NEVER_INLINE CollectorBlock* allocateBlock() // FIXME: tag the region as a JavaScriptCore heap when we get a registered VM tag: <rdar://problem/6054788>. vm_map(current_task(), &address, BLOCK_SIZE, BLOCK_OFFSET_MASK, VM_FLAGS_ANYWHERE | VM_TAG_FOR_COLLECTOR_MEMORY, MEMORY_OBJECT_NULL, 0, FALSE, VM_PROT_DEFAULT, VM_PROT_DEFAULT, VM_INHERIT_DEFAULT); #elif PLATFORM(SYMBIAN) - // no memory map in symbian, need to hack with fastMalloc - void* address = fastMalloc(BLOCK_SIZE); + // Allocate a 64 kb aligned CollectorBlock + unsigned char* mask = reinterpret_cast<unsigned char*>(userChunk->Alloc(BLOCK_SIZE)); + if (!mask) + CRASH(); + uintptr_t address = reinterpret_cast<uintptr_t>(mask); + memset(reinterpret_cast<void*>(address), 0, BLOCK_SIZE); #elif PLATFORM(WIN_OS) // windows virtual address granularity is naturally 64k @@ -230,7 +267,7 @@ static void freeBlock(CollectorBlock* block) #if PLATFORM(DARWIN) vm_deallocate(current_task(), reinterpret_cast<vm_address_t>(block), BLOCK_SIZE); #elif PLATFORM(SYMBIAN) - fastFree(block); + userChunk->Free(reinterpret_cast<TAny*>(block)); #elif PLATFORM(WIN_OS) VirtualFree(block, 0, MEM_RELEASE); #elif HAVE(POSIX_MEMALIGN) @@ -392,6 +429,63 @@ void* Heap::allocateNumber(size_t s) return heapAllocate<NumberHeap>(s); } +#if PLATFORM(WINCE) +void* g_stackBase = 0; + +inline bool isPageWritable(void* page) +{ + MEMORY_BASIC_INFORMATION memoryInformation; + DWORD result = VirtualQuery(page, &memoryInformation, sizeof(memoryInformation)); + + // return false on error, including ptr outside memory + if (result != sizeof(memoryInformation)) + return false; + + DWORD protect = memoryInformation.Protect & ~(PAGE_GUARD | PAGE_NOCACHE); + return protect == PAGE_READWRITE + || protect == PAGE_WRITECOPY + || protect == PAGE_EXECUTE_READWRITE + || protect == PAGE_EXECUTE_WRITECOPY; +} + +static void* getStackBase(void* previousFrame) +{ + // find the address of this stack frame by taking the address of a local variable + bool isGrowingDownward; + void* thisFrame = (void*)(&isGrowingDownward); + + isGrowingDownward = previousFrame < &thisFrame; + static DWORD pageSize = 0; + if (!pageSize) { + SYSTEM_INFO systemInfo; + GetSystemInfo(&systemInfo); + pageSize = systemInfo.dwPageSize; + } + + // scan all of memory starting from this frame, and return the last writeable page found + register char* currentPage = (char*)((DWORD)thisFrame & ~(pageSize - 1)); + if (isGrowingDownward) { + while (currentPage > 0) { + // check for underflow + if (currentPage >= (char*)pageSize) + currentPage -= pageSize; + else + currentPage = 0; + if (!isPageWritable(currentPage)) + return currentPage + pageSize; + } + return 0; + } else { + while (true) { + // guaranteed to complete because isPageWritable returns false at end of memory + currentPage += pageSize; + if (!isPageWritable(currentPage)) + return currentPage; + } + } +} +#endif + static inline void* currentThreadStackBase() { #if PLATFORM(DARWIN) @@ -457,6 +551,13 @@ static inline void* currentThreadStackBase() stackThread = thread; } return static_cast<char*>(stackBase) + stackSize; +#elif PLATFORM(WINCE) + if (g_stackBase) + return g_stackBase; + else { + int dummy; + return getStackBase(&dummy); + } #else #error Need a way to get the stack base on this platform #endif @@ -542,7 +643,7 @@ void Heap::registerThread() // cell size needs to be a power of two for this to be valid #define IS_HALF_CELL_ALIGNED(p) (((intptr_t)(p) & (CELL_MASK >> 1)) == 0) -void Heap::markConservatively(void* start, void* end) +void Heap::markConservatively(MarkStack& markStack, void* start, void* end) { if (start > end) { void* tmp = start; @@ -583,9 +684,8 @@ void Heap::markConservatively(void* start, void* end) for (size_t block = 0; block < usedPrimaryBlocks; block++) { if ((primaryBlocks[block] == blockAddr) & (offset <= lastCellOffset)) { if (reinterpret_cast<CollectorCell*>(xAsBits)->u.freeCell.zeroIfFree != 0) { - JSCell* imp = reinterpret_cast<JSCell*>(xAsBits); - if (!imp->marked()) - imp->mark(); + markStack.append(reinterpret_cast<JSCell*>(xAsBits)); + markStack.drain(); } break; } @@ -596,15 +696,15 @@ void Heap::markConservatively(void* start, void* end) } } -void NEVER_INLINE Heap::markCurrentThreadConservativelyInternal() +void NEVER_INLINE Heap::markCurrentThreadConservativelyInternal(MarkStack& markStack) { void* dummy; void* stackPointer = &dummy; void* stackBase = currentThreadStackBase(); - markConservatively(stackPointer, stackBase); + markConservatively(markStack, stackPointer, stackBase); } -void Heap::markCurrentThreadConservatively() +void Heap::markCurrentThreadConservatively(MarkStack& markStack) { // setjmp forces volatile registers onto the stack jmp_buf registers; @@ -617,7 +717,7 @@ void Heap::markCurrentThreadConservatively() #pragma warning(pop) #endif - markCurrentThreadConservativelyInternal(); + markCurrentThreadConservativelyInternal(markStack); } #if ENABLE(JSC_MULTIPLE_THREADS) @@ -749,7 +849,7 @@ static inline void* otherThreadStackPointer(const PlatformThreadRegisters& regs) #endif } -void Heap::markOtherThreadConservatively(Thread* thread) +void Heap::markOtherThreadConservatively(MarkStack& markStack, Thread* thread) { suspendThread(thread->platformThread); @@ -757,19 +857,19 @@ void Heap::markOtherThreadConservatively(Thread* thread) size_t regSize = getPlatformThreadRegisters(thread->platformThread, regs); // mark the thread's registers - markConservatively(static_cast<void*>(®s), static_cast<void*>(reinterpret_cast<char*>(®s) + regSize)); + markConservatively(markStack, static_cast<void*>(®s), static_cast<void*>(reinterpret_cast<char*>(®s) + regSize)); void* stackPointer = otherThreadStackPointer(regs); - markConservatively(stackPointer, thread->stackBase); + markConservatively(markStack, stackPointer, thread->stackBase); resumeThread(thread->platformThread); } #endif -void Heap::markStackObjectsConservatively() +void Heap::markStackObjectsConservatively(MarkStack& markStack) { - markCurrentThreadConservatively(); + markCurrentThreadConservatively(markStack); #if ENABLE(JSC_MULTIPLE_THREADS) @@ -779,7 +879,7 @@ void Heap::markStackObjectsConservatively() #ifndef NDEBUG // Forbid malloc during the mark phase. Marking a thread suspends it, so - // a malloc inside mark() would risk a deadlock with a thread that had been + // a malloc inside markChildren() would risk a deadlock with a thread that had been // suspended while holding the malloc lock. fastMallocForbid(); #endif @@ -787,7 +887,7 @@ void Heap::markStackObjectsConservatively() // and since this is a shared heap, they are real locks. for (Thread* thread = m_registeredThreads; thread; thread = thread->next) { if (!pthread_equal(thread->posixThread, pthread_self())) - markOtherThreadConservatively(thread); + markOtherThreadConservatively(markStack, thread); } #ifndef NDEBUG fastMallocAllow(); @@ -847,7 +947,7 @@ Heap* Heap::heap(JSValue v) return Heap::cellBlock(v.asCell())->heap; } -void Heap::markProtectedObjects() +void Heap::markProtectedObjects(MarkStack& markStack) { if (m_protectedValuesMutex) m_protectedValuesMutex->lock(); @@ -855,8 +955,10 @@ void Heap::markProtectedObjects() ProtectCountSet::iterator end = m_protectedValues.end(); for (ProtectCountSet::iterator it = m_protectedValues.begin(); it != end; ++it) { JSCell* val = it->first; - if (!val->marked()) - val->mark(); + if (!val->marked()) { + markStack.append(val); + markStack.drain(); + } } if (m_protectedValuesMutex) @@ -961,7 +1063,7 @@ template <HeapType heapType> size_t Heap::sweep() heap.extraCost = 0; return numLiveObjects; } - + bool Heap::collect() { #ifndef NDEBUG @@ -980,18 +1082,22 @@ bool Heap::collect() numberHeap.operationInProgress = Collection; // MARK: first mark all referenced objects recursively starting out from the set of root objects - - markStackObjectsConservatively(); - markProtectedObjects(); + MarkStack& markStack = m_globalData->markStack; + markStackObjectsConservatively(markStack); + markProtectedObjects(markStack); if (m_markListSet && m_markListSet->size()) - MarkedArgumentBuffer::markLists(*m_markListSet); + MarkedArgumentBuffer::markLists(markStack, *m_markListSet); if (m_globalData->exception && !m_globalData->exception.marked()) - m_globalData->exception.mark(); - m_globalData->interpreter->registerFile().markCallFrames(this); + markStack.append(m_globalData->exception); + m_globalData->interpreter->registerFile().markCallFrames(markStack, this); m_globalData->smallStrings.mark(); if (m_globalData->scopeNodeBeingReparsed) - m_globalData->scopeNodeBeingReparsed->mark(); + m_globalData->scopeNodeBeingReparsed->markAggregate(markStack); + if (m_globalData->firstStringifierToMark) + JSONObject::markStringifiers(markStack, m_globalData->firstStringifierToMark); + markStack.drain(); + markStack.compact(); JAVASCRIPTCORE_GC_MARKED(); size_t originalLiveObjects = primaryHeap.numLiveObjects + numberHeap.numLiveObjects; @@ -1081,8 +1187,10 @@ static const char* typeName(JSCell* cell) { if (cell->isString()) return "string"; +#if USE(JSVALUE32) if (cell->isNumber()) return "number"; +#endif if (cell->isGetterSetter()) return "gettersetter"; ASSERT(cell->isObject()); diff --git a/JavaScriptCore/runtime/Collector.h b/JavaScriptCore/runtime/Collector.h index 23f9f15..877f890 100644 --- a/JavaScriptCore/runtime/Collector.h +++ b/JavaScriptCore/runtime/Collector.h @@ -39,11 +39,12 @@ namespace JSC { - class MarkedArgumentBuffer; class CollectorBlock; class JSCell; class JSGlobalData; class JSValue; + class MarkedArgumentBuffer; + class MarkStack; enum OperationInProgress { NoOperation, Allocation, Collection }; enum HeapType { PrimaryHeap, NumberHeap }; @@ -63,7 +64,7 @@ namespace JSC { OperationInProgress operationInProgress; }; - class Heap : Noncopyable { + class Heap : public Noncopyable { public: class Thread; typedef CollectorHeapIterator<PrimaryHeap> iterator; @@ -111,7 +112,7 @@ namespace JSC { static bool isCellMarked(const JSCell*); static void markCell(JSCell*); - void markConservatively(void* start, void* end); + void markConservatively(MarkStack&, void* start, void* end); HashSet<MarkedArgumentBuffer*>& markListSet() { if (!m_markListSet) m_markListSet = new HashSet<MarkedArgumentBuffer*>; return *m_markListSet; } @@ -133,11 +134,11 @@ namespace JSC { ~Heap(); void recordExtraCost(size_t); - void markProtectedObjects(); - void markCurrentThreadConservatively(); - void markCurrentThreadConservativelyInternal(); - void markOtherThreadConservatively(Thread*); - void markStackObjectsConservatively(); + void markProtectedObjects(MarkStack&); + void markCurrentThreadConservatively(MarkStack&); + void markCurrentThreadConservativelyInternal(MarkStack&); + void markOtherThreadConservatively(MarkStack&, Thread*); + void markStackObjectsConservatively(MarkStack&); typedef HashCountedSet<JSCell*> ProtectCountSet; @@ -167,8 +168,13 @@ namespace JSC { template<size_t bytesPerWord> struct CellSize; // cell size needs to be a power of two for certain optimizations in collector.cpp - template<> struct CellSize<sizeof(uint32_t)> { static const size_t m_value = 32; }; // 32-bit - template<> struct CellSize<sizeof(uint64_t)> { static const size_t m_value = 64; }; // 64-bit +#if USE(JSVALUE32) + template<> struct CellSize<sizeof(uint32_t)> { static const size_t m_value = 32; }; +#else + template<> struct CellSize<sizeof(uint32_t)> { static const size_t m_value = 64; }; +#endif + template<> struct CellSize<sizeof(uint64_t)> { static const size_t m_value = 64; }; + const size_t BLOCK_SIZE = 16 * 4096; // 64k // derived constants diff --git a/JavaScriptCore/runtime/CommonIdentifiers.cpp b/JavaScriptCore/runtime/CommonIdentifiers.cpp index fe0a830..3837817 100644 --- a/JavaScriptCore/runtime/CommonIdentifiers.cpp +++ b/JavaScriptCore/runtime/CommonIdentifiers.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003, 2007 Apple Inc. All rights reserved. + * Copyright (C) 2003, 2007, 2009 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -23,12 +23,13 @@ namespace JSC { -const char* const nullCString = 0; +static const char* const nullCString = 0; #define INITIALIZE_PROPERTY_NAME(name) , name(globalData, #name) CommonIdentifiers::CommonIdentifiers(JSGlobalData* globalData) : nullIdentifier(globalData, nullCString) + , emptyIdentifier(globalData, "") , underscoreProto(globalData, "__proto__") , thisIdentifier(globalData, "this") JSC_COMMON_IDENTIFIERS_EACH_PROPERTY_NAME(INITIALIZE_PROPERTY_NAME) diff --git a/JavaScriptCore/runtime/CommonIdentifiers.h b/JavaScriptCore/runtime/CommonIdentifiers.h index d4c5d52..148d3dd 100644 --- a/JavaScriptCore/runtime/CommonIdentifiers.h +++ b/JavaScriptCore/runtime/CommonIdentifiers.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003,2007 Apple Computer, Inc + * Copyright (C) 2003, 2007, 2009 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -42,6 +42,7 @@ macro(exec) \ macro(fromCharCode) \ macro(global) \ + macro(getPrototypeOf) \ macro(hasOwnProperty) \ macro(ignoreCase) \ macro(index) \ @@ -59,6 +60,8 @@ macro(test) \ macro(toExponential) \ macro(toFixed) \ + macro(toISOString) \ + macro(toJSON) \ macro(toLocaleString) \ macro(toPrecision) \ macro(toString) \ @@ -68,13 +71,14 @@ namespace JSC { - class CommonIdentifiers : Noncopyable { + class CommonIdentifiers : public Noncopyable { private: CommonIdentifiers(JSGlobalData*); friend class JSGlobalData; public: const Identifier nullIdentifier; + const Identifier emptyIdentifier; const Identifier underscoreProto; const Identifier thisIdentifier; diff --git a/JavaScriptCore/runtime/DateConstructor.cpp b/JavaScriptCore/runtime/DateConstructor.cpp index f1cf933..2f52cff 100644 --- a/JavaScriptCore/runtime/DateConstructor.cpp +++ b/JavaScriptCore/runtime/DateConstructor.cpp @@ -35,6 +35,10 @@ #include <wtf/DateMath.h> #include <wtf/MathExtras.h> +#if PLATFORM(WINCE) && !PLATFORM(QT) +extern "C" time_t time(time_t* timer); // Provided by libce. +#endif + #if HAVE(SYS_TIME_H) #include <sys/time.h> #endif @@ -47,8 +51,6 @@ using namespace WTF; namespace JSC { -// TODO: MakeTime (15.9.11.1) etc. ? - ASSERT_CLASS_FITS_IN_CELL(DateConstructor); static JSValue JSC_HOST_CALL dateParse(ExecState*, JSObject*, JSValue, const ArgList&); @@ -96,17 +98,17 @@ JSObject* constructDate(ExecState* exec, const ArgList& args) || (numArgs >= 7 && isnan(args.at(6).toNumber(exec)))) value = NaN; else { - GregorianDateTime t; - int year = args.at(0).toInt32(exec); - t.year = (year >= 0 && year <= 99) ? year : year - 1900; - t.month = args.at(1).toInt32(exec); - t.monthDay = (numArgs >= 3) ? args.at(2).toInt32(exec) : 1; - t.hour = args.at(3).toInt32(exec); - t.minute = args.at(4).toInt32(exec); - t.second = args.at(5).toInt32(exec); - t.isDST = -1; - double ms = (numArgs >= 7) ? args.at(6).toNumber(exec) : 0; - value = gregorianDateTimeToMS(t, ms, false); + GregorianDateTime t; + int year = args.at(0).toInt32(exec); + t.year = (year >= 0 && year <= 99) ? year : year - 1900; + t.month = args.at(1).toInt32(exec); + t.monthDay = (numArgs >= 3) ? args.at(2).toInt32(exec) : 1; + t.hour = args.at(3).toInt32(exec); + t.minute = args.at(4).toInt32(exec); + t.second = args.at(5).toInt32(exec); + t.isDST = -1; + double ms = (numArgs >= 7) ? args.at(6).toNumber(exec) : 0; + value = gregorianDateTimeToMS(t, ms, false); } } diff --git a/JavaScriptCore/runtime/DatePrototype.cpp b/JavaScriptCore/runtime/DatePrototype.cpp index 1406197..e2482f4 100644 --- a/JavaScriptCore/runtime/DatePrototype.cpp +++ b/JavaScriptCore/runtime/DatePrototype.cpp @@ -1,6 +1,7 @@ /* * Copyright (C) 1999-2000 Harri Porten (porten@kde.org) * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2008, 2009 Torch Mobile, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -59,6 +60,10 @@ #include <CoreFoundation/CoreFoundation.h> #endif +#if PLATFORM(WINCE) && !PLATFORM(QT) +extern "C" size_t strftime(char * const s, const size_t maxsize, const char * const format, const struct tm * const t); //provided by libce +#endif + using namespace WTF; namespace JSC { @@ -108,6 +113,9 @@ static JSValue JSC_HOST_CALL dateProtoFuncToLocaleTimeString(ExecState*, JSObjec static JSValue JSC_HOST_CALL dateProtoFuncToString(ExecState*, JSObject*, JSValue, const ArgList&); static JSValue JSC_HOST_CALL dateProtoFuncToTimeString(ExecState*, JSObject*, JSValue, const ArgList&); static JSValue JSC_HOST_CALL dateProtoFuncToUTCString(ExecState*, JSObject*, JSValue, const ArgList&); +static JSValue JSC_HOST_CALL dateProtoFuncToISOString(ExecState*, JSObject*, JSValue, const ArgList&); + +static JSValue JSC_HOST_CALL dateProtoFuncToJSON(ExecState*, JSObject*, JSValue, const ArgList&); } @@ -190,6 +198,9 @@ static JSCell* formatLocaleDate(ExecState* exec, const GregorianDateTime& gdt, L { #if HAVE(LANGINFO_H) static const nl_item formats[] = { D_T_FMT, D_FMT, T_FMT }; +#elif PLATFORM(WINCE) && !PLATFORM(QT) + // strftime() we are using does not support # + static const char* const formatStrings[] = { "%c", "%x", "%X" }; #else static const char* const formatStrings[] = { "%#c", "%#x", "%X" }; #endif @@ -334,6 +345,7 @@ const ClassInfo DatePrototype::info = {"Date", &DateInstance::info, 0, ExecState /* Source for DatePrototype.lut.h @begin dateTable toString dateProtoFuncToString DontEnum|Function 0 + toISOString dateProtoFuncToISOString DontEnum|Function 0 toUTCString dateProtoFuncToUTCString DontEnum|Function 0 toDateString dateProtoFuncToDateString DontEnum|Function 0 toTimeString dateProtoFuncToTimeString DontEnum|Function 0 @@ -377,6 +389,7 @@ const ClassInfo DatePrototype::info = {"Date", &DateInstance::info, 0, ExecState setUTCFullYear dateProtoFuncSetUTCFullYear DontEnum|Function 3 setYear dateProtoFuncSetYear DontEnum|Function 1 getYear dateProtoFuncGetYear DontEnum|Function 0 + toJSON dateProtoFuncToJSON DontEnum|Function 0 @end */ @@ -430,6 +443,28 @@ JSValue JSC_HOST_CALL dateProtoFuncToUTCString(ExecState* exec, JSObject*, JSVal return jsNontrivialString(exec, formatDateUTCVariant(t) + " " + formatTime(t, utc)); } +JSValue JSC_HOST_CALL dateProtoFuncToISOString(ExecState* exec, JSObject*, JSValue thisValue, const ArgList&) +{ + if (!thisValue.isObject(&DateInstance::info)) + return throwError(exec, TypeError); + + const bool utc = true; + + DateInstance* thisDateObj = asDateInstance(thisValue); + double milli = thisDateObj->internalNumber(); + if (!isfinite(milli)) + return jsNontrivialString(exec, "Invalid Date"); + + GregorianDateTime t; + thisDateObj->msToGregorianDateTime(milli, utc, t); + // Maximum amount of space we need in buffer: 6 (max. digits in year) + 2 * 5 (2 characters each for month, day, hour, minute, second) + // 6 for formatting and one for null termination = 23. We add one extra character to allow us to force null termination. + char buffer[24]; + snprintf(buffer, sizeof(buffer) - 1, "%04d-%02d-%02dT%02d:%02d:%02dZ", 1900 + t.year, t.month + 1, t.monthDay, t.hour, t.minute, t.second); + buffer[sizeof(buffer) - 1] = 0; + return jsNontrivialString(exec, buffer); +} + JSValue JSC_HOST_CALL dateProtoFuncToDateString(ExecState* exec, JSObject*, JSValue thisValue, const ArgList&) { if (!thisValue.isObject(&DateInstance::info)) @@ -1044,4 +1079,27 @@ JSValue JSC_HOST_CALL dateProtoFuncGetYear(ExecState* exec, JSObject*, JSValue t return jsNumber(exec, t.year); } +JSValue JSC_HOST_CALL dateProtoFuncToJSON(ExecState* exec, JSObject*, JSValue thisValue, const ArgList&) +{ + JSObject* object = thisValue.toThisObject(exec); + if (exec->hadException()) + return jsNull(); + + JSValue toISOValue = object->get(exec, exec->globalData().propertyNames->toISOString); + if (exec->hadException()) + return jsNull(); + + CallData callData; + CallType callType = toISOValue.getCallData(callData); + if (callType == CallTypeNone) + return throwError(exec, TypeError, "toISOString is not a function"); + + JSValue result = call(exec, asObject(toISOValue), callType, callData, object, exec->emptyList()); + if (exec->hadException()) + return jsNull(); + if (result.isObject()) + return throwError(exec, TypeError, "toISOString did not return a primitive value"); + return result; +} + } // namespace JSC diff --git a/JavaScriptCore/runtime/ExceptionHelpers.h b/JavaScriptCore/runtime/ExceptionHelpers.h index 09d99dc..4c5bec1 100644 --- a/JavaScriptCore/runtime/ExceptionHelpers.h +++ b/JavaScriptCore/runtime/ExceptionHelpers.h @@ -29,20 +29,19 @@ #ifndef ExceptionHelpers_h #define ExceptionHelpers_h -#include "JSImmediate.h" namespace JSC { class CodeBlock; class ExecState; class Identifier; - class Instruction; class JSGlobalData; class JSNotAnObjectErrorStub; class JSObject; class JSValue; class Node; - + struct Instruction; + JSValue createInterruptedExecutionException(JSGlobalData*); JSValue createStackOverflowError(ExecState*); JSValue createUndefinedVariableError(ExecState*, const Identifier&, unsigned bytecodeOffset, CodeBlock*); diff --git a/JavaScriptCore/runtime/GetterSetter.cpp b/JavaScriptCore/runtime/GetterSetter.cpp index cd1b40a..cc85354 100644 --- a/JavaScriptCore/runtime/GetterSetter.cpp +++ b/JavaScriptCore/runtime/GetterSetter.cpp @@ -1,7 +1,7 @@ /* * Copyright (C) 1999-2002 Harri Porten (porten@kde.org) * Copyright (C) 2001 Peter Kelly (pmk@post.com) - * Copyright (C) 2004, 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2004, 2007, 2008, 2009 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -28,14 +28,14 @@ namespace JSC { -void GetterSetter::mark() +void GetterSetter::markChildren(MarkStack& markStack) { - JSCell::mark(); + JSCell::markChildren(markStack); if (m_getter && !m_getter->marked()) - m_getter->mark(); + markStack.append(m_getter); if (m_setter && !m_setter->marked()) - m_setter->mark(); + markStack.append(m_setter); } JSValue GetterSetter::toPrimitive(ExecState*, PreferredPrimitiveType) const diff --git a/JavaScriptCore/runtime/GetterSetter.h b/JavaScriptCore/runtime/GetterSetter.h index e6b74a1..b7a8794 100644 --- a/JavaScriptCore/runtime/GetterSetter.h +++ b/JavaScriptCore/runtime/GetterSetter.h @@ -1,7 +1,7 @@ /* * Copyright (C) 1999-2001 Harri Porten (porten@kde.org) * Copyright (C) 2001 Peter Kelly (pmk@post.com) - * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -25,6 +25,8 @@ #include "JSCell.h" +#include "CallFrame.h" + namespace JSC { class JSObject; @@ -33,20 +35,23 @@ namespace JSC { // for a property. class GetterSetter : public JSCell { public: - GetterSetter() - : JSCell(0) + GetterSetter(ExecState* exec) + : JSCell(exec->globalData().getterSetterStructure.get()) , m_getter(0) , m_setter(0) { } - virtual void mark(); + virtual void markChildren(MarkStack&); JSObject* getter() const { return m_getter; } void setGetter(JSObject* getter) { m_getter = getter; } JSObject* setter() const { return m_setter; } void setSetter(JSObject* setter) { m_setter = setter; } - + static PassRefPtr<Structure> createStructure(JSValue prototype) + { + return Structure::create(prototype, TypeInfo(GetterSetterType)); + } private: virtual bool isGetterSetter() const; diff --git a/JavaScriptCore/runtime/GlobalEvalFunction.cpp b/JavaScriptCore/runtime/GlobalEvalFunction.cpp index b0d4c25..3074f95 100644 --- a/JavaScriptCore/runtime/GlobalEvalFunction.cpp +++ b/JavaScriptCore/runtime/GlobalEvalFunction.cpp @@ -1,7 +1,7 @@ /* * Copyright (C) 1999-2002 Harri Porten (porten@kde.org) * Copyright (C) 2001 Peter Kelly (pmk@post.com) - * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. * Copyright (C) 2007 Cameron Zwarich (cwzwarich@uwaterloo.ca) * Copyright (C) 2007 Maks Orlovich * @@ -39,11 +39,10 @@ GlobalEvalFunction::GlobalEvalFunction(ExecState* exec, PassRefPtr<Structure> st ASSERT_ARG(cachedGlobalObject, cachedGlobalObject); } -void GlobalEvalFunction::mark() +void GlobalEvalFunction::markChildren(MarkStack& markStack) { - PrototypeFunction::mark(); - if (!m_cachedGlobalObject->marked()) - m_cachedGlobalObject->mark(); + PrototypeFunction::markChildren(markStack); + markStack.append(m_cachedGlobalObject); } } // namespace JSC diff --git a/JavaScriptCore/runtime/GlobalEvalFunction.h b/JavaScriptCore/runtime/GlobalEvalFunction.h index 49b1847..cdba4a0 100644 --- a/JavaScriptCore/runtime/GlobalEvalFunction.h +++ b/JavaScriptCore/runtime/GlobalEvalFunction.h @@ -1,6 +1,6 @@ /* * Copyright (C) 1999-2000 Harri Porten (porten@kde.org) - * Copyright (C) 2003, 2006, 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2003, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. * Copyright (C) 2007 Cameron Zwarich (cwzwarich@uwaterloo.ca) * Copyright (C) 2007 Maks Orlovich * @@ -36,7 +36,7 @@ namespace JSC { JSGlobalObject* cachedGlobalObject() const { return m_cachedGlobalObject; } private: - virtual void mark(); + virtual void markChildren(MarkStack&); JSGlobalObject* m_cachedGlobalObject; }; diff --git a/JavaScriptCore/runtime/Identifier.cpp b/JavaScriptCore/runtime/Identifier.cpp index 040c123..7db723b 100644 --- a/JavaScriptCore/runtime/Identifier.cpp +++ b/JavaScriptCore/runtime/Identifier.cpp @@ -32,7 +32,7 @@ namespace JSC { typedef HashMap<const char*, RefPtr<UString::Rep>, PtrHash<const char*> > LiteralIdentifierTable; -class IdentifierTable { +class IdentifierTable : public FastAllocBase { public: ~IdentifierTable() { diff --git a/JavaScriptCore/runtime/InitializeThreading.cpp b/JavaScriptCore/runtime/InitializeThreading.cpp index a0620e7..fea89f8 100644 --- a/JavaScriptCore/runtime/InitializeThreading.cpp +++ b/JavaScriptCore/runtime/InitializeThreading.cpp @@ -29,7 +29,6 @@ #include "config.h" #include "InitializeThreading.h" -#include "JSImmediate.h" #include "Collector.h" #include "dtoa.h" #include "Identifier.h" diff --git a/JavaScriptCore/runtime/JSAPIValueWrapper.cpp b/JavaScriptCore/runtime/JSAPIValueWrapper.cpp new file mode 100644 index 0000000..475fad5 --- /dev/null +++ b/JavaScriptCore/runtime/JSAPIValueWrapper.cpp @@ -0,0 +1,67 @@ +/* + * Copyright (C) 1999-2002 Harri Porten (porten@kde.org) + * Copyright (C) 2001 Peter Kelly (pmk@post.com) + * Copyright (C) 2004, 2007, 2008 Apple Inc. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#include "config.h" +#include "JSAPIValueWrapper.h" + +#include "NumberObject.h" +#include "UString.h" + +namespace JSC { + +JSValue JSAPIValueWrapper::toPrimitive(ExecState*, PreferredPrimitiveType) const +{ + ASSERT_NOT_REACHED(); + return JSValue(); +} + +bool JSAPIValueWrapper::getPrimitiveNumber(ExecState*, double&, JSValue&) +{ + ASSERT_NOT_REACHED(); + return false; +} + +bool JSAPIValueWrapper::toBoolean(ExecState*) const +{ + ASSERT_NOT_REACHED(); + return false; +} + +double JSAPIValueWrapper::toNumber(ExecState*) const +{ + ASSERT_NOT_REACHED(); + return 0; +} + +UString JSAPIValueWrapper::toString(ExecState*) const +{ + ASSERT_NOT_REACHED(); + return UString(); +} + +JSObject* JSAPIValueWrapper::toObject(ExecState*) const +{ + ASSERT_NOT_REACHED(); + return 0; +} + +} // namespace JSC diff --git a/JavaScriptCore/runtime/JSAPIValueWrapper.h b/JavaScriptCore/runtime/JSAPIValueWrapper.h new file mode 100644 index 0000000..21a9710 --- /dev/null +++ b/JavaScriptCore/runtime/JSAPIValueWrapper.h @@ -0,0 +1,69 @@ +/* + * Copyright (C) 1999-2001 Harri Porten (porten@kde.org) + * Copyright (C) 2001 Peter Kelly (pmk@post.com) + * Copyright (C) 2003, 2004, 2005, 2007, 2008 Apple Inc. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#ifndef JSAPIValueWrapper_h +#define JSAPIValueWrapper_h + +#include <wtf/Platform.h> + +#include "JSCell.h" +#include "CallFrame.h" + +namespace JSC { + + class JSAPIValueWrapper : public JSCell { + friend JSValue jsAPIValueWrapper(ExecState*, JSValue); + public: + JSValue value() const { return m_value; } + + virtual bool isAPIValueWrapper() const { return true; } + + virtual JSValue toPrimitive(ExecState*, PreferredPrimitiveType) const; + virtual bool getPrimitiveNumber(ExecState*, double& number, JSValue&); + virtual bool toBoolean(ExecState*) const; + virtual double toNumber(ExecState*) const; + virtual UString toString(ExecState*) const; + virtual JSObject* toObject(ExecState*) const; + static PassRefPtr<Structure> createStructure(JSValue prototype) + { + return Structure::create(prototype, TypeInfo(CompoundType)); + } + + + private: + JSAPIValueWrapper(ExecState* exec, JSValue value) + : JSCell(exec->globalData().apiWrapperStructure.get()) + , m_value(value) + { + } + + JSValue m_value; + }; + + inline JSValue jsAPIValueWrapper(ExecState* exec, JSValue value) + { + return new (exec) JSAPIValueWrapper(exec, value); + } + +} // namespace JSC + +#endif // JSAPIValueWrapper_h diff --git a/JavaScriptCore/runtime/JSActivation.cpp b/JavaScriptCore/runtime/JSActivation.cpp index 8996629..87adbcd 100644 --- a/JavaScriptCore/runtime/JSActivation.cpp +++ b/JavaScriptCore/runtime/JSActivation.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 Apple Inc. All rights reserved. + * Copyright (C) 2008, 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 @@ -40,7 +40,7 @@ ASSERT_CLASS_FITS_IN_CELL(JSActivation); const ClassInfo JSActivation::info = { "JSActivation", 0, 0, 0 }; JSActivation::JSActivation(CallFrame* callFrame, PassRefPtr<FunctionBodyNode> functionBody) - : Base(callFrame->globalData().activationStructure, new JSActivationData(functionBody, callFrame)) + : Base(callFrame->globalData().activationStructure, new JSActivationData(functionBody, callFrame->registers())) { } @@ -49,9 +49,9 @@ JSActivation::~JSActivation() delete d(); } -void JSActivation::mark() +void JSActivation::markChildren(MarkStack& markStack) { - Base::mark(); + Base::markChildren(markStack); Register* registerArray = d()->registerArray.get(); if (!registerArray) @@ -59,25 +59,13 @@ void JSActivation::mark() size_t numParametersMinusThis = d()->functionBody->generatedBytecode().m_numParameters - 1; - size_t i = 0; - size_t count = numParametersMinusThis; - for ( ; i < count; ++i) { - Register& r = registerArray[i]; - if (!r.marked()) - r.mark(); - } + size_t count = numParametersMinusThis; + markStack.appendValues(registerArray, count); size_t numVars = d()->functionBody->generatedBytecode().m_numVars; // Skip the call frame, which sits between the parameters and vars. - i += RegisterFile::CallFrameHeaderSize; - count += RegisterFile::CallFrameHeaderSize + numVars; - - for ( ; i < count; ++i) { - Register& r = registerArray[i]; - if (r.jsValue() && !r.marked()) - r.mark(); - } + markStack.appendValues(registerArray + count + RegisterFile::CallFrameHeaderSize, numVars, MayContainNullValues); } bool JSActivation::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot) diff --git a/JavaScriptCore/runtime/JSActivation.h b/JavaScriptCore/runtime/JSActivation.h index c183dac..6a08439 100644 --- a/JavaScriptCore/runtime/JSActivation.h +++ b/JavaScriptCore/runtime/JSActivation.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 Apple Inc. All rights reserved. + * Copyright (C) 2008, 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 @@ -46,7 +46,7 @@ namespace JSC { JSActivation(CallFrame*, PassRefPtr<FunctionBodyNode>); virtual ~JSActivation(); - virtual void mark(); + virtual void markChildren(MarkStack&); virtual bool isDynamicScope() const; diff --git a/JavaScriptCore/runtime/JSArray.cpp b/JavaScriptCore/runtime/JSArray.cpp index 296ac9d..7d7d4c4 100644 --- a/JavaScriptCore/runtime/JSArray.cpp +++ b/JavaScriptCore/runtime/JSArray.cpp @@ -1,6 +1,6 @@ /* * Copyright (C) 1999-2000 Harri Porten (porten@kde.org) - * Copyright (C) 2003, 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2003, 2007, 2008, 2009 Apple Inc. All rights reserved. * Copyright (C) 2003 Peter Kelly (pmk@post.com) * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com) * @@ -134,9 +134,9 @@ JSArray::JSArray(PassRefPtr<Structure> structure) unsigned initialCapacity = 0; m_storage = static_cast<ArrayStorage*>(fastZeroedMalloc(storageSize(initialCapacity))); - m_fastAccessCutoff = 0; m_storage->m_vectorLength = initialCapacity; - m_storage->m_length = 0; + + m_fastAccessCutoff = 0; checkConsistency(); } @@ -146,40 +146,45 @@ JSArray::JSArray(PassRefPtr<Structure> structure, unsigned initialLength) { unsigned initialCapacity = min(initialLength, MIN_SPARSE_ARRAY_INDEX); - m_storage = static_cast<ArrayStorage*>(fastZeroedMalloc(storageSize(initialCapacity))); - m_fastAccessCutoff = 0; - m_storage->m_vectorLength = initialCapacity; + m_storage = static_cast<ArrayStorage*>(fastMalloc(storageSize(initialCapacity))); m_storage->m_length = initialLength; + m_storage->m_vectorLength = initialCapacity; + m_storage->m_numValuesInVector = 0; + m_storage->m_sparseValueMap = 0; + m_storage->lazyCreationData = 0; - Heap::heap(this)->reportExtraMemoryCost(initialCapacity * sizeof(JSValue)); + JSValue* vector = m_storage->m_vector; + for (size_t i = 0; i < initialCapacity; ++i) + vector[i] = JSValue(); + + m_fastAccessCutoff = 0; checkConsistency(); + + Heap::heap(this)->reportExtraMemoryCost(initialCapacity * sizeof(JSValue)); } JSArray::JSArray(PassRefPtr<Structure> structure, const ArgList& list) : JSObject(structure) { - unsigned length = list.size(); + unsigned initialCapacity = list.size(); - m_fastAccessCutoff = length; - - ArrayStorage* storage = static_cast<ArrayStorage*>(fastMalloc(storageSize(length))); - - storage->m_vectorLength = length; - storage->m_numValuesInVector = length; - storage->m_sparseValueMap = 0; - storage->m_length = length; + m_storage = static_cast<ArrayStorage*>(fastMalloc(storageSize(initialCapacity))); + m_storage->m_length = initialCapacity; + m_storage->m_vectorLength = initialCapacity; + m_storage->m_numValuesInVector = initialCapacity; + m_storage->m_sparseValueMap = 0; size_t i = 0; ArgList::const_iterator end = list.end(); for (ArgList::const_iterator it = list.begin(); it != end; ++it, ++i) - storage->m_vector[i] = *it; + m_storage->m_vector[i] = *it; - m_storage = storage; - - Heap::heap(this)->reportExtraMemoryCost(storageSize(length)); + m_fastAccessCutoff = initialCapacity; checkConsistency(); + + Heap::heap(this)->reportExtraMemoryCost(storageSize(initialCapacity)); } JSArray::~JSArray() @@ -596,26 +601,19 @@ void JSArray::push(ExecState* exec, JSValue value) putSlowCase(exec, m_storage->m_length++, value); } -void JSArray::mark() +void JSArray::markChildren(MarkStack& markStack) { - JSObject::mark(); + JSObject::markChildren(markStack); ArrayStorage* storage = m_storage; unsigned usedVectorLength = min(storage->m_length, storage->m_vectorLength); - for (unsigned i = 0; i < usedVectorLength; ++i) { - JSValue value = storage->m_vector[i]; - if (value && !value.marked()) - value.mark(); - } + markStack.appendValues(storage->m_vector, usedVectorLength, MayContainNullValues); if (SparseArrayValueMap* map = storage->m_sparseValueMap) { SparseArrayValueMap::iterator end = map->end(); - for (SparseArrayValueMap::iterator it = map->begin(); it != end; ++it) { - JSValue value = it->second; - if (!value.marked()) - value.mark(); - } + for (SparseArrayValueMap::iterator it = map->begin(); it != end; ++it) + markStack.append(it->second); } } diff --git a/JavaScriptCore/runtime/JSArray.h b/JavaScriptCore/runtime/JSArray.h index ea490d8..49df6c4 100644 --- a/JavaScriptCore/runtime/JSArray.h +++ b/JavaScriptCore/runtime/JSArray.h @@ -1,6 +1,6 @@ /* * Copyright (C) 1999-2000 Harri Porten (porten@kde.org) - * Copyright (C) 2003, 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2003, 2007, 2008, 2009 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -88,7 +88,7 @@ namespace JSC { virtual bool deleteProperty(ExecState*, const Identifier& propertyName); virtual bool deleteProperty(ExecState*, unsigned propertyName); virtual void getPropertyNames(ExecState*, PropertyNameArray&); - virtual void mark(); + virtual void markChildren(MarkStack&); void* lazyCreationData(); void setLazyCreationData(void*); diff --git a/JavaScriptCore/runtime/JSByteArray.h b/JavaScriptCore/runtime/JSByteArray.h index 57374e0..a56aca6 100644 --- a/JavaScriptCore/runtime/JSByteArray.h +++ b/JavaScriptCore/runtime/JSByteArray.h @@ -33,7 +33,7 @@ namespace JSC { class JSByteArray : public JSObject { - friend class VPtrSet; + friend struct VPtrSet; public: bool canAccessIndex(unsigned i) { return i < m_storage->length(); } JSValue getIndex(ExecState* exec, unsigned i) diff --git a/JavaScriptCore/runtime/JSCell.cpp b/JavaScriptCore/runtime/JSCell.cpp index 8cf7943..c733ed9 100644 --- a/JavaScriptCore/runtime/JSCell.cpp +++ b/JavaScriptCore/runtime/JSCell.cpp @@ -90,16 +90,6 @@ bool JSCell::getUInt32(uint32_t&) const return false; } -bool JSCell::getTruncatedInt32(int32_t&) const -{ - return false; -} - -bool JSCell::getTruncatedUInt32(uint32_t&) const -{ - return false; -} - bool JSCell::getString(UString&stringValue) const { if (!isString()) diff --git a/JavaScriptCore/runtime/JSCell.h b/JavaScriptCore/runtime/JSCell.h index e0a9b4d..75ccf7f 100644 --- a/JavaScriptCore/runtime/JSCell.h +++ b/JavaScriptCore/runtime/JSCell.h @@ -1,7 +1,7 @@ /* * Copyright (C) 1999-2001 Harri Porten (porten@kde.org) * Copyright (C) 2001 Peter Kelly (pmk@post.com) - * Copyright (C) 2003, 2004, 2005, 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -31,7 +31,7 @@ namespace JSC { - class JSCell : Noncopyable { + class JSCell : public NoncopyableCustomAllocated { friend class GetterSetter; friend class Heap; friend class JIT; @@ -40,7 +40,8 @@ namespace JSC { friend class JSPropertyNameIterator; friend class JSString; friend class JSValue; - friend class VPtrSet; + friend class JSAPIValueWrapper; + friend struct VPtrSet; private: explicit JSCell(Structure*); @@ -48,11 +49,14 @@ namespace JSC { public: // Querying the type. +#if USE(JSVALUE32) bool isNumber() const; +#endif bool isString() const; bool isObject() const; virtual bool isGetterSetter() const; virtual bool isObject(const ClassInfo*) const; + virtual bool isAPIValueWrapper() const { return false; } Structure* structure() const; @@ -68,8 +72,6 @@ namespace JSC { // Extracting integer values. // FIXME: remove these methods, can check isNumberCell in JSValue && then call asNumberCell::*. virtual bool getUInt32(uint32_t&) const; - virtual bool getTruncatedInt32(int32_t&) const; - virtual bool getTruncatedUInt32(uint32_t&) const; // Basic conversions. virtual JSValue toPrimitive(ExecState*, PreferredPrimitiveType) const = 0; @@ -83,7 +85,9 @@ namespace JSC { void* operator new(size_t, ExecState*); void* operator new(size_t, JSGlobalData*); void* operator new(size_t, void* placementNewDestination) { return placementNewDestination; } - virtual void mark(); + + void markCellDirect(); + virtual void markChildren(MarkStack&); bool marked() const; // Object operations, with the toObject operation included. @@ -124,10 +128,12 @@ namespace JSC { { } +#if USE(JSVALUE32) inline bool JSCell::isNumber() const { return Heap::isNumber(const_cast<JSCell*>(this)); } +#endif inline bool JSCell::isObject() const { @@ -149,15 +155,14 @@ namespace JSC { return Heap::isCellMarked(this); } - inline void JSCell::mark() + inline void JSCell::markCellDirect() { - return Heap::markCell(this); + Heap::markCell(this); } - ALWAYS_INLINE JSCell* JSValue::asCell() const + inline void JSCell::markChildren(MarkStack&) { - ASSERT(isCell()); - return m_ptr; + ASSERT(marked()); } inline void* JSCell::operator new(size_t size, JSGlobalData* globalData) @@ -173,128 +178,231 @@ namespace JSC { inline bool JSValue::isString() const { - return !JSImmediate::isImmediate(asValue()) && asCell()->isString(); + return isCell() && asCell()->isString(); } inline bool JSValue::isGetterSetter() const { - return !JSImmediate::isImmediate(asValue()) && asCell()->isGetterSetter(); + return isCell() && asCell()->isGetterSetter(); } inline bool JSValue::isObject() const { - return !JSImmediate::isImmediate(asValue()) && asCell()->isObject(); + return isCell() && asCell()->isObject(); } inline bool JSValue::getString(UString& s) const { - return !JSImmediate::isImmediate(asValue()) && asCell()->getString(s); + return isCell() && asCell()->getString(s); } inline UString JSValue::getString() const { - return JSImmediate::isImmediate(asValue()) ? UString() : asCell()->getString(); + return isCell() ? asCell()->getString() : UString(); } inline JSObject* JSValue::getObject() const { - return JSImmediate::isImmediate(asValue()) ? 0 : asCell()->getObject(); + return isCell() ? asCell()->getObject() : 0; } inline CallType JSValue::getCallData(CallData& callData) { - return JSImmediate::isImmediate(asValue()) ? CallTypeNone : asCell()->getCallData(callData); + return isCell() ? asCell()->getCallData(callData) : CallTypeNone; } inline ConstructType JSValue::getConstructData(ConstructData& constructData) { - return JSImmediate::isImmediate(asValue()) ? ConstructTypeNone : asCell()->getConstructData(constructData); + return isCell() ? asCell()->getConstructData(constructData) : ConstructTypeNone; } ALWAYS_INLINE bool JSValue::getUInt32(uint32_t& v) const { - return JSImmediate::isImmediate(asValue()) ? JSImmediate::getUInt32(asValue(), v) : asCell()->getUInt32(v); + if (isInt32()) { + int32_t i = asInt32(); + v = static_cast<uint32_t>(i); + return i >= 0; + } + if (isDouble()) { + double d = asDouble(); + v = static_cast<uint32_t>(d); + return v == d; + } + return false; } - ALWAYS_INLINE bool JSValue::getTruncatedInt32(int32_t& v) const + inline void JSValue::markDirect() { - return JSImmediate::isImmediate(asValue()) ? JSImmediate::getTruncatedInt32(asValue(), v) : asCell()->getTruncatedInt32(v); + ASSERT(!marked()); + asCell()->markCellDirect(); } - inline bool JSValue::getTruncatedUInt32(uint32_t& v) const + inline void JSValue::markChildren(MarkStack& markStack) { - return JSImmediate::isImmediate(asValue()) ? JSImmediate::getTruncatedUInt32(asValue(), v) : asCell()->getTruncatedUInt32(v); + ASSERT(marked()); + asCell()->markChildren(markStack); } - inline void JSValue::mark() + inline bool JSValue::marked() const { - asCell()->mark(); // callers should check !marked() before calling mark(), so this should only be called with cells + return !isCell() || asCell()->marked(); } - inline bool JSValue::marked() const +#if !USE(JSVALUE32_64) + ALWAYS_INLINE JSCell* JSValue::asCell() const { - return JSImmediate::isImmediate(asValue()) || asCell()->marked(); + ASSERT(isCell()); + return m_ptr; } +#endif // !USE(JSVALUE32_64) inline JSValue JSValue::toPrimitive(ExecState* exec, PreferredPrimitiveType preferredType) const { - return JSImmediate::isImmediate(asValue()) ? asValue() : asCell()->toPrimitive(exec, preferredType); + return isCell() ? asCell()->toPrimitive(exec, preferredType) : asValue(); } inline bool JSValue::getPrimitiveNumber(ExecState* exec, double& number, JSValue& value) { - if (JSImmediate::isImmediate(asValue())) { - number = JSImmediate::toDouble(asValue()); - value = asValue(); + if (isInt32()) { + number = asInt32(); + value = *this; + return true; + } + if (isDouble()) { + number = asDouble(); + value = *this; + return true; + } + if (isCell()) + return asCell()->getPrimitiveNumber(exec, number, value); + if (isTrue()) { + number = 1.0; + value = *this; + return true; + } + if (isFalse() || isNull()) { + number = 0.0; + value = *this; return true; } - return asCell()->getPrimitiveNumber(exec, number, value); + ASSERT(isUndefined()); + number = nonInlineNaN(); + value = *this; + return true; } inline bool JSValue::toBoolean(ExecState* exec) const { - return JSImmediate::isImmediate(asValue()) ? JSImmediate::toBoolean(asValue()) : asCell()->toBoolean(exec); + if (isInt32()) + return asInt32() != 0; + if (isDouble()) + return asDouble() > 0.0 || asDouble() < 0.0; // false for NaN + if (isCell()) + return asCell()->toBoolean(exec); + return isTrue(); // false, null, and undefined all convert to false. } ALWAYS_INLINE double JSValue::toNumber(ExecState* exec) const { - return JSImmediate::isImmediate(asValue()) ? JSImmediate::toDouble(asValue()) : asCell()->toNumber(exec); + if (isInt32()) + return asInt32(); + if (isDouble()) + return asDouble(); + if (isCell()) + return asCell()->toNumber(exec); + if (isTrue()) + return 1.0; + return isUndefined() ? nonInlineNaN() : 0; // null and false both convert to 0. } inline UString JSValue::toString(ExecState* exec) const { - return JSImmediate::isImmediate(asValue()) ? JSImmediate::toString(asValue()) : asCell()->toString(exec); - } - - inline JSObject* JSValue::toObject(ExecState* exec) const - { - return JSImmediate::isImmediate(asValue()) ? JSImmediate::toObject(asValue(), exec) : asCell()->toObject(exec); - } - - inline JSObject* JSValue::toThisObject(ExecState* exec) const - { - if (UNLIKELY(JSImmediate::isImmediate(asValue()))) - return JSImmediate::toThisObject(asValue(), exec); - return asCell()->toThisObject(exec); + if (isCell()) + return asCell()->toString(exec); + if (isInt32()) + return UString::from(asInt32()); + if (isDouble()) + return asDouble() == 0.0 ? "0" : UString::from(asDouble()); + if (isTrue()) + return "true"; + if (isFalse()) + return "false"; + if (isNull()) + return "null"; + ASSERT(isUndefined()); + return "undefined"; } inline bool JSValue::needsThisConversion() const { - if (UNLIKELY(JSImmediate::isImmediate(asValue()))) + if (UNLIKELY(!isCell())) return true; return asCell()->structure()->typeInfo().needsThisConversion(); } inline UString JSValue::toThisString(ExecState* exec) const { - return JSImmediate::isImmediate(asValue()) ? JSImmediate::toString(asValue()) : asCell()->toThisString(exec); + return isCell() ? asCell()->toThisString(exec) : toString(exec); } inline JSValue JSValue::getJSNumber() { - return JSImmediate::isNumber(asValue()) ? asValue() : JSImmediate::isImmediate(asValue()) ? JSValue() : asCell()->getJSNumber(); + if (isInt32() || isDouble()) + return *this; + if (isCell()) + return asCell()->getJSNumber(); + return JSValue(); + } + + inline bool JSValue::hasChildren() const + { + return asCell()->structure()->typeInfo().type() >= CompoundType; + } + + + inline JSObject* JSValue::toObject(ExecState* exec) const + { + return isCell() ? asCell()->toObject(exec) : toObjectSlowCase(exec); } + inline JSObject* JSValue::toThisObject(ExecState* exec) const + { + return isCell() ? asCell()->toThisObject(exec) : toThisObjectSlowCase(exec); + } + + ALWAYS_INLINE void MarkStack::append(JSCell* cell) + { + ASSERT(cell); + if (cell->marked()) + return; + cell->markCellDirect(); + if (cell->structure()->typeInfo().type() >= CompoundType) + m_values.append(cell); + } + + inline void MarkStack::drain() { + while (!m_markSets.isEmpty() || !m_values.isEmpty()) { + while ((!m_markSets.isEmpty()) && m_values.size() < 50) { + const MarkSet& current = m_markSets.removeLast(); + JSValue* ptr = current.m_values; + JSValue* end = current.m_end; + if (current.m_properties == NoNullValues) { + while (ptr != end) + append(*ptr++); + } else { + while (ptr != end) { + if (JSValue value = *ptr++) + append(value); + } + } + } + while (!m_values.isEmpty()) { + JSCell* current = m_values.removeLast(); + ASSERT(current->marked()); + current->markChildren(*this); + } + } + } } // namespace JSC #endif // JSCell_h diff --git a/JavaScriptCore/runtime/JSFunction.cpp b/JavaScriptCore/runtime/JSFunction.cpp index f456451..84c6263 100644 --- a/JavaScriptCore/runtime/JSFunction.cpp +++ b/JavaScriptCore/runtime/JSFunction.cpp @@ -1,7 +1,7 @@ /* * Copyright (C) 1999-2002 Harri Porten (porten@kde.org) * Copyright (C) 2001 Peter Kelly (pmk@post.com) - * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. * Copyright (C) 2007 Cameron Zwarich (cwzwarich@uwaterloo.ca) * Copyright (C) 2007 Maks Orlovich * @@ -48,7 +48,7 @@ const ClassInfo JSFunction::info = { "Function", &InternalFunction::info, 0, 0 } JSFunction::JSFunction(ExecState* exec, PassRefPtr<Structure> structure, int length, const Identifier& name, NativeFunction func) : Base(&exec->globalData(), structure, name) #if ENABLE(JIT) - , m_body(exec->globalData().nativeFunctionThunk()) + , m_body(FunctionBodyNode::createNativeThunk(&exec->globalData())) #else , m_body(0) #endif @@ -72,26 +72,23 @@ JSFunction::JSFunction(ExecState* exec, const Identifier& name, FunctionBodyNode JSFunction::~JSFunction() { -#if ENABLE(JIT) // JIT code for other functions may have had calls linked directly to the code for this function; these links // are based on a check for the this pointer value for this JSFunction - which will no longer be valid once // this memory is freed and may be reused (potentially for another, different JSFunction). - if (!isHostFunction()) { - if (m_body && m_body->isGenerated()) - m_body->generatedBytecode().unlinkCallers(); - scopeChain().~ScopeChain(); - } - +#if ENABLE(JIT_OPTIMIZE_CALL) + if (m_body && m_body->isGenerated()) + m_body->generatedBytecode().unlinkCallers(); #endif + if (!isHostFunction()) + scopeChain().~ScopeChain(); // FIXME: Don't we need to do this in the interpreter too? } -void JSFunction::mark() +void JSFunction::markChildren(MarkStack& markStack) { - Base::mark(); - if (!isHostFunction()) { - m_body->mark(); - scopeChain().mark(); - } + Base::markChildren(markStack); + m_body->markAggregate(markStack); + if (!isHostFunction()) + scopeChain().markAggregate(markStack); } CallType JSFunction::getCallData(CallData& callData) diff --git a/JavaScriptCore/runtime/JSFunction.h b/JavaScriptCore/runtime/JSFunction.h index b27e515..cab1e5b 100644 --- a/JavaScriptCore/runtime/JSFunction.h +++ b/JavaScriptCore/runtime/JSFunction.h @@ -39,7 +39,7 @@ namespace JSC { class JSFunction : public InternalFunction { friend class JIT; - friend class VPtrSet; + friend struct VPtrSet; typedef InternalFunction Base; @@ -68,7 +68,7 @@ namespace JSC { void setBody(PassRefPtr<FunctionBodyNode> body) { m_body = body; } FunctionBodyNode* body() const { return m_body.get(); } - virtual void mark(); + virtual void markChildren(MarkStack&); static JS_EXPORTDATA const ClassInfo info; diff --git a/JavaScriptCore/runtime/JSGlobalData.cpp b/JavaScriptCore/runtime/JSGlobalData.cpp index 1594848..03df41d 100644 --- a/JavaScriptCore/runtime/JSGlobalData.cpp +++ b/JavaScriptCore/runtime/JSGlobalData.cpp @@ -33,14 +33,17 @@ #include "Collector.h" #include "CommonIdentifiers.h" #include "FunctionConstructor.h" +#include "GetterSetter.h" #include "Interpreter.h" #include "JSActivation.h" +#include "JSAPIValueWrapper.h" #include "JSArray.h" #include "JSByteArray.h" #include "JSClassRef.h" #include "JSFunction.h" #include "JSLock.h" #include "JSNotAnObject.h" +#include "JSPropertyNameIterator.h" #include "JSStaticScopeObject.h" #include "Parser.h" #include "Lexer.h" @@ -59,13 +62,14 @@ using namespace WTF; namespace JSC { -extern const HashTable arrayTable; -extern const HashTable dateTable; -extern const HashTable mathTable; -extern const HashTable numberTable; -extern const HashTable regExpTable; -extern const HashTable regExpConstructorTable; -extern const HashTable stringTable; +extern JSC_CONST_HASHTABLE HashTable arrayTable; +extern JSC_CONST_HASHTABLE HashTable jsonTable; +extern JSC_CONST_HASHTABLE HashTable dateTable; +extern JSC_CONST_HASHTABLE HashTable mathTable; +extern JSC_CONST_HASHTABLE HashTable numberTable; +extern JSC_CONST_HASHTABLE HashTable regExpTable; +extern JSC_CONST_HASHTABLE HashTable regExpConstructorTable; +extern JSC_CONST_HASHTABLE HashTable stringTable; struct VPtrSet { VPtrSet(); @@ -105,6 +109,7 @@ JSGlobalData::JSGlobalData(bool isShared, const VPtrSet& vptrSet) , clientData(0) , arrayTable(fastNew<HashTable>(JSC::arrayTable)) , dateTable(fastNew<HashTable>(JSC::dateTable)) + , jsonTable(fastNew<HashTable>(JSC::jsonTable)) , mathTable(fastNew<HashTable>(JSC::mathTable)) , numberTable(fastNew<HashTable>(JSC::numberTable)) , regExpTable(fastNew<HashTable>(JSC::regExpTable)) @@ -116,7 +121,10 @@ JSGlobalData::JSGlobalData(bool isShared, const VPtrSet& vptrSet) , stringStructure(JSString::createStructure(jsNull())) , notAnObjectErrorStubStructure(JSNotAnObjectErrorStub::createStructure(jsNull())) , notAnObjectStructure(JSNotAnObject::createStructure(jsNull())) -#if !USE(ALTERNATE_JSIMMEDIATE) + , propertyNameIteratorStructure(JSPropertyNameIterator::createStructure(jsNull())) + , getterSetterStructure(GetterSetter::createStructure(jsNull())) + , apiWrapperStructure(JSAPIValueWrapper::createStructure(jsNull())) +#if USE(JSVALUE32) , numberStructure(JSNumberCell::createStructure(jsNull())) #endif , jsArrayVPtr(vptrSet.jsArrayVPtr) @@ -137,6 +145,7 @@ JSGlobalData::JSGlobalData(bool isShared, const VPtrSet& vptrSet) , head(0) , dynamicGlobalObject(0) , scopeNodeBeingReparsed(0) + , firstStringifierToMark(0) { #if PLATFORM(MAC) startProfilerServerIfNeeded(); @@ -155,17 +164,16 @@ JSGlobalData::~JSGlobalData() arrayTable->deleteTable(); dateTable->deleteTable(); + jsonTable->deleteTable(); mathTable->deleteTable(); numberTable->deleteTable(); regExpTable->deleteTable(); regExpConstructorTable->deleteTable(); stringTable->deleteTable(); -#if ENABLE(JIT) - lazyNativeFunctionThunk.clear(); -#endif fastDelete(const_cast<HashTable*>(arrayTable)); fastDelete(const_cast<HashTable*>(dateTable)); + fastDelete(const_cast<HashTable*>(jsonTable)); fastDelete(const_cast<HashTable*>(mathTable)); fastDelete(const_cast<HashTable*>(numberTable)); fastDelete(const_cast<HashTable*>(regExpTable)); @@ -222,15 +230,6 @@ JSGlobalData*& JSGlobalData::sharedInstanceInternal() return sharedInstance; } -#if ENABLE(JIT) - -void JSGlobalData::createNativeThunk() -{ - lazyNativeFunctionThunk = FunctionBodyNode::createNativeThunk(this); -} - -#endif - // FIXME: We can also detect forms like v1 < v2 ? -1 : 0, reverse comparison, etc. const Vector<Instruction>& JSGlobalData::numericCompareFunction(ExecState* exec) { diff --git a/JavaScriptCore/runtime/JSGlobalData.h b/JavaScriptCore/runtime/JSGlobalData.h index e53746b..88cb516 100644 --- a/JavaScriptCore/runtime/JSGlobalData.h +++ b/JavaScriptCore/runtime/JSGlobalData.h @@ -33,6 +33,7 @@ #include "ExecutableAllocator.h" #include "JITStubs.h" #include "JSValue.h" +#include "MarkStack.h" #include "SmallStrings.h" #include "TimeoutChecker.h" #include <wtf/Forward.h> @@ -47,16 +48,18 @@ namespace JSC { class CommonIdentifiers; class FunctionBodyNode; class IdentifierTable; - class Instruction; class Interpreter; class JSGlobalObject; class JSObject; class Lexer; class Parser; class ScopeNode; + class Stringifier; class Structure; class UString; + struct HashTable; + struct Instruction; struct VPtrSet; class JSGlobalData : public RefCounted<JSGlobalData> { @@ -82,6 +85,7 @@ namespace JSC { const HashTable* arrayTable; const HashTable* dateTable; + const HashTable* jsonTable; const HashTable* mathTable; const HashTable* numberTable; const HashTable* regExpTable; @@ -94,7 +98,11 @@ namespace JSC { RefPtr<Structure> stringStructure; RefPtr<Structure> notAnObjectErrorStubStructure; RefPtr<Structure> notAnObjectStructure; -#if !USE(ALTERNATE_JSIMMEDIATE) + RefPtr<Structure> propertyNameIteratorStructure; + RefPtr<Structure> getterSetterStructure; + RefPtr<Structure> apiWrapperStructure; + +#if USE(JSVALUE32) RefPtr<Structure> numberStructure; #endif @@ -117,20 +125,13 @@ namespace JSC { Interpreter* interpreter; #if ENABLE(JIT) JITThunks jitStubs; - FunctionBodyNode* nativeFunctionThunk() - { - if (!lazyNativeFunctionThunk) - createNativeThunk(); - return lazyNativeFunctionThunk.get(); - } - RefPtr<FunctionBodyNode> lazyNativeFunctionThunk; #endif TimeoutChecker timeoutChecker; Heap heap; JSValue exception; #if ENABLE(JIT) - void* exceptionLocation; + ReturnAddressPtr exceptionLocation; #endif const Vector<Instruction>& numericCompareFunction(ExecState*); @@ -145,7 +146,9 @@ namespace JSC { HashSet<JSObject*> arrayVisitedElements; ScopeNode* scopeNodeBeingReparsed; + Stringifier* firstStringifierToMark; + MarkStack markStack; private: JSGlobalData(bool isShared, const VPtrSet&); static JSGlobalData*& sharedInstanceInternal(); diff --git a/JavaScriptCore/runtime/JSGlobalObject.cpp b/JavaScriptCore/runtime/JSGlobalObject.cpp index 1e9f670..a90f18f 100644 --- a/JavaScriptCore/runtime/JSGlobalObject.cpp +++ b/JavaScriptCore/runtime/JSGlobalObject.cpp @@ -50,6 +50,7 @@ #include "JSFunction.h" #include "JSGlobalObjectFunctions.h" #include "JSLock.h" +#include "JSONObject.h" #include "Interpreter.h" #include "MathObject.h" #include "NativeErrorConstructor.h" @@ -79,16 +80,16 @@ static const int initialTickCountThreshold = 255; // Preferred number of milliseconds between each timeout check static const int preferredScriptCheckTimeInterval = 1000; -static inline void markIfNeeded(JSValue v) +static inline void markIfNeeded(MarkStack& markStack, JSValue v) { - if (v && !v.marked()) - v.mark(); + if (v) + markStack.append(v); } -static inline void markIfNeeded(const RefPtr<Structure>& s) +static inline void markIfNeeded(MarkStack& markStack, const RefPtr<Structure>& s) { if (s) - s->mark(); + s->markAggregate(markStack); } JSGlobalObject::~JSGlobalObject() @@ -255,7 +256,7 @@ void JSGlobalObject::reset(JSValue prototype) // Constructors - JSCell* objectConstructor = new (exec) ObjectConstructor(exec, ObjectConstructor::createStructure(d()->functionPrototype), d()->objectPrototype); + JSCell* objectConstructor = new (exec) ObjectConstructor(exec, ObjectConstructor::createStructure(d()->functionPrototype), d()->objectPrototype, d()->prototypeFunctionStructure.get()); JSCell* functionConstructor = new (exec) FunctionConstructor(exec, FunctionConstructor::createStructure(d()->functionPrototype), d()->functionPrototype); JSCell* arrayConstructor = new (exec) ArrayConstructor(exec, ArrayConstructor::createStructure(d()->functionPrototype), d()->arrayPrototype); JSCell* stringConstructor = new (exec) StringConstructor(exec, StringConstructor::createStructure(d()->functionPrototype), d()->prototypeFunctionStructure.get(), d()->stringPrototype); @@ -318,7 +319,8 @@ void JSGlobalObject::reset(JSValue prototype) GlobalPropertyInfo(Identifier(exec, "Math"), new (exec) MathObject(exec, MathObject::createStructure(d()->objectPrototype)), DontEnum | DontDelete), GlobalPropertyInfo(Identifier(exec, "NaN"), jsNaN(exec), DontEnum | DontDelete), GlobalPropertyInfo(Identifier(exec, "Infinity"), jsNumber(exec, Inf), DontEnum | DontDelete), - GlobalPropertyInfo(Identifier(exec, "undefined"), jsUndefined(), DontEnum | DontDelete) + GlobalPropertyInfo(Identifier(exec, "undefined"), jsUndefined(), DontEnum | DontDelete), + GlobalPropertyInfo(Identifier(exec, "JSON"), new (exec) JSONObject(JSONObject::createStructure(d()->objectPrototype)), DontEnum | DontDelete) }; addStaticGlobals(staticGlobals, sizeof(staticGlobals) / sizeof(GlobalPropertyInfo)); @@ -355,43 +357,43 @@ void JSGlobalObject::resetPrototype(JSValue prototype) oldLastInPrototypeChain->setPrototype(objectPrototype); } -void JSGlobalObject::mark() +void JSGlobalObject::markChildren(MarkStack& markStack) { - JSVariableObject::mark(); + JSVariableObject::markChildren(markStack); HashSet<ProgramCodeBlock*>::const_iterator end = codeBlocks().end(); for (HashSet<ProgramCodeBlock*>::const_iterator it = codeBlocks().begin(); it != end; ++it) - (*it)->mark(); + (*it)->markAggregate(markStack); RegisterFile& registerFile = globalData()->interpreter->registerFile(); if (registerFile.globalObject() == this) - registerFile.markGlobals(&globalData()->heap); - - markIfNeeded(d()->regExpConstructor); - markIfNeeded(d()->errorConstructor); - markIfNeeded(d()->evalErrorConstructor); - markIfNeeded(d()->rangeErrorConstructor); - markIfNeeded(d()->referenceErrorConstructor); - markIfNeeded(d()->syntaxErrorConstructor); - markIfNeeded(d()->typeErrorConstructor); - markIfNeeded(d()->URIErrorConstructor); - - markIfNeeded(d()->evalFunction); - markIfNeeded(d()->callFunction); - markIfNeeded(d()->applyFunction); - - markIfNeeded(d()->objectPrototype); - markIfNeeded(d()->functionPrototype); - markIfNeeded(d()->arrayPrototype); - markIfNeeded(d()->booleanPrototype); - markIfNeeded(d()->stringPrototype); - markIfNeeded(d()->numberPrototype); - markIfNeeded(d()->datePrototype); - markIfNeeded(d()->regExpPrototype); - - markIfNeeded(d()->methodCallDummy); - - markIfNeeded(d()->errorStructure); + registerFile.markGlobals(markStack, &globalData()->heap); + + markIfNeeded(markStack, d()->regExpConstructor); + markIfNeeded(markStack, d()->errorConstructor); + markIfNeeded(markStack, d()->evalErrorConstructor); + markIfNeeded(markStack, d()->rangeErrorConstructor); + markIfNeeded(markStack, d()->referenceErrorConstructor); + markIfNeeded(markStack, d()->syntaxErrorConstructor); + markIfNeeded(markStack, d()->typeErrorConstructor); + markIfNeeded(markStack, d()->URIErrorConstructor); + + markIfNeeded(markStack, d()->evalFunction); + markIfNeeded(markStack, d()->callFunction); + markIfNeeded(markStack, d()->applyFunction); + + markIfNeeded(markStack, d()->objectPrototype); + markIfNeeded(markStack, d()->functionPrototype); + markIfNeeded(markStack, d()->arrayPrototype); + markIfNeeded(markStack, d()->booleanPrototype); + markIfNeeded(markStack, d()->stringPrototype); + markIfNeeded(markStack, d()->numberPrototype); + markIfNeeded(markStack, d()->datePrototype); + markIfNeeded(markStack, d()->regExpPrototype); + + markIfNeeded(markStack, d()->methodCallDummy); + + markIfNeeded(markStack, d()->errorStructure); // No need to mark the other structures, because their prototypes are all // guaranteed to be referenced elsewhere. @@ -401,11 +403,7 @@ void JSGlobalObject::mark() return; size_t size = d()->registerArraySize; - for (size_t i = 0; i < size; ++i) { - Register& r = registerArray[i]; - if (!r.marked()) - r.mark(); - } + markStack.appendValues(reinterpret_cast<JSValue*>(registerArray), size); } ExecState* JSGlobalObject::globalExec() diff --git a/JavaScriptCore/runtime/JSGlobalObject.h b/JavaScriptCore/runtime/JSGlobalObject.h index da9a819..cda49bd 100644 --- a/JavaScriptCore/runtime/JSGlobalObject.h +++ b/JavaScriptCore/runtime/JSGlobalObject.h @@ -1,6 +1,6 @@ /* * Copyright (C) 2007 Eric Seidel <eric@webkit.org> - * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -166,10 +166,10 @@ namespace JSC { public: virtual ~JSGlobalObject(); - virtual void mark(); + virtual void markChildren(MarkStack&); virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&); - virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&, bool& slotIsWriteable); + virtual bool hasOwnPropertyForWrite(ExecState*, const Identifier&); virtual void put(ExecState*, const Identifier&, JSValue, PutPropertySlot&); virtual void putWithAttributes(ExecState*, const Identifier& propertyName, JSValue value, unsigned attributes); @@ -325,10 +325,12 @@ namespace JSC { return symbolTableGet(propertyName, slot); } - inline bool JSGlobalObject::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot, bool& slotIsWriteable) + inline bool JSGlobalObject::hasOwnPropertyForWrite(ExecState* exec, const Identifier& propertyName) { - if (JSVariableObject::getOwnPropertySlotForWrite(exec, propertyName, slot, slotIsWriteable)) + PropertySlot slot; + if (JSVariableObject::getOwnPropertySlot(exec, propertyName, slot)) return true; + bool slotIsWriteable; return symbolTableGet(propertyName, slot, slotIsWriteable); } @@ -345,11 +347,16 @@ namespace JSC { if (typeInfo().type() == ObjectType) return m_prototype; +#if USE(JSVALUE32) if (typeInfo().type() == StringType) return exec->lexicalGlobalObject()->stringPrototype(); ASSERT(typeInfo().type() == NumberType); return exec->lexicalGlobalObject()->numberPrototype(); +#else + ASSERT(typeInfo().type() == StringType); + return exec->lexicalGlobalObject()->stringPrototype(); +#endif } inline StructureChain* Structure::prototypeChain(ExecState* exec) const @@ -389,7 +396,7 @@ namespace JSC { return globalData().dynamicGlobalObject; } - class DynamicGlobalObjectScope : Noncopyable { + class DynamicGlobalObjectScope : public Noncopyable { public: DynamicGlobalObjectScope(CallFrame* callFrame, JSGlobalObject* dynamicGlobalObject) : m_dynamicGlobalObjectSlot(callFrame->globalData().dynamicGlobalObject) diff --git a/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp b/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp index b013957..affb99c 100644 --- a/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp +++ b/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp @@ -282,7 +282,7 @@ JSValue JSC_HOST_CALL globalFuncEval(ExecState* exec, JSObject* function, JSValu UString s = x.toString(exec); - LiteralParser preparser(exec, s); + LiteralParser preparser(exec, s, LiteralParser::NonStrictJSON); if (JSValue parsedObject = preparser.tryLiteralParse()) return parsedObject; @@ -303,14 +303,18 @@ JSValue JSC_HOST_CALL globalFuncParseInt(ExecState* exec, JSObject*, JSValue, co JSValue value = args.at(0); int32_t radix = args.at(1).toInt32(exec); - if (value.isNumber() && (radix == 0 || radix == 10)) { - if (value.isInt32Fast()) - return value; - double d = value.uncheckedGetNumber(); + if (radix != 0 && radix != 10) + return jsNumber(exec, parseInt(value.toString(exec), radix)); + + if (value.isInt32()) + return value; + + if (value.isDouble()) { + double d = value.asDouble(); if (isfinite(d)) return jsNumber(exec, (d > 0) ? floor(d) : ceil(d)); if (isnan(d) || isinf(d)) - return jsNaN(&exec->globalData()); + return jsNaN(exec); return jsNumber(exec, 0); } diff --git a/JavaScriptCore/runtime/JSImmediate.cpp b/JavaScriptCore/runtime/JSImmediate.cpp index 201e56c..846238d 100644 --- a/JavaScriptCore/runtime/JSImmediate.cpp +++ b/JavaScriptCore/runtime/JSImmediate.cpp @@ -21,83 +21,6 @@ #include "config.h" #include "JSImmediate.h" -#include "BooleanConstructor.h" -#include "BooleanPrototype.h" -#include "Error.h" -#include "ExceptionHelpers.h" -#include "JSGlobalObject.h" -#include "JSNotAnObject.h" -#include "NumberConstructor.h" -#include "NumberPrototype.h" - namespace JSC { -JSObject* JSImmediate::toThisObject(JSValue v, ExecState* exec) -{ - ASSERT(isImmediate(v)); - if (isNumber(v)) - return constructNumber(exec, v); - if (isBoolean(v)) - return constructBooleanFromImmediateBoolean(exec, v); - ASSERT(v.isUndefinedOrNull()); - return exec->globalThisValue(); -} - -JSObject* JSImmediate::toObject(JSValue v, ExecState* exec) -{ - ASSERT(isImmediate(v)); - if (isNumber(v)) - return constructNumber(exec, v); - if (isBoolean(v)) - return constructBooleanFromImmediateBoolean(exec, v); - - JSNotAnObjectErrorStub* exception = createNotAnObjectErrorStub(exec, v.isNull()); - exec->setException(exception); - return new (exec) JSNotAnObject(exec, exception); -} - -JSObject* JSImmediate::prototype(JSValue v, ExecState* exec) -{ - ASSERT(isImmediate(v)); - if (isNumber(v)) - return exec->lexicalGlobalObject()->numberPrototype(); - if (isBoolean(v)) - return exec->lexicalGlobalObject()->booleanPrototype(); - - JSNotAnObjectErrorStub* exception = createNotAnObjectErrorStub(exec, v.isNull()); - exec->setException(exception); - return new (exec) JSNotAnObject(exec, exception); -} - -UString JSImmediate::toString(JSValue v) -{ - ASSERT(isImmediate(v)); - if (isIntegerNumber(v)) - return UString::from(getTruncatedInt32(v)); -#if USE(ALTERNATE_JSIMMEDIATE) - if (isNumber(v)) { - ASSERT(isDoubleNumber(v)); - double value = doubleValue(v); - if (value == 0.0) // +0.0 or -0.0 - return "0"; - return UString::from(value); - } -#else - ASSERT(!isNumber(v)); -#endif - if (jsBoolean(false) == v) - return "false"; - if (jsBoolean(true) == v) - return "true"; - if (v.isNull()) - return "null"; - ASSERT(v.isUndefined()); - return "undefined"; -} - -NEVER_INLINE double JSImmediate::nonInlineNaN() -{ - return std::numeric_limits<double>::quiet_NaN(); -} - } // namespace JSC diff --git a/JavaScriptCore/runtime/JSImmediate.h b/JavaScriptCore/runtime/JSImmediate.h index 706396e..4ed35fc 100644 --- a/JavaScriptCore/runtime/JSImmediate.h +++ b/JavaScriptCore/runtime/JSImmediate.h @@ -22,6 +22,10 @@ #ifndef JSImmediate_h #define JSImmediate_h +#include <wtf/Platform.h> + +#if !USE(JSVALUE32_64) + #include <wtf/Assertions.h> #include <wtf/AlwaysInline.h> #include <wtf/MathExtras.h> @@ -42,7 +46,7 @@ namespace JSC { class JSObject; class UString; -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) inline intptr_t reinterpretDoubleToIntptr(double value) { return WTF::bitwise_cast<intptr_t>(value); @@ -98,7 +102,7 @@ namespace JSC { /* * On 64-bit platforms, we support an alternative encoding form for immediates, if - * USE(ALTERNATE_JSIMMEDIATE) is defined. When this format is used, double precision + * USE(JSVALUE64) is defined. When this format is used, double precision * floating point values may also be encoded as JSImmediates. * * The encoding makes use of unused NaN space in the IEEE754 representation. Any value @@ -155,7 +159,7 @@ namespace JSC { friend JSValue jsNumber(JSGlobalData* globalData, long long i); friend JSValue jsNumber(JSGlobalData* globalData, unsigned long long i); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) // If all bits in the mask are set, this indicates an integer number, // if any but not all are set this value is a double precision number. static const intptr_t TagTypeNumber = 0xffff000000000000ll; @@ -177,7 +181,7 @@ namespace JSC { static const intptr_t FullTagTypeUndefined = TagBitTypeOther | ExtendedTagBitUndefined; static const intptr_t FullTagTypeNull = TagBitTypeOther; -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) static const int32_t IntegerPayloadShift = 0; #else static const int32_t IntegerPayloadShift = 1; @@ -200,15 +204,15 @@ namespace JSC { static ALWAYS_INLINE bool isIntegerNumber(JSValue v) { -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) return (rawValue(v) & TagTypeNumber) == TagTypeNumber; #else return isNumber(v); #endif } -#if USE(ALTERNATE_JSIMMEDIATE) - static ALWAYS_INLINE bool isDoubleNumber(JSValue v) +#if USE(JSVALUE64) + static ALWAYS_INLINE bool isDouble(JSValue v) { return isNumber(v) && !isIntegerNumber(v); } @@ -256,7 +260,7 @@ namespace JSC { static ALWAYS_INLINE bool areBothImmediateIntegerNumbers(JSValue v1, JSValue v2) { -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) return (rawValue(v1) & rawValue(v2) & TagTypeNumber) == TagTypeNumber; #else return rawValue(v1) & rawValue(v2) & TagTypeNumber; @@ -265,9 +269,6 @@ namespace JSC { static double toDouble(JSValue); static bool toBoolean(JSValue); - static JSObject* toObject(JSValue, ExecState*); - static JSObject* toThisObject(JSValue, ExecState*); - static UString toString(JSValue); static bool getUInt32(JSValue, uint32_t&); static bool getTruncatedInt32(JSValue, int32_t&); @@ -283,10 +284,8 @@ namespace JSC { static JSValue zeroImmediate(); static JSValue oneImmediate(); - static JSObject* prototype(JSValue, ExecState*); - private: -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) static const int minImmediateInt = ((-INT_MAX) - 1); static const int maxImmediateInt = INT_MAX; #else @@ -300,10 +299,10 @@ namespace JSC { return JSValue::makeImmediate(integer); } - // With USE(ALTERNATE_JSIMMEDIATE) we want the argument to be zero extended, so the + // With USE(JSVALUE64) we want the argument to be zero extended, so the // integer doesn't interfere with the tag bits in the upper word. In the default encoding, // if intptr_t id larger then int32_t we sign extend the value through the upper word. -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) static ALWAYS_INLINE JSValue makeInt(uint32_t value) #else static ALWAYS_INLINE JSValue makeInt(int32_t value) @@ -312,7 +311,7 @@ namespace JSC { return makeValue((static_cast<intptr_t>(value) << IntegerPayloadShift) | TagTypeNumber); } -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) static ALWAYS_INLINE JSValue makeDouble(double value) { return makeValue(reinterpretDoubleToIntptr(value) + DoubleEncodeOffset); @@ -337,7 +336,7 @@ namespace JSC { template<typename T> static JSValue fromNumberOutsideIntegerRange(T); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) static ALWAYS_INLINE double doubleValue(JSValue v) { return reinterpretIntptrToDouble(rawValue(v) - DoubleEncodeOffset); @@ -363,8 +362,6 @@ namespace JSC { { return v.immediateValue(); } - - static double nonInlineNaN(); }; ALWAYS_INLINE JSValue JSImmediate::trueImmediate() { return makeBool(true); } @@ -374,7 +371,7 @@ namespace JSC { ALWAYS_INLINE JSValue JSImmediate::zeroImmediate() { return makeInt(0); } ALWAYS_INLINE JSValue JSImmediate::oneImmediate() { return makeInt(1); } -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) inline bool doubleToBoolean(double value) { return value < 0.0 || value > 0.0; @@ -401,7 +398,7 @@ namespace JSC { return intValue(v); } -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) template<typename T> inline JSValue JSImmediate::fromNumberOutsideIntegerRange(T value) { @@ -442,7 +439,7 @@ namespace JSC { ALWAYS_INLINE JSValue JSImmediate::from(int i) { -#if !USE(ALTERNATE_JSIMMEDIATE) +#if !USE(JSVALUE64) if ((i < minImmediateInt) | (i > maxImmediateInt)) return fromNumberOutsideIntegerRange(i); #endif @@ -508,9 +505,9 @@ namespace JSC { if (isIntegerNumber(v)) return intValue(v); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) if (isNumber(v)) { - ASSERT(isDoubleNumber(v)); + ASSERT(isDouble(v)); return doubleValue(v); } #else @@ -541,12 +538,6 @@ namespace JSC { return getUInt32(v, i); } - // These are identical logic to the JSValue functions above, and faster than jsNumber(number).toInt32(). - int32_t toInt32(double); - uint32_t toUInt32(double); - int32_t toInt32SlowCase(double, bool& ok); - uint32_t toUInt32SlowCase(double, bool& ok); - inline JSValue::JSValue(JSNullTag) { *this = JSImmediate::nullImmediate(); @@ -577,6 +568,16 @@ namespace JSC { return JSImmediate::isBoolean(asValue()); } + inline bool JSValue::isTrue() const + { + return asValue() == JSImmediate::trueImmediate(); + } + + inline bool JSValue::isFalse() const + { + return asValue() == JSImmediate::falseImmediate(); + } + inline bool JSValue::getBoolean(bool& v) const { if (JSImmediate::isBoolean(asValue())) { @@ -592,99 +593,33 @@ namespace JSC { return asValue() == jsBoolean(true); } - ALWAYS_INLINE int32_t JSValue::toInt32(ExecState* exec) const - { - int32_t i; - if (getTruncatedInt32(i)) - return i; - bool ignored; - return toInt32SlowCase(toNumber(exec), ignored); - } - - inline uint32_t JSValue::toUInt32(ExecState* exec) const - { - uint32_t i; - if (getTruncatedUInt32(i)) - return i; - bool ignored; - return toUInt32SlowCase(toNumber(exec), ignored); - } - - inline int32_t toInt32(double val) - { - if (!(val >= -2147483648.0 && val < 2147483648.0)) { - bool ignored; - return toInt32SlowCase(val, ignored); - } - return static_cast<int32_t>(val); - } - - inline uint32_t toUInt32(double val) - { - if (!(val >= 0.0 && val < 4294967296.0)) { - bool ignored; - return toUInt32SlowCase(val, ignored); - } - return static_cast<uint32_t>(val); - } - - inline int32_t JSValue::toInt32(ExecState* exec, bool& ok) const - { - int32_t i; - if (getTruncatedInt32(i)) { - ok = true; - return i; - } - return toInt32SlowCase(toNumber(exec), ok); - } - - inline uint32_t JSValue::toUInt32(ExecState* exec, bool& ok) const - { - uint32_t i; - if (getTruncatedUInt32(i)) { - ok = true; - return i; - } - return toUInt32SlowCase(toNumber(exec), ok); - } - inline bool JSValue::isCell() const { return !JSImmediate::isImmediate(asValue()); } - inline bool JSValue::isInt32Fast() const + inline bool JSValue::isInt32() const { return JSImmediate::isIntegerNumber(asValue()); } - inline int32_t JSValue::getInt32Fast() const + inline int32_t JSValue::asInt32() const { - ASSERT(isInt32Fast()); + ASSERT(isInt32()); return JSImmediate::getTruncatedInt32(asValue()); } - inline bool JSValue::isUInt32Fast() const + inline bool JSValue::isUInt32() const { return JSImmediate::isPositiveIntegerNumber(asValue()); } - inline uint32_t JSValue::getUInt32Fast() const + inline uint32_t JSValue::asUInt32() const { - ASSERT(isUInt32Fast()); + ASSERT(isUInt32()); return JSImmediate::getTruncatedUInt32(asValue()); } - inline JSValue JSValue::makeInt32Fast(int32_t i) - { - return JSImmediate::from(i); - } - - inline bool JSValue::areBothInt32Fast(JSValue v1, JSValue v2) - { - return JSImmediate::areBothImmediateIntegerNumbers(v1, v2); - } - class JSFastMath { public: static ALWAYS_INLINE bool canDoFastBitwiseOperations(JSValue v1, JSValue v2) @@ -735,7 +670,7 @@ namespace JSC { static ALWAYS_INLINE JSValue rightShiftImmediateNumbers(JSValue val, JSValue shift) { ASSERT(canDoFastRshift(val, shift) || canDoFastUrshift(val, shift)); -#if USE(ALTERNATE_JSIMMEDIATE) +#if USE(JSVALUE64) return JSImmediate::makeValue(static_cast<intptr_t>(static_cast<uint32_t>(static_cast<int32_t>(JSImmediate::rawValue(val)) >> ((JSImmediate::rawValue(shift) >> JSImmediate::IntegerPayloadShift) & 0x1f))) | JSImmediate::TagTypeNumber); #else return JSImmediate::makeValue((JSImmediate::rawValue(val) >> ((JSImmediate::rawValue(shift) >> JSImmediate::IntegerPayloadShift) & 0x1f)) | JSImmediate::TagTypeNumber); @@ -783,4 +718,6 @@ namespace JSC { } // namespace JSC +#endif // !USE(JSVALUE32_64) + #endif // JSImmediate_h diff --git a/JavaScriptCore/runtime/JSLock.cpp b/JavaScriptCore/runtime/JSLock.cpp index 7ece5da..8f056c8 100644 --- a/JavaScriptCore/runtime/JSLock.cpp +++ b/JavaScriptCore/runtime/JSLock.cpp @@ -60,23 +60,23 @@ static void setLockCount(intptr_t count) } JSLock::JSLock(ExecState* exec) - : m_lockingForReal(exec->globalData().isSharedInstance) + : m_lockBehavior(exec->globalData().isSharedInstance ? LockForReal : SilenceAssertionsOnly) { - lock(m_lockingForReal); + lock(m_lockBehavior); } -void JSLock::lock(bool lockForReal) +void JSLock::lock(JSLockBehavior lockBehavior) { #ifdef NDEBUG // Locking "not for real" is a debug-only feature. - if (!lockForReal) + if (lockBehavior == SilenceAssertionsOnly) return; #endif pthread_once(&createJSLockCountOnce, createJSLockCount); intptr_t currentLockCount = lockCount(); - if (!currentLockCount && lockForReal) { + if (!currentLockCount && lockBehavior == LockForReal) { int result; result = pthread_mutex_lock(&JSMutex); ASSERT(!result); @@ -84,19 +84,19 @@ void JSLock::lock(bool lockForReal) setLockCount(currentLockCount + 1); } -void JSLock::unlock(bool lockForReal) +void JSLock::unlock(JSLockBehavior lockBehavior) { ASSERT(lockCount()); #ifdef NDEBUG // Locking "not for real" is a debug-only feature. - if (!lockForReal) + if (lockBehavior == SilenceAssertionsOnly) return; #endif intptr_t newLockCount = lockCount() - 1; setLockCount(newLockCount); - if (!newLockCount && lockForReal) { + if (!newLockCount && lockBehavior == LockForReal) { int result; result = pthread_mutex_unlock(&JSMutex); ASSERT(!result); @@ -105,12 +105,12 @@ void JSLock::unlock(bool lockForReal) void JSLock::lock(ExecState* exec) { - lock(exec->globalData().isSharedInstance); + lock(exec->globalData().isSharedInstance ? LockForReal : SilenceAssertionsOnly); } void JSLock::unlock(ExecState* exec) { - unlock(exec->globalData().isSharedInstance); + unlock(exec->globalData().isSharedInstance ? LockForReal : SilenceAssertionsOnly); } bool JSLock::currentThreadIsHoldingLock() @@ -162,7 +162,7 @@ bool JSLock::currentThreadIsHoldingLock() static unsigned lockDropDepth = 0; JSLock::DropAllLocks::DropAllLocks(ExecState* exec) - : m_lockingForReal(exec->globalData().isSharedInstance) + : m_lockBehavior(exec->globalData().isSharedInstance ? LockForReal : SilenceAssertionsOnly) { pthread_once(&createJSLockCountOnce, createJSLockCount); @@ -173,11 +173,11 @@ JSLock::DropAllLocks::DropAllLocks(ExecState* exec) m_lockCount = JSLock::lockCount(); for (intptr_t i = 0; i < m_lockCount; i++) - JSLock::unlock(m_lockingForReal); + JSLock::unlock(m_lockBehavior); } -JSLock::DropAllLocks::DropAllLocks(bool lockingForReal) - : m_lockingForReal(lockingForReal) +JSLock::DropAllLocks::DropAllLocks(JSLockBehavior JSLockBehavior) + : m_lockBehavior(JSLockBehavior) { pthread_once(&createJSLockCountOnce, createJSLockCount); @@ -191,13 +191,13 @@ JSLock::DropAllLocks::DropAllLocks(bool lockingForReal) m_lockCount = JSLock::lockCount(); for (intptr_t i = 0; i < m_lockCount; i++) - JSLock::unlock(m_lockingForReal); + JSLock::unlock(m_lockBehavior); } JSLock::DropAllLocks::~DropAllLocks() { for (intptr_t i = 0; i < m_lockCount; i++) - JSLock::lock(m_lockingForReal); + JSLock::lock(m_lockBehavior); --lockDropDepth; } @@ -205,7 +205,7 @@ JSLock::DropAllLocks::~DropAllLocks() #else JSLock::JSLock(ExecState*) - : m_lockingForReal(false) + : m_lockBehavior(SilenceAssertionsOnly) { } @@ -221,11 +221,11 @@ bool JSLock::currentThreadIsHoldingLock() return true; } -void JSLock::lock(bool) +void JSLock::lock(JSLockBehavior) { } -void JSLock::unlock(bool) +void JSLock::unlock(JSLockBehavior) { } @@ -241,7 +241,7 @@ JSLock::DropAllLocks::DropAllLocks(ExecState*) { } -JSLock::DropAllLocks::DropAllLocks(bool) +JSLock::DropAllLocks::DropAllLocks(JSLockBehavior) { } diff --git a/JavaScriptCore/runtime/JSLock.h b/JavaScriptCore/runtime/JSLock.h index 3dde358..8b015c4 100644 --- a/JavaScriptCore/runtime/JSLock.h +++ b/JavaScriptCore/runtime/JSLock.h @@ -50,50 +50,52 @@ namespace JSC { class ExecState; - class JSLock : Noncopyable { + enum JSLockBehavior { SilenceAssertionsOnly, LockForReal }; + + class JSLock : public Noncopyable { public: JSLock(ExecState*); - JSLock(bool lockingForReal) - : m_lockingForReal(lockingForReal) + JSLock(JSLockBehavior lockBehavior) + : m_lockBehavior(lockBehavior) { #ifdef NDEBUG // Locking "not for real" is a debug-only feature. - if (!lockingForReal) + if (lockBehavior == SilenceAssertionsOnly) return; #endif - lock(lockingForReal); + lock(lockBehavior); } ~JSLock() { #ifdef NDEBUG // Locking "not for real" is a debug-only feature. - if (!m_lockingForReal) + if (m_lockBehavior == SilenceAssertionsOnly) return; #endif - unlock(m_lockingForReal); + unlock(m_lockBehavior); } - static void lock(bool); - static void unlock(bool); + static void lock(JSLockBehavior); + static void unlock(JSLockBehavior); static void lock(ExecState*); static void unlock(ExecState*); static intptr_t lockCount(); static bool currentThreadIsHoldingLock(); - bool m_lockingForReal; + JSLockBehavior m_lockBehavior; - class DropAllLocks : Noncopyable { + class DropAllLocks : public Noncopyable { public: DropAllLocks(ExecState* exec); - DropAllLocks(bool); + DropAllLocks(JSLockBehavior); ~DropAllLocks(); private: intptr_t m_lockCount; - bool m_lockingForReal; + JSLockBehavior m_lockBehavior; }; }; diff --git a/JavaScriptCore/runtime/JSNotAnObject.cpp b/JavaScriptCore/runtime/JSNotAnObject.cpp index 937dc2b..a542a9f 100644 --- a/JavaScriptCore/runtime/JSNotAnObject.cpp +++ b/JavaScriptCore/runtime/JSNotAnObject.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 Apple Inc. All rights reserved. + * Copyright (C) 2008, 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 @@ -74,11 +74,10 @@ JSObject* JSNotAnObject::toObject(ExecState* exec) const } // Marking -void JSNotAnObject::mark() +void JSNotAnObject::markChildren(MarkStack& markStack) { - JSCell::mark(); - if (!m_exception->marked()) - m_exception->mark(); + JSObject::markChildren(markStack); + markStack.append(m_exception); } // JSObject methods diff --git a/JavaScriptCore/runtime/JSNotAnObject.h b/JavaScriptCore/runtime/JSNotAnObject.h index a8e36bd..b65ff5f 100644 --- a/JavaScriptCore/runtime/JSNotAnObject.h +++ b/JavaScriptCore/runtime/JSNotAnObject.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 Apple Inc. All rights reserved. + * Copyright (C) 2008, 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 @@ -75,7 +75,7 @@ namespace JSC { virtual JSObject* toObject(ExecState*) const; // Marking - virtual void mark(); + virtual void markChildren(MarkStack&); // JSObject methods virtual bool getOwnPropertySlot(ExecState*, const Identifier& propertyName, PropertySlot&); diff --git a/JavaScriptCore/runtime/JSNumberCell.cpp b/JavaScriptCore/runtime/JSNumberCell.cpp index 669440b..0654da7 100644 --- a/JavaScriptCore/runtime/JSNumberCell.cpp +++ b/JavaScriptCore/runtime/JSNumberCell.cpp @@ -23,13 +23,13 @@ #include "config.h" #include "JSNumberCell.h" +#if USE(JSVALUE32) + #include "NumberObject.h" #include "UString.h" namespace JSC { -#if !USE(ALTERNATE_JSIMMEDIATE) - JSValue JSNumberCell::toPrimitive(ExecState*, PreferredPrimitiveType) const { return const_cast<JSNumberCell*>(this); @@ -82,22 +82,6 @@ bool JSNumberCell::getUInt32(uint32_t& uint32) const return uint32 == m_value; } -bool JSNumberCell::getTruncatedInt32(int32_t& int32) const -{ - if (!(m_value >= -2147483648.0 && m_value < 2147483648.0)) - return false; - int32 = static_cast<int32_t>(m_value); - return true; -} - -bool JSNumberCell::getTruncatedUInt32(uint32_t& uint32) const -{ - if (!(m_value >= 0.0 && m_value < 4294967296.0)) - return false; - uint32 = static_cast<uint32_t>(m_value); - return true; -} - JSValue JSNumberCell::getJSNumber() { return this; @@ -113,25 +97,21 @@ JSValue jsNumberCell(JSGlobalData* globalData, double d) return new (globalData) JSNumberCell(globalData, d); } -JSValue jsAPIMangledNumber(ExecState* exec, double d) -{ - return new (exec) JSNumberCell(JSNumberCell::APIMangled, d); -} +} // namespace JSC -#else +#else // USE(JSVALUE32) -JSValue jsNumberCell(ExecState*, double) -{ - ASSERT_NOT_REACHED(); - return JSValue(); -} +// Keep our exported symbols lists happy. +namespace JSC { + +JSValue jsNumberCell(ExecState*, double); -JSValue jsAPIMangledNumber(ExecState*, double) +JSValue jsNumberCell(ExecState*, double) { ASSERT_NOT_REACHED(); return JSValue(); } -#endif - } // namespace JSC + +#endif // USE(JSVALUE32) diff --git a/JavaScriptCore/runtime/JSNumberCell.h b/JavaScriptCore/runtime/JSNumberCell.h index a35e210..04cccef 100644 --- a/JavaScriptCore/runtime/JSNumberCell.h +++ b/JavaScriptCore/runtime/JSNumberCell.h @@ -35,10 +35,8 @@ namespace JSC { extern const double NaN; extern const double Inf; +#if USE(JSVALUE32) JSValue jsNumberCell(ExecState*, double); - JSValue jsAPIMangledNumber(ExecState*, double); - -#if !USE(ALTERNATE_JSIMMEDIATE) class Identifier; class JSCell; @@ -53,7 +51,7 @@ namespace JSC { friend class JIT; friend JSValue jsNumberCell(JSGlobalData*, double); friend JSValue jsNumberCell(ExecState*, double); - friend JSValue jsAPIMangledNumber(ExecState*, double); + public: double value() const { return m_value; } @@ -68,9 +66,6 @@ namespace JSC { virtual JSObject* toThisObject(ExecState*) const; virtual JSValue getJSNumber(); - static const uintptr_t JSAPIMangledMagicNumber = 0xbbadbeef; - bool isAPIMangledNumber() const { return m_structure == reinterpret_cast<Structure*>(JSAPIMangledMagicNumber); } - void* operator new(size_t size, ExecState* exec) { #ifdef JAVASCRIPTCORE_BUILDING_ALL_IN_ONE_FILE @@ -104,16 +99,7 @@ namespace JSC { { } - enum APIMangledTag { APIMangled }; - JSNumberCell(APIMangledTag, double value) - : JSCell(reinterpret_cast<Structure*>(JSAPIMangledMagicNumber)) - , m_value(value) - { - } - virtual bool getUInt32(uint32_t&) const; - virtual bool getTruncatedInt32(int32_t&) const; - virtual bool getTruncatedUInt32(uint32_t&) const; double m_value; }; @@ -131,7 +117,6 @@ namespace JSC { return static_cast<JSNumberCell*>(v.asCell()); } - inline JSValue::JSValue(ExecState* exec, double d) { JSValue v = JSImmediate::from(d); @@ -192,59 +177,30 @@ namespace JSC { *this = v ? v : jsNumberCell(globalData, i); } - inline JSValue::JSValue(JSGlobalData* globalData, long i) - { - JSValue v = JSImmediate::from(i); - *this = v ? v : jsNumberCell(globalData, i); - } - - inline JSValue::JSValue(JSGlobalData* globalData, unsigned long i) - { - JSValue v = JSImmediate::from(i); - *this = v ? v : jsNumberCell(globalData, i); - } - - inline JSValue::JSValue(JSGlobalData* globalData, long long i) - { - JSValue v = JSImmediate::from(i); - *this = v ? v : jsNumberCell(globalData, static_cast<double>(i)); - } - - inline JSValue::JSValue(JSGlobalData* globalData, unsigned long long i) - { - JSValue v = JSImmediate::from(i); - *this = v ? v : jsNumberCell(globalData, static_cast<double>(i)); - } - - inline bool JSValue::isDoubleNumber() const + inline bool JSValue::isDouble() const { return isNumberCell(asValue()); } - inline double JSValue::getDoubleNumber() const + inline double JSValue::asDouble() const { return asNumberCell(asValue())->value(); } inline bool JSValue::isNumber() const { - return JSImmediate::isNumber(asValue()) || isDoubleNumber(); + return JSImmediate::isNumber(asValue()) || isDouble(); } inline double JSValue::uncheckedGetNumber() const { ASSERT(isNumber()); - return JSImmediate::isImmediate(asValue()) ? JSImmediate::toDouble(asValue()) : getDoubleNumber(); + return JSImmediate::isImmediate(asValue()) ? JSImmediate::toDouble(asValue()) : asDouble(); } - inline bool JSValue::isAPIMangledNumber() - { - ASSERT(isNumber()); - return JSImmediate::isImmediate(asValue()) ? false : asNumberCell(asValue())->isAPIMangledNumber(); - } - -#else +#endif // USE(JSVALUE32) +#if USE(JSVALUE64) inline JSValue::JSValue(ExecState*, double d) { JSValue v = JSImmediate::from(d); @@ -315,40 +271,12 @@ namespace JSC { *this = v; } - inline JSValue::JSValue(JSGlobalData*, long i) - { - JSValue v = JSImmediate::from(i); - ASSERT(v); - *this = v; - } - - inline JSValue::JSValue(JSGlobalData*, unsigned long i) + inline bool JSValue::isDouble() const { - JSValue v = JSImmediate::from(i); - ASSERT(v); - *this = v; - } - - inline JSValue::JSValue(JSGlobalData*, long long i) - { - JSValue v = JSImmediate::from(static_cast<double>(i)); - ASSERT(v); - *this = v; + return JSImmediate::isDouble(asValue()); } - inline JSValue::JSValue(JSGlobalData*, unsigned long long i) - { - JSValue v = JSImmediate::from(static_cast<double>(i)); - ASSERT(v); - *this = v; - } - - inline bool JSValue::isDoubleNumber() const - { - return JSImmediate::isDoubleNumber(asValue()); - } - - inline double JSValue::getDoubleNumber() const + inline double JSValue::asDouble() const { return JSImmediate::doubleValue(asValue()); } @@ -364,7 +292,9 @@ namespace JSC { return JSImmediate::toDouble(asValue()); } -#endif +#endif // USE(JSVALUE64) + +#if USE(JSVALUE32) || USE(JSVALUE64) inline JSValue::JSValue(ExecState*, char i) { @@ -390,30 +320,6 @@ namespace JSC { *this = JSImmediate::from(i); } - inline JSValue::JSValue(JSGlobalData*, char i) - { - ASSERT(JSImmediate::from(i)); - *this = JSImmediate::from(i); - } - - inline JSValue::JSValue(JSGlobalData*, unsigned char i) - { - ASSERT(JSImmediate::from(i)); - *this = JSImmediate::from(i); - } - - inline JSValue::JSValue(JSGlobalData*, short i) - { - ASSERT(JSImmediate::from(i)); - *this = JSImmediate::from(i); - } - - inline JSValue::JSValue(JSGlobalData*, unsigned short i) - { - ASSERT(JSImmediate::from(i)); - *this = JSImmediate::from(i); - } - inline JSValue jsNaN(ExecState* exec) { return jsNumber(exec, NaN); @@ -433,23 +339,10 @@ namespace JSC { inline bool JSValue::getNumber(double &result) const { - if (isInt32Fast()) - result = getInt32Fast(); - else if (LIKELY(isDoubleNumber())) - result = getDoubleNumber(); - else { - ASSERT(!isNumber()); - return false; - } - return true; - } - - inline bool JSValue::numberToInt32(int32_t& arg) - { - if (isInt32Fast()) - arg = getInt32Fast(); - else if (LIKELY(isDoubleNumber())) - arg = JSC::toInt32(getDoubleNumber()); + if (isInt32()) + result = asInt32(); + else if (LIKELY(isDouble())) + result = asDouble(); else { ASSERT(!isNumber()); return false; @@ -457,23 +350,7 @@ namespace JSC { return true; } - inline bool JSValue::numberToUInt32(uint32_t& arg) - { - if (isUInt32Fast()) - arg = getUInt32Fast(); - else if (LIKELY(isDoubleNumber())) - arg = JSC::toUInt32(getDoubleNumber()); - else if (isInt32Fast()) { - // FIXME: I think this case can be merged with the uint case; toUInt32SlowCase - // on a negative value is equivalent to simple static_casting. - bool ignored; - arg = toUInt32SlowCase(getInt32Fast(), ignored); - } else { - ASSERT(!isNumber()); - return false; - } - return true; - } +#endif // USE(JSVALUE32) || USE(JSVALUE64) } // namespace JSC diff --git a/JavaScriptCore/runtime/JSONObject.cpp b/JavaScriptCore/runtime/JSONObject.cpp new file mode 100644 index 0000000..d643808 --- /dev/null +++ b/JavaScriptCore/runtime/JSONObject.cpp @@ -0,0 +1,764 @@ +/* + * 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. + */ + +#include "config.h" +#include "JSONObject.h" + +#include "BooleanObject.h" +#include "Error.h" +#include "ExceptionHelpers.h" +#include "JSArray.h" +#include "LiteralParser.h" +#include "PropertyNameArray.h" +#include <wtf/MathExtras.h> + +namespace JSC { + +ASSERT_CLASS_FITS_IN_CELL(JSONObject); + +static JSValue JSC_HOST_CALL JSONProtoFuncParse(ExecState*, JSObject*, JSValue, const ArgList&); +static JSValue JSC_HOST_CALL JSONProtoFuncStringify(ExecState*, JSObject*, JSValue, const ArgList&); + +} + +#include "JSONObject.lut.h" + +namespace JSC { + +// PropertyNameForFunctionCall objects must be on the stack, since the JSValue that they create is not marked. +class PropertyNameForFunctionCall { +public: + PropertyNameForFunctionCall(const Identifier&); + PropertyNameForFunctionCall(unsigned); + + JSValue value(ExecState*) const; + +private: + const Identifier* m_identifier; + unsigned m_number; + mutable JSValue m_value; +}; + +class Stringifier : public Noncopyable { +public: + Stringifier(ExecState*, JSValue replacer, JSValue space); + ~Stringifier(); + JSValue stringify(JSValue); + + void markAggregate(MarkStack&); + +private: + typedef UString StringBuilder; + + class Holder { + public: + Holder(JSObject*); + + JSObject* object() const { return m_object; } + + bool appendNextProperty(Stringifier&, StringBuilder&); + + private: + JSObject* const m_object; + const bool m_isArray; + bool m_isJSArray; + unsigned m_index; + unsigned m_size; + RefPtr<PropertyNameArrayData> m_propertyNames; + }; + + friend class Holder; + + static void appendQuotedString(StringBuilder&, const UString&); + + JSValue toJSON(JSValue, const PropertyNameForFunctionCall&); + + enum StringifyResult { StringifyFailed, StringifySucceeded, StringifyFailedDueToUndefinedValue }; + StringifyResult appendStringifiedValue(StringBuilder&, JSValue, JSObject* holder, const PropertyNameForFunctionCall&); + + bool willIndent() const; + void indent(); + void unindent(); + void startNewLine(StringBuilder&) const; + + Stringifier* const m_nextStringifierToMark; + ExecState* const m_exec; + const JSValue m_replacer; + bool m_usingArrayReplacer; + PropertyNameArray m_arrayReplacerPropertyNames; + CallType m_replacerCallType; + CallData m_replacerCallData; + const UString m_gap; + + HashSet<JSObject*> m_holderCycleDetector; + Vector<Holder, 16> m_holderStack; + UString m_repeatedGap; + UString m_indent; +}; + +// ------------------------------ helper functions -------------------------------- + +static inline JSValue unwrapBoxedPrimitive(JSValue value) +{ + if (!value.isObject()) + return value; + if (!asObject(value)->inherits(&NumberObject::info) && !asObject(value)->inherits(&StringObject::info) && !asObject(value)->inherits(&BooleanObject::info)) + return value; + return static_cast<JSWrapperObject*>(asObject(value))->internalValue(); +} + +static inline UString gap(JSValue space) +{ + space = unwrapBoxedPrimitive(space); + + // If the space value is a number, create a gap string with that number of spaces. + double spaceCount; + if (space.getNumber(spaceCount)) { + const int maxSpaceCount = 100; + int count; + if (spaceCount > maxSpaceCount) + count = maxSpaceCount; + else if (!(spaceCount > 0)) + count = 0; + else + count = static_cast<int>(spaceCount); + UChar spaces[maxSpaceCount]; + for (int i = 0; i < count; ++i) + spaces[i] = ' '; + return UString(spaces, count); + } + + // If the space value is a string, use it as the gap string, otherwise use no gap string. + return space.getString(); +} + +// ------------------------------ PropertyNameForFunctionCall -------------------------------- + +inline PropertyNameForFunctionCall::PropertyNameForFunctionCall(const Identifier& identifier) + : m_identifier(&identifier) +{ +} + +inline PropertyNameForFunctionCall::PropertyNameForFunctionCall(unsigned number) + : m_identifier(0) + , m_number(number) +{ +} + +JSValue PropertyNameForFunctionCall::value(ExecState* exec) const +{ + if (!m_value) { + if (m_identifier) + m_value = jsString(exec, m_identifier->ustring()); + else + m_value = jsNumber(exec, m_number); + } + return m_value; +} + +// ------------------------------ Stringifier -------------------------------- + +Stringifier::Stringifier(ExecState* exec, JSValue replacer, JSValue space) + : m_nextStringifierToMark(exec->globalData().firstStringifierToMark) + , m_exec(exec) + , m_replacer(replacer) + , m_usingArrayReplacer(false) + , m_arrayReplacerPropertyNames(exec) + , m_replacerCallType(CallTypeNone) + , m_gap(gap(space)) +{ + exec->globalData().firstStringifierToMark = this; + + if (!m_replacer.isObject()) + return; + + if (asObject(m_replacer)->inherits(&JSArray::info)) { + m_usingArrayReplacer = true; + JSObject* array = asObject(m_replacer); + unsigned length = array->get(exec, exec->globalData().propertyNames->length).toUInt32(exec); + for (unsigned i = 0; i < length; ++i) { + JSValue name = array->get(exec, i); + if (exec->hadException()) + break; + UString propertyName; + if (!name.getString(propertyName)) + continue; + if (exec->hadException()) + return; + m_arrayReplacerPropertyNames.add(Identifier(exec, propertyName)); + } + return; + } + + m_replacerCallType = asObject(m_replacer)->getCallData(m_replacerCallData); +} + +Stringifier::~Stringifier() +{ + ASSERT(m_exec->globalData().firstStringifierToMark == this); + m_exec->globalData().firstStringifierToMark = m_nextStringifierToMark; +} + +void Stringifier::markAggregate(MarkStack& markStack) +{ + for (Stringifier* stringifier = this; stringifier; stringifier = stringifier->m_nextStringifierToMark) { + size_t size = m_holderStack.size(); + for (size_t i = 0; i < size; ++i) + markStack.append(m_holderStack[i].object()); + } +} + +JSValue Stringifier::stringify(JSValue value) +{ + JSObject* object = constructEmptyObject(m_exec); + if (m_exec->hadException()) + return jsNull(); + + PropertyNameForFunctionCall emptyPropertyName(m_exec->globalData().propertyNames->emptyIdentifier); + object->putDirect(m_exec->globalData().propertyNames->emptyIdentifier, value); + + StringBuilder result; + if (appendStringifiedValue(result, value, object, emptyPropertyName) != StringifySucceeded) + return jsUndefined(); + if (m_exec->hadException()) + return jsNull(); + + return jsString(m_exec, result); +} + +void Stringifier::appendQuotedString(StringBuilder& builder, const UString& value) +{ + int length = value.size(); + + // String length plus 2 for quote marks plus 8 so we can accomodate a few escaped characters. + builder.reserveCapacity(builder.size() + length + 2 + 8); + + builder.append('"'); + + const UChar* data = value.data(); + for (int i = 0; i < length; ++i) { + int start = i; + while (i < length && (data[i] > 0x1F && data[i] != '"' && data[i] != '\\')) + ++i; + builder.append(data + start, i - start); + if (i >= length) + break; + switch (data[i]) { + case '\t': + builder.append('\\'); + builder.append('t'); + break; + case '\r': + builder.append('\\'); + builder.append('r'); + break; + case '\n': + builder.append('\\'); + builder.append('n'); + break; + case '\f': + builder.append('\\'); + builder.append('f'); + break; + case '\b': + builder.append('\\'); + builder.append('b'); + break; + case '"': + builder.append('\\'); + builder.append('"'); + break; + case '\\': + builder.append('\\'); + builder.append('\\'); + break; + default: + static const char hexDigits[] = "0123456789abcdef"; + UChar ch = data[i]; + UChar hex[] = { '\\', 'u', hexDigits[(ch >> 12) & 0xF], hexDigits[(ch >> 8) & 0xF], hexDigits[(ch >> 4) & 0xF], hexDigits[ch & 0xF] }; + builder.append(hex, sizeof(hex) / sizeof(UChar)); + break; + } + } + + builder.append('"'); +} + +inline JSValue Stringifier::toJSON(JSValue value, const PropertyNameForFunctionCall& propertyName) +{ + ASSERT(!m_exec->hadException()); + if (!value.isObject() || !asObject(value)->hasProperty(m_exec, m_exec->globalData().propertyNames->toJSON)) + return value; + + JSValue toJSONFunction = asObject(value)->get(m_exec, m_exec->globalData().propertyNames->toJSON); + if (m_exec->hadException()) + return jsNull(); + + if (!toJSONFunction.isObject()) + return value; + + JSObject* object = asObject(toJSONFunction); + CallData callData; + CallType callType = object->getCallData(callData); + if (callType == CallTypeNone) + return value; + + JSValue list[] = { propertyName.value(m_exec) }; + ArgList args(list, sizeof(list) / sizeof(JSValue)); + return call(m_exec, object, callType, callData, value, args); +} + +Stringifier::StringifyResult Stringifier::appendStringifiedValue(StringBuilder& builder, JSValue value, JSObject* holder, const PropertyNameForFunctionCall& propertyName) +{ + // Call the toJSON function. + value = toJSON(value, propertyName); + if (m_exec->hadException()) + return StringifyFailed; + + // Call the replacer function. + if (m_replacerCallType != CallTypeNone) { + JSValue list[] = { propertyName.value(m_exec), value }; + ArgList args(list, sizeof(list) / sizeof(JSValue)); + value = call(m_exec, m_replacer, m_replacerCallType, m_replacerCallData, holder, args); + if (m_exec->hadException()) + return StringifyFailed; + } + + if (value.isUndefined() && !holder->inherits(&JSArray::info)) + return StringifyFailedDueToUndefinedValue; + + if (value.isNull()) { + builder.append("null"); + return StringifySucceeded; + } + + value = unwrapBoxedPrimitive(value); + + if (value.isBoolean()) { + builder.append(value.getBoolean() ? "true" : "false"); + return StringifySucceeded; + } + + UString stringValue; + if (value.getString(stringValue)) { + appendQuotedString(builder, stringValue); + return StringifySucceeded; + } + + double numericValue; + if (value.getNumber(numericValue)) { + if (!isfinite(numericValue)) + builder.append("null"); + else + builder.append(UString::from(numericValue)); + return StringifySucceeded; + } + + if (!value.isObject()) + return StringifyFailed; + + JSObject* object = asObject(value); + + // Handle cycle detection, and put the holder on the stack. + if (!m_holderCycleDetector.add(object).second) { + throwError(m_exec, TypeError, "JSON.stringify cannot serialize cyclic structures."); + return StringifyFailed; + } + bool holderStackWasEmpty = m_holderStack.isEmpty(); + m_holderStack.append(object); + if (!holderStackWasEmpty) + return StringifySucceeded; + + // If this is the outermost call, then loop to handle everything on the holder stack. + TimeoutChecker localTimeoutChecker(m_exec->globalData().timeoutChecker); + localTimeoutChecker.reset(); + unsigned tickCount = localTimeoutChecker.ticksUntilNextCheck(); + do { + while (m_holderStack.last().appendNextProperty(*this, builder)) { + if (m_exec->hadException()) + return StringifyFailed; + if (!--tickCount) { + if (localTimeoutChecker.didTimeOut(m_exec)) { + m_exec->setException(createInterruptedExecutionException(&m_exec->globalData())); + return StringifyFailed; + } + tickCount = localTimeoutChecker.ticksUntilNextCheck(); + } + } + m_holderCycleDetector.remove(m_holderStack.last().object()); + m_holderStack.removeLast(); + } while (!m_holderStack.isEmpty()); + return StringifySucceeded; +} + +inline bool Stringifier::willIndent() const +{ + return !m_gap.isEmpty(); +} + +inline void Stringifier::indent() +{ + // Use a single shared string, m_repeatedGap, so we don't keep allocating new ones as we indent and unindent. + int newSize = m_indent.size() + m_gap.size(); + if (newSize > m_repeatedGap.size()) + m_repeatedGap.append(m_gap); + ASSERT(newSize <= m_repeatedGap.size()); + m_indent = m_repeatedGap.substr(0, newSize); +} + +inline void Stringifier::unindent() +{ + ASSERT(m_indent.size() >= m_gap.size()); + m_indent = m_repeatedGap.substr(0, m_indent.size() - m_gap.size()); +} + +inline void Stringifier::startNewLine(StringBuilder& builder) const +{ + if (m_gap.isEmpty()) + return; + builder.append('\n'); + builder.append(m_indent); +} + +inline Stringifier::Holder::Holder(JSObject* object) + : m_object(object) + , m_isArray(object->inherits(&JSArray::info)) + , m_index(0) +{ +} + +bool Stringifier::Holder::appendNextProperty(Stringifier& stringifier, StringBuilder& builder) +{ + ASSERT(m_index <= m_size); + + ExecState* exec = stringifier.m_exec; + + // First time through, initialize. + if (!m_index) { + if (m_isArray) { + m_isJSArray = isJSArray(&exec->globalData(), m_object); + m_size = m_object->get(exec, exec->globalData().propertyNames->length).toUInt32(exec); + builder.append('['); + } else { + if (stringifier.m_usingArrayReplacer) + m_propertyNames = stringifier.m_arrayReplacerPropertyNames.data(); + else { + PropertyNameArray objectPropertyNames(exec); + m_object->getPropertyNames(exec, objectPropertyNames); + m_propertyNames = objectPropertyNames.releaseData(); + } + m_size = m_propertyNames->propertyNameVector().size(); + builder.append('{'); + } + stringifier.indent(); + } + + // Last time through, finish up and return false. + if (m_index == m_size) { + stringifier.unindent(); + if (m_size && builder[builder.size() - 1] != '{') + stringifier.startNewLine(builder); + builder.append(m_isArray ? ']' : '}'); + return false; + } + + // Handle a single element of the array or object. + unsigned index = m_index++; + unsigned rollBackPoint = 0; + StringifyResult stringifyResult; + if (m_isArray) { + // Get the value. + JSValue value; + if (m_isJSArray && asArray(m_object)->canGetIndex(index)) + value = asArray(m_object)->getIndex(index); + else { + PropertySlot slot(m_object); + if (!m_object->getOwnPropertySlot(exec, index, slot)) + slot.setUndefined(); + if (exec->hadException()) + return false; + value = slot.getValue(exec, index); + } + + // Append the separator string. + if (index) + builder.append(','); + stringifier.startNewLine(builder); + + // Append the stringified value. + stringifyResult = stringifier.appendStringifiedValue(builder, value, m_object, index); + } else { + // Get the value. + PropertySlot slot(m_object); + Identifier& propertyName = m_propertyNames->propertyNameVector()[index]; + if (!m_object->getOwnPropertySlot(exec, propertyName, slot)) + return true; + JSValue value = slot.getValue(exec, propertyName); + if (exec->hadException()) + return false; + + rollBackPoint = builder.size(); + + // Append the separator string. + if (builder[rollBackPoint - 1] != '{') + builder.append(','); + stringifier.startNewLine(builder); + + // Append the property name. + appendQuotedString(builder, propertyName.ustring()); + builder.append(':'); + if (stringifier.willIndent()) + builder.append(' '); + + // Append the stringified value. + stringifyResult = stringifier.appendStringifiedValue(builder, value, m_object, propertyName); + } + + // From this point on, no access to the this pointer or to any members, because the + // Holder object may have moved if the call to stringify pushed a new Holder onto + // m_holderStack. + + switch (stringifyResult) { + case StringifyFailed: + builder.append("null"); + break; + case StringifySucceeded: + break; + case StringifyFailedDueToUndefinedValue: + // This only occurs when get an undefined value for an object property. + // In this case we don't want the separator and property name that we + // already appended, so roll back. + builder = builder.substr(0, rollBackPoint); + break; + } + + return true; +} + +// ------------------------------ JSONObject -------------------------------- + +const ClassInfo JSONObject::info = { "JSON", 0, 0, ExecState::jsonTable }; + +/* Source for JSONObject.lut.h +@begin jsonTable + parse JSONProtoFuncParse DontEnum|Function 1 + stringify JSONProtoFuncStringify DontEnum|Function 1 +@end +*/ + +// ECMA 15.8 + +bool JSONObject::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot) +{ + const HashEntry* entry = ExecState::jsonTable(exec)->entry(exec, propertyName); + if (!entry) + return JSObject::getOwnPropertySlot(exec, propertyName, slot); + + ASSERT(entry->attributes() & Function); + setUpStaticFunctionSlot(exec, entry, this, propertyName, slot); + return true; +} + +void JSONObject::markStringifiers(MarkStack& markStack, Stringifier* stringifier) +{ + stringifier->markAggregate(markStack); +} + +class Walker { +public: + Walker(ExecState* exec, JSObject* function, CallType callType, CallData callData) + : m_exec(exec) + , m_function(function) + , m_callType(callType) + , m_callData(callData) + { + } + JSValue walk(JSValue unfiltered); +private: + JSValue callReviver(JSValue property, JSValue unfiltered) + { + JSValue args[] = { property, unfiltered }; + ArgList argList(args, 2); + return call(m_exec, m_function, m_callType, m_callData, jsNull(), argList); + } + + friend class Holder; + + ExecState* m_exec; + JSObject* m_function; + CallType m_callType; + CallData m_callData; +}; + +enum WalkerState { StateUnknown, ArrayStartState, ArrayStartVisitMember, ArrayEndVisitMember, + ObjectStartState, ObjectStartVisitMember, ObjectEndVisitMember }; +NEVER_INLINE JSValue Walker::walk(JSValue unfiltered) +{ + Vector<PropertyNameArray, 16> propertyStack; + Vector<uint32_t, 16> indexStack; + Vector<JSObject*, 16> objectStack; + Vector<JSArray*, 16> arrayStack; + + Vector<WalkerState, 16> stateStack; + WalkerState state = StateUnknown; + JSValue inValue = unfiltered; + JSValue outValue = jsNull(); + while (1) { + switch (state) { + arrayStartState: + case ArrayStartState: { + ASSERT(inValue.isObject()); + ASSERT(isJSArray(&m_exec->globalData(), asObject(inValue))); + JSArray* array = asArray(inValue); + arrayStack.append(array); + indexStack.append(0); + // fallthrough + } + arrayStartVisitMember: + case ArrayStartVisitMember: { + JSArray* array = arrayStack.last(); + uint32_t index = indexStack.last(); + if (index == array->length()) { + outValue = array; + arrayStack.removeLast(); + indexStack.removeLast(); + break; + } + inValue = array->getIndex(index); + if (inValue.isObject()) { + stateStack.append(ArrayEndVisitMember); + goto stateUnknown; + } else + outValue = inValue; + // fallthrough + } + case ArrayEndVisitMember: { + JSArray* array = arrayStack.last(); + array->setIndex(indexStack.last(), callReviver(jsString(m_exec, UString::from(indexStack.last())), outValue)); + if (m_exec->hadException()) + return jsNull(); + indexStack.last()++; + goto arrayStartVisitMember; + } + objectStartState: + case ObjectStartState: { + ASSERT(inValue.isObject()); + ASSERT(!isJSArray(&m_exec->globalData(), asObject(inValue))); + JSObject* object = asObject(inValue); + objectStack.append(object); + indexStack.append(0); + propertyStack.append(PropertyNameArray(m_exec)); + object->getPropertyNames(m_exec, propertyStack.last()); + // fallthrough + } + objectStartVisitMember: + case ObjectStartVisitMember: { + JSObject* object = objectStack.last(); + uint32_t index = indexStack.last(); + PropertyNameArray& properties = propertyStack.last(); + if (index == properties.size()) { + outValue = object; + objectStack.removeLast(); + indexStack.removeLast(); + propertyStack.removeLast(); + break; + } + PropertySlot slot; + object->getOwnPropertySlot(m_exec, properties[index], slot); + inValue = slot.getValue(m_exec, properties[index]); + ASSERT(!m_exec->hadException()); + if (inValue.isObject()) { + stateStack.append(ObjectEndVisitMember); + goto stateUnknown; + } else + outValue = inValue; + // fallthrough + } + case ObjectEndVisitMember: { + JSObject* object = objectStack.last(); + Identifier prop = propertyStack.last()[indexStack.last()]; + PutPropertySlot slot; + object->put(m_exec, prop, callReviver(jsString(m_exec, prop.ustring()), outValue), slot); + if (m_exec->hadException()) + return jsNull(); + indexStack.last()++; + goto objectStartVisitMember; + } + stateUnknown: + case StateUnknown: + if (!inValue.isObject()) { + outValue = inValue; + break; + } + if (isJSArray(&m_exec->globalData(), asObject(inValue))) + goto arrayStartState; + goto objectStartState; + } + if (stateStack.isEmpty()) + break; + state = stateStack.last(); + stateStack.removeLast(); + } + return callReviver(jsEmptyString(m_exec), outValue); +} + +// ECMA-262 v5 15.12.2 +JSValue JSC_HOST_CALL JSONProtoFuncParse(ExecState* exec, JSObject*, JSValue, const ArgList& args) +{ + if (args.isEmpty()) + return throwError(exec, GeneralError, "JSON.parse requires at least one parameter"); + JSValue value = args.at(0); + UString source = value.toString(exec); + if (exec->hadException()) + return jsNull(); + + LiteralParser jsonParser(exec, source, LiteralParser::StrictJSON); + JSValue unfiltered = jsonParser.tryLiteralParse(); + if (!unfiltered) + return throwError(exec, SyntaxError, "Unable to parse JSON string"); + + if (args.size() < 2) + return unfiltered; + + JSValue function = args.at(1); + CallData callData; + CallType callType = function.getCallData(callData); + if (callType == CallTypeNone) + return unfiltered; + return Walker(exec, asObject(function), callType, callData).walk(unfiltered); +} + +// ECMA-262 v5 15.12.3 +JSValue JSC_HOST_CALL JSONProtoFuncStringify(ExecState* exec, JSObject*, JSValue, const ArgList& args) +{ + if (args.isEmpty()) + return throwError(exec, GeneralError, "No input to stringify"); + JSValue value = args.at(0); + JSValue replacer = args.at(1); + JSValue space = args.at(2); + return Stringifier(exec, replacer, space).stringify(value); +} + +} // namespace JSC diff --git a/JavaScriptCore/runtime/JSONObject.h b/JavaScriptCore/runtime/JSONObject.h new file mode 100644 index 0000000..faca7c7 --- /dev/null +++ b/JavaScriptCore/runtime/JSONObject.h @@ -0,0 +1,58 @@ +/* + * 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 JSONObject_h +#define JSONObject_h + +#include "JSObject.h" + +namespace JSC { + + class Stringifier; + + class JSONObject : public JSObject { + public: + JSONObject(PassRefPtr<Structure> structure) + : JSObject(structure) + { + } + + static PassRefPtr<Structure> createStructure(JSValue prototype) + { + return Structure::create(prototype, TypeInfo(ObjectType)); + } + + static void markStringifiers(MarkStack&, Stringifier*); + + private: + virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&); + + virtual const ClassInfo* classInfo() const { return &info; } + static const ClassInfo info; + }; + +} // namespace JSC + +#endif // JSONObject_h diff --git a/JavaScriptCore/runtime/JSObject.cpp b/JavaScriptCore/runtime/JSObject.cpp index 415c25d..419dfe9 100644 --- a/JavaScriptCore/runtime/JSObject.cpp +++ b/JavaScriptCore/runtime/JSObject.cpp @@ -1,7 +1,7 @@ /* * Copyright (C) 1999-2001 Harri Porten (porten@kde.org) * Copyright (C) 2001 Peter Kelly (pmk@post.com) - * Copyright (C) 2003, 2004, 2005, 2006, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009 Apple Inc. All rights reserved. * Copyright (C) 2007 Eric Seidel (eric@webkit.org) * * This library is free software; you can redistribute it and/or @@ -62,21 +62,16 @@ namespace JSC { ASSERT_CLASS_FITS_IN_CELL(JSObject); -void JSObject::mark() +void JSObject::markChildren(MarkStack& markStack) { JSOBJECT_MARK_BEGIN(); - JSCell::mark(); - m_structure->mark(); + JSCell::markChildren(markStack); + m_structure->markAggregate(markStack); PropertyStorage storage = propertyStorage(); - size_t storageSize = m_structure->propertyStorageSize(); - for (size_t i = 0; i < storageSize; ++i) { - JSValue v = JSValue::decode(storage[i]); - if (!v.marked()) - v.mark(); - } + markStack.appendValues(reinterpret_cast<JSValue*>(storage), storageSize); JSOBJECT_MARK_END(); } @@ -310,7 +305,7 @@ void JSObject::defineGetter(ExecState* exec, const Identifier& propertyName, JSO } PutPropertySlot slot; - GetterSetter* getterSetter = new (exec) GetterSetter; + GetterSetter* getterSetter = new (exec) GetterSetter(exec); putDirectInternal(exec->globalData(), propertyName, getterSetter, Getter, true, slot); // putDirect will change our Structure if we add a new property. For @@ -337,7 +332,7 @@ void JSObject::defineSetter(ExecState* exec, const Identifier& propertyName, JSO } PutPropertySlot slot; - GetterSetter* getterSetter = new (exec) GetterSetter; + GetterSetter* getterSetter = new (exec) GetterSetter(exec); putDirectInternal(exec->globalData(), propertyName, getterSetter, Setter, true, slot); // putDirect will change our Structure if we add a new property. For diff --git a/JavaScriptCore/runtime/JSObject.h b/JavaScriptCore/runtime/JSObject.h index 54805f2..decd5e9 100644 --- a/JavaScriptCore/runtime/JSObject.h +++ b/JavaScriptCore/runtime/JSObject.h @@ -1,7 +1,7 @@ /* * Copyright (C) 1999-2001 Harri Porten (porten@kde.org) * Copyright (C) 2001 Peter Kelly (pmk@post.com) - * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -33,6 +33,7 @@ #include "ScopeChain.h" #include "Structure.h" #include "JSGlobalData.h" +#include <wtf/StdLibExtras.h> namespace JSC { @@ -42,11 +43,11 @@ namespace JSC { return value.asCell(); return 0; } - + + class HashEntry; class InternalFunction; class PropertyNameArray; class Structure; - struct HashEntry; struct HashTable; // ECMA 262-3 8.6.1 @@ -72,7 +73,7 @@ namespace JSC { public: explicit JSObject(PassRefPtr<Structure>); - virtual void mark(); + virtual void markChildren(MarkStack&); // The inline virtual destructor cannot be the first virtual function declared // in the class as it results in the vtable being generated as a weak symbol @@ -195,7 +196,7 @@ namespace JSC { void allocatePropertyStorageInline(size_t oldSize, size_t newSize); bool isUsingInlineStorage() const { return m_structure->isUsingInlineStorage(); } - static const size_t inlineStorageCapacity = 3; + static const size_t inlineStorageCapacity = sizeof(EncodedJSValue) == 2 * sizeof(void*) ? 4 : 3; static const size_t nonInlineBaseStorageCapacity = 16; static PassRefPtr<Structure> createStructure(JSValue prototype) @@ -203,9 +204,6 @@ namespace JSC { return Structure::create(prototype, TypeInfo(ObjectType, HasStandardGetOwnPropertySlot)); } - protected: - bool getOwnPropertySlotForWrite(ExecState*, const Identifier&, PropertySlot&, bool& slotIsWriteable); - private: ConstPropertyStorage propertyStorage() const { return (isUsingInlineStorage() ? m_inlineStorage : m_externalStorage); } PropertyStorage propertyStorage() { return (isUsingInlineStorage() ? m_inlineStorage : m_externalStorage); } @@ -229,17 +227,15 @@ namespace JSC { const HashEntry* findPropertyHashEntry(ExecState*, const Identifier& propertyName) const; Structure* createInheritorID(); - RefPtr<Structure> m_inheritorID; - union { PropertyStorage m_externalStorage; EncodedJSValue m_inlineStorage[inlineStorageCapacity]; }; - }; - - JSObject* asObject(JSValue); - JSObject* constructEmptyObject(ExecState*); + RefPtr<Structure> m_inheritorID; + }; + +JSObject* constructEmptyObject(ExecState*); inline JSObject* asObject(JSValue value) { @@ -254,6 +250,9 @@ inline JSObject::JSObject(PassRefPtr<Structure> structure) ASSERT(m_structure->propertyStorageCapacity() == inlineStorageCapacity); ASSERT(m_structure->isEmpty()); ASSERT(prototype().isNull() || Heap::heap(this) == Heap::heap(prototype())); +#if USE(JSVALUE64) || USE(JSVALUE32_64) + ASSERT(OBJECT_OFFSETOF(JSObject, m_inlineStorage) % sizeof(double) == 0); +#endif } inline JSObject::~JSObject() @@ -328,30 +327,6 @@ ALWAYS_INLINE bool JSObject::inlineGetOwnPropertySlot(ExecState* exec, const Ide return false; } -ALWAYS_INLINE bool JSObject::getOwnPropertySlotForWrite(ExecState* exec, const Identifier& propertyName, PropertySlot& slot, bool& slotIsWriteable) -{ - unsigned attributes; - if (JSValue* location = getDirectLocation(propertyName, attributes)) { - if (m_structure->hasGetterSetterProperties() && location[0].isGetterSetter()) { - slotIsWriteable = false; - fillGetterPropertySlot(slot, location); - } else { - slotIsWriteable = !(attributes & ReadOnly); - slot.setValueSlot(this, location, offsetForLocation(location)); - } - return true; - } - - // non-standard Netscape extension - if (propertyName == exec->propertyNames().underscoreProto) { - slot.setValue(prototype()); - slotIsWriteable = false; - return true; - } - - return false; -} - // It may seem crazy to inline a function this large, especially a virtual function, // but it makes a big difference to property lookup that derived classes can inline their // base class call to this. @@ -569,7 +544,7 @@ inline JSValue JSValue::get(ExecState* exec, const Identifier& propertyName) con inline JSValue JSValue::get(ExecState* exec, const Identifier& propertyName, PropertySlot& slot) const { if (UNLIKELY(!isCell())) { - JSObject* prototype = JSImmediate::prototype(asValue(), exec); + JSObject* prototype = synthesizePrototype(exec); if (propertyName == exec->propertyNames().underscoreProto) return prototype; if (!prototype->getPropertySlot(exec, propertyName, slot)) @@ -597,7 +572,7 @@ inline JSValue JSValue::get(ExecState* exec, unsigned propertyName) const inline JSValue JSValue::get(ExecState* exec, unsigned propertyName, PropertySlot& slot) const { if (UNLIKELY(!isCell())) { - JSObject* prototype = JSImmediate::prototype(asValue(), exec); + JSObject* prototype = synthesizePrototype(exec); if (!prototype->getPropertySlot(exec, propertyName, slot)) return jsUndefined(); return slot.getValue(exec, propertyName); @@ -617,7 +592,7 @@ inline JSValue JSValue::get(ExecState* exec, unsigned propertyName, PropertySlot inline void JSValue::put(ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot& slot) { if (UNLIKELY(!isCell())) { - JSImmediate::toObject(asValue(), exec)->put(exec, propertyName, value, slot); + synthesizeObject(exec)->put(exec, propertyName, value, slot); return; } asCell()->put(exec, propertyName, value, slot); @@ -626,7 +601,7 @@ inline void JSValue::put(ExecState* exec, const Identifier& propertyName, JSValu inline void JSValue::put(ExecState* exec, unsigned propertyName, JSValue value) { if (UNLIKELY(!isCell())) { - JSImmediate::toObject(asValue(), exec)->put(exec, propertyName, value); + synthesizeObject(exec)->put(exec, propertyName, value); return; } asCell()->put(exec, propertyName, value); diff --git a/JavaScriptCore/runtime/JSPropertyNameIterator.cpp b/JavaScriptCore/runtime/JSPropertyNameIterator.cpp index 8c7b53d..dc0304f 100644 --- a/JavaScriptCore/runtime/JSPropertyNameIterator.cpp +++ b/JavaScriptCore/runtime/JSPropertyNameIterator.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 Apple Inc. All rights reserved. + * Copyright (C) 2008, 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 @@ -73,11 +73,11 @@ JSObject* JSPropertyNameIterator::toObject(ExecState*) const return 0; } -void JSPropertyNameIterator::mark() +void JSPropertyNameIterator::markChildren(MarkStack& markStack) { - JSCell::mark(); - if (m_object && !m_object->marked()) - m_object->mark(); + JSCell::markChildren(markStack); + if (m_object) + markStack.append(m_object); } void JSPropertyNameIterator::invalidate() diff --git a/JavaScriptCore/runtime/JSPropertyNameIterator.h b/JavaScriptCore/runtime/JSPropertyNameIterator.h index 9817c07..4534528 100644 --- a/JavaScriptCore/runtime/JSPropertyNameIterator.h +++ b/JavaScriptCore/runtime/JSPropertyNameIterator.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 Apple Inc. All rights reserved. + * Copyright (C) 2008, 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 @@ -51,14 +51,18 @@ namespace JSC { virtual UString toString(ExecState*) const; virtual JSObject* toObject(ExecState*) const; - virtual void mark(); + virtual void markChildren(MarkStack&); JSValue next(ExecState*); void invalidate(); - + + static PassRefPtr<Structure> createStructure(JSValue prototype) + { + return Structure::create(prototype, TypeInfo(CompoundType)); + } private: - JSPropertyNameIterator(); - JSPropertyNameIterator(JSObject*, PassRefPtr<PropertyNameArrayData> propertyNameArrayData); + JSPropertyNameIterator(ExecState*); + JSPropertyNameIterator(ExecState*, JSObject*, PassRefPtr<PropertyNameArrayData> propertyNameArrayData); JSObject* m_object; RefPtr<PropertyNameArrayData> m_data; @@ -66,16 +70,16 @@ namespace JSC { PropertyNameArrayData::const_iterator m_end; }; -inline JSPropertyNameIterator::JSPropertyNameIterator() - : JSCell(0) +inline JSPropertyNameIterator::JSPropertyNameIterator(ExecState* exec) + : JSCell(exec->globalData().propertyNameIteratorStructure.get()) , m_object(0) , m_position(0) , m_end(0) { } -inline JSPropertyNameIterator::JSPropertyNameIterator(JSObject* object, PassRefPtr<PropertyNameArrayData> propertyNameArrayData) - : JSCell(0) +inline JSPropertyNameIterator::JSPropertyNameIterator(ExecState* exec, JSObject* object, PassRefPtr<PropertyNameArrayData> propertyNameArrayData) + : JSCell(exec->globalData().propertyNameIteratorStructure.get()) , m_object(object) , m_data(propertyNameArrayData) , m_position(m_data->begin()) @@ -86,12 +90,12 @@ inline JSPropertyNameIterator::JSPropertyNameIterator(JSObject* object, PassRefP inline JSPropertyNameIterator* JSPropertyNameIterator::create(ExecState* exec, JSValue v) { if (v.isUndefinedOrNull()) - return new (exec) JSPropertyNameIterator; + return new (exec) JSPropertyNameIterator(exec); JSObject* o = v.toObject(exec); PropertyNameArray propertyNames(exec); o->getPropertyNames(exec, propertyNames); - return new (exec) JSPropertyNameIterator(o, propertyNames.releaseData()); + return new (exec) JSPropertyNameIterator(exec, o, propertyNames.releaseData()); } inline JSValue JSPropertyNameIterator::next(ExecState* exec) diff --git a/JavaScriptCore/runtime/JSStaticScopeObject.cpp b/JavaScriptCore/runtime/JSStaticScopeObject.cpp index 0253fdd..a877ec6 100644 --- a/JavaScriptCore/runtime/JSStaticScopeObject.cpp +++ b/JavaScriptCore/runtime/JSStaticScopeObject.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 Apple Inc. All Rights Reserved. + * Copyright (C) 2008, 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 @@ -31,12 +31,10 @@ namespace JSC { ASSERT_CLASS_FITS_IN_CELL(JSStaticScopeObject); -void JSStaticScopeObject::mark() +void JSStaticScopeObject::markChildren(MarkStack& markStack) { - JSVariableObject::mark(); - - if (!d()->registerStore.marked()) - d()->registerStore.mark(); + JSVariableObject::markChildren(markStack); + markStack.append(d()->registerStore.jsValue()); } JSObject* JSStaticScopeObject::toThisObject(ExecState* exec) const @@ -76,9 +74,4 @@ inline bool JSStaticScopeObject::getOwnPropertySlot(ExecState*, const Identifier return symbolTableGet(propertyName, slot); } -inline bool JSStaticScopeObject::getOwnPropertySlot(ExecState*, const Identifier& propertyName, PropertySlot& slot, bool& slotIsWriteable) -{ - return symbolTableGet(propertyName, slot, slotIsWriteable); -} - } diff --git a/JavaScriptCore/runtime/JSStaticScopeObject.h b/JavaScriptCore/runtime/JSStaticScopeObject.h index 7e7ce65..5eb0e4b 100644 --- a/JavaScriptCore/runtime/JSStaticScopeObject.h +++ b/JavaScriptCore/runtime/JSStaticScopeObject.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 Apple Inc. All Rights Reserved. + * Copyright (C) 2008, 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 @@ -50,11 +50,10 @@ namespace JSC{ symbolTable().add(ident.ustring().rep(), SymbolTableEntry(-1, attributes)); } virtual ~JSStaticScopeObject(); - virtual void mark(); + virtual void markChildren(MarkStack&); bool isDynamicScope() const; virtual JSObject* toThisObject(ExecState*) const; virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&); - virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&, bool& slotIsWriteable); virtual void put(ExecState*, const Identifier&, JSValue, PutPropertySlot&); void putWithAttributes(ExecState*, const Identifier&, JSValue, unsigned attributes); diff --git a/JavaScriptCore/runtime/JSString.h b/JavaScriptCore/runtime/JSString.h index 900c565..3daf58a 100644 --- a/JavaScriptCore/runtime/JSString.h +++ b/JavaScriptCore/runtime/JSString.h @@ -23,8 +23,8 @@ #ifndef JSString_h #define JSString_h -#include "CommonIdentifiers.h" #include "CallFrame.h" +#include "CommonIdentifiers.h" #include "Identifier.h" #include "JSNumberCell.h" #include "PropertySlot.h" @@ -60,7 +60,7 @@ namespace JSC { class JSString : public JSCell { friend class JIT; - friend class VPtrSet; + friend struct VPtrSet; public: JSString(JSGlobalData* globalData, const UString& value) @@ -208,7 +208,7 @@ namespace JSC { inline JSString* JSValue::toThisJSString(ExecState* exec) { - return JSImmediate::isImmediate(asValue()) ? jsString(exec, JSImmediate::toString(asValue())) : asCell()->toThisJSString(exec); + return isCell() ? asCell()->toThisJSString(exec) : jsString(exec, toString(exec)); } } // namespace JSC diff --git a/JavaScriptCore/runtime/JSType.h b/JavaScriptCore/runtime/JSType.h index 68f2890..a118b87 100644 --- a/JavaScriptCore/runtime/JSType.h +++ b/JavaScriptCore/runtime/JSType.h @@ -33,8 +33,11 @@ namespace JSC { NumberType = 3, NullType = 4, StringType = 5, - ObjectType = 6, - GetterSetterType = 7 + + // The CompoundType value must come before any JSType that may have children + CompoundType = 6, + ObjectType = 7, + GetterSetterType = 8 }; } // namespace JSC diff --git a/JavaScriptCore/runtime/JSValue.cpp b/JavaScriptCore/runtime/JSValue.cpp index 885914d..39a4093 100644 --- a/JavaScriptCore/runtime/JSValue.cpp +++ b/JavaScriptCore/runtime/JSValue.cpp @@ -23,8 +23,15 @@ #include "config.h" #include "JSValue.h" +#include "BooleanConstructor.h" +#include "BooleanPrototype.h" +#include "ExceptionHelpers.h" +#include "JSGlobalObject.h" #include "JSFunction.h" +#include "JSNotAnObject.h" +#include "NumberObject.h" #include <wtf/MathExtras.h> +#include <wtf/StringExtras.h> namespace JSC { @@ -33,19 +40,97 @@ static const double D32 = 4294967296.0; // ECMA 9.4 double JSValue::toInteger(ExecState* exec) const { - if (isInt32Fast()) - return getInt32Fast(); + if (isInt32()) + return asInt32(); double d = toNumber(exec); return isnan(d) ? 0.0 : trunc(d); } double JSValue::toIntegerPreserveNaN(ExecState* exec) const { - if (isInt32Fast()) - return getInt32Fast(); + if (isInt32()) + return asInt32(); return trunc(toNumber(exec)); } +JSObject* JSValue::toObjectSlowCase(ExecState* exec) const +{ + ASSERT(!isCell()); + + if (isInt32() || isDouble()) + return constructNumber(exec, asValue()); + if (isTrue() || isFalse()) + return constructBooleanFromImmediateBoolean(exec, asValue()); + ASSERT(isUndefinedOrNull()); + JSNotAnObjectErrorStub* exception = createNotAnObjectErrorStub(exec, isNull()); + exec->setException(exception); + return new (exec) JSNotAnObject(exec, exception); +} + +JSObject* JSValue::toThisObjectSlowCase(ExecState* exec) const +{ + ASSERT(!isCell()); + + if (isInt32() || isDouble()) + return constructNumber(exec, asValue()); + if (isTrue() || isFalse()) + return constructBooleanFromImmediateBoolean(exec, asValue()); + ASSERT(isUndefinedOrNull()); + return exec->globalThisValue(); +} + +JSObject* JSValue::synthesizeObject(ExecState* exec) const +{ + ASSERT(!isCell()); + if (isNumber()) + return constructNumber(exec, asValue()); + if (isBoolean()) + return constructBooleanFromImmediateBoolean(exec, asValue()); + + JSNotAnObjectErrorStub* exception = createNotAnObjectErrorStub(exec, isNull()); + exec->setException(exception); + return new (exec) JSNotAnObject(exec, exception); +} + +JSObject* JSValue::synthesizePrototype(ExecState* exec) const +{ + ASSERT(!isCell()); + if (isNumber()) + return exec->lexicalGlobalObject()->numberPrototype(); + if (isBoolean()) + return exec->lexicalGlobalObject()->booleanPrototype(); + + JSNotAnObjectErrorStub* exception = createNotAnObjectErrorStub(exec, isNull()); + exec->setException(exception); + return new (exec) JSNotAnObject(exec, exception); +} + +#ifndef NDEBUG +char* JSValue::description() +{ + static const size_t size = 32; + static char description[size]; + if (isInt32()) + snprintf(description, size, "Int32: %d", asInt32()); + else if (isDouble()) + snprintf(description, size, "Double: %lf", asDouble()); + else if (isCell()) + snprintf(description, size, "Cell: %p", asCell()); + else if (isTrue()) + snprintf(description, size, "True"); + else if (isFalse()) + snprintf(description, size, "False"); + else if (isNull()) + snprintf(description, size, "Null"); + else { + ASSERT(isUndefined()); + snprintf(description, size, "Undefined"); + } + + return description; +} +#endif + int32_t toInt32SlowCase(double d, bool& ok) { ok = true; @@ -84,4 +169,9 @@ uint32_t toUInt32SlowCase(double d, bool& ok) return static_cast<uint32_t>(d32); } +NEVER_INLINE double nonInlineNaN() +{ + return std::numeric_limits<double>::quiet_NaN(); +} + } // namespace JSC diff --git a/JavaScriptCore/runtime/JSValue.h b/JavaScriptCore/runtime/JSValue.h index 391425c..408c187 100644 --- a/JavaScriptCore/runtime/JSValue.h +++ b/JavaScriptCore/runtime/JSValue.h @@ -1,7 +1,7 @@ /* * Copyright (C) 1999-2001 Harri Porten (porten@kde.org) * Copyright (C) 2001 Peter Kelly (pmk@post.com) - * Copyright (C) 2003, 2004, 2005, 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -28,8 +28,11 @@ #include "CallData.h" #include "ConstructData.h" -#include <wtf/HashTraits.h> +#include <math.h> #include <wtf/AlwaysInline.h> +#include <wtf/Assertions.h> +#include <wtf/HashTraits.h> +#include <wtf/MathExtras.h> namespace JSC { @@ -39,6 +42,7 @@ namespace JSC { class JSImmediate; class JSObject; class JSString; + class MarkStack; class PropertySlot; class PutPropertySlot; class UString; @@ -48,31 +52,37 @@ namespace JSC { enum PreferredPrimitiveType { NoPreference, PreferNumber, PreferString }; +#if USE(JSVALUE32_64) + typedef int64_t EncodedJSValue; +#else typedef void* EncodedJSValue; +#endif + + double nonInlineNaN(); + int32_t toInt32SlowCase(double, bool& ok); + uint32_t toUInt32SlowCase(double, bool& ok); class JSValue { friend class JSImmediate; - friend struct JSValueHashTraits; + friend struct EncodedJSValueHashTraits; + friend class JIT; + friend class JITStubs; + friend class JITStubCall; - static JSValue makeImmediate(intptr_t value) - { - return JSValue(reinterpret_cast<JSCell*>(value)); - } - - intptr_t immediateValue() - { - return reinterpret_cast<intptr_t>(m_ptr); - } - public: + static EncodedJSValue encode(JSValue value); + static JSValue decode(EncodedJSValue ptr); +#if !USE(JSVALUE32_64) + private: + static JSValue makeImmediate(intptr_t value); + intptr_t immediateValue(); + public: +#endif enum JSNullTag { JSNull }; enum JSUndefinedTag { JSUndefined }; enum JSTrueTag { JSTrue }; enum JSFalseTag { JSFalse }; - static EncodedJSValue encode(JSValue value); - static JSValue decode(EncodedJSValue ptr); - JSValue(); JSValue(JSNullTag); JSValue(JSUndefinedTag); @@ -94,20 +104,22 @@ namespace JSC { JSValue(ExecState*, long long); JSValue(ExecState*, unsigned long long); JSValue(JSGlobalData*, double); - JSValue(JSGlobalData*, char); - JSValue(JSGlobalData*, unsigned char); - JSValue(JSGlobalData*, short); - JSValue(JSGlobalData*, unsigned short); JSValue(JSGlobalData*, int); JSValue(JSGlobalData*, unsigned); - JSValue(JSGlobalData*, long); - JSValue(JSGlobalData*, unsigned long); - JSValue(JSGlobalData*, long long); - JSValue(JSGlobalData*, unsigned long long); operator bool() const; - bool operator==(const JSValue other) const; - bool operator!=(const JSValue other) const; + bool operator==(const JSValue& other) const; + bool operator!=(const JSValue& other) const; + + bool isInt32() const; + bool isUInt32() const; + bool isDouble() const; + bool isTrue() const; + bool isFalse() const; + + int32_t asInt32() const; + uint32_t asUInt32() const; + double asDouble() const; // Querying the type. bool isUndefined() const; @@ -134,8 +146,6 @@ namespace JSC { // Extracting integer values. bool getUInt32(uint32_t&) const; - bool getTruncatedInt32(int32_t&) const; - bool getTruncatedUInt32(uint32_t&) const; // Basic conversions. JSValue toPrimitive(ExecState*, PreferredPrimitiveType = NoPreference) const; @@ -151,37 +161,22 @@ namespace JSC { JSObject* toObject(ExecState*) const; // Integer conversions. - // 'x.numberToInt32(output)' is equivalent to 'x.isNumber() && x.toInt32(output)' double toInteger(ExecState*) const; double toIntegerPreserveNaN(ExecState*) const; int32_t toInt32(ExecState*) const; int32_t toInt32(ExecState*, bool& ok) const; - bool numberToInt32(int32_t& arg); uint32_t toUInt32(ExecState*) const; uint32_t toUInt32(ExecState*, bool& ok) const; - bool numberToUInt32(uint32_t& arg); - - // Fast integer operations; these values return results where the value is trivially available - // in a convenient form, for use in optimizations. No assumptions should be made based on the - // results of these operations, for example !isInt32Fast() does not necessarily indicate the - // result of getNumber will not be 0. - bool isInt32Fast() const; - int32_t getInt32Fast() const; - bool isUInt32Fast() const; - uint32_t getUInt32Fast() const; - static JSValue makeInt32Fast(int32_t); - static bool areBothInt32Fast(JSValue, JSValue); // Floating point conversions (this is a convenience method for webcore; // signle precision float is not a representation used in JS or JSC). float toFloat(ExecState* exec) const { return static_cast<float>(toNumber(exec)); } - // API Mangled Numbers - bool isAPIMangledNumber(); - // Garbage collection. - void mark(); + void markChildren(MarkStack&); + bool hasChildren() const; bool marked() const; + void markDirect(); // Object operations, with the toObject operation included. JSValue get(ExecState*, const Identifier& propertyName) const; @@ -208,22 +203,72 @@ namespace JSC { bool isCell() const; JSCell* asCell() const; +#ifndef NDEBUG + char* description(); +#endif + private: enum HashTableDeletedValueTag { HashTableDeletedValue }; JSValue(HashTableDeletedValueTag); inline const JSValue asValue() const { return *this; } + JSObject* toObjectSlowCase(ExecState*) const; + JSObject* toThisObjectSlowCase(ExecState*) const; + + enum { Int32Tag = 0xffffffff }; + enum { CellTag = 0xfffffffe }; + enum { TrueTag = 0xfffffffd }; + enum { FalseTag = 0xfffffffc }; + enum { NullTag = 0xfffffffb }; + enum { UndefinedTag = 0xfffffffa }; + enum { DeletedValueTag = 0xfffffff9 }; + + enum { LowestTag = DeletedValueTag }; + + uint32_t tag() const; + int32_t payload() const; + + JSObject* synthesizePrototype(ExecState*) const; + JSObject* synthesizeObject(ExecState*) const; + +#if USE(JSVALUE32_64) + union { + EncodedJSValue asEncodedJSValue; + double asDouble; +#if PLATFORM(BIG_ENDIAN) + struct { + int32_t tag; + int32_t payload; + } asBits; +#else + struct { + int32_t payload; + int32_t tag; + } asBits; +#endif + } u; +#else // USE(JSVALUE32_64) + JSCell* m_ptr; +#endif // USE(JSVALUE32_64) + }; - bool isDoubleNumber() const; - double getDoubleNumber() const; +#if USE(JSVALUE32_64) + typedef IntHash<EncodedJSValue> EncodedJSValueHash; - JSCell* m_ptr; + struct EncodedJSValueHashTraits : HashTraits<EncodedJSValue> { + static const bool emptyValueIsZero = false; + static EncodedJSValue emptyValue() { return JSValue::encode(JSValue()); } + static void constructDeletedValue(EncodedJSValue& slot) { slot = JSValue::encode(JSValue(JSValue::HashTableDeletedValue)); } + static bool isDeletedValue(EncodedJSValue value) { return value == JSValue::encode(JSValue(JSValue::HashTableDeletedValue)); } }; +#else + typedef PtrHash<EncodedJSValue> EncodedJSValueHash; - struct JSValueHashTraits : HashTraits<EncodedJSValue> { + struct EncodedJSValueHashTraits : HashTraits<EncodedJSValue> { static void constructDeletedValue(EncodedJSValue& slot) { slot = JSValue::encode(JSValue(JSValue::HashTableDeletedValue)); } static bool isDeletedValue(EncodedJSValue value) { return value == JSValue::encode(JSValue(JSValue::HashTableDeletedValue)); } }; +#endif // Stand-alone helper functions. inline JSValue jsNull() @@ -301,61 +346,396 @@ namespace JSC { return JSValue(globalData, d); } - ALWAYS_INLINE JSValue jsNumber(JSGlobalData* globalData, char i) + ALWAYS_INLINE JSValue jsNumber(JSGlobalData* globalData, int i) { return JSValue(globalData, i); } - ALWAYS_INLINE JSValue jsNumber(JSGlobalData* globalData, unsigned char i) + ALWAYS_INLINE JSValue jsNumber(JSGlobalData* globalData, unsigned i) { return JSValue(globalData, i); } - ALWAYS_INLINE JSValue jsNumber(JSGlobalData* globalData, short i) + inline bool operator==(const JSValue a, const JSCell* b) { return a == JSValue(b); } + inline bool operator==(const JSCell* a, const JSValue b) { return JSValue(a) == b; } + + inline bool operator!=(const JSValue a, const JSCell* b) { return a != JSValue(b); } + inline bool operator!=(const JSCell* a, const JSValue b) { return JSValue(a) != b; } + + inline int32_t toInt32(double val) { - return JSValue(globalData, i); + if (!(val >= -2147483648.0 && val < 2147483648.0)) { + bool ignored; + return toInt32SlowCase(val, ignored); + } + return static_cast<int32_t>(val); } - ALWAYS_INLINE JSValue jsNumber(JSGlobalData* globalData, unsigned short i) + inline uint32_t toUInt32(double val) { - return JSValue(globalData, i); + if (!(val >= 0.0 && val < 4294967296.0)) { + bool ignored; + return toUInt32SlowCase(val, ignored); + } + return static_cast<uint32_t>(val); } - ALWAYS_INLINE JSValue jsNumber(JSGlobalData* globalData, int i) + ALWAYS_INLINE int32_t JSValue::toInt32(ExecState* exec) const { - return JSValue(globalData, i); + if (isInt32()) + return asInt32(); + bool ignored; + return toInt32SlowCase(toNumber(exec), ignored); } - ALWAYS_INLINE JSValue jsNumber(JSGlobalData* globalData, unsigned i) + inline uint32_t JSValue::toUInt32(ExecState* exec) const { - return JSValue(globalData, i); + if (isUInt32()) + return asInt32(); + bool ignored; + return toUInt32SlowCase(toNumber(exec), ignored); } - ALWAYS_INLINE JSValue jsNumber(JSGlobalData* globalData, long i) + inline int32_t JSValue::toInt32(ExecState* exec, bool& ok) const { - return JSValue(globalData, i); + if (isInt32()) { + ok = true; + return asInt32(); + } + return toInt32SlowCase(toNumber(exec), ok); } - ALWAYS_INLINE JSValue jsNumber(JSGlobalData* globalData, unsigned long i) + inline uint32_t JSValue::toUInt32(ExecState* exec, bool& ok) const { - return JSValue(globalData, i); + if (isUInt32()) { + ok = true; + return asInt32(); + } + return toUInt32SlowCase(toNumber(exec), ok); } - ALWAYS_INLINE JSValue jsNumber(JSGlobalData* globalData, long long i) +#if USE(JSVALUE32_64) + inline JSValue jsNaN(ExecState* exec) { - return JSValue(globalData, i); + return JSValue(exec, nonInlineNaN()); } - ALWAYS_INLINE JSValue jsNumber(JSGlobalData* globalData, unsigned long long i) + // JSValue member functions. + inline EncodedJSValue JSValue::encode(JSValue value) { - return JSValue(globalData, i); + return value.u.asEncodedJSValue; } - inline bool operator==(const JSValue a, const JSCell* b) { return a == JSValue(b); } - inline bool operator==(const JSCell* a, const JSValue b) { return JSValue(a) == b; } + inline JSValue JSValue::decode(EncodedJSValue encodedJSValue) + { + JSValue v; + v.u.asEncodedJSValue = encodedJSValue; + return v; + } - inline bool operator!=(const JSValue a, const JSCell* b) { return a != JSValue(b); } - inline bool operator!=(const JSCell* a, const JSValue b) { return JSValue(a) != b; } + inline JSValue::JSValue() + { + u.asBits.tag = CellTag; + u.asBits.payload = 0; + } + + inline JSValue::JSValue(JSNullTag) + { + u.asBits.tag = NullTag; + u.asBits.payload = 0; + } + + inline JSValue::JSValue(JSUndefinedTag) + { + u.asBits.tag = UndefinedTag; + u.asBits.payload = 0; + } + + inline JSValue::JSValue(JSTrueTag) + { + u.asBits.tag = TrueTag; + u.asBits.payload = 0; + } + + inline JSValue::JSValue(JSFalseTag) + { + u.asBits.tag = FalseTag; + u.asBits.payload = 0; + } + + inline JSValue::JSValue(HashTableDeletedValueTag) + { + u.asBits.tag = DeletedValueTag; + u.asBits.payload = 0; + } + + inline JSValue::JSValue(JSCell* ptr) + { + u.asBits.tag = CellTag; + u.asBits.payload = reinterpret_cast<int32_t>(ptr); + } + + inline JSValue::JSValue(const JSCell* ptr) + { + u.asBits.tag = CellTag; + u.asBits.payload = reinterpret_cast<int32_t>(const_cast<JSCell*>(ptr)); + } + + inline JSValue::operator bool() const + { + return u.asBits.payload || tag() != CellTag; + } + + inline bool JSValue::operator==(const JSValue& other) const + { + return u.asEncodedJSValue == other.u.asEncodedJSValue; + } + + inline bool JSValue::operator!=(const JSValue& other) const + { + return u.asEncodedJSValue != other.u.asEncodedJSValue; + } + + inline bool JSValue::isUndefined() const + { + return tag() == UndefinedTag; + } + + inline bool JSValue::isNull() const + { + return tag() == NullTag; + } + + inline bool JSValue::isUndefinedOrNull() const + { + return isUndefined() || isNull(); + } + + inline bool JSValue::isCell() const + { + return tag() == CellTag; + } + + inline bool JSValue::isInt32() const + { + return tag() == Int32Tag; + } + + inline bool JSValue::isUInt32() const + { + return tag() == Int32Tag && asInt32() > -1; + } + + inline bool JSValue::isDouble() const + { + return tag() < LowestTag; + } + + inline bool JSValue::isTrue() const + { + return tag() == TrueTag; + } + + inline bool JSValue::isFalse() const + { + return tag() == FalseTag; + } + + inline uint32_t JSValue::tag() const + { + return u.asBits.tag; + } + + inline int32_t JSValue::payload() const + { + return u.asBits.payload; + } + + inline int32_t JSValue::asInt32() const + { + ASSERT(isInt32()); + return u.asBits.payload; + } + + inline uint32_t JSValue::asUInt32() const + { + ASSERT(isUInt32()); + return u.asBits.payload; + } + + inline double JSValue::asDouble() const + { + ASSERT(isDouble()); + return u.asDouble; + } + + ALWAYS_INLINE JSCell* JSValue::asCell() const + { + ASSERT(isCell()); + return reinterpret_cast<JSCell*>(u.asBits.payload); + } + + inline JSValue::JSValue(ExecState* exec, double d) + { + const int32_t asInt32 = static_cast<int32_t>(d); + if (asInt32 != d || (!asInt32 && signbit(d))) { // true for -0.0 + u.asDouble = d; + return; + } + *this = JSValue(exec, static_cast<int32_t>(d)); + } + + inline JSValue::JSValue(ExecState* exec, char i) + { + *this = JSValue(exec, static_cast<int32_t>(i)); + } + + inline JSValue::JSValue(ExecState* exec, unsigned char i) + { + *this = JSValue(exec, static_cast<int32_t>(i)); + } + + inline JSValue::JSValue(ExecState* exec, short i) + { + *this = JSValue(exec, static_cast<int32_t>(i)); + } + + inline JSValue::JSValue(ExecState* exec, unsigned short i) + { + *this = JSValue(exec, static_cast<int32_t>(i)); + } + + inline JSValue::JSValue(ExecState*, int i) + { + u.asBits.tag = Int32Tag; + u.asBits.payload = i; + } + + inline JSValue::JSValue(ExecState* exec, unsigned i) + { + if (static_cast<int32_t>(i) < 0) { + *this = JSValue(exec, static_cast<double>(i)); + return; + } + *this = JSValue(exec, static_cast<int32_t>(i)); + } + + inline JSValue::JSValue(ExecState* exec, long i) + { + if (static_cast<int32_t>(i) != i) { + *this = JSValue(exec, static_cast<double>(i)); + return; + } + *this = JSValue(exec, static_cast<int32_t>(i)); + } + + inline JSValue::JSValue(ExecState* exec, unsigned long i) + { + if (static_cast<uint32_t>(i) != i) { + *this = JSValue(exec, static_cast<double>(i)); + return; + } + *this = JSValue(exec, static_cast<uint32_t>(i)); + } + + inline JSValue::JSValue(ExecState* exec, long long i) + { + if (static_cast<int32_t>(i) != i) { + *this = JSValue(exec, static_cast<double>(i)); + return; + } + *this = JSValue(exec, static_cast<int32_t>(i)); + } + + inline JSValue::JSValue(ExecState* exec, unsigned long long i) + { + if (static_cast<uint32_t>(i) != i) { + *this = JSValue(exec, static_cast<double>(i)); + return; + } + *this = JSValue(exec, static_cast<uint32_t>(i)); + } + + inline JSValue::JSValue(JSGlobalData* globalData, double d) + { + const int32_t asInt32 = static_cast<int32_t>(d); + if (asInt32 != d || (!asInt32 && signbit(d))) { // true for -0.0 + u.asDouble = d; + return; + } + *this = JSValue(globalData, static_cast<int32_t>(d)); + } + + inline JSValue::JSValue(JSGlobalData*, int i) + { + u.asBits.tag = Int32Tag; + u.asBits.payload = i; + } + + inline JSValue::JSValue(JSGlobalData* globalData, unsigned i) + { + if (static_cast<int32_t>(i) < 0) { + *this = JSValue(globalData, static_cast<double>(i)); + return; + } + *this = JSValue(globalData, static_cast<int32_t>(i)); + } + + inline bool JSValue::isNumber() const + { + return isInt32() || isDouble(); + } + + inline bool JSValue::isBoolean() const + { + return isTrue() || isFalse(); + } + + inline bool JSValue::getBoolean(bool& v) const + { + if (isTrue()) { + v = true; + return true; + } + if (isFalse()) { + v = false; + return true; + } + + return false; + } + + inline bool JSValue::getBoolean() const + { + ASSERT(isBoolean()); + return tag() == TrueTag; + } + + inline double JSValue::uncheckedGetNumber() const + { + ASSERT(isNumber()); + return isInt32() ? asInt32() : asDouble(); + } + + ALWAYS_INLINE JSValue JSValue::toJSNumber(ExecState* exec) const + { + return isNumber() ? asValue() : jsNumber(exec, this->toNumber(exec)); + } + + inline bool JSValue::getNumber(double& result) const + { + if (isInt32()) { + result = asInt32(); + return true; + } + if (isDouble()) { + result = asDouble(); + return true; + } + return false; + } + +#else // USE(JSVALUE32_64) // JSValue member functions. inline EncodedJSValue JSValue::encode(JSValue value) @@ -368,6 +748,16 @@ namespace JSC { return JSValue(reinterpret_cast<JSCell*>(ptr)); } + inline JSValue JSValue::makeImmediate(intptr_t value) + { + return JSValue(reinterpret_cast<JSCell*>(value)); + } + + inline intptr_t JSValue::immediateValue() + { + return reinterpret_cast<intptr_t>(m_ptr); + } + // 0x0 can never occur naturally because it has a tag of 00, indicating a pointer value, but a payload of 0x0, which is in the (invalid) zero page. inline JSValue::JSValue() : m_ptr(0) @@ -395,12 +785,12 @@ namespace JSC { return m_ptr; } - inline bool JSValue::operator==(const JSValue other) const + inline bool JSValue::operator==(const JSValue& other) const { return m_ptr == other.m_ptr; } - inline bool JSValue::operator!=(const JSValue other) const + inline bool JSValue::operator!=(const JSValue& other) const { return m_ptr != other.m_ptr; } @@ -414,6 +804,7 @@ namespace JSC { { return asValue() == jsNull(); } +#endif // USE(JSVALUE32_64) } // namespace JSC diff --git a/JavaScriptCore/runtime/JSWrapperObject.cpp b/JavaScriptCore/runtime/JSWrapperObject.cpp index fb57018..2c39f5c 100644 --- a/JavaScriptCore/runtime/JSWrapperObject.cpp +++ b/JavaScriptCore/runtime/JSWrapperObject.cpp @@ -1,6 +1,6 @@ /* * Copyright (C) 2006 Maks Orlovich - * Copyright (C) 2006 Apple Computer, Inc. + * Copyright (C) 2006, 2009 Apple, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -26,11 +26,11 @@ namespace JSC { ASSERT_CLASS_FITS_IN_CELL(JSWrapperObject); -void JSWrapperObject::mark() +void JSWrapperObject::markChildren(MarkStack& markStack) { - JSObject::mark(); - if (m_internalValue && !m_internalValue.marked()) - m_internalValue.mark(); + JSObject::markChildren(markStack); + if (m_internalValue) + markStack.append(m_internalValue); } } // namespace JSC diff --git a/JavaScriptCore/runtime/JSWrapperObject.h b/JavaScriptCore/runtime/JSWrapperObject.h index 2a2e3c6..0b2c680 100644 --- a/JavaScriptCore/runtime/JSWrapperObject.h +++ b/JavaScriptCore/runtime/JSWrapperObject.h @@ -36,7 +36,7 @@ namespace JSC { JSValue internalValue() const { return m_internalValue; } void setInternalValue(JSValue); - virtual void mark(); + virtual void markChildren(MarkStack&); private: JSValue m_internalValue; diff --git a/JavaScriptCore/runtime/LiteralParser.cpp b/JavaScriptCore/runtime/LiteralParser.cpp index 10f9a13..17ec906 100644 --- a/JavaScriptCore/runtime/LiteralParser.cpp +++ b/JavaScriptCore/runtime/LiteralParser.cpp @@ -28,31 +28,12 @@ #include "JSArray.h" #include "JSString.h" +#include "Lexer.h" #include <wtf/ASCIICType.h> +#include <wtf/dtoa.h> namespace JSC { -class LiteralParser::StackGuard { -public: - StackGuard(LiteralParser* parser) - : m_parser(parser) - { - m_parser->m_depth++; - } - ~StackGuard() - { - m_parser->m_depth--; - } - bool isSafe() { return m_parser->m_depth < 10; } -private: - LiteralParser* m_parser; -}; - -static bool isSafeStringCharacter(UChar c) -{ - return (c >= ' ' && c <= 0xff && c != '\\') || c == '\t'; -} - LiteralParser::TokenType LiteralParser::Lexer::lex(LiteralParserToken& token) { while (m_ptr < m_end && isASCIISpace(*m_ptr)) @@ -100,8 +81,33 @@ LiteralParser::TokenType LiteralParser::Lexer::lex(LiteralParserToken& token) token.end = ++m_ptr; return TokColon; case '"': - return lexString(token); - + if (m_mode == StrictJSON) + return lexString<StrictJSON>(token); + return lexString<NonStrictJSON>(token); + case 't': + if (m_end - m_ptr >= 4 && m_ptr[1] == 'r' && m_ptr[2] == 'u' && m_ptr[3] == 'e') { + m_ptr += 4; + token.type = TokTrue; + token.end = m_ptr; + return TokTrue; + } + break; + case 'f': + if (m_end - m_ptr >= 5 && m_ptr[1] == 'a' && m_ptr[2] == 'l' && m_ptr[3] == 's' && m_ptr[4] == 'e') { + m_ptr += 5; + token.type = TokFalse; + token.end = m_ptr; + return TokFalse; + } + break; + case 'n': + if (m_end - m_ptr >= 4 && m_ptr[1] == 'u' && m_ptr[2] == 'l' && m_ptr[3] == 'l') { + m_ptr += 4; + token.type = TokNull; + token.end = m_ptr; + return TokNull; + } + break; case '-': case '0': case '1': @@ -118,16 +124,81 @@ LiteralParser::TokenType LiteralParser::Lexer::lex(LiteralParserToken& token) return TokError; } -LiteralParser::TokenType LiteralParser::Lexer::lexString(LiteralParserToken& token) +template <LiteralParser::ParserMode mode> static inline bool isSafeStringCharacter(UChar c) +{ + return (c >= ' ' && (mode == LiteralParser::StrictJSON || c <= 0xff) && c != '\\' && c != '"') || c == '\t'; +} + +// "inline" is required here to help WINSCW compiler resolve specialized argument in templated functions. +template <LiteralParser::ParserMode mode> inline LiteralParser::TokenType LiteralParser::Lexer::lexString(LiteralParserToken& token) { ++m_ptr; - while (m_ptr < m_end && isSafeStringCharacter(*m_ptr) && *m_ptr != '"') - ++m_ptr; - if (m_ptr >= m_end || *m_ptr != '"') { - token.type = TokError; - token.end = ++m_ptr; + const UChar* runStart; + token.stringToken = UString(); + do { + runStart = m_ptr; + while (m_ptr < m_end && isSafeStringCharacter<mode>(*m_ptr)) + ++m_ptr; + if (runStart < m_ptr) + token.stringToken.append(runStart, m_ptr - runStart); + if ((mode == StrictJSON) && m_ptr < m_end && *m_ptr == '\\') { + ++m_ptr; + if (m_ptr >= m_end) + return TokError; + switch (*m_ptr) { + case '"': + token.stringToken.append('"'); + m_ptr++; + break; + case '\\': + token.stringToken.append('\\'); + m_ptr++; + break; + case '/': + token.stringToken.append('/'); + m_ptr++; + break; + case 'b': + token.stringToken.append('\b'); + m_ptr++; + break; + case 'f': + token.stringToken.append('\f'); + m_ptr++; + break; + case 'n': + token.stringToken.append('\n'); + m_ptr++; + break; + case 'r': + token.stringToken.append('\r'); + m_ptr++; + break; + case 't': + token.stringToken.append('\t'); + m_ptr++; + break; + + case 'u': + if ((m_end - m_ptr) < 5) // uNNNN == 5 characters + return TokError; + for (int i = 1; i < 5; i++) { + if (!isASCIIHexDigit(m_ptr[i])) + return TokError; + } + token.stringToken.append(JSC::Lexer::convertUnicode(m_ptr[1], m_ptr[2], m_ptr[3], m_ptr[4])); + m_ptr += 5; + break; + + default: + return TokError; + } + } + } while ((mode == StrictJSON) && m_ptr != runStart && (m_ptr < m_end) && *m_ptr != '"'); + + if (m_ptr >= m_end || *m_ptr != '"') return TokError; - } + token.type = TokString; token.end = ++m_ptr; return TokString; @@ -167,7 +238,7 @@ LiteralParser::TokenType LiteralParser::Lexer::lexNumber(LiteralParserToken& tok if (m_ptr < m_end && *m_ptr == '.') { ++m_ptr; // [0-9]+ - if (m_ptr >= m_end && !isASCIIDigit(*m_ptr)) + if (m_ptr >= m_end || !isASCIIDigit(*m_ptr)) return TokError; ++m_ptr; @@ -184,7 +255,7 @@ LiteralParser::TokenType LiteralParser::Lexer::lexNumber(LiteralParserToken& tok ++m_ptr; // [0-9]+ - if (m_ptr >= m_end && !isASCIIDigit(*m_ptr)) + if (m_ptr >= m_end || !isASCIIDigit(*m_ptr)) return TokError; ++m_ptr; @@ -194,113 +265,186 @@ LiteralParser::TokenType LiteralParser::Lexer::lexNumber(LiteralParserToken& tok token.type = TokNumber; token.end = m_ptr; + Vector<char, 64> buffer(token.end - token.start + 1); + int i; + for (i = 0; i < token.end - token.start; i++) { + ASSERT(static_cast<char>(token.start[i]) == token.start[i]); + buffer[i] = static_cast<char>(token.start[i]); + } + buffer[i] = 0; + char* end; + token.numberToken = WTF::strtod(buffer.data(), &end); + ASSERT(buffer.data() + (token.end - token.start) == end); return TokNumber; } -JSValue LiteralParser::parseStatement() +JSValue LiteralParser::parse(ParserState initialState) { - StackGuard guard(this); - if (!guard.isSafe()) - return abortParse(); + ParserState state = initialState; + MarkedArgumentBuffer objectStack; + JSValue lastValue; + Vector<ParserState, 16> stateStack; + Vector<Identifier, 16> identifierStack; + while (1) { + switch(state) { + startParseArray: + case StartParseArray: { + JSArray* array = constructEmptyArray(m_exec); + objectStack.append(array); + // fallthrough + } + doParseArrayStartExpression: + case DoParseArrayStartExpression: { + if (m_lexer.next() == TokRBracket) { + m_lexer.next(); + lastValue = objectStack.last(); + objectStack.removeLast(); + break; + } - switch (m_lexer.currentToken().type) { - case TokLBracket: - case TokNumber: - case TokString: - return parseExpression(); - case TokLParen: { - m_lexer.next(); - JSValue result = parseExpression(); - if (m_aborted || m_lexer.currentToken().type != TokRParen) - return abortParse(); - m_lexer.next(); - return result; - } - default: - return abortParse(); - } -} + stateStack.append(DoParseArrayEndExpression); + goto startParseExpression; + } + case DoParseArrayEndExpression: { + asArray(objectStack.last())->push(m_exec, lastValue); + + if (m_lexer.currentToken().type == TokComma) + goto doParseArrayStartExpression; -JSValue LiteralParser::parseExpression() -{ - StackGuard guard(this); - if (!guard.isSafe()) - return abortParse(); - switch (m_lexer.currentToken().type) { - case TokLBracket: - return parseArray(); - case TokLBrace: - return parseObject(); - case TokString: { - Lexer::LiteralParserToken stringToken = m_lexer.currentToken(); - m_lexer.next(); - return jsString(m_exec, UString(stringToken.start + 1, stringToken.end - stringToken.start - 2)); - } - case TokNumber: { - Lexer::LiteralParserToken numberToken = m_lexer.currentToken(); - m_lexer.next(); - return jsNumber(m_exec, UString(numberToken.start, numberToken.end - numberToken.start).toDouble()); - } - default: - return JSValue(); - } -} + if (m_lexer.currentToken().type != TokRBracket) + return JSValue(); + + m_lexer.next(); + lastValue = objectStack.last(); + objectStack.removeLast(); + break; + } + startParseObject: + case StartParseObject: { + JSObject* object = constructEmptyObject(m_exec); + objectStack.append(object); -JSValue LiteralParser::parseArray() -{ - StackGuard guard(this); - if (!guard.isSafe()) - return abortParse(); - JSArray* array = constructEmptyArray(m_exec); - while (true) { - m_lexer.next(); - JSValue value = parseExpression(); - if (m_aborted) - return JSValue(); - if (!value) - break; - array->push(m_exec, value); + TokenType type = m_lexer.next(); + if (type == TokString) { + Lexer::LiteralParserToken identifierToken = m_lexer.currentToken(); - if (m_lexer.currentToken().type != TokComma) - break; - } - if (m_lexer.currentToken().type != TokRBracket) - return abortParse(); + // Check for colon + if (m_lexer.next() != TokColon) + return JSValue(); + + m_lexer.next(); + identifierStack.append(Identifier(m_exec, identifierToken.stringToken)); + stateStack.append(DoParseObjectEndExpression); + goto startParseExpression; + } else if (type != TokRBrace) + return JSValue(); + m_lexer.next(); + lastValue = objectStack.last(); + objectStack.removeLast(); + break; + } + doParseObjectStartExpression: + case DoParseObjectStartExpression: { + TokenType type = m_lexer.next(); + if (type != TokString) + return JSValue(); + Lexer::LiteralParserToken identifierToken = m_lexer.currentToken(); - m_lexer.next(); - return array; -} + // Check for colon + if (m_lexer.next() != TokColon) + return JSValue(); -JSValue LiteralParser::parseObject() -{ - StackGuard guard(this); - if (!guard.isSafe()) - return abortParse(); - JSObject* object = constructEmptyObject(m_exec); - - while (m_lexer.next() == TokString) { - Lexer::LiteralParserToken identifierToken = m_lexer.currentToken(); - - // Check for colon - if (m_lexer.next() != TokColon) - return abortParse(); - m_lexer.next(); - - JSValue value = parseExpression(); - if (!value || m_aborted) - return abortParse(); - - Identifier ident(m_exec, identifierToken.start + 1, identifierToken.end - identifierToken.start - 2); - object->putDirect(ident, value); - - if (m_lexer.currentToken().type != TokComma) - break; + m_lexer.next(); + identifierStack.append(Identifier(m_exec, identifierToken.stringToken)); + stateStack.append(DoParseObjectEndExpression); + goto startParseExpression; + } + case DoParseObjectEndExpression: + { + asObject(objectStack.last())->putDirect(identifierStack.last(), lastValue); + identifierStack.removeLast(); + if (m_lexer.currentToken().type == TokComma) + goto doParseObjectStartExpression; + if (m_lexer.currentToken().type != TokRBrace) + return JSValue(); + m_lexer.next(); + lastValue = objectStack.last(); + objectStack.removeLast(); + break; + } + startParseExpression: + case StartParseExpression: { + switch (m_lexer.currentToken().type) { + case TokLBracket: + goto startParseArray; + case TokLBrace: + goto startParseObject; + case TokString: { + Lexer::LiteralParserToken stringToken = m_lexer.currentToken(); + m_lexer.next(); + lastValue = jsString(m_exec, stringToken.stringToken); + break; + } + case TokNumber: { + Lexer::LiteralParserToken numberToken = m_lexer.currentToken(); + m_lexer.next(); + lastValue = jsNumber(m_exec, numberToken.numberToken); + break; + } + case TokNull: + m_lexer.next(); + lastValue = jsNull(); + break; + + case TokTrue: + m_lexer.next(); + lastValue = jsBoolean(true); + break; + + case TokFalse: + m_lexer.next(); + lastValue = jsBoolean(false); + break; + + default: + // Error + return JSValue(); + } + break; + } + case StartParseStatement: { + switch (m_lexer.currentToken().type) { + case TokLBracket: + case TokNumber: + case TokString: + goto startParseExpression; + + case TokLParen: { + m_lexer.next(); + stateStack.append(StartParseStatementEndStatement); + goto startParseExpression; + } + default: + return JSValue(); + } + } + case StartParseStatementEndStatement: { + ASSERT(stateStack.isEmpty()); + if (m_lexer.currentToken().type != TokRParen) + return JSValue(); + if (m_lexer.next() == TokEnd) + return lastValue; + return JSValue(); + } + default: + ASSERT_NOT_REACHED(); + } + if (stateStack.isEmpty()) + return lastValue; + state = stateStack.last(); + stateStack.removeLast(); + continue; } - - if (m_lexer.currentToken().type != TokRBrace) - return abortParse(); - m_lexer.next(); - return object; } } diff --git a/JavaScriptCore/runtime/LiteralParser.h b/JavaScriptCore/runtime/LiteralParser.h index a72e3d0..bceee7c 100644 --- a/JavaScriptCore/runtime/LiteralParser.h +++ b/JavaScriptCore/runtime/LiteralParser.h @@ -34,27 +34,31 @@ namespace JSC { class LiteralParser { public: - LiteralParser(ExecState* exec, const UString& s) + typedef enum { StrictJSON, NonStrictJSON } ParserMode; + LiteralParser(ExecState* exec, const UString& s, ParserMode mode) : m_exec(exec) - , m_lexer(s) - , m_depth(0) - , m_aborted(false) + , m_lexer(s, mode) + , m_mode(mode) { } JSValue tryLiteralParse() { m_lexer.next(); - JSValue result = parseStatement(); - if (m_aborted || m_lexer.currentToken().type != TokEnd) + JSValue result = parse(m_mode == StrictJSON ? StartParseExpression : StartParseStatement); + if (m_lexer.currentToken().type != TokEnd) return JSValue(); return result; } private: - + enum ParserState { StartParseObject, StartParseArray, StartParseExpression, + StartParseStatement, StartParseStatementEndStatement, + DoParseObjectStartExpression, DoParseObjectEndExpression, + DoParseArrayStartExpression, DoParseArrayEndExpression }; enum TokenType { TokLBracket, TokRBracket, TokLBrace, TokRBrace, TokString, TokIdentifier, TokNumber, TokColon, - TokLParen, TokRParen, TokComma, TokEnd, TokError }; + TokLParen, TokRParen, TokComma, TokTrue, TokFalse, + TokNull, TokEnd, TokError }; class Lexer { public: @@ -62,9 +66,12 @@ namespace JSC { TokenType type; const UChar* start; const UChar* end; + UString stringToken; + double numberToken; }; - Lexer(const UString& s) + Lexer(const UString& s, ParserMode mode) : m_string(s) + , m_mode(mode) , m_ptr(s.data()) , m_end(s.data() + s.size()) { @@ -82,30 +89,21 @@ namespace JSC { private: TokenType lex(LiteralParserToken&); - TokenType lexString(LiteralParserToken&); + template <ParserMode parserMode> TokenType lexString(LiteralParserToken&); TokenType lexNumber(LiteralParserToken&); LiteralParserToken m_currentToken; UString m_string; + ParserMode m_mode; const UChar* m_ptr; const UChar* m_end; }; class StackGuard; - JSValue parseStatement(); - JSValue parseExpression(); - JSValue parseArray(); - JSValue parseObject(); - - JSValue abortParse() - { - m_aborted = true; - return JSValue(); - } + JSValue parse(ParserState); ExecState* m_exec; LiteralParser::Lexer m_lexer; - int m_depth; - bool m_aborted; + ParserMode m_mode; }; } diff --git a/JavaScriptCore/runtime/Lookup.h b/JavaScriptCore/runtime/Lookup.h index 3b7353d..167f2bc 100644 --- a/JavaScriptCore/runtime/Lookup.h +++ b/JavaScriptCore/runtime/Lookup.h @@ -29,6 +29,13 @@ #include <stdio.h> #include <wtf/Assertions.h> +// Bug #26843: Work around Metrowerks compiler bug +#if COMPILER(WINSCW) +#define JSC_CONST_HASHTABLE +#else +#define JSC_CONST_HASHTABLE const +#endif + namespace JSC { // Hash table generated by the create_hash_table script. diff --git a/JavaScriptCore/runtime/MarkStack.cpp b/JavaScriptCore/runtime/MarkStack.cpp new file mode 100644 index 0000000..80dbb17 --- /dev/null +++ b/JavaScriptCore/runtime/MarkStack.cpp @@ -0,0 +1,41 @@ +/* + * 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. + */ + +#include "config.h" +#include "MarkStack.h" + +namespace JSC +{ + +size_t MarkStack::s_pageSize = 0; + +void MarkStack::compact() +{ + ASSERT(s_pageSize); + m_values.shrinkAllocation(s_pageSize); + m_markSets.shrinkAllocation(s_pageSize); +} + +} diff --git a/JavaScriptCore/runtime/MarkStack.h b/JavaScriptCore/runtime/MarkStack.h new file mode 100644 index 0000000..7a7b3af --- /dev/null +++ b/JavaScriptCore/runtime/MarkStack.h @@ -0,0 +1,171 @@ +/* + * 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 MarkStack_h +#define MarkStack_h + +#include "JSValue.h" + +#include <wtf/Noncopyable.h> + +namespace JSC { + class Register; + + enum MarkSetProperties { MayContainNullValues, NoNullValues }; + + class MarkStack : Noncopyable { + public: + MarkStack() + : m_markSets() + , m_values() + { + } + + ALWAYS_INLINE void append(JSValue value) + { + ASSERT(value); + if (value.marked()) + return; + value.markDirect(); + if (value.hasChildren()) + m_values.append(value.asCell()); + } + + ALWAYS_INLINE void append(JSCell* cell); + + ALWAYS_INLINE void appendValues(Register* values, size_t count, MarkSetProperties properties = NoNullValues) + { + appendValues(reinterpret_cast<JSValue*>(values), count, properties); + } + + ALWAYS_INLINE void appendValues(JSValue* values, size_t count, MarkSetProperties properties = NoNullValues) + { + if (count) + m_markSets.append(MarkSet(values, values + count, properties)); + } + + inline void drain(); + void compact(); + + ~MarkStack() + { + ASSERT(m_markSets.isEmpty()); + ASSERT(m_values.isEmpty()); + } + + private: + struct MarkSet { + MarkSet(JSValue* values, JSValue* end, MarkSetProperties properties) + : m_values(values) + , m_end(end) + , m_properties(properties) + { + } + JSValue* m_values; + JSValue* m_end; + MarkSetProperties m_properties; + }; + + static void* allocateStack(size_t size); + static void releaseStack(void* addr, size_t size); + + static void initializePagesize(); + static size_t pageSize() + { + if (!s_pageSize) + initializePagesize(); + return s_pageSize; + } + + template <typename T> struct MarkStackArray { + MarkStackArray() + : m_top(0) + , m_allocated(MarkStack::pageSize()) + , m_capacity(m_allocated / sizeof(T)) + { + m_data = reinterpret_cast<T*>(allocateStack(m_allocated)); + } + + ~MarkStackArray() + { + releaseStack(m_data, m_allocated); + } + + void expand() + { + size_t oldAllocation = m_allocated; + m_allocated *= 2; + m_capacity = m_allocated / sizeof(T); + void* newData = allocateStack(m_allocated); + memcpy(newData, m_data, oldAllocation); + releaseStack(m_data, oldAllocation); + m_data = reinterpret_cast<T*>(newData); + } + + inline void append(const T& v) + { + if (m_top == m_capacity) + expand(); + m_data[m_top++] = v; + } + + inline T removeLast() + { + ASSERT(m_top); + return m_data[--m_top]; + } + + inline bool isEmpty() + { + return m_top == 0; + } + + inline size_t size() { return m_top; } + + inline void shrinkAllocation(size_t size) + { + ASSERT(size <= m_allocated); + ASSERT(0 == (size % MarkStack::pageSize())); + if (size == m_allocated) + return; + releaseStack(reinterpret_cast<char*>(m_data) + size, m_allocated - size); + m_allocated = size; + m_capacity = m_allocated / sizeof(T); + } + + private: + size_t m_top; + size_t m_allocated; + size_t m_capacity; + T* m_data; + }; + + MarkStackArray<MarkSet> m_markSets; + MarkStackArray<JSCell*> m_values; + static size_t s_pageSize; + }; +} + +#endif diff --git a/JavaScriptCore/runtime/MarkStackPosix.cpp b/JavaScriptCore/runtime/MarkStackPosix.cpp new file mode 100644 index 0000000..8e78ff3 --- /dev/null +++ b/JavaScriptCore/runtime/MarkStackPosix.cpp @@ -0,0 +1,50 @@ +/* + * 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. + */ + +#include "config.h" + + +#include "MarkStack.h" + +#include <unistd.h> +#include <sys/mman.h> + +namespace JSC { + +void MarkStack::initializePagesize() +{ + MarkStack::s_pageSize = getpagesize(); +} + +void* MarkStack::allocateStack(size_t size) +{ + return mmap(0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); +} +void MarkStack::releaseStack(void* addr, size_t size) +{ + munmap(addr, size); +} + +} diff --git a/JavaScriptCore/runtime/MarkStackWin.cpp b/JavaScriptCore/runtime/MarkStackWin.cpp new file mode 100644 index 0000000..dbc3306 --- /dev/null +++ b/JavaScriptCore/runtime/MarkStackWin.cpp @@ -0,0 +1,51 @@ +/* + * 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. + */ + +#include "config.h" + + +#include "MarkStack.h" + +#include "windows.h" + +namespace JSC { + +void MarkStack::initializePagesize() +{ + SYSTEM_INFO system_info; + GetSystemInfo(&system_info); + MarkStack::s_pageSize = system_info.dwPageSize; +} + +void* MarkStack::allocateStack(size_t size) +{ + return VirtualAlloc(0, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); +} +void MarkStack::releaseStack(void* addr, size_t size) +{ + VirtualFree(addr, size, MEM_RELEASE); +} + +} diff --git a/JavaScriptCore/runtime/ObjectConstructor.cpp b/JavaScriptCore/runtime/ObjectConstructor.cpp index cf1790f..70c7cd1 100644 --- a/JavaScriptCore/runtime/ObjectConstructor.cpp +++ b/JavaScriptCore/runtime/ObjectConstructor.cpp @@ -24,12 +24,15 @@ #include "JSFunction.h" #include "JSGlobalObject.h" #include "ObjectPrototype.h" +#include "PrototypeFunction.h" namespace JSC { ASSERT_CLASS_FITS_IN_CELL(ObjectConstructor); -ObjectConstructor::ObjectConstructor(ExecState* exec, PassRefPtr<Structure> structure, ObjectPrototype* objectPrototype) +static JSValue JSC_HOST_CALL objectConstructorGetPrototypeOf(ExecState*, JSObject*, JSValue, const ArgList&); + +ObjectConstructor::ObjectConstructor(ExecState* exec, PassRefPtr<Structure> structure, ObjectPrototype* objectPrototype, Structure* prototypeFunctionStructure) : InternalFunction(&exec->globalData(), structure, Identifier(exec, "Object")) { // ECMA 15.2.3.1 @@ -37,6 +40,8 @@ ObjectConstructor::ObjectConstructor(ExecState* exec, PassRefPtr<Structure> stru // no. of arguments for constructor putDirectWithoutTransition(exec->propertyNames().length, jsNumber(exec, 1), ReadOnly | DontEnum | DontDelete); + + putDirectFunctionWithoutTransition(exec, new (exec) NativeFunctionWrapper(exec, prototypeFunctionStructure, 1, exec->propertyNames().getPrototypeOf, objectConstructorGetPrototypeOf), DontEnum); } // ECMA 15.2.2 @@ -70,4 +75,11 @@ CallType ObjectConstructor::getCallData(CallData& callData) return CallTypeHost; } +JSValue JSC_HOST_CALL objectConstructorGetPrototypeOf(ExecState* exec, JSObject*, JSValue, const ArgList& args) +{ + if (!args.at(0).isObject()) + return throwError(exec, TypeError, "Requested prototype of a value that is not an object."); + return asObject(args.at(0))->prototype(); +} + } // namespace JSC diff --git a/JavaScriptCore/runtime/ObjectConstructor.h b/JavaScriptCore/runtime/ObjectConstructor.h index f8c058a..9373781 100644 --- a/JavaScriptCore/runtime/ObjectConstructor.h +++ b/JavaScriptCore/runtime/ObjectConstructor.h @@ -29,7 +29,7 @@ namespace JSC { class ObjectConstructor : public InternalFunction { public: - ObjectConstructor(ExecState*, PassRefPtr<Structure>, ObjectPrototype*); + ObjectConstructor(ExecState*, PassRefPtr<Structure>, ObjectPrototype*, Structure* prototypeFunctionStructure); private: virtual ConstructType getConstructData(ConstructData&); diff --git a/JavaScriptCore/runtime/Operations.h b/JavaScriptCore/runtime/Operations.h index acfc6c2..c4900d3 100644 --- a/JavaScriptCore/runtime/Operations.h +++ b/JavaScriptCore/runtime/Operations.h @@ -38,7 +38,7 @@ namespace JSC { // ECMA 11.9.3 inline bool JSValue::equal(ExecState* exec, JSValue v1, JSValue v2) { - if (JSImmediate::areBothImmediateIntegerNumbers(v1, v2)) + if (v1.isInt32() && v2.isInt32()) return v1 == v2; return equalSlowCase(exec, v1, v2); @@ -46,8 +46,6 @@ namespace JSC { ALWAYS_INLINE bool JSValue::equalSlowCaseInline(ExecState* exec, JSValue v1, JSValue v2) { - ASSERT(!JSImmediate::areBothImmediateIntegerNumbers(v1, v2)); - do { if (v1.isNumber() && v2.isNumber()) return v1.uncheckedGetNumber() == v2.uncheckedGetNumber(); @@ -60,13 +58,13 @@ namespace JSC { if (v1.isUndefinedOrNull()) { if (v2.isUndefinedOrNull()) return true; - if (JSImmediate::isImmediate(v2)) + if (!v2.isCell()) return false; return v2.asCell()->structure()->typeInfo().masqueradesAsUndefined(); } if (v2.isUndefinedOrNull()) { - if (JSImmediate::isImmediate(v1)) + if (!v1.isCell()) return false; return v1.asCell()->structure()->typeInfo().masqueradesAsUndefined(); } @@ -78,7 +76,7 @@ namespace JSC { if (exec->hadException()) return false; v1 = p1; - if (JSImmediate::areBothImmediateIntegerNumbers(v1, v2)) + if (v1.isInt32() && v2.isInt32()) return v1 == v2; continue; } @@ -88,7 +86,7 @@ namespace JSC { if (exec->hadException()) return false; v2 = p2; - if (JSImmediate::areBothImmediateIntegerNumbers(v1, v2)) + if (v1.isInt32() && v2.isInt32()) return v1 == v2; continue; } @@ -114,7 +112,7 @@ namespace JSC { // ECMA 11.9.3 ALWAYS_INLINE bool JSValue::strictEqualSlowCaseInline(JSValue v1, JSValue v2) { - ASSERT(!JSImmediate::isEitherImmediate(v1, v2)); + ASSERT(v1.isCell() && v2.isCell()); if (v1.asCell()->isString() && v2.asCell()->isString()) return asString(v1)->value() == asString(v2)->value(); @@ -124,13 +122,13 @@ namespace JSC { inline bool JSValue::strictEqual(JSValue v1, JSValue v2) { - if (JSImmediate::areBothImmediateIntegerNumbers(v1, v2)) + if (v1.isInt32() && v2.isInt32()) return v1 == v2; if (v1.isNumber() && v2.isNumber()) return v1.uncheckedGetNumber() == v2.uncheckedGetNumber(); - if (JSImmediate::isEitherImmediate(v1, v2)) + if (!v1.isCell() || !v2.isCell()) return v1 == v2; return strictEqualSlowCaseInline(v1, v2); @@ -138,8 +136,8 @@ namespace JSC { inline bool jsLess(CallFrame* callFrame, JSValue v1, JSValue v2) { - if (JSValue::areBothInt32Fast(v1, v2)) - return v1.getInt32Fast() < v2.getInt32Fast(); + if (v1.isInt32() && v2.isInt32()) + return v1.asInt32() < v2.asInt32(); double n1; double n2; @@ -163,8 +161,8 @@ namespace JSC { inline bool jsLessEq(CallFrame* callFrame, JSValue v1, JSValue v2) { - if (JSValue::areBothInt32Fast(v1, v2)) - return v1.getInt32Fast() <= v2.getInt32Fast(); + if (v1.isInt32() && v2.isInt32()) + return v1.asInt32() <= v2.asInt32(); double n1; double n2; @@ -213,8 +211,8 @@ namespace JSC { } if (rightIsNumber & leftIsString) { - RefPtr<UString::Rep> value = v2.isInt32Fast() ? - concatenate(asString(v1)->value().rep(), v2.getInt32Fast()) : + RefPtr<UString::Rep> value = v2.isInt32() ? + concatenate(asString(v1)->value().rep(), v2.asInt32()) : concatenate(asString(v1)->value().rep(), right); if (!value) @@ -315,8 +313,8 @@ namespace JSC { JSValue v = strings[i].jsValue(); if (LIKELY(v.isString())) result.append(asString(v)->value()); - else if (v.isInt32Fast()) - result.appendNumeric(v.getInt32Fast()); + else if (v.isInt32()) + result.appendNumeric(v.asInt32()); else { double d; if (v.getNumber(d)) diff --git a/JavaScriptCore/runtime/PropertySlot.h b/JavaScriptCore/runtime/PropertySlot.h index 7af60ce..15d9034 100644 --- a/JavaScriptCore/runtime/PropertySlot.h +++ b/JavaScriptCore/runtime/PropertySlot.h @@ -23,7 +23,6 @@ #include "Identifier.h" #include "JSValue.h" -#include "JSImmediate.h" #include "Register.h" #include <wtf/Assertions.h> #include <wtf/NotFound.h> @@ -39,16 +38,16 @@ namespace JSC { class PropertySlot { public: PropertySlot() - : m_offset(WTF::notFound) { clearBase(); + clearOffset(); clearValue(); } explicit PropertySlot(const JSValue base) : m_slotBase(base) - , m_offset(WTF::notFound) { + clearOffset(); clearValue(); } @@ -79,21 +78,12 @@ namespace JSC { return m_offset; } - void putValue(JSValue value) - { - if (m_getValue == JSC_VALUE_SLOT_MARKER) { - *m_data.valueSlot = value; - return; - } - ASSERT(m_getValue == JSC_REGISTER_SLOT_MARKER); - *m_data.registerSlot = JSValue(value); - } - void setValueSlot(JSValue* valueSlot) { ASSERT(valueSlot); - m_getValue = JSC_VALUE_SLOT_MARKER; clearBase(); + clearOffset(); + m_getValue = JSC_VALUE_SLOT_MARKER; m_data.valueSlot = valueSlot; } @@ -117,8 +107,9 @@ namespace JSC { void setValue(JSValue value) { ASSERT(value); - m_getValue = JSC_VALUE_SLOT_MARKER; clearBase(); + clearOffset(); + m_getValue = JSC_VALUE_SLOT_MARKER; m_value = value; m_data.valueSlot = &m_value; } @@ -126,8 +117,9 @@ namespace JSC { void setRegisterSlot(Register* registerSlot) { ASSERT(registerSlot); - m_getValue = JSC_REGISTER_SLOT_MARKER; clearBase(); + clearOffset(); + m_getValue = JSC_REGISTER_SLOT_MARKER; m_data.registerSlot = registerSlot; } @@ -157,13 +149,11 @@ namespace JSC { void setUndefined() { - clearBase(); setValue(jsUndefined()); } JSValue slotBase() const { - ASSERT(m_slotBase); return m_slotBase; } @@ -188,6 +178,13 @@ namespace JSC { #endif } + void clearOffset() + { + // Clear offset even in release builds, in case this PropertySlot has been used before. + // (For other data members, we don't need to clear anything because reuse would meaningfully overwrite them.) + m_offset = WTF::notFound; + } + unsigned index() const { return m_data.index; } private: diff --git a/JavaScriptCore/runtime/RegExp.cpp b/JavaScriptCore/runtime/RegExp.cpp index 857a316..7dd4a8f 100644 --- a/JavaScriptCore/runtime/RegExp.cpp +++ b/JavaScriptCore/runtime/RegExp.cpp @@ -1,6 +1,7 @@ /* * Copyright (C) 1999-2001, 2004 Harri Porten (porten@kde.org) * Copyright (c) 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2009 Torch Mobile, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -110,7 +111,7 @@ void RegExp::compile(JSGlobalData* globalData) #endif } -int RegExp::match(const UString& s, int startOffset, OwnArrayPtr<int>* ovector) +int RegExp::match(const UString& s, int startOffset, Vector<int, 32>* ovector) { if (startOffset < 0) startOffset = 0; @@ -126,16 +127,20 @@ int RegExp::match(const UString& s, int startOffset, OwnArrayPtr<int>* ovector) if (m_regExpBytecode) { #endif int offsetVectorSize = (m_numSubpatterns + 1) * 3; // FIXME: should be 2 - but adding temporary fallback to pcre. - int* offsetVector = new int [offsetVectorSize]; + int* offsetVector; + Vector<int, 32> nonReturnedOvector; + if (ovector) { + ovector->resize(offsetVectorSize); + offsetVector = ovector->data(); + } else { + nonReturnedOvector.resize(offsetVectorSize); + offsetVector = nonReturnedOvector.data(); + } + ASSERT(offsetVector); for (int j = 0; j < offsetVectorSize; ++j) offsetVector[j] = -1; - OwnArrayPtr<int> nonReturnedOvector; - if (!ovector) - nonReturnedOvector.set(offsetVector); - else - ovector->set(offsetVector); #if ENABLE(YARR_JIT) int result = Yarr::executeRegex(m_regExpJITCode, s.data(), startOffset, s.size(), offsetVector, offsetVectorSize); @@ -177,7 +182,7 @@ void RegExp::compile(JSGlobalData* globalData) m_regExp = jsRegExpCompile(reinterpret_cast<const UChar*>(m_pattern.data()), m_pattern.size(), ignoreCaseOption, multilineOption, &m_numSubpatterns, &m_constructionError); } -int RegExp::match(const UString& s, int startOffset, OwnArrayPtr<int>* ovector) +int RegExp::match(const UString& s, int startOffset, Vector<int, 32>* ovector) { if (startOffset < 0) startOffset = 0; @@ -190,17 +195,19 @@ int RegExp::match(const UString& s, int startOffset, OwnArrayPtr<int>* ovector) #if ENABLE(WREC) if (m_wrecFunction) { int offsetVectorSize = (m_numSubpatterns + 1) * 2; - int* offsetVector = new int [offsetVectorSize]; + int* offsetVector; + Vector<int, 32> nonReturnedOvector; + if (ovector) { + ovector->resize(offsetVectorSize); + offsetVector = ovector->data(); + } else { + nonReturnedOvector.resize(offsetVectorSize); + offsetVector = nonReturnedOvector.data(); + } ASSERT(offsetVector); for (int j = 0; j < offsetVectorSize; ++j) offsetVector[j] = -1; - OwnArrayPtr<int> nonReturnedOvector; - if (!ovector) - nonReturnedOvector.set(offsetVector); - else - ovector->set(offsetVector); - int result = m_wrecFunction(s.data(), startOffset, s.size(), offsetVector); if (result < 0) { @@ -226,8 +233,8 @@ int RegExp::match(const UString& s, int startOffset, OwnArrayPtr<int>* ovector) offsetVector = fixedSizeOffsetVector; } else { offsetVectorSize = (m_numSubpatterns + 1) * 3; - offsetVector = new int [offsetVectorSize]; - ovector->set(offsetVector); + ovector->resize(offsetVectorSize); + offsetVector = ovector->data(); } int numMatches = jsRegExpExecute(m_regExp, reinterpret_cast<const UChar*>(s.data()), s.size(), startOffset, offsetVector, offsetVectorSize); diff --git a/JavaScriptCore/runtime/RegExp.h b/JavaScriptCore/runtime/RegExp.h index f3be656..24d4199 100644 --- a/JavaScriptCore/runtime/RegExp.h +++ b/JavaScriptCore/runtime/RegExp.h @@ -1,6 +1,7 @@ /* * Copyright (C) 1999-2000 Harri Porten (porten@kde.org) * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved. + * Copyright (C) 2009 Torch Mobile, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -53,7 +54,7 @@ namespace JSC { bool isValid() const { return !m_constructionError; } const char* errorMessage() const { return m_constructionError; } - int match(const UString&, int startOffset, OwnArrayPtr<int>* ovector = 0); + int match(const UString&, int startOffset, Vector<int, 32>* ovector = 0); unsigned numSubpatterns() const { return m_numSubpatterns; } private: diff --git a/JavaScriptCore/runtime/RegExpConstructor.cpp b/JavaScriptCore/runtime/RegExpConstructor.cpp index bcd0d07..6a8089d 100644 --- a/JavaScriptCore/runtime/RegExpConstructor.cpp +++ b/JavaScriptCore/runtime/RegExpConstructor.cpp @@ -1,6 +1,7 @@ /* * Copyright (C) 1999-2000 Harri Porten (porten@kde.org) * Copyright (C) 2003, 2007, 2008 Apple Inc. All Rights Reserved. + * Copyright (C) 2009 Torch Mobile, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -88,19 +89,26 @@ const ClassInfo RegExpConstructor::info = { "Function", &InternalFunction::info, @end */ -struct RegExpConstructorPrivate { +struct RegExpConstructorPrivate : FastAllocBase { // Global search cache / settings RegExpConstructorPrivate() : lastNumSubPatterns(0) , multiline(false) + , lastOvectorIndex(0) { } + const Vector<int, 32>& lastOvector() const { return ovector[lastOvectorIndex]; } + Vector<int, 32>& lastOvector() { return ovector[lastOvectorIndex]; } + Vector<int, 32>& tempOvector() { return ovector[lastOvectorIndex ? 0 : 1]; } + void changeLastOvector() { lastOvectorIndex = lastOvectorIndex ? 0 : 1; } + UString input; UString lastInput; - OwnArrayPtr<int> lastOvector; - unsigned lastNumSubPatterns : 31; + Vector<int, 32> ovector[2]; + unsigned lastNumSubPatterns : 30; bool multiline : 1; + unsigned lastOvectorIndex : 1; }; RegExpConstructor::RegExpConstructor(ExecState* exec, PassRefPtr<Structure> structure, RegExpPrototype* regExpPrototype) @@ -121,20 +129,19 @@ RegExpConstructor::RegExpConstructor(ExecState* exec, PassRefPtr<Structure> stru */ void RegExpConstructor::performMatch(RegExp* r, const UString& s, int startOffset, int& position, int& length, int** ovector) { - OwnArrayPtr<int> tmpOvector; - position = r->match(s, startOffset, &tmpOvector); + position = r->match(s, startOffset, &d->tempOvector()); if (ovector) - *ovector = tmpOvector.get(); + *ovector = d->tempOvector().data(); if (position != -1) { - ASSERT(tmpOvector); + ASSERT(!d->tempOvector().isEmpty()); - length = tmpOvector[1] - tmpOvector[0]; + length = d->tempOvector()[1] - d->tempOvector()[0]; d->input = s; d->lastInput = s; - d->lastOvector.set(tmpOvector.release()); + d->changeLastOvector(); d->lastNumSubPatterns = r->numSubpatterns(); } } @@ -147,8 +154,8 @@ RegExpMatchesArray::RegExpMatchesArray(ExecState* exec, RegExpConstructorPrivate d->lastInput = data->lastInput; d->lastNumSubPatterns = data->lastNumSubPatterns; unsigned offsetVectorSize = (data->lastNumSubPatterns + 1) * 2; // only copying the result part of the vector - d->lastOvector.set(new int[offsetVectorSize]); - memcpy(d->lastOvector.get(), data->lastOvector.get(), offsetVectorSize * sizeof(int)); + d->lastOvector().resize(offsetVectorSize); + memcpy(d->lastOvector().data(), data->lastOvector().data(), offsetVectorSize * sizeof(int)); // d->multiline is not needed, and remains uninitialized setLazyCreationData(d); @@ -167,13 +174,13 @@ void RegExpMatchesArray::fillArrayInstance(ExecState* exec) unsigned lastNumSubpatterns = d->lastNumSubPatterns; for (unsigned i = 0; i <= lastNumSubpatterns; ++i) { - int start = d->lastOvector[2 * i]; + int start = d->lastOvector()[2 * i]; if (start >= 0) - JSArray::put(exec, i, jsSubstring(exec, d->lastInput, start, d->lastOvector[2 * i + 1] - start)); + JSArray::put(exec, i, jsSubstring(exec, d->lastInput, start, d->lastOvector()[2 * i + 1] - start)); } PutPropertySlot slot; - JSArray::put(exec, exec->propertyNames().index, jsNumber(exec, d->lastOvector[0]), slot); + JSArray::put(exec, exec->propertyNames().index, jsNumber(exec, d->lastOvector()[0]), slot); JSArray::put(exec, exec->propertyNames().input, jsString(exec, d->input), slot); delete d; @@ -187,10 +194,10 @@ JSObject* RegExpConstructor::arrayOfMatches(ExecState* exec) const JSValue RegExpConstructor::getBackref(ExecState* exec, unsigned i) const { - if (d->lastOvector && i <= d->lastNumSubPatterns) { - int start = d->lastOvector[2 * i]; + if (!d->lastOvector().isEmpty() && i <= d->lastNumSubPatterns) { + int start = d->lastOvector()[2 * i]; if (start >= 0) - return jsSubstring(exec, d->lastInput, start, d->lastOvector[2 * i + 1] - start); + return jsSubstring(exec, d->lastInput, start, d->lastOvector()[2 * i + 1] - start); } return jsEmptyString(exec); } @@ -199,25 +206,25 @@ JSValue RegExpConstructor::getLastParen(ExecState* exec) const { unsigned i = d->lastNumSubPatterns; if (i > 0) { - ASSERT(d->lastOvector); - int start = d->lastOvector[2 * i]; + ASSERT(!d->lastOvector().isEmpty()); + int start = d->lastOvector()[2 * i]; if (start >= 0) - return jsSubstring(exec, d->lastInput, start, d->lastOvector[2 * i + 1] - start); + return jsSubstring(exec, d->lastInput, start, d->lastOvector()[2 * i + 1] - start); } return jsEmptyString(exec); } JSValue RegExpConstructor::getLeftContext(ExecState* exec) const { - if (d->lastOvector) - return jsSubstring(exec, d->lastInput, 0, d->lastOvector[0]); + if (!d->lastOvector().isEmpty()) + return jsSubstring(exec, d->lastInput, 0, d->lastOvector()[0]); return jsEmptyString(exec); } JSValue RegExpConstructor::getRightContext(ExecState* exec) const { - if (d->lastOvector) - return jsSubstring(exec, d->lastInput, d->lastOvector[1], d->lastInput.size() - d->lastOvector[1]); + if (!d->lastOvector().isEmpty()) + return jsSubstring(exec, d->lastInput, d->lastOvector()[1], d->lastInput.size() - d->lastOvector()[1]); return jsEmptyString(exec); } diff --git a/JavaScriptCore/runtime/RegExpObject.h b/JavaScriptCore/runtime/RegExpObject.h index fac9978..e83e0ac 100644 --- a/JavaScriptCore/runtime/RegExpObject.h +++ b/JavaScriptCore/runtime/RegExpObject.h @@ -56,7 +56,7 @@ namespace JSC { virtual CallType getCallData(CallData&); - struct RegExpObjectData { + struct RegExpObjectData : FastAllocBase { RegExpObjectData(PassRefPtr<RegExp> regExp, double lastIndex) : regExp(regExp) , lastIndex(lastIndex) diff --git a/JavaScriptCore/runtime/ScopeChain.h b/JavaScriptCore/runtime/ScopeChain.h index 6f1560a..c5e16c9 100644 --- a/JavaScriptCore/runtime/ScopeChain.h +++ b/JavaScriptCore/runtime/ScopeChain.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2003, 2008, 2009 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -21,16 +21,17 @@ #ifndef ScopeChain_h #define ScopeChain_h -#include <wtf/Assertions.h> +#include "FastAllocBase.h" namespace JSC { class JSGlobalData; class JSGlobalObject; class JSObject; + class MarkStack; class ScopeChainIterator; - class ScopeChainNode { + class ScopeChainNode : public FastAllocBase { public: ScopeChainNode(ScopeChainNode* next, JSObject* object, JSGlobalData* globalData, JSObject* globalThis) : next(next) @@ -204,7 +205,7 @@ namespace JSC { JSGlobalObject* globalObject() const { return m_node->globalObject(); } - void mark() const; + void markAggregate(MarkStack&) const; // Caution: this should only be used if the codeblock this is being used // with needs a full scope chain, otherwise this returns the depth of diff --git a/JavaScriptCore/runtime/ScopeChainMark.h b/JavaScriptCore/runtime/ScopeChainMark.h index b80b8ef..984d101 100644 --- a/JavaScriptCore/runtime/ScopeChainMark.h +++ b/JavaScriptCore/runtime/ScopeChainMark.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003, 2006, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2003, 2006, 2008, 2009 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -25,13 +25,10 @@ namespace JSC { - inline void ScopeChain::mark() const + inline void ScopeChain::markAggregate(MarkStack& markStack) const { - for (ScopeChainNode* n = m_node; n; n = n->next) { - JSObject* o = n->object; - if (!o->marked()) - o->mark(); - } + for (ScopeChainNode* n = m_node; n; n = n->next) + markStack.append(n->object); } } // namespace JSC diff --git a/JavaScriptCore/runtime/SmallStrings.cpp b/JavaScriptCore/runtime/SmallStrings.cpp index 87b49f0..2f92cc1 100644 --- a/JavaScriptCore/runtime/SmallStrings.cpp +++ b/JavaScriptCore/runtime/SmallStrings.cpp @@ -34,7 +34,7 @@ namespace JSC { static const unsigned numCharactersToStore = 0x100; -class SmallStringsStorage : Noncopyable { +class SmallStringsStorage : public Noncopyable { public: SmallStringsStorage(); @@ -85,10 +85,10 @@ SmallStrings::~SmallStrings() void SmallStrings::mark() { if (m_emptyString && !m_emptyString->marked()) - m_emptyString->mark(); + m_emptyString->markCellDirect(); for (unsigned i = 0; i < numCharactersToStore; ++i) { if (m_singleCharacterStrings[i] && !m_singleCharacterStrings[i]->marked()) - m_singleCharacterStrings[i]->mark(); + m_singleCharacterStrings[i]->markCellDirect(); } } diff --git a/JavaScriptCore/runtime/SmallStrings.h b/JavaScriptCore/runtime/SmallStrings.h index e7f1170..f0dd8df 100644 --- a/JavaScriptCore/runtime/SmallStrings.h +++ b/JavaScriptCore/runtime/SmallStrings.h @@ -36,7 +36,7 @@ namespace JSC { class SmallStringsStorage; - class SmallStrings : Noncopyable { + class SmallStrings : public Noncopyable { public: SmallStrings(); ~SmallStrings(); diff --git a/JavaScriptCore/runtime/StringPrototype.cpp b/JavaScriptCore/runtime/StringPrototype.cpp index d6939cb..531a302 100644 --- a/JavaScriptCore/runtime/StringPrototype.cpp +++ b/JavaScriptCore/runtime/StringPrototype.cpp @@ -1,6 +1,7 @@ /* * Copyright (C) 1999-2001 Harri Porten (porten@kde.org) * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2009 Torch Mobile, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -375,8 +376,8 @@ JSValue JSC_HOST_CALL stringProtoFuncCharAt(ExecState* exec, JSObject*, JSValue UString s = thisValue.toThisString(exec); unsigned len = s.size(); JSValue a0 = args.at(0); - if (a0.isUInt32Fast()) { - uint32_t i = a0.getUInt32Fast(); + if (a0.isUInt32()) { + uint32_t i = a0.asUInt32(); if (i < len) return jsSingleCharacterSubstring(exec, s, i); return jsEmptyString(exec); @@ -392,8 +393,8 @@ JSValue JSC_HOST_CALL stringProtoFuncCharCodeAt(ExecState* exec, JSObject*, JSVa UString s = thisValue.toThisString(exec); unsigned len = s.size(); JSValue a0 = args.at(0); - if (a0.isUInt32Fast()) { - uint32_t i = a0.getUInt32Fast(); + if (a0.isUInt32()) { + uint32_t i = a0.asUInt32(); if (i < len) return jsNumber(exec, s.data()[i]); return jsNaN(exec); @@ -425,8 +426,8 @@ JSValue JSC_HOST_CALL stringProtoFuncIndexOf(ExecState* exec, JSObject*, JSValue int pos; if (a1.isUndefined()) pos = 0; - else if (a1.isUInt32Fast()) - pos = min<uint32_t>(a1.getUInt32Fast(), len); + else if (a1.isUInt32()) + pos = min<uint32_t>(a1.asUInt32(), len); else { double dpos = a1.toInteger(exec); if (dpos < 0) @@ -575,7 +576,7 @@ JSValue JSC_HOST_CALL stringProtoFuncSplit(ExecState* exec, JSObject*, JSValue t } int pos = 0; while (i != limit && pos < s.size()) { - OwnArrayPtr<int> ovector; + Vector<int, 32> ovector; int mpos = reg->match(s, pos, &ovector); if (mpos < 0) break; diff --git a/JavaScriptCore/runtime/Structure.cpp b/JavaScriptCore/runtime/Structure.cpp index 3597a5c..5dfd919 100644 --- a/JavaScriptCore/runtime/Structure.cpp +++ b/JavaScriptCore/runtime/Structure.cpp @@ -306,8 +306,11 @@ void Structure::getEnumerablePropertyNames(ExecState* exec, PropertyNameArray& p } if (shouldCache) { + StructureChain* protoChain = prototypeChain(exec); m_cachedPropertyNameArrayData = propertyNames.data(); - m_cachedPropertyNameArrayData->setCachedPrototypeChain(prototypeChain(exec)); + if (!protoChain->isCacheable()) + return; + m_cachedPropertyNameArrayData->setCachedPrototypeChain(protoChain); m_cachedPropertyNameArrayData->setCachedStructure(this); } } @@ -407,6 +410,7 @@ PassRefPtr<Structure> Structure::addPropertyTransition(Structure* structure, con if (structure->transitionCount() > s_maxTransitionLength) { RefPtr<Structure> transition = toDictionaryTransition(structure); + ASSERT(structure != transition); offset = transition->put(propertyName, attributes, specificValue); if (transition->propertyStorageSize() > transition->propertyStorageCapacity()) transition->growPropertyStorageCapacity(); diff --git a/JavaScriptCore/runtime/Structure.h b/JavaScriptCore/runtime/Structure.h index 866999d..f3a0c7c 100644 --- a/JavaScriptCore/runtime/Structure.h +++ b/JavaScriptCore/runtime/Structure.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 Apple Inc. All rights reserved. + * Copyright (C) 2008, 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 @@ -29,6 +29,7 @@ #include "Identifier.h" #include "JSType.h" #include "JSValue.h" +#include "MarkStack.h" #include "PropertyMapHashTable.h" #include "StructureChain.h" #include "StructureTransitionTable.h" @@ -72,10 +73,9 @@ namespace JSC { ~Structure(); - void mark() + void markAggregate(MarkStack& markStack) { - if (!m_prototype.marked()) - m_prototype.mark(); + markStack.append(m_prototype); } // These should be used with caution. diff --git a/JavaScriptCore/runtime/StructureChain.cpp b/JavaScriptCore/runtime/StructureChain.cpp index 085876c..85049b1 100644 --- a/JavaScriptCore/runtime/StructureChain.cpp +++ b/JavaScriptCore/runtime/StructureChain.cpp @@ -46,4 +46,15 @@ StructureChain::StructureChain(Structure* head) m_vector[i] = 0; } +bool StructureChain::isCacheable() const +{ + uint32_t i = 0; + + while (m_vector[i]) { + if (m_vector[i++]->isDictionary()) + return false; + } + return true; +} + } // namespace JSC diff --git a/JavaScriptCore/runtime/StructureChain.h b/JavaScriptCore/runtime/StructureChain.h index 795e649..c48749d 100644 --- a/JavaScriptCore/runtime/StructureChain.h +++ b/JavaScriptCore/runtime/StructureChain.h @@ -39,6 +39,7 @@ namespace JSC { public: static PassRefPtr<StructureChain> create(Structure* head) { return adoptRef(new StructureChain(head)); } RefPtr<Structure>* head() { return m_vector.get(); } + bool isCacheable() const; private: StructureChain(Structure* head); diff --git a/JavaScriptCore/runtime/UString.cpp b/JavaScriptCore/runtime/UString.cpp index 0eb46da..118751e 100644 --- a/JavaScriptCore/runtime/UString.cpp +++ b/JavaScriptCore/runtime/UString.cpp @@ -63,7 +63,7 @@ extern const double NaN; extern const double Inf; // This number must be at least 2 to avoid sharing empty, null as well as 1 character strings from SmallStrings. -static const int minLengthToShare = 30; +static const int minLengthToShare = 10; static inline size_t overflowIndicator() { return std::numeric_limits<size_t>::max(); } static inline size_t maxUChars() { return std::numeric_limits<size_t>::max() / sizeof(UChar); } @@ -243,6 +243,15 @@ PassRefPtr<UString::Rep> UString::Rep::create(UChar* string, int length, PassRef return rep; } +UString::SharedUChar* UString::Rep::sharedBuffer() +{ + UString::BaseString* base = baseString(); + if (len < minLengthToShare) + return 0; + + return base->sharedBuffer(); +} + void UString::Rep::destroy() { checkConsistency(); @@ -385,10 +394,6 @@ void UString::Rep::checkConsistency() const UString::SharedUChar* UString::BaseString::sharedBuffer() { - - if (len < minLengthToShare) - return 0; - if (!m_sharedBuffer) setSharedBuffer(SharedUChar::create(new OwnFastMallocPtr<UChar>(buf))); return m_sharedBuffer; diff --git a/JavaScriptCore/runtime/UString.h b/JavaScriptCore/runtime/UString.h index 6852d91..d01b75d 100644 --- a/JavaScriptCore/runtime/UString.h +++ b/JavaScriptCore/runtime/UString.h @@ -107,6 +107,7 @@ namespace JSC { // Uses SharedUChar to have joint ownership over the UChar*. static PassRefPtr<Rep> create(UChar*, int, PassRefPtr<SharedUChar>); + SharedUChar* sharedBuffer(); void destroy(); bool baseIsSelf() const { return m_identifierTableAndFlags.isFlagSet(BaseStringFlag); } @@ -192,7 +193,6 @@ namespace JSC { struct BaseString : public Rep { bool isShared() { return rc != 1 || isBufferReadOnly(); } void setSharedBuffer(PassRefPtr<SharedUChar>); - SharedUChar* sharedBuffer(); bool isBufferReadOnly() { @@ -224,6 +224,7 @@ namespace JSC { checkConsistency(); } + SharedUChar* sharedBuffer(); bool slowIsBufferReadOnly(); friend struct Rep; diff --git a/JavaScriptCore/wscript b/JavaScriptCore/wscript new file mode 100644 index 0000000..df11430 --- /dev/null +++ b/JavaScriptCore/wscript @@ -0,0 +1,106 @@ +#! /usr/bin/env python + +# Copyright (C) 2009 Kevin Ollivier 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 COMPUTER, 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 COMPUTER, 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. +# +# JavaScriptCore build script for the waf build system + +import commands + +from settings import * + +jscore_excludes = ['jsc.cpp', 'ucptable.cpp', 'GOwnPtr.cpp'] +jscore_excludes.extend(get_excludes(jscore_dir, ['*CF.cpp'])) + +sources = [] + +jscore_excludes.extend(get_excludes(jscore_dir, ['*Win.cpp', '*None.cpp'])) + +if building_on_win32: + jscore_excludes.append('ExecutableAllocatorPosix.cpp') + sources.append('jit/ExecutableAllocatorWin.cpp') +else: + jscore_excludes.append('JSStringRefBSTR.cpp') + +def generate_jscore_derived_sources(): + # build the derived sources + js_dir = jscore_dir + if building_on_win32: + js_dir = get_output('cygpath --unix "%s"' % js_dir) + derived_sources_dir = os.path.join(jscore_dir, 'DerivedSources') + if not os.path.exists(derived_sources_dir): + os.mkdir(derived_sources_dir) + + olddir = os.getcwd() + os.chdir(derived_sources_dir) + + command = 'make -f %s/DerivedSources.make JavaScriptCore=%s BUILT_PRODUCTS_DIR=%s all FEATURE_DEFINES="%s"' % (js_dir, js_dir, js_dir, ' '.join(feature_defines)) + os.system(command) + os.chdir(olddir) + +def set_options(opt): + common_set_options(opt) + +def configure(conf): + common_configure(conf) + +def build(bld): + import Options + + generate_jscore_derived_sources() + + full_dirs = get_dirs_for_features(jscore_dir, features=[build_port], dirs=jscore_dirs) + + print 'full_dirs = %r' % full_dirs + + includes = common_includes + full_dirs + + # 1. A simple program + jscore = bld.new_task_gen( + features = 'cxx cstaticlib', + includes = '. .. assembler wrec DerivedSources ForwardingHeaders ' + ' '.join(includes), + source = sources, + target = 'jscore', + uselib = 'WX ICU ' + waf_configname, + uselib_local = '', + install_path = output_dir) + + jscore.find_sources_in_dirs(full_dirs, excludes = jscore_excludes) + + obj = bld.new_task_gen( + features = 'cxx cprogram', + includes = '. .. assembler wrec DerivedSources ForwardingHeaders ' + ' '.join(includes), + source = 'jsc.cpp', + target = 'jsc', + uselib = 'WX ICU ' + waf_configname, + uselib_local = 'jscore', + install_path = output_dir, + ) + + # we'll get an error if exceptions are on because of an unwind error when using __try + if building_on_win32: + flags = obj.env.CPPFLAGS + flags.remove('/EHsc') + obj.env.CPPFLAGS = flags + + bld.install_files(os.path.join(output_dir, 'JavaScriptCore'), 'API/*.h') diff --git a/JavaScriptCore/wtf/Assertions.cpp b/JavaScriptCore/wtf/Assertions.cpp index 6e04fe1..819ed9a 100644 --- a/JavaScriptCore/wtf/Assertions.cpp +++ b/JavaScriptCore/wtf/Assertions.cpp @@ -1,5 +1,6 @@ /* * Copyright (C) 2003, 2006, 2007 Apple Inc. All rights reserved. + * Copyright (C) 2007-2009 Torch Mobile, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -34,7 +35,7 @@ #include <CoreFoundation/CFString.h> #endif -#if COMPILER(MSVC) && !PLATFORM(WIN_CE) +#if COMPILER(MSVC) && !PLATFORM(WINCE) #ifndef WINVER #define WINVER 0x0500 #endif @@ -45,6 +46,10 @@ #include <crtdbg.h> #endif +#if PLATFORM(WINCE) +#include <winbase.h> +#endif + extern "C" { WTF_ATTRIBUTE_PRINTF(1, 0) @@ -54,7 +59,7 @@ static void vprintf_stderr_common(const char* format, va_list args) if (strstr(format, "%@")) { CFStringRef cfFormat = CFStringCreateWithCString(NULL, format, kCFStringEncodingUTF8); CFStringRef str = CFStringCreateWithFormatAndArguments(NULL, NULL, cfFormat, args); - + int length = CFStringGetMaximumSizeForEncoding(CFStringGetLength(str), kCFStringEncodingUTF8); char* buffer = (char*)malloc(length + 1); @@ -66,7 +71,7 @@ static void vprintf_stderr_common(const char* format, va_list args) CFRelease(str); CFRelease(cfFormat); } else -#elif COMPILER(MSVC) && !PLATFORM(WIN_CE) +#elif COMPILER(MSVC) && !defined(WINCEBASIC) if (IsDebuggerPresent()) { size_t size = 1024; @@ -77,7 +82,20 @@ static void vprintf_stderr_common(const char* format, va_list args) break; if (_vsnprintf(buffer, size, format, args) != -1) { +#if PLATFORM(WINCE) + // WinCE only supports wide chars + wchar_t* wideBuffer = (wchar_t*)malloc(size * sizeof(wchar_t)); + if (wideBuffer == NULL) + break; + for (unsigned int i = 0; i < size; ++i) { + if (!(wideBuffer[i] = buffer[i])) + break; + } + OutputDebugStringW(wideBuffer); + free(wideBuffer); +#else OutputDebugStringA(buffer); +#endif free(buffer); break; } @@ -101,7 +119,7 @@ static void printf_stderr_common(const char* format, ...) static void printCallSite(const char* file, int line, const char* function) { -#if PLATFORM(WIN) && defined _DEBUG +#if PLATFORM(WIN) && !PLATFORM(WINCE) && defined _DEBUG _CrtDbgReport(_CRT_WARN, file, line, NULL, "%s\n", function); #else printf_stderr_common("(%s:%d %s)\n", file, line, function); diff --git a/JavaScriptCore/wtf/Assertions.h b/JavaScriptCore/wtf/Assertions.h index 9643517..59efd84 100644 --- a/JavaScriptCore/wtf/Assertions.h +++ b/JavaScriptCore/wtf/Assertions.h @@ -128,7 +128,7 @@ void WTFLogVerbose(const char* file, int line, const char* function, WTFLogChann /* ASSERT, ASSERT_WITH_MESSAGE, ASSERT_NOT_REACHED */ -#if PLATFORM(WIN_CE) +#if PLATFORM(WINCE) && !PLATFORM(TORCHMOBILE) /* FIXME: We include this here only to avoid a conflict with the ASSERT macro. */ #include <windows.h> #undef min @@ -136,8 +136,8 @@ void WTFLogVerbose(const char* file, int line, const char* function, WTFLogChann #undef ERROR #endif -#if PLATFORM(WIN_OS) -/* FIXME: Change to use something other than ASSERT to avoid this conflict with win32. */ +#if PLATFORM(WIN_OS) || PLATFORM(SYMBIAN) +/* FIXME: Change to use something other than ASSERT to avoid this conflict with the underlying platform */ #undef ASSERT #endif diff --git a/JavaScriptCore/wtf/ByteArray.h b/JavaScriptCore/wtf/ByteArray.h index 33f0877..96e9cc2 100644 --- a/JavaScriptCore/wtf/ByteArray.h +++ b/JavaScriptCore/wtf/ByteArray.h @@ -26,8 +26,8 @@ #ifndef ByteArray_h #define ByteArray_h -#include "wtf/PassRefPtr.h" -#include "wtf/RefCounted.h" +#include <wtf/PassRefPtr.h> +#include <wtf/RefCounted.h> namespace WTF { class ByteArray : public RefCountedBase { diff --git a/JavaScriptCore/wtf/CrossThreadRefCounted.h b/JavaScriptCore/wtf/CrossThreadRefCounted.h index 281dfa6..6a05211 100644 --- a/JavaScriptCore/wtf/CrossThreadRefCounted.h +++ b/JavaScriptCore/wtf/CrossThreadRefCounted.h @@ -51,7 +51,7 @@ namespace WTF { // with respect to the original and any other copies. The underlying m_data is jointly // owned by the original instance and all copies. template<class T> - class CrossThreadRefCounted : Noncopyable { + class CrossThreadRefCounted : public Noncopyable { public: static PassRefPtr<CrossThreadRefCounted<T> > create(T* data) { diff --git a/JavaScriptCore/wtf/CurrentTime.cpp b/JavaScriptCore/wtf/CurrentTime.cpp index 74984c1..45c724a 100644 --- a/JavaScriptCore/wtf/CurrentTime.cpp +++ b/JavaScriptCore/wtf/CurrentTime.cpp @@ -1,6 +1,7 @@ /* * Copyright (C) 2006 Apple Computer, Inc. All rights reserved. * Copyright (C) 2008 Google Inc. All rights reserved. + * Copyright (C) 2007-2009 Torch Mobile, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -33,6 +34,7 @@ #include "CurrentTime.h" #if PLATFORM(WIN_OS) + // Windows is first since we want to use hires timers, despite PLATFORM(CF) // being defined. // If defined, WIN32_LEAN_AND_MEAN disables timeBeginPeriod/timeEndPeriod. @@ -40,9 +42,17 @@ #include <windows.h> #include <math.h> #include <stdint.h> +#include <time.h> + +#if USE(QUERY_PERFORMANCE_COUNTER) +#if PLATFORM(WINCE) +extern "C" time_t mktime(struct tm *t); +#else #include <sys/timeb.h> #include <sys/types.h> -#include <time.h> +#endif +#endif + #elif PLATFORM(CF) #include <CoreFoundation/CFDate.h> #elif PLATFORM(GTK) @@ -59,6 +69,8 @@ const double msPerSecond = 1000.0; #if PLATFORM(WIN_OS) +#if USE(QUERY_PERFORMANCE_COUNTER) + static LARGE_INTEGER qpcFrequency; static bool syncedTime; @@ -107,7 +119,7 @@ static double highResUpTime() static double lowResUTCTime() { -#if PLATFORM(WIN_CE) +#if PLATFORM(WINCE) SYSTEMTIME systemTime; GetSystemTime(&systemTime); struct tm tmtime; @@ -120,11 +132,11 @@ static double lowResUTCTime() tmtime.tm_sec = systemTime.wSecond; time_t timet = mktime(&tmtime); return timet * msPerSecond + systemTime.wMilliseconds; -#else // PLATFORM(WIN_CE) +#else struct _timeb timebuffer; _ftime(&timebuffer); return timebuffer.time * msPerSecond + timebuffer.millitm; -#endif // PLATFORM(WIN_CE) +#endif } static bool qpcAvailable() @@ -184,6 +196,55 @@ double currentTime() return utc / 1000.0; } +#else + +static double currentSystemTime() +{ + FILETIME ft; + GetCurrentFT(&ft); + + // As per Windows documentation for FILETIME, copy the resulting FILETIME structure to a + // ULARGE_INTEGER structure using memcpy (using memcpy instead of direct assignment can + // prevent alignment faults on 64-bit Windows). + + ULARGE_INTEGER t; + memcpy(&t, &ft, sizeof(t)); + + // Windows file times are in 100s of nanoseconds. + // To convert to seconds, we have to divide by 10,000,000, which is more quickly + // done by multiplying by 0.0000001. + + // Between January 1, 1601 and January 1, 1970, there were 369 complete years, + // of which 89 were leap years (1700, 1800, and 1900 were not leap years). + // That is a total of 134774 days, which is 11644473600 seconds. + + return t.QuadPart * 0.0000001 - 11644473600.0; +} + +double currentTime() +{ + static bool init = false; + static double lastTime; + static DWORD lastTickCount; + if (!init) { + lastTime = currentSystemTime(); + lastTickCount = GetTickCount(); + init = true; + return lastTime; + } + + DWORD tickCountNow = GetTickCount(); + DWORD elapsed = tickCountNow - lastTickCount; + double timeNow = lastTime + (double)elapsed / 1000.; + if (elapsed >= 0x7FFFFFFF) { + lastTime = timeNow; + lastTickCount = tickCountNow; + } + return timeNow; +} + +#endif // USE(QUERY_PERFORMANCE_COUNTER) + #elif PLATFORM(CF) double currentTime() diff --git a/JavaScriptCore/wtf/DateMath.cpp b/JavaScriptCore/wtf/DateMath.cpp index 3d3ede2..6a5b22f 100644 --- a/JavaScriptCore/wtf/DateMath.cpp +++ b/JavaScriptCore/wtf/DateMath.cpp @@ -2,6 +2,7 @@ * Copyright (C) 1999-2000 Harri Porten (porten@kde.org) * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. * Copyright (C) 2009 Google Inc. All rights reserved. + * Copyright (C) 2007-2009 Torch Mobile, Inc. * * The Original Code is Mozilla Communicator client code, released * March 31, 1998. @@ -64,6 +65,11 @@ #include <notify.h> #endif +#if PLATFORM(WINCE) && !PLATFORM(QT) +extern "C" size_t strftime(char * const s, const size_t maxsize, const char * const format, const struct tm * const t); +extern "C" struct tm * localtime(const time_t *timer); +#endif + #if HAVE(SYS_TIME_H) #include <sys/time.h> #endif @@ -300,7 +306,7 @@ double getCurrentUTCTimeWithMicroseconds() void getLocalTime(const time_t* localTime, struct tm* localTM) { -#if COMPILER(MSVC7) || COMPILER(MINGW) || PLATFORM(WIN_CE) +#if COMPILER(MSVC7) || COMPILER(MINGW) || PLATFORM(WINCE) *localTM = *localtime(localTime); #elif COMPILER(MSVC) localtime_s(localTM, localTime); @@ -361,13 +367,34 @@ int equivalentYearForDST(int year) static int32_t calculateUTCOffset() { + time_t localTime = time(0); tm localt; - memset(&localt, 0, sizeof(localt)); - - // get the difference between this time zone and UTC on Jan 01, 2000 12:00:00 AM + getLocalTime(&localTime, &localt); + + // Get the difference between this time zone and UTC on the 1st of January of this year. + localt.tm_sec = 0; + localt.tm_min = 0; + localt.tm_hour = 0; localt.tm_mday = 1; - localt.tm_year = 100; - time_t utcOffset = 946684800 - mktime(&localt); + localt.tm_mon = 0; + // Not setting localt.tm_year! + localt.tm_wday = 0; + localt.tm_yday = 0; + localt.tm_isdst = 0; +#if HAVE(TM_GMTOFF) + localt.tm_gmtoff = 0; +#endif +#if HAVE(TM_ZONE) + localt.tm_zone = 0; +#endif + +#if HAVE(TIMEGM) + time_t utcOffset = timegm(&localt) - mktime(&localt); +#else + // Using a canned date of 01/01/2009 on platforms with weaker date-handling foo. + localt.tm_year = 109; + time_t utcOffset = 1230768000 - mktime(&localt); +#endif return static_cast<int32_t>(utcOffset * 1000); } @@ -496,7 +523,7 @@ void msToGregorianDateTime(double ms, bool outputIsUTC, GregorianDateTime& tm) tm.year = year - 1900; tm.isDST = dstOff != 0.0; - tm.utcOffset = static_cast<long>((dstOff + utcOff) / msPerSecond); + tm.utcOffset = outputIsUTC ? 0 : static_cast<long>((dstOff + utcOff) / msPerSecond); tm.timeZone = NULL; } @@ -819,7 +846,7 @@ double parseDateFromNullTerminatedCharacters(const char* dateString) return NaN; int sgn = (o < 0) ? -1 : 1; - o = abs(o); + o = labs(o); if (*dateString != ':') { offset = ((o / 100) * 60 + (o % 100)) * sgn; } else { // GMT+05:00 diff --git a/JavaScriptCore/wtf/DateMath.h b/JavaScriptCore/wtf/DateMath.h index 8690a49..6110f76 100644 --- a/JavaScriptCore/wtf/DateMath.h +++ b/JavaScriptCore/wtf/DateMath.h @@ -109,14 +109,17 @@ struct GregorianDateTime : Noncopyable { , year(inTm.tm_year) , isDST(inTm.tm_isdst) { -#if !PLATFORM(WIN_OS) && !PLATFORM(SOLARIS) && !COMPILER(RVCT) +#if HAVE(TM_GMTOFF) utcOffset = static_cast<int>(inTm.tm_gmtoff); +#else + utcOffset = static_cast<int>(getUTCOffset() / msPerSecond + (isDST ? secondsPerHour : 0)); +#endif +#if HAVE(TM_ZONE) int inZoneSize = strlen(inTm.tm_zone) + 1; timeZone = new char[inZoneSize]; strncpy(timeZone, inTm.tm_zone, inZoneSize); #else - utcOffset = static_cast<int>(getUTCOffset() / msPerSecond + (isDST ? secondsPerHour : 0)); timeZone = 0; #endif } @@ -136,8 +139,10 @@ struct GregorianDateTime : Noncopyable { ret.tm_year = year; ret.tm_isdst = isDST; -#if !PLATFORM(WIN_OS) && !PLATFORM(SOLARIS) && !COMPILER(RVCT) +#if HAVE(TM_GMTOFF) ret.tm_gmtoff = static_cast<long>(utcOffset); +#endif +#if HAVE(TM_ZONE) ret.tm_zone = timeZone; #endif diff --git a/JavaScriptCore/wtf/Deque.h b/JavaScriptCore/wtf/Deque.h index c371d38..3c3d378 100644 --- a/JavaScriptCore/wtf/Deque.h +++ b/JavaScriptCore/wtf/Deque.h @@ -44,7 +44,7 @@ namespace WTF { template<typename T> class DequeConstReverseIterator; template<typename T> - class Deque { + class Deque : public FastAllocBase { public: typedef DequeIterator<T> iterator; typedef DequeConstIterator<T> const_iterator; diff --git a/JavaScriptCore/wtf/FastAllocBase.h b/JavaScriptCore/wtf/FastAllocBase.h index 71e6bfa..9fcbbc1 100644 --- a/JavaScriptCore/wtf/FastAllocBase.h +++ b/JavaScriptCore/wtf/FastAllocBase.h @@ -79,9 +79,9 @@ #include <stdint.h> #include <stdlib.h> #include <string.h> +#include "Assertions.h" #include "FastMalloc.h" #include "TypeTraits.h" -#include <wtf/Assertions.h> namespace WTF { @@ -397,4 +397,7 @@ namespace WTF { } // namespace WTF +// Using WTF::FastAllocBase to avoid using FastAllocBase's explicit qualification by WTF::. +using WTF::FastAllocBase; + #endif // FastAllocBase_h diff --git a/JavaScriptCore/wtf/FastMalloc.cpp b/JavaScriptCore/wtf/FastMalloc.cpp index c65ba85..c14b755 100644 --- a/JavaScriptCore/wtf/FastMalloc.cpp +++ b/JavaScriptCore/wtf/FastMalloc.cpp @@ -1,6 +1,6 @@ // Copyright (c) 2005, 2007, Google Inc. // All rights reserved. -// Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. +// Copyright (C) 2005, 2006, 2007, 2008, 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 @@ -89,13 +89,19 @@ #endif #endif -#if !defined(USE_SYSTEM_MALLOC) && defined(NDEBUG) +#if !(defined(USE_SYSTEM_MALLOC) && USE_SYSTEM_MALLOC) && defined(NDEBUG) #define FORCE_SYSTEM_MALLOC 0 #else #define FORCE_SYSTEM_MALLOC 1 #endif -#define TCMALLOC_TRACK_DECOMMITED_SPANS (HAVE(VIRTUALALLOC) || HAVE(MADV_FREE_REUSE)) +// Use a background thread to periodically scavenge memory to release back to the system +// https://bugs.webkit.org/show_bug.cgi?id=27900: don't turn this on for Tiger until we have figured out why it caused a crash. +#if defined(BUILDING_ON_TIGER) +#define USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY 0 +#else +#define USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY 1 +#endif #ifndef NDEBUG namespace WTF { @@ -1043,11 +1049,7 @@ struct Span { #endif }; -#if TCMALLOC_TRACK_DECOMMITED_SPANS #define ASSERT_SPAN_COMMITTED(span) ASSERT(!span->decommitted) -#else -#define ASSERT_SPAN_COMMITTED(span) -#endif #ifdef SPAN_HISTORY void Event(Span* span, char op, int v = 0) { @@ -1193,6 +1195,32 @@ template <> class MapSelector<32> { // contiguous runs of pages (called a "span"). // ------------------------------------------------------------------------- +#if USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY +// The central page heap collects spans of memory that have been deleted but are still committed until they are released +// back to the system. We use a background thread to periodically scan the list of free spans and release some back to the +// system. Every 5 seconds, the background thread wakes up and does the following: +// - Check if we needed to commit memory in the last 5 seconds. If so, skip this scavenge because it's a sign that we are short +// of free committed pages and so we should not release them back to the system yet. +// - Otherwise, go through the list of free spans (from largest to smallest) and release up to a fraction of the free committed pages +// back to the system. +// - If the number of free committed pages reaches kMinimumFreeCommittedPageCount, we can stop the scavenging and block the +// scavenging thread until the number of free committed pages goes above kMinimumFreeCommittedPageCount. + +// Background thread wakes up every 5 seconds to scavenge as long as there is memory available to return to the system. +static const int kScavengeTimerDelayInSeconds = 5; + +// Number of free committed pages that we want to keep around. +static const size_t kMinimumFreeCommittedPageCount = 512; + +// During a scavenge, we'll release up to a fraction of the free committed pages. +#if PLATFORM(WIN) +// We are slightly less aggressive in releasing memory on Windows due to performance reasons. +static const int kMaxScavengeAmountFactor = 3; +#else +static const int kMaxScavengeAmountFactor = 2; +#endif +#endif + class TCMalloc_PageHeap { public: void init(); @@ -1292,6 +1320,14 @@ class TCMalloc_PageHeap { // Bytes allocated from system uint64_t system_bytes_; +#if USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY + // Number of pages kept in free lists that are still committed. + Length free_committed_pages_; + + // Number of pages that we committed in the last scavenge wait interval. + Length pages_committed_since_last_scavenge_; +#endif + bool GrowHeap(Length n); // REQUIRES span->length >= n @@ -1314,9 +1350,11 @@ class TCMalloc_PageHeap { // span of exactly the specified length. Else, returns NULL. Span* AllocLarge(Length n); +#if !USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY // Incrementally release some memory to the system. // IncrementalScavenge(n) is called whenever n pages are freed. void IncrementalScavenge(Length n); +#endif // Number of pages to deallocate before doing more scavenging int64_t scavenge_counter_; @@ -1327,6 +1365,24 @@ class TCMalloc_PageHeap { #if defined(WTF_CHANGES) && PLATFORM(DARWIN) friend class FastMallocZone; #endif + +#if USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY + static NO_RETURN void* runScavengerThread(void*); + + NO_RETURN void scavengerThread(); + + void scavenge(); + + inline bool shouldContinueScavenging() const; + + pthread_mutex_t m_scavengeMutex; + + pthread_cond_t m_scavengeCondition; + + // Keeps track of whether the background thread is actively scavenging memory every kScavengeTimerDelayInSeconds, or + // it's blocked waiting for more pages to be deleted. + bool m_scavengeThreadActive; +#endif // USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY }; void TCMalloc_PageHeap::init() @@ -1335,6 +1391,12 @@ void TCMalloc_PageHeap::init() pagemap_cache_ = PageMapCache(0); free_pages_ = 0; system_bytes_ = 0; + +#if USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY + free_committed_pages_ = 0; + pages_committed_since_last_scavenge_ = 0; +#endif // USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY + scavenge_counter_ = 0; // Start scavenging at kMaxPages list scavenge_index_ = kMaxPages-1; @@ -1345,8 +1407,68 @@ void TCMalloc_PageHeap::init() DLL_Init(&free_[i].normal); DLL_Init(&free_[i].returned); } + +#if USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY + pthread_mutex_init(&m_scavengeMutex, 0); + pthread_cond_init(&m_scavengeCondition, 0); + m_scavengeThreadActive = true; + pthread_t thread; + pthread_create(&thread, 0, runScavengerThread, this); +#endif // USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY +} + +#if USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY +void* TCMalloc_PageHeap::runScavengerThread(void* context) +{ + static_cast<TCMalloc_PageHeap*>(context)->scavengerThread(); +#if COMPILER(MSVC) + // Without this, Visual Studio will complain that this method does not return a value. + return 0; +#endif +} + +void TCMalloc_PageHeap::scavenge() +{ + // If we have to commit memory in the last 5 seconds, it means we don't have enough free committed pages + // for the amount of allocations that we do. So hold off on releasing memory back to the system. + if (pages_committed_since_last_scavenge_ > 0) { + pages_committed_since_last_scavenge_ = 0; + return; + } + Length pagesDecommitted = 0; + for (int i = kMaxPages; i >= 0; i--) { + SpanList* slist = (static_cast<size_t>(i) == kMaxPages) ? &large_ : &free_[i]; + if (!DLL_IsEmpty(&slist->normal)) { + // Release the last span on the normal portion of this list + Span* s = slist->normal.prev; + // Only decommit up to a fraction of the free committed pages if pages_allocated_since_last_scavenge_ > 0. + if ((pagesDecommitted + s->length) * kMaxScavengeAmountFactor > free_committed_pages_) + continue; + DLL_Remove(s); + TCMalloc_SystemRelease(reinterpret_cast<void*>(s->start << kPageShift), + static_cast<size_t>(s->length << kPageShift)); + if (!s->decommitted) { + pagesDecommitted += s->length; + s->decommitted = true; + } + DLL_Prepend(&slist->returned, s); + // We can stop scavenging if the number of free committed pages left is less than or equal to the minimum number we want to keep around. + if (free_committed_pages_ <= kMinimumFreeCommittedPageCount + pagesDecommitted) + break; + } + } + pages_committed_since_last_scavenge_ = 0; + ASSERT(free_committed_pages_ >= pagesDecommitted); + free_committed_pages_ -= pagesDecommitted; +} + +inline bool TCMalloc_PageHeap::shouldContinueScavenging() const +{ + return free_committed_pages_ > kMinimumFreeCommittedPageCount; } +#endif // USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY + inline Span* TCMalloc_PageHeap::New(Length n) { ASSERT(Check()); ASSERT(n > 0); @@ -1369,12 +1491,21 @@ inline Span* TCMalloc_PageHeap::New(Length n) { Span* result = ll->next; Carve(result, n, released); -#if TCMALLOC_TRACK_DECOMMITED_SPANS if (result->decommitted) { TCMalloc_SystemCommit(reinterpret_cast<void*>(result->start << kPageShift), static_cast<size_t>(n << kPageShift)); result->decommitted = false; - } +#if USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY + pages_committed_since_last_scavenge_ += n; #endif + } +#if USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY + else { + // The newly allocated memory is from a span that's in the normal span list (already committed). Update the + // free committed pages count. + ASSERT(free_committed_pages_ >= n); + free_committed_pages_ -= n; + } +#endif // USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY ASSERT(Check()); free_pages_ -= n; return result; @@ -1431,12 +1562,21 @@ Span* TCMalloc_PageHeap::AllocLarge(Length n) { if (best != NULL) { Carve(best, n, from_released); -#if TCMALLOC_TRACK_DECOMMITED_SPANS if (best->decommitted) { TCMalloc_SystemCommit(reinterpret_cast<void*>(best->start << kPageShift), static_cast<size_t>(n << kPageShift)); best->decommitted = false; - } +#if USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY + pages_committed_since_last_scavenge_ += n; #endif + } +#if USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY + else { + // The newly allocated memory is from a span that's in the normal span list (already committed). Update the + // free committed pages count. + ASSERT(free_committed_pages_ >= n); + free_committed_pages_ -= n; + } +#endif // USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY ASSERT(Check()); free_pages_ -= n; return best; @@ -1461,14 +1601,10 @@ Span* TCMalloc_PageHeap::Split(Span* span, Length n) { return leftover; } -#if !TCMALLOC_TRACK_DECOMMITED_SPANS -static ALWAYS_INLINE void propagateDecommittedState(Span*, Span*) { } -#else static ALWAYS_INLINE void propagateDecommittedState(Span* destination, Span* source) { destination->decommitted = source->decommitted; } -#endif inline void TCMalloc_PageHeap::Carve(Span* span, Length n, bool released) { ASSERT(n > 0); @@ -1495,9 +1631,6 @@ inline void TCMalloc_PageHeap::Carve(Span* span, Length n, bool released) { } } -#if !TCMALLOC_TRACK_DECOMMITED_SPANS -static ALWAYS_INLINE void mergeDecommittedStates(Span*, Span*) { } -#else static ALWAYS_INLINE void mergeDecommittedStates(Span* destination, Span* other) { if (destination->decommitted && !other->decommitted) { @@ -1509,7 +1642,6 @@ static ALWAYS_INLINE void mergeDecommittedStates(Span* destination, Span* other) destination->decommitted = true; } } -#endif inline void TCMalloc_PageHeap::Delete(Span* span) { ASSERT(Check()); @@ -1526,10 +1658,10 @@ inline void TCMalloc_PageHeap::Delete(Span* span) { // necessary. We do not bother resetting the stale pagemap // entries for the pieces we are merging together because we only // care about the pagemap entries for the boundaries. - // - // Note that the spans we merge into "span" may come out of - // a "returned" list. For simplicity, we move these into the - // "normal" list of the appropriate size class. +#if USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY + // Track the total size of the neighboring free spans that are committed. + Length neighboringCommittedSpansLength = 0; +#endif const PageID p = span->start; const Length n = span->length; Span* prev = GetDescriptor(p-1); @@ -1537,6 +1669,10 @@ inline void TCMalloc_PageHeap::Delete(Span* span) { // Merge preceding span into this span ASSERT(prev->start + prev->length == p); const Length len = prev->length; +#if USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY + if (!prev->decommitted) + neighboringCommittedSpansLength += len; +#endif mergeDecommittedStates(span, prev); DLL_Remove(prev); DeleteSpan(prev); @@ -1550,6 +1686,10 @@ inline void TCMalloc_PageHeap::Delete(Span* span) { // Merge next span into this span ASSERT(next->start == p+n); const Length len = next->length; +#if USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY + if (!next->decommitted) + neighboringCommittedSpansLength += len; +#endif mergeDecommittedStates(span, next); DLL_Remove(next); DeleteSpan(next); @@ -1560,17 +1700,40 @@ inline void TCMalloc_PageHeap::Delete(Span* span) { Event(span, 'D', span->length); span->free = 1; - if (span->length < kMaxPages) { - DLL_Prepend(&free_[span->length].normal, span); + if (span->decommitted) { + if (span->length < kMaxPages) + DLL_Prepend(&free_[span->length].returned, span); + else + DLL_Prepend(&large_.returned, span); } else { - DLL_Prepend(&large_.normal, span); + if (span->length < kMaxPages) + DLL_Prepend(&free_[span->length].normal, span); + else + DLL_Prepend(&large_.normal, span); } free_pages_ += n; +#if USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY + if (span->decommitted) { + // If the merged span is decommitted, that means we decommitted any neighboring spans that were + // committed. Update the free committed pages count. + free_committed_pages_ -= neighboringCommittedSpansLength; + } else { + // If the merged span remains committed, add the deleted span's size to the free committed pages count. + free_committed_pages_ += n; + } + + // Make sure the scavenge thread becomes active if we have enough freed pages to release some back to the system. + if (!m_scavengeThreadActive && shouldContinueScavenging()) + pthread_cond_signal(&m_scavengeCondition); +#else IncrementalScavenge(n); +#endif + ASSERT(Check()); } +#if !USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY void TCMalloc_PageHeap::IncrementalScavenge(Length n) { // Fast path; not yet time to release memory scavenge_counter_ -= n; @@ -1591,9 +1754,7 @@ void TCMalloc_PageHeap::IncrementalScavenge(Length n) { DLL_Remove(s); TCMalloc_SystemRelease(reinterpret_cast<void*>(s->start << kPageShift), static_cast<size_t>(s->length << kPageShift)); -#if TCMALLOC_TRACK_DECOMMITED_SPANS s->decommitted = true; -#endif DLL_Prepend(&slist->returned, s); scavenge_counter_ = std::max<size_t>(64UL, std::min<size_t>(kDefaultReleaseDelay, kDefaultReleaseDelay - (free_pages_ / kDefaultReleaseDelay))); @@ -1610,6 +1771,7 @@ void TCMalloc_PageHeap::IncrementalScavenge(Length n) { // Nothing to scavenge, delay for a while scavenge_counter_ = kDefaultReleaseDelay; } +#endif void TCMalloc_PageHeap::RegisterSizeClass(Span* span, size_t sc) { // Associate span object with all interior pages as well @@ -1721,6 +1883,10 @@ bool TCMalloc_PageHeap::GrowHeap(Length n) { } ask = actual_size >> kPageShift; +#if USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY + pages_committed_since_last_scavenge_ += ask; +#endif + uint64_t old_system_bytes = system_bytes_; system_bytes_ += (ask << kPageShift); const PageID p = reinterpret_cast<uintptr_t>(ptr) >> kPageShift; @@ -2101,6 +2267,34 @@ static inline TCMalloc_PageHeap* getPageHeap() #define pageheap getPageHeap() +#if USE_BACKGROUND_THREAD_TO_SCAVENGE_MEMORY +#if PLATFORM(WIN) +static void sleep(unsigned seconds) +{ + ::Sleep(seconds * 1000); +} +#endif + +void TCMalloc_PageHeap::scavengerThread() +{ + while (1) { + if (!shouldContinueScavenging()) { + pthread_mutex_lock(&m_scavengeMutex); + m_scavengeThreadActive = false; + // Block until there are enough freed pages to release back to the system. + pthread_cond_wait(&m_scavengeCondition, &m_scavengeMutex); + m_scavengeThreadActive = true; + pthread_mutex_unlock(&m_scavengeMutex); + } + sleep(kScavengeTimerDelayInSeconds); + { + SpinLockHolder h(&pageheap_lock); + pageheap->scavenge(); + } + } +} +#endif + // If TLS is available, we also store a copy // of the per-thread object in a __thread variable // since __thread variables are faster to read diff --git a/JavaScriptCore/wtf/FastMalloc.h b/JavaScriptCore/wtf/FastMalloc.h index 9e13cf9..787251f 100644 --- a/JavaScriptCore/wtf/FastMalloc.h +++ b/JavaScriptCore/wtf/FastMalloc.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -28,18 +28,18 @@ namespace WTF { // These functions call CRASH() if an allocation fails. - void* fastMalloc(size_t n); - void* fastZeroedMalloc(size_t n); - void* fastCalloc(size_t n_elements, size_t element_size); - void* fastRealloc(void* p, size_t n); + void* fastMalloc(size_t); + void* fastZeroedMalloc(size_t); + void* fastCalloc(size_t numElements, size_t elementSize); + void* fastRealloc(void*, size_t); - // These functions return NULL if an allocation fails. - void* tryFastMalloc(size_t n); - void* tryFastZeroedMalloc(size_t n); - void* tryFastCalloc(size_t n_elements, size_t element_size); - void* tryFastRealloc(void* p, size_t n); + // These functions return 0 if an allocation fails. + void* tryFastMalloc(size_t); + void* tryFastZeroedMalloc(size_t); + void* tryFastCalloc(size_t numElements, size_t elementSize); + void* tryFastRealloc(void*, size_t); - void fastFree(void* p); + void fastFree(void*); #ifndef NDEBUG void fastMallocForbid(); @@ -172,15 +172,24 @@ using WTF::fastMallocAllow; #define WTF_PRIVATE_INLINE inline #endif -#ifndef _CRTDBG_MAP_ALLOC +#if !defined(_CRTDBG_MAP_ALLOC) && !(defined(USE_SYSTEM_MALLOC) && USE_SYSTEM_MALLOC) -#if !defined(USE_SYSTEM_MALLOC) || !(USE_SYSTEM_MALLOC) -WTF_PRIVATE_INLINE void* operator new(size_t s) { return fastMalloc(s); } +// The nothrow functions here are actually not all that helpful, because fastMalloc will +// call CRASH() rather than returning 0, and returning 0 is what nothrow is all about. +// But since WebKit code never uses exceptions or nothrow at all, this is probably OK. +// Long term we will adopt FastAllocBase.h everywhere, and and replace this with +// debug-only code to make sure we don't use the system malloc via the default operator +// new by accident. + +WTF_PRIVATE_INLINE void* operator new(size_t size) { return fastMalloc(size); } +WTF_PRIVATE_INLINE void* operator new(size_t size, const std::nothrow_t&) throw() { return fastMalloc(size); } WTF_PRIVATE_INLINE void operator delete(void* p) { fastFree(p); } -WTF_PRIVATE_INLINE void* operator new[](size_t s) { return fastMalloc(s); } +WTF_PRIVATE_INLINE void operator delete(void* p, const std::nothrow_t&) throw() { fastFree(p); } +WTF_PRIVATE_INLINE void* operator new[](size_t size) { return fastMalloc(size); } +WTF_PRIVATE_INLINE void* operator new[](size_t size, const std::nothrow_t&) throw() { return fastMalloc(size); } WTF_PRIVATE_INLINE void operator delete[](void* p) { fastFree(p); } -#endif +WTF_PRIVATE_INLINE void operator delete[](void* p, const std::nothrow_t&) throw() { fastFree(p); } -#endif // _CRTDBG_MAP_ALLOC +#endif #endif /* WTF_FastMalloc_h */ diff --git a/JavaScriptCore/wtf/GOwnPtr.h b/JavaScriptCore/wtf/GOwnPtr.h index 8d03ff2..4993348 100644 --- a/JavaScriptCore/wtf/GOwnPtr.h +++ b/JavaScriptCore/wtf/GOwnPtr.h @@ -37,7 +37,7 @@ namespace WTF { template<> void freeOwnedGPtr<GDir>(GDir*); template<> void freeOwnedGPtr<GHashTable>(GHashTable*); - template <typename T> class GOwnPtr : Noncopyable { + template <typename T> class GOwnPtr : public Noncopyable { public: explicit GOwnPtr(T* ptr = 0) : m_ptr(ptr) { } ~GOwnPtr() { freeOwnedGPtr(m_ptr); } diff --git a/JavaScriptCore/wtf/HashCountedSet.h b/JavaScriptCore/wtf/HashCountedSet.h index 6fc0234..1a422d8 100644 --- a/JavaScriptCore/wtf/HashCountedSet.h +++ b/JavaScriptCore/wtf/HashCountedSet.h @@ -22,13 +22,14 @@ #define WTF_HashCountedSet_h #include "Assertions.h" +#include "FastAllocBase.h" #include "HashMap.h" #include "Vector.h" namespace WTF { template<typename Value, typename HashFunctions = typename DefaultHash<Value>::Hash, - typename Traits = HashTraits<Value> > class HashCountedSet { + typename Traits = HashTraits<Value> > class HashCountedSet : public FastAllocBase { private: typedef HashMap<Value, unsigned, HashFunctions, Traits> ImplType; public: diff --git a/JavaScriptCore/wtf/HashMap.h b/JavaScriptCore/wtf/HashMap.h index c5b75ff..3de5ee6 100644 --- a/JavaScriptCore/wtf/HashMap.h +++ b/JavaScriptCore/wtf/HashMap.h @@ -29,7 +29,7 @@ namespace WTF { template<typename KeyArg, typename MappedArg, typename HashArg = typename DefaultHash<KeyArg>::Hash, typename KeyTraitsArg = HashTraits<KeyArg>, typename MappedTraitsArg = HashTraits<MappedArg> > - class HashMap { + class HashMap : public FastAllocBase { private: typedef KeyTraitsArg KeyTraits; typedef MappedTraitsArg MappedTraits; diff --git a/JavaScriptCore/wtf/HashSet.h b/JavaScriptCore/wtf/HashSet.h index da99f2c..990670d 100644 --- a/JavaScriptCore/wtf/HashSet.h +++ b/JavaScriptCore/wtf/HashSet.h @@ -21,6 +21,7 @@ #ifndef WTF_HashSet_h #define WTF_HashSet_h +#include "FastAllocBase.h" #include "HashTable.h" namespace WTF { @@ -32,7 +33,7 @@ namespace WTF { template<typename T> struct IdentityExtractor; template<typename ValueArg, typename HashArg = typename DefaultHash<ValueArg>::Hash, - typename TraitsArg = HashTraits<ValueArg> > class HashSet { + typename TraitsArg = HashTraits<ValueArg> > class HashSet : public FastAllocBase { private: typedef HashArg HashFunctions; typedef TraitsArg ValueTraits; @@ -175,28 +176,28 @@ namespace WTF { } template<typename Value, typename HashFunctions, typename Traits> - template<typename T, typename Translator> + template<typename T, typename HashTranslator> typename HashSet<Value, HashFunctions, Traits>::iterator inline HashSet<Value, HashFunctions, Traits>::find(const T& value) { - typedef HashSetTranslatorAdapter<ValueType, ValueTraits, T, Translator> Adapter; + typedef HashSetTranslatorAdapter<ValueType, ValueTraits, T, HashTranslator> Adapter; return m_impl.template find<T, Adapter>(value); } template<typename Value, typename HashFunctions, typename Traits> - template<typename T, typename Translator> + template<typename T, typename HashTranslator> typename HashSet<Value, HashFunctions, Traits>::const_iterator inline HashSet<Value, HashFunctions, Traits>::find(const T& value) const { - typedef HashSetTranslatorAdapter<ValueType, ValueTraits, T, Translator> Adapter; + typedef HashSetTranslatorAdapter<ValueType, ValueTraits, T, HashTranslator> Adapter; return m_impl.template find<T, Adapter>(value); } template<typename Value, typename HashFunctions, typename Traits> - template<typename T, typename Translator> + template<typename T, typename HashTranslator> inline bool HashSet<Value, HashFunctions, Traits>::contains(const T& value) const { - typedef HashSetTranslatorAdapter<ValueType, ValueTraits, T, Translator> Adapter; + typedef HashSetTranslatorAdapter<ValueType, ValueTraits, T, HashTranslator> Adapter; return m_impl.template contains<T, Adapter>(value); } @@ -207,11 +208,11 @@ namespace WTF { } template<typename Value, typename HashFunctions, typename Traits> - template<typename T, typename Translator> + template<typename T, typename HashTranslator> pair<typename HashSet<Value, HashFunctions, Traits>::iterator, bool> HashSet<Value, HashFunctions, Traits>::add(const T& value) { - typedef HashSetTranslatorAdapter<ValueType, ValueTraits, T, Translator> Adapter; + typedef HashSetTranslatorAdapter<ValueType, ValueTraits, T, HashTranslator> Adapter; return m_impl.template addPassingHashCode<T, T, Adapter>(value, value); } diff --git a/JavaScriptCore/wtf/Locker.h b/JavaScriptCore/wtf/Locker.h index 9feec1f..41813d3 100644 --- a/JavaScriptCore/wtf/Locker.h +++ b/JavaScriptCore/wtf/Locker.h @@ -32,7 +32,7 @@ namespace WTF { -template <typename T> class Locker : Noncopyable { +template <typename T> class Locker : public Noncopyable { public: Locker(T& lockable) : m_lockable(lockable) { m_lockable.lock(); } ~Locker() { m_lockable.unlock(); } diff --git a/JavaScriptCore/wtf/MainThread.cpp b/JavaScriptCore/wtf/MainThread.cpp index 3c19b7a..e999094 100644 --- a/JavaScriptCore/wtf/MainThread.cpp +++ b/JavaScriptCore/wtf/MainThread.cpp @@ -29,9 +29,9 @@ #include "config.h" #include "MainThread.h" +#include "StdLibExtras.h" #include "CurrentTime.h" #include "Deque.h" -#include "StdLibExtras.h" #include "Threading.h" namespace WTF { diff --git a/JavaScriptCore/wtf/MathExtras.h b/JavaScriptCore/wtf/MathExtras.h index 76488b4..324300d 100644 --- a/JavaScriptCore/wtf/MathExtras.h +++ b/JavaScriptCore/wtf/MathExtras.h @@ -39,10 +39,8 @@ #endif #if COMPILER(MSVC) -#if PLATFORM(WIN_CE) +#if PLATFORM(WINCE) #include <stdlib.h> -#else -#include <xmath.h> #endif #include <limits> diff --git a/JavaScriptCore/wtf/MessageQueue.h b/JavaScriptCore/wtf/MessageQueue.h index 9549f37..12291cc 100644 --- a/JavaScriptCore/wtf/MessageQueue.h +++ b/JavaScriptCore/wtf/MessageQueue.h @@ -45,11 +45,12 @@ namespace WTF { }; template<typename DataType> - class MessageQueue : Noncopyable { + class MessageQueue : public Noncopyable { public: - MessageQueue() : m_killed(false) {} + MessageQueue() : m_killed(false) { } void append(const DataType&); + bool appendAndCheckEmpty(const DataType&); void prepend(const DataType&); bool waitForMessage(DataType&); template<typename Predicate> @@ -81,6 +82,17 @@ namespace WTF { m_condition.signal(); } + // Returns true if the queue was empty before the item was added. + template<typename DataType> + inline bool MessageQueue<DataType>::appendAndCheckEmpty(const DataType& message) + { + MutexLocker lock(m_mutex); + bool wasEmpty = m_queue.isEmpty(); + m_queue.append(message); + m_condition.signal(); + return wasEmpty; + } + template<typename DataType> inline void MessageQueue<DataType>::prepend(const DataType& message) { diff --git a/JavaScriptCore/wtf/Noncopyable.h b/JavaScriptCore/wtf/Noncopyable.h index f241c7c..60a46e2 100644 --- a/JavaScriptCore/wtf/Noncopyable.h +++ b/JavaScriptCore/wtf/Noncopyable.h @@ -24,9 +24,11 @@ // We don't want argument-dependent lookup to pull in everything from the WTF // namespace when you use Noncopyable, so put it in its own namespace. +#include "FastAllocBase.h" + namespace WTFNoncopyable { - class Noncopyable { + class Noncopyable : public FastAllocBase { Noncopyable(const Noncopyable&); Noncopyable& operator=(const Noncopyable&); protected: @@ -34,8 +36,17 @@ namespace WTFNoncopyable { ~Noncopyable() { } }; + class NoncopyableCustomAllocated { + NoncopyableCustomAllocated(const NoncopyableCustomAllocated&); + NoncopyableCustomAllocated& operator=(const NoncopyableCustomAllocated&); + protected: + NoncopyableCustomAllocated() { } + ~NoncopyableCustomAllocated() { } + }; + } // namespace WTFNoncopyable using WTFNoncopyable::Noncopyable; +using WTFNoncopyable::NoncopyableCustomAllocated; #endif // WTF_Noncopyable_h diff --git a/JavaScriptCore/wtf/OwnArrayPtr.h b/JavaScriptCore/wtf/OwnArrayPtr.h index 344f813..61375c7 100644 --- a/JavaScriptCore/wtf/OwnArrayPtr.h +++ b/JavaScriptCore/wtf/OwnArrayPtr.h @@ -27,7 +27,7 @@ namespace WTF { - template <typename T> class OwnArrayPtr : Noncopyable { + template <typename T> class OwnArrayPtr : public Noncopyable { public: explicit OwnArrayPtr(T* ptr = 0) : m_ptr(ptr) { } ~OwnArrayPtr() { safeDelete(); } @@ -46,8 +46,12 @@ namespace WTF { bool operator!() const { return !m_ptr; } // This conversion operator allows implicit conversion to bool but not to other integer types. +#if COMPILER(WINSCW) + operator bool() const { return m_ptr; } +#else typedef T* OwnArrayPtr::*UnspecifiedBoolType; operator UnspecifiedBoolType() const { return m_ptr ? &OwnArrayPtr::m_ptr : 0; } +#endif void swap(OwnArrayPtr& o) { std::swap(m_ptr, o.m_ptr); } diff --git a/JavaScriptCore/wtf/OwnFastMallocPtr.h b/JavaScriptCore/wtf/OwnFastMallocPtr.h index 5c0d064..c88235a 100644 --- a/JavaScriptCore/wtf/OwnFastMallocPtr.h +++ b/JavaScriptCore/wtf/OwnFastMallocPtr.h @@ -27,7 +27,7 @@ namespace WTF { - template<class T> class OwnFastMallocPtr : Noncopyable { + template<class T> class OwnFastMallocPtr : public Noncopyable { public: explicit OwnFastMallocPtr(T* ptr) : m_ptr(ptr) { diff --git a/JavaScriptCore/wtf/OwnPtr.h b/JavaScriptCore/wtf/OwnPtr.h index 9e4bd32..b7e62b1 100644 --- a/JavaScriptCore/wtf/OwnPtr.h +++ b/JavaScriptCore/wtf/OwnPtr.h @@ -34,7 +34,7 @@ namespace WTF { template <typename T> class PassOwnPtr; - template <typename T> class OwnPtr : Noncopyable { + template <typename T> class OwnPtr : public Noncopyable { public: typedef typename RemovePointer<T>::Type ValueType; typedef ValueType* PtrType; diff --git a/JavaScriptCore/wtf/OwnPtrCommon.h b/JavaScriptCore/wtf/OwnPtrCommon.h index 6cd8bdd..6d91a54 100644 --- a/JavaScriptCore/wtf/OwnPtrCommon.h +++ b/JavaScriptCore/wtf/OwnPtrCommon.h @@ -1,5 +1,6 @@ /* * Copyright (C) 2009 Apple Inc. All rights reserved. + * Copyright (C) 2009 Torch Mobile, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -29,6 +30,7 @@ #if PLATFORM(WIN) typedef struct HBITMAP__* HBITMAP; typedef struct HBRUSH__* HBRUSH; +typedef struct HDC__* HDC; typedef struct HFONT__* HFONT; typedef struct HPALETTE__* HPALETTE; typedef struct HPEN__* HPEN; @@ -47,6 +49,7 @@ namespace WTF { #if PLATFORM(WIN) void deleteOwnedPtr(HBITMAP); void deleteOwnedPtr(HBRUSH); + void deleteOwnedPtr(HDC); void deleteOwnedPtr(HFONT); void deleteOwnedPtr(HPALETTE); void deleteOwnedPtr(HPEN); diff --git a/JavaScriptCore/wtf/OwnPtrWin.cpp b/JavaScriptCore/wtf/OwnPtrWin.cpp index b08d7dc..67a32ff 100644 --- a/JavaScriptCore/wtf/OwnPtrWin.cpp +++ b/JavaScriptCore/wtf/OwnPtrWin.cpp @@ -1,5 +1,6 @@ /* * Copyright (C) 2007 Apple Inc. All rights reserved. + * Copyright (C) 2008, 2009 Torch Mobile, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -42,6 +43,12 @@ void deleteOwnedPtr(HBRUSH ptr) DeleteObject(ptr); } +void deleteOwnedPtr(HDC ptr) +{ + if (ptr) + DeleteDC(ptr); +} + void deleteOwnedPtr(HFONT ptr) { if (ptr) diff --git a/JavaScriptCore/wtf/Platform.h b/JavaScriptCore/wtf/Platform.h index e34f7c3..230458f 100644 --- a/JavaScriptCore/wtf/Platform.h +++ b/JavaScriptCore/wtf/Platform.h @@ -1,5 +1,6 @@ /* * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. + * Copyright (C) 2007-2009 Torch Mobile, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -27,11 +28,11 @@ #define WTF_Platform_h /* PLATFORM handles OS, operating environment, graphics API, and CPU */ -#define PLATFORM(WTF_FEATURE) (defined( WTF_PLATFORM_##WTF_FEATURE ) && WTF_PLATFORM_##WTF_FEATURE) -#define COMPILER(WTF_FEATURE) (defined( WTF_COMPILER_##WTF_FEATURE ) && WTF_COMPILER_##WTF_FEATURE) -#define HAVE(WTF_FEATURE) (defined( HAVE_##WTF_FEATURE ) && HAVE_##WTF_FEATURE) -#define USE(WTF_FEATURE) (defined( WTF_USE_##WTF_FEATURE ) && WTF_USE_##WTF_FEATURE) -#define ENABLE(WTF_FEATURE) (defined( ENABLE_##WTF_FEATURE ) && ENABLE_##WTF_FEATURE) +#define PLATFORM(WTF_FEATURE) (defined WTF_PLATFORM_##WTF_FEATURE && WTF_PLATFORM_##WTF_FEATURE) +#define COMPILER(WTF_FEATURE) (defined WTF_COMPILER_##WTF_FEATURE && WTF_COMPILER_##WTF_FEATURE) +#define HAVE(WTF_FEATURE) (defined HAVE_##WTF_FEATURE && HAVE_##WTF_FEATURE) +#define USE(WTF_FEATURE) (defined WTF_USE_##WTF_FEATURE && WTF_USE_##WTF_FEATURE) +#define ENABLE(WTF_FEATURE) (defined ENABLE_##WTF_FEATURE && ENABLE_##WTF_FEATURE) /* Operating systems - low-level dependencies */ @@ -56,12 +57,12 @@ #define WTF_PLATFORM_WIN_OS 1 #endif -/* PLATFORM(WIN_CE) */ +/* PLATFORM(WINCE) */ /* Operating system level dependencies for Windows CE that should be used */ /* regardless of operating environment */ /* Note that for this platform PLATFORM(WIN_OS) is also defined. */ #if defined(_WIN32_WCE) -#define WTF_PLATFORM_WIN_CE 1 +#define WTF_PLATFORM_WINCE 1 #endif /* PLATFORM(LINUX) */ @@ -92,12 +93,10 @@ #define WTF_PLATFORM_SOLARIS 1 #endif -#if defined (__S60__) || defined (__SYMBIAN32__) +#if defined (__SYMBIAN32__) /* we are cross-compiling, it is not really windows */ #undef WTF_PLATFORM_WIN_OS #undef WTF_PLATFORM_WIN -#undef WTF_PLATFORM_CAIRO -#define WTF_PLATFORM_S60 1 #define WTF_PLATFORM_SYMBIAN 1 #endif @@ -114,7 +113,7 @@ /* should be used regardless of operating environment */ #if PLATFORM(DARWIN) \ || PLATFORM(FREEBSD) \ - || PLATFORM(S60) \ + || PLATFORM(SYMBIAN) \ || PLATFORM(NETBSD) \ || defined(unix) \ || defined(__unix) \ @@ -190,7 +189,7 @@ /* Makes PLATFORM(WIN) default to PLATFORM(CAIRO) */ /* FIXME: This should be changed from a blacklist to a whitelist */ -#if !PLATFORM(MAC) && !PLATFORM(QT) && !PLATFORM(WX) && !PLATFORM(CHROMIUM) +#if !PLATFORM(MAC) && !PLATFORM(QT) && !PLATFORM(WX) && !PLATFORM(CHROMIUM) && !PLATFORM(WINCE) #define WTF_PLATFORM_CAIRO 1 #endif @@ -246,18 +245,45 @@ #define WTF_PLATFORM_ARM 1 #if defined(__ARMEB__) #define WTF_PLATFORM_BIG_ENDIAN 1 +#ifdef MANUAL_MERGE_REQUIRED #elif !defined(__ARM_EABI__) && !defined(__ARMEB__) && !defined(__VFP_FP__) #if !defined(ANDROID) +#else // MANUAL_MERGE_REQUIRED +#elif !defined(__ARM_EABI__) && !defined(__EABI__) && !defined(__VFP_FP__) +#endif // MANUAL_MERGE_REQUIRED #define WTF_PLATFORM_MIDDLE_ENDIAN 1 #endif +#ifdef MANUAL_MERGE_REQUIRED #endif #if !defined(__ARM_EABI__) +#else // MANUAL_MERGE_REQUIRED +#if !defined(__ARM_EABI__) && !defined(__EABI__) +#endif // MANUAL_MERGE_REQUIRED #define WTF_PLATFORM_FORCE_PACK 1 #endif +#define ARM_ARCH_VERSION 3 +#if defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) +#undef ARM_ARCH_VERSION +#define ARM_ARCH_VERSION 4 +#endif +#if defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) \ + || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) \ + || defined(__ARM_ARCH_5TEJ__) +#undef ARM_ARCH_VERSION +#define ARM_ARCH_VERSION 5 +#endif +#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \ + || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \ + || defined(__ARM_ARCH_6ZK__) +#undef ARM_ARCH_VERSION +#define ARM_ARCH_VERSION 6 #endif #if defined(__ARM_ARCH_7A__) -#define WTF_PLATFORM_ARM_V7 1 +#undef ARM_ARCH_VERSION +#define ARM_ARCH_VERSION 7 #endif +#endif /* ARM */ +#define PLATFORM_ARM_ARCH(N) (PLATFORM(ARM) && ARM_ARCH_VERSION >= N) /* PLATFORM(X86) */ #if defined(__i386__) \ @@ -285,12 +311,12 @@ #define WTF_PLATFORM_BIG_ENDIAN 1 #endif -/* PLATFORM(WIN_CE) && PLATFORM(QT) +/* PLATFORM(WINCE) && PLATFORM(QT) We can not determine the endianess at compile time. For Qt for Windows CE the endianess is specified in the device specific makespec */ -#if PLATFORM(WIN_CE) && PLATFORM(QT) +#if PLATFORM(WINCE) && PLATFORM(QT) # include <QtGlobal> # undef WTF_PLATFORM_BIG_ENDIAN # undef WTF_PLATFORM_MIDDLE_ENDIAN @@ -318,6 +344,7 @@ /* --gnu option of the RVCT compiler also defines __GNUC__ */ #if defined(__GNUC__) && !COMPILER(RVCT) #define WTF_COMPILER_GCC 1 +#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) #endif /* COMPILER(MINGW) */ @@ -346,11 +373,43 @@ #define ENABLE_JSC_MULTIPLE_THREADS 1 #endif +/* On Windows, use QueryPerformanceCounter by default */ +#if PLATFORM(WIN_OS) +#define WTF_USE_QUERY_PERFORMANCE_COUNTER 1 +#endif + +#if PLATFORM(WINCE) && !PLATFORM(QT) +#undef ENABLE_JSC_MULTIPLE_THREADS +#define ENABLE_JSC_MULTIPLE_THREADS 0 +#define USE_SYSTEM_MALLOC 0 +#define ENABLE_ICONDATABASE 0 +#define ENABLE_JAVASCRIPT_DEBUGGER 0 +#define ENABLE_FTPDIR 0 +#define ENABLE_PAN_SCROLLING 0 +#define ENABLE_WML 1 +#define HAVE_ACCESSIBILITY 0 + +#define NOMINMAX // Windows min and max conflict with standard macros +#define NOSHLWAPI // shlwapi.h not available on WinCe + +// MSDN documentation says these functions are provided with uspce.lib. But we cannot find this file. +#define __usp10__ // disable "usp10.h" + +#define _INC_ASSERT // disable "assert.h" +#define assert(x) + +// _countof is only included in CE6; for CE5 we need to define it ourself +#ifndef _countof +#define _countof(x) (sizeof(x) / sizeof((x)[0])) +#endif + +#endif /* PLATFORM(WINCE) && !PLATFORM(QT) */ + /* for Unicode, KDE uses Qt */ #if PLATFORM(KDE) || PLATFORM(QT) #define WTF_USE_QT4_UNICODE 1 -#elif PLATFORM(SYMBIAN) -#define WTF_USE_SYMBIAN_UNICODE 1 +#elif PLATFORM(WINCE) +#define WTF_USE_WINCE_UNICODE 1 #elif PLATFORM(GTK) /* The GTK+ Unicode backend is configurable */ #else @@ -409,6 +468,16 @@ #endif #endif /* !defined(HAVE_ACCESSIBILITY) */ +#if PLATFORM(UNIX) && !PLATFORM(SYMBIAN) +#define HAVE_SIGNAL_H 1 +#endif + +#if !PLATFORM(WIN_OS) && !PLATFORM(SOLARIS) && !PLATFORM(SYMBIAN) && !COMPILER(RVCT) +#define HAVE_TM_GMTOFF 1 +#define HAVE_TM_ZONE 1 +#define HAVE_TIMEGM 1 +#endif + #if PLATFORM(DARWIN) #define HAVE_ERRNO_H 1 @@ -433,7 +502,7 @@ #elif PLATFORM(WIN_OS) #define HAVE_FLOAT_H 1 -#if PLATFORM(WIN_CE) +#if PLATFORM(WINCE) #define HAVE_ERRNO_H 0 #else #define HAVE_SYS_TIMEB_H 1 @@ -545,15 +614,22 @@ #define ENABLE_ON_FIRST_TEXTAREA_FOCUS_SELECT_ALL 0 #endif -#if !defined(WTF_USE_ALTERNATE_JSIMMEDIATE) && PLATFORM(X86_64) && PLATFORM(MAC) -#define WTF_USE_ALTERNATE_JSIMMEDIATE 1 +#if !defined(WTF_USE_JSVALUE64) && !defined(WTF_USE_JSVALUE32) && !defined(WTF_USE_JSVALUE32_64) +#if PLATFORM(X86_64) && (PLATFORM(MAC) || (PLATFORM(LINUX) && !PLATFORM(QT))) +#define WTF_USE_JSVALUE64 1 +#elif PLATFORM(PPC64) || PLATFORM(QT) /* All Qt layout tests crash in JSVALUE32_64 mode. */ +#define WTF_USE_JSVALUE32 1 +#else +#define WTF_USE_JSVALUE32_64 1 #endif +#endif /* !defined(WTF_USE_JSVALUE64) && !defined(WTF_USE_JSVALUE32) && !defined(WTF_USE_JSVALUE32_64) */ #if !defined(ENABLE_REPAINT_THROTTLING) #define ENABLE_REPAINT_THROTTLING 0 #endif #if !defined(ENABLE_JIT) + /* The JIT is tested & working on x86_64 Mac */ #if PLATFORM(X86_64) && PLATFORM(MAC) #define ENABLE_JIT 1 @@ -561,7 +637,7 @@ #elif PLATFORM(X86) && PLATFORM(MAC) #define ENABLE_JIT 1 #define WTF_USE_JIT_STUB_ARGUMENT_VA_LIST 1 -#elif PLATFORM(ARM_V7) && PLATFORM(IPHONE) +#elif PLATFORM_ARM_ARCH(7) && PLATFORM(IPHONE) /* Under development, temporarily disabled until 16Mb link range limit in assembler is fixed. */ #define ENABLE_JIT 0 #define ENABLE_JIT_OPTIMIZE_NATIVE_CALL 0 @@ -569,8 +645,23 @@ #elif PLATFORM(X86) && PLATFORM(WIN) #define ENABLE_JIT 1 #endif + +#if PLATFORM(X86) && PLATFORM(QT) +#if PLATFORM(WIN_OS) && COMPILER(MINGW) && GCC_VERSION >= 40100 + #define ENABLE_JIT 1 + #define WTF_USE_JIT_STUB_ARGUMENT_VA_LIST 1 +#elif PLATFORM(WIN_OS) && COMPILER(MSVC) + #define ENABLE_JIT 1 + #define WTF_USE_JIT_STUB_ARGUMENT_REGISTER 1 +#elif PLATFORM(LINUX) && GCC_VERSION >= 40100 + #define ENABLE_JIT 1 + #define WTF_USE_JIT_STUB_ARGUMENT_VA_LIST 1 #endif +#endif /* PLATFORM(QT) && PLATFORM(X86) */ +#endif /* !defined(ENABLE_JIT) */ + +#if ENABLE(JIT) #ifndef ENABLE_JIT_OPTIMIZE_CALL #define ENABLE_JIT_OPTIMIZE_CALL 1 #endif @@ -580,12 +671,10 @@ #ifndef ENABLE_JIT_OPTIMIZE_PROPERTY_ACCESS #define ENABLE_JIT_OPTIMIZE_PROPERTY_ACCESS 1 #endif -#ifndef ENABLE_JIT_OPTIMIZE_ARITHMETIC -#define ENABLE_JIT_OPTIMIZE_ARITHMETIC 1 -#endif #ifndef ENABLE_JIT_OPTIMIZE_METHOD_CALLS #define ENABLE_JIT_OPTIMIZE_METHOD_CALLS 1 #endif +#endif #if PLATFORM(X86) && COMPILER(MSVC) #define JSC_HOST_CALL __fastcall @@ -606,15 +695,29 @@ #endif /* Yet Another Regex Runtime. */ +#if !defined(ENABLE_YARR_JIT) + /* YARR supports x86 & x86-64, and has been tested on Mac and Windows. */ -#if (!defined(ENABLE_YARR_JIT) && PLATFORM(X86) && PLATFORM(MAC)) \ - || (!defined(ENABLE_YARR_JIT) && PLATFORM(X86_64) && PLATFORM(MAC)) \ +#if (PLATFORM(X86) && PLATFORM(MAC)) \ + || (PLATFORM(X86_64) && PLATFORM(MAC)) \ /* Under development, temporarily disabled until 16Mb link range limit in assembler is fixed. */ \ - || (!defined(ENABLE_YARR_JIT) && PLATFORM(ARM_V7) && PLATFORM(IPHONE) && 0) \ - || (!defined(ENABLE_YARR_JIT) && PLATFORM(X86) && PLATFORM(WIN)) + || (PLATFORM_ARM_ARCH(7) && PLATFORM(IPHONE) && 0) \ + || (PLATFORM(X86) && PLATFORM(WIN)) +#define ENABLE_YARR 1 +#define ENABLE_YARR_JIT 1 +#endif + +#if PLATFORM(X86) && PLATFORM(QT) +#if (PLATFORM(WIN_OS) && COMPILER(MINGW) && GCC_VERSION >= 40100) \ + || (PLATFORM(WIN_OS) && COMPILER(MSVC)) \ + || (PLATFORM(LINUX) && GCC_VERSION >= 40100) #define ENABLE_YARR 1 #define ENABLE_YARR_JIT 1 #endif +#endif + +#endif /* !defined(ENABLE_YARR_JIT) */ + /* Sanity Check */ #if ENABLE(YARR_JIT) && !ENABLE(YARR) #error "YARR_JIT requires YARR" @@ -625,7 +728,7 @@ #endif /* Setting this flag prevents the assembler from using RWX memory; this may improve security but currectly comes at a significant performance cost. */ -#if PLATFORM(ARM_V7) && PLATFORM(IPHONE) +#if PLATFORM(IPHONE) #define ENABLE_ASSEMBLER_WX_EXCLUSIVE 1 #else #define ENABLE_ASSEMBLER_WX_EXCLUSIVE 0 @@ -650,4 +753,15 @@ #define WTF_USE_FONT_FAST_PATH 1 #endif +/* Accelerated compositing */ +#if PLATFORM(MAC) +#if !defined(BUILDING_ON_TIGER) +#define WTF_USE_ACCELERATED_COMPOSITING 1 +#endif +#endif + +#if PLATFORM(IPHONE) +#define WTF_USE_ACCELERATED_COMPOSITING 1 +#endif + #endif /* WTF_Platform_h */ diff --git a/JavaScriptCore/wtf/PtrAndFlags.h b/JavaScriptCore/wtf/PtrAndFlags.h index 477e893..485c595 100644 --- a/JavaScriptCore/wtf/PtrAndFlags.h +++ b/JavaScriptCore/wtf/PtrAndFlags.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Google Inc. All rights reserved. + * Copyright (C) 2009 Google Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -37,14 +37,29 @@ namespace WTF { template<class T, typename FlagEnum> class PtrAndFlags { public: PtrAndFlags() : m_ptrAndFlags(0) {} + PtrAndFlags(T* ptr) : m_ptrAndFlags(0) { set(ptr); } bool isFlagSet(FlagEnum flagNumber) const { ASSERT(flagNumber < 2); return m_ptrAndFlags & (1 << flagNumber); } void setFlag(FlagEnum flagNumber) { ASSERT(flagNumber < 2); m_ptrAndFlags |= (1 << flagNumber);} void clearFlag(FlagEnum flagNumber) { ASSERT(flagNumber < 2); m_ptrAndFlags &= ~(1 << flagNumber);} T* get() const { return reinterpret_cast<T*>(m_ptrAndFlags & ~3); } - void set(T* ptr) { ASSERT(!(reinterpret_cast<intptr_t>(ptr) & 3)); m_ptrAndFlags = reinterpret_cast<intptr_t>(ptr) | (m_ptrAndFlags & 3);} + void set(T* ptr) + { + ASSERT(!(reinterpret_cast<intptr_t>(ptr) & 3)); + m_ptrAndFlags = reinterpret_cast<intptr_t>(ptr) | (m_ptrAndFlags & 3); +#ifndef NDEBUG + m_leaksPtr = ptr; +#endif + } + + bool operator!() const { return !get(); } + T* operator->() const { return reinterpret_cast<T*>(m_ptrAndFlags & ~3); } + private: intptr_t m_ptrAndFlags; +#ifndef NDEBUG + void* m_leaksPtr; // Only used to allow tools like leaks on OSX to detect that the memory is referenced. +#endif }; } // namespace WTF diff --git a/JavaScriptCore/wtf/RandomNumber.cpp b/JavaScriptCore/wtf/RandomNumber.cpp index c94d5a4..0e6e208 100644 --- a/JavaScriptCore/wtf/RandomNumber.cpp +++ b/JavaScriptCore/wtf/RandomNumber.cpp @@ -1,6 +1,6 @@ /* * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. - * (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) + * (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -34,6 +34,12 @@ #include <stdint.h> #include <stdlib.h> +#if PLATFORM(WINCE) +extern "C" { +#include "wince/mt19937ar.c" +} +#endif + namespace WTF { double weakRandomNumber() @@ -74,6 +80,8 @@ double randomNumber() // Mask off the low 53bits fullRandom &= (1LL << 53) - 1; return static_cast<double>(fullRandom)/static_cast<double>(1LL << 53); +#elif PLATFORM(WINCE) + return genrand_res53(); #else uint32_t part1 = rand() & (RAND_MAX - 1); uint32_t part2 = rand() & (RAND_MAX - 1); diff --git a/JavaScriptCore/wtf/RandomNumberSeed.h b/JavaScriptCore/wtf/RandomNumberSeed.h index f994fd9..a66433e 100644 --- a/JavaScriptCore/wtf/RandomNumberSeed.h +++ b/JavaScriptCore/wtf/RandomNumberSeed.h @@ -38,6 +38,12 @@ #include <unistd.h> #endif +#if PLATFORM(WINCE) +extern "C" { +void init_by_array(unsigned long init_key[],int key_length); +} +#endif + // Internal JavaScriptCore usage only namespace WTF { @@ -45,8 +51,19 @@ inline void initializeRandomNumberGenerator() { #if PLATFORM(DARWIN) // On Darwin we use arc4random which initialises itself. +#elif PLATFORM(WINCE) + // initialize rand() + srand(static_cast<unsigned>(time(0))); + + // use rand() to initialize the real RNG + unsigned long initializationBuffer[4]; + initializationBuffer[0] = (rand() << 16) | rand(); + initializationBuffer[1] = (rand() << 16) | rand(); + initializationBuffer[2] = (rand() << 16) | rand(); + initializationBuffer[3] = (rand() << 16) | rand(); + init_by_array(initializationBuffer, 4); #elif COMPILER(MSVC) && defined(_CRT_RAND_S) - // On Windows we use rand_s which intialises itself + // On Windows we use rand_s which initialises itself #elif PLATFORM(UNIX) // srandomdev is not guaranteed to exist on linux so we use this poor seed, this should be improved timeval time; diff --git a/JavaScriptCore/wtf/RefCounted.h b/JavaScriptCore/wtf/RefCounted.h index c174145..761a856 100644 --- a/JavaScriptCore/wtf/RefCounted.h +++ b/JavaScriptCore/wtf/RefCounted.h @@ -29,7 +29,7 @@ namespace WTF { // This base class holds the non-template methods and attributes. // The RefCounted class inherits from it reducing the template bloat // generated by the compiler (technique called template hoisting). -class RefCountedBase : Noncopyable { +class RefCountedBase { public: void ref() { @@ -101,7 +101,7 @@ private: }; -template<class T> class RefCounted : public RefCountedBase { +template<class T> class RefCounted : public RefCountedBase, public Noncopyable { public: void deref() { @@ -115,8 +115,23 @@ protected: } }; +template<class T> class RefCountedCustomAllocated : public RefCountedBase, public NoncopyableCustomAllocated { +public: + void deref() + { + if (derefBase()) + delete static_cast<T*>(this); + } + +protected: + ~RefCountedCustomAllocated() + { + } +}; + } // namespace WTF using WTF::RefCounted; +using WTF::RefCountedCustomAllocated; #endif // RefCounted_h diff --git a/JavaScriptCore/wtf/RefPtr.h b/JavaScriptCore/wtf/RefPtr.h index 929e745..74cd0ea 100644 --- a/JavaScriptCore/wtf/RefPtr.h +++ b/JavaScriptCore/wtf/RefPtr.h @@ -23,6 +23,7 @@ #include <algorithm> #include "AlwaysInline.h" +#include "FastAllocBase.h" namespace WTF { @@ -32,7 +33,7 @@ namespace WTF { enum HashTableDeletedValueType { HashTableDeletedValue }; - template <typename T> class RefPtr { + template <typename T> class RefPtr : public FastAllocBase { public: RefPtr() : m_ptr(0) { } RefPtr(T* ptr) : m_ptr(ptr) { if (ptr) ptr->ref(); } diff --git a/JavaScriptCore/wtf/RefPtrHashMap.h b/JavaScriptCore/wtf/RefPtrHashMap.h index 1cbebb4..9433025 100644 --- a/JavaScriptCore/wtf/RefPtrHashMap.h +++ b/JavaScriptCore/wtf/RefPtrHashMap.h @@ -42,7 +42,7 @@ namespace WTF { }; template<typename T, typename MappedArg, typename HashArg, typename KeyTraitsArg, typename MappedTraitsArg> - class HashMap<RefPtr<T>, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg> { + class HashMap<RefPtr<T>, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg> : public FastAllocBase { private: typedef KeyTraitsArg KeyTraits; typedef MappedTraitsArg MappedTraits; diff --git a/JavaScriptCore/bytecompiler/SegmentedVector.h b/JavaScriptCore/wtf/SegmentedVector.h index bbab04f..065c19c 100644 --- a/JavaScriptCore/bytecompiler/SegmentedVector.h +++ b/JavaScriptCore/wtf/SegmentedVector.h @@ -31,13 +31,79 @@ #include <wtf/Vector.h> -namespace JSC { +namespace WTF { + + // An iterator for SegmentedVector. It supports only the pre ++ operator + template <typename T, size_t SegmentSize> class SegmentedVector; + template <typename T, size_t SegmentSize> class SegmentedVectorIterator { + private: + friend class SegmentedVector<T, SegmentSize>; + public: + typedef SegmentedVectorIterator<T, SegmentSize> Iterator; + + ~SegmentedVectorIterator() { } + + T& operator*() const { return m_vector.m_segments.at(m_segment)->at(m_index); } + T* operator->() const { return &m_vector.m_segments.at(m_segment)->at(m_index); } + + // Only prefix ++ operator supported + Iterator& operator++() + { + ASSERT(m_index != SegmentSize); + ++m_index; + if (m_index >= m_vector.m_segments.at(m_segment)->size()) { + if (m_segment + 1 < m_vector.m_segments.size()) { + ASSERT(m_vector.m_segments.at(m_segment)->size() > 0); + ++m_segment; + m_index = 0; + } else { + // Points to the "end" symbol + m_segment = 0; + m_index = SegmentSize; + } + } + return *this; + } + + bool operator==(const Iterator& other) const + { + return (m_index == other.m_index && m_segment = other.m_segment && &m_vector == &other.m_vector); + } + + bool operator!=(const Iterator& other) const + { + return (m_index != other.m_index || m_segment != other.m_segment || &m_vector != &other.m_vector); + } + + SegmentedVectorIterator& operator=(const SegmentedVectorIterator<T, SegmentSize>& other) + { + m_vector = other.m_vector; + m_segment = other.m_segment; + m_index = other.m_index; + return *this; + } + + private: + SegmentedVectorIterator(SegmentedVector<T, SegmentSize>& vector, size_t segment, size_t index) + : m_vector(vector) + , m_segment(segment) + , m_index(index) + { + } + + SegmentedVector<T, SegmentSize>& m_vector; + size_t m_segment; + size_t m_index; + }; // SegmentedVector is just like Vector, but it doesn't move the values // stored in its buffer when it grows. Therefore, it is safe to keep // pointers into a SegmentedVector. template <typename T, size_t SegmentSize> class SegmentedVector { + friend class SegmentedVectorIterator<T, SegmentSize>; public: + typedef SegmentedVectorIterator<T, SegmentSize> Iterator; + SegmentedVector() : m_size(0) { @@ -82,6 +148,12 @@ namespace JSC { segmentFor(m_size - 1)->uncheckedAppend(value); } + T& alloc() + { + append<T>(T()); + return last(); + } + void removeLast() { if (m_size <= SegmentSize) @@ -106,9 +178,19 @@ namespace JSC { m_size = 0; } + Iterator begin() + { + return Iterator(*this, 0, m_size ? 0 : SegmentSize); + } + + Iterator end() + { + return Iterator(*this, 0, SegmentSize); + } + private: typedef Vector<T, SegmentSize> Segment; - + void deleteAllSegments() { // Skip the first segment, because it's our inline segment, which was @@ -116,22 +198,22 @@ namespace JSC { for (size_t i = 1; i < m_segments.size(); i++) delete m_segments[i]; } - + bool segmentExistsFor(size_t index) { return index / SegmentSize < m_segments.size(); } - + Segment* segmentFor(size_t index) { return m_segments[index / SegmentSize]; } - + size_t subscriptFor(size_t index) { return index % SegmentSize; } - + void ensureSegmentsFor(size_t size) { size_t segmentCount = m_size / SegmentSize; @@ -147,7 +229,7 @@ namespace JSC { size_t end = neededSegmentCount - 1; for (size_t i = segmentCount - 1; i < end; ++i) ensureSegment(i, SegmentSize); - + // Grow segment N to accomodate the remainder. ensureSegment(end, subscriptFor(size - 1) + 1); } @@ -165,6 +247,6 @@ namespace JSC { Vector<Segment*, 32> m_segments; }; -} // namespace JSC +} // namespace WTF #endif // SegmentedVector_h diff --git a/JavaScriptCore/wtf/StdLibExtras.h b/JavaScriptCore/wtf/StdLibExtras.h index afc5e8a..d21d1ff 100644 --- a/JavaScriptCore/wtf/StdLibExtras.h +++ b/JavaScriptCore/wtf/StdLibExtras.h @@ -41,6 +41,11 @@ static type& name = *new type arguments #endif +// OBJECT_OFFSETOF: Like the C++ offsetof macro, but you can use it with classes. +// The magic number 0x4000 is insignificant. We use it to avoid using NULL, since +// NULL can cause compiler problems, especially in cases of multiple inheritance. +#define OBJECT_OFFSETOF(class, field) (reinterpret_cast<ptrdiff_t>(&(reinterpret_cast<class*>(0x4000)->field)) - 0x4000) + namespace WTF { /* diff --git a/JavaScriptCore/wtf/StringExtras.h b/JavaScriptCore/wtf/StringExtras.h index 926fd61..1c23390 100644 --- a/JavaScriptCore/wtf/StringExtras.h +++ b/JavaScriptCore/wtf/StringExtras.h @@ -45,7 +45,7 @@ inline int snprintf(char* buffer, size_t count, const char* format, ...) return result; } -#if COMPILER(MSVC7) || PLATFORM(WIN_CE) +#if COMPILER(MSVC7) || PLATFORM(WINCE) inline int vsnprintf(char* buffer, size_t count, const char* format, va_list args) { @@ -54,7 +54,7 @@ inline int vsnprintf(char* buffer, size_t count, const char* format, va_list arg #endif -#if PLATFORM(WIN_CE) +#if PLATFORM(WINCE) inline int strnicmp(const char* string1, const char* string2, size_t count) { diff --git a/JavaScriptCore/wtf/TCSystemAlloc.cpp b/JavaScriptCore/wtf/TCSystemAlloc.cpp index 478ce63..659bb0e 100644 --- a/JavaScriptCore/wtf/TCSystemAlloc.cpp +++ b/JavaScriptCore/wtf/TCSystemAlloc.cpp @@ -31,6 +31,14 @@ // Author: Sanjay Ghemawat #include "config.h" +#include "TCSystemAlloc.h" + +#include <algorithm> +#include <fcntl.h> +#include "Assertions.h" +#include "TCSpinLock.h" +#include "UnusedParam.h" + #if HAVE(STDINT_H) #include <stdint.h> #elif HAVE(INTTYPES_H) @@ -38,6 +46,7 @@ #else #include <sys/types.h> #endif + #if PLATFORM(WIN_OS) #include "windows.h" #else @@ -45,16 +54,13 @@ #include <unistd.h> #include <sys/mman.h> #endif -#include <fcntl.h> -#include "Assertions.h" -#include "TCSystemAlloc.h" -#include "TCSpinLock.h" -#include "UnusedParam.h" #ifndef MAP_ANONYMOUS #define MAP_ANONYMOUS MAP_ANON #endif +using namespace std; + // Structure for discovering alignment union MemoryAligner { void* p; @@ -441,6 +447,32 @@ void TCMalloc_SystemRelease(void* start, size_t length) ASSERT_UNUSED(newAddress, newAddress == start || newAddress == reinterpret_cast<void*>(MAP_FAILED)); } +#elif HAVE(VIRTUALALLOC) + +void TCMalloc_SystemRelease(void* start, size_t length) +{ + if (VirtualFree(start, length, MEM_DECOMMIT)) + return; + + // The decommit may fail if the memory region consists of allocations + // from more than one call to VirtualAlloc. In this case, fall back to + // using VirtualQuery to retrieve the allocation boundaries and decommit + // them each individually. + + char* ptr = static_cast<char*>(start); + char* end = ptr + length; + MEMORY_BASIC_INFORMATION info; + while (ptr < end) { + size_t resultSize = VirtualQuery(ptr, &info, sizeof(info)); + ASSERT_UNUSED(resultSize, resultSize == sizeof(info)); + + size_t decommitSize = min<size_t>(info.RegionSize, end - ptr); + BOOL success = VirtualFree(ptr, decommitSize, MEM_DECOMMIT); + ASSERT_UNUSED(success, success); + ptr += decommitSize; + } +} + #else // Platforms that don't support returning memory use an empty inline version of TCMalloc_SystemRelease @@ -457,8 +489,28 @@ void TCMalloc_SystemCommit(void* start, size_t length) #elif HAVE(VIRTUALALLOC) -void TCMalloc_SystemCommit(void*, size_t) +void TCMalloc_SystemCommit(void* start, size_t length) { + if (VirtualAlloc(start, length, MEM_COMMIT, PAGE_READWRITE) == start) + return; + + // The commit may fail if the memory region consists of allocations + // from more than one call to VirtualAlloc. In this case, fall back to + // using VirtualQuery to retrieve the allocation boundaries and commit them + // each individually. + + char* ptr = static_cast<char*>(start); + char* end = ptr + length; + MEMORY_BASIC_INFORMATION info; + while (ptr < end) { + size_t resultSize = VirtualQuery(ptr, &info, sizeof(info)); + ASSERT_UNUSED(resultSize, resultSize == sizeof(info)); + + size_t commitSize = min<size_t>(info.RegionSize, end - ptr); + void* newAddress = VirtualAlloc(ptr, commitSize, MEM_COMMIT, PAGE_READWRITE); + ASSERT_UNUSED(newAddress, newAddress == ptr); + ptr += commitSize; + } } #else diff --git a/JavaScriptCore/wtf/TCSystemAlloc.h b/JavaScriptCore/wtf/TCSystemAlloc.h index 8e3a01a..1c67788 100644 --- a/JavaScriptCore/wtf/TCSystemAlloc.h +++ b/JavaScriptCore/wtf/TCSystemAlloc.h @@ -64,7 +64,7 @@ extern void TCMalloc_SystemRelease(void* start, size_t length); extern void TCMalloc_SystemCommit(void* start, size_t length); -#if !HAVE(MADV_FREE_REUSE) && !HAVE(MADV_DONTNEED) && !HAVE(MMAP) +#if !HAVE(MADV_FREE_REUSE) && !HAVE(MADV_DONTNEED) && !HAVE(MMAP) && !HAVE(VIRTUALALLOC) inline void TCMalloc_SystemRelease(void*, size_t) { } #endif diff --git a/JavaScriptCore/wtf/ThreadSpecific.h b/JavaScriptCore/wtf/ThreadSpecific.h index b07a9a2..4d5d2f7 100644 --- a/JavaScriptCore/wtf/ThreadSpecific.h +++ b/JavaScriptCore/wtf/ThreadSpecific.h @@ -59,7 +59,7 @@ namespace WTF { void ThreadSpecificThreadExit(); #endif -template<typename T> class ThreadSpecific : Noncopyable { +template<typename T> class ThreadSpecific : public Noncopyable { public: ThreadSpecific(); T* operator->(); diff --git a/JavaScriptCore/wtf/Threading.cpp b/JavaScriptCore/wtf/Threading.cpp index bd25ee7..56bf438 100644 --- a/JavaScriptCore/wtf/Threading.cpp +++ b/JavaScriptCore/wtf/Threading.cpp @@ -30,7 +30,7 @@ namespace WTF { -struct NewThreadContext { +struct NewThreadContext : FastAllocBase { NewThreadContext(ThreadFunction entryPoint, void* data, const char* name) : entryPoint(entryPoint) , data(data) diff --git a/JavaScriptCore/wtf/Threading.h b/JavaScriptCore/wtf/Threading.h index e562f35..66e0d2a 100644 --- a/JavaScriptCore/wtf/Threading.h +++ b/JavaScriptCore/wtf/Threading.h @@ -59,7 +59,9 @@ #ifndef Threading_h #define Threading_h -#if PLATFORM(WIN_CE) +#include "Platform.h" + +#if PLATFORM(WINCE) #include <windows.h> #endif @@ -67,7 +69,7 @@ #include <wtf/Locker.h> #include <wtf/Noncopyable.h> -#if PLATFORM(WIN_OS) && !PLATFORM(WIN_CE) +#if PLATFORM(WIN_OS) && !PLATFORM(WINCE) #include <windows.h> #elif PLATFORM(DARWIN) #include <libkern/OSAtomic.h> @@ -128,18 +130,22 @@ void detachThread(ThreadIdentifier); #if USE(PTHREADS) typedef pthread_mutex_t PlatformMutex; +typedef pthread_rwlock_t PlatformReadWriteLock; typedef pthread_cond_t PlatformCondition; #elif PLATFORM(GTK) typedef GOwnPtr<GMutex> PlatformMutex; +typedef void* PlatformReadWriteLock; // FIXME: Implement. typedef GOwnPtr<GCond> PlatformCondition; #elif PLATFORM(QT) typedef QT_PREPEND_NAMESPACE(QMutex)* PlatformMutex; +typedef void* PlatformReadWriteLock; // FIXME: Implement. typedef QT_PREPEND_NAMESPACE(QWaitCondition)* PlatformCondition; #elif PLATFORM(WIN_OS) struct PlatformMutex { CRITICAL_SECTION m_internalMutex; size_t m_recursionCount; }; +typedef void* PlatformReadWriteLock; // FIXME: Implement. struct PlatformCondition { size_t m_waitersGone; size_t m_waitersBlocked; @@ -153,10 +159,11 @@ struct PlatformCondition { }; #else typedef void* PlatformMutex; +typedef void* PlatformReadWriteLock; typedef void* PlatformCondition; #endif -class Mutex : Noncopyable { +class Mutex : public Noncopyable { public: Mutex(); ~Mutex(); @@ -173,7 +180,24 @@ private: typedef Locker<Mutex> MutexLocker; -class ThreadCondition : Noncopyable { +class ReadWriteLock : public Noncopyable { +public: + ReadWriteLock(); + ~ReadWriteLock(); + + void readLock(); + bool tryReadLock(); + + void writeLock(); + bool tryWriteLock(); + + void unlock(); + +private: + PlatformReadWriteLock m_readWriteLock; +}; + +class ThreadCondition : public Noncopyable { public: ThreadCondition(); ~ThreadCondition(); @@ -192,7 +216,7 @@ private: #if PLATFORM(WIN_OS) #define WTF_USE_LOCKFREE_THREADSAFESHARED 1 -#if COMPILER(MINGW) || COMPILER(MSVC7) || PLATFORM(WIN_CE) +#if COMPILER(MINGW) || COMPILER(MSVC7) || PLATFORM(WINCE) inline void atomicIncrement(int* addend) { InterlockedIncrement(reinterpret_cast<long*>(addend)); } inline int atomicDecrement(int* addend) { return InterlockedDecrement(reinterpret_cast<long*>(addend)); } #else @@ -219,7 +243,7 @@ inline int atomicDecrement(int volatile* addend) { return __gnu_cxx::__exchange_ #endif -class ThreadSafeSharedBase : Noncopyable { +class ThreadSafeSharedBase : public Noncopyable { public: ThreadSafeSharedBase(int initialRefCount = 1) : m_refCount(initialRefCount) diff --git a/JavaScriptCore/wtf/ThreadingNone.cpp b/JavaScriptCore/wtf/ThreadingNone.cpp index e713102..46f23d2 100644 --- a/JavaScriptCore/wtf/ThreadingNone.cpp +++ b/JavaScriptCore/wtf/ThreadingNone.cpp @@ -48,8 +48,8 @@ void Mutex::unlock() { } ThreadCondition::ThreadCondition() { } ThreadCondition::~ThreadCondition() { } -void ThreadCondition::wait(Mutex& mutex) { } -bool ThreadCondition::timedWait(Mutex& mutex, double absoluteTime) { return false; } +void ThreadCondition::wait(Mutex&) { } +bool ThreadCondition::timedWait(Mutex&, double) { return false; } void ThreadCondition::signal() { } void ThreadCondition::broadcast() { } diff --git a/JavaScriptCore/wtf/ThreadingPthreads.cpp b/JavaScriptCore/wtf/ThreadingPthreads.cpp index 1aa5600..a321b40 100644 --- a/JavaScriptCore/wtf/ThreadingPthreads.cpp +++ b/JavaScriptCore/wtf/ThreadingPthreads.cpp @@ -268,6 +268,61 @@ void Mutex::unlock() ASSERT_UNUSED(result, !result); } + +ReadWriteLock::ReadWriteLock() +{ + pthread_rwlock_init(&m_readWriteLock, NULL); +} + +ReadWriteLock::~ReadWriteLock() +{ + pthread_rwlock_destroy(&m_readWriteLock); +} + +void ReadWriteLock::readLock() +{ + int result = pthread_rwlock_rdlock(&m_readWriteLock); + ASSERT_UNUSED(result, !result); +} + +bool ReadWriteLock::tryReadLock() +{ + int result = pthread_rwlock_tryrdlock(&m_readWriteLock); + + if (result == 0) + return true; + if (result == EBUSY || result == EAGAIN) + return false; + + ASSERT_NOT_REACHED(); + return false; +} + +void ReadWriteLock::writeLock() +{ + int result = pthread_rwlock_wrlock(&m_readWriteLock); + ASSERT_UNUSED(result, !result); +} + +bool ReadWriteLock::tryWriteLock() +{ + int result = pthread_rwlock_trywrlock(&m_readWriteLock); + + if (result == 0) + return true; + if (result == EBUSY || result == EAGAIN) + return false; + + ASSERT_NOT_REACHED(); + return false; +} + +void ReadWriteLock::unlock() +{ + int result = pthread_rwlock_unlock(&m_readWriteLock); + ASSERT_UNUSED(result, !result); +} + ThreadCondition::ThreadCondition() { pthread_cond_init(&m_condition, NULL); diff --git a/JavaScriptCore/wtf/ThreadingWin.cpp b/JavaScriptCore/wtf/ThreadingWin.cpp index ea18656..cccbda1 100644 --- a/JavaScriptCore/wtf/ThreadingWin.cpp +++ b/JavaScriptCore/wtf/ThreadingWin.cpp @@ -1,6 +1,7 @@ /* * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. * Copyright (C) 2009 Google Inc. All rights reserved. + * Copyright (C) 2009 Torch Mobile, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -89,7 +90,14 @@ #if !USE(PTHREADS) && PLATFORM(WIN_OS) #include "ThreadSpecific.h" #endif +#if !PLATFORM(WINCE) #include <process.h> +#endif +#if HAVE(ERRNO_H) +#include <errno.h> +#else +#define NO_ERRNO +#endif #include <windows.h> #include <wtf/CurrentTime.h> #include <wtf/HashMap.h> @@ -210,9 +218,21 @@ ThreadIdentifier createThreadInternal(ThreadFunction entryPoint, void* data, con unsigned threadIdentifier = 0; ThreadIdentifier threadID = 0; ThreadFunctionInvocation* invocation = new ThreadFunctionInvocation(entryPoint, data); +#if PLATFORM(WINCE) + // This is safe on WINCE, since CRT is in the core and innately multithreaded. + // On desktop Windows, need to use _beginthreadex (not available on WinCE) if using any CRT functions + HANDLE threadHandle = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)wtfThreadEntryPoint, invocation, 0, (LPDWORD)&threadIdentifier); +#else HANDLE threadHandle = reinterpret_cast<HANDLE>(_beginthreadex(0, 0, wtfThreadEntryPoint, invocation, 0, &threadIdentifier)); +#endif if (!threadHandle) { +#if PLATFORM(WINCE) + LOG_ERROR("Failed to create thread at entry point %p with data %p: %ld", entryPoint, data, ::GetLastError()); +#elif defined(NO_ERRNO) + LOG_ERROR("Failed to create thread at entry point %p with data %p.", entryPoint, data); +#else LOG_ERROR("Failed to create thread at entry point %p with data %p: %ld", entryPoint, data, errno); +#endif return 0; } diff --git a/JavaScriptCore/wtf/Vector.h b/JavaScriptCore/wtf/Vector.h index dcfeb29..7cba4e4 100644 --- a/JavaScriptCore/wtf/Vector.h +++ b/JavaScriptCore/wtf/Vector.h @@ -21,16 +21,17 @@ #ifndef WTF_Vector_h #define WTF_Vector_h -#include "Assertions.h" -#include "FastMalloc.h" +#include "FastAllocBase.h" #include "Noncopyable.h" #include "NotFound.h" #include "VectorTraits.h" #include <limits> -#include <stdlib.h> -#include <string.h> #include <utility> +#if PLATFORM(QT) +#include <QDataStream> +#endif + namespace WTF { using std::min; @@ -267,7 +268,7 @@ namespace WTF { }; template<typename T> - class VectorBufferBase : Noncopyable { + class VectorBufferBase : public Noncopyable { public: void allocateBuffer(size_t newCapacity) { @@ -433,7 +434,7 @@ namespace WTF { }; template<typename T, size_t inlineCapacity = 0> - class Vector { + class Vector : public FastAllocBase { private: typedef VectorBuffer<T, inlineCapacity> Buffer; typedef VectorTypeOperations<T> TypeOperations; @@ -566,6 +567,32 @@ namespace WTF { Buffer m_buffer; }; +#if PLATFORM(QT) + template<typename T> + QDataStream& operator<<(QDataStream& stream, const Vector<T>& data) + { + stream << qint64(data.size()); + foreach (const T& i, data) + stream << i; + return stream; + } + + template<typename T> + QDataStream& operator>>(QDataStream& stream, Vector<T>& data) + { + data.clear(); + qint64 count; + T item; + stream >> count; + data.reserveCapacity(count); + for (qint64 i = 0; i < count; ++i) { + stream >> item; + data.append(item); + } + return stream; + } +#endif + template<typename T, size_t inlineCapacity> Vector<T, inlineCapacity>::Vector(const Vector& other) : m_size(other.size()) @@ -907,7 +934,7 @@ namespace WTF { inline void Vector<T, inlineCapacity>::remove(size_t position, size_t length) { ASSERT(position < size()); - ASSERT(position + length < size()); + ASSERT(position + length <= size()); T* beginSpot = begin() + position; T* endSpot = beginSpot + length; TypeOperations::destruct(beginSpot, endSpot); diff --git a/JavaScriptCore/wtf/dtoa.cpp b/JavaScriptCore/wtf/dtoa.cpp index 9509388..d75c17a 100644 --- a/JavaScriptCore/wtf/dtoa.cpp +++ b/JavaScriptCore/wtf/dtoa.cpp @@ -148,6 +148,7 @@ #include <wtf/AlwaysInline.h> #include <wtf/Assertions.h> #include <wtf/FastMalloc.h> +#include <wtf/Vector.h> #include <wtf/Threading.h> #include <stdio.h> @@ -255,6 +256,8 @@ typedef union { double d; uint32_t L[2]; } U; #define Big0 (Frac_mask1 | Exp_msk1 * (DBL_MAX_EXP + Bias - 1)) #define Big1 0xffffffff + +// FIXME: we should remove non-Pack_32 mode since it is unused and unmaintained #ifndef Pack_32 #define Pack_32 #endif @@ -278,25 +281,41 @@ typedef union { double d; uint32_t L[2]; } U; #define Kmax 15 struct BigInt { - BigInt() : sign(0), wds(0) { } - BigInt(const BigInt& other) : sign(other.sign), wds(other.wds) + BigInt() : sign(0) { } + int sign; + + void clear() + { + sign = 0; + m_words.clear(); + } + + size_t size() const + { + return m_words.size(); + } + + void resize(size_t s) { - for (int i = 0; i < 64; ++i) - x[i] = other.x[i]; + m_words.resize(s); + } + + uint32_t* words() + { + return m_words.data(); } - BigInt& operator=(const BigInt& other) + const uint32_t* words() const { - sign = other.sign; - wds = other.wds; - for (int i = 0; i < 64; ++i) - x[i] = other.x[i]; - return *this; + return m_words.data(); } - int sign; - int wds; - uint32_t x[64]; + void append(uint32_t w) + { + m_words.append(w); + } + + Vector<uint32_t, 16> m_words; }; static void multadd(BigInt& b, int m, int a) /* multiply by m and add a */ @@ -307,8 +326,8 @@ static void multadd(BigInt& b, int m, int a) /* multiply by m and add a */ uint32_t carry; #endif - int wds = b.wds; - uint32_t* x = b.x; + int wds = b.size(); + uint32_t* x = b.words(); int i = 0; carry = a; do { @@ -331,10 +350,8 @@ static void multadd(BigInt& b, int m, int a) /* multiply by m and add a */ #endif } while (++i < wds); - if (carry) { - b.x[wds++] = (uint32_t)carry; - b.wds = wds; - } + if (carry) + b.append((uint32_t)carry); } static void s2b(BigInt& b, const char* s, int nd0, int nd, uint32_t y9) @@ -346,12 +363,12 @@ static void s2b(BigInt& b, const char* s, int nd0, int nd, uint32_t y9) for (k = 0, y = 1; x > y; y <<= 1, k++) { } #ifdef Pack_32 b.sign = 0; - b.x[0] = y9; - b.wds = 1; + b.resize(1); + b.words()[0] = y9; #else b.sign = 0; - b.x[0] = y9 & 0xffff; - b.wds = (b->x[1] = y9 >> 16) ? 2 : 1; + b.resize((b->x[1] = y9 >> 16) ? 2 : 1); + b.words()[0] = y9 & 0xffff; #endif int i = 9; @@ -440,8 +457,8 @@ static int lo0bits (uint32_t* y) static void i2b(BigInt& b, int i) { b.sign = 0; - b.x[0] = i; - b.wds = 1; + b.resize(1); + b.words()[0] = i; } static void mult(BigInt& aRef, const BigInt& bRef) @@ -459,23 +476,24 @@ static void mult(BigInt& aRef, const BigInt& bRef) uint32_t carry, z; #endif - if (a->wds < b->wds) { + if (a->size() < b->size()) { const BigInt* tmp = a; a = b; b = tmp; } - wa = a->wds; - wb = b->wds; + wa = a->size(); + wb = b->size(); wc = wa + wb; + c.resize(wc); - for (xc = c.x, xa = xc + wc; xc < xa; xc++) + for (xc = c.words(), xa = xc + wc; xc < xa; xc++) *xc = 0; - xa = a->x; + xa = a->words(); xae = xa + wa; - xb = b->x; + xb = b->words(); xbe = xb + wb; - xc0 = c.x; + xc0 = c.words(); #ifdef USE_LONG_LONG for (; xb < xbe; xc0++) { if ((y = *xb++)) { @@ -537,8 +555,8 @@ static void mult(BigInt& aRef, const BigInt& bRef) } #endif #endif - for (xc0 = c.x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) { } - c.wds = wc; + for (xc0 = c.words(), xc = xc0 + wc; wc > 0 && !*--xc; --wc) { } + c.resize(wc); aRef = c; } @@ -617,14 +635,20 @@ static ALWAYS_INLINE void lshift(BigInt& b, int k) int n = k >> 4; #endif - int n1 = n + b.wds + 1; + int origSize = b.size(); + int n1 = n + origSize + 1; + + if (k &= 0x1f) + b.resize(b.size() + n + 1); + else + b.resize(b.size() + n); - const uint32_t* srcStart = b.x; - uint32_t* dstStart = b.x; - const uint32_t* src = srcStart + b.wds - 1; + const uint32_t* srcStart = b.words(); + uint32_t* dstStart = b.words(); + const uint32_t* src = srcStart + origSize - 1; uint32_t* dst = dstStart + n1 - 1; #ifdef Pack_32 - if (k &= 0x1f) { + if (k) { uint32_t hiSubword = 0; int s = 32 - k; for (; src >= srcStart; --src) { @@ -633,7 +657,8 @@ static ALWAYS_INLINE void lshift(BigInt& b, int k) } *dst = hiSubword; ASSERT(dst == dstStart + n); - b.wds = b.wds + n + (b.x[n1 - 1] != 0); + + b.resize(origSize + n + (b.words()[n1 - 1] != 0)); } #else if (k &= 0xf) { @@ -652,10 +677,11 @@ static ALWAYS_INLINE void lshift(BigInt& b, int k) do { *--dst = *src--; } while (src >= srcStart); - b.wds = b.wds + n; } for (dst = dstStart + n; dst != dstStart; ) *--dst = 0; + + ASSERT(b.size() <= 1 || b.words()[b.size() - 1]); } static int cmp(const BigInt& a, const BigInt& b) @@ -663,15 +689,15 @@ static int cmp(const BigInt& a, const BigInt& b) const uint32_t *xa, *xa0, *xb, *xb0; int i, j; - i = a.wds; - j = b.wds; - ASSERT(i <= 1 || a.x[i - 1]); - ASSERT(j <= 1 || b.x[j - 1]); + i = a.size(); + j = b.size(); + ASSERT(i <= 1 || a.words()[i - 1]); + ASSERT(j <= 1 || b.words()[j - 1]); if (i -= j) return i; - xa0 = a.x; + xa0 = a.words(); xa = xa0 + j; - xb0 = b.x; + xb0 = b.words(); xb = xb0 + j; for (;;) { if (*--xa != *--xb) @@ -692,8 +718,8 @@ static ALWAYS_INLINE void diff(BigInt& c, const BigInt& aRef, const BigInt& bRef i = cmp(*a, *b); if (!i) { c.sign = 0; - c.wds = 1; - c.x[0] = 0; + c.resize(1); + c.words()[0] = 0; return; } if (i < 0) { @@ -704,15 +730,16 @@ static ALWAYS_INLINE void diff(BigInt& c, const BigInt& aRef, const BigInt& bRef } else i = 0; - c.wds = 0; - c.sign = i; - wa = a->wds; - const uint32_t* xa = a->x; + wa = a->size(); + const uint32_t* xa = a->words(); const uint32_t* xae = xa + wa; - wb = b->wds; - const uint32_t* xb = b->x; + wb = b->size(); + const uint32_t* xb = b->words(); const uint32_t* xbe = xb + wb; - xc = c.x; + + c.resize(wa); + c.sign = i; + xc = c.words(); #ifdef USE_LONG_LONG unsigned long long borrow = 0; do { @@ -757,7 +784,7 @@ static ALWAYS_INLINE void diff(BigInt& c, const BigInt& aRef, const BigInt& bRef #endif while (!*--xc) wa--; - c.wds = wa; + c.resize(wa); } static double ulp(U *x) @@ -804,8 +831,8 @@ static double b2d(const BigInt& a, int* e) #define d0 word0(&d) #define d1 word1(&d) - xa0 = a.x; - xa = xa0 + a.wds; + xa0 = a.words(); + xa = xa0 + a.size(); y = *--xa; ASSERT(y); k = hi0bits(y); @@ -860,11 +887,11 @@ static ALWAYS_INLINE void d2b(BigInt& b, U* d, int* e, int* bits) b.sign = 0; #ifdef Pack_32 - b.wds = 1; + b.resize(1); #else - b.wds = 2; + b.resize(2); #endif - x = b.x; + x = b.words(); z = d0 & Frac_mask; d0 &= 0x7fffffff; /* clear sign bit, which we ignore */ @@ -881,17 +908,21 @@ static ALWAYS_INLINE void d2b(BigInt& b, U* d, int* e, int* bits) z >>= k; } else x[0] = y; + if (z) { + b.resize(2); + x[1] = z; + } + #ifndef Sudden_Underflow - i = + i = b.size(); #endif - b.wds = (x[1] = z) ? 2 : 1; } else { k = lo0bits(&z); x[0] = z; #ifndef Sudden_Underflow - i = + i = 1; #endif - b.wds = 1; + b.resize(1); k += 32; } #else @@ -929,7 +960,7 @@ static ALWAYS_INLINE void d2b(BigInt& b, U* d, int* e, int* bits) k += 32; } while (!x[i]) --i; - b->wds = i + 1; + b->resize(i + 1); #endif #ifndef Sudden_Underflow if (de) { @@ -958,9 +989,9 @@ static double ratio(const BigInt& a, const BigInt& b) dval(&da) = b2d(a, &ka); dval(&db) = b2d(b, &kb); #ifdef Pack_32 - k = ka - kb + 32 * (a.wds - b.wds); + k = ka - kb + 32 * (a.size() - b.size()); #else - k = ka - kb + 16 * (a.wds - b.wds); + k = ka - kb + 16 * (a.size() - b.size()); #endif if (k > 0) word0(&da) += k * Exp_msk1; @@ -1452,12 +1483,12 @@ undfl: #endif ) { #ifdef SET_INEXACT - if (!delta->x[0] && delta->wds <= 1) + if (!delta->words()[0] && delta->size() <= 1) inexact = 0; #endif break; } - if (!delta.x[0] && delta.wds <= 1) { + if (!delta.words()[0] && delta.size() <= 1) { /* exact result */ #ifdef SET_INEXACT inexact = 0; @@ -1700,7 +1731,7 @@ ret: static ALWAYS_INLINE int quorem(BigInt& b, BigInt& S) { - int n; + size_t n; uint32_t *bx, *bxe, q, *sx, *sxe; #ifdef USE_LONG_LONG unsigned long long borrow, carry, y, ys; @@ -1710,14 +1741,16 @@ static ALWAYS_INLINE int quorem(BigInt& b, BigInt& S) uint32_t si, z, zs; #endif #endif + ASSERT(b.size() <= 1 || b.words()[b.size() - 1]); + ASSERT(S.size() <= 1 || S.words()[S.size() - 1]); - n = S.wds; - ASSERT_WITH_MESSAGE(b.wds <= n, "oversize b in quorem"); - if (b.wds < n) + n = S.size(); + ASSERT_WITH_MESSAGE(b.size() <= n, "oversize b in quorem"); + if (b.size() < n) return 0; - sx = S.x; + sx = S.words(); sxe = sx + --n; - bx = b.x; + bx = b.words(); bxe = bx + n; q = *bxe / (*sxe + 1); /* ensure q <= true quotient */ ASSERT_WITH_MESSAGE(q <= 9, "oversized quotient in quorem"); @@ -1752,18 +1785,18 @@ static ALWAYS_INLINE int quorem(BigInt& b, BigInt& S) #endif } while (sx <= sxe); if (!*bxe) { - bx = b.x; + bx = b.words(); while (--bxe > bx && !*bxe) --n; - b.wds = n; + b.resize(n); } } if (cmp(b, S) >= 0) { q++; borrow = 0; carry = 0; - bx = b.x; - sx = S.x; + bx = b.words(); + sx = S.words(); do { #ifdef USE_LONG_LONG ys = *sx++ + carry; @@ -1791,12 +1824,12 @@ static ALWAYS_INLINE int quorem(BigInt& b, BigInt& S) #endif #endif } while (sx <= sxe); - bx = b.x; + bx = b.words(); bxe = bx + n; if (!*bxe) { while (--bxe > bx && !*bxe) --n; - b.wds = n; + b.resize(n); } } return q; @@ -2027,7 +2060,8 @@ void dtoa(char* result, double dd, int ndigits, int* decpt, int* sign, char** rv dval(&eps) = (ieps * dval(&u)) + 7.; word0(&eps) -= (P - 1) * Exp_msk1; if (ilim == 0) { - S = mhi = BigInt(); + S.clear(); + mhi.clear(); dval(&u) -= 5.; if (dval(&u) > dval(&eps)) goto one_digit; @@ -2090,7 +2124,8 @@ fast_failed: /* Yes. */ ds = tens[k]; if (ndigits < 0 && ilim <= 0) { - S = mhi = BigInt(); + S.clear(); + mhi.clear(); if (ilim < 0 || dval(&u) <= 5 * ds) goto no_digits; goto one_digit; @@ -2132,7 +2167,8 @@ bump_up: m2 = b2; m5 = b5; - mhi = mlo = BigInt(); + mhi.clear(); + mlo.clear(); if (leftright) { i = #ifndef Sudden_Underflow @@ -2186,10 +2222,10 @@ bump_up: * can do shifts and ors to compute the numerator for q. */ #ifdef Pack_32 - if ((i = ((s5 ? 32 - hi0bits(S.x[S.wds - 1]) : 1) + s2) & 0x1f)) + if ((i = ((s5 ? 32 - hi0bits(S.words()[S.size() - 1]) : 1) + s2) & 0x1f)) i = 32 - i; #else - if ((i = ((s5 ? 32 - hi0bits(S.x[S.wds - 1]) : 1) + s2) & 0xf)) + if ((i = ((s5 ? 32 - hi0bits(S.words()[S.size() - 1]) : 1) + s2) & 0xf)) i = 16 - i; #endif if (i > 4) { @@ -2252,7 +2288,7 @@ bump_up: goto ret; } if (j < 0 || (j == 0 && !(word1(&u) & 1))) { - if (!b.x[0] && b.wds <= 1) { + if (!b.words()[0] && b.size() <= 1) { #ifdef SET_INEXACT inexact = 0; #endif @@ -2287,7 +2323,7 @@ round_9_up: } else for (i = 1;; i++) { *s++ = dig = quorem(b,S) + '0'; - if (!b.x[0] && b.wds <= 1) { + if (!b.words()[0] && b.size() <= 1) { #ifdef SET_INEXACT inexact = 0; #endif diff --git a/JavaScriptCore/wtf/haiku/MainThreadHaiku.cpp b/JavaScriptCore/wtf/haiku/MainThreadHaiku.cpp new file mode 100644 index 0000000..4fd7b35 --- /dev/null +++ b/JavaScriptCore/wtf/haiku/MainThreadHaiku.cpp @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2007 Kevin Ollivier + * Copyright (C) 2009 Maxime Simon + * + * 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. + * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "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 OR ITS 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. + */ + +#include "config.h" +#include "MainThread.h" + + +namespace WTF { + +void initializeMainThreadPlatform() +{ + notImplemented(); +} + +void scheduleDispatchFunctionsOnMainThread() +{ + notImplemented(); +} + +} // namespace WTF + diff --git a/JavaScriptCore/wtf/unicode/Collator.h b/JavaScriptCore/wtf/unicode/Collator.h index f04779d..51e8a06 100644 --- a/JavaScriptCore/wtf/unicode/Collator.h +++ b/JavaScriptCore/wtf/unicode/Collator.h @@ -39,7 +39,7 @@ struct UCollator; namespace WTF { - class Collator : Noncopyable { + class Collator : public Noncopyable { public: enum Result { Equal = 0, Greater = 1, Less = -1 }; diff --git a/JavaScriptCore/wtf/unicode/Unicode.h b/JavaScriptCore/wtf/unicode/Unicode.h index f86a9b7..d59439d 100644 --- a/JavaScriptCore/wtf/unicode/Unicode.h +++ b/JavaScriptCore/wtf/unicode/Unicode.h @@ -1,6 +1,7 @@ /* * Copyright (C) 2006 George Staikos <staikos@kde.org> * Copyright (C) 2006, 2008, 2009 Apple Inc. All rights reserved. + * Copyright (C) 2007-2009 Torch Mobile, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -30,6 +31,8 @@ #include <wtf/unicode/icu/UnicodeIcu.h> #elif USE(GLIB_UNICODE) #include <wtf/unicode/glib/UnicodeGLib.h> +#elif USE(WINCE_UNICODE) +#include <wtf/unicode/wince/UnicodeWince.h> #else #error "Unknown Unicode implementation" #endif diff --git a/JavaScriptCore/wtf/unicode/icu/CollatorICU.cpp b/JavaScriptCore/wtf/unicode/icu/CollatorICU.cpp index 79dec79..6376bb3 100644 --- a/JavaScriptCore/wtf/unicode/icu/CollatorICU.cpp +++ b/JavaScriptCore/wtf/unicode/icu/CollatorICU.cpp @@ -37,6 +37,7 @@ #include <string.h> #if PLATFORM(DARWIN) +#include "RetainPtr.h" #include <CoreFoundation/CoreFoundation.h> #endif @@ -60,11 +61,16 @@ std::auto_ptr<Collator> Collator::userDefault() { #if PLATFORM(DARWIN) && PLATFORM(CF) // Mac OS X doesn't set UNIX locale to match user-selected one, so ICU default doesn't work. - CFStringRef collationOrder = (CFStringRef)CFPreferencesCopyValue(CFSTR("AppleCollationOrder"), kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); +#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) && !PLATFORM(IPHONE) + RetainPtr<CFLocaleRef> currentLocale(AdoptCF, CFLocaleCopyCurrent()); + CFStringRef collationOrder = (CFStringRef)CFLocaleGetValue(currentLocale.get(), kCFLocaleCollatorIdentifier); +#else + RetainPtr<CFStringRef> collationOrderRetainer(AdoptCF, (CFStringRef)CFPreferencesCopyValue(CFSTR("AppleCollationOrder"), kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, kCFPreferencesAnyHost)); + CFStringRef collationOrder = collationOrderRetainer.get(); +#endif char buf[256]; if (collationOrder) { CFStringGetCString(collationOrder, buf, sizeof(buf), kCFStringEncodingASCII); - CFRelease(collationOrder); return std::auto_ptr<Collator>(new Collator(buf)); } else return std::auto_ptr<Collator>(new Collator("")); diff --git a/JavaScriptCore/wtf/unicode/wince/UnicodeWince.cpp b/JavaScriptCore/wtf/unicode/wince/UnicodeWince.cpp new file mode 100644 index 0000000..966f2a1 --- /dev/null +++ b/JavaScriptCore/wtf/unicode/wince/UnicodeWince.cpp @@ -0,0 +1,175 @@ +/* + * Copyright (C) 2006 George Staikos <staikos@kde.org> + * Copyright (C) 2006 Alexey Proskuryakov <ap@nypop.com> + * Copyright (C) 2007-2009 Torch Mobile, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "UnicodeWince.h" + +#include <wchar.h> + +namespace WTF { +namespace Unicode { + +wchar_t toLower(wchar_t c) +{ + return towlower(c); +} + +wchar_t toUpper(wchar_t c) +{ + return towupper(c); +} + +wchar_t foldCase(wchar_t c) +{ + return towlower(c); +} + +bool isPrintableChar(wchar_t c) +{ + return !!iswprint(c); +} + +bool isSpace(wchar_t c) +{ + return !!iswspace(c); +} + +bool isLetter(wchar_t c) +{ + return !!iswalpha(c); +} + +bool isUpper(wchar_t c) +{ + return !!iswupper(c); +} + +bool isLower(wchar_t c) +{ + return !!iswlower(c); +} + +bool isDigit(wchar_t c) +{ + return !!iswdigit(c); +} + +bool isPunct(wchar_t c) +{ + return !!iswpunct(c); +} + +int toLower(wchar_t* result, int resultLength, const wchar_t* source, int sourceLength, bool* isError) +{ + const UChar* sourceIterator = source; + const UChar* sourceEnd = source + sourceLength; + UChar* resultIterator = result; + UChar* resultEnd = result + resultLength; + + int remainingCharacters = 0; + if (sourceLength <= resultLength) + while (sourceIterator < sourceEnd) + *resultIterator++ = towlower(*sourceIterator++); + else + while (resultIterator < resultEnd) + *resultIterator++ = towlower(*sourceIterator++); + + if (sourceIterator < sourceEnd) + remainingCharacters += sourceEnd - sourceIterator; + *isError = (remainingCharacters != 0); + if (resultIterator < resultEnd) + *resultIterator = 0; + + return (resultIterator - result) + remainingCharacters; +} + +int toUpper(wchar_t* result, int resultLength, const wchar_t* source, int sourceLength, bool* isError) +{ + const UChar* sourceIterator = source; + const UChar* sourceEnd = source + sourceLength; + UChar* resultIterator = result; + UChar* resultEnd = result + resultLength; + + int remainingCharacters = 0; + if (sourceLength <= resultLength) + while (sourceIterator < sourceEnd) + *resultIterator++ = towupper(*sourceIterator++); + else + while (resultIterator < resultEnd) + *resultIterator++ = towupper(*sourceIterator++); + + if (sourceIterator < sourceEnd) + remainingCharacters += sourceEnd - sourceIterator; + *isError = (remainingCharacters != 0); + if (resultIterator < resultEnd) + *resultIterator = 0; + + return (resultIterator - result) + remainingCharacters; +} + +int foldCase(wchar_t* result, int resultLength, const wchar_t* source, int sourceLength, bool* isError) +{ + *isError = false; + if (resultLength < sourceLength) { + *isError = true; + return sourceLength; + } + for (int i = 0; i < sourceLength; ++i) + result[i] = foldCase(source[i]); + return sourceLength; +} + +wchar_t toTitleCase(wchar_t c) +{ + return towupper(c); +} + +Direction direction(UChar32 c) +{ + return static_cast<Direction>(UnicodeCE::direction(c)); +} + +CharCategory category(unsigned int c) +{ + return static_cast<CharCategory>(TO_MASK((__int8) UnicodeCE::category(c))); +} + +DecompositionType decompositionType(UChar32 c) +{ + return static_cast<DecompositionType>(UnicodeCE::decompositionType(c)); +} + +unsigned char combiningClass(UChar32 c) +{ + return UnicodeCE::combiningClass(c); +} + +wchar_t mirroredChar(UChar32 c) +{ + return UnicodeCE::mirroredChar(c); +} + +int digitValue(wchar_t c) +{ + return UnicodeCE::digitValue(c); +} + +} // namespace Unicode +} // namespace WTF diff --git a/JavaScriptCore/wtf/unicode/wince/UnicodeWince.h b/JavaScriptCore/wtf/unicode/wince/UnicodeWince.h new file mode 100644 index 0000000..db656ec --- /dev/null +++ b/JavaScriptCore/wtf/unicode/wince/UnicodeWince.h @@ -0,0 +1,216 @@ +/* + * Copyright (C) 2006 George Staikos <staikos@kde.org> + * Copyright (C) 2006 Alexey Proskuryakov <ap@nypop.com> + * Copyright (C) 2007 Apple Computer, Inc. All rights reserved. + * Copyright (C) 2007-2009 Torch Mobile, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#ifndef UNICODE_WINCE_H +#define UNICODE_WINCE_H + +#include "ce_unicode.h" + +#define TO_MASK(x) (1 << (x)) + +// some defines from ICU needed one or two places + +#define U16_IS_LEAD(c) (((c) & 0xfffffc00) == 0xd800) +#define U16_IS_TRAIL(c) (((c) & 0xfffffc00) == 0xdc00) +#define U16_SURROGATE_OFFSET ((0xd800 << 10UL) + 0xdc00 - 0x10000) +#define U16_GET_SUPPLEMENTARY(lead, trail) \ + (((UChar32)(lead) << 10UL) + (UChar32)(trail) - U16_SURROGATE_OFFSET) + +#define U16_LEAD(supplementary) (UChar)(((supplementary) >> 10) + 0xd7c0) +#define U16_TRAIL(supplementary) (UChar)(((supplementary) & 0x3ff) | 0xdc00) + +#define U_IS_SURROGATE(c) (((c) & 0xfffff800) == 0xd800) +#define U16_IS_SURROGATE(c) U_IS_SURROGATE(c) +#define U16_IS_SURROGATE_LEAD(c) (((c) & 0x400) == 0) + +#define U16_NEXT(s, i, length, c) { \ + (c)=(s)[(i)++]; \ + if (U16_IS_LEAD(c)) { \ + uint16_t __c2; \ + if ((i) < (length) && U16_IS_TRAIL(__c2 = (s)[(i)])) { \ + ++(i); \ + (c) = U16_GET_SUPPLEMENTARY((c), __c2); \ + } \ + } \ +} + +#define U16_PREV(s, start, i, c) { \ + (c)=(s)[--(i)]; \ + if (U16_IS_TRAIL(c)) { \ + uint16_t __c2; \ + if ((i) > (start) && U16_IS_LEAD(__c2 = (s)[(i) - 1])) { \ + --(i); \ + (c) = U16_GET_SUPPLEMENTARY(__c2, (c)); \ + } \ + } \ +} + +#define U16_IS_SINGLE(c) !U_IS_SURROGATE(c) + +namespace WTF { + + namespace Unicode { + + enum Direction { + LeftToRight = UnicodeCE::U_LEFT_TO_RIGHT, + RightToLeft = UnicodeCE::U_RIGHT_TO_LEFT, + EuropeanNumber = UnicodeCE::U_EUROPEAN_NUMBER, + EuropeanNumberSeparator = UnicodeCE::U_EUROPEAN_NUMBER_SEPARATOR, + EuropeanNumberTerminator = UnicodeCE::U_EUROPEAN_NUMBER_TERMINATOR, + ArabicNumber = UnicodeCE::U_ARABIC_NUMBER, + CommonNumberSeparator = UnicodeCE::U_COMMON_NUMBER_SEPARATOR, + BlockSeparator = UnicodeCE::U_BLOCK_SEPARATOR, + SegmentSeparator = UnicodeCE::U_SEGMENT_SEPARATOR, + WhiteSpaceNeutral = UnicodeCE::U_WHITE_SPACE_NEUTRAL, + OtherNeutral = UnicodeCE::U_OTHER_NEUTRAL, + LeftToRightEmbedding = UnicodeCE::U_LEFT_TO_RIGHT_EMBEDDING, + LeftToRightOverride = UnicodeCE::U_LEFT_TO_RIGHT_OVERRIDE, + RightToLeftArabic = UnicodeCE::U_RIGHT_TO_LEFT_ARABIC, + RightToLeftEmbedding = UnicodeCE::U_RIGHT_TO_LEFT_EMBEDDING, + RightToLeftOverride = UnicodeCE::U_RIGHT_TO_LEFT_OVERRIDE, + PopDirectionalFormat = UnicodeCE::U_POP_DIRECTIONAL_FORMAT, + NonSpacingMark = UnicodeCE::U_DIR_NON_SPACING_MARK, + BoundaryNeutral = UnicodeCE::U_BOUNDARY_NEUTRAL + }; + + enum DecompositionType { + DecompositionNone = UnicodeCE::U_DT_NONE, + DecompositionCanonical = UnicodeCE::U_DT_CANONICAL, + DecompositionCompat = UnicodeCE::U_DT_COMPAT, + DecompositionCircle = UnicodeCE::U_DT_CIRCLE, + DecompositionFinal = UnicodeCE::U_DT_FINAL, + DecompositionFont = UnicodeCE::U_DT_FONT, + DecompositionFraction = UnicodeCE::U_DT_FRACTION, + DecompositionInitial = UnicodeCE::U_DT_INITIAL, + DecompositionIsolated = UnicodeCE::U_DT_ISOLATED, + DecompositionMedial = UnicodeCE::U_DT_MEDIAL, + DecompositionNarrow = UnicodeCE::U_DT_NARROW, + DecompositionNoBreak = UnicodeCE::U_DT_NOBREAK, + DecompositionSmall = UnicodeCE::U_DT_SMALL, + DecompositionSquare = UnicodeCE::U_DT_SQUARE, + DecompositionSub = UnicodeCE::U_DT_SUB, + DecompositionSuper = UnicodeCE::U_DT_SUPER, + DecompositionVertical = UnicodeCE::U_DT_VERTICAL, + DecompositionWide = UnicodeCE::U_DT_WIDE, + }; + + enum CharCategory { + NoCategory = 0, + Other_NotAssigned = TO_MASK(UnicodeCE::U_GENERAL_OTHER_TYPES), + Letter_Uppercase = TO_MASK(UnicodeCE::U_UPPERCASE_LETTER), + Letter_Lowercase = TO_MASK(UnicodeCE::U_LOWERCASE_LETTER), + Letter_Titlecase = TO_MASK(UnicodeCE::U_TITLECASE_LETTER), + Letter_Modifier = TO_MASK(UnicodeCE::U_MODIFIER_LETTER), + Letter_Other = TO_MASK(UnicodeCE::U_OTHER_LETTER), + + Mark_NonSpacing = TO_MASK(UnicodeCE::U_NON_SPACING_MARK), + Mark_Enclosing = TO_MASK(UnicodeCE::U_ENCLOSING_MARK), + Mark_SpacingCombining = TO_MASK(UnicodeCE::U_COMBINING_SPACING_MARK), + + Number_DecimalDigit = TO_MASK(UnicodeCE::U_DECIMAL_DIGIT_NUMBER), + Number_Letter = TO_MASK(UnicodeCE::U_LETTER_NUMBER), + Number_Other = TO_MASK(UnicodeCE::U_OTHER_NUMBER), + + Separator_Space = TO_MASK(UnicodeCE::U_SPACE_SEPARATOR), + Separator_Line = TO_MASK(UnicodeCE::U_LINE_SEPARATOR), + Separator_Paragraph = TO_MASK(UnicodeCE::U_PARAGRAPH_SEPARATOR), + + Other_Control = TO_MASK(UnicodeCE::U_CONTROL_CHAR), + Other_Format = TO_MASK(UnicodeCE::U_FORMAT_CHAR), + Other_PrivateUse = TO_MASK(UnicodeCE::U_PRIVATE_USE_CHAR), + Other_Surrogate = TO_MASK(UnicodeCE::U_SURROGATE), + + Punctuation_Dash = TO_MASK(UnicodeCE::U_DASH_PUNCTUATION), + Punctuation_Open = TO_MASK(UnicodeCE::U_START_PUNCTUATION), + Punctuation_Close = TO_MASK(UnicodeCE::U_END_PUNCTUATION), + Punctuation_Connector = TO_MASK(UnicodeCE::U_CONNECTOR_PUNCTUATION), + Punctuation_Other = TO_MASK(UnicodeCE::U_OTHER_PUNCTUATION), + + Symbol_Math = TO_MASK(UnicodeCE::U_MATH_SYMBOL), + Symbol_Currency = TO_MASK(UnicodeCE::U_CURRENCY_SYMBOL), + Symbol_Modifier = TO_MASK(UnicodeCE::U_MODIFIER_SYMBOL), + Symbol_Other = TO_MASK(UnicodeCE::U_OTHER_SYMBOL), + + Punctuation_InitialQuote = TO_MASK(UnicodeCE::U_INITIAL_PUNCTUATION), + Punctuation_FinalQuote = TO_MASK(UnicodeCE::U_FINAL_PUNCTUATION) + }; + + CharCategory category(unsigned int); + + bool isSpace(wchar_t); + bool isLetter(wchar_t); + bool isPrintableChar(wchar_t); + bool isUpper(wchar_t); + bool isLower(wchar_t); + bool isPunct(wchar_t); + bool isDigit(wchar_t); + inline bool isSeparatorSpace(wchar_t c) { return category(c) == Separator_Space; } + inline bool isHighSurrogate(wchar_t c) { return (c & 0xfc00) == 0xd800; } + inline bool isLowSurrogate(wchar_t c) { return (c & 0xfc00) == 0xdc00; } + + wchar_t toLower(wchar_t); + wchar_t toUpper(wchar_t); + wchar_t foldCase(wchar_t); + wchar_t toTitleCase(wchar_t); + int toLower(wchar_t* result, int resultLength, const wchar_t* source, int sourceLength, bool* isError); + int toUpper(wchar_t* result, int resultLength, const wchar_t* source, int sourceLength, bool* isError); + int foldCase(UChar* result, int resultLength, const wchar_t* source, int sourceLength, bool* isError); + + int digitValue(wchar_t); + + wchar_t mirroredChar(UChar32); + unsigned char combiningClass(UChar32); + DecompositionType decompositionType(UChar32); + Direction direction(UChar32); + inline bool isArabicChar(UChar32) + { + return false; // FIXME: implement! + } + + inline bool hasLineBreakingPropertyComplexContext(UChar32) + { + return false; // FIXME: implement! + } + + inline int umemcasecmp(const wchar_t* a, const wchar_t* b, int len) + { + for (int i = 0; i < len; ++i) { + wchar_t c1 = foldCase(a[i]); + wchar_t c2 = foldCase(b[i]); + if (c1 != c2) + return c1 - c2; + } + return 0; + } + + inline UChar32 surrogateToUcs4(wchar_t high, wchar_t low) + { + return (UChar32(high) << 10) + low - 0x35fdc00; + } + + } // namespace Unicode + +} // namespace WTF + +#endif +// vim: ts=2 sw=2 et diff --git a/JavaScriptCore/wtf/win/MainThreadWin.cpp b/JavaScriptCore/wtf/win/MainThreadWin.cpp index b828b7d..c6dcb7d 100644 --- a/JavaScriptCore/wtf/win/MainThreadWin.cpp +++ b/JavaScriptCore/wtf/win/MainThreadWin.cpp @@ -1,5 +1,6 @@ /* * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -31,7 +32,7 @@ #include "Assertions.h" #include "Threading.h" -#if !PLATFORM(WIN_CE) +#if !PLATFORM(WINCE) #include <windows.h> #endif @@ -55,12 +56,21 @@ void initializeMainThreadPlatform() if (threadingWindowHandle) return; +#if PLATFORM(WINCE) + WNDCLASS wcex; + memset(&wcex, 0, sizeof(WNDCLASS)); +#else WNDCLASSEX wcex; memset(&wcex, 0, sizeof(WNDCLASSEX)); wcex.cbSize = sizeof(WNDCLASSEX); +#endif wcex.lpfnWndProc = ThreadingWindowWndProc; wcex.lpszClassName = kThreadingWindowClassName; +#if PLATFORM(WINCE) + RegisterClass(&wcex); +#else RegisterClassEx(&wcex); +#endif threadingWindowHandle = CreateWindow(kThreadingWindowClassName, 0, 0, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, HWND_MESSAGE, 0, 0, 0); diff --git a/JavaScriptCore/wtf/wince/FastMallocWince.h b/JavaScriptCore/wtf/wince/FastMallocWince.h new file mode 100644 index 0000000..93d9f75 --- /dev/null +++ b/JavaScriptCore/wtf/wince/FastMallocWince.h @@ -0,0 +1,177 @@ +/* + * This file is part of the KDE libraries + * Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2007-2009 Torch Mobile, Inc. All rights reserved + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#ifndef FastMallocWince_h +#define FastMallocWince_h + +#include <new.h> + +#ifdef __cplusplus +#include <new> +#include "MemoryManager.h" +extern "C" { +#endif + +void* fastMalloc(size_t n); +void* fastCalloc(size_t n_elements, size_t element_size); +void fastFree(void* p); +void* fastRealloc(void* p, size_t n); +void* fastZeroedMalloc(size_t n); +// These functions return 0 if an allocation fails. +void* tryFastMalloc(size_t n); +void* tryFastZeroedMalloc(size_t n); +void* tryFastCalloc(size_t n_elements, size_t element_size); +void* tryFastRealloc(void* p, size_t n); +char* fastStrDup(const char*); + +#ifndef NDEBUG +void fastMallocForbid(); +void fastMallocAllow(); +#endif + +#if !defined(USE_SYSTEM_MALLOC) || !USE_SYSTEM_MALLOC + +#define malloc(n) fastMalloc(n) +#define calloc(n_elements, element_size) fastCalloc(n_elements, element_size) +#define realloc(p, n) fastRealloc(p, n) +#define free(p) fastFree(p) +#define strdup(p) fastStrDup(p) + +#else + +#define strdup(p) _strdup(p) + +#endif + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus +#if !defined(USE_SYSTEM_MALLOC) || !USE_SYSTEM_MALLOC +static inline void* __cdecl operator new(size_t s) { return fastMalloc(s); } +static inline void __cdecl operator delete(void* p) { fastFree(p); } +static inline void* __cdecl operator new[](size_t s) { return fastMalloc(s); } +static inline void __cdecl operator delete[](void* p) { fastFree(p); } +static inline void* operator new(size_t s, const std::nothrow_t&) throw() { return fastMalloc(s); } +static inline void operator delete(void* p, const std::nothrow_t&) throw() { fastFree(p); } +static inline void* operator new[](size_t s, const std::nothrow_t&) throw() { return fastMalloc(s); } +static inline void operator delete[](void* p, const std::nothrow_t&) throw() { fastFree(p); } +#endif + +namespace WTF { + // This defines a type which holds an unsigned integer and is the same + // size as the minimally aligned memory allocation. + typedef unsigned long long AllocAlignmentInteger; + + namespace Internal { + enum AllocType { // Start with an unusual number instead of zero, because zero is common. + AllocTypeMalloc = 0x375d6750, // Encompasses fastMalloc, fastZeroedMalloc, fastCalloc, fastRealloc. + AllocTypeClassNew, // Encompasses class operator new from FastAllocBase. + AllocTypeClassNewArray, // Encompasses class operator new[] from FastAllocBase. + AllocTypeFastNew, // Encompasses fastNew. + AllocTypeFastNewArray, // Encompasses fastNewArray. + AllocTypeNew, // Encompasses global operator new. + AllocTypeNewArray // Encompasses global operator new[]. + }; + } + + +#if ENABLE(FAST_MALLOC_MATCH_VALIDATION) + + // Malloc validation is a scheme whereby a tag is attached to an + // allocation which identifies how it was originally allocated. + // This allows us to verify that the freeing operation matches the + // allocation operation. If memory is allocated with operator new[] + // but freed with free or delete, this system would detect that. + // In the implementation here, the tag is an integer prepended to + // the allocation memory which is assigned one of the AllocType + // enumeration values. An alternative implementation of this + // scheme could store the tag somewhere else or ignore it. + // Users of FastMalloc don't need to know or care how this tagging + // is implemented. + + namespace Internal { + + // Return the AllocType tag associated with the allocated block p. + inline AllocType fastMallocMatchValidationType(const void* p) + { + const AllocAlignmentInteger* type = static_cast<const AllocAlignmentInteger*>(p) - 1; + return static_cast<AllocType>(*type); + } + + // Return the address of the AllocType tag associated with the allocated block p. + inline AllocAlignmentInteger* fastMallocMatchValidationValue(void* p) + { + return reinterpret_cast<AllocAlignmentInteger*>(static_cast<char*>(p) - sizeof(AllocAlignmentInteger)); + } + + // Set the AllocType tag to be associaged with the allocated block p. + inline void setFastMallocMatchValidationType(void* p, AllocType allocType) + { + AllocAlignmentInteger* type = static_cast<AllocAlignmentInteger*>(p) - 1; + *type = static_cast<AllocAlignmentInteger>(allocType); + } + + // Handle a detected alloc/free mismatch. By default this calls CRASH(). + void fastMallocMatchFailed(void* p); + + } // namespace Internal + + // This is a higher level function which is used by FastMalloc-using code. + inline void fastMallocMatchValidateMalloc(void* p, Internal::AllocType allocType) + { + if (!p) + return; + + Internal::setFastMallocMatchValidationType(p, allocType); + } + + // This is a higher level function which is used by FastMalloc-using code. + inline void fastMallocMatchValidateFree(void* p, Internal::AllocType allocType) + { + if (!p) + return; + + if (Internal::fastMallocMatchValidationType(p) != allocType) + Internal::fastMallocMatchFailed(p); + Internal::setFastMallocMatchValidationType(p, Internal::AllocTypeMalloc); // Set it to this so that fastFree thinks it's OK. + } + +#else + + inline void fastMallocMatchValidateMalloc(void*, Internal::AllocType) + { + } + + inline void fastMallocMatchValidateFree(void*, Internal::AllocType) + { + } + +#endif + +} // namespace WTF + +#endif + +#endif // FastMallocWince_h + diff --git a/JavaScriptCore/wtf/wince/MemoryManager.cpp b/JavaScriptCore/wtf/wince/MemoryManager.cpp new file mode 100644 index 0000000..b65b368 --- /dev/null +++ b/JavaScriptCore/wtf/wince/MemoryManager.cpp @@ -0,0 +1,171 @@ +/* + * Copyright (C) 2008-2009 Torch Mobile Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "config.h" +#include "MemoryManager.h" + +#undef malloc +#undef calloc +#undef realloc +#undef free +#undef strdup +#undef _strdup +#undef VirtualAlloc +#undef VirtualFree + +#include <malloc.h> +#include <windows.h> + +namespace WTF { + +MemoryManager* memoryManager() +{ + static MemoryManager mm; + return &mm; +} + +MemoryManager::MemoryManager() +: m_allocationCanFail(false) +{ +} + +MemoryManager::~MemoryManager() +{ +} + +HBITMAP MemoryManager::createCompatibleBitmap(HDC hdc, int width, int height) +{ + return ::CreateCompatibleBitmap(hdc, width, height); +} + +HBITMAP MemoryManager::createDIBSection(const BITMAPINFO* pbmi, void** ppvBits) +{ + return ::CreateDIBSection(0, pbmi, DIB_RGB_COLORS, ppvBits, 0, 0); +} + +void* MemoryManager::m_malloc(size_t size) +{ + return malloc(size); +} + +void* MemoryManager::m_calloc(size_t num, size_t size) +{ + return calloc(num, size); +} + +void* MemoryManager::m_realloc(void* p, size_t size) +{ + return realloc(p, size); +} + +void MemoryManager::m_free(void* p) +{ + return free(p); +} + +bool MemoryManager::resizeMemory(void*, size_t) +{ + return false; +} + +void* MemoryManager::allocate64kBlock() +{ + return VirtualAlloc(0, 65536, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); +} + +void MemoryManager::free64kBlock(void* p) +{ + VirtualFree(p, 65536, MEM_RELEASE); +} + +bool MemoryManager::onIdle(DWORD& timeLimitMs) +{ + return false; +} + +LPVOID MemoryManager::virtualAlloc(LPVOID lpAddress, DWORD dwSize, DWORD flAllocationType, DWORD flProtect) +{ + return ::VirtualAlloc(lpAddress, dwSize, flAllocationType, flProtect); +} + +BOOL MemoryManager::virtualFree(LPVOID lpAddress, DWORD dwSize, DWORD dwFreeType) +{ + return ::VirtualFree(lpAddress, dwSize, dwFreeType); +} + + +#if defined(USE_SYSTEM_MALLOC) && USE_SYSTEM_MALLOC + +void *fastMalloc(size_t n) { return malloc(n); } +void *fastCalloc(size_t n_elements, size_t element_size) { return calloc(n_elements, element_size); } +void fastFree(void* p) { return free(p); } +void *fastRealloc(void* p, size_t n) { return realloc(p, n); } + +#else + +void *fastMalloc(size_t n) { return MemoryManager::m_malloc(n); } +void *fastCalloc(size_t n_elements, size_t element_size) { return MemoryManager::m_calloc(n_elements, element_size); } +void fastFree(void* p) { return MemoryManager::m_free(p); } +void *fastRealloc(void* p, size_t n) { return MemoryManager::m_realloc(p, n); } + +#endif + +#ifndef NDEBUG +void fastMallocForbid() {} +void fastMallocAllow() {} +#endif + +void* fastZeroedMalloc(size_t n) +{ + void* p = fastMalloc(n); + if (p) + memset(p, 0, n); + return p; +} + +void* tryFastMalloc(size_t n) +{ + MemoryAllocationCanFail canFail; + return fastMalloc(n); +} + +void* tryFastZeroedMalloc(size_t n) +{ + MemoryAllocationCanFail canFail; + return fastZeroedMalloc(n); +} + +void* tryFastCalloc(size_t n_elements, size_t element_size) +{ + MemoryAllocationCanFail canFail; + return fastCalloc(n_elements, element_size); +} + +void* tryFastRealloc(void* p, size_t n) +{ + MemoryAllocationCanFail canFail; + return fastRealloc(p, n); +} + +char* fastStrDup(const char* str) +{ + return _strdup(str); +} + +}
\ No newline at end of file diff --git a/JavaScriptCore/wtf/wince/MemoryManager.h b/JavaScriptCore/wtf/wince/MemoryManager.h new file mode 100644 index 0000000..f405612 --- /dev/null +++ b/JavaScriptCore/wtf/wince/MemoryManager.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2008-2009 Torch Mobile Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include <winbase.h> + +typedef struct HBITMAP__* HBITMAP; +typedef struct HDC__* HDC; +typedef void *HANDLE; +typedef struct tagBITMAPINFO BITMAPINFO; + +namespace WTF { + + class MemoryManager { + public: + MemoryManager(); + ~MemoryManager(); + + bool allocationCanFail() const { return m_allocationCanFail; } + void setAllocationCanFail(bool c) { m_allocationCanFail = c; } + + static HBITMAP createCompatibleBitmap(HDC hdc, int width, int height); + static HBITMAP createDIBSection(const BITMAPINFO* pbmi, void** ppvBits); + static void* m_malloc(size_t size); + static void* m_calloc(size_t num, size_t size); + static void* m_realloc(void* p, size_t size); + static void m_free(void*); + static bool resizeMemory(void* p, size_t newSize); + static void* allocate64kBlock(); + static void free64kBlock(void*); + static bool onIdle(DWORD& timeLimitMs); + static LPVOID virtualAlloc(LPVOID lpAddress, DWORD dwSize, DWORD flAllocationType, DWORD flProtect); + static BOOL virtualFree(LPVOID lpAddress, DWORD dwSize, DWORD dwFreeType); + + private: + friend MemoryManager* memoryManager(); + + bool m_allocationCanFail; + }; + + MemoryManager* memoryManager(); + + class MemoryAllocationCanFail { + public: + MemoryAllocationCanFail() : m_old(memoryManager()->allocationCanFail()) { memoryManager()->setAllocationCanFail(true); } + ~MemoryAllocationCanFail() { memoryManager()->setAllocationCanFail(m_old); } + private: + bool m_old; + }; + + class MemoryAllocationCannotFail { + public: + MemoryAllocationCannotFail() : m_old(memoryManager()->allocationCanFail()) { memoryManager()->setAllocationCanFail(false); } + ~MemoryAllocationCannotFail() { memoryManager()->setAllocationCanFail(m_old); } + private: + bool m_old; + }; +} + +using WTF::MemoryManager; +using WTF::memoryManager; +using WTF::MemoryAllocationCanFail; +using WTF::MemoryAllocationCannotFail; diff --git a/JavaScriptCore/wtf/wince/mt19937ar.c b/JavaScriptCore/wtf/wince/mt19937ar.c new file mode 100644 index 0000000..4715958 --- /dev/null +++ b/JavaScriptCore/wtf/wince/mt19937ar.c @@ -0,0 +1,170 @@ +/* + A C-program for MT19937, with initialization improved 2002/1/26. + Coded by Takuji Nishimura and Makoto Matsumoto. + + Before using, initialize the state by using init_genrand(seed) + or init_by_array(init_key, key_length). + + Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, + 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. + + 3. The names of its contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "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 THE COPYRIGHT OWNER 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. + + + Any feedback is very welcome. + http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html + email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space) +*/ + +#include <stdio.h> + +/* Period parameters */ +#define N 624 +#define M 397 +#define MATRIX_A 0x9908b0dfUL /* constant vector a */ +#define UPPER_MASK 0x80000000UL /* most significant w-r bits */ +#define LOWER_MASK 0x7fffffffUL /* least significant r bits */ + +static unsigned long mt[N]; /* the array for the state vector */ +static int mti=N+1; /* mti==N+1 means mt[N] is not initialized */ + +/* initializes mt[N] with a seed */ +void init_genrand(unsigned long s) +{ + mt[0]= s & 0xffffffffUL; + for (mti=1; mti<N; mti++) { + mt[mti] = (1812433253UL * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti); + /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ + /* In the previous versions, MSBs of the seed affect */ + /* only MSBs of the array mt[]. */ + /* 2002/01/09 modified by Makoto Matsumoto */ + mt[mti] &= 0xffffffffUL; + /* for >32 bit machines */ + } +} + +/* initialize by an array with array-length */ +/* init_key is the array for initializing keys */ +/* key_length is its length */ +/* slight change for C++, 2004/2/26 */ +void init_by_array(unsigned long init_key[],int key_length) +{ + int i, j, k; + init_genrand(19650218UL); + i=1; j=0; + k = (N>key_length ? N : key_length); + for (; k; k--) { + mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525UL)) + + init_key[j] + j; /* non linear */ + mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ + i++; j++; + if (i>=N) { mt[0] = mt[N-1]; i=1; } + if (j>=key_length) j=0; + } + for (k=N-1; k; k--) { + mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1566083941UL)) + - i; /* non linear */ + mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ + i++; + if (i>=N) { mt[0] = mt[N-1]; i=1; } + } + + mt[0] = 0x80000000UL; /* MSB is 1; assuring non-zero initial array */ +} + +/* generates a random number on [0,0xffffffff]-interval */ +unsigned long genrand_int32(void) +{ + unsigned long y; + static unsigned long mag01[2]={0x0UL, MATRIX_A}; + /* mag01[x] = x * MATRIX_A for x=0,1 */ + + if (mti >= N) { /* generate N words at one time */ + int kk; + + if (mti == N+1) /* if init_genrand() has not been called, */ + init_genrand(5489UL); /* a default initial seed is used */ + + for (kk=0;kk<N-M;kk++) { + y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK); + mt[kk] = mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1UL]; + } + for (;kk<N-1;kk++) { + y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK); + mt[kk] = mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1UL]; + } + y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK); + mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1UL]; + + mti = 0; + } + + y = mt[mti++]; + + /* Tempering */ + y ^= (y >> 11); + y ^= (y << 7) & 0x9d2c5680UL; + y ^= (y << 15) & 0xefc60000UL; + y ^= (y >> 18); + + return y; +} + +/* generates a random number on [0,0x7fffffff]-interval */ +long genrand_int31(void) +{ + return (long)(genrand_int32()>>1); +} + +/* generates a random number on [0,1]-real-interval */ +double genrand_real1(void) +{ + return genrand_int32()*(1.0/4294967295.0); + /* divided by 2^32-1 */ +} + +/* generates a random number on [0,1)-real-interval */ +double genrand_real2(void) +{ + return genrand_int32()*(1.0/4294967296.0); + /* divided by 2^32 */ +} + +/* generates a random number on (0,1)-real-interval */ +double genrand_real3(void) +{ + return (((double)genrand_int32()) + 0.5)*(1.0/4294967296.0); + /* divided by 2^32 */ +} + +/* generates a random number on [0,1) with 53-bit resolution*/ +double genrand_res53(void) +{ + unsigned long a=genrand_int32()>>5, b=genrand_int32()>>6; + return(a*67108864.0+b)*(1.0/9007199254740992.0); +} diff --git a/JavaScriptCore/yarr/RegexJIT.cpp b/JavaScriptCore/yarr/RegexJIT.cpp index 84b8254..663a524 100644 --- a/JavaScriptCore/yarr/RegexJIT.cpp +++ b/JavaScriptCore/yarr/RegexJIT.cpp @@ -28,6 +28,7 @@ #include "ASCIICType.h" #include "JSGlobalData.h" +#include "LinkBuffer.h" #include "MacroAssembler.h" #include "RegexCompiler.h" @@ -43,18 +44,17 @@ namespace JSC { namespace Yarr { class RegexGenerator : private MacroAssembler { friend void jitCompileRegex(JSGlobalData* globalData, RegexCodeBlock& jitObject, const UString& pattern, unsigned& numSubpatterns, const char*& error, bool ignoreCase, bool multiline); -#if PLATFORM(ARM_V7) +#if PLATFORM(ARM) static const RegisterID input = ARM::r0; static const RegisterID index = ARM::r1; static const RegisterID length = ARM::r2; - static const RegisterID output = ARM::r4; + static const RegisterID regT0 = ARM::r5; static const RegisterID regT1 = ARM::r6; static const RegisterID returnRegister = ARM::r0; -#endif -#if PLATFORM(X86) +#elif PLATFORM(X86) static const RegisterID input = X86::eax; static const RegisterID index = X86::edx; static const RegisterID length = X86::ecx; @@ -64,8 +64,7 @@ class RegexGenerator : private MacroAssembler { static const RegisterID regT1 = X86::esi; static const RegisterID returnRegister = X86::eax; -#endif -#if PLATFORM(X86_64) +#elif PLATFORM(X86_64) static const RegisterID input = X86::edi; static const RegisterID index = X86::esi; static const RegisterID length = X86::edx; @@ -1292,6 +1291,7 @@ class RegexGenerator : private MacroAssembler { #if PLATFORM(X86_64) push(X86::ebp); move(stackPointerRegister, X86::ebp); + push(X86::ebx); #elif PLATFORM(X86) push(X86::ebp); move(stackPointerRegister, X86::ebp); @@ -1308,7 +1308,10 @@ class RegexGenerator : private MacroAssembler { #else loadPtr(Address(X86::ebp, 2 * sizeof(void*)), output); #endif -#elif PLATFORM(ARM_V7) +#elif PLATFORM(ARM) +#if !PLATFORM_ARM_ARCH(7) + push(ARM::lr); +#endif push(ARM::r4); push(ARM::r5); push(ARM::r6); @@ -1319,13 +1322,14 @@ class RegexGenerator : private MacroAssembler { void generateReturn() { #if PLATFORM(X86_64) + pop(X86::ebx); pop(X86::ebp); #elif PLATFORM(X86) pop(X86::esi); pop(X86::edi); pop(X86::ebx); pop(X86::ebp); -#elif PLATFORM(ARM_V7) +#elif PLATFORM(ARM) pop(ARM::r6); pop(ARM::r5); pop(ARM::r4); @@ -1358,7 +1362,7 @@ public: { generate(); - PatchBuffer patchBuffer(this, globalData->executableAllocator.poolForSize(size())); + LinkBuffer patchBuffer(this, globalData->executableAllocator.poolForSize(size())); for (unsigned i = 0; i < m_backtrackRecords.size(); ++i) patchBuffer.patch(m_backtrackRecords[i].dataLabel, patchBuffer.locationOf(m_backtrackRecords[i].backtrackLocation)); diff --git a/JavaScriptCore/yarr/RegexPattern.h b/JavaScriptCore/yarr/RegexPattern.h index fb1b0ab..a451131 100644 --- a/JavaScriptCore/yarr/RegexPattern.h +++ b/JavaScriptCore/yarr/RegexPattern.h @@ -57,7 +57,7 @@ struct CharacterRange { } }; -struct CharacterClass { +struct CharacterClass : FastAllocBase { Vector<UChar> m_matches; Vector<CharacterRange> m_ranges; Vector<UChar> m_matchesUnicode; @@ -181,7 +181,7 @@ struct PatternTerm { } }; -struct PatternAlternative { +struct PatternAlternative : FastAllocBase { PatternAlternative(PatternDisjunction* disjunction) : m_parent(disjunction) { @@ -205,7 +205,7 @@ struct PatternAlternative { bool m_hasFixedSize; }; -struct PatternDisjunction { +struct PatternDisjunction : FastAllocBase { PatternDisjunction(PatternAlternative* parent = 0) : m_parent(parent) { |