From: Apple Date: Tue, 11 Oct 2011 18:14:29 +0000 (+0000) Subject: JavaScriptCore-903.tar.gz X-Git-Tag: ios-50^0 X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/commitdiff_plain/14957cd040308e3eeec43d26bae5d76da13fcd85 JavaScriptCore-903.tar.gz --- diff --git a/API/APICast.h b/API/APICast.h index ba00d02..4294d3d 100644 --- a/API/APICast.h +++ b/API/APICast.h @@ -111,8 +111,8 @@ inline JSValueRef toRef(JSC::ExecState* exec, JSC::JSValue v) if (!v) return 0; if (!v.isCell()) - return reinterpret_cast(asCell(JSC::jsAPIValueWrapper(exec, v))); - return reinterpret_cast(asCell(v)); + return reinterpret_cast(JSC::jsAPIValueWrapper(exec, v).asCell()); + return reinterpret_cast(v.asCell()); #else UNUSED_PARAM(exec); return reinterpret_cast(JSC::JSValue::encode(v)); diff --git a/API/APIShims.h b/API/APIShims.h index 892068d..2e13851 100644 --- a/API/APIShims.h +++ b/API/APIShims.h @@ -27,6 +27,7 @@ #define APIShims_h #include "CallFrame.h" +#include "GCActivityCallback.h" #include "JSLock.h" #include @@ -38,8 +39,12 @@ protected: : m_globalData(globalData) , m_entryIdentifierTable(wtfThreadData().setCurrentIdentifierTable(globalData->identifierTable)) { + UNUSED_PARAM(registerThread); +#if ENABLE(JSC_MULTIPLE_THREADS) if (registerThread) - globalData->heap.registerThread(); + globalData->heap.machineThreads().addCurrentThread(); +#endif + m_globalData->heap.activityCallback()->synchronize(); m_globalData->timeoutChecker.start(); } @@ -85,6 +90,7 @@ public: ~APICallbackShim() { + m_globalData->heap.activityCallback()->synchronize(); wtfThreadData().setCurrentIdentifierTable(m_globalData->identifierTable); } diff --git a/API/JSBase.h b/API/JSBase.h index 2e16720..fed54fe 100644 --- a/API/JSBase.h +++ b/API/JSBase.h @@ -63,20 +63,26 @@ typedef const struct OpaqueJSValue* JSValueRef; typedef struct OpaqueJSValue* JSObjectRef; /* JavaScript symbol exports */ +/* These rules should stay the same as in WebKit2/Shared/API/c/WKBase.h */ #undef JS_EXPORT #if defined(JS_NO_EXPORT) - #define JS_EXPORT +#define JS_EXPORT #elif defined(__GNUC__) && !defined(__CC_ARM) && !defined(__ARMCC__) - #define JS_EXPORT __attribute__((visibility("default"))) -#elif defined(WIN32) || defined(_WIN32) || defined(_WIN32_WCE) - #if defined(BUILDING_JavaScriptCore) || defined(BUILDING_WTF) - #define JS_EXPORT __declspec(dllexport) - #else - #define JS_EXPORT __declspec(dllimport) - #endif +#define JS_EXPORT __attribute__((visibility("default"))) +#elif defined(WIN32) || defined(_WIN32) || defined(_WIN32_WCE) || defined(__CC_ARM) || defined(__ARMCC__) +#if defined(BUILDING_JavaScriptCore) || defined(BUILDING_WTF) +#define JS_EXPORT __declspec(dllexport) #else - #define JS_EXPORT +#define JS_EXPORT __declspec(dllimport) +#endif +#else /* !defined(JS_NO_EXPORT) */ +#define JS_EXPORT +#endif /* defined(JS_NO_EXPORT) */ + +/* JS tests uses WTF but has no config.h, so we need to set the export defines here. */ +#ifndef WTF_EXPORT_PRIVATE +#define WTF_EXPORT_PRIVATE JS_EXPORT #endif #ifdef __cplusplus diff --git a/API/JSCallbackConstructor.cpp b/API/JSCallbackConstructor.cpp index 9c5f6d7..fa9d216 100644 --- a/API/JSCallbackConstructor.cpp +++ b/API/JSCallbackConstructor.cpp @@ -28,6 +28,7 @@ #include "APIShims.h" #include "APICast.h" +#include #include #include #include @@ -35,13 +36,14 @@ namespace JSC { -const ClassInfo JSCallbackConstructor::info = { "CallbackConstructor", 0, 0, 0 }; +const ClassInfo JSCallbackConstructor::s_info = { "CallbackConstructor", &JSObjectWithGlobalObject::s_info, 0, 0 }; -JSCallbackConstructor::JSCallbackConstructor(NonNullPassRefPtr structure, JSClassRef jsClass, JSObjectCallAsConstructorCallback callback) - : JSObject(structure) +JSCallbackConstructor::JSCallbackConstructor(JSGlobalObject* globalObject, Structure* structure, JSClassRef jsClass, JSObjectCallAsConstructorCallback callback) + : JSObjectWithGlobalObject(globalObject, structure) , m_class(jsClass) , m_callback(callback) { + ASSERT(inherits(&s_info)); if (m_class) JSClassRetain(jsClass); } @@ -52,17 +54,18 @@ JSCallbackConstructor::~JSCallbackConstructor() JSClassRelease(m_class); } -static JSObject* constructJSCallback(ExecState* exec, JSObject* constructor, const ArgList& args) +static EncodedJSValue JSC_HOST_CALL constructJSCallback(ExecState* exec) { + JSObject* constructor = exec->callee(); JSContextRef ctx = toRef(exec); JSObjectRef constructorRef = toRef(constructor); JSObjectCallAsConstructorCallback callback = static_cast(constructor)->callback(); if (callback) { - int argumentCount = static_cast(args.size()); + int argumentCount = static_cast(exec->argumentCount()); Vector arguments(argumentCount); for (int i = 0; i < argumentCount; i++) - arguments[i] = toRef(exec, args.at(i)); + arguments[i] = toRef(exec, exec->argument(i)); JSValueRef exception = 0; JSObjectRef result; @@ -71,11 +74,11 @@ static JSObject* constructJSCallback(ExecState* exec, JSObject* constructor, con result = callback(ctx, constructorRef, argumentCount, arguments.data(), &exception); } if (exception) - exec->setException(toJS(exec, exception)); - return toJS(result); + throwError(exec, toJS(exec, exception)); + return JSValue::encode(toJS(result)); } - return toJS(JSObjectMake(ctx, static_cast(constructor)->classRef(), 0)); + return JSValue::encode(toJS(JSObjectMake(ctx, static_cast(constructor)->classRef(), 0))); } ConstructType JSCallbackConstructor::getConstructData(ConstructData& constructData) diff --git a/API/JSCallbackConstructor.h b/API/JSCallbackConstructor.h index e529947..64b237d 100644 --- a/API/JSCallbackConstructor.h +++ b/API/JSCallbackConstructor.h @@ -27,21 +27,21 @@ #define JSCallbackConstructor_h #include "JSObjectRef.h" -#include +#include namespace JSC { -class JSCallbackConstructor : public JSObject { +class JSCallbackConstructor : public JSObjectWithGlobalObject { public: - JSCallbackConstructor(NonNullPassRefPtr, JSClassRef, JSObjectCallAsConstructorCallback); + JSCallbackConstructor(JSGlobalObject*, Structure*, JSClassRef, JSObjectCallAsConstructorCallback); virtual ~JSCallbackConstructor(); JSClassRef classRef() const { return m_class; } JSObjectCallAsConstructorCallback callback() const { return m_callback; } - static const ClassInfo info; - - static PassRefPtr createStructure(JSValue proto) - { - return Structure::create(proto, TypeInfo(ObjectType, StructureFlags), AnonymousSlotCount); + static const ClassInfo s_info; + + static Structure* createStructure(JSGlobalData& globalData, JSValue proto) + { + return Structure::create(globalData, proto, TypeInfo(ObjectType, StructureFlags), AnonymousSlotCount, &s_info); } protected: @@ -49,7 +49,6 @@ protected: private: virtual ConstructType getConstructData(ConstructData&); - virtual const ClassInfo* classInfo() const { return &info; } JSClassRef m_class; JSObjectCallAsConstructorCallback m_callback; diff --git a/API/JSCallbackFunction.cpp b/API/JSCallbackFunction.cpp index 63c8add..28b3419 100644 --- a/API/JSCallbackFunction.cpp +++ b/API/JSCallbackFunction.cpp @@ -29,6 +29,7 @@ #include "APIShims.h" #include "APICast.h" #include "CodeBlock.h" +#include "ExceptionHelpers.h" #include "JSFunction.h" #include "FunctionPrototype.h" #include @@ -39,35 +40,36 @@ namespace JSC { ASSERT_CLASS_FITS_IN_CELL(JSCallbackFunction); -const ClassInfo JSCallbackFunction::info = { "CallbackFunction", &InternalFunction::info, 0, 0 }; +const ClassInfo JSCallbackFunction::s_info = { "CallbackFunction", &InternalFunction::s_info, 0, 0 }; -JSCallbackFunction::JSCallbackFunction(ExecState* exec, JSObjectCallAsFunctionCallback callback, const Identifier& name) - : InternalFunction(&exec->globalData(), exec->lexicalGlobalObject()->callbackFunctionStructure(), name) +JSCallbackFunction::JSCallbackFunction(ExecState* exec, JSGlobalObject* globalObject, JSObjectCallAsFunctionCallback callback, const Identifier& name) + : InternalFunction(&exec->globalData(), globalObject, globalObject->callbackFunctionStructure(), name) , m_callback(callback) { + ASSERT(inherits(&s_info)); } -JSValue JSCallbackFunction::call(ExecState* exec, JSObject* functionObject, JSValue thisValue, const ArgList& args) +EncodedJSValue JSCallbackFunction::call(ExecState* exec) { JSContextRef execRef = toRef(exec); - JSObjectRef functionRef = toRef(functionObject); - JSObjectRef thisObjRef = toRef(thisValue.toThisObject(exec)); + JSObjectRef functionRef = toRef(exec->callee()); + JSObjectRef thisObjRef = toRef(exec->hostThisValue().toThisObject(exec)); - int argumentCount = static_cast(args.size()); + int argumentCount = static_cast(exec->argumentCount()); Vector arguments(argumentCount); for (int i = 0; i < argumentCount; i++) - arguments[i] = toRef(exec, args.at(i)); + arguments[i] = toRef(exec, exec->argument(i)); JSValueRef exception = 0; JSValueRef result; { APICallbackShim callbackShim(exec); - result = static_cast(functionObject)->m_callback(execRef, functionRef, thisObjRef, argumentCount, arguments.data(), &exception); + result = static_cast(toJS(functionRef))->m_callback(execRef, functionRef, thisObjRef, argumentCount, arguments.data(), &exception); } if (exception) - exec->setException(toJS(exec, exception)); + throwError(exec, toJS(exec, exception)); - return toJS(exec, result); + return JSValue::encode(toJS(exec, result)); } CallType JSCallbackFunction::getCallData(CallData& callData) diff --git a/API/JSCallbackFunction.h b/API/JSCallbackFunction.h index 10dae6b..55c9ed4 100644 --- a/API/JSCallbackFunction.h +++ b/API/JSCallbackFunction.h @@ -33,22 +33,21 @@ namespace JSC { class JSCallbackFunction : public InternalFunction { public: - JSCallbackFunction(ExecState*, JSObjectCallAsFunctionCallback, const Identifier& name); + JSCallbackFunction(ExecState*, JSGlobalObject*, JSObjectCallAsFunctionCallback, const Identifier& name); - static const ClassInfo info; + static const ClassInfo s_info; // InternalFunction mish-mashes constructor and function behavior -- we should // refactor the code so this override isn't necessary - static PassRefPtr createStructure(JSValue proto) + static Structure* createStructure(JSGlobalData& globalData, JSValue proto) { - return Structure::create(proto, TypeInfo(ObjectType, StructureFlags), AnonymousSlotCount); + return Structure::create(globalData, proto, TypeInfo(ObjectType, StructureFlags), AnonymousSlotCount, &s_info); } private: virtual CallType getCallData(CallData&); - virtual const ClassInfo* classInfo() const { return &info; } - static JSValue JSC_HOST_CALL call(ExecState*, JSObject*, JSValue, const ArgList&); + static EncodedJSValue JSC_HOST_CALL call(ExecState*); JSObjectCallAsFunctionCallback m_callback; }; diff --git a/API/JSCallbackObject.cpp b/API/JSCallbackObject.cpp index b36c194..6a7462a 100644 --- a/API/JSCallbackObject.cpp +++ b/API/JSCallbackObject.cpp @@ -27,16 +27,28 @@ #include "config.h" #include "JSCallbackObject.h" -#include "Collector.h" +#include "Heap.h" #include namespace JSC { -ASSERT_CLASS_FITS_IN_CELL(JSCallbackObject); +ASSERT_CLASS_FITS_IN_CELL(JSCallbackObject); ASSERT_CLASS_FITS_IN_CELL(JSCallbackObject); // Define the two types of JSCallbackObjects we support. -template <> const ClassInfo JSCallbackObject::info = { "CallbackObject", 0, 0, 0 }; -template <> const ClassInfo JSCallbackObject::info = { "CallbackGlobalObject", 0, 0, 0 }; +template <> const ClassInfo JSCallbackObject::s_info = { "CallbackObject", &JSObjectWithGlobalObject::s_info, 0, 0 }; +template <> const ClassInfo JSCallbackObject::s_info = { "CallbackGlobalObject", &JSGlobalObject::s_info, 0, 0 }; +void JSCallbackObjectData::finalize(Handle handle, void* context) +{ + JSClassRef jsClass = static_cast(context); + JSObjectRef thisRef = toRef(asObject(handle.get())); + + for (; jsClass; jsClass = jsClass->parentClass) + if (JSObjectFinalizeCallback finalize = jsClass->finalize) + finalize(thisRef); + HandleSlot slot = handle.slot(); + HandleHeap::heapFor(slot)->deallocate(slot); +} + } // namespace JSC diff --git a/API/JSCallbackObject.h b/API/JSCallbackObject.h index 1cf7a02..2b322e7 100644 --- a/API/JSCallbackObject.h +++ b/API/JSCallbackObject.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2006, 2007, 2008, 2010 Apple Inc. All rights reserved. * Copyright (C) 2007 Eric Seidel * * Redistribution and use in source and binary forms, with or without @@ -30,10 +30,11 @@ #include "JSObjectRef.h" #include "JSValueRef.h" #include "JSObject.h" +#include namespace JSC { -struct JSCallbackObjectData { +struct JSCallbackObjectData : WeakHandleOwner { JSCallbackObjectData(void* privateData, JSClassRef jsClass) : privateData(privateData) , jsClass(jsClass) @@ -53,11 +54,11 @@ struct JSCallbackObjectData { return m_privateProperties->getPrivateProperty(propertyName); } - void setPrivateProperty(const Identifier& propertyName, JSValue value) + void setPrivateProperty(JSGlobalData& globalData, JSCell* owner, const Identifier& propertyName, JSValue value) { if (!m_privateProperties) - m_privateProperties.set(new JSPrivatePropertyMap); - m_privateProperties->setPrivateProperty(propertyName, value); + m_privateProperties = adoptPtr(new JSPrivatePropertyMap); + m_privateProperties->setPrivateProperty(globalData, owner, propertyName, value); } void deletePrivateProperty(const Identifier& propertyName) @@ -67,11 +68,11 @@ struct JSCallbackObjectData { m_privateProperties->deletePrivateProperty(propertyName); } - void markChildren(MarkStack& markStack) + void visitChildren(SlotVisitor& visitor) { if (!m_privateProperties) return; - m_privateProperties->markChildren(markStack); + m_privateProperties->visitChildren(visitor); } void* privateData; @@ -79,56 +80,57 @@ struct JSCallbackObjectData { struct JSPrivatePropertyMap { JSValue getPrivateProperty(const Identifier& propertyName) const { - PrivatePropertyMap::const_iterator location = m_propertyMap.find(propertyName.ustring().rep()); + PrivatePropertyMap::const_iterator location = m_propertyMap.find(propertyName.impl()); if (location == m_propertyMap.end()) return JSValue(); - return location->second; + return location->second.get(); } - void setPrivateProperty(const Identifier& propertyName, JSValue value) + void setPrivateProperty(JSGlobalData& globalData, JSCell* owner, const Identifier& propertyName, JSValue value) { - m_propertyMap.set(propertyName.ustring().rep(), value); + WriteBarrier empty; + m_propertyMap.add(propertyName.impl(), empty).first->second.set(globalData, owner, value); } void deletePrivateProperty(const Identifier& propertyName) { - m_propertyMap.remove(propertyName.ustring().rep()); + m_propertyMap.remove(propertyName.impl()); } - void markChildren(MarkStack& markStack) + void visitChildren(SlotVisitor& visitor) { for (PrivatePropertyMap::iterator ptr = m_propertyMap.begin(); ptr != m_propertyMap.end(); ++ptr) { if (ptr->second) - markStack.append(ptr->second); + visitor.append(&ptr->second); } } private: - typedef HashMap, JSValue, IdentifierRepHash> PrivatePropertyMap; + typedef HashMap, WriteBarrier, IdentifierRepHash> PrivatePropertyMap; PrivatePropertyMap m_propertyMap; }; OwnPtr m_privateProperties; + virtual void finalize(Handle, void*); }; template class JSCallbackObject : public Base { public: - JSCallbackObject(ExecState*, NonNullPassRefPtr, JSClassRef, void* data); - JSCallbackObject(JSClassRef); - virtual ~JSCallbackObject(); + JSCallbackObject(ExecState*, JSGlobalObject*, Structure*, JSClassRef, void* data); + JSCallbackObject(JSGlobalData&, JSClassRef, Structure*); void setPrivate(void* data); void* getPrivate(); - static const ClassInfo info; + static const ClassInfo s_info; JSClassRef classRef() const { return m_callbackObjectData->jsClass; } bool inherits(JSClassRef) const; - static PassRefPtr createStructure(JSValue proto) + static Structure* createStructure(JSGlobalData& globalData, JSValue proto) { - return Structure::create(proto, TypeInfo(ObjectType, StructureFlags), Base::AnonymousSlotCount); + return Structure::create(globalData, proto, TypeInfo(ObjectType, StructureFlags), Base::AnonymousSlotCount, &s_info); } JSValue getPrivateProperty(const Identifier& propertyName) const @@ -136,9 +138,9 @@ public: return m_callbackObjectData->getPrivateProperty(propertyName); } - void setPrivateProperty(const Identifier& propertyName, JSValue value) + void setPrivateProperty(JSGlobalData& globalData, const Identifier& propertyName, JSValue value) { - m_callbackObjectData->setPrivateProperty(propertyName, value); + m_callbackObjectData->setPrivateProperty(globalData, this, propertyName, value); } void deletePrivateProperty(const Identifier& propertyName) @@ -147,13 +149,12 @@ public: } protected: - static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | OverridesHasInstance | OverridesMarkChildren | OverridesGetPropertyNames | Base::StructureFlags; + static const unsigned StructureFlags = ProhibitsPropertyCaching | OverridesGetOwnPropertySlot | ImplementsHasInstance | OverridesHasInstance | OverridesVisitChildren | OverridesGetPropertyNames | Base::StructureFlags; private: virtual UString className() const; virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&); - virtual bool getOwnPropertySlot(ExecState*, unsigned, PropertySlot&); virtual bool getOwnPropertyDescriptor(ExecState*, const Identifier&, PropertyDescriptor&); virtual void put(ExecState*, const Identifier&, JSValue, PutPropertySlot&); @@ -170,22 +171,21 @@ private: virtual ConstructType getConstructData(ConstructData&); virtual CallType getCallData(CallData&); - virtual const ClassInfo* classInfo() const { return &info; } - virtual void markChildren(MarkStack& markStack) + virtual void visitChildren(SlotVisitor& visitor) { - Base::markChildren(markStack); - m_callbackObjectData->markChildren(markStack); + Base::visitChildren(visitor); + m_callbackObjectData->visitChildren(visitor); } void init(ExecState*); static JSCallbackObject* asCallbackObject(JSValue); - static JSValue JSC_HOST_CALL call(ExecState*, JSObject* functionObject, JSValue thisValue, const ArgList&); - static JSObject* construct(ExecState*, JSObject* constructor, const ArgList&); + static EncodedJSValue JSC_HOST_CALL call(ExecState*); + static EncodedJSValue JSC_HOST_CALL construct(ExecState*); - static JSValue staticValueGetter(ExecState*, JSValue, const Identifier&); + JSValue getStaticValue(ExecState*, const Identifier&); static JSValue staticFunctionGetter(ExecState*, JSValue, const Identifier&); static JSValue callbackGetter(ExecState*, JSValue, const Identifier&); diff --git a/API/JSCallbackObjectFunctions.h b/API/JSCallbackObjectFunctions.h index 6c83eb4..cc8f3a8 100644 --- a/API/JSCallbackObjectFunctions.h +++ b/API/JSCallbackObjectFunctions.h @@ -27,8 +27,10 @@ #include "APIShims.h" #include "APICast.h" #include "Error.h" +#include "ExceptionHelpers.h" #include "JSCallbackFunction.h" #include "JSClassRef.h" +#include "JSFunction.h" #include "JSGlobalObject.h" #include "JSLock.h" #include "JSObjectRef.h" @@ -43,25 +45,27 @@ namespace JSC { template inline JSCallbackObject* JSCallbackObject::asCallbackObject(JSValue value) { - ASSERT(asObject(value)->inherits(&info)); + ASSERT(asObject(value)->inherits(&s_info)); return static_cast(asObject(value)); } template -JSCallbackObject::JSCallbackObject(ExecState* exec, NonNullPassRefPtr structure, JSClassRef jsClass, void* data) - : Base(structure) - , m_callbackObjectData(new JSCallbackObjectData(data, jsClass)) +JSCallbackObject::JSCallbackObject(ExecState* exec, JSGlobalObject* globalObject, Structure* structure, JSClassRef jsClass, void* data) + : Base(globalObject, structure) + , m_callbackObjectData(adoptPtr(new JSCallbackObjectData(data, jsClass))) { + ASSERT(Base::inherits(&s_info)); init(exec); } // Global object constructor. // FIXME: Move this into a separate JSGlobalCallbackObject class derived from this one. template -JSCallbackObject::JSCallbackObject(JSClassRef jsClass) - : Base() - , m_callbackObjectData(new JSCallbackObjectData(0, jsClass)) +JSCallbackObject::JSCallbackObject(JSGlobalData& globalData, JSClassRef jsClass, Structure* structure) + : Base(globalData, structure) + , m_callbackObjectData(adoptPtr(new JSCallbackObjectData(0, jsClass))) { + ASSERT(Base::inherits(&s_info)); ASSERT(Base::isGlobalObject()); init(static_cast(this)->globalExec()); } @@ -84,16 +88,16 @@ void JSCallbackObject::init(ExecState* exec) JSObjectInitializeCallback initialize = initRoutines[i]; initialize(toRef(exec), toRef(this)); } -} -template -JSCallbackObject::~JSCallbackObject() -{ - JSObjectRef thisRef = toRef(this); - - for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) - if (JSObjectFinalizeCallback finalize = jsClass->finalize) - finalize(thisRef); + bool needsFinalizer = false; + for (JSClassRef jsClassPtr = classRef(); jsClassPtr && !needsFinalizer; jsClassPtr = jsClassPtr->parentClass) + needsFinalizer = jsClassPtr->finalize; + if (needsFinalizer) { + HandleSlot slot = exec->globalData().allocateGlobalHandle(); + HandleHeap::heapFor(slot)->makeWeak(slot, m_callbackObjectData.get(), classRef()); + HandleHeap::heapFor(slot)->writeBarrier(slot, this); + *slot = this; + } } template @@ -133,7 +137,7 @@ bool JSCallbackObject::getOwnPropertySlot(ExecState* exec, const Identifie value = getProperty(ctx, thisRef, propertyNameRef.get(), &exception); } if (exception) { - exec->setException(toJS(exec, exception)); + throwError(exec, toJS(exec, exception)); slot.setValue(jsUndefined()); return true; } @@ -144,14 +148,17 @@ bool JSCallbackObject::getOwnPropertySlot(ExecState* exec, const Identifie } if (OpaqueJSClassStaticValuesTable* staticValues = jsClass->staticValues(exec)) { - if (staticValues->contains(propertyName.ustring().rep())) { - slot.setCustom(this, staticValueGetter); - return true; + if (staticValues->contains(propertyName.impl())) { + JSValue value = getStaticValue(exec, propertyName); + if (value) { + slot.setValue(value); + return true; + } } } if (OpaqueJSClassStaticFunctionsTable* staticFunctions = jsClass->staticFunctions(exec)) { - if (staticFunctions->contains(propertyName.ustring().rep())) { + if (staticFunctions->contains(propertyName.impl())) { slot.setCustom(this, staticFunctionGetter); return true; } @@ -161,12 +168,6 @@ bool JSCallbackObject::getOwnPropertySlot(ExecState* exec, const Identifie return Base::getOwnPropertySlot(exec, propertyName, slot); } -template -bool JSCallbackObject::getOwnPropertySlot(ExecState* exec, unsigned propertyName, PropertySlot& slot) -{ - return getOwnPropertySlot(exec, Identifier::from(exec, propertyName), slot); -} - template bool JSCallbackObject::getOwnPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor) { @@ -205,13 +206,13 @@ void JSCallbackObject::put(ExecState* exec, const Identifier& propertyName result = setProperty(ctx, thisRef, propertyNameRef.get(), valueRef, &exception); } if (exception) - exec->setException(toJS(exec, exception)); + throwError(exec, toJS(exec, exception)); if (result || exception) return; } if (OpaqueJSClassStaticValuesTable* staticValues = jsClass->staticValues(exec)) { - if (StaticValueEntry* entry = staticValues->get(propertyName.ustring().rep())) { + if (StaticValueEntry* entry = staticValues->get(propertyName.impl())) { if (entry->attributes & kJSPropertyAttributeReadOnly) return; if (JSObjectSetPropertyCallback setProperty = entry->setProperty) { @@ -224,19 +225,18 @@ void JSCallbackObject::put(ExecState* exec, const Identifier& propertyName result = setProperty(ctx, thisRef, propertyNameRef.get(), valueRef, &exception); } if (exception) - exec->setException(toJS(exec, exception)); + throwError(exec, toJS(exec, exception)); if (result || exception) return; - } else - throwError(exec, ReferenceError, "Attempt to set a property that is not settable."); + } } } if (OpaqueJSClassStaticFunctionsTable* staticFunctions = jsClass->staticFunctions(exec)) { - if (StaticFunctionEntry* entry = staticFunctions->get(propertyName.ustring().rep())) { + if (StaticFunctionEntry* entry = staticFunctions->get(propertyName.impl())) { if (entry->attributes & kJSPropertyAttributeReadOnly) return; - JSCallbackObject::putDirect(propertyName, value); // put as override property + JSCallbackObject::putDirect(exec->globalData(), propertyName, value); // put as override property return; } } @@ -263,13 +263,13 @@ bool JSCallbackObject::deleteProperty(ExecState* exec, const Identifier& p result = deleteProperty(ctx, thisRef, propertyNameRef.get(), &exception); } if (exception) - exec->setException(toJS(exec, exception)); + throwError(exec, toJS(exec, exception)); if (result || exception) return true; } if (OpaqueJSClassStaticValuesTable* staticValues = jsClass->staticValues(exec)) { - if (StaticValueEntry* entry = staticValues->get(propertyName.ustring().rep())) { + if (StaticValueEntry* entry = staticValues->get(propertyName.impl())) { if (entry->attributes & kJSPropertyAttributeDontDelete) return false; return true; @@ -277,7 +277,7 @@ bool JSCallbackObject::deleteProperty(ExecState* exec, const Identifier& p } if (OpaqueJSClassStaticFunctionsTable* staticFunctions = jsClass->staticFunctions(exec)) { - if (StaticFunctionEntry* entry = staticFunctions->get(propertyName.ustring().rep())) { + if (StaticFunctionEntry* entry = staticFunctions->get(propertyName.impl())) { if (entry->attributes & kJSPropertyAttributeDontDelete) return false; return true; @@ -307,17 +307,18 @@ ConstructType JSCallbackObject::getConstructData(ConstructData& constructD } template -JSObject* JSCallbackObject::construct(ExecState* exec, JSObject* constructor, const ArgList& args) +EncodedJSValue JSCallbackObject::construct(ExecState* exec) { + JSObject* constructor = exec->callee(); JSContextRef execRef = toRef(exec); JSObjectRef constructorRef = toRef(constructor); for (JSClassRef jsClass = static_cast*>(constructor)->classRef(); jsClass; jsClass = jsClass->parentClass) { if (JSObjectCallAsConstructorCallback callAsConstructor = jsClass->callAsConstructor) { - int argumentCount = static_cast(args.size()); + int argumentCount = static_cast(exec->argumentCount()); Vector arguments(argumentCount); for (int i = 0; i < argumentCount; i++) - arguments[i] = toRef(exec, args.at(i)); + arguments[i] = toRef(exec, exec->argument(i)); JSValueRef exception = 0; JSObject* result; { @@ -325,13 +326,13 @@ JSObject* JSCallbackObject::construct(ExecState* exec, JSObject* construct result = toJS(callAsConstructor(execRef, constructorRef, argumentCount, arguments.data(), &exception)); } if (exception) - exec->setException(toJS(exec, exception)); - return result; + throwError(exec, toJS(exec, exception)); + return JSValue::encode(result); } } ASSERT_NOT_REACHED(); // getConstructData should prevent us from reaching here - return 0; + return JSValue::encode(JSValue()); } template @@ -350,7 +351,7 @@ bool JSCallbackObject::hasInstance(ExecState* exec, JSValue value, JSValue result = hasInstance(execRef, thisRef, valueRef, &exception); } if (exception) - exec->setException(toJS(exec, exception)); + throwError(exec, toJS(exec, exception)); return result; } } @@ -370,18 +371,18 @@ CallType JSCallbackObject::getCallData(CallData& callData) } template -JSValue JSCallbackObject::call(ExecState* exec, JSObject* functionObject, JSValue thisValue, const ArgList& args) +EncodedJSValue JSCallbackObject::call(ExecState* exec) { JSContextRef execRef = toRef(exec); - JSObjectRef functionRef = toRef(functionObject); - JSObjectRef thisObjRef = toRef(thisValue.toThisObject(exec)); + JSObjectRef functionRef = toRef(exec->callee()); + JSObjectRef thisObjRef = toRef(exec->hostThisValue().toThisObject(exec)); - for (JSClassRef jsClass = static_cast*>(functionObject)->classRef(); jsClass; jsClass = jsClass->parentClass) { + for (JSClassRef jsClass = static_cast*>(toJS(functionRef))->classRef(); jsClass; jsClass = jsClass->parentClass) { if (JSObjectCallAsFunctionCallback callAsFunction = jsClass->callAsFunction) { - int argumentCount = static_cast(args.size()); + int argumentCount = static_cast(exec->argumentCount()); Vector arguments(argumentCount); for (int i = 0; i < argumentCount; i++) - arguments[i] = toRef(exec, args.at(i)); + arguments[i] = toRef(exec, exec->argument(i)); JSValueRef exception = 0; JSValue result; { @@ -389,13 +390,13 @@ JSValue JSCallbackObject::call(ExecState* exec, JSObject* functionObject, result = toJS(exec, callAsFunction(execRef, functionRef, thisObjRef, argumentCount, arguments.data(), &exception)); } if (exception) - exec->setException(toJS(exec, exception)); - return result; + throwError(exec, toJS(exec, exception)); + return JSValue::encode(result); } } ASSERT_NOT_REACHED(); // getCallData should prevent us from reaching here - return JSValue(); + return JSValue::encode(JSValue()); } template @@ -414,7 +415,7 @@ void JSCallbackObject::getOwnPropertyNames(ExecState* exec, PropertyNameAr typedef OpaqueJSClassStaticValuesTable::const_iterator iterator; iterator end = staticValues->end(); for (iterator it = staticValues->begin(); it != end; ++it) { - UString::Rep* name = it->first.get(); + StringImpl* name = it->first.get(); StaticValueEntry* entry = it->second; if (entry->getProperty && (!(entry->attributes & kJSPropertyAttributeDontEnum) || (mode == IncludeDontEnumProperties))) propertyNames.add(Identifier(exec, name)); @@ -425,7 +426,7 @@ void JSCallbackObject::getOwnPropertyNames(ExecState* exec, PropertyNameAr typedef OpaqueJSClassStaticFunctionsTable::const_iterator iterator; iterator end = staticFunctions->end(); for (iterator it = staticFunctions->begin(); it != end; ++it) { - UString::Rep* name = it->first.get(); + StringImpl* name = it->first.get(); StaticFunctionEntry* entry = it->second; if (!(entry->attributes & kJSPropertyAttributeDontEnum) || (mode == IncludeDontEnumProperties)) propertyNames.add(Identifier(exec, name)); @@ -456,7 +457,7 @@ double JSCallbackObject::toNumber(ExecState* exec) const value = convertToType(ctx, thisRef, kJSTypeNumber, &exception); } if (exception) { - exec->setException(toJS(exec, exception)); + throwError(exec, toJS(exec, exception)); return 0; } @@ -483,7 +484,7 @@ UString JSCallbackObject::toString(ExecState* exec) const value = convertToType(ctx, thisRef, kJSTypeString, &exception); } if (exception) { - exec->setException(toJS(exec, exception)); + throwError(exec, toJS(exec, exception)); return ""; } if (value) @@ -516,16 +517,14 @@ bool JSCallbackObject::inherits(JSClassRef c) const } template -JSValue JSCallbackObject::staticValueGetter(ExecState* exec, JSValue slotBase, const Identifier& propertyName) +JSValue JSCallbackObject::getStaticValue(ExecState* exec, const Identifier& propertyName) { - JSCallbackObject* thisObj = asCallbackObject(slotBase); - - JSObjectRef thisRef = toRef(thisObj); + JSObjectRef thisRef = toRef(this); RefPtr propertyNameRef; - for (JSClassRef jsClass = thisObj->classRef(); jsClass; jsClass = jsClass->parentClass) + for (JSClassRef jsClass = classRef(); jsClass; jsClass = jsClass->parentClass) if (OpaqueJSClassStaticValuesTable* staticValues = jsClass->staticValues(exec)) - if (StaticValueEntry* entry = staticValues->get(propertyName.ustring().rep())) + if (StaticValueEntry* entry = staticValues->get(propertyName.impl())) if (JSObjectGetPropertyCallback getProperty = entry->getProperty) { if (!propertyNameRef) propertyNameRef = OpaqueJSString::create(propertyName.ustring()); @@ -536,14 +535,14 @@ JSValue JSCallbackObject::staticValueGetter(ExecState* exec, JSValue slotB value = getProperty(toRef(exec), thisRef, propertyNameRef.get(), &exception); } if (exception) { - exec->setException(toJS(exec, exception)); + throwError(exec, toJS(exec, exception)); return jsUndefined(); } if (value) return toJS(exec, value); } - return throwError(exec, ReferenceError, "Static value property defined with NULL getProperty callback."); + return JSValue(); } template @@ -558,17 +557,18 @@ JSValue JSCallbackObject::staticFunctionGetter(ExecState* exec, JSValue sl for (JSClassRef jsClass = thisObj->classRef(); jsClass; jsClass = jsClass->parentClass) { if (OpaqueJSClassStaticFunctionsTable* staticFunctions = jsClass->staticFunctions(exec)) { - if (StaticFunctionEntry* entry = staticFunctions->get(propertyName.ustring().rep())) { + if (StaticFunctionEntry* entry = staticFunctions->get(propertyName.impl())) { if (JSObjectCallAsFunctionCallback callAsFunction = entry->callAsFunction) { - JSObject* o = new (exec) JSCallbackFunction(exec, callAsFunction, propertyName); - thisObj->putDirect(propertyName, o, entry->attributes); + + JSObject* o = new (exec) JSCallbackFunction(exec, asGlobalObject(thisObj->getAnonymousValue(0)), callAsFunction, propertyName); + thisObj->putDirect(exec->globalData(), propertyName, o, entry->attributes); return o; } } } } - return throwError(exec, ReferenceError, "Static function property defined with NULL callAsFunction callback."); + return throwError(exec, createReferenceError(exec, "Static function property defined with NULL callAsFunction callback.")); } template @@ -590,14 +590,14 @@ JSValue JSCallbackObject::callbackGetter(ExecState* exec, JSValue slotBase value = getProperty(toRef(exec), thisRef, propertyNameRef.get(), &exception); } if (exception) { - exec->setException(toJS(exec, exception)); + throwError(exec, toJS(exec, exception)); return jsUndefined(); } if (value) return toJS(exec, value); } - return throwError(exec, ReferenceError, "hasProperty callback returned true for a property that doesn't exist."); + return throwError(exec, createReferenceError(exec, "hasProperty callback returned true for a property that doesn't exist.")); } } // namespace JSC diff --git a/API/JSClassRef.cpp b/API/JSClassRef.cpp index 3e65b75..08dc721 100644 --- a/API/JSClassRef.cpp +++ b/API/JSClassRef.cpp @@ -45,13 +45,13 @@ const JSClassDefinition kJSClassDefinitionEmpty = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 static inline UString tryCreateStringFromUTF8(const char* string) { if (!string) - return UString::null(); + return UString(); size_t length = strlen(string); Vector buffer(length); UChar* p = buffer.data(); if (conversionOK != convertUTF8ToUTF16(&string, string + length, &p, p + length)) - return UString::null(); + return UString(); return UString(buffer.data(), p - buffer.data()); } @@ -83,9 +83,10 @@ OpaqueJSClass::OpaqueJSClass(const JSClassDefinition* definition, OpaqueJSClass* if (!valueName.isNull()) { // Use a local variable here to sidestep an RVCT compiler bug. StaticValueEntry* entry = new StaticValueEntry(staticValue->getProperty, staticValue->setProperty, staticValue->attributes); - UStringImpl* impl = valueName.rep(); - impl->ref(); - m_staticValues->add(impl, entry); + StringImpl* impl = valueName.impl(); + StaticValueEntry* existingEntry = m_staticValues->get(impl); + m_staticValues->set(impl, entry); + delete existingEntry; } ++staticValue; } @@ -98,9 +99,10 @@ OpaqueJSClass::OpaqueJSClass(const JSClassDefinition* definition, OpaqueJSClass* if (!functionName.isNull()) { // Use a local variable here to sidestep an RVCT compiler bug. StaticFunctionEntry* entry = new StaticFunctionEntry(staticFunction->callAsFunction, staticFunction->attributes); - UStringImpl* impl = functionName.rep(); - impl->ref(); - m_staticFunctions->add(impl, entry); + StringImpl* impl = functionName.impl(); + StaticFunctionEntry* existingEntry = m_staticFunctions->get(impl); + m_staticFunctions->set(impl, entry); + delete existingEntry; } ++staticFunction; } @@ -113,7 +115,7 @@ OpaqueJSClass::OpaqueJSClass(const JSClassDefinition* definition, OpaqueJSClass* OpaqueJSClass::~OpaqueJSClass() { // The empty string is shared across threads & is an identifier, in all other cases we should have done a deep copy in className(), below. - ASSERT(!m_className.size() || !m_className.rep()->isIdentifier()); + ASSERT(!m_className.length() || !m_className.impl()->isIdentifier()); if (m_staticValues) { OpaqueJSClassStaticValuesTable::const_iterator end = m_staticValues->end(); @@ -142,19 +144,12 @@ PassRefPtr OpaqueJSClass::createNoAutomaticPrototype(const JSClas return adoptRef(new OpaqueJSClass(definition, 0)); } -static void clearReferenceToPrototype(JSObjectRef prototype) -{ - OpaqueJSClassContextData* jsClassData = static_cast(JSObjectGetPrivate(prototype)); - ASSERT(jsClassData); - jsClassData->cachedPrototype.clear(toJS(prototype)); -} - PassRefPtr OpaqueJSClass::create(const JSClassDefinition* clientDefinition) { JSClassDefinition definition = *clientDefinition; // Avoid modifying client copy. JSClassDefinition protoDefinition = kJSClassDefinitionEmpty; - protoDefinition.finalize = clearReferenceToPrototype; + protoDefinition.finalize = 0; swap(definition.staticFunctions, protoDefinition.staticFunctions); // Move static functions to the prototype. // We are supposed to use JSClassRetain/Release but since we know that we currently have @@ -163,7 +158,7 @@ PassRefPtr OpaqueJSClass::create(const JSClassDefinition* clientD return adoptRef(new OpaqueJSClass(&definition, protoClass.get())); } -OpaqueJSClassContextData::OpaqueJSClassContextData(OpaqueJSClass* jsClass) +OpaqueJSClassContextData::OpaqueJSClassContextData(JSC::JSGlobalData&, OpaqueJSClass* jsClass) : m_class(jsClass) { if (jsClass->m_staticValues) { @@ -173,7 +168,7 @@ OpaqueJSClassContextData::OpaqueJSClassContextData(OpaqueJSClass* jsClass) ASSERT(!it->first->isIdentifier()); // Use a local variable here to sidestep an RVCT compiler bug. StaticValueEntry* entry = new StaticValueEntry(it->second->getProperty, it->second->setProperty, it->second->attributes); - staticValues->add(UString::Rep::create(it->first->characters(), it->first->length()), entry); + staticValues->add(StringImpl::create(it->first->characters(), it->first->length()), entry); } } else staticValues = 0; @@ -185,7 +180,7 @@ OpaqueJSClassContextData::OpaqueJSClassContextData(OpaqueJSClass* jsClass) ASSERT(!it->first->isIdentifier()); // Use a local variable here to sidestep an RVCT compiler bug. StaticFunctionEntry* entry = new StaticFunctionEntry(it->second->callAsFunction, it->second->attributes); - staticFunctions->add(UString::Rep::create(it->first->characters(), it->first->length()), entry); + staticFunctions->add(StringImpl::create(it->first->characters(), it->first->length()), entry); } } else @@ -209,14 +204,14 @@ OpaqueJSClassContextData& OpaqueJSClass::contextData(ExecState* exec) { OpaqueJSClassContextData*& contextData = exec->globalData().opaqueJSClassData.add(this, 0).first->second; if (!contextData) - contextData = new OpaqueJSClassContextData(this); + contextData = new OpaqueJSClassContextData(exec->globalData(), this); return *contextData; } UString OpaqueJSClass::className() { // Make a deep copy, so that the caller has no chance to put the original into IdentifierTable. - return UString(m_className.data(), m_className.size()); + return UString(m_className.characters(), m_className.length()); } OpaqueJSClassStaticValuesTable* OpaqueJSClass::staticValues(JSC::ExecState* exec) @@ -256,10 +251,10 @@ JSObject* OpaqueJSClass::prototype(ExecState* exec) if (!jsClassData.cachedPrototype) { // Recursive, but should be good enough for our purposes - jsClassData.cachedPrototype = new (exec) JSCallbackObject(exec, exec->lexicalGlobalObject()->callbackObjectStructure(), prototypeClass, &jsClassData); // set jsClassData as the object's private data, so it can clear our reference on destruction + jsClassData.cachedPrototype.set(exec->globalData(), new (exec) JSCallbackObject(exec, exec->lexicalGlobalObject(), exec->lexicalGlobalObject()->callbackObjectStructure(), prototypeClass, &jsClassData), 0); // set jsClassData as the object's private data, so it can clear our reference on destruction if (parentClass) { if (JSObject* prototype = parentClass->prototype(exec)) - jsClassData.cachedPrototype->setPrototype(prototype); + jsClassData.cachedPrototype->setPrototype(exec->globalData(), prototype); } } return jsClassData.cachedPrototype.get(); diff --git a/API/JSClassRef.h b/API/JSClassRef.h index ae60aad..d346cc5 100644 --- a/API/JSClassRef.h +++ b/API/JSClassRef.h @@ -28,14 +28,15 @@ #include "JSObjectRef.h" -#include -#include -#include -#include +#include "Weak.h" +#include "JSObject.h" +#include "Protect.h" +#include "UString.h" #include -#include -struct StaticValueEntry : FastAllocBase { +struct StaticValueEntry { + WTF_MAKE_FAST_ALLOCATED; +public: StaticValueEntry(JSObjectGetPropertyCallback _getProperty, JSObjectSetPropertyCallback _setProperty, JSPropertyAttributes _attributes) : getProperty(_getProperty), setProperty(_setProperty), attributes(_attributes) { @@ -46,7 +47,9 @@ struct StaticValueEntry : FastAllocBase { JSPropertyAttributes attributes; }; -struct StaticFunctionEntry : FastAllocBase { +struct StaticFunctionEntry { + WTF_MAKE_FAST_ALLOCATED; +public: StaticFunctionEntry(JSObjectCallAsFunctionCallback _callAsFunction, JSPropertyAttributes _attributes) : callAsFunction(_callAsFunction), attributes(_attributes) { @@ -56,15 +59,17 @@ struct StaticFunctionEntry : FastAllocBase { JSPropertyAttributes attributes; }; -typedef HashMap, StaticValueEntry*> OpaqueJSClassStaticValuesTable; -typedef HashMap, StaticFunctionEntry*> OpaqueJSClassStaticFunctionsTable; +typedef HashMap, StaticValueEntry*> OpaqueJSClassStaticValuesTable; +typedef HashMap, StaticFunctionEntry*> OpaqueJSClassStaticFunctionsTable; 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. -struct OpaqueJSClassContextData : Noncopyable { - OpaqueJSClassContextData(OpaqueJSClass*); +struct OpaqueJSClassContextData { + WTF_MAKE_NONCOPYABLE(OpaqueJSClassContextData); WTF_MAKE_FAST_ALLOCATED; +public: + OpaqueJSClassContextData(JSC::JSGlobalData&, OpaqueJSClass*); ~OpaqueJSClassContextData(); // It is necessary to keep OpaqueJSClass alive because of the following rare scenario: @@ -77,10 +82,10 @@ struct OpaqueJSClassContextData : Noncopyable { OpaqueJSClassStaticValuesTable* staticValues; OpaqueJSClassStaticFunctionsTable* staticFunctions; - JSC::WeakGCPtr cachedPrototype; + JSC::Weak cachedPrototype; }; -struct OpaqueJSClass : public ThreadSafeShared { +struct OpaqueJSClass : public ThreadSafeRefCounted { static PassRefPtr create(const JSClassDefinition*); static PassRefPtr createNoAutomaticPrototype(const JSClassDefinition*); ~OpaqueJSClass(); diff --git a/API/JSContextRef.cpp b/API/JSContextRef.cpp index b97ceda..9c15b22 100644 --- a/API/JSContextRef.cpp +++ b/API/JSContextRef.cpp @@ -29,12 +29,16 @@ #include "APICast.h" #include "InitializeThreading.h" +#include +#include #include "JSCallbackObject.h" #include "JSClassRef.h" #include "JSGlobalObject.h" #include "JSObject.h" +#include "UStringBuilder.h" #include + #if OS(DARWIN) #include @@ -46,7 +50,7 @@ using namespace JSC; JSContextGroupRef JSContextGroupCreate() { initializeThreading(); - return toRef(JSGlobalData::createContextGroup(ThreadStackTypeSmall).releaseRef()); + return toRef(JSGlobalData::createContextGroup(ThreadStackTypeSmall).leakRef()); } JSContextGroupRef JSContextGroupRetain(JSContextGroupRef group) @@ -66,7 +70,7 @@ JSGlobalContextRef JSGlobalContextCreate(JSClassRef globalObjectClass) #if OS(DARWIN) // When running on Tiger or Leopard, or if the application was linked before JSGlobalContextCreate was changed // to use a unique JSGlobalData, we use a shared one for compatibility. -#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) +#ifndef BUILDING_ON_LEOPARD if (NSVersionOfLinkTimeLibrary("JavaScriptCore") <= webkitFirstVersionWithConcurrentGlobalContexts) { #else { @@ -93,16 +97,16 @@ JSGlobalContextRef JSGlobalContextCreateInGroup(JSContextGroupRef group, JSClass #endif if (!globalObjectClass) { - JSGlobalObject* globalObject = new (globalData.get()) JSGlobalObject; + JSGlobalObject* globalObject = new (globalData.get()) JSGlobalObject(*globalData, JSGlobalObject::createStructure(*globalData, jsNull())); return JSGlobalContextRetain(toGlobalRef(globalObject->globalExec())); } - JSGlobalObject* globalObject = new (globalData.get()) JSCallbackObject(globalObjectClass); + JSGlobalObject* globalObject = new (globalData.get()) JSCallbackObject(*globalData, globalObjectClass, JSCallbackObject::createStructure(*globalData, jsNull())); ExecState* exec = globalObject->globalExec(); JSValue prototype = globalObjectClass->prototype(exec); if (!prototype) prototype = jsNull(); - globalObject->resetPrototype(prototype); + globalObject->resetPrototype(*globalData, prototype); return JSGlobalContextRetain(toGlobalRef(exec)); } @@ -138,13 +142,17 @@ void JSGlobalContextRelease(JSGlobalContextRef ctx) // * If this is the last reference to any contexts in the given context group, // call destroy on the heap (the global data is being freed). // * If this was the last reference to the global object, then unprotecting - // it may release a lot of GC memory - run the garbage collector now. + // it may release a lot of GC memory - tickle the activity callback to + // garbage collect soon. // * If there are more references remaining the the global object, then do nothing // (specifically that is more protects, which we assume come from other JSGlobalContextRefs). - if (releasingContextGroup) + if (releasingContextGroup) { + globalData.clearBuiltinStructures(); globalData.heap.destroy(); - else if (releasingGlobalObject) - globalData.heap.collectAllGarbage(); + } else if (releasingGlobalObject) { + globalData.heap.activityCallback()->synchronize(); + (*globalData.heap.activityCallback())(); + } globalData.deref(); @@ -173,3 +181,60 @@ JSGlobalContextRef JSContextGetGlobalContext(JSContextRef ctx) return toGlobalRef(exec->lexicalGlobalObject()->globalExec()); } + +JSStringRef JSContextCreateBacktrace(JSContextRef ctx, unsigned maxStackSize) +{ + ExecState* exec = toJS(ctx); + JSLock lock(exec); + + unsigned count = 0; + UStringBuilder builder; + CallFrame* callFrame = exec; + UString functionName; + if (exec->callee()) { + if (asObject(exec->callee())->inherits(&InternalFunction::s_info)) { + functionName = asInternalFunction(exec->callee())->name(exec); + builder.append("#0 "); + builder.append(functionName); + builder.append("() "); + count++; + } + } + while (true) { + ASSERT(callFrame); + int signedLineNumber; + intptr_t sourceID; + UString urlString; + JSValue function; + + UString levelStr = UString::number(count); + + exec->interpreter()->retrieveLastCaller(callFrame, signedLineNumber, sourceID, urlString, function); + + if (function) + functionName = asFunction(function)->name(exec); + else { + // Caller is unknown, but if frame is empty we should still add the frame, because + // something called us, and gave us arguments. + if (count) + break; + } + unsigned lineNumber = signedLineNumber >= 0 ? signedLineNumber : 0; + if (!builder.isEmpty()) + builder.append("\n"); + builder.append("#"); + builder.append(levelStr); + builder.append(" "); + builder.append(functionName); + builder.append("() at "); + builder.append(urlString); + builder.append(":"); + builder.append(UString::number(lineNumber)); + if (!function || ++count == maxStackSize) + break; + callFrame = callFrame->callerFrame(); + } + return OpaqueJSString::create(builder.toUString()).leakRef(); +} + + diff --git a/API/JSContextRefPrivate.h b/API/JSContextRefPrivate.h index ff014ec..4f77aea 100644 --- a/API/JSContextRefPrivate.h +++ b/API/JSContextRefPrivate.h @@ -46,6 +46,15 @@ extern "C" { */ JS_EXPORT JSGlobalContextRef JSContextGetGlobalContext(JSContextRef ctx); + +/*! +@function +@abstract Gets a Backtrace for the existing context +@param ctx The JSContext whose backtrace you want to get +@result A string containing the backtrace +*/ +JS_EXPORT JSStringRef JSContextCreateBacktrace(JSContextRef ctx, unsigned maxStackSize) AVAILABLE_IN_WEBKIT_VERSION_4_0; + #ifdef __cplusplus } #endif diff --git a/API/JSObjectRef.cpp b/API/JSObjectRef.cpp index 8fdbdab..2df010a 100644 --- a/API/JSObjectRef.cpp +++ b/API/JSObjectRef.cpp @@ -59,7 +59,7 @@ JSClassRef JSClassCreate(const JSClassDefinition* definition) ? OpaqueJSClass::createNoAutomaticPrototype(definition) : OpaqueJSClass::create(definition); - return jsClass.release().releaseRef(); + return jsClass.release().leakRef(); } JSClassRef JSClassRetain(JSClassRef jsClass) @@ -79,11 +79,11 @@ JSObjectRef JSObjectMake(JSContextRef ctx, JSClassRef jsClass, void* data) APIEntryShim entryShim(exec); if (!jsClass) - return toRef(new (exec) JSObject(exec->lexicalGlobalObject()->emptyObjectStructure())); // slightly more efficient + return toRef(constructEmptyObject(exec)); - JSCallbackObject* object = new (exec) JSCallbackObject(exec, exec->lexicalGlobalObject()->callbackObjectStructure(), jsClass, data); + JSCallbackObject* object = new (exec) JSCallbackObject(exec, exec->lexicalGlobalObject(), exec->lexicalGlobalObject()->callbackObjectStructure(), jsClass, data); if (JSObject* prototype = jsClass->prototype(exec)) - object->setPrototype(prototype); + object->setPrototype(exec->globalData(), prototype); return toRef(object); } @@ -95,7 +95,7 @@ JSObjectRef JSObjectMakeFunctionWithCallback(JSContextRef ctx, JSStringRef name, Identifier nameID = name ? name->identifier(&exec->globalData()) : Identifier(exec, "anonymous"); - return toRef(new (exec) JSCallbackFunction(exec, callAsFunction, nameID)); + return toRef(new (exec) JSCallbackFunction(exec, exec->lexicalGlobalObject(), callAsFunction, nameID)); } JSObjectRef JSObjectMakeConstructor(JSContextRef ctx, JSClassRef jsClass, JSObjectCallAsConstructorCallback callAsConstructor) @@ -107,8 +107,8 @@ JSObjectRef JSObjectMakeConstructor(JSContextRef ctx, JSClassRef jsClass, JSObje if (!jsPrototype) jsPrototype = exec->lexicalGlobalObject()->objectPrototype(); - JSCallbackConstructor* constructor = new (exec) JSCallbackConstructor(exec->lexicalGlobalObject()->callbackConstructorStructure(), jsClass, callAsConstructor); - constructor->putDirect(exec->propertyNames().prototype, jsPrototype, DontEnum | DontDelete | ReadOnly); + JSCallbackConstructor* constructor = new (exec) JSCallbackConstructor(exec->lexicalGlobalObject(), exec->lexicalGlobalObject()->callbackConstructorStructure(), jsClass, callAsConstructor); + constructor->putDirect(exec->globalData(), exec->propertyNames().prototype, jsPrototype, DontEnum | DontDelete | ReadOnly); return toRef(constructor); } @@ -124,7 +124,7 @@ JSObjectRef JSObjectMakeFunction(JSContextRef ctx, JSStringRef name, unsigned pa args.append(jsString(exec, parameterNames[i]->ustring())); args.append(jsString(exec, body->ustring())); - JSObject* result = constructFunction(exec, args, nameID, sourceURL->ustring(), startingLineNumber); + JSObject* result = constructFunction(exec, exec->lexicalGlobalObject(), args, nameID, sourceURL->ustring(), startingLineNumber); if (exec->hadException()) { if (exception) *exception = toRef(exec, exec->exception()); @@ -168,7 +168,7 @@ JSObjectRef JSObjectMakeDate(JSContextRef ctx, size_t argumentCount, const JSVal for (size_t i = 0; i < argumentCount; ++i) argList.append(toJS(exec, arguments[i])); - JSObject* result = constructDate(exec, argList); + JSObject* result = constructDate(exec, exec->lexicalGlobalObject(), argList); if (exec->hadException()) { if (exception) *exception = toRef(exec, exec->exception()); @@ -184,11 +184,10 @@ JSObjectRef JSObjectMakeError(JSContextRef ctx, size_t argumentCount, const JSVa ExecState* exec = toJS(ctx); APIEntryShim entryShim(exec); - MarkedArgumentBuffer argList; - for (size_t i = 0; i < argumentCount; ++i) - argList.append(toJS(exec, arguments[i])); + JSValue message = argumentCount ? toJS(exec, arguments[0]) : jsUndefined(); + Structure* errorStructure = exec->lexicalGlobalObject()->errorStructure(); + JSObject* result = ErrorInstance::create(exec, errorStructure, message); - JSObject* result = constructError(exec, argList); if (exec->hadException()) { if (exception) *exception = toRef(exec, exec->exception()); @@ -208,7 +207,7 @@ JSObjectRef JSObjectMakeRegExp(JSContextRef ctx, size_t argumentCount, const JSV for (size_t i = 0; i < argumentCount; ++i) argList.append(toJS(exec, arguments[i])); - JSObject* result = constructRegExp(exec, argList); + JSObject* result = constructRegExp(exec, exec->lexicalGlobalObject(), argList); if (exec->hadException()) { if (exception) *exception = toRef(exec, exec->exception()); @@ -236,7 +235,7 @@ void JSObjectSetPrototype(JSContextRef ctx, JSObjectRef object, JSValueRef value JSObject* jsObject = toJS(object); JSValue jsValue = toJS(exec, value); - jsObject->setPrototype(jsValue.isObject() ? jsValue : jsNull()); + jsObject->setPrototypeWithCycleCheck(exec->globalData(), jsValue.isObject() ? jsValue : jsNull()); } bool JSObjectHasProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName) @@ -341,10 +340,10 @@ void* JSObjectGetPrivate(JSObjectRef object) { JSObject* jsObject = toJS(object); - if (jsObject->inherits(&JSCallbackObject::info)) + if (jsObject->inherits(&JSCallbackObject::s_info)) return static_cast*>(jsObject)->getPrivate(); - else if (jsObject->inherits(&JSCallbackObject::info)) - return static_cast*>(jsObject)->getPrivate(); + if (jsObject->inherits(&JSCallbackObject::s_info)) + return static_cast*>(jsObject)->getPrivate(); return 0; } @@ -353,11 +352,12 @@ bool JSObjectSetPrivate(JSObjectRef object, void* data) { JSObject* jsObject = toJS(object); - if (jsObject->inherits(&JSCallbackObject::info)) { + if (jsObject->inherits(&JSCallbackObject::s_info)) { static_cast*>(jsObject)->setPrivate(data); return true; - } else if (jsObject->inherits(&JSCallbackObject::info)) { - static_cast*>(jsObject)->setPrivate(data); + } + if (jsObject->inherits(&JSCallbackObject::s_info)) { + static_cast*>(jsObject)->setPrivate(data); return true; } @@ -371,10 +371,10 @@ JSValueRef JSObjectGetPrivateProperty(JSContextRef ctx, JSObjectRef object, JSSt JSObject* jsObject = toJS(object); JSValue result; Identifier name(propertyName->identifier(&exec->globalData())); - if (jsObject->inherits(&JSCallbackObject::info)) + if (jsObject->inherits(&JSCallbackObject::s_info)) result = static_cast*>(jsObject)->getPrivateProperty(name); - else if (jsObject->inherits(&JSCallbackObject::info)) - result = static_cast*>(jsObject)->getPrivateProperty(name); + else if (jsObject->inherits(&JSCallbackObject::s_info)) + result = static_cast*>(jsObject)->getPrivateProperty(name); return toRef(exec, result); } @@ -383,14 +383,14 @@ bool JSObjectSetPrivateProperty(JSContextRef ctx, JSObjectRef object, JSStringRe ExecState* exec = toJS(ctx); APIEntryShim entryShim(exec); JSObject* jsObject = toJS(object); - JSValue jsValue = toJS(exec, value); + JSValue jsValue = value ? toJS(exec, value) : JSValue(); Identifier name(propertyName->identifier(&exec->globalData())); - if (jsObject->inherits(&JSCallbackObject::info)) { - static_cast*>(jsObject)->setPrivateProperty(name, jsValue); + if (jsObject->inherits(&JSCallbackObject::s_info)) { + static_cast*>(jsObject)->setPrivateProperty(exec->globalData(), name, jsValue); return true; } - if (jsObject->inherits(&JSCallbackObject::info)) { - static_cast*>(jsObject)->setPrivateProperty(name, jsValue); + if (jsObject->inherits(&JSCallbackObject::s_info)) { + static_cast*>(jsObject)->setPrivateProperty(exec->globalData(), name, jsValue); return true; } return false; @@ -402,12 +402,12 @@ bool JSObjectDeletePrivateProperty(JSContextRef ctx, JSObjectRef object, JSStrin APIEntryShim entryShim(exec); JSObject* jsObject = toJS(object); Identifier name(propertyName->identifier(&exec->globalData())); - if (jsObject->inherits(&JSCallbackObject::info)) { + if (jsObject->inherits(&JSCallbackObject::s_info)) { static_cast*>(jsObject)->deletePrivateProperty(name); return true; } - if (jsObject->inherits(&JSCallbackObject::info)) { - static_cast*>(jsObject)->deletePrivateProperty(name); + if (jsObject->inherits(&JSCallbackObject::s_info)) { + static_cast*>(jsObject)->deletePrivateProperty(name); return true; } return false; @@ -481,7 +481,9 @@ JSObjectRef JSObjectCallAsConstructor(JSContextRef ctx, JSObjectRef object, size return result; } -struct OpaqueJSPropertyNameArray : FastAllocBase { +struct OpaqueJSPropertyNameArray { + WTF_MAKE_FAST_ALLOCATED; +public: OpaqueJSPropertyNameArray(JSGlobalData* globalData) : refCount(0) , globalData(globalData) @@ -508,7 +510,7 @@ JSPropertyNameArrayRef JSObjectCopyPropertyNames(JSContextRef ctx, JSObjectRef o size_t size = array.size(); propertyNames->array.reserveInitialCapacity(size); for (size_t i = 0; i < size; ++i) - propertyNames->array.append(JSRetainPtr(Adopt, OpaqueJSString::create(array[i].ustring()).releaseRef())); + propertyNames->array.append(JSRetainPtr(Adopt, OpaqueJSString::create(array[i].ustring()).leakRef())); return JSPropertyNameArrayRetain(propertyNames); } diff --git a/API/JSRetainPtr.h b/API/JSRetainPtr.h index 69c6de1..08ef57c 100644 --- a/API/JSRetainPtr.h +++ b/API/JSRetainPtr.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005, 2006, 2007 Apple Inc. All rights reserved. + * Copyright (C) 2005, 2006, 2007, 2010 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,31 +29,31 @@ #ifndef JSRetainPtr_h #define JSRetainPtr_h +#include #include #include inline void JSRetain(JSStringRef string) { JSStringRetain(string); } inline void JSRelease(JSStringRef string) { JSStringRelease(string); } +inline void JSRetain(JSGlobalContextRef context) { JSGlobalContextRetain(context); } +inline void JSRelease(JSGlobalContextRef context) { JSGlobalContextRelease(context); } enum AdoptTag { Adopt }; -template class JSRetainPtr { +template class JSRetainPtr { public: - JSRetainPtr() : m_ptr(0) {} + JSRetainPtr() : m_ptr(0) { } JSRetainPtr(T ptr) : m_ptr(ptr) { if (ptr) JSRetain(ptr); } - JSRetainPtr(AdoptTag, T ptr) : m_ptr(ptr) { } - - JSRetainPtr(const JSRetainPtr& o) : m_ptr(o.m_ptr) { if (T ptr = m_ptr) JSRetain(ptr); } - - ~JSRetainPtr() { if (T ptr = m_ptr) JSRelease(ptr); } - - template JSRetainPtr(const JSRetainPtr& o) : m_ptr(o.get()) { if (T ptr = m_ptr) JSRetain(ptr); } + JSRetainPtr(const JSRetainPtr&); + template JSRetainPtr(const JSRetainPtr&); + ~JSRetainPtr(); T get() const { return m_ptr; } - T releaseRef() { T tmp = m_ptr; m_ptr = 0; return tmp; } - + void clear(); + T leakRef(); + T operator->() const { return m_ptr; } bool operator!() const { return !m_ptr; } @@ -63,19 +63,57 @@ public: operator UnspecifiedBoolType() const { return m_ptr ? &JSRetainPtr::m_ptr : 0; } JSRetainPtr& operator=(const JSRetainPtr&); - template JSRetainPtr& operator=(const JSRetainPtr&); + template JSRetainPtr& operator=(const JSRetainPtr&); JSRetainPtr& operator=(T); - template JSRetainPtr& operator=(U*); + template JSRetainPtr& operator=(U*); void adopt(T); void swap(JSRetainPtr&); + // FIXME: Remove releaseRef once we change all callers to call leakRef instead. + T releaseRef() { return leakRef(); } + private: T m_ptr; }; -template inline JSRetainPtr& JSRetainPtr::operator=(const JSRetainPtr& o) +template inline JSRetainPtr::JSRetainPtr(const JSRetainPtr& o) + : m_ptr(o.m_ptr) +{ + if (m_ptr) + JSRetain(m_ptr); +} + +template template inline JSRetainPtr::JSRetainPtr(const JSRetainPtr& o) + : m_ptr(o.get()) +{ + if (m_ptr) + JSRetain(m_ptr); +} + +template inline JSRetainPtr::~JSRetainPtr() +{ + if (m_ptr) + JSRelease(m_ptr); +} + +template inline void JSRetainPtr::clear() +{ + if (T ptr = m_ptr) { + m_ptr = 0; + JSRelease(ptr); + } +} + +template inline T JSRetainPtr::leakRef() +{ + T ptr = m_ptr; + m_ptr = 0; + return ptr; +} + +template inline JSRetainPtr& JSRetainPtr::operator=(const JSRetainPtr& o) { T optr = o.get(); if (optr) @@ -87,7 +125,7 @@ template inline JSRetainPtr& JSRetainPtr::operator=(const JSR return *this; } -template template inline JSRetainPtr& JSRetainPtr::operator=(const JSRetainPtr& o) +template template inline JSRetainPtr& JSRetainPtr::operator=(const JSRetainPtr& o) { T optr = o.get(); if (optr) @@ -99,7 +137,7 @@ template template inline JSRetainPtr& JSRetainPtr inline JSRetainPtr& JSRetainPtr::operator=(T optr) +template inline JSRetainPtr& JSRetainPtr::operator=(T optr) { if (optr) JSRetain(optr); @@ -110,7 +148,7 @@ template inline JSRetainPtr& JSRetainPtr::operator=(T optr) return *this; } -template inline void JSRetainPtr::adopt(T optr) +template inline void JSRetainPtr::adopt(T optr) { T ptr = m_ptr; m_ptr = optr; @@ -118,7 +156,7 @@ template inline void JSRetainPtr::adopt(T optr) JSRelease(ptr); } -template template inline JSRetainPtr& JSRetainPtr::operator=(U* optr) +template template inline JSRetainPtr& JSRetainPtr::operator=(U* optr) { if (optr) JSRetain(optr); @@ -129,42 +167,42 @@ template template inline JSRetainPtr& JSRetainPtr inline void JSRetainPtr::swap(JSRetainPtr& o) +template inline void JSRetainPtr::swap(JSRetainPtr& o) { std::swap(m_ptr, o.m_ptr); } -template inline void swap(JSRetainPtr& a, JSRetainPtr& b) +template inline void swap(JSRetainPtr& a, JSRetainPtr& b) { a.swap(b); } -template inline bool operator==(const JSRetainPtr& a, const JSRetainPtr& b) +template inline bool operator==(const JSRetainPtr& a, const JSRetainPtr& b) { return a.get() == b.get(); } -template inline bool operator==(const JSRetainPtr& a, U* b) +template inline bool operator==(const JSRetainPtr& a, U* b) { return a.get() == b; } -template inline bool operator==(T* a, const JSRetainPtr& b) +template inline bool operator==(T* a, const JSRetainPtr& b) { return a == b.get(); } -template inline bool operator!=(const JSRetainPtr& a, const JSRetainPtr& b) +template inline bool operator!=(const JSRetainPtr& a, const JSRetainPtr& b) { return a.get() != b.get(); } -template inline bool operator!=(const JSRetainPtr& a, U* b) +template inline bool operator!=(const JSRetainPtr& a, U* b) { return a.get() != b; } -template inline bool operator!=(T* a, const JSRetainPtr& b) +template inline bool operator!=(T* a, const JSRetainPtr& b) { return a != b.get(); } diff --git a/API/JSStringRef.cpp b/API/JSStringRef.cpp index 8e236e4..ea31da6 100644 --- a/API/JSStringRef.cpp +++ b/API/JSStringRef.cpp @@ -36,7 +36,7 @@ using namespace WTF::Unicode; JSStringRef JSStringCreateWithCharacters(const JSChar* chars, size_t numChars) { initializeThreading(); - return OpaqueJSString::create(chars, numChars).releaseRef(); + return OpaqueJSString::create(chars, numChars).leakRef(); } JSStringRef JSStringCreateWithUTF8CString(const char* string) @@ -47,11 +47,11 @@ JSStringRef JSStringCreateWithUTF8CString(const char* string) Vector buffer(length); UChar* p = buffer.data(); if (conversionOK == convertUTF8ToUTF16(&string, string + length, &p, p + length)) - return OpaqueJSString::create(buffer.data(), p - buffer.data()).releaseRef(); + return OpaqueJSString::create(buffer.data(), p - buffer.data()).leakRef(); } // Null string. - return OpaqueJSString::create().releaseRef(); + return OpaqueJSString::create().leakRef(); } JSStringRef JSStringRetain(JSStringRef string) diff --git a/API/JSStringRef.h b/API/JSStringRef.h index 51871b1..c5c1544 100644 --- a/API/JSStringRef.h +++ b/API/JSStringRef.h @@ -38,7 +38,7 @@ extern "C" { #endif #if !defined(WIN32) && !defined(_WIN32) && !defined(__WINSCW__) \ - && !((defined(__CC_ARM) || defined(__ARMCC__)) && defined(__SYMBIAN32__)) /* RVCT */ + && !((defined(__CC_ARM) || defined(__ARMCC__)) && !defined(__linux__)) /* RVCT */ /*! @typedef JSChar @abstract A Unicode character. diff --git a/API/JSStringRefBSTR.cpp b/API/JSStringRefBSTR.cpp index a7d3e99..70f4254 100644 --- a/API/JSStringRefBSTR.cpp +++ b/API/JSStringRefBSTR.cpp @@ -24,7 +24,7 @@ * 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 "JSStringRefBSTR.h" diff --git a/API/JSStringRefCF.cpp b/API/JSStringRefCF.cpp index d1f6fe3..0877a13 100644 --- a/API/JSStringRefCF.cpp +++ b/API/JSStringRefCF.cpp @@ -42,12 +42,12 @@ JSStringRef JSStringCreateWithCFString(CFStringRef string) // it can hold. () size_t length = CFStringGetLength(string); if (length) { - OwnArrayPtr buffer(new UniChar[length]); + OwnArrayPtr buffer = adoptArrayPtr(new UniChar[length]); CFStringGetCharacters(string, CFRangeMake(0, length), buffer.get()); COMPILE_ASSERT(sizeof(UniChar) == sizeof(UChar), unichar_and_uchar_must_be_same_size); - return OpaqueJSString::create(reinterpret_cast(buffer.get()), length).releaseRef(); + return OpaqueJSString::create(reinterpret_cast(buffer.get()), length).leakRef(); } else { - return OpaqueJSString::create(0, 0).releaseRef(); + return OpaqueJSString::create(0, 0).leakRef(); } } diff --git a/API/JSValueRef.cpp b/API/JSValueRef.cpp index 905dcbf..d1603e2 100644 --- a/API/JSValueRef.cpp +++ b/API/JSValueRef.cpp @@ -129,10 +129,10 @@ bool JSValueIsObjectOfClass(JSContextRef ctx, JSValueRef value, JSClassRef jsCla JSValue jsValue = toJS(exec, value); if (JSObject* o = jsValue.getObject()) { - if (o->inherits(&JSCallbackObject::info)) + if (o->inherits(&JSCallbackObject::s_info)) return static_cast*>(o)->inherits(jsClass); - else if (o->inherits(&JSCallbackObject::info)) - return static_cast*>(o)->inherits(jsClass); + if (o->inherits(&JSCallbackObject::s_info)) + return static_cast*>(o)->inherits(jsClass); } return false; } @@ -219,7 +219,7 @@ JSValueRef JSValueMakeNumber(JSContextRef ctx, double value) if (isnan(value)) value = NaN; - return toRef(exec, jsNumber(exec, value)); + return toRef(exec, jsNumber(value)); } JSValueRef JSValueMakeString(JSContextRef ctx, JSStringRef string) @@ -234,7 +234,8 @@ JSValueRef JSValueMakeFromJSONString(JSContextRef ctx, JSStringRef string) { ExecState* exec = toJS(ctx); APIEntryShim entryShim(exec); - LiteralParser parser(exec, string->ustring(), LiteralParser::StrictJSON); + UString str = string->ustring(); + LiteralParser parser(exec, str.characters(), str.length(), LiteralParser::StrictJSON); return toRef(exec, parser.tryLiteralParse()); } @@ -252,7 +253,7 @@ JSStringRef JSValueCreateJSONString(JSContextRef ctx, JSValueRef apiValue, unsig exec->clearException(); return 0; } - return OpaqueJSString::create(result).releaseRef(); + return OpaqueJSString::create(result).leakRef(); } bool JSValueToBoolean(JSContextRef ctx, JSValueRef value) @@ -295,7 +296,7 @@ JSStringRef JSValueToStringCopy(JSContextRef ctx, JSValueRef value, JSValueRef* exec->clearException(); stringRef.clear(); } - return stringRef.release().releaseRef(); + return stringRef.release().leakRef(); } JSObjectRef JSValueToObject(JSContextRef ctx, JSValueRef value, JSValueRef* exception) diff --git a/API/JSWeakObjectMapRefInternal.h b/API/JSWeakObjectMapRefInternal.h index 64e1f4d..f7b91da 100644 --- a/API/JSWeakObjectMapRefInternal.h +++ b/API/JSWeakObjectMapRefInternal.h @@ -37,7 +37,7 @@ class JSObject; typedef void (*JSWeakMapDestroyedCallback)(struct OpaqueJSWeakObjectMap*, void*); -typedef JSC::WeakGCMap WeakMapType; +typedef JSC::WeakGCMap WeakMapType; struct OpaqueJSWeakObjectMap : public RefCounted { public: diff --git a/API/JSWeakObjectMapRefPrivate.cpp b/API/JSWeakObjectMapRefPrivate.cpp index 7e6bb63..13900cf 100644 --- a/API/JSWeakObjectMapRefPrivate.cpp +++ b/API/JSWeakObjectMapRefPrivate.cpp @@ -32,7 +32,6 @@ #include "JSValue.h" #include "JSWeakObjectMapRefInternal.h" #include -#include #include using namespace WTF; @@ -58,8 +57,8 @@ void JSWeakObjectMapSet(JSContextRef ctx, JSWeakObjectMapRef map, void* key, JSO JSObject* obj = toJS(object); if (!obj) return; - ASSERT(obj->inherits(&JSCallbackObject::info) || obj->inherits(&JSCallbackObject::info)); - map->map().set(key, obj); + ASSERT(obj->inherits(&JSCallbackObject::s_info) || obj->inherits(&JSCallbackObject::s_info)); + map->map().set(exec->globalData(), key, obj); } JSObjectRef JSWeakObjectMapGet(JSContextRef ctx, JSWeakObjectMapRef map, void* key) @@ -69,14 +68,18 @@ JSObjectRef JSWeakObjectMapGet(JSContextRef ctx, JSWeakObjectMapRef map, void* k return toRef(static_cast(map->map().get(key))); } -bool JSWeakObjectMapClear(JSContextRef ctx, JSWeakObjectMapRef map, void* key, JSObjectRef object) +void JSWeakObjectMapRemove(JSContextRef ctx, JSWeakObjectMapRef map, void* key) { ExecState* exec = toJS(ctx); APIEntryShim entryShim(exec); - JSObject* obj = toJS(object); - if (map->map().uncheckedRemove(key, obj)) - return true; - return false; + map->map().take(key); +} + +// We need to keep this function in the build to keep the nightlies running. +JS_EXPORT bool JSWeakObjectMapClear(JSContextRef, JSWeakObjectMapRef, void*, JSObjectRef); +bool JSWeakObjectMapClear(JSContextRef, JSWeakObjectMapRef, void*, JSObjectRef) +{ + return true; } #ifdef __cplusplus diff --git a/API/JSWeakObjectMapRefPrivate.h b/API/JSWeakObjectMapRefPrivate.h index d36111c..5a07cf7 100644 --- a/API/JSWeakObjectMapRefPrivate.h +++ b/API/JSWeakObjectMapRefPrivate.h @@ -52,8 +52,7 @@ typedef void (*JSWeakMapDestroyedCallback)(JSWeakObjectMapRef map, void* data); @param destructor A function to call when the weak map is destroyed. @result A JSWeakObjectMapRef bound to the given context, data and destructor. @discussion The JSWeakObjectMapRef can be used as a storage mechanism to hold custom JS objects without forcing those objects to - remain live as JSValueProtect would. Any objects that are intended to be stored in a weak map must be user defined objects that - remove themselves from the map in their finalizer. + remain live as JSValueProtect would. */ JS_EXPORT JSWeakObjectMapRef JSWeakObjectMapCreate(JSContextRef ctx, void* data, JSWeakMapDestroyedCallback destructor); @@ -79,14 +78,12 @@ JS_EXPORT JSObjectRef JSWeakObjectMapGet(JSContextRef ctx, JSWeakObjectMapRef ma /*! @function - @abstract Clears the association between a key and an object in a JSWeakObjectMapRef + @abstract Removes the entry for the given key if the key is present, otherwise it has no effect. @param ctx The execution context to use. - @param map The map to clear the key association from. - @param key The key to use. - @param object The old object value. - @result Returns true if the key/object association was present in map, and has been removed. + @param map The map to use. + @param key The key to remove. */ -JS_EXPORT bool JSWeakObjectMapClear(JSContextRef ctx, JSWeakObjectMapRef map, void* key, JSObjectRef object); +JS_EXPORT void JSWeakObjectMapRemove(JSContextRef ctx, JSWeakObjectMapRef map, void* key); #ifdef __cplusplus } diff --git a/API/OpaqueJSString.cpp b/API/OpaqueJSString.cpp index f740abe..9a116e6 100644 --- a/API/OpaqueJSString.cpp +++ b/API/OpaqueJSString.cpp @@ -35,7 +35,7 @@ using namespace JSC; PassRefPtr OpaqueJSString::create(const UString& ustring) { if (!ustring.isNull()) - return adoptRef(new OpaqueJSString(ustring.data(), ustring.size())); + return adoptRef(new OpaqueJSString(ustring.characters(), ustring.length())); return 0; } @@ -43,7 +43,7 @@ UString OpaqueJSString::ustring() const { if (this && m_characters) return UString(m_characters, m_length); - return UString::null(); + return UString(); } Identifier OpaqueJSString::identifier(JSGlobalData* globalData) const diff --git a/API/OpaqueJSString.h b/API/OpaqueJSString.h index 473c815..69c0962 100644 --- a/API/OpaqueJSString.h +++ b/API/OpaqueJSString.h @@ -33,7 +33,7 @@ namespace JSC { class JSGlobalData; } -struct OpaqueJSString : public ThreadSafeShared { +struct OpaqueJSString : public ThreadSafeRefCounted { static PassRefPtr create() // null { @@ -54,7 +54,7 @@ struct OpaqueJSString : public ThreadSafeShared { JSC::Identifier identifier(JSC::JSGlobalData*) const; private: - friend class WTF::ThreadSafeShared; + friend class WTF::ThreadSafeRefCounted; OpaqueJSString() : m_characters(0) diff --git a/API/tests/testapi.c b/API/tests/testapi.c index 28b4ec8..e82d41d 100644 --- a/API/tests/testapi.c +++ b/API/tests/testapi.c @@ -32,6 +32,10 @@ #include #include +#if OS(WINDOWS) +#include +#endif + #if COMPILER(MSVC) #include @@ -307,8 +311,19 @@ static JSValueRef MyObject_convertToType(JSContextRef context, JSObjectRef objec return JSValueMakeNull(context); } +static bool MyObject_set_nullGetForwardSet(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef value, JSValueRef* exception) +{ + UNUSED_PARAM(ctx); + UNUSED_PARAM(object); + UNUSED_PARAM(propertyName); + UNUSED_PARAM(value); + UNUSED_PARAM(exception); + return false; // Forward to parent class. +} + static JSStaticValue evilStaticValues[] = { { "nullGetSet", 0, 0, kJSPropertyAttributeNone }, + { "nullGetForwardSet", 0, MyObject_set_nullGetForwardSet, kJSPropertyAttributeNone }, { 0, 0, 0, 0 } }; @@ -351,6 +366,111 @@ static JSClassRef MyObject_class(JSContextRef context) return jsClass; } +static JSValueRef PropertyCatchalls_getProperty(JSContextRef context, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception) +{ + UNUSED_PARAM(context); + UNUSED_PARAM(object); + UNUSED_PARAM(propertyName); + UNUSED_PARAM(exception); + + if (JSStringIsEqualToUTF8CString(propertyName, "x")) { + static size_t count; + if (count++ < 5) + return NULL; + + // Swallow all .x gets after 5, returning null. + return JSValueMakeNull(context); + } + + if (JSStringIsEqualToUTF8CString(propertyName, "y")) { + static size_t count; + if (count++ < 5) + return NULL; + + // Swallow all .y gets after 5, returning null. + return JSValueMakeNull(context); + } + + if (JSStringIsEqualToUTF8CString(propertyName, "z")) { + static size_t count; + if (count++ < 5) + return NULL; + + // Swallow all .y gets after 5, returning null. + return JSValueMakeNull(context); + } + + return NULL; +} + +static bool PropertyCatchalls_setProperty(JSContextRef context, JSObjectRef object, JSStringRef propertyName, JSValueRef value, JSValueRef* exception) +{ + UNUSED_PARAM(context); + UNUSED_PARAM(object); + UNUSED_PARAM(propertyName); + UNUSED_PARAM(value); + UNUSED_PARAM(exception); + + if (JSStringIsEqualToUTF8CString(propertyName, "x")) { + static size_t count; + if (count++ < 5) + return false; + + // Swallow all .x sets after 4. + return true; + } + + return false; +} + +static void PropertyCatchalls_getPropertyNames(JSContextRef context, JSObjectRef object, JSPropertyNameAccumulatorRef propertyNames) +{ + UNUSED_PARAM(context); + UNUSED_PARAM(object); + + static size_t count; + static const char* numbers[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }; + + // Provide a property of a different name every time. + JSStringRef propertyName = JSStringCreateWithUTF8CString(numbers[count++ % 10]); + JSPropertyNameAccumulatorAddName(propertyNames, propertyName); + JSStringRelease(propertyName); +} + +JSClassDefinition PropertyCatchalls_definition = { + 0, + kJSClassAttributeNone, + + "PropertyCatchalls", + NULL, + + NULL, + NULL, + + NULL, + NULL, + NULL, + PropertyCatchalls_getProperty, + PropertyCatchalls_setProperty, + NULL, + PropertyCatchalls_getPropertyNames, + NULL, + NULL, + NULL, + NULL, +}; + +static JSClassRef PropertyCatchalls_class(JSContextRef context) +{ + UNUSED_PARAM(context); + + static JSClassRef jsClass; + if (!jsClass) + jsClass = JSClassCreate(&PropertyCatchalls_definition); + + return jsClass; +} + static bool EvilExceptionObject_hasInstance(JSContextRef context, JSObjectRef constructor, JSValueRef possibleValue, JSValueRef* exception) { UNUSED_PARAM(context); @@ -764,8 +884,68 @@ static void makeGlobalNumberValue(JSContextRef context) { v = NULL; } +static bool assertTrue(bool value, const char* message) +{ + if (!value) { + if (message) + fprintf(stderr, "assertTrue failed: '%s'\n", message); + else + fprintf(stderr, "assertTrue failed.\n"); + failed = 1; + } + return value; +} + +static bool checkForCycleInPrototypeChain() +{ + bool result = true; + JSGlobalContextRef context = JSGlobalContextCreate(0); + JSObjectRef object1 = JSObjectMake(context, /* jsClass */ 0, /* data */ 0); + JSObjectRef object2 = JSObjectMake(context, /* jsClass */ 0, /* data */ 0); + JSObjectRef object3 = JSObjectMake(context, /* jsClass */ 0, /* data */ 0); + + JSObjectSetPrototype(context, object1, JSValueMakeNull(context)); + ASSERT(JSValueIsNull(context, JSObjectGetPrototype(context, object1))); + + // object1 -> object1 + JSObjectSetPrototype(context, object1, object1); + result &= assertTrue(JSValueIsNull(context, JSObjectGetPrototype(context, object1)), "It is possible to assign self as a prototype"); + + // object1 -> object2 -> object1 + JSObjectSetPrototype(context, object2, object1); + ASSERT(JSValueIsStrictEqual(context, JSObjectGetPrototype(context, object2), object1)); + JSObjectSetPrototype(context, object1, object2); + result &= assertTrue(JSValueIsNull(context, JSObjectGetPrototype(context, object1)), "It is possible to close a prototype chain cycle"); + + // object1 -> object2 -> object3 -> object1 + JSObjectSetPrototype(context, object2, object3); + ASSERT(JSValueIsStrictEqual(context, JSObjectGetPrototype(context, object2), object3)); + JSObjectSetPrototype(context, object1, object2); + ASSERT(JSValueIsStrictEqual(context, JSObjectGetPrototype(context, object1), object2)); + JSObjectSetPrototype(context, object3, object1); + result &= assertTrue(!JSValueIsStrictEqual(context, JSObjectGetPrototype(context, object3), object1), "It is possible to close a prototype chain cycle"); + + JSValueRef exception; + JSStringRef code = JSStringCreateWithUTF8CString("o = { }; p = { }; o.__proto__ = p; p.__proto__ = o"); + JSStringRef file = JSStringCreateWithUTF8CString(""); + result &= assertTrue(!JSEvaluateScript(context, code, /* thisObject*/ 0, file, 1, &exception) + , "An exception should be thrown"); + + JSStringRelease(code); + JSStringRelease(file); + JSGlobalContextRelease(context); + return result; +} + int main(int argc, char* argv[]) { +#if OS(WINDOWS) + // Cygwin calls ::SetErrorMode(SEM_FAILCRITICALERRORS), which we will inherit. This is bad for + // testing/debugging, as it causes the post-mortem debugger not to be invoked. We reset the + // error mode here to work around Cygwin's behavior. See . + ::SetErrorMode(0); +#endif + const char *scriptPath = "testapi.js"; if (argc > 1) { scriptPath = argv[1]; @@ -858,6 +1038,11 @@ int main(int argc, char* argv[]) ASSERT(JSValueGetType(context, jsCFEmptyString) == kJSTypeString); ASSERT(JSValueGetType(context, jsCFEmptyStringWithCharacters) == kJSTypeString); + JSObjectRef propertyCatchalls = JSObjectMake(context, PropertyCatchalls_class(context), NULL); + JSStringRef propertyCatchallsString = JSStringCreateWithUTF8CString("PropertyCatchalls"); + JSObjectSetProperty(context, globalObject, propertyCatchallsString, propertyCatchalls, kJSPropertyAttributeNone, NULL); + JSStringRelease(propertyCatchallsString); + JSObjectRef myObject = JSObjectMake(context, MyObject_class(context), NULL); JSStringRef myObjectIString = JSStringCreateWithUTF8CString("MyObject"); JSObjectSetProperty(context, globalObject, myObjectIString, myObject, kJSPropertyAttributeNone, NULL); @@ -874,21 +1059,21 @@ int main(int argc, char* argv[]) JSStringRelease(EmptyObjectIString); JSStringRef lengthStr = JSStringCreateWithUTF8CString("length"); - aHeapRef = JSObjectMakeArray(context, 0, 0, 0); + JSObjectRef aStackRef = JSObjectMakeArray(context, 0, 0, 0); + aHeapRef = aStackRef; JSObjectSetProperty(context, aHeapRef, lengthStr, JSValueMakeNumber(context, 10), 0, 0); JSStringRef privatePropertyName = JSStringCreateWithUTF8CString("privateProperty"); if (!JSObjectSetPrivateProperty(context, myObject, privatePropertyName, aHeapRef)) { printf("FAIL: Could not set private property.\n"); - failed = 1; - } else { + failed = 1; + } else printf("PASS: Set private property.\n"); - } + aStackRef = 0; if (JSObjectSetPrivateProperty(context, aHeapRef, privatePropertyName, aHeapRef)) { printf("FAIL: JSObjectSetPrivateProperty should fail on non-API objects.\n"); - failed = 1; - } else { + failed = 1; + } else printf("PASS: Did not allow JSObjectSetPrivateProperty on a non-API object.\n"); - } if (JSObjectGetPrivateProperty(context, myObject, privatePropertyName) != aHeapRef) { printf("FAIL: Could not retrieve private property.\n"); failed = 1; @@ -899,25 +1084,37 @@ int main(int argc, char* argv[]) failed = 1; } else printf("PASS: JSObjectGetPrivateProperty return NULL.\n"); - + if (JSObjectGetProperty(context, myObject, privatePropertyName, 0) == aHeapRef) { printf("FAIL: Accessed private property through ordinary property lookup.\n"); failed = 1; } else printf("PASS: Cannot access private property through ordinary property lookup.\n"); - + JSGarbageCollect(context); - + for (int i = 0; i < 10000; i++) JSObjectMake(context, 0, 0); + aHeapRef = JSValueToObject(context, JSObjectGetPrivateProperty(context, myObject, privatePropertyName), 0); if (JSValueToNumber(context, JSObjectGetProperty(context, aHeapRef, lengthStr, 0), 0) != 10) { printf("FAIL: Private property has been collected.\n"); failed = 1; } else printf("PASS: Private property does not appear to have been collected.\n"); JSStringRelease(lengthStr); - + + if (!JSObjectSetPrivateProperty(context, myObject, privatePropertyName, 0)) { + printf("FAIL: Could not set private property to NULL.\n"); + failed = 1; + } else + printf("PASS: Set private property to NULL.\n"); + if (JSObjectGetPrivateProperty(context, myObject, privatePropertyName)) { + printf("FAIL: Could not retrieve private property.\n"); + failed = 1; + } else + printf("PASS: Retrieved private property.\n"); + JSStringRef validJSON = JSStringCreateWithUTF8CString("{\"aProperty\":true}"); JSValueRef jsonObject = JSValueMakeFromJSONString(context, validJSON); JSStringRelease(validJSON); @@ -1346,6 +1543,13 @@ int main(int argc, char* argv[]) printf("PASS: Infinite prototype chain does not occur.\n"); + if (checkForCycleInPrototypeChain()) + printf("PASS: A cycle in a prototype chain can't be created.\n"); + else { + printf("FAIL: A cycle in a prototype chain can be created.\n"); + failed = true; + } + if (failed) { printf("FAIL: Some tests failed.\n"); return 1; diff --git a/API/tests/testapi.js b/API/tests/testapi.js index 15c9e50..61d4533 100644 --- a/API/tests/testapi.js +++ b/API/tests/testapi.js @@ -94,6 +94,9 @@ shouldBe("MyObject('throwOnCall')", "an exception"); shouldBe("new MyObject('throwOnConstruct')", "an exception"); shouldBe("'throwOnHasInstance' instanceof MyObject", "an exception"); +MyObject.nullGetForwardSet = 1; +shouldBe("MyObject.nullGetForwardSet", 1); + var foundMyPropertyName = false; var foundRegularType = false; for (var p in MyObject) { @@ -162,8 +165,8 @@ shouldBe("constructedObject.value", 1); shouldBe("myObject instanceof MyObject", true); shouldBe("(new Object()) instanceof MyObject", false); -shouldThrow("MyObject.nullGetSet = 1"); -shouldThrow("MyObject.nullGetSet"); +MyObject.nullGetSet = 1; +shouldBe("MyObject.nullGetSet", 1); shouldThrow("MyObject.nullCall()"); shouldThrow("MyObject.hasPropertyLie"); @@ -246,6 +249,32 @@ shouldThrow("String(EvilExceptionObject)"); shouldBe("EmptyObject", "[object CallbackObject]"); +for (var i = 0; i < 6; ++i) + PropertyCatchalls.x = i; +shouldBe("PropertyCatchalls.x", 4); + +for (var i = 0; i < 6; ++i) + var x = PropertyCatchalls.x; +shouldBe("x", null); + +for (var i = 0; i < 10; ++i) { + for (var p in PropertyCatchalls) { + if (p == "x") + continue; + shouldBe("p", i % 10); + break; + } +} + +PropertyCatchalls.__proto__ = { y: 1 }; +for (var i = 0; i < 6; ++i) + var y = PropertyCatchalls.y; +shouldBe("y", null); + +var o = { __proto__: PropertyCatchalls }; +for (var i = 0; i < 6; ++i) + var z = PropertyCatchalls.z; +shouldBe("z", null); + if (failed) throw "Some tests failed"; - diff --git a/Android.mk b/Android.mk deleted file mode 100644 index 1b5da02..0000000 --- a/Android.mk +++ /dev/null @@ -1,229 +0,0 @@ -## -## Copyright 2009, The Android Open Source Project -## -## Redistribution and use in source and binary forms, with or without -## modification, are permitted provided that the following conditions -## are met: -## * Redistributions of source code must retain the above copyright -## notice, this list of conditions and the following disclaimer. -## * 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 THE COPYRIGHT HOLDERS ``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. -## - -LOCAL_SRC_FILES := \ - API/JSValueRef.cpp \ - API/JSCallbackObject.cpp \ - API/OpaqueJSString.cpp \ - \ - bytecode/CodeBlock.cpp \ - bytecode/JumpTable.cpp \ - bytecode/Opcode.cpp \ - bytecode/SamplingTool.cpp \ - bytecode/StructureStubInfo.cpp \ - \ - bytecompiler/BytecodeGenerator.cpp \ - bytecompiler/NodesCodegen.cpp \ - \ - debugger/Debugger.cpp \ - debugger/DebuggerActivation.cpp \ - debugger/DebuggerCallFrame.cpp \ - \ - interpreter/CallFrame.cpp \ - interpreter/Interpreter.cpp \ - interpreter/RegisterFile.cpp \ - \ - jit/ExecutableAllocator.cpp\ - jit/ExecutableAllocatorFixedVMPool.cpp \ - jit/ExecutableAllocatorPosix.cpp \ - jit/JIT.cpp \ - jit/JITArithmetic.cpp \ - jit/JITCall.cpp \ - jit/JITOpcodes.cpp \ - jit/JITPropertyAccess.cpp \ - jit/JITStubs.cpp \ - \ - parser/Lexer.cpp \ - parser/Nodes.cpp \ - parser/Parser.cpp \ - parser/ParserArena.cpp \ - \ - pcre/pcre_compile.cpp \ - pcre/pcre_exec.cpp \ - pcre/pcre_tables.cpp \ - pcre/pcre_ucp_searchfuncs.cpp \ - pcre/pcre_xclass.cpp \ - \ - profiler/Profile.cpp \ - profiler/ProfileGenerator.cpp \ - profiler/ProfileNode.cpp \ - profiler/Profiler.cpp \ - \ - runtime/ArgList.cpp \ - runtime/Arguments.cpp \ - runtime/ArrayConstructor.cpp \ - runtime/ArrayPrototype.cpp \ - runtime/BooleanConstructor.cpp \ - runtime/BooleanObject.cpp \ - runtime/BooleanPrototype.cpp \ - runtime/CallData.cpp \ - runtime/Collector.cpp \ - runtime/CommonIdentifiers.cpp \ - runtime/Completion.cpp \ - runtime/ConstructData.cpp \ - runtime/DateConstructor.cpp \ - runtime/DateConversion.cpp \ - runtime/DateInstance.cpp \ - runtime/DatePrototype.cpp \ - runtime/Error.cpp \ - runtime/ErrorConstructor.cpp \ - runtime/ErrorInstance.cpp \ - runtime/ErrorPrototype.cpp \ - runtime/ExceptionHelpers.cpp \ - runtime/Executable.cpp \ - runtime/FunctionConstructor.cpp \ - runtime/FunctionPrototype.cpp \ - runtime/GetterSetter.cpp \ - runtime/GlobalEvalFunction.cpp \ - runtime/Identifier.cpp \ - runtime/InitializeThreading.cpp \ - runtime/InternalFunction.cpp \ - runtime/JSAPIValueWrapper.cpp \ - runtime/JSActivation.cpp \ - runtime/JSArray.cpp \ - runtime/JSByteArray.cpp \ - runtime/JSCell.cpp \ - runtime/JSFunction.cpp \ - runtime/JSGlobalData.cpp \ - runtime/JSGlobalObject.cpp \ - runtime/JSGlobalObjectFunctions.cpp \ - runtime/JSImmediate.cpp \ - runtime/JSLock.cpp \ - runtime/JSNotAnObject.cpp \ - runtime/JSNumberCell.cpp \ - runtime/JSONObject.cpp \ - runtime/JSObject.cpp \ - runtime/JSPropertyNameIterator.cpp \ - runtime/JSStaticScopeObject.cpp \ - runtime/JSString.cpp \ - runtime/JSValue.cpp \ - runtime/JSVariableObject.cpp \ - runtime/JSWrapperObject.cpp \ - runtime/LiteralParser.cpp \ - runtime/Lookup.cpp \ - runtime/MarkStack.cpp \ - runtime/MarkStackPosix.cpp \ - runtime/MathObject.cpp \ - runtime/NativeErrorConstructor.cpp \ - runtime/NativeErrorPrototype.cpp \ - runtime/NumberConstructor.cpp \ - runtime/NumberObject.cpp \ - runtime/NumberPrototype.cpp \ - runtime/ObjectConstructor.cpp \ - runtime/ObjectPrototype.cpp \ - runtime/Operations.cpp \ - runtime/PropertyDescriptor.cpp \ - runtime/PropertyNameArray.cpp \ - runtime/PropertySlot.cpp \ - runtime/PrototypeFunction.cpp \ - runtime/RegExp.cpp \ - runtime/RegExpConstructor.cpp \ - runtime/RegExpObject.cpp \ - runtime/RegExpPrototype.cpp \ - runtime/ScopeChain.cpp \ - runtime/SmallStrings.cpp \ - runtime/StringConstructor.cpp \ - runtime/StringObject.cpp \ - runtime/StringPrototype.cpp \ - runtime/Structure.cpp \ - runtime/StructureChain.cpp \ - runtime/TimeoutChecker.cpp \ - runtime/UString.cpp \ - \ - wtf/Assertions.cpp \ - wtf/ByteArray.cpp \ - wtf/CurrentTime.cpp \ - wtf/DateMath.cpp \ - wtf/FastMalloc.cpp \ - wtf/HashTable.cpp \ - wtf/MainThread.cpp \ - wtf/RandomNumber.cpp \ - wtf/RefCountedLeakCounter.cpp \ - wtf/TCSystemAlloc.cpp \ - wtf/ThreadIdentifierDataPthreads.cpp \ - wtf/Threading.cpp \ - wtf/ThreadingPthreads.cpp \ - wtf/WTFThreadData.cpp \ - \ - wtf/TypeTraits.cpp \ - wtf/dtoa.cpp \ - \ - wtf/android/MainThreadAndroid.cpp \ - \ - wtf/text/AtomicString.cpp \ - wtf/text/CString.cpp \ - wtf/text/StringImpl.cpp \ - wtf/text/WTFString.cpp \ - \ - wtf/unicode/CollatorDefault.cpp \ - wtf/unicode/UTF8.cpp \ - \ - wtf/unicode/icu/CollatorICU.cpp \ - \ - yarr/RegexCompiler.cpp \ - yarr/RegexInterpreter.cpp \ - yarr/RegexJIT.cpp - -# Rule to build grammar.y with our custom bison. -GEN := $(intermediates)/parser/Grammar.cpp -$(GEN) : PRIVATE_YACCFLAGS := -p jscyy -$(GEN) : $(LOCAL_PATH)/parser/Grammar.y - $(call local-transform-y-to-cpp,.cpp) -$(GEN) : $(LOCAL_BISON) -LOCAL_GENERATED_SOURCES += $(GEN) - -# generated headers -JSC_OBJECTS := $(addprefix $(intermediates)/runtime/, \ - ArrayPrototype.lut.h \ - DatePrototype.lut.h \ - JSONObject.lut.h \ - MathObject.lut.h \ - NumberConstructor.lut.h \ - RegExpConstructor.lut.h \ - RegExpObject.lut.h \ - StringPrototype.lut.h \ - ) -$(JSC_OBJECTS): PRIVATE_PATH := $(LOCAL_PATH) -$(JSC_OBJECTS): PRIVATE_CUSTOM_TOOL = perl $(PRIVATE_PATH)/create_hash_table $< -i > $@ -$(JSC_OBJECTS): $(LOCAL_PATH)/create_hash_table -$(JSC_OBJECTS): $(intermediates)/%.lut.h : $(LOCAL_PATH)/%.cpp - $(transform-generated-source) - - -LEXER_HEADER := $(intermediates)/Lexer.lut.h -$(LEXER_HEADER): PRIVATE_PATH := $(LOCAL_PATH) -$(LEXER_HEADER): PRIVATE_CUSTOM_TOOL = perl $(PRIVATE_PATH)/create_hash_table $< -i > $@ -$(LEXER_HEADER): $(LOCAL_PATH)/create_hash_table -$(LEXER_HEADER): $(intermediates)/%.lut.h : $(LOCAL_PATH)/parser/Keywords.table - $(transform-generated-source) - -CHARTABLES := $(intermediates)/chartables.c -$(CHARTABLES): PRIVATE_PATH := $(LOCAL_PATH) -$(CHARTABLES): PRIVATE_CUSTOM_TOOL = perl $(PRIVATE_PATH)/pcre/dftables $@ -$(CHARTABLES): $(LOCAL_PATH)/pcre/dftables -$(CHARTABLES): $(LOCAL_PATH)/pcre/pcre_internal.h - $(transform-generated-source) - -LOCAL_GENERATED_SOURCES += $(JSC_OBJECTS) $(LEXER_HEADER) $(CHARTABLES) diff --git a/Android.v8.wtf.mk b/Android.v8.wtf.mk deleted file mode 100644 index 9249e47..0000000 --- a/Android.v8.wtf.mk +++ /dev/null @@ -1,75 +0,0 @@ -## -## Copyright 2009, The Android Open Source Project -## -## Redistribution and use in source and binary forms, with or without -## modification, are permitted provided that the following conditions -## are met: -## * Redistributions of source code must retain the above copyright -## notice, this list of conditions and the following disclaimer. -## * 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 THE COPYRIGHT HOLDERS ``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. -## - -# wtf source files - -LOCAL_SRC_FILES := \ - pcre/pcre_compile.cpp \ - pcre/pcre_exec.cpp \ - pcre/pcre_tables.cpp \ - pcre/pcre_ucp_searchfuncs.cpp \ - pcre/pcre_xclass.cpp \ - \ - wtf/Assertions.cpp \ - wtf/ByteArray.cpp \ - wtf/CurrentTime.cpp \ - wtf/DateMath.cpp \ - wtf/FastMalloc.cpp \ - wtf/HashTable.cpp \ - wtf/MainThread.cpp \ - wtf/RandomNumber.cpp \ - wtf/RefCountedLeakCounter.cpp \ - wtf/TCSystemAlloc.cpp \ - wtf/ThreadIdentifierDataPthreads.cpp \ - wtf/Threading.cpp \ - wtf/ThreadingPthreads.cpp \ - wtf/WTFThreadData.cpp \ - \ - wtf/TypeTraits.cpp \ - wtf/dtoa.cpp \ - \ - wtf/android/MainThreadAndroid.cpp \ - \ - wtf/text/AtomicString.cpp \ - wtf/text/CString.cpp \ - wtf/text/StringImpl.cpp \ - wtf/text/WTFString.cpp \ - \ - wtf/unicode/CollatorDefault.cpp \ - wtf/unicode/UTF8.cpp \ - \ - wtf/unicode/icu/CollatorICU.cpp - -CHARTABLES := $(intermediates)/chartables.c -$(CHARTABLES): PRIVATE_PATH := $(LOCAL_PATH) -$(CHARTABLES): PRIVATE_CUSTOM_TOOL = perl $(PRIVATE_PATH)/pcre/dftables $@ -$(CHARTABLES): $(LOCAL_PATH)/pcre/dftables -$(CHARTABLES): $(LOCAL_PATH)/pcre/pcre_internal.h - $(transform-generated-source) - -$(intermediates)/pcre/pcre_tables.o : $(CHARTABLES) - -# We do not add $(CHARTABLES) to LOCAL_GENERATED_SOURCES because the chartables.c file -# is explicitly #included in pcre_tables.cpp. diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..870b15e --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,266 @@ +SET(JavaScriptCore_INCLUDE_DIRECTORIES + "${CMAKE_BINARY_DIR}" + "${JAVASCRIPTCORE_DIR}" + "${JAVASCRIPTCORE_DIR}/API" + "${JAVASCRIPTCORE_DIR}/ForwardingHeaders" + "${JAVASCRIPTCORE_DIR}/assembler" + "${JAVASCRIPTCORE_DIR}/bytecode" + "${JAVASCRIPTCORE_DIR}/bytecompiler" + "${JAVASCRIPTCORE_DIR}/heap" + "${JAVASCRIPTCORE_DIR}/debugger" + "${JAVASCRIPTCORE_DIR}/interpreter" + "${JAVASCRIPTCORE_DIR}/jit" + "${JAVASCRIPTCORE_DIR}/parser" + "${JAVASCRIPTCORE_DIR}/profiler" + "${JAVASCRIPTCORE_DIR}/runtime" + "${JAVASCRIPTCORE_DIR}/yarr" + "${WTF_INCLUDE_DIRECTORIES}" + "${CMAKE_SOURCE_DIR}" +) + +SET(JavaScriptCore_SOURCES + API/JSBase.cpp + API/JSCallbackConstructor.cpp + API/JSCallbackFunction.cpp + API/JSCallbackObject.cpp + API/JSClassRef.cpp + API/JSContextRef.cpp + API/JSObjectRef.cpp + API/JSProfilerPrivate.cpp + API/JSStringRef.cpp + API/JSValueRef.cpp + API/JSWeakObjectMapRefPrivate.cpp + API/OpaqueJSString.cpp + + bytecode/CodeBlock.cpp + bytecode/JumpTable.cpp + bytecode/Opcode.cpp + bytecode/SamplingTool.cpp + bytecode/StructureStubInfo.cpp + + bytecompiler/BytecodeGenerator.cpp + bytecompiler/NodesCodegen.cpp + + heap/Heap.cpp + heap/HandleHeap.cpp + heap/HandleStack.cpp + heap/MachineStackMarker.cpp + heap/MarkedBlock.cpp + heap/MarkedSpace.cpp + heap/ConservativeRoots.cpp + heap/MarkStack.cpp + + debugger/Debugger.cpp + debugger/DebuggerActivation.cpp + debugger/DebuggerCallFrame.cpp + + interpreter/CallFrame.cpp + interpreter/Interpreter.cpp + interpreter/RegisterFile.cpp + + jit/ExecutableAllocator.cpp + jit/JITArithmetic32_64.cpp + jit/JITArithmetic.cpp + jit/JITCall32_64.cpp + jit/JITCall.cpp + jit/JIT.cpp + jit/JITOpcodes32_64.cpp + jit/JITOpcodes.cpp + jit/JITPropertyAccess32_64.cpp + jit/JITPropertyAccess.cpp + jit/JITStubs.cpp + jit/ThunkGenerators.cpp + + parser/JSParser.cpp + parser/Lexer.cpp + parser/Nodes.cpp + parser/Parser.cpp + parser/ParserArena.cpp + parser/SourceProviderCache.cpp + + profiler/Profile.cpp + profiler/ProfileGenerator.cpp + profiler/ProfileNode.cpp + profiler/Profiler.cpp + + runtime/ArgList.cpp + runtime/Arguments.cpp + runtime/ArrayConstructor.cpp + runtime/ArrayPrototype.cpp + runtime/BooleanConstructor.cpp + runtime/BooleanObject.cpp + runtime/BooleanPrototype.cpp + runtime/CallData.cpp + runtime/CommonIdentifiers.cpp + runtime/Completion.cpp + runtime/ConstructData.cpp + runtime/DateConstructor.cpp + runtime/DateConversion.cpp + runtime/DateInstance.cpp + runtime/DatePrototype.cpp + runtime/Error.cpp + runtime/ErrorConstructor.cpp + runtime/ErrorInstance.cpp + runtime/ErrorPrototype.cpp + runtime/ExceptionHelpers.cpp + runtime/Executable.cpp + runtime/FunctionConstructor.cpp + runtime/FunctionPrototype.cpp + runtime/GCActivityCallback.cpp + runtime/GetterSetter.cpp + runtime/Identifier.cpp + runtime/InitializeThreading.cpp + runtime/InternalFunction.cpp + runtime/JSActivation.cpp + runtime/JSAPIValueWrapper.cpp + runtime/JSArray.cpp + runtime/JSByteArray.cpp + runtime/JSCell.cpp + runtime/JSFunction.cpp + runtime/JSGlobalData.cpp + runtime/JSGlobalObject.cpp + runtime/JSGlobalObjectFunctions.cpp + runtime/JSLock.cpp + runtime/JSNotAnObject.cpp + runtime/JSObject.cpp + runtime/JSObjectWithGlobalObject.cpp + runtime/JSONObject.cpp + runtime/JSPropertyNameIterator.cpp + runtime/JSStaticScopeObject.cpp + runtime/JSString.cpp + runtime/JSValue.cpp + runtime/JSVariableObject.cpp + runtime/JSWrapperObject.cpp + runtime/JSZombie.cpp + runtime/LiteralParser.cpp + runtime/Lookup.cpp + runtime/MathObject.cpp + runtime/NativeErrorConstructor.cpp + runtime/NativeErrorPrototype.cpp + runtime/NumberConstructor.cpp + runtime/NumberObject.cpp + runtime/NumberPrototype.cpp + runtime/ObjectConstructor.cpp + runtime/ObjectPrototype.cpp + runtime/Operations.cpp + runtime/PropertyDescriptor.cpp + runtime/PropertyNameArray.cpp + runtime/PropertySlot.cpp + runtime/RegExp.cpp + runtime/RegExpCache.cpp + runtime/RegExpConstructor.cpp + runtime/RegExpObject.cpp + runtime/RegExpPrototype.cpp + runtime/RopeImpl.cpp + runtime/ScopeChain.cpp + runtime/SmallStrings.cpp + runtime/StrictEvalActivation.cpp + runtime/StringConstructor.cpp + runtime/StringObject.cpp + runtime/StringPrototype.cpp + runtime/StringRecursionChecker.cpp + runtime/Structure.cpp + runtime/StructureChain.cpp + runtime/TimeoutChecker.cpp + runtime/UString.cpp + + yarr/YarrPattern.cpp + yarr/YarrInterpreter.cpp + yarr/YarrJIT.cpp + yarr/YarrSyntaxChecker.cpp + + wtf/DateMath.cpp + wtf/PageAllocationAligned.cpp + wtf/PageBlock.cpp +) +SET(JavaScriptCore_HEADERS ) + +SET(JavaScriptCore_LUT_FILES + runtime/ArrayConstructor.cpp + runtime/ArrayPrototype.cpp + runtime/BooleanPrototype.cpp + runtime/DateConstructor.cpp + runtime/DatePrototype.cpp + runtime/ErrorPrototype.cpp + runtime/JSGlobalObject.cpp + runtime/JSONObject.cpp + runtime/MathObject.cpp + runtime/NumberConstructor.cpp + runtime/NumberPrototype.cpp + runtime/ObjectConstructor.cpp + runtime/ObjectPrototype.cpp + runtime/RegExpConstructor.cpp + runtime/RegExpObject.cpp + runtime/RegExpPrototype.cpp + runtime/StringConstructor.cpp + runtime/StringPrototype.cpp +) + +SET(JavaScriptCore_LIBRARIES + ${WTF_LIBRARY_NAME} +) + + +# GENERATOR 1-A: LUT creator +FOREACH (_file ${JavaScriptCore_LUT_FILES}) + GET_FILENAME_COMPONENT(_name ${_file} NAME_WE) + GENERATE_HASH_LUT(${JAVASCRIPTCORE_DIR}/${_file} ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/${_name}.lut.h) + LIST(APPEND JavaScriptCore_HEADERS ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/${_name}.lut.h) +ENDFOREACH () + + +# GENERATOR 1-B: particular LUT creator (for 1 file only) +GENERATE_HASH_LUT(${JAVASCRIPTCORE_DIR}/parser/Keywords.table ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/Lexer.lut.h MAIN_DEPENDENCY) +LIST(APPEND JavaScriptCore_HEADERS ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/Lexer.lut.h) + +#GENERATOR: "RegExpJitTables.h": tables used by Yarr +ADD_CUSTOM_COMMAND( + OUTPUT ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/RegExpJitTables.h + MAIN_DEPENDENCY ${JAVASCRIPTCORE_DIR}/create_regex_tables + COMMAND ${PYTHON_EXECUTABLE} ${JAVASCRIPTCORE_DIR}/create_regex_tables > ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/RegExpJitTables.h + VERBATIM) +ADD_SOURCE_DEPENDENCIES(${JAVASCRIPTCORE_DIR}/yarr/YarrPattern.cpp ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/RegExpJitTables.h) + + +#GENERATOR: "KeywordLookup.h": keyword decision tree used by the lexer +ADD_CUSTOM_COMMAND( + OUTPUT ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/KeywordLookup.h + MAIN_DEPENDENCY ${JAVASCRIPTCORE_DIR}/KeywordLookupGenerator.py + COMMAND ${PYTHON_EXECUTABLE} ${JAVASCRIPTCORE_DIR}/KeywordLookupGenerator.py ${JAVASCRIPTCORE_DIR}/parser/Keywords.table > ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/KeywordLookup.h + VERBATIM) +ADD_SOURCE_DEPENDENCIES(${JAVASCRIPTCORE_DIR}/parser/Lexer.cpp ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/KeywordLookup.h) + +IF (WTF_CPU_ARM) + LIST(APPEND JavaScriptCore_SOURCES + assembler/ARMAssembler.cpp + assembler/ARMv7Assembler.cpp + assembler/MacroAssemblerARM.cpp + ) +ELSEIF (WTF_CPU_MIPS) +ELSEIF (WTF_CPU_X86) +ELSEIF (WTF_CPU_X86_64) +ELSE () + MESSAGE(FATAL_ERROR "Unknown CPU") +ENDIF () + + +INCLUDE_IF_EXISTS(${JAVASCRIPTCORE_DIR}/CMakeLists${PORT}.txt) + + +ADD_SUBDIRECTORY(wtf) +ADD_SUBDIRECTORY(shell) + +WEBKIT_WRAP_SOURCELIST(${JavaScriptCore_SOURCES}) +INCLUDE_DIRECTORIES(${JavaScriptCore_INCLUDE_DIRECTORIES}) +ADD_DEFINITIONS(-DBUILDING_JavaScriptCore) +ADD_LIBRARY(${JavaScriptCore_LIBRARY_NAME} ${JavaScriptCore_LIBRARY_TYPE} ${JavaScriptCore_HEADERS} ${JavaScriptCore_SOURCES}) +TARGET_LINK_LIBRARIES(${JavaScriptCore_LIBRARY_NAME} ${JavaScriptCore_LIBRARIES}) + +IF (JavaScriptCore_LINK_FLAGS) + ADD_TARGET_PROPERTIES(${JavaScriptCore_LIBRARY_NAME} LINK_FLAGS "${JavaScriptCore_LINK_FLAGS}") +ENDIF () + +IF (SHARED_CORE) + SET_TARGET_PROPERTIES(${JavaScriptCore_LIBRARY_NAME} PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}) + INSTALL(TARGETS ${JavaScriptCore_LIBRARY_NAME} DESTINATION lib) +ENDIF () diff --git a/CMakeListsEfl.txt b/CMakeListsEfl.txt new file mode 100644 index 0000000..cdc3fe2 --- /dev/null +++ b/CMakeListsEfl.txt @@ -0,0 +1,20 @@ +LIST(APPEND JavaScriptCore_SOURCES + jit/ExecutableAllocatorFixedVMPool.cpp + jit/ExecutableAllocator.cpp + heap/MarkStackPosix.cpp + wtf/OSAllocatorPosix.cpp +) + +LIST(APPEND JavaScriptCore_LIBRARIES + ${ICU_I18N_LIBRARIES} +) + +IF (ENABLE_GLIB_SUPPORT) + LIST(APPEND JavaScriptCore_INCLUDE_DIRECTORIES + ${JAVASCRIPTCORE_DIR}/wtf/gobject + ) +ENDIF () + +LIST(APPEND JavaScriptCore_LINK_FLAGS + ${ECORE_LDFLAGS} +) diff --git a/CMakeListsWinCE.txt b/CMakeListsWinCE.txt new file mode 100644 index 0000000..d878863 --- /dev/null +++ b/CMakeListsWinCE.txt @@ -0,0 +1,22 @@ +LIST(APPEND JavaScriptCore_SOURCES + jit/ExecutableAllocator.cpp + + heap/MarkStackWin.cpp +) + +IF (ENABLE_JIT AND WTF_CPU_ARM) + ADD_CUSTOM_COMMAND( + OUTPUT ${DERIVED_SOURCES_DIR}/GeneratedJITStubs.asm + MAIN_DEPENDENCY ${JAVASCRIPTCORE_DIR}/create_jit_stubs + DEPENDS ${JAVASCRIPTCORE_DIR}/jit/JITStubs.cpp + COMMAND ${PERL_EXECUTABLE} ${JAVASCRIPTCORE_DIR}/create_jit_stubs --prefix=MSVC ${JAVASCRIPTCORE_DIR}/jit/JITStubs.cpp > ${DERIVED_SOURCES_DIR}/GeneratedJITStubs.asm + VERBATIM) + + ADD_CUSTOM_COMMAND( + OUTPUT ${DERIVED_SOURCES_DIR}/GeneratedJITStubs.obj + MAIN_DEPENDENCY ${DERIVED_SOURCES_DIR}/GeneratedJITStubs.asm + COMMAND armasm -nologo ${DERIVED_SOURCES_DIR}/GeneratedJITStubs.asm ${DERIVED_SOURCES_DIR}/GeneratedJITStubs.obj + VERBATIM) + + LIST (APPEND JavaScriptCore_SOURCES ${DERIVED_SOURCES_DIR}/GeneratedJITStubs.obj) +ENDIF () diff --git a/DerivedSources.make b/DerivedSources.make index 4fc9cad..80af4b6 100644 --- a/DerivedSources.make +++ b/DerivedSources.make @@ -1,4 +1,4 @@ -# Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. +# Copyright (C) 2006, 2007, 2008, 2009, 2011 Apple Inc. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions @@ -27,7 +27,6 @@ VPATH = \ $(JavaScriptCore) \ $(JavaScriptCore)/parser \ - $(JavaScriptCore)/pcre \ $(JavaScriptCore)/docs \ $(JavaScriptCore)/runtime \ $(JavaScriptCore)/interpreter \ @@ -36,19 +35,31 @@ VPATH = \ .PHONY : all all : \ + ArrayConstructor.lut.h \ ArrayPrototype.lut.h \ - chartables.c \ + BooleanPrototype.lut.h \ + DateConstructor.lut.h \ DatePrototype.lut.h \ - Grammar.cpp \ + ErrorPrototype.lut.h \ + HeaderDetection.h \ JSONObject.lut.h \ + JavaScriptCore.JSVALUE32_64.exp \ + JavaScriptCore.JSVALUE64.exp \ + JSGlobalObject.lut.h \ + KeywordLookup.h \ Lexer.lut.h \ MathObject.lut.h \ NumberConstructor.lut.h \ + NumberPrototype.lut.h \ + ObjectConstructor.lut.h \ + ObjectPrototype.lut.h \ RegExpConstructor.lut.h \ + RegExpPrototype.lut.h \ + RegExpJitTables.h \ RegExpObject.lut.h \ + StringConstructor.lut.h \ StringPrototype.lut.h \ docs/bytecode.html \ - RegExpJitTables.h \ # # lookup tables for classes @@ -58,24 +69,38 @@ all : \ Lexer.lut.h: create_hash_table Keywords.table $^ > $@ -# JavaScript language grammar - -Grammar.cpp: Grammar.y - bison -d -p jscyy $< -o $@ > bison_out.txt 2>&1 - perl -p -e 'END { if ($$conflict) { unlink "Grammar.cpp"; die; } } $$conflict ||= /conflict/' < bison_out.txt - touch Grammar.cpp.h - touch Grammar.hpp - cat Grammar.cpp.h Grammar.hpp > Grammar.h - rm -f Grammar.cpp.h Grammar.hpp bison_out.txt - -# character tables for PCRE - -chartables.c : dftables - $^ $@ - docs/bytecode.html: make-bytecode-docs.pl Interpreter.cpp perl $^ $@ -#character tables for Yarr +# character tables for Yarr + RegExpJitTables.h: create_regex_tables python $^ > $@ + +KeywordLookup.h: KeywordLookupGenerator.py Keywords.table + python $^ > $@ + +# export files + +JavaScriptCore.JSVALUE32_64.exp: JavaScriptCore.exp JavaScriptCore.JSVALUE32_64only.exp + cat $^ > $@ + +JavaScriptCore.JSVALUE64.exp: JavaScriptCore.exp JavaScriptCore.JSVALUE64only.exp + cat $^ > $@ + + +# header detection + +ifeq ($(OS),MACOS) + +HeaderDetection.h : DerivedSources.make /System/Library/CoreServices/SystemVersion.plist + rm -f $@ + echo "/* This is a generated file. Do not edit. */" > $@ + if [ -f $(SDKROOT)/System/Library/Frameworks/System.framework/PrivateHeaders/pthread_machdep.h ]; then echo "#define HAVE_PTHREAD_MACHDEP_H 1" >> $@; else echo >> $@; fi + +else + +HeaderDetection.h : + echo > $@ + +endif diff --git a/DerivedSources.pro b/DerivedSources.pro index 7c5aad8..0989605 100644 --- a/DerivedSources.pro +++ b/DerivedSources.pro @@ -14,22 +14,29 @@ CONFIG(standalone_package) { } LUT_FILES += \ + runtime/ArrayConstructor.cpp \ runtime/ArrayPrototype.cpp \ + runtime/BooleanPrototype.cpp \ + runtime/DateConstructor.cpp \ runtime/DatePrototype.cpp \ + runtime/ErrorPrototype.cpp \ + runtime/JSGlobalObject.cpp \ runtime/JSONObject.cpp \ runtime/MathObject.cpp \ runtime/NumberConstructor.cpp \ + runtime/NumberPrototype.cpp \ + runtime/ObjectConstructor.cpp \ + runtime/ObjectPrototype.cpp \ runtime/RegExpConstructor.cpp \ runtime/RegExpObject.cpp \ - runtime/StringPrototype.cpp + runtime/RegExpPrototype.cpp \ + runtime/StringConstructor.cpp \ + runtime/StringPrototype.cpp \ KEYWORDLUT_FILES += \ parser/Keywords.table -JSCBISON += \ - parser/Grammar.y - -RVCT_STUB_FILES += \ +JIT_STUB_FILES += \ jit/JITStubs.cpp defineTest(addExtraCompiler) { @@ -68,30 +75,23 @@ keywordlut.commands = perl $$keywordlut.wkScript ${QMAKE_FILE_NAME} -i > ${QMAKE keywordlut.depends = ${QMAKE_FILE_NAME} addExtraCompiler(keywordlut) -# GENERATOR 2: bison grammar -jscbison.output = $${JSC_GENERATED_SOURCES_DIR}$${QMAKE_DIR_SEP}${QMAKE_FILE_BASE}.cpp -jscbison.input = JSCBISON -jscbison.commands = bison -d -p jscyy ${QMAKE_FILE_NAME} -o $${JSC_GENERATED_SOURCES_DIR}$${QMAKE_DIR_SEP}${QMAKE_FILE_BASE}.tab.c && $(MOVE) $${JSC_GENERATED_SOURCES_DIR}$${QMAKE_DIR_SEP}${QMAKE_FILE_BASE}.tab.c ${QMAKE_FILE_OUT} && $(MOVE) $${JSC_GENERATED_SOURCES_DIR}$${QMAKE_DIR_SEP}${QMAKE_FILE_BASE}.tab.h $${JSC_GENERATED_SOURCES_DIR}$${QMAKE_DIR_SEP}${QMAKE_FILE_BASE}.h -jscbison.depends = ${QMAKE_FILE_NAME} -addExtraCompiler(jscbison) - -# GENERATOR 3: JIT Stub functions for RVCT +# GENERATOR 2-A: JIT Stub functions for RVCT rvctstubs.output = $${JSC_GENERATED_SOURCES_DIR}$${QMAKE_DIR_SEP}Generated${QMAKE_FILE_BASE}_RVCT.h rvctstubs.wkScript = $$PWD/create_jit_stubs rvctstubs.commands = perl -i $$rvctstubs.wkScript --prefix RVCT ${QMAKE_FILE_NAME} > ${QMAKE_FILE_OUT} rvctstubs.depends = ${QMAKE_FILE_NAME} -rvctstubs.input = RVCT_STUB_FILES +rvctstubs.input = JIT_STUB_FILES rvctstubs.CONFIG += no_link addExtraCompiler(rvctstubs) -# GENERATOR: "chartables.c": compile and execute the chartables generator (and add it to sources) -win32-msvc*|wince*: PREPROCESSOR = "--preprocessor=\"$$QMAKE_CC /E\"" -ctgen.output = $$JSC_GENERATED_SOURCES_DIR/chartables.c -ctgen.wkScript = $$PWD/pcre/dftables -ctgen.input = ctgen.wkScript -ctgen.commands = perl $$ctgen.wkScript ${QMAKE_FILE_OUT} $$PREPROCESSOR -ctgen.clean = ${QMAKE_FILE_OUT} ${QMAKE_VAR_JSC_GENERATED_SOURCES_DIR}${QMAKE_FILE_BASE} -addExtraCompiler(ctgen) +# GENERATOR 2-B: JIT Stub functions for MSVC +msvcstubs.output = $${JSC_GENERATED_SOURCES_DIR}$${QMAKE_DIR_SEP}Generated${QMAKE_FILE_BASE}_MSVC.asm +msvcstubs.wkScript = $$PWD/create_jit_stubs +msvcstubs.commands = perl -i $$msvcstubs.wkScript --prefix MSVC ${QMAKE_FILE_NAME} > ${QMAKE_FILE_OUT} +msvcstubs.depends = ${QMAKE_FILE_NAME} +msvcstubs.input = JIT_STUB_FILES +msvcstubs.CONFIG += no_link +addExtraCompiler(msvcstubs) #GENERATOR: "RegExpJitTables.h": tables used by Yarr retgen.output = $$JSC_GENERATED_SOURCES_DIR/RegExpJitTables.h @@ -99,3 +99,10 @@ retgen.wkScript = $$PWD/create_regex_tables retgen.input = retgen.wkScript retgen.commands = python $$retgen.wkScript > ${QMAKE_FILE_OUT} addExtraCompiler(retgen) + +#GENERATOR: "KeywordLookup.h": decision tree used by the lexer +klgen.output = $$JSC_GENERATED_SOURCES_DIR/KeywordLookup.h +klgen.wkScript = $$PWD/KeywordLookupGenerator.py +klgen.input = KEYWORDLUT_FILES +klgen.commands = python $$klgen.wkScript ${QMAKE_FILE_NAME} > ${QMAKE_FILE_OUT} +addExtraCompiler(klgen) diff --git a/ForwardingHeaders/JavaScriptCore/APIShims.h b/ForwardingHeaders/JavaScriptCore/APIShims.h new file mode 100644 index 0000000..92e712a --- /dev/null +++ b/ForwardingHeaders/JavaScriptCore/APIShims.h @@ -0,0 +1 @@ +#include diff --git a/GNUmakefile.am b/GNUmakefile.am index cd93c1b..c710d2a 100644 --- a/GNUmakefile.am +++ b/GNUmakefile.am @@ -1,591 +1,96 @@ -javascriptcore_cppflags += \ - -I$(srcdir)/JavaScriptCore \ - -I$(srcdir)/JavaScriptCore/API \ - -I$(srcdir)/JavaScriptCore/ForwardingHeaders \ - -I$(srcdir)/JavaScriptCore/interpreter \ - -I$(srcdir)/JavaScriptCore/bytecode \ - -I$(srcdir)/JavaScriptCore/bytecompiler \ - -I$(srcdir)/JavaScriptCore/debugger \ - -I$(srcdir)/JavaScriptCore/jit \ - -I$(srcdir)/JavaScriptCore/pcre \ - -I$(srcdir)/JavaScriptCore/profiler \ - -I$(srcdir)/JavaScriptCore/runtime \ - -I$(srcdir)/JavaScriptCore/jit \ - -I$(srcdir)/JavaScriptCore/assembler \ - -I$(srcdir)/JavaScriptCore/wtf \ - -I$(srcdir)/JavaScriptCore/wtf/text \ - -I$(srcdir)/JavaScriptCore/wtf/unicode \ - -I$(srcdir)/JavaScriptCore/yarr \ - -I$(top_builddir)/JavaScriptCore \ - -I$(top_builddir)/JavaScriptCore/pcre \ - -I$(top_builddir)/JavaScriptCore/parser \ - -I$(top_builddir)/JavaScriptCore/runtime - -javascriptcore_h_api += \ - JavaScriptCore/API/JSBase.h \ - JavaScriptCore/API/JSContextRef.h \ - JavaScriptCore/API/JSObjectRef.h \ - JavaScriptCore/API/JSStringRef.h \ - JavaScriptCore/API/JSStringRefBSTR.h \ - JavaScriptCore/API/JSStringRefCF.h \ - JavaScriptCore/API/JSValueRef.h \ - JavaScriptCore/API/JavaScript.h \ - JavaScriptCore/API/JavaScriptCore.h \ - JavaScriptCore/API/WebKitAvailability.h - -javascriptcore_built_nosources += \ - DerivedSources/Lexer.lut.h \ - JavaScriptCore/RegExpJitTables.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 \ - JavaScriptCore/runtime/RegExpObject.lut.h \ - JavaScriptCore/runtime/StringPrototype.lut.h \ - JavaScriptCore/pcre/chartables.c - -javascriptcore_sources += \ - JavaScriptCore/API/APICast.h \ - JavaScriptCore/API/APIShims.h \ - JavaScriptCore/API/JSBase.cpp \ - JavaScriptCore/API/JSBasePrivate.h \ - JavaScriptCore/API/JSCallbackConstructor.cpp \ - JavaScriptCore/API/JSCallbackConstructor.h \ - JavaScriptCore/API/JSCallbackFunction.cpp \ - JavaScriptCore/API/JSCallbackFunction.h \ - JavaScriptCore/API/JSCallbackObject.cpp \ - JavaScriptCore/API/JSCallbackObject.h \ - JavaScriptCore/API/JSCallbackObjectFunctions.h \ - JavaScriptCore/API/JSClassRef.cpp \ - JavaScriptCore/API/JSClassRef.h \ - JavaScriptCore/API/JSContextRef.cpp \ - JavaScriptCore/API/JSContextRefPrivate.h \ - JavaScriptCore/API/JSObjectRef.cpp \ - JavaScriptCore/API/JSRetainPtr.h \ - JavaScriptCore/API/JSStringRef.cpp \ - JavaScriptCore/API/JSValueRef.cpp \ - JavaScriptCore/API/OpaqueJSString.cpp \ - JavaScriptCore/API/OpaqueJSString.h \ - JavaScriptCore/ForwardingHeaders/JavaScriptCore/APICast.h \ - JavaScriptCore/ForwardingHeaders/JavaScriptCore/JSBase.h \ - JavaScriptCore/ForwardingHeaders/JavaScriptCore/JSContextRef.h \ - JavaScriptCore/ForwardingHeaders/JavaScriptCore/JSObjectRef.h \ - JavaScriptCore/ForwardingHeaders/JavaScriptCore/JSRetainPtr.h \ - JavaScriptCore/ForwardingHeaders/JavaScriptCore/JSStringRef.h \ - JavaScriptCore/ForwardingHeaders/JavaScriptCore/JSStringRefCF.h \ - JavaScriptCore/ForwardingHeaders/JavaScriptCore/JSValueRef.h \ - JavaScriptCore/ForwardingHeaders/JavaScriptCore/JavaScript.h \ - JavaScriptCore/ForwardingHeaders/JavaScriptCore/JavaScriptCore.h \ - JavaScriptCore/ForwardingHeaders/JavaScriptCore/OpaqueJSString.h \ - JavaScriptCore/ForwardingHeaders/JavaScriptCore/WebKitAvailability.h \ - JavaScriptCore/JavaScriptCorePrefix.h \ - JavaScriptCore/jit/ExecutableAllocator.h \ - JavaScriptCore/jit/JIT.cpp \ - JavaScriptCore/jit/JITOpcodes.cpp \ - JavaScriptCore/jit/JITOpcodes32_64.cpp \ - JavaScriptCore/jit/JITCall.cpp \ - JavaScriptCore/jit/JITCode.h \ - JavaScriptCore/jit/JITPropertyAccess.cpp \ - JavaScriptCore/jit/JITPropertyAccess32_64.cpp \ - JavaScriptCore/jit/JITArithmetic.cpp \ - JavaScriptCore/jit/JITArithmetic32_64.cpp \ - JavaScriptCore/jit/ExecutableAllocator.cpp \ - JavaScriptCore/jit/JIT.h \ - JavaScriptCore/jit/JITInlineMethods.h \ - JavaScriptCore/jit/JITStubs.cpp \ - JavaScriptCore/jit/JITStubs.h \ - JavaScriptCore/jit/JITStubCall.h \ - JavaScriptCore/jit/JSInterfaceJIT.h \ - JavaScriptCore/jit/SpecializedThunkJIT.h \ - JavaScriptCore/jit/ThunkGenerators.cpp \ - JavaScriptCore/jit/ThunkGenerators.h \ - JavaScriptCore/bytecode/StructureStubInfo.cpp \ - JavaScriptCore/bytecode/StructureStubInfo.h \ - JavaScriptCore/bytecode/CodeBlock.cpp \ - JavaScriptCore/bytecode/CodeBlock.h \ - JavaScriptCore/bytecode/JumpTable.cpp \ - JavaScriptCore/bytecode/JumpTable.h \ - JavaScriptCore/bytecode/EvalCodeCache.h \ - JavaScriptCore/bytecode/Instruction.h \ - JavaScriptCore/bytecompiler/Label.h \ - JavaScriptCore/interpreter/Interpreter.cpp \ - JavaScriptCore/interpreter/Interpreter.h \ - JavaScriptCore/bytecode/Opcode.cpp \ - JavaScriptCore/bytecode/Opcode.h \ - JavaScriptCore/interpreter/Register.h \ - JavaScriptCore/bytecompiler/RegisterID.h \ - JavaScriptCore/bytecode/SamplingTool.cpp \ - JavaScriptCore/bytecode/SamplingTool.h \ - JavaScriptCore/config.h \ - JavaScriptCore/debugger/DebuggerActivation.cpp \ - JavaScriptCore/debugger/DebuggerActivation.h \ - JavaScriptCore/debugger/DebuggerCallFrame.cpp \ - JavaScriptCore/debugger/DebuggerCallFrame.h \ - JavaScriptCore/icu/unicode/parseerr.h \ - JavaScriptCore/icu/unicode/platform.h \ - JavaScriptCore/icu/unicode/putil.h \ - JavaScriptCore/icu/unicode/uchar.h \ - JavaScriptCore/icu/unicode/ucnv.h \ - JavaScriptCore/icu/unicode/ucnv_err.h \ - JavaScriptCore/icu/unicode/ucol.h \ - JavaScriptCore/icu/unicode/uconfig.h \ - JavaScriptCore/icu/unicode/uenum.h \ - JavaScriptCore/icu/unicode/uiter.h \ - JavaScriptCore/icu/unicode/uloc.h \ - JavaScriptCore/icu/unicode/umachine.h \ - JavaScriptCore/icu/unicode/unorm.h \ - JavaScriptCore/icu/unicode/urename.h \ - JavaScriptCore/icu/unicode/uset.h \ - JavaScriptCore/icu/unicode/ustring.h \ - JavaScriptCore/icu/unicode/utf.h \ - JavaScriptCore/icu/unicode/utf16.h \ - JavaScriptCore/icu/unicode/utf8.h \ - JavaScriptCore/icu/unicode/utf_old.h \ - JavaScriptCore/icu/unicode/utypes.h \ - JavaScriptCore/icu/unicode/uversion.h \ - JavaScriptCore/assembler/ARMAssembler.h \ - JavaScriptCore/assembler/ARMAssembler.cpp \ - JavaScriptCore/assembler/X86Assembler.h \ - JavaScriptCore/assembler/AbstractMacroAssembler.h \ - JavaScriptCore/assembler/AssemblerBuffer.h \ - JavaScriptCore/assembler/AssemblerBufferWithConstantPool.h \ - JavaScriptCore/assembler/CodeLocation.h \ - JavaScriptCore/assembler/LinkBuffer.h \ - JavaScriptCore/assembler/MacroAssembler.h \ - JavaScriptCore/assembler/MacroAssemblerARM.h \ - JavaScriptCore/assembler/MacroAssemblerARM.cpp \ - 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 \ - JavaScriptCore/pcre/pcre_compile.cpp \ - JavaScriptCore/pcre/pcre_exec.cpp \ - JavaScriptCore/pcre/pcre_internal.h \ - JavaScriptCore/pcre/pcre_tables.cpp \ - JavaScriptCore/pcre/pcre_ucp_searchfuncs.cpp \ - JavaScriptCore/pcre/pcre_xclass.cpp \ - JavaScriptCore/pcre/ucpinternal.h \ - JavaScriptCore/profiler/CallIdentifier.h \ - JavaScriptCore/profiler/Profile.cpp \ - JavaScriptCore/profiler/Profile.h \ - JavaScriptCore/profiler/ProfileGenerator.cpp \ - JavaScriptCore/profiler/ProfileGenerator.h \ - JavaScriptCore/profiler/ProfileNode.cpp \ - JavaScriptCore/profiler/ProfileNode.h \ - JavaScriptCore/profiler/Profiler.cpp \ - JavaScriptCore/profiler/Profiler.h \ - JavaScriptCore/interpreter/CachedCall.h \ - JavaScriptCore/interpreter/CallFrame.cpp \ - JavaScriptCore/interpreter/CallFrame.h \ - JavaScriptCore/interpreter/CallFrameClosure.h \ - JavaScriptCore/runtime/ExceptionHelpers.cpp \ - JavaScriptCore/runtime/ExceptionHelpers.h \ - JavaScriptCore/runtime/Executable.cpp \ - JavaScriptCore/runtime/Executable.h \ - JavaScriptCore/runtime/InitializeThreading.cpp \ - JavaScriptCore/runtime/InitializeThreading.h \ - JavaScriptCore/runtime/JSActivation.cpp \ - JavaScriptCore/runtime/JSActivation.h \ - JavaScriptCore/runtime/JSByteArray.cpp \ - JavaScriptCore/runtime/JSByteArray.h \ - JavaScriptCore/runtime/JSGlobalData.cpp \ - 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/JSStringBuilder.h \ - JavaScriptCore/runtime/JSZombie.h \ - JavaScriptCore/runtime/LiteralParser.cpp \ - JavaScriptCore/runtime/LiteralParser.h \ - JavaScriptCore/runtime/MarkStack.cpp \ - JavaScriptCore/runtime/MarkStack.h \ - JavaScriptCore/runtime/NumericStrings.h \ - JavaScriptCore/runtime/PropertyDescriptor.h \ - JavaScriptCore/runtime/PropertyDescriptor.cpp \ - JavaScriptCore/runtime/SmallStrings.cpp \ - JavaScriptCore/runtime/SmallStrings.h \ - JavaScriptCore/runtime/StringBuilder.h \ - JavaScriptCore/runtime/Structure.cpp \ - JavaScriptCore/runtime/Structure.h \ - JavaScriptCore/runtime/StructureChain.cpp \ - JavaScriptCore/runtime/StructureChain.h \ - JavaScriptCore/runtime/StructureTransitionTable.h \ - JavaScriptCore/runtime/Terminator.h \ - JavaScriptCore/runtime/TimeoutChecker.cpp \ - JavaScriptCore/runtime/TimeoutChecker.h \ - JavaScriptCore/runtime/JSTypeInfo.h \ - JavaScriptCore/runtime/WeakGCMap.h \ - JavaScriptCore/runtime/WeakGCPtr.h \ - JavaScriptCore/wtf/ASCIICType.h \ - JavaScriptCore/wtf/AVLTree.h \ - JavaScriptCore/wtf/AlwaysInline.h \ - JavaScriptCore/wtf/Assertions.cpp \ - JavaScriptCore/wtf/Assertions.h \ - JavaScriptCore/wtf/Atomics.h \ - JavaScriptCore/wtf/ByteArray.cpp \ - JavaScriptCore/wtf/ByteArray.h \ - JavaScriptCore/wtf/CrossThreadRefCounted.h \ - JavaScriptCore/wtf/CurrentTime.cpp \ - JavaScriptCore/wtf/CurrentTime.h \ - JavaScriptCore/wtf/DateMath.cpp \ - JavaScriptCore/wtf/DateMath.h \ - JavaScriptCore/wtf/Deque.h \ - JavaScriptCore/wtf/DisallowCType.h \ - JavaScriptCore/wtf/Forward.h \ - JavaScriptCore/wtf/GetPtr.h \ - JavaScriptCore/wtf/HashCountedSet.h \ - JavaScriptCore/wtf/HashFunctions.h \ - JavaScriptCore/wtf/HashIterators.h \ - JavaScriptCore/wtf/HashMap.h \ - JavaScriptCore/wtf/HashSet.h \ - JavaScriptCore/wtf/HashTable.cpp \ - JavaScriptCore/wtf/HashTable.h \ - JavaScriptCore/wtf/HashTraits.h \ - JavaScriptCore/wtf/ListHashSet.h \ - JavaScriptCore/wtf/ListRefPtr.h \ - JavaScriptCore/wtf/Locker.h \ - JavaScriptCore/wtf/MD5.cpp \ - JavaScriptCore/wtf/MD5.h \ - JavaScriptCore/wtf/MainThread.cpp \ - JavaScriptCore/wtf/MainThread.h \ - JavaScriptCore/wtf/MathExtras.h \ - JavaScriptCore/wtf/MessageQueue.h \ - JavaScriptCore/wtf/Noncopyable.h \ - JavaScriptCore/wtf/NotFound.h \ - JavaScriptCore/wtf/OwnArrayPtr.h \ - JavaScriptCore/wtf/OwnFastMallocPtr.h \ - JavaScriptCore/wtf/OwnPtr.h \ - JavaScriptCore/wtf/OwnPtrCommon.h \ - JavaScriptCore/wtf/PassOwnPtr.h \ - JavaScriptCore/wtf/PassRefPtr.h \ - JavaScriptCore/wtf/Platform.h \ - JavaScriptCore/wtf/PossiblyNull.h \ - JavaScriptCore/wtf/RandomNumber.cpp \ - JavaScriptCore/wtf/RandomNumber.h \ - JavaScriptCore/wtf/RandomNumberSeed.h \ - JavaScriptCore/wtf/RefCounted.h \ - JavaScriptCore/wtf/RefCountedLeakCounter.cpp \ - JavaScriptCore/wtf/RefCountedLeakCounter.h \ - JavaScriptCore/wtf/RefPtr.h \ - JavaScriptCore/wtf/RefPtrHashMap.h \ - JavaScriptCore/wtf/RetainPtr.h \ - JavaScriptCore/wtf/SegmentedVector.h \ - JavaScriptCore/wtf/StaticConstructors.h \ - JavaScriptCore/wtf/StdLibExtras.h \ - JavaScriptCore/wtf/StringExtras.h \ - JavaScriptCore/wtf/StringHashFunctions.h \ - JavaScriptCore/wtf/TCPackedCache.h \ - JavaScriptCore/wtf/TCPageMap.h \ - JavaScriptCore/wtf/TCSpinLock.h \ - JavaScriptCore/wtf/ThreadIdentifierDataPthreads.cpp \ - JavaScriptCore/wtf/ThreadIdentifierDataPthreads.h \ - JavaScriptCore/wtf/Threading.cpp \ - JavaScriptCore/wtf/Threading.h \ - JavaScriptCore/wtf/ThreadingPrimitives.h \ - JavaScriptCore/wtf/ThreadingPthreads.cpp \ - JavaScriptCore/wtf/ThreadSafeShared.h \ - JavaScriptCore/wtf/ThreadSpecific.h \ - JavaScriptCore/wtf/TypeTraits.cpp \ - JavaScriptCore/wtf/TypeTraits.h \ - JavaScriptCore/wtf/UnusedParam.h \ - JavaScriptCore/wtf/ValueCheck.h \ - JavaScriptCore/wtf/Vector.h \ - JavaScriptCore/wtf/VectorTraits.h \ - JavaScriptCore/wtf/WTFThreadData.cpp \ - JavaScriptCore/wtf/WTFThreadData.h \ - JavaScriptCore/wtf/gobject/GOwnPtr.cpp \ - JavaScriptCore/wtf/gobject/GOwnPtr.h \ - JavaScriptCore/wtf/gobject/GRefPtr.cpp \ - JavaScriptCore/wtf/gobject/GRefPtr.h \ - JavaScriptCore/wtf/gtk/MainThreadGtk.cpp \ - JavaScriptCore/wtf/gtk/ThreadingGtk.cpp \ - JavaScriptCore/wtf/text/AtomicString.cpp \ - JavaScriptCore/wtf/text/AtomicString.h \ - JavaScriptCore/wtf/text/AtomicStringImpl.h \ - JavaScriptCore/wtf/text/CString.cpp \ - JavaScriptCore/wtf/text/CString.h \ - JavaScriptCore/wtf/text/StringHash.h \ - JavaScriptCore/wtf/text/StringImpl.cpp \ - JavaScriptCore/wtf/text/StringImpl.h \ - JavaScriptCore/wtf/text/StringStatics.cpp \ - JavaScriptCore/wtf/text/WTFString.cpp \ - JavaScriptCore/wtf/text/WTFString.h \ - JavaScriptCore/wtf/unicode/Collator.h \ - JavaScriptCore/wtf/unicode/CollatorDefault.cpp \ - JavaScriptCore/wtf/unicode/UTF8.cpp \ - JavaScriptCore/wtf/unicode/UTF8.h \ - JavaScriptCore/wtf/unicode/Unicode.h +include $(srcdir)/Source/JavaScriptCore/GNUmakefile.list.am -if TARGET_WIN32 -javascriptcore_sources += \ - JavaScriptCore/wtf/ThreadSpecificWin.cpp \ - JavaScriptCore/jit/ExecutableAllocatorWin.cpp \ - JavaScriptCore/runtime/MarkStackWin.cpp -else -javascriptcore_sources += \ - JavaScriptCore/jit/ExecutableAllocatorPosix.cpp \ - JavaScriptCore/runtime/MarkStackPosix.cpp -endif +lib_LTLIBRARIES += \ + libjavascriptcoregtk-@WEBKITGTK_API_MAJOR_VERSION@.@WEBKITGTK_API_MINOR_VERSION@.la -# ---- -# icu unicode backend -# ---- -if USE_ICU_UNICODE -javascriptcore_sources += \ - JavaScriptCore/wtf/unicode/icu/CollatorICU.cpp \ - JavaScriptCore/wtf/unicode/icu/UnicodeIcu.h -endif # USE_ICU_UNICODE +# We are going to make everything public for now. When +# https://bugs.webkit.org/show_bug.cgi?id=27551 is fixed we'll able to +# simply rely on the usual symbol visibility flags. +libjavascriptcoregtk_@WEBKITGTK_API_MAJOR_VERSION@_@WEBKITGTK_API_MINOR_VERSION@_la_LDFLAGS = \ + -version-info @LIBWEBKITGTK_VERSION@ \ + $(no_undefined) -# ---- -# glib unicode backend -# ---- -if USE_GLIB_UNICODE -javascriptcore_sources += \ - JavaScriptCore/wtf/unicode/glib/UnicodeGLib.h \ - JavaScriptCore/wtf/unicode/glib/UnicodeGLib.cpp \ - JavaScriptCore/wtf/unicode/glib/UnicodeMacrosFromICU.h -endif +nodist_EXTRA_libjavascriptcoregtk_@WEBKITGTK_API_MAJOR_VERSION@_@WEBKITGTK_API_MINOR_VERSION@_la_SOURCES = \ + $(javascriptcore_built_nosources) -javascriptcore_sources += \ - JavaScriptCore/wtf/VMTags.h \ - JavaScriptCore/yarr/RegexCompiler.cpp \ - JavaScriptCore/yarr/RegexCompiler.h \ - JavaScriptCore/yarr/RegexInterpreter.cpp \ - JavaScriptCore/yarr/RegexInterpreter.h \ - JavaScriptCore/yarr/RegexJIT.cpp \ - JavaScriptCore/yarr/RegexJIT.h \ - JavaScriptCore/yarr/RegexParser.h \ - JavaScriptCore/yarr/RegexPattern.h +nodist_libjavascriptcoregtk_@WEBKITGTK_API_MAJOR_VERSION@_@WEBKITGTK_API_MINOR_VERSION@_la_SOURCES = \ + $(javascriptcore_built_sources) -javascriptcore_sources += \ - JavaScriptCore/interpreter/RegisterFile.cpp \ - JavaScriptCore/interpreter/RegisterFile.h \ - JavaScriptCore/bytecompiler/BytecodeGenerator.cpp \ - JavaScriptCore/bytecompiler/BytecodeGenerator.h \ - JavaScriptCore/bytecompiler/NodesCodegen.cpp \ - JavaScriptCore/bytecompiler/LabelScope.h \ - JavaScriptCore/debugger/Debugger.cpp \ - JavaScriptCore/debugger/Debugger.h \ - JavaScriptCore/parser/Lexer.cpp \ - JavaScriptCore/parser/Lexer.h \ - JavaScriptCore/parser/NodeConstructors.h \ - JavaScriptCore/parser/NodeInfo.h \ - JavaScriptCore/parser/Nodes.cpp \ - JavaScriptCore/parser/Nodes.h \ - JavaScriptCore/parser/Parser.cpp \ - JavaScriptCore/parser/Parser.h \ - JavaScriptCore/parser/ParserArena.cpp \ - JavaScriptCore/parser/ParserArena.h \ - JavaScriptCore/parser/ResultType.h \ - JavaScriptCore/parser/SourceCode.h \ - JavaScriptCore/parser/SourceProvider.h \ - JavaScriptCore/runtime/ArgList.cpp \ - JavaScriptCore/runtime/ArgList.h \ - JavaScriptCore/runtime/Arguments.cpp \ - JavaScriptCore/runtime/Arguments.h \ - JavaScriptCore/runtime/ArrayConstructor.cpp \ - JavaScriptCore/runtime/ArrayConstructor.h \ - JavaScriptCore/runtime/ArrayPrototype.cpp \ - JavaScriptCore/runtime/ArrayPrototype.h \ - JavaScriptCore/runtime/BatchedTransitionOptimizer.h \ - JavaScriptCore/runtime/BooleanConstructor.cpp \ - JavaScriptCore/runtime/BooleanConstructor.h \ - JavaScriptCore/runtime/BooleanObject.cpp \ - JavaScriptCore/runtime/BooleanObject.h \ - JavaScriptCore/runtime/BooleanPrototype.cpp \ - JavaScriptCore/runtime/BooleanPrototype.h \ - JavaScriptCore/runtime/CallData.cpp \ - JavaScriptCore/runtime/CallData.h \ - JavaScriptCore/runtime/ClassInfo.h \ - JavaScriptCore/runtime/Collector.cpp \ - JavaScriptCore/runtime/Collector.h \ - JavaScriptCore/runtime/CollectorHeapIterator.h \ - JavaScriptCore/runtime/CommonIdentifiers.cpp \ - JavaScriptCore/runtime/CommonIdentifiers.h \ - JavaScriptCore/runtime/Completion.h \ - JavaScriptCore/runtime/ConstructData.cpp \ - JavaScriptCore/runtime/ConstructData.h \ - JavaScriptCore/runtime/DateConstructor.cpp \ - JavaScriptCore/runtime/DateConstructor.h \ - JavaScriptCore/runtime/DateConversion.cpp \ - JavaScriptCore/runtime/DateConversion.h \ - JavaScriptCore/runtime/DateInstance.cpp \ - JavaScriptCore/runtime/DateInstance.h \ - JavaScriptCore/runtime/DateInstanceCache.h \ - JavaScriptCore/runtime/DatePrototype.cpp \ - JavaScriptCore/runtime/DatePrototype.h \ - JavaScriptCore/runtime/Error.cpp \ - JavaScriptCore/runtime/Error.h \ - JavaScriptCore/runtime/ErrorConstructor.cpp \ - JavaScriptCore/runtime/ErrorConstructor.h \ - JavaScriptCore/runtime/ErrorInstance.cpp \ - JavaScriptCore/runtime/ErrorInstance.h \ - JavaScriptCore/runtime/ErrorPrototype.cpp \ - JavaScriptCore/runtime/ErrorPrototype.h \ - JavaScriptCore/runtime/FunctionConstructor.cpp \ - JavaScriptCore/runtime/FunctionConstructor.h \ - JavaScriptCore/runtime/FunctionPrototype.cpp \ - JavaScriptCore/runtime/FunctionPrototype.h \ - JavaScriptCore/runtime/GetterSetter.cpp \ - JavaScriptCore/runtime/GetterSetter.h \ - JavaScriptCore/runtime/GlobalEvalFunction.cpp \ - JavaScriptCore/runtime/GlobalEvalFunction.h \ - JavaScriptCore/runtime/Identifier.cpp \ - JavaScriptCore/runtime/Identifier.h \ - JavaScriptCore/runtime/InternalFunction.cpp \ - JavaScriptCore/runtime/InternalFunction.h \ - 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 \ - JavaScriptCore/runtime/JSFunction.h \ - JavaScriptCore/runtime/JSGlobalObject.cpp \ - JavaScriptCore/runtime/JSGlobalObject.h \ - JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp \ - JavaScriptCore/runtime/JSGlobalObjectFunctions.h \ - JavaScriptCore/runtime/JSImmediate.cpp \ - JavaScriptCore/runtime/JSImmediate.h \ - JavaScriptCore/runtime/JSLock.cpp \ - JavaScriptCore/runtime/JSLock.h \ - JavaScriptCore/runtime/JSNumberCell.cpp \ - JavaScriptCore/runtime/JSNumberCell.h \ - JavaScriptCore/runtime/JSObject.cpp \ - JavaScriptCore/runtime/JSObject.h \ - JavaScriptCore/runtime/JSStaticScopeObject.cpp \ - JavaScriptCore/runtime/JSStaticScopeObject.h \ - JavaScriptCore/runtime/JSString.cpp \ - JavaScriptCore/runtime/JSString.h \ - JavaScriptCore/runtime/JSType.h \ - JavaScriptCore/runtime/JSValue.cpp \ - JavaScriptCore/runtime/JSValue.h \ - JavaScriptCore/runtime/JSVariableObject.cpp \ - JavaScriptCore/runtime/JSVariableObject.h \ - JavaScriptCore/runtime/JSWrapperObject.cpp \ - JavaScriptCore/runtime/JSWrapperObject.h \ - JavaScriptCore/runtime/Lookup.cpp \ - JavaScriptCore/runtime/Lookup.h \ - JavaScriptCore/runtime/MathObject.cpp \ - JavaScriptCore/runtime/MathObject.h \ - JavaScriptCore/runtime/NativeErrorConstructor.cpp \ - JavaScriptCore/runtime/NativeErrorConstructor.h \ - JavaScriptCore/runtime/NativeErrorPrototype.cpp \ - JavaScriptCore/runtime/NativeErrorPrototype.h \ - JavaScriptCore/runtime/NativeFunctionWrapper.h \ - JavaScriptCore/runtime/NumberConstructor.cpp \ - JavaScriptCore/runtime/NumberConstructor.h \ - JavaScriptCore/runtime/NumberObject.cpp \ - JavaScriptCore/runtime/NumberObject.h \ - JavaScriptCore/runtime/NumberPrototype.cpp \ - JavaScriptCore/runtime/NumberPrototype.h \ - JavaScriptCore/runtime/ObjectConstructor.cpp \ - JavaScriptCore/runtime/ObjectConstructor.h \ - JavaScriptCore/runtime/ObjectPrototype.cpp \ - JavaScriptCore/runtime/ObjectPrototype.h \ - JavaScriptCore/runtime/Operations.cpp \ - JavaScriptCore/runtime/Operations.h \ - JavaScriptCore/runtime/PropertyMapHashTable.h \ - JavaScriptCore/runtime/PropertyNameArray.cpp \ - JavaScriptCore/runtime/PropertyNameArray.h \ - JavaScriptCore/runtime/PropertySlot.cpp \ - JavaScriptCore/runtime/PropertySlot.h \ - JavaScriptCore/runtime/Protect.h \ - JavaScriptCore/runtime/PrototypeFunction.cpp \ - JavaScriptCore/runtime/PrototypeFunction.h \ - JavaScriptCore/runtime/PutPropertySlot.h \ - JavaScriptCore/runtime/RegExp.cpp \ - JavaScriptCore/runtime/RegExp.h \ - JavaScriptCore/runtime/RegExpCache.cpp \ - JavaScriptCore/runtime/RegExpCache.h \ - JavaScriptCore/runtime/RegExpConstructor.cpp \ - JavaScriptCore/runtime/RegExpConstructor.h \ - JavaScriptCore/runtime/RegExpKey.h \ - JavaScriptCore/runtime/RegExpMatchesArray.h \ - JavaScriptCore/runtime/RegExpObject.cpp \ - JavaScriptCore/runtime/RegExpObject.h \ - JavaScriptCore/runtime/RegExpPrototype.cpp \ - JavaScriptCore/runtime/RegExpPrototype.h \ - JavaScriptCore/runtime/RopeImpl.cpp \ - JavaScriptCore/runtime/RopeImpl.h \ - JavaScriptCore/runtime/ScopeChain.cpp \ - JavaScriptCore/runtime/ScopeChain.h \ - JavaScriptCore/runtime/ScopeChainMark.h \ - JavaScriptCore/runtime/StringConstructor.cpp \ - JavaScriptCore/runtime/StringConstructor.h \ - JavaScriptCore/runtime/StringObject.cpp \ - JavaScriptCore/runtime/StringObject.h \ - JavaScriptCore/runtime/StringObjectThatMasqueradesAsUndefined.h \ - JavaScriptCore/runtime/StringPrototype.cpp \ - JavaScriptCore/runtime/StringPrototype.h \ - JavaScriptCore/runtime/SymbolTable.h \ - JavaScriptCore/runtime/Tracing.h \ - JavaScriptCore/runtime/UString.cpp \ - JavaScriptCore/runtime/UString.h \ - JavaScriptCore/runtime/UStringImpl.h \ - JavaScriptCore/runtime/WeakRandom.h \ - JavaScriptCore/wtf/FastAllocBase.h \ - JavaScriptCore/wtf/FastMalloc.cpp \ - JavaScriptCore/wtf/FastMalloc.h \ - JavaScriptCore/wtf/MallocZoneSupport.h \ - JavaScriptCore/wtf/TCSystemAlloc.cpp \ - JavaScriptCore/wtf/TCSystemAlloc.h \ - JavaScriptCore/wtf/dtoa.cpp \ - JavaScriptCore/wtf/dtoa.h +libjavascriptcoregtk_@WEBKITGTK_API_MAJOR_VERSION@_@WEBKITGTK_API_MINOR_VERSION@_ladir = $(prefix)/include/webkit-@WEBKITGTK_API_VERSION@/JavaScriptCore +libjavascriptcoregtk_@WEBKITGTK_API_MAJOR_VERSION@_@WEBKITGTK_API_MINOR_VERSION@_la_HEADERS = $(javascriptcore_h_api) -javascriptcore_built_sources += \ - DerivedSources/Grammar.cpp \ - DerivedSources/Grammar.h +libjavascriptcoregtk_@WEBKITGTK_API_MAJOR_VERSION@_@WEBKITGTK_API_MINOR_VERSION@_la_SOURCES = \ + $(javascriptcore_sources) -DerivedSources/Grammar.h: DerivedSources/Grammar.cpp; +libjavascriptcoregtk_@WEBKITGTK_API_MAJOR_VERSION@_@WEBKITGTK_API_MINOR_VERSION@_la_LIBADD = \ + $(UNICODE_LIBS) \ + $(GLIB_LIBS) \ + $(WINMM_LIBS) \ + -lpthread -DerivedSources/Grammar.cpp: $(srcdir)/JavaScriptCore/parser/Grammar.y - $(BISON) -d -p jscyy $(srcdir)/JavaScriptCore/parser/Grammar.y -o $@ > bison_out.txt 2>&1 - $(PERL) -p -e 'END { if ($$conflict) { unlink "Grammar.cpp"; die; } } $$conflict ||= /conflict/' < bison_out.txt - cat $(GENSOURCES)/Grammar.hpp > $(GENSOURCES)/Grammar.h - rm -f $(GENSOURCES)/Grammar.hpp bison_out.txt - -DerivedSources/Lexer.lut.h: $(CREATE_HASH_TABLE) $(srcdir)/JavaScriptCore/parser/Keywords.table - $(PERL) $^ > $@ +libjavascriptcoregtk_@WEBKITGTK_API_MAJOR_VERSION@_@WEBKITGTK_API_MINOR_VERSION@_la_CXXFLAGS = \ + $(global_cxxflags) \ + $(libjavascriptcoregtk_@WEBKITGTK_API_MAJOR_VERSION@_@WEBKITGTK_API_MINOR_VERSION@_la_CFLAGS) -JavaScriptCore/%.lut.h: $(CREATE_HASH_TABLE) $(srcdir)/JavaScriptCore/%.cpp - $(PERL) $^ -i > $@ +libjavascriptcoregtk_@WEBKITGTK_API_MAJOR_VERSION@_@WEBKITGTK_API_MINOR_VERSION@_la_CFLAGS = \ + -fstrict-aliasing \ + -O3 \ + $(global_cflags) \ + $(GLIB_CFLAGS) \ + $(UNICODE_CFLAGS) -JavaScriptCore/RegExpJitTables.h: $(srcdir)/JavaScriptCore/create_regex_tables - $(PYTHON) $(srcdir)/JavaScriptCore/create_regex_tables > $@ +libjavascriptcoregtk_@WEBKITGTK_API_MAJOR_VERSION@_@WEBKITGTK_API_MINOR_VERSION@_la_CPPFLAGS = \ + $(global_cppflags) \ + $(javascriptcore_cppflags) -JavaScriptCore/pcre/chartables.c: $(srcdir)/JavaScriptCore/pcre/dftables - $(PERL) $^ $@ +javascriptcore_cppflags += \ + -I$(srcdir)/Source \ + -I$(srcdir)/Source/JavaScriptCore \ + -I$(srcdir)/Source/JavaScriptCore/API \ + -I$(srcdir)/Source/JavaScriptCore/assembler \ + -I$(srcdir)/Source/JavaScriptCore/bytecode \ + -I$(srcdir)/Source/JavaScriptCore/bytecompiler \ + -I$(srcdir)/Source/JavaScriptCore/heap \ + -I$(srcdir)/Source/JavaScriptCore/debugger \ + -I$(srcdir)/Source/JavaScriptCore/ForwardingHeaders \ + -I$(srcdir)/Source/JavaScriptCore/interpreter \ + -I$(srcdir)/Source/JavaScriptCore/jit \ + -I$(srcdir)/Source/JavaScriptCore/jit \ + -I$(srcdir)/Source/JavaScriptCore/parser \ + -I$(srcdir)/Source/JavaScriptCore/profiler \ + -I$(srcdir)/Source/JavaScriptCore/runtime \ + -I$(srcdir)/Source/JavaScriptCore/wtf \ + -I$(srcdir)/Source/JavaScriptCore/wtf \ + -I$(srcdir)/Source/JavaScriptCore/wtf/gobject \ + -I$(srcdir)/Source/JavaScriptCore/wtf/gtk \ + -I$(srcdir)/Source/JavaScriptCore/wtf/text \ + -I$(srcdir)/Source/JavaScriptCore/wtf/unicode \ + -I$(srcdir)/Source/JavaScriptCore/yarr \ + -I$(top_builddir)/Source/JavaScriptCore \ + -I$(top_builddir)/Source/JavaScriptCore/parser \ + -I$(top_builddir)/Source/JavaScriptCore/runtime + +Source/JavaScriptCore/Lexer.lut.h: $(srcdir)/Source/JavaScriptCore/create_hash_table $(srcdir)/Source/JavaScriptCore/parser/Keywords.table + $(AM_V_GEN)$(PERL) $^ > $@ + +Source/JavaScriptCore/%.lut.h: $(srcdir)/Source/JavaScriptCore/create_hash_table $(srcdir)/Source/JavaScriptCore/%.cpp + $(AM_V_GEN)$(PERL) $^ -i > $@ + +Source/JavaScriptCore/RegExpJitTables.h: $(srcdir)/Source/JavaScriptCore/create_regex_tables + $(AM_V_GEN)$(PYTHON) $^ > $@ + +Source/JavaScriptCore/KeywordLookup.h: $(srcdir)/Source/JavaScriptCore/KeywordLookupGenerator.py $(srcdir)/Source/JavaScriptCore/parser/Keywords.table + $(AM_V_GEN)$(PYTHON) $^ > $@ + +jsc: $(javascriptcore_built_nosources) Programs/jsc$(EXEEXT) bin_PROGRAMS += \ - Programs/jsc + Programs/jsc-@WEBKITGTK_API_MAJOR_VERSION@$(EXEEXT) noinst_PROGRAMS += \ + Programs/jsc \ Programs/minidom -# minidom -Programs_minidom_SOURCES = \ - JavaScriptCore/API/tests/JSNode.c \ - JavaScriptCore/API/tests/JSNode.h \ - JavaScriptCore/API/tests/JSNodeList.c \ - JavaScriptCore/API/tests/JSNodeList.h \ - JavaScriptCore/API/tests/Node.c \ - JavaScriptCore/API/tests/Node.h \ - JavaScriptCore/API/tests/NodeList.c \ - JavaScriptCore/API/tests/NodeList.h \ - JavaScriptCore/API/tests/minidom.c - Programs_minidom_CPPFLAGS = \ $(global_cppflags) \ $(javascriptcore_cppflags) @@ -597,58 +102,72 @@ Programs_minidom_CFLAGS = \ $(GLOBALDEPS_CFLAGS) Programs_minidom_LDADD = \ - libJavaScriptCore.la \ - -lm \ - -lstdc++ + libjavascriptcoregtk-@WEBKITGTK_API_MAJOR_VERSION@.@WEBKITGTK_API_MINOR_VERSION@.la \ + $(WINMM_LIBS) \ + -lm \ + -lpthread \ + -lstdc++ Programs_minidom_LDFLAGS = \ -no-install \ -no-fast-install # jsc -Programs_jsc_SOURCES = \ - JavaScriptCore/jsc.cpp +Programs/jsc$(EXEEXT): Programs/jsc-@WEBKITGTK_API_MAJOR_VERSION@$(EXEEXT) + $(AM_V_GEN)cp -f Programs/jsc-@WEBKITGTK_API_MAJOR_VERSION@$(EXEEXT) Programs/jsc$(EXEEXT) +Programs_jsc_LDADD = +Programs_jsc_SOURCES = -Programs_jsc_CPPFLAGS = \ +Programs_jsc_@WEBKITGTK_API_MAJOR_VERSION@_CPPFLAGS = \ $(global_cppflags) \ $(javascriptcore_cppflags) -Programs_jsc_CXXFLAGS = \ +Programs_jsc_@WEBKITGTK_API_MAJOR_VERSION@_CXXFLAGS = \ -fno-strict-aliasing \ $(global_cxxflags) \ $(global_cflags) \ $(GLOBALDEPS_CFLAGS) \ $(UNICODE_CFLAGS) -Programs_jsc_LDADD = \ - libJavaScriptCore.la - -javascriptcore_dist += \ - $(CREATE_HASH_TABLE) \ - $(CREATE_REGEXP_TABLES) \ - JavaScriptCore/AUTHORS \ - JavaScriptCore/COPYING.LIB \ - JavaScriptCore/ChangeLog \ - JavaScriptCore/THANKS \ - JavaScriptCore/icu/LICENSE \ - JavaScriptCore/icu/README \ - JavaScriptCore/pcre/COPYING \ - JavaScriptCore/pcre/AUTHORS \ - JavaScriptCore/pcre/dftables \ - JavaScriptCore/pcre/ucptable.cpp \ - JavaScriptCore/parser/Grammar.y \ - JavaScriptCore/parser/Keywords.table +Programs_jsc_@WEBKITGTK_API_MAJOR_VERSION@_LDADD = \ + -lpthread \ + libjavascriptcoregtk-@WEBKITGTK_API_MAJOR_VERSION@.@WEBKITGTK_API_MINOR_VERSION@.la \ + $(WINMM_LIBS) + +EXTRA_DIST += \ + Source/JavaScriptCore/AUTHORS \ + Source/JavaScriptCore/ChangeLog \ + Source/JavaScriptCore/COPYING.LIB \ + Source/JavaScriptCore/create_hash_table \ + Source/JavaScriptCore/create_regex_tables \ + Source/JavaScriptCore/icu/LICENSE \ + Source/JavaScriptCore/icu/README \ + Source/JavaScriptCore/parser/Keywords.table \ + Source/JavaScriptCore/THANKS # Clean rules for JavaScriptCore +# FIXME: Should this list be generated from javascriptcore_built_nosources? 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 \ - JavaScriptCore/runtime/RegExpObject.lut.h \ - JavaScriptCore/runtime/StringPrototype.lut.h \ - JavaScriptCore/pcre/chartables.c \ + Source/JavaScriptCore/Lexer.lut.h \ + Source/JavaScriptCore/RegExpJitTables.h \ + Source/JavaScriptCore/runtime/ArrayConstructor.lut.h \ + Source/JavaScriptCore/runtime/ArrayPrototype.lut.h \ + Source/JavaScriptCore/runtime/BooleanPrototype.lut.h \ + Source/JavaScriptCore/runtime/DateConstructor.lut.h \ + Source/JavaScriptCore/runtime/DatePrototype.lut.h \ + Source/JavaScriptCore/runtime/ErrorPrototype.lut.h \ + Source/JavaScriptCore/runtime/JSGlobalObject.lut.h \ + Source/JavaScriptCore/runtime/JSONObject.lut.h \ + Source/JavaScriptCore/runtime/MathObject.lut.h \ + Source/JavaScriptCore/runtime/NumberConstructor.lut.h \ + Source/JavaScriptCore/runtime/NumberPrototype.lut.h \ + Source/JavaScriptCore/runtime/ObjectConstructor.lut.h \ + Source/JavaScriptCore/runtime/ObjectPrototype.lut.h \ + Source/JavaScriptCore/runtime/RegExpConstructor.lut.h \ + Source/JavaScriptCore/runtime/RegExpObject.lut.h \ + Source/JavaScriptCore/runtime/RegExpPrototype.lut.h \ + Source/JavaScriptCore/runtime/StringConstructor.lut.h \ + Source/JavaScriptCore/runtime/StringPrototype.lut.h \ Programs/jsc \ + Programs/jsc-@WEBKITGTK_API_MAJOR_VERSION@ \ Programs/minidom diff --git a/GNUmakefile.list.am b/GNUmakefile.list.am new file mode 100644 index 0000000..e33c2a4 --- /dev/null +++ b/GNUmakefile.list.am @@ -0,0 +1,620 @@ +javascriptcore_h_api += \ + Source/JavaScriptCore/API/JSBase.h \ + Source/JavaScriptCore/API/JSContextRef.h \ + Source/JavaScriptCore/API/JSObjectRef.h \ + Source/JavaScriptCore/API/JSStringRef.h \ + Source/JavaScriptCore/API/JSStringRefBSTR.h \ + Source/JavaScriptCore/API/JSStringRefCF.h \ + Source/JavaScriptCore/API/JSValueRef.h \ + Source/JavaScriptCore/API/JavaScript.h \ + Source/JavaScriptCore/API/JavaScriptCore.h \ + Source/JavaScriptCore/API/WebKitAvailability.h + +javascriptcore_built_nosources += \ + Source/JavaScriptCore/Lexer.lut.h \ + Source/JavaScriptCore/RegExpJitTables.h \ + Source/JavaScriptCore/runtime/ArrayConstructor.lut.h \ + Source/JavaScriptCore/runtime/ArrayPrototype.lut.h \ + Source/JavaScriptCore/runtime/BooleanPrototype.lut.h \ + Source/JavaScriptCore/runtime/DateConstructor.lut.h \ + Source/JavaScriptCore/runtime/DatePrototype.lut.h \ + Source/JavaScriptCore/runtime/ErrorPrototype.lut.h \ + Source/JavaScriptCore/runtime/JSGlobalObject.lut.h \ + Source/JavaScriptCore/runtime/JSONObject.lut.h \ + Source/JavaScriptCore/runtime/MathObject.lut.h \ + Source/JavaScriptCore/runtime/NumberConstructor.lut.h \ + Source/JavaScriptCore/runtime/NumberPrototype.lut.h \ + Source/JavaScriptCore/runtime/ObjectConstructor.lut.h \ + Source/JavaScriptCore/runtime/ObjectPrototype.lut.h \ + Source/JavaScriptCore/runtime/RegExpConstructor.lut.h \ + Source/JavaScriptCore/runtime/RegExpObject.lut.h \ + Source/JavaScriptCore/runtime/RegExpPrototype.lut.h \ + Source/JavaScriptCore/runtime/StringConstructor.lut.h \ + Source/JavaScriptCore/runtime/StringPrototype.lut.h + +javascriptcore_sources += \ + Source/JavaScriptCore/API/APICast.h \ + Source/JavaScriptCore/API/APIShims.h \ + Source/JavaScriptCore/API/JSBase.cpp \ + Source/JavaScriptCore/API/JSBasePrivate.h \ + Source/JavaScriptCore/API/JSCallbackConstructor.cpp \ + Source/JavaScriptCore/API/JSCallbackConstructor.h \ + Source/JavaScriptCore/API/JSCallbackFunction.cpp \ + Source/JavaScriptCore/API/JSCallbackFunction.h \ + Source/JavaScriptCore/API/JSCallbackObject.cpp \ + Source/JavaScriptCore/API/JSCallbackObjectFunctions.h \ + Source/JavaScriptCore/API/JSCallbackObject.h \ + Source/JavaScriptCore/API/JSClassRef.cpp \ + Source/JavaScriptCore/API/JSClassRef.h \ + Source/JavaScriptCore/API/JSContextRef.cpp \ + Source/JavaScriptCore/API/JSContextRefPrivate.h \ + Source/JavaScriptCore/API/JSObjectRef.cpp \ + Source/JavaScriptCore/API/JSObjectRefPrivate.h \ + Source/JavaScriptCore/API/JSRetainPtr.h \ + Source/JavaScriptCore/API/JSStringRef.cpp \ + Source/JavaScriptCore/API/JSValueRef.cpp \ + Source/JavaScriptCore/API/JSWeakObjectMapRefInternal.h \ + Source/JavaScriptCore/API/OpaqueJSString.cpp \ + Source/JavaScriptCore/API/OpaqueJSString.h \ + Source/JavaScriptCore/assembler/AbstractMacroAssembler.h \ + Source/JavaScriptCore/assembler/ARMAssembler.cpp \ + Source/JavaScriptCore/assembler/ARMAssembler.h \ + Source/JavaScriptCore/assembler/ARMv7Assembler.cpp \ + Source/JavaScriptCore/assembler/ARMv7Assembler.h \ + Source/JavaScriptCore/assembler/AssemblerBuffer.h \ + Source/JavaScriptCore/assembler/AssemblerBufferWithConstantPool.h \ + Source/JavaScriptCore/assembler/CodeLocation.h \ + Source/JavaScriptCore/assembler/LinkBuffer.h \ + Source/JavaScriptCore/assembler/MacroAssemblerARM.cpp \ + Source/JavaScriptCore/assembler/MacroAssemblerARM.h \ + Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h \ + Source/JavaScriptCore/assembler/MacroAssemblerCodeRef.h \ + Source/JavaScriptCore/assembler/MacroAssembler.h \ + Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h \ + Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h \ + Source/JavaScriptCore/assembler/MacroAssemblerX86.h \ + Source/JavaScriptCore/assembler/MacroAssemblerSH4.h \ + Source/JavaScriptCore/assembler/MacroAssemblerSH4.cpp \ + Source/JavaScriptCore/assembler/SH4Assembler.h \ + Source/JavaScriptCore/assembler/RepatchBuffer.h \ + Source/JavaScriptCore/assembler/X86Assembler.h \ + Source/JavaScriptCore/bytecode/CodeBlock.cpp \ + Source/JavaScriptCore/bytecode/CodeBlock.h \ + Source/JavaScriptCore/bytecode/EvalCodeCache.h \ + Source/JavaScriptCore/bytecode/Instruction.h \ + Source/JavaScriptCore/bytecode/JumpTable.cpp \ + Source/JavaScriptCore/bytecode/JumpTable.h \ + Source/JavaScriptCore/bytecode/Opcode.cpp \ + Source/JavaScriptCore/bytecode/Opcode.h \ + Source/JavaScriptCore/bytecode/SamplingTool.cpp \ + Source/JavaScriptCore/bytecode/SamplingTool.h \ + Source/JavaScriptCore/bytecode/StructureStubInfo.cpp \ + Source/JavaScriptCore/bytecode/StructureStubInfo.h \ + Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp \ + Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h \ + Source/JavaScriptCore/bytecompiler/Label.h \ + Source/JavaScriptCore/bytecompiler/LabelScope.h \ + Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp \ + Source/JavaScriptCore/bytecompiler/RegisterID.h \ + Source/JavaScriptCore/heap/ConservativeRoots.cpp \ + Source/JavaScriptCore/heap/ConservativeRoots.h \ + Source/JavaScriptCore/heap/Handle.h \ + Source/JavaScriptCore/heap/HandleHeap.cpp \ + Source/JavaScriptCore/heap/HandleHeap.h \ + Source/JavaScriptCore/heap/HandleStack.cpp \ + Source/JavaScriptCore/heap/HandleStack.h \ + Source/JavaScriptCore/heap/HandleTypes.h \ + Source/JavaScriptCore/heap/Heap.cpp \ + Source/JavaScriptCore/heap/Heap.h \ + Source/JavaScriptCore/heap/Local.h \ + Source/JavaScriptCore/heap/LocalScope.h \ + Source/JavaScriptCore/heap/MachineStackMarker.cpp \ + Source/JavaScriptCore/heap/MachineStackMarker.h \ + Source/JavaScriptCore/heap/MarkStack.cpp \ + Source/JavaScriptCore/heap/MarkStack.h \ + Source/JavaScriptCore/heap/MarkedBlock.cpp \ + Source/JavaScriptCore/heap/MarkedBlock.h \ + Source/JavaScriptCore/heap/MarkedSpace.cpp \ + Source/JavaScriptCore/heap/MarkedSpace.h \ + Source/JavaScriptCore/heap/Strong.h \ + Source/JavaScriptCore/heap/Weak.h \ + Source/JavaScriptCore/config.h \ + Source/JavaScriptCore/debugger/DebuggerActivation.cpp \ + Source/JavaScriptCore/debugger/DebuggerActivation.h \ + Source/JavaScriptCore/debugger/DebuggerCallFrame.cpp \ + Source/JavaScriptCore/debugger/DebuggerCallFrame.h \ + Source/JavaScriptCore/debugger/Debugger.cpp \ + Source/JavaScriptCore/debugger/Debugger.h \ + Source/JavaScriptCore/ForwardingHeaders/JavaScriptCore/APICast.h \ + Source/JavaScriptCore/ForwardingHeaders/JavaScriptCore/APIShims.h \ + Source/JavaScriptCore/ForwardingHeaders/JavaScriptCore/JavaScriptCore.h \ + Source/JavaScriptCore/ForwardingHeaders/JavaScriptCore/JavaScript.h \ + Source/JavaScriptCore/ForwardingHeaders/JavaScriptCore/JSBase.h \ + Source/JavaScriptCore/ForwardingHeaders/JavaScriptCore/JSContextRef.h \ + Source/JavaScriptCore/ForwardingHeaders/JavaScriptCore/JSObjectRef.h \ + Source/JavaScriptCore/ForwardingHeaders/JavaScriptCore/JSRetainPtr.h \ + Source/JavaScriptCore/ForwardingHeaders/JavaScriptCore/JSStringRefCF.h \ + Source/JavaScriptCore/ForwardingHeaders/JavaScriptCore/JSStringRef.h \ + Source/JavaScriptCore/ForwardingHeaders/JavaScriptCore/JSValueRef.h \ + Source/JavaScriptCore/ForwardingHeaders/JavaScriptCore/OpaqueJSString.h \ + Source/JavaScriptCore/ForwardingHeaders/JavaScriptCore/WebKitAvailability.h \ + Source/JavaScriptCore/icu/unicode/parseerr.h \ + Source/JavaScriptCore/icu/unicode/platform.h \ + Source/JavaScriptCore/icu/unicode/putil.h \ + Source/JavaScriptCore/icu/unicode/uchar.h \ + Source/JavaScriptCore/icu/unicode/ucnv_err.h \ + Source/JavaScriptCore/icu/unicode/ucnv.h \ + Source/JavaScriptCore/icu/unicode/ucol.h \ + Source/JavaScriptCore/icu/unicode/uconfig.h \ + Source/JavaScriptCore/icu/unicode/uenum.h \ + Source/JavaScriptCore/icu/unicode/uiter.h \ + Source/JavaScriptCore/icu/unicode/uloc.h \ + Source/JavaScriptCore/icu/unicode/umachine.h \ + Source/JavaScriptCore/icu/unicode/unorm.h \ + Source/JavaScriptCore/icu/unicode/urename.h \ + Source/JavaScriptCore/icu/unicode/uset.h \ + Source/JavaScriptCore/icu/unicode/ustring.h \ + Source/JavaScriptCore/icu/unicode/utf16.h \ + Source/JavaScriptCore/icu/unicode/utf8.h \ + Source/JavaScriptCore/icu/unicode/utf.h \ + Source/JavaScriptCore/icu/unicode/utf_old.h \ + Source/JavaScriptCore/icu/unicode/utypes.h \ + Source/JavaScriptCore/icu/unicode/uversion.h \ + Source/JavaScriptCore/interpreter/CachedCall.h \ + Source/JavaScriptCore/interpreter/CallFrameClosure.h \ + Source/JavaScriptCore/interpreter/CallFrame.cpp \ + Source/JavaScriptCore/interpreter/CallFrame.h \ + Source/JavaScriptCore/interpreter/Interpreter.cpp \ + Source/JavaScriptCore/interpreter/Interpreter.h \ + Source/JavaScriptCore/interpreter/RegisterFile.cpp \ + Source/JavaScriptCore/interpreter/RegisterFile.h \ + Source/JavaScriptCore/interpreter/Register.h \ + Source/JavaScriptCore/JavaScriptCorePrefix.h \ + Source/JavaScriptCore/jit/ExecutableAllocator.cpp \ + Source/JavaScriptCore/jit/ExecutableAllocator.h \ + Source/JavaScriptCore/jit/JITArithmetic32_64.cpp \ + Source/JavaScriptCore/jit/JITArithmetic.cpp \ + Source/JavaScriptCore/jit/JITCall32_64.cpp \ + Source/JavaScriptCore/jit/JITCall.cpp \ + Source/JavaScriptCore/jit/JITCode.h \ + Source/JavaScriptCore/jit/JIT.cpp \ + Source/JavaScriptCore/jit/JIT.h \ + Source/JavaScriptCore/jit/JITInlineMethods.h \ + Source/JavaScriptCore/jit/JITOpcodes32_64.cpp \ + Source/JavaScriptCore/jit/JITOpcodes.cpp \ + Source/JavaScriptCore/jit/JITPropertyAccess32_64.cpp \ + Source/JavaScriptCore/jit/JITPropertyAccess.cpp \ + Source/JavaScriptCore/jit/JITStubCall.h \ + Source/JavaScriptCore/jit/JITStubs.cpp \ + Source/JavaScriptCore/jit/JITStubs.h \ + Source/JavaScriptCore/jit/JSInterfaceJIT.h \ + Source/JavaScriptCore/jit/SpecializedThunkJIT.h \ + Source/JavaScriptCore/jit/ThunkGenerators.cpp \ + Source/JavaScriptCore/jit/ThunkGenerators.h \ + Source/JavaScriptCore/os-win32/stdbool.h \ + Source/JavaScriptCore/os-win32/stdint.h \ + Source/JavaScriptCore/parser/ASTBuilder.h \ + Source/JavaScriptCore/parser/JSParser.cpp \ + Source/JavaScriptCore/parser/JSParser.h \ + Source/JavaScriptCore/parser/Lexer.cpp \ + Source/JavaScriptCore/parser/Lexer.h \ + Source/JavaScriptCore/parser/NodeConstructors.h \ + Source/JavaScriptCore/parser/NodeInfo.h \ + Source/JavaScriptCore/parser/Nodes.cpp \ + Source/JavaScriptCore/parser/Nodes.h \ + Source/JavaScriptCore/parser/ParserArena.cpp \ + Source/JavaScriptCore/parser/ParserArena.h \ + Source/JavaScriptCore/parser/Parser.cpp \ + Source/JavaScriptCore/parser/Parser.h \ + Source/JavaScriptCore/parser/ResultType.h \ + Source/JavaScriptCore/parser/SourceCode.h \ + Source/JavaScriptCore/parser/SourceProvider.h \ + Source/JavaScriptCore/parser/SourceProviderCache.cpp \ + Source/JavaScriptCore/parser/SourceProviderCache.h \ + Source/JavaScriptCore/parser/SourceProviderCacheItem.h \ + Source/JavaScriptCore/parser/SyntaxChecker.h \ + Source/JavaScriptCore/profiler/CallIdentifier.h \ + Source/JavaScriptCore/profiler/Profile.cpp \ + Source/JavaScriptCore/profiler/ProfileGenerator.cpp \ + Source/JavaScriptCore/profiler/ProfileGenerator.h \ + Source/JavaScriptCore/profiler/Profile.h \ + Source/JavaScriptCore/profiler/ProfileNode.cpp \ + Source/JavaScriptCore/profiler/ProfileNode.h \ + Source/JavaScriptCore/profiler/Profiler.cpp \ + Source/JavaScriptCore/profiler/Profiler.h \ + Source/JavaScriptCore/runtime/ArgList.cpp \ + Source/JavaScriptCore/runtime/ArgList.h \ + Source/JavaScriptCore/runtime/Arguments.cpp \ + Source/JavaScriptCore/runtime/Arguments.h \ + Source/JavaScriptCore/runtime/ArrayConstructor.cpp \ + Source/JavaScriptCore/runtime/ArrayConstructor.h \ + Source/JavaScriptCore/runtime/ArrayPrototype.cpp \ + Source/JavaScriptCore/runtime/ArrayPrototype.h \ + Source/JavaScriptCore/runtime/BatchedTransitionOptimizer.h \ + Source/JavaScriptCore/runtime/BooleanConstructor.cpp \ + Source/JavaScriptCore/runtime/BooleanConstructor.h \ + Source/JavaScriptCore/runtime/BooleanObject.cpp \ + Source/JavaScriptCore/runtime/BooleanObject.h \ + Source/JavaScriptCore/runtime/BooleanPrototype.cpp \ + Source/JavaScriptCore/runtime/BooleanPrototype.h \ + Source/JavaScriptCore/runtime/CachedTranscendentalFunction.h \ + Source/JavaScriptCore/runtime/CallData.cpp \ + Source/JavaScriptCore/runtime/CallData.h \ + Source/JavaScriptCore/runtime/ClassInfo.h \ + Source/JavaScriptCore/runtime/CommonIdentifiers.cpp \ + Source/JavaScriptCore/runtime/CommonIdentifiers.h \ + Source/JavaScriptCore/runtime/Completion.cpp \ + Source/JavaScriptCore/runtime/Completion.h \ + Source/JavaScriptCore/runtime/ConstructData.cpp \ + Source/JavaScriptCore/runtime/ConstructData.h \ + Source/JavaScriptCore/runtime/DateConstructor.cpp \ + Source/JavaScriptCore/runtime/DateConstructor.h \ + Source/JavaScriptCore/runtime/DateConversion.cpp \ + Source/JavaScriptCore/runtime/DateConversion.h \ + Source/JavaScriptCore/runtime/DateInstanceCache.h \ + Source/JavaScriptCore/runtime/DateInstance.cpp \ + Source/JavaScriptCore/runtime/DateInstance.h \ + Source/JavaScriptCore/runtime/DatePrototype.cpp \ + Source/JavaScriptCore/runtime/DatePrototype.h \ + Source/JavaScriptCore/runtime/ErrorConstructor.cpp \ + Source/JavaScriptCore/runtime/ErrorConstructor.h \ + Source/JavaScriptCore/runtime/Error.cpp \ + Source/JavaScriptCore/runtime/Error.h \ + Source/JavaScriptCore/runtime/ErrorInstance.cpp \ + Source/JavaScriptCore/runtime/ErrorInstance.h \ + Source/JavaScriptCore/runtime/ErrorPrototype.cpp \ + Source/JavaScriptCore/runtime/ErrorPrototype.h \ + Source/JavaScriptCore/runtime/ExceptionHelpers.cpp \ + Source/JavaScriptCore/runtime/ExceptionHelpers.h \ + Source/JavaScriptCore/runtime/Executable.cpp \ + Source/JavaScriptCore/runtime/Executable.h \ + Source/JavaScriptCore/runtime/FunctionConstructor.cpp \ + Source/JavaScriptCore/runtime/FunctionConstructor.h \ + Source/JavaScriptCore/runtime/FunctionPrototype.cpp \ + Source/JavaScriptCore/runtime/FunctionPrototype.h \ + Source/JavaScriptCore/runtime/GCActivityCallback.cpp \ + Source/JavaScriptCore/runtime/GCActivityCallback.h \ + Source/JavaScriptCore/runtime/GetterSetter.cpp \ + Source/JavaScriptCore/runtime/GetterSetter.h \ + Source/JavaScriptCore/runtime/Identifier.cpp \ + Source/JavaScriptCore/runtime/Identifier.h \ + Source/JavaScriptCore/runtime/InitializeThreading.cpp \ + Source/JavaScriptCore/runtime/InitializeThreading.h \ + Source/JavaScriptCore/runtime/InternalFunction.cpp \ + Source/JavaScriptCore/runtime/InternalFunction.h \ + Source/JavaScriptCore/runtime/JSActivation.cpp \ + Source/JavaScriptCore/runtime/JSActivation.h \ + Source/JavaScriptCore/runtime/JSAPIValueWrapper.cpp \ + Source/JavaScriptCore/runtime/JSAPIValueWrapper.h \ + Source/JavaScriptCore/runtime/JSArray.cpp \ + Source/JavaScriptCore/runtime/JSArray.h \ + Source/JavaScriptCore/runtime/JSByteArray.cpp \ + Source/JavaScriptCore/runtime/JSByteArray.h \ + Source/JavaScriptCore/runtime/JSCell.cpp \ + Source/JavaScriptCore/runtime/JSCell.h \ + Source/JavaScriptCore/runtime/JSFunction.cpp \ + Source/JavaScriptCore/runtime/JSFunction.h \ + Source/JavaScriptCore/runtime/JSGlobalData.cpp \ + Source/JavaScriptCore/runtime/JSGlobalData.h \ + Source/JavaScriptCore/runtime/JSGlobalObject.cpp \ + Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp \ + Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.h \ + Source/JavaScriptCore/runtime/JSGlobalObject.h \ + Source/JavaScriptCore/runtime/JSLock.cpp \ + Source/JavaScriptCore/runtime/JSLock.h \ + Source/JavaScriptCore/runtime/JSNotAnObject.cpp \ + Source/JavaScriptCore/runtime/JSNotAnObject.h \ + Source/JavaScriptCore/runtime/JSObject.cpp \ + Source/JavaScriptCore/runtime/JSObject.h \ + Source/JavaScriptCore/runtime/JSObjectWithGlobalObject.cpp \ + Source/JavaScriptCore/runtime/JSObjectWithGlobalObject.h \ + Source/JavaScriptCore/runtime/JSONObject.cpp \ + Source/JavaScriptCore/runtime/JSONObject.h \ + Source/JavaScriptCore/runtime/JSPropertyNameIterator.cpp \ + Source/JavaScriptCore/runtime/JSPropertyNameIterator.h \ + Source/JavaScriptCore/runtime/JSStaticScopeObject.cpp \ + Source/JavaScriptCore/runtime/JSStaticScopeObject.h \ + Source/JavaScriptCore/runtime/JSStringBuilder.h \ + Source/JavaScriptCore/runtime/JSString.cpp \ + Source/JavaScriptCore/runtime/JSString.h \ + Source/JavaScriptCore/runtime/JSType.h \ + Source/JavaScriptCore/runtime/JSTypeInfo.h \ + Source/JavaScriptCore/runtime/JSValue.cpp \ + Source/JavaScriptCore/runtime/JSValue.h \ + Source/JavaScriptCore/runtime/JSValueInlineMethods.h \ + Source/JavaScriptCore/runtime/JSVariableObject.cpp \ + Source/JavaScriptCore/runtime/JSVariableObject.h \ + Source/JavaScriptCore/runtime/JSWrapperObject.cpp \ + Source/JavaScriptCore/runtime/JSWrapperObject.h \ + Source/JavaScriptCore/runtime/JSZombie.h \ + Source/JavaScriptCore/runtime/LiteralParser.cpp \ + Source/JavaScriptCore/runtime/LiteralParser.h \ + Source/JavaScriptCore/runtime/Lookup.cpp \ + Source/JavaScriptCore/runtime/Lookup.h \ + Source/JavaScriptCore/runtime/MathObject.cpp \ + Source/JavaScriptCore/runtime/MathObject.h \ + Source/JavaScriptCore/runtime/NativeErrorConstructor.cpp \ + Source/JavaScriptCore/runtime/NativeErrorConstructor.h \ + Source/JavaScriptCore/runtime/NativeErrorPrototype.cpp \ + Source/JavaScriptCore/runtime/NativeErrorPrototype.h \ + Source/JavaScriptCore/runtime/NumberConstructor.cpp \ + Source/JavaScriptCore/runtime/NumberConstructor.h \ + Source/JavaScriptCore/runtime/NumberObject.cpp \ + Source/JavaScriptCore/runtime/NumberObject.h \ + Source/JavaScriptCore/runtime/NumberPrototype.cpp \ + Source/JavaScriptCore/runtime/NumberPrototype.h \ + Source/JavaScriptCore/runtime/NumericStrings.h \ + Source/JavaScriptCore/runtime/ObjectConstructor.cpp \ + Source/JavaScriptCore/runtime/ObjectConstructor.h \ + Source/JavaScriptCore/runtime/ObjectPrototype.cpp \ + Source/JavaScriptCore/runtime/ObjectPrototype.h \ + Source/JavaScriptCore/runtime/Operations.cpp \ + Source/JavaScriptCore/runtime/Operations.h \ + Source/JavaScriptCore/runtime/PropertyDescriptor.cpp \ + Source/JavaScriptCore/runtime/PropertyDescriptor.h \ + Source/JavaScriptCore/runtime/PropertyMapHashTable.h \ + Source/JavaScriptCore/runtime/PropertyNameArray.cpp \ + Source/JavaScriptCore/runtime/PropertyNameArray.h \ + Source/JavaScriptCore/runtime/PropertySlot.cpp \ + Source/JavaScriptCore/runtime/PropertySlot.h \ + Source/JavaScriptCore/runtime/Protect.h \ + Source/JavaScriptCore/runtime/PutPropertySlot.h \ + Source/JavaScriptCore/runtime/RegExpCache.cpp \ + Source/JavaScriptCore/runtime/RegExpCache.h \ + Source/JavaScriptCore/runtime/RegExpConstructor.cpp \ + Source/JavaScriptCore/runtime/RegExpConstructor.h \ + Source/JavaScriptCore/runtime/RegExp.cpp \ + Source/JavaScriptCore/runtime/RegExp.h \ + Source/JavaScriptCore/runtime/RegExpKey.h \ + Source/JavaScriptCore/runtime/RegExpMatchesArray.h \ + Source/JavaScriptCore/runtime/RegExpObject.cpp \ + Source/JavaScriptCore/runtime/RegExpObject.h \ + Source/JavaScriptCore/runtime/RegExpPrototype.cpp \ + Source/JavaScriptCore/runtime/RegExpPrototype.h \ + Source/JavaScriptCore/runtime/RopeImpl.cpp \ + Source/JavaScriptCore/runtime/RopeImpl.h \ + Source/JavaScriptCore/runtime/ScopeChain.cpp \ + Source/JavaScriptCore/runtime/ScopeChain.h \ + Source/JavaScriptCore/runtime/ScopeChainMark.h \ + Source/JavaScriptCore/runtime/SmallStrings.cpp \ + Source/JavaScriptCore/runtime/SmallStrings.h \ + Source/JavaScriptCore/runtime/StrictEvalActivation.cpp \ + Source/JavaScriptCore/runtime/StrictEvalActivation.h \ + Source/JavaScriptCore/runtime/StringConstructor.cpp \ + Source/JavaScriptCore/runtime/StringConstructor.h \ + Source/JavaScriptCore/runtime/StringObject.cpp \ + Source/JavaScriptCore/runtime/StringObject.h \ + Source/JavaScriptCore/runtime/StringObjectThatMasqueradesAsUndefined.h \ + Source/JavaScriptCore/runtime/StringPrototype.cpp \ + Source/JavaScriptCore/runtime/StringPrototype.h \ + Source/JavaScriptCore/runtime/StringRecursionChecker.cpp \ + Source/JavaScriptCore/runtime/StringRecursionChecker.h \ + Source/JavaScriptCore/runtime/StructureChain.cpp \ + Source/JavaScriptCore/runtime/StructureChain.h \ + Source/JavaScriptCore/runtime/Structure.cpp \ + Source/JavaScriptCore/runtime/Structure.h \ + Source/JavaScriptCore/runtime/StructureTransitionTable.h \ + Source/JavaScriptCore/runtime/SymbolTable.h \ + Source/JavaScriptCore/runtime/Terminator.h \ + Source/JavaScriptCore/runtime/TimeoutChecker.cpp \ + Source/JavaScriptCore/runtime/TimeoutChecker.h \ + Source/JavaScriptCore/runtime/Tracing.h \ + Source/JavaScriptCore/runtime/UString.cpp \ + Source/JavaScriptCore/runtime/UString.h \ + Source/JavaScriptCore/runtime/UStringBuilder.h \ + Source/JavaScriptCore/runtime/UStringConcatenate.h \ + Source/JavaScriptCore/runtime/WeakGCMap.h \ + Source/JavaScriptCore/runtime/WeakRandom.h \ + Source/JavaScriptCore/runtime/WriteBarrier.h \ + Source/JavaScriptCore/wtf/AlwaysInline.h \ + Source/JavaScriptCore/wtf/ASCIICType.h \ + Source/JavaScriptCore/wtf/Assertions.cpp \ + Source/JavaScriptCore/wtf/Assertions.h \ + Source/JavaScriptCore/wtf/Atomics.h \ + Source/JavaScriptCore/wtf/AVLTree.h \ + Source/JavaScriptCore/wtf/Bitmap.h \ + Source/JavaScriptCore/wtf/BlockStack.h \ + Source/JavaScriptCore/wtf/BloomFilter.h \ + Source/JavaScriptCore/wtf/BumpPointerAllocator.h \ + Source/JavaScriptCore/wtf/ByteArray.cpp \ + Source/JavaScriptCore/wtf/ByteArray.h \ + Source/JavaScriptCore/wtf/CrossThreadRefCounted.h \ + Source/JavaScriptCore/wtf/CryptographicallyRandomNumber.cpp \ + Source/JavaScriptCore/wtf/CryptographicallyRandomNumber.h \ + Source/JavaScriptCore/wtf/CurrentTime.cpp \ + Source/JavaScriptCore/wtf/CurrentTime.h \ + Source/JavaScriptCore/wtf/DateMath.cpp \ + Source/JavaScriptCore/wtf/DateMath.h \ + Source/JavaScriptCore/wtf/DecimalNumber.h \ + Source/JavaScriptCore/wtf/DecimalNumber.cpp \ + Source/JavaScriptCore/wtf/Decoder.h \ + Source/JavaScriptCore/wtf/Deque.h \ + Source/JavaScriptCore/wtf/DisallowCType.h \ + Source/JavaScriptCore/wtf/DoublyLinkedList.h \ + Source/JavaScriptCore/wtf/dtoa.cpp \ + Source/JavaScriptCore/wtf/dtoa.h \ + Source/JavaScriptCore/wtf/DynamicAnnotations.cpp \ + Source/JavaScriptCore/wtf/DynamicAnnotations.h \ + Source/JavaScriptCore/wtf/Encoder.h \ + Source/JavaScriptCore/wtf/FastAllocBase.h \ + Source/JavaScriptCore/wtf/FastMalloc.cpp \ + Source/JavaScriptCore/wtf/FastMalloc.h \ + Source/JavaScriptCore/wtf/FixedArray.h \ + Source/JavaScriptCore/wtf/Forward.h \ + Source/JavaScriptCore/wtf/GetPtr.h \ + Source/JavaScriptCore/wtf/gobject/GOwnPtr.cpp \ + Source/JavaScriptCore/wtf/gobject/GOwnPtr.h \ + Source/JavaScriptCore/wtf/gobject/GRefPtr.cpp \ + Source/JavaScriptCore/wtf/gobject/GRefPtr.h \ + Source/JavaScriptCore/wtf/gobject/GTypedefs.h \ + Source/JavaScriptCore/wtf/gtk/MainThreadGtk.cpp \ + Source/JavaScriptCore/wtf/gtk/ThreadingGtk.cpp \ + Source/JavaScriptCore/wtf/HashCountedSet.h \ + Source/JavaScriptCore/wtf/HashFunctions.h \ + Source/JavaScriptCore/wtf/HashIterators.h \ + Source/JavaScriptCore/wtf/HashMap.h \ + Source/JavaScriptCore/wtf/HashSet.h \ + Source/JavaScriptCore/wtf/HashTable.cpp \ + Source/JavaScriptCore/wtf/HashTable.h \ + Source/JavaScriptCore/wtf/HashTraits.h \ + Source/JavaScriptCore/wtf/HexNumber.h \ + Source/JavaScriptCore/wtf/ListHashSet.h \ + Source/JavaScriptCore/wtf/ListRefPtr.h \ + Source/JavaScriptCore/wtf/Locker.h \ + Source/JavaScriptCore/wtf/MainThread.cpp \ + Source/JavaScriptCore/wtf/MainThread.h \ + Source/JavaScriptCore/wtf/MallocZoneSupport.h \ + Source/JavaScriptCore/wtf/MathExtras.h \ + Source/JavaScriptCore/wtf/MD5.cpp \ + Source/JavaScriptCore/wtf/MD5.h \ + Source/JavaScriptCore/wtf/MessageQueue.h \ + Source/JavaScriptCore/wtf/NonCopyingSort.h \ + Source/JavaScriptCore/wtf/Noncopyable.h \ + Source/JavaScriptCore/wtf/NotFound.h \ + Source/JavaScriptCore/wtf/NullPtr.h \ + Source/JavaScriptCore/wtf/OSAllocator.h \ + Source/JavaScriptCore/wtf/OSRandomSource.cpp \ + Source/JavaScriptCore/wtf/OSRandomSource.h \ + Source/JavaScriptCore/wtf/OwnArrayPtr.h \ + Source/JavaScriptCore/wtf/OwnFastMallocPtr.h \ + Source/JavaScriptCore/wtf/OwnPtrCommon.h \ + Source/JavaScriptCore/wtf/OwnPtr.h \ + Source/JavaScriptCore/wtf/PageAllocation.h \ + Source/JavaScriptCore/wtf/PageAllocationAligned.cpp \ + Source/JavaScriptCore/wtf/PageAllocationAligned.h \ + Source/JavaScriptCore/wtf/PageReservation.h \ + Source/JavaScriptCore/wtf/PageBlock.cpp \ + Source/JavaScriptCore/wtf/PageBlock.h \ + Source/JavaScriptCore/wtf/PassOwnArrayPtr.h \ + Source/JavaScriptCore/wtf/PassOwnPtr.h \ + Source/JavaScriptCore/wtf/PassRefPtr.h \ + Source/JavaScriptCore/wtf/PassTraits.h \ + Source/JavaScriptCore/wtf/ParallelJobs.h \ + Source/JavaScriptCore/wtf/ParallelJobsGeneric.cpp \ + Source/JavaScriptCore/wtf/ParallelJobsGeneric.h \ + Source/JavaScriptCore/wtf/ParallelJobsLibdispatch.h \ + Source/JavaScriptCore/wtf/ParallelJobsOpenMP.h \ + Source/JavaScriptCore/wtf/Platform.h \ + Source/JavaScriptCore/wtf/PossiblyNull.h \ + Source/JavaScriptCore/wtf/RandomNumber.cpp \ + Source/JavaScriptCore/wtf/RandomNumber.h \ + Source/JavaScriptCore/wtf/RandomNumberSeed.h \ + Source/JavaScriptCore/wtf/RefCounted.h \ + Source/JavaScriptCore/wtf/RefCountedLeakCounter.cpp \ + Source/JavaScriptCore/wtf/RefCountedLeakCounter.h \ + Source/JavaScriptCore/wtf/RefPtr.h \ + Source/JavaScriptCore/wtf/RefPtrHashMap.h \ + Source/JavaScriptCore/wtf/RetainPtr.h \ + Source/JavaScriptCore/wtf/SegmentedVector.h \ + Source/JavaScriptCore/wtf/SentinelLinkedList.h \ + Source/JavaScriptCore/wtf/SHA1.cpp \ + Source/JavaScriptCore/wtf/SHA1.h \ + Source/JavaScriptCore/wtf/SinglyLinkedList.h \ + Source/JavaScriptCore/wtf/StackBounds.cpp \ + Source/JavaScriptCore/wtf/StackBounds.h \ + Source/JavaScriptCore/wtf/StaticConstructors.h \ + Source/JavaScriptCore/wtf/StdLibExtras.h \ + Source/JavaScriptCore/wtf/StringExtras.h \ + Source/JavaScriptCore/wtf/StringHasher.h \ + Source/JavaScriptCore/wtf/TCPackedCache.h \ + Source/JavaScriptCore/wtf/TCPageMap.h \ + Source/JavaScriptCore/wtf/TCSpinLock.h \ + Source/JavaScriptCore/wtf/TCSystemAlloc.cpp \ + Source/JavaScriptCore/wtf/TCSystemAlloc.h \ + Source/JavaScriptCore/wtf/text/AtomicString.cpp \ + Source/JavaScriptCore/wtf/text/AtomicString.h \ + Source/JavaScriptCore/wtf/text/AtomicStringHash.h \ + Source/JavaScriptCore/wtf/text/AtomicStringImpl.h \ + Source/JavaScriptCore/wtf/text/CString.cpp \ + Source/JavaScriptCore/wtf/text/CString.h \ + Source/JavaScriptCore/wtf/text/StringBuffer.h \ + Source/JavaScriptCore/wtf/text/StringBuilder.cpp \ + Source/JavaScriptCore/wtf/text/StringBuilder.h \ + Source/JavaScriptCore/wtf/text/StringConcatenate.h \ + Source/JavaScriptCore/wtf/text/StringHash.h \ + Source/JavaScriptCore/wtf/text/StringImplBase.h \ + Source/JavaScriptCore/wtf/text/StringImpl.cpp \ + Source/JavaScriptCore/wtf/text/StringImpl.h \ + Source/JavaScriptCore/wtf/text/StringOperators.h \ + Source/JavaScriptCore/wtf/text/StringStatics.cpp \ + Source/JavaScriptCore/wtf/text/TextPosition.h \ + Source/JavaScriptCore/wtf/text/WTFString.cpp \ + Source/JavaScriptCore/wtf/text/WTFString.h \ + Source/JavaScriptCore/wtf/ThreadIdentifierDataPthreads.cpp \ + Source/JavaScriptCore/wtf/ThreadIdentifierDataPthreads.h \ + Source/JavaScriptCore/wtf/Threading.cpp \ + Source/JavaScriptCore/wtf/Threading.h \ + Source/JavaScriptCore/wtf/ThreadingPrimitives.h \ + Source/JavaScriptCore/wtf/ThreadingPthreads.cpp \ + Source/JavaScriptCore/wtf/ThreadSafeRefCounted.h \ + Source/JavaScriptCore/wtf/ThreadSpecific.h \ + Source/JavaScriptCore/wtf/TypeTraits.cpp \ + Source/JavaScriptCore/wtf/TypeTraits.h \ + Source/JavaScriptCore/wtf/unicode/CharacterNames.h \ + Source/JavaScriptCore/wtf/unicode/CollatorDefault.cpp \ + Source/JavaScriptCore/wtf/unicode/Collator.h \ + Source/JavaScriptCore/wtf/unicode/Unicode.h \ + Source/JavaScriptCore/wtf/unicode/UTF8.cpp \ + Source/JavaScriptCore/wtf/unicode/UTF8.h \ + Source/JavaScriptCore/wtf/UnusedParam.h \ + Source/JavaScriptCore/wtf/ValueCheck.h \ + Source/JavaScriptCore/wtf/Vector.h \ + Source/JavaScriptCore/wtf/VectorTraits.h \ + Source/JavaScriptCore/wtf/VMTags.h \ + Source/JavaScriptCore/wtf/WTFThreadData.cpp \ + Source/JavaScriptCore/wtf/WTFThreadData.h \ + Source/JavaScriptCore/yarr/Yarr.h \ + Source/JavaScriptCore/yarr/YarrInterpreter.cpp \ + Source/JavaScriptCore/yarr/YarrInterpreter.h \ + Source/JavaScriptCore/yarr/YarrJIT.cpp \ + Source/JavaScriptCore/yarr/YarrJIT.h \ + Source/JavaScriptCore/yarr/YarrParser.h \ + Source/JavaScriptCore/yarr/YarrPattern.cpp \ + Source/JavaScriptCore/yarr/YarrPattern.h \ + Source/JavaScriptCore/yarr/YarrSyntaxChecker.cpp \ + Source/JavaScriptCore/yarr/YarrSyntaxChecker.h + +if TARGET_WIN32 +javascriptcore_sources += \ + Source/JavaScriptCore/heap/MarkStackWin.cpp \ + Source/JavaScriptCore/wtf/OSAllocatorWin.cpp +else +javascriptcore_sources += \ + Source/JavaScriptCore/jit/ExecutableAllocatorFixedVMPool.cpp \ + Source/JavaScriptCore/heap/MarkStackPosix.cpp \ + Source/JavaScriptCore/wtf/OSAllocatorPosix.cpp +endif + +# ---- +# icu unicode backend +# ---- +if USE_ICU_UNICODE +javascriptcore_sources += \ + Source/JavaScriptCore/wtf/unicode/icu/CollatorICU.cpp \ + Source/JavaScriptCore/wtf/unicode/icu/UnicodeIcu.h +endif # USE_ICU_UNICODE + +# ---- +# glib unicode backend +# ---- +if USE_GLIB_UNICODE +javascriptcore_sources += \ + Source/JavaScriptCore/wtf/unicode/UnicodeMacrosFromICU.h \ + Source/JavaScriptCore/wtf/unicode/glib/UnicodeGLib.h \ + Source/JavaScriptCore/wtf/unicode/glib/UnicodeGLib.cpp +endif # USE_GLIB_UNICODE + +# minidom +Programs_minidom_SOURCES = \ + Source/JavaScriptCore/API/tests/JSNode.c \ + Source/JavaScriptCore/API/tests/JSNode.h \ + Source/JavaScriptCore/API/tests/JSNodeList.c \ + Source/JavaScriptCore/API/tests/JSNodeList.h \ + Source/JavaScriptCore/API/tests/Node.c \ + Source/JavaScriptCore/API/tests/Node.h \ + Source/JavaScriptCore/API/tests/NodeList.c \ + Source/JavaScriptCore/API/tests/NodeList.h \ + Source/JavaScriptCore/API/tests/minidom.c + +Programs_jsc_@WEBKITGTK_API_MAJOR_VERSION@_SOURCES = \ + Source/JavaScriptCore/jsc.cpp diff --git a/Info.plist b/Info.plist index 77c9eb8..a8ae5cc 100644 --- a/Info.plist +++ b/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${PRODUCT_NAME} CFBundleGetInfoString - ${BUNDLE_VERSION}, Copyright 2003-2010 Apple Inc.; Copyright 1999-2001 Harri Porten <porten@kde.org>; Copyright 2001 Peter Kelly <pmk@post.com>; Copyright 1997-2005 University of Cambridge; Copyright 1991, 2000, 2001 by Lucent Technologies. + ${BUNDLE_VERSION}, Copyright 2003-2011 Apple Inc.; Copyright 1999-2001 Harri Porten <porten@kde.org>; Copyright 2001 Peter Kelly <pmk@post.com>; Copyright 1997-2005 University of Cambridge; Copyright 1991, 2000, 2001 by Lucent Technologies. CFBundleIdentifier com.apple.${PRODUCT_NAME} CFBundleInfoDictionaryVersion diff --git a/JavaScriptCore.JSVALUE32_64only.exp b/JavaScriptCore.JSVALUE32_64only.exp new file mode 100644 index 0000000..f9eee85 --- /dev/null +++ b/JavaScriptCore.JSVALUE32_64only.exp @@ -0,0 +1 @@ +__ZN3JSC10JSFunctionC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEiRKNS_10IdentifierEPFxS2_E diff --git a/JavaScriptCore.JSVALUE64only.exp b/JavaScriptCore.JSVALUE64only.exp new file mode 100644 index 0000000..eaa9f51 --- /dev/null +++ b/JavaScriptCore.JSVALUE64only.exp @@ -0,0 +1 @@ +__ZN3JSC10JSFunctionC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEiRKNS_10IdentifierEPFPvS2_E diff --git a/JavaScriptCore.exp b/JavaScriptCore.exp index 6b5f9b7..9c88059 100644 --- a/JavaScriptCore.exp +++ b/JavaScriptCore.exp @@ -8,6 +8,7 @@ _JSContextGetGroup _JSContextGroupCreate _JSContextGroupRelease _JSContextGroupRetain +_JSContextCreateBacktrace _JSEndProfiling _JSEvaluateScript _JSGarbageCollect @@ -87,38 +88,43 @@ _JSValueUnprotect _JSWeakObjectMapClear _JSWeakObjectMapCreate _JSWeakObjectMapGet +_JSWeakObjectMapRemove _JSWeakObjectMapSet _WTFLog _WTFLogVerbose _WTFReportArgumentAssertionFailure _WTFReportAssertionFailure _WTFReportAssertionFailureWithMessage +_WTFReportBacktrace _WTFReportError _WTFReportFatalError _WebCoreWebThreadIsLockedOrDisabled -__Z12jsRegExpFreeP8JSRegExp -__Z15jsRegExpCompilePKti24JSRegExpIgnoreCaseOption23JSRegExpMultilineOptionPjPPKc -__Z15jsRegExpExecutePK8JSRegExpPKtiiPii __ZN14OpaqueJSString6createERKN3JSC7UStringE -__ZN3JSC10Identifier11addSlowCaseEPNS_12JSGlobalDataEPN7WebCore10StringImplE -__ZN3JSC10Identifier11addSlowCaseEPNS_9ExecStateEPN7WebCore10StringImplE +__ZN3JSC10HandleHeap12writeBarrierEPNS_7JSValueERKS1_ +__ZN3JSC10HandleHeap4growEv +__ZN3JSC10Identifier11addSlowCaseEPNS_12JSGlobalDataEPN3WTF10StringImplE +__ZN3JSC10Identifier11addSlowCaseEPNS_9ExecStateEPN3WTF10StringImplE __ZN3JSC10Identifier27checkCurrentIdentifierTableEPNS_12JSGlobalDataE __ZN3JSC10Identifier27checkCurrentIdentifierTableEPNS_9ExecStateE __ZN3JSC10Identifier3addEPNS_9ExecStateEPKc __ZN3JSC10Identifier4fromEPNS_9ExecStateEi __ZN3JSC10Identifier4fromEPNS_9ExecStateEj -__ZN3JSC10Identifier5equalEPKN7WebCore10StringImplEPKc -__ZN3JSC10JSFunctionC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEiRKNS_10IdentifierEPFNS_7JSValueES2_PNS_8JSObjectESA_RKNS_7ArgListEE -__ZN3JSC10throwErrorEPNS_9ExecStateENS_9ErrorTypeE -__ZN3JSC10throwErrorEPNS_9ExecStateENS_9ErrorTypeEPKc -__ZN3JSC10throwErrorEPNS_9ExecStateENS_9ErrorTypeERKNS_7UStringE -__ZN3JSC11JSByteArray15createStructureENS_7JSValueE -__ZN3JSC11JSByteArrayC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPNS3_9ByteArrayEPKNS_9ClassInfoE +__ZN3JSC10Identifier5equalEPKN3WTF10StringImplEPKc +__ZN3JSC10Identifier8toUInt32ERKNS_7UStringERb +__ZN3JSC10JSFunction4nameEPNS_9ExecStateE +__ZN3JSC10JSFunction6s_infoE +__ZN3JSC10throwErrorEPNS_9ExecStateENS_7JSValueE +__ZN3JSC10throwErrorEPNS_9ExecStateEPNS_8JSObjectE +__ZN3JSC11JSByteArray13s_defaultInfoE +__ZN3JSC11JSByteArray15createStructureERNS_12JSGlobalDataENS_7JSValueEPKNS_9ClassInfoE +__ZN3JSC11JSByteArrayC1EPNS_9ExecStateEPNS_9StructureEPN3WTF9ByteArrayE +__ZN3JSC11MarkedSpace21allocateFromSizeClassERNS0_9SizeClassE __ZN3JSC11ParserArena5resetEv __ZN3JSC11checkSyntaxEPNS_9ExecStateERKNS_10SourceCodeE -__ZN3JSC12DateInstance4infoE -__ZN3JSC12DateInstanceC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEd -__ZN3JSC12DateInstanceC1EPNS_9ExecStateEd +__ZN3JSC11createErrorEPNS_9ExecStateERKNS_7UStringE +__ZN3JSC11regExpFlagsERKNS_7UStringE +__ZN3JSC12DateInstance6s_infoE +__ZN3JSC12DateInstanceC1EPNS_9ExecStateEPNS_9StructureEd __ZN3JSC12JSGlobalData10ClientDataD2Ev __ZN3JSC12JSGlobalData11jsArrayVPtrE __ZN3JSC12JSGlobalData12createLeakedENS_15ThreadStackTypeE @@ -128,8 +134,15 @@ __ZN3JSC12JSGlobalData13startSamplingEv __ZN3JSC12JSGlobalData14dumpSampleDataEPNS_9ExecStateE __ZN3JSC12JSGlobalData14resetDateCacheEv __ZN3JSC12JSGlobalData14sharedInstanceEv +__ZN3JSC12JSGlobalData15dumpRegExpTraceEv +__ZN3JSC12JSGlobalData22clearBuiltinStructuresEv +#ifndef NDEBUG +__ZN3JSC12JSGlobalData23releaseExecutableMemoryEv +#endif __ZN3JSC12JSGlobalData6createENS_15ThreadStackTypeE __ZN3JSC12JSGlobalDataD1Ev +__ZN3JSC12RegExpObject6s_infoE +__ZN3JSC12RegExpObjectC1EPNS_14JSGlobalObjectEPNS_9StructureEPNS_6RegExpE __ZN3JSC12SamplingTool5setupEv __ZN3JSC12SmallStrings17createEmptyStringEPNS_12JSGlobalDataE __ZN3JSC12SmallStrings27createSingleCharacterStringEPNS_12JSGlobalDataEh @@ -139,44 +152,56 @@ __ZN3JSC12StringObject18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE __ZN3JSC12StringObject19getOwnPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE __ZN3JSC12StringObject24getOwnPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE __ZN3JSC12StringObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE -__ZN3JSC12StringObject4infoE -__ZN3JSC12StringObjectC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEERKNS_7UStringE -__ZN3JSC12jsNumberCellEPNS_9ExecStateEd +__ZN3JSC12StringObject6s_infoE +__ZN3JSC12StringObjectC2EPNS_9ExecStateEPNS_9StructureERKNS_7UStringE __ZN3JSC12nonInlineNaNEv __ZN3JSC13SamplingFlags4stopEv __ZN3JSC13SamplingFlags5startEv __ZN3JSC13SamplingFlags7s_flagsE __ZN3JSC13StatementNode6setLocEii __ZN3JSC14JSGlobalObject10globalExecEv +__ZN3JSC14JSGlobalObject11disableEvalEv __ZN3JSC14JSGlobalObject12defineGetterEPNS_9ExecStateERKNS_10IdentifierEPNS_8JSObjectEj __ZN3JSC14JSGlobalObject12defineSetterEPNS_9ExecStateERKNS_10IdentifierEPNS_8JSObjectEj -__ZN3JSC14JSGlobalObject12markChildrenERNS_9MarkStackE +__ZN3JSC14JSGlobalObject13visitChildrenERNS_9MarkStackE +__ZN3JSC14JSGlobalObject16addStaticGlobalsEPNS0_18GlobalPropertyInfoEi __ZN3JSC14JSGlobalObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueEj -__ZN3JSC14JSGlobalObject25destroyJSGlobalObjectDataEPv +__ZN3JSC14JSGlobalObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC14JSGlobalObject24getOwnPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE __ZN3JSC14JSGlobalObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE __ZN3JSC14JSGlobalObject4initEPNS_8JSObjectE +__ZN3JSC14JSGlobalObject6s_infoE __ZN3JSC14JSGlobalObjectD2Ev __ZN3JSC14JSGlobalObjectnwEmPNS_12JSGlobalDataE +__ZN3JSC14MachineThreads16addCurrentThreadEv +__ZN3JSC14MachineThreads29makeUsableFromMultipleThreadsEv __ZN3JSC14SamplingThread4stopEv __ZN3JSC14SamplingThread5startEj +__ZN3JSC14ScopeChainNode6s_infoE __ZN3JSC14TimeoutChecker10didTimeOutEPNS_9ExecStateE __ZN3JSC14TimeoutChecker5resetEv -__ZN3JSC15JSWrapperObject12markChildrenERNS_9MarkStackE -__ZN3JSC15createTypeErrorEPNS_9ExecStateEPKc -__ZN3JSC15toInt32SlowCaseEdRb -__ZN3JSC16InternalFunction4infoE +__ZN3JSC14throwTypeErrorEPNS_9ExecStateE +__ZN3JSC15JSWrapperObject13visitChildrenERNS_9MarkStackE +__ZN3JSC15WeakHandleOwner26isReachableFromOpaqueRootsENS_6HandleINS_7UnknownEEEPvRNS_9MarkStackE +__ZN3JSC15WeakHandleOwner8finalizeENS_6HandleINS_7UnknownEEEPv +__ZN3JSC15WeakHandleOwnerD2Ev +__ZN3JSC15createTypeErrorEPNS_9ExecStateERKNS_7UStringE +__ZN3JSC16InternalFunction12vtableAnchorEv __ZN3JSC16InternalFunction4nameEPNS_9ExecStateE -__ZN3JSC16InternalFunctionC2EPNS_12JSGlobalDataEN3WTF17NonNullPassRefPtrINS_9StructureEEERKNS_10IdentifierE +__ZN3JSC16InternalFunction6s_infoE +__ZN3JSC16InternalFunctionC2EPNS_12JSGlobalDataEPNS_14JSGlobalObjectEPNS_9StructureERKNS_10IdentifierE __ZN3JSC16JSVariableObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE __ZN3JSC16JSVariableObject14symbolTableGetERKNS_10IdentifierERNS_18PropertyDescriptorE __ZN3JSC16JSVariableObject19getOwnPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE -__ZN3JSC16toUInt32SlowCaseEdRb +__ZN3JSC16createRangeErrorEPNS_9ExecStateERKNS_7UStringE +__ZN3JSC16slowValidateCellEPNS_14JSGlobalObjectE +__ZN3JSC16slowValidateCellEPNS_6JSCellE +__ZN3JSC16throwSyntaxErrorEPNS_9ExecStateE __ZN3JSC17BytecodeGenerator21setDumpsGeneratedCodeEb -__ZN3JSC17PropertyNameArray3addEPN7WebCore10StringImplE -__ZN3JSC17PrototypeFunctionC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEiRKNS_10IdentifierEPFNS_7JSValueES2_PNS_8JSObjectESA_RKNS_7ArgListEE -__ZN3JSC17PrototypeFunctionC1EPNS_9ExecStateEiRKNS_10IdentifierEPFNS_7JSValueES2_PNS_8JSObjectES6_RKNS_7ArgListEE -__ZN3JSC17constructFunctionEPNS_9ExecStateERKNS_7ArgListERKNS_10IdentifierERKNS_7UStringEi -__ZN3JSC18DebuggerActivationC1EPNS_8JSObjectE +__ZN3JSC17PropertyNameArray3addEPN3WTF10StringImplE +__ZN3JSC17constructFunctionEPNS_9ExecStateEPNS_14JSGlobalObjectERKNS_7ArgListERKNS_10IdentifierERKNS_7UStringEi +__ZN3JSC17createSyntaxErrorEPNS_9ExecStateERKNS_7UStringE +__ZN3JSC18DebuggerActivationC1ERNS_12JSGlobalDataEPNS_8JSObjectE __ZN3JSC18PropertyDescriptor11setWritableEb __ZN3JSC18PropertyDescriptor12setUndefinedEv __ZN3JSC18PropertyDescriptor13setDescriptorENS_7JSValueEj @@ -186,30 +211,40 @@ __ZN3JSC18PropertyDescriptor17defaultAttributesE __ZN3JSC18PropertyDescriptor21setAccessorDescriptorENS_7JSValueES1_j __ZN3JSC18PropertyDescriptor9setGetterENS_7JSValueE __ZN3JSC18PropertyDescriptor9setSetterENS_7JSValueE +__ZN3JSC19SourceProviderCache5clearEv +__ZN3JSC19SourceProviderCacheD1Ev __ZN3JSC19initializeThreadingEv __ZN3JSC20MarkedArgumentBuffer10slowAppendENS_7JSValueE +__ZN3JSC20createReferenceErrorEPNS_9ExecStateERKNS_7UStringE +__ZN3JSC22globalMemoryStatisticsEv +__ZN3JSC22objectConstructorTableE __ZN3JSC23AbstractSamplingCounter4dumpEv -__ZN3JSC23objectProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSC23objectProtoFuncToStringEPNS_9ExecStateE __ZN3JSC23setUpStaticFunctionSlotEPNS_9ExecStateEPKNS_9HashEntryEPNS_8JSObjectERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC24DynamicGlobalObjectScopeC1EPNS_9ExecStateEPNS_14JSGlobalObjectE +__ZN3JSC24DynamicGlobalObjectScopeC1ERNS_12JSGlobalDataEPNS_14JSGlobalObjectE +__ZN3JSC24JSObjectWithGlobalObjectC2EPNS_14JSGlobalObjectEPNS_9StructureE +__ZN3JSC24JSObjectWithGlobalObjectC2ERNS_12JSGlobalDataEPNS_14JSGlobalObjectEPNS_9StructureE __ZN3JSC24createStackOverflowErrorEPNS_9ExecStateE __ZN3JSC25evaluateInGlobalCallFrameERKNS_7UStringERNS_7JSValueEPNS_14JSGlobalObjectE __ZN3JSC35createInterruptedExecutionExceptionEPNS_12JSGlobalDataE __ZN3JSC3NaNE -__ZN3JSC4Heap14primaryHeapEndEv -__ZN3JSC4Heap15recordExtraCostEm +__ZN3JSC41constructFunctionSkippingEvalEnabledCheckEPNS_9ExecStateEPNS_14JSGlobalObjectERKNS_7ArgListERKNS_10IdentifierERKNS_7UStringEi +__ZN3JSC4Heap16activityCallbackEv +__ZN3JSC4Heap16allocateSlowCaseEm __ZN3JSC4Heap16objectTypeCountsEv -__ZN3JSC4Heap16primaryHeapBeginEv __ZN3JSC4Heap17collectAllGarbageEv __ZN3JSC4Heap17globalObjectCountEv +__ZN3JSC4Heap19setActivityCallbackEN3WTF10PassOwnPtrINS_18GCActivityCallbackEEE __ZN3JSC4Heap20protectedObjectCountEv __ZN3JSC4Heap25protectedObjectTypeCountsEv __ZN3JSC4Heap26protectedGlobalObjectCountEv -__ZN3JSC4Heap6isBusyEv +__ZN3JSC4Heap29reportExtraMemoryCostSlowCaseEm __ZN3JSC4Heap7destroyEv __ZN3JSC4Heap7protectENS_7JSValueE -__ZN3JSC4Heap8allocateEm __ZN3JSC4Heap9unprotectENS_7JSValueE +__ZN3JSC4Yarr11YarrPatternC1ERKNS_7UStringEbbPPKc +__ZN3JSC4Yarr11byteCompileERNS0_11YarrPatternEPN3WTF20BumpPointerAllocatorE +__ZN3JSC4Yarr9interpretEPNS0_15BytecodePatternEPKtjjPi __ZN3JSC4callEPNS_9ExecStateENS_7JSValueENS_8CallTypeERKNS_8CallDataES2_RKNS_7ArgListE __ZN3JSC6JSCell11getCallDataERNS_8CallDataE __ZN3JSC6JSCell11getJSNumberEv @@ -225,29 +260,36 @@ __ZN3JSC6JSCell9getObjectEv __ZN3JSC6JSLock12DropAllLocksC1ENS_14JSLockBehaviorE __ZN3JSC6JSLock12DropAllLocksC1EPNS_9ExecStateE __ZN3JSC6JSLock12DropAllLocksD1Ev +__ZN3JSC6JSLock26currentThreadIsHoldingLockEv __ZN3JSC6JSLock4lockENS_14JSLockBehaviorE __ZN3JSC6JSLock6unlockENS_14JSLockBehaviorE __ZN3JSC6JSLock9lockCountEv __ZN3JSC6JSLockC1EPNS_9ExecStateE -__ZN3JSC6Parser5parseEPNS_12JSGlobalDataEPiPNS_7UStringE -__ZN3JSC7JSArray12markChildrenERNS_9MarkStackE +__ZN3JSC6RegExp6createEPNS_12JSGlobalDataERKNS_7UStringENS_11RegExpFlagsE +__ZN3JSC6RegExpD1Ev +__ZN3JSC7JSArray13visitChildrenERNS_9MarkStackE __ZN3JSC7JSArray15setSubclassDataEPv -__ZN3JSC7JSArray4infoE +__ZN3JSC7JSArray18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE +__ZN3JSC7JSArray6s_infoE __ZN3JSC7JSArray9setLengthEj -__ZN3JSC7JSArrayC1EN3WTF17NonNullPassRefPtrINS_9StructureEEE -__ZN3JSC7JSArrayC1EN3WTF17NonNullPassRefPtrINS_9StructureEEERKNS_7ArgListE -__ZN3JSC7JSArrayC2EN3WTF17NonNullPassRefPtrINS_9StructureEEE +__ZN3JSC7JSArrayC1ERNS_12JSGlobalDataEPNS_9StructureE +__ZN3JSC7JSArrayC1ERNS_12JSGlobalDataEPNS_9StructureERKNS_7ArgListE +__ZN3JSC7JSArrayC2ERNS_12JSGlobalDataEPNS_9StructureE __ZN3JSC7JSArrayD2Ev +__ZN3JSC7JSValue13isValidCalleeEv __ZN3JSC7Profile10restoreAllEv __ZN3JSC7Profile5focusEPKNS_11ProfileNodeE __ZN3JSC7Profile7excludeEPKNS_11ProfileNodeE __ZN3JSC7Profile7forEachEMNS_11ProfileNodeEFvvE -__ZN3JSC7UString4fromEd -__ZN3JSC7UString4fromEi -__ZN3JSC7UString4fromEj -__ZN3JSC7UString4fromEl +__ZN3JSC7UString6numberEd +__ZN3JSC7UString6numberEi +__ZN3JSC7UString6numberEj +__ZN3JSC7UString6numberEl __ZN3JSC7UStringC1EPKc +__ZN3JSC7UStringC1EPKcj +__ZN3JSC7UStringC1EPKt __ZN3JSC7UStringC1EPKtj +__ZN3JSC7toInt32Ed __ZN3JSC8Debugger23recompileAllJSFunctionsEPNS_12JSGlobalDataE __ZN3JSC8Debugger6attachEPNS_14JSGlobalObjectE __ZN3JSC8Debugger6detachEPNS_14JSGlobalObjectE @@ -257,14 +299,18 @@ __ZN3JSC8JSObject12defineGetterEPNS_9ExecStateERKNS_10IdentifierEPS0_j __ZN3JSC8JSObject12defineSetterEPNS_9ExecStateERKNS_10IdentifierEPS0_j __ZN3JSC8JSObject12lookupGetterEPNS_9ExecStateERKNS_10IdentifierE __ZN3JSC8JSObject12lookupSetterEPNS_9ExecStateERKNS_10IdentifierE -__ZN3JSC8JSObject12markChildrenERNS_9MarkStackE +__ZN3JSC8JSObject13visitChildrenERNS_9MarkStackE __ZN3JSC8JSObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE __ZN3JSC8JSObject14deletePropertyEPNS_9ExecStateEj __ZN3JSC8JSObject15unwrappedObjectEv __ZN3JSC8JSObject16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE -__ZN3JSC8JSObject17createInheritorIDEv __ZN3JSC8JSObject17defineOwnPropertyEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorEb +__ZN3JSC8JSObject17preventExtensionsERNS_12JSGlobalDataE +__ZN3JSC8JSObject17putDirectFunctionEPNS_9ExecStateEPNS_10JSFunctionEj __ZN3JSC8JSObject17putDirectFunctionEPNS_9ExecStateEPNS_16InternalFunctionEj +__ZN3JSC8JSObject17putWithAttributesEPNS_12JSGlobalDataERKNS_10IdentifierENS_7JSValueEj +__ZN3JSC8JSObject17putWithAttributesEPNS_12JSGlobalDataERKNS_10IdentifierENS_7JSValueEjbRNS_15PutPropertySlotE +__ZN3JSC8JSObject17putWithAttributesEPNS_12JSGlobalDataEjNS_7JSValueEj __ZN3JSC8JSObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueEj __ZN3JSC8JSObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueEjbRNS_15PutPropertySlotE __ZN3JSC8JSObject17putWithAttributesEPNS_9ExecStateEjNS_7JSValueEj @@ -272,48 +318,98 @@ __ZN3JSC8JSObject18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE __ZN3JSC8JSObject18getPrimitiveNumberEPNS_9ExecStateERdRNS_7JSValueE __ZN3JSC8JSObject19getOwnPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE __ZN3JSC8JSObject21getPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE -__ZN3JSC8JSObject22fillGetterPropertySlotERNS_12PropertySlotEPNS_7JSValueE +__ZN3JSC8JSObject22fillGetterPropertySlotERNS_12PropertySlotEPNS_16WriteBarrierBaseINS_7UnknownEEE __ZN3JSC8JSObject23allocatePropertyStorageEmm __ZN3JSC8JSObject24getOwnPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE __ZN3JSC8JSObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE -__ZN3JSC8JSObject3putEPNS_9ExecStateEjNS_7JSValueE +__ZN3JSC8JSObject3putEPNS_9ExecStateEjNS_7JSValueE +__ZN3JSC8JSObject6s_infoE __ZN3JSC8Profiler13stopProfilingEPNS_9ExecStateERKNS_7UStringE __ZN3JSC8Profiler14startProfilingEPNS_9ExecStateERKNS_7UStringE __ZN3JSC8Profiler8profilerEv -__ZN3JSC8evaluateEPNS_9ExecStateERNS_10ScopeChainERKNS_10SourceCodeENS_7JSValueE +__ZN3JSC8evaluateEPNS_9ExecStateEPNS_14ScopeChainNodeERKNS_10SourceCodeENS_7JSValueE +__ZN3JSC8isZombieEPKNS_6JSCellE __ZN3JSC9CodeBlockD1Ev __ZN3JSC9CodeBlockD2Ev __ZN3JSC9MarkStack10s_pageSizeE -__ZN3JSC9MarkStack12releaseStackEPvm -__ZN3JSC9MarkStack13allocateStackEm __ZN3JSC9MarkStack18initializePagesizeEv -__ZN3JSC9Structure13hasTransitionEPN7WebCore10StringImplEj -__ZN3JSC9Structure17stopIgnoringLeaksEv -__ZN3JSC9Structure18startIgnoringLeaksEv -__ZN3JSC9Structure21addPropertyTransitionEPS0_RKNS_10IdentifierEjPNS_6JSCellERm -__ZN3JSC9Structure22materializePropertyMapEv -__ZN3JSC9Structure25changePrototypeTransitionEPS0_NS_7JSValueE -__ZN3JSC9Structure27despecifyDictionaryFunctionERKNS_10IdentifierE -__ZN3JSC9Structure27despecifyFunctionTransitionEPS0_RKNS_10IdentifierE -__ZN3JSC9Structure28addPropertyWithoutTransitionERKNS_10IdentifierEjPNS_6JSCellE -__ZN3JSC9Structure3getEPKN7WebCore10StringImplERjRPNS_6JSCellE +__ZN3JSC9Structure21addPropertyTransitionERNS_12JSGlobalDataEPS0_RKNS_10IdentifierEjPNS_6JSCellERm +__ZN3JSC9Structure22materializePropertyMapERNS_12JSGlobalDataE +__ZN3JSC9Structure25changePrototypeTransitionERNS_12JSGlobalDataEPS0_NS_7JSValueE +__ZN3JSC9Structure27despecifyDictionaryFunctionERNS_12JSGlobalDataERKNS_10IdentifierE +__ZN3JSC9Structure27despecifyFunctionTransitionERNS_12JSGlobalDataEPS0_RKNS_10IdentifierE +__ZN3JSC9Structure28addPropertyWithoutTransitionERNS_12JSGlobalDataERKNS_10IdentifierEjPNS_6JSCellE +__ZN3JSC9Structure3getERNS_12JSGlobalDataEPN3WTF10StringImplERjRPNS_6JSCellE __ZN3JSC9Structure40addPropertyTransitionToExistingStructureEPS0_RKNS_10IdentifierEjPNS_6JSCellERm -__ZN3JSC9StructureC1ENS_7JSValueERKNS_8TypeInfoEj +__ZN3JSC9Structure6s_infoE +__ZN3JSC9StructureC1ERNS_12JSGlobalDataENS_7JSValueERKNS_8TypeInfoEjPKNS_9ClassInfoE __ZN3JSC9StructureD1Ev __ZN3JSC9constructEPNS_9ExecStateENS_7JSValueENS_13ConstructTypeERKNS_13ConstructDataERKNS_7ArgListE __ZN3JSCeqERKNS_7UStringEPKc __ZN3JSCgtERKNS_7UStringES2_ __ZN3JSCltERKNS_7UStringES2_ +__ZN3WTF10StringImpl11reverseFindEPS0_j +__ZN3WTF10StringImpl11reverseFindEtj +__ZN3WTF10StringImpl12sharedBufferEv +__ZN3WTF10StringImpl16findIgnoringCaseEPKcj +__ZN3WTF10StringImpl16findIgnoringCaseEPS0_j +__ZN3WTF10StringImpl18simplifyWhiteSpaceEv +__ZN3WTF10StringImpl19characterStartingAtEj +__ZN3WTF10StringImpl19createUninitializedEjRPt +__ZN3WTF10StringImpl22containsOnlyWhitespaceEv +__ZN3WTF10StringImpl23defaultWritingDirectionEPb +__ZN3WTF10StringImpl23reverseFindIgnoringCaseEPS0_j +__ZN3WTF10StringImpl37createStrippingNullCharactersSlowCaseEPKtj +__ZN3WTF10StringImpl4findEPFbtEj +__ZN3WTF10StringImpl4findEPKcj +__ZN3WTF10StringImpl4findEPS0_j +__ZN3WTF10StringImpl4findEtj +__ZN3WTF10StringImpl5adoptERNS_12StringBufferE +__ZN3WTF10StringImpl5emptyEv +__ZN3WTF10StringImpl5lowerEv +__ZN3WTF10StringImpl5toIntEPb +__ZN3WTF10StringImpl5upperEv +__ZN3WTF10StringImpl6createEPKc +__ZN3WTF10StringImpl6createEPKcj +__ZN3WTF10StringImpl6createEPKtj +__ZN3WTF10StringImpl6secureEtNS0_21LastCharacterBehaviorE +__ZN3WTF10StringImpl7replaceEPS0_S1_ +__ZN3WTF10StringImpl7replaceEjjPS0_ +__ZN3WTF10StringImpl7replaceEtPS0_ +__ZN3WTF10StringImpl7replaceEtt +__ZN3WTF10StringImpl8endsWithEPS0_b +__ZN3WTF10StringImpl9substringEjj +__ZN3WTF10StringImplD1Ev __ZN3WTF10fastCallocEmm __ZN3WTF10fastMallocEm __ZN3WTF10fastStrDupEPKc +__ZN3WTF11OSAllocator16reserveAndCommitEmNS0_5UsageEbbb +__ZN3WTF11OSAllocator18releaseDecommittedEPvm +__ZN3WTF11commentAtomE __ZN3WTF11currentTimeEv +__ZN3WTF11dtoaRoundDPEPcdiRbRiRj +__ZN3WTF11dtoaRoundSFEPcdiRbRiRj +__ZN3WTF11emptyStringEv __ZN3WTF11fastReallocEPvm +__ZN3WTF12AtomicString11addSlowCaseEPNS_10StringImplE +__ZN3WTF12AtomicString16fromUTF8InternalEPKcS2_ +__ZN3WTF12AtomicString3addEPKc +__ZN3WTF12AtomicString3addEPKt +__ZN3WTF12AtomicString3addEPKtj +__ZN3WTF12AtomicString3addEPKtjj +__ZN3WTF12AtomicString4findEPKtjj +__ZN3WTF12AtomicString4initEv __ZN3WTF12createThreadEPFPvS0_ES0_ __ZN3WTF12createThreadEPFPvS0_ES0_PKc __ZN3WTF12detachThreadEj __ZN3WTF12isMainThreadEv __ZN3WTF12randomNumberEv +__ZN3WTF13StringBuilder11reifyStringEv +__ZN3WTF13StringBuilder11shrinkToFitEv +__ZN3WTF13StringBuilder15reserveCapacityEj +__ZN3WTF13StringBuilder6appendEPKcj +__ZN3WTF13StringBuilder6appendEPKtj +__ZN3WTF13StringBuilder6resizeEj __ZN3WTF13WTFThreadData10staticDataE __ZN3WTF13WTFThreadDataC1Ev __ZN3WTF13WTFThreadDataD1Ev @@ -321,17 +417,29 @@ __ZN3WTF13currentThreadEv __ZN3WTF13tryFastCallocEmm __ZN3WTF13tryFastMallocEm __ZN3WTF14fastMallocSizeEPKv +__ZN3WTF14numberToStringEdPt +__ZN3WTF14tryFastReallocEPvm __ZN3WTF15ThreadCondition4waitERNS_5MutexE __ZN3WTF15ThreadCondition6signalEv __ZN3WTF15ThreadCondition9broadcastEv __ZN3WTF15ThreadCondition9timedWaitERNS_5MutexEd __ZN3WTF15ThreadConditionC1Ev __ZN3WTF15ThreadConditionD1Ev +__ZN3WTF15charactersToIntEPKtmPb __ZN3WTF16callOnMainThreadEPFvPvES0_ +__ZN3WTF16codePointCompareERKNS_6StringES2_ __ZN3WTF16fastZeroedMallocEm +__ZN3WTF17charactersToFloatEPKtmPbS2_ +__ZN3WTF17equalIgnoringCaseEPKtPKcj +__ZN3WTF17equalIgnoringCaseEPNS_10StringImplEPKc +__ZN3WTF17equalIgnoringCaseEPNS_10StringImplES1_ +__ZN3WTF18calculateDSTOffsetEdd +__ZN3WTF18calculateUTCOffsetEv +__ZN3WTF18charactersToDoubleEPKtmPbS2_ __ZN3WTF18dateToDaysFrom1970Eiii __ZN3WTF18monthFromDayInYearEib __ZN3WTF19initializeThreadingEv +__ZN3WTF20equalIgnoringNullityEPNS_10StringImplES1_ __ZN3WTF20fastMallocStatisticsEv __ZN3WTF20initializeMainThreadEv __ZN3WTF21RefCountedLeakCounter16suppressMessagesEPKc @@ -340,125 +448,88 @@ __ZN3WTF21RefCountedLeakCounter9decrementEv __ZN3WTF21RefCountedLeakCounter9incrementEv __ZN3WTF21RefCountedLeakCounterC1EPKc __ZN3WTF21RefCountedLeakCounterD1Ev +__ZN3WTF21charactersToIntStrictEPKtmPbi +__ZN3WTF22cancelCallOnMainThreadEPFvPvES0_ +__ZN3WTF22charactersToUIntStrictEPKtmPbi __ZN3WTF23callOnMainThreadAndWaitEPFvPvES0_ __ZN3WTF23dayInMonthFromDayInYearEib __ZN3WTF23waitForThreadCompletionEjPPv __ZN3WTF27releaseFastMallocFreeMemoryEv __ZN3WTF28setMainThreadCallbacksPausedEb -__ZN3WTF32doubleToStringInJavaScriptFormatEdPcPj +__ZN3WTF29cryptographicallyRandomNumberEv +__ZN3WTF29cryptographicallyRandomValuesEPvm __ZN3WTF36lockAtomicallyInitializedStaticMutexEv __ZN3WTF37parseDateFromNullTerminatedCharactersEPKc __ZN3WTF38unlockAtomicallyInitializedStaticMutexEv __ZN3WTF39initializeMainThreadToProcessMainThreadEv __ZN3WTF3MD58addBytesEPKhm -__ZN3WTF3MD58checksumEv +__ZN3WTF3MD58checksumERNS_6VectorIhLm16EEE __ZN3WTF3MD5C1Ev +__ZN3WTF4SHA111computeHashERNS_6VectorIhLm20EEE +__ZN3WTF4SHA18addBytesEPKhm +__ZN3WTF4SHA1C1Ev +__ZN3WTF4dtoaEPcdRbRiRj __ZN3WTF5Mutex4lockEv __ZN3WTF5Mutex6unlockEv __ZN3WTF5Mutex7tryLockEv __ZN3WTF5MutexC1Ev __ZN3WTF5MutexD1Ev +__ZN3WTF5equalEPKNS_10StringImplEPKc +__ZN3WTF5equalEPKNS_10StringImplES2_ +__ZN3WTF5yieldEv +__ZN3WTF6String26fromUTF8WithLatin1FallbackEPKcm +__ZN3WTF6String29charactersWithNullTerminationEv +__ZN3WTF6String6appendEPKtj +__ZN3WTF6String6appendERKS0_ +__ZN3WTF6String6appendEc +__ZN3WTF6String6appendEt +__ZN3WTF6String6formatEPKcz +__ZN3WTF6String6insertERKS0_j +__ZN3WTF6String6numberEd +__ZN3WTF6String6numberEi +__ZN3WTF6String6numberEj +__ZN3WTF6String6numberEl +__ZN3WTF6String6numberEm +__ZN3WTF6String6numberEt +__ZN3WTF6String6numberEx +__ZN3WTF6String6numberEy +__ZN3WTF6String6removeEji +__ZN3WTF6String8fromUTF8EPKc +__ZN3WTF6String8fromUTF8EPKcm +__ZN3WTF6String8truncateEj +__ZN3WTF6StringC1EPKc +__ZN3WTF6StringC1EPKcj +__ZN3WTF6StringC1EPKt +__ZN3WTF6StringC1EPKtj __ZN3WTF6strtodEPKcPPc __ZN3WTF7CString11mutableDataEv __ZN3WTF7CString16newUninitializedEmRPc __ZN3WTF7CStringC1EPKc -__ZN3WTF7CStringC1EPKcj +__ZN3WTF7CStringC1EPKcm __ZN3WTF7Unicode18convertUTF16ToUTF8EPPKtS2_PPcS4_b __ZN3WTF7Unicode18convertUTF8ToUTF16EPPKcS2_PPtS4_b +__ZN3WTF7xmlAtomE __ZN3WTF8Collator18setOrderLowerFirstEb __ZN3WTF8CollatorC1EPKc __ZN3WTF8CollatorD1Ev +__ZN3WTF8Internal21fastMallocMatchFailedEPv __ZN3WTF8fastFreeEPv __ZN3WTF8msToYearEd +__ZN3WTF8nullAtomE +__ZN3WTF8starAtomE +__ZN3WTF8textAtomE __ZN3WTF9ByteArray6createEm __ZN3WTF9dayInYearEdi +__ZN3WTF9emptyAtomE +__ZN3WTF9xmlnsAtomE +__ZN3WTFeqERKNS_12AtomicStringEPKc +__ZN3WTFeqERKNS_12AtomicStringERKNS_6VectorItLm0EEE __ZN3WTFeqERKNS_7CStringES2_ -__ZN7WebCore10StringImpl11reverseFindEPS0_ib -__ZN7WebCore10StringImpl11reverseFindEti -__ZN7WebCore10StringImpl12sharedBufferEv -__ZN7WebCore10StringImpl18simplifyWhiteSpaceEv -__ZN7WebCore10StringImpl19characterStartingAtEj -__ZN7WebCore10StringImpl19createUninitializedEjRPt -__ZN7WebCore10StringImpl22containsOnlyWhitespaceEv -__ZN7WebCore10StringImpl23defaultWritingDirectionEv -__ZN7WebCore10StringImpl37createStrippingNullCharactersSlowCaseEPKtj -__ZN7WebCore10StringImpl4findEPFbtEi -__ZN7WebCore10StringImpl4findEPKcib -__ZN7WebCore10StringImpl4findEPS0_ib -__ZN7WebCore10StringImpl4findEti -__ZN7WebCore10StringImpl5adoptERNS_12StringBufferE -__ZN7WebCore10StringImpl5emptyEv -__ZN7WebCore10StringImpl5lowerEv -__ZN7WebCore10StringImpl5toIntEPb -__ZN7WebCore10StringImpl5upperEv -__ZN7WebCore10StringImpl6createEPKc -__ZN7WebCore10StringImpl6createEPKcj -__ZN7WebCore10StringImpl6createEPKtj -__ZN7WebCore10StringImpl6createEPKtjN3WTF10PassRefPtrINS3_21CrossThreadRefCountedINS3_16OwnFastMallocPtrIS1_EEEEEE -__ZN7WebCore10StringImpl6secureEtb -__ZN7WebCore10StringImpl7replaceEPS0_S1_ -__ZN7WebCore10StringImpl7replaceEjjPS0_ -__ZN7WebCore10StringImpl7replaceEtPS0_ -__ZN7WebCore10StringImpl7replaceEtt -__ZN7WebCore10StringImpl8endsWithEPS0_b -__ZN7WebCore10StringImpl9substringEjj -__ZN7WebCore10StringImplD1Ev -__ZN7WebCore11commentAtomE -__ZN7WebCore12AtomicString11addSlowCaseEPNS_10StringImplE -__ZN7WebCore12AtomicString3addEPKc -__ZN7WebCore12AtomicString3addEPKt -__ZN7WebCore12AtomicString3addEPKtj -__ZN7WebCore12AtomicString3addEPKtjj -__ZN7WebCore12AtomicString4findEPKtjj -__ZN7WebCore12AtomicString4initEv -__ZN7WebCore15charactersToIntEPKtmPb -__ZN7WebCore17charactersToFloatEPKtmPb -__ZN7WebCore17equalIgnoringCaseEPKtPKcj -__ZN7WebCore17equalIgnoringCaseEPNS_10StringImplEPKc -__ZN7WebCore17equalIgnoringCaseEPNS_10StringImplES1_ -__ZN7WebCore18charactersToDoubleEPKtmPb -__ZN7WebCore20equalIgnoringNullityEPNS_10StringImplES1_ -__ZN7WebCore21charactersToIntStrictEPKtmPbi -__ZN7WebCore22charactersToUIntStrictEPKtmPbi -__ZN7WebCore5equalEPKNS_10StringImplEPKc -__ZN7WebCore5equalEPKNS_10StringImplES2_ -__ZN7WebCore6String26fromUTF8WithLatin1FallbackEPKcm -__ZN7WebCore6String29charactersWithNullTerminationEv -__ZN7WebCore6String6appendEPKtj -__ZN7WebCore6String6appendERKS0_ -__ZN7WebCore6String6appendEc -__ZN7WebCore6String6appendEt -__ZN7WebCore6String6formatEPKcz -__ZN7WebCore6String6insertERKS0_j -__ZN7WebCore6String6numberEd -__ZN7WebCore6String6numberEi -__ZN7WebCore6String6numberEj -__ZN7WebCore6String6numberEl -__ZN7WebCore6String6numberEm -__ZN7WebCore6String6numberEt -__ZN7WebCore6String6numberEx -__ZN7WebCore6String6numberEy -__ZN7WebCore6String6removeEji -__ZN7WebCore6String8fromUTF8EPKc -__ZN7WebCore6String8fromUTF8EPKcm -__ZN7WebCore6String8truncateEj -__ZN7WebCore6StringC1EPKt -__ZN7WebCore7xmlAtomE -__ZN7WebCore8nullAtomE -__ZN7WebCore8starAtomE -__ZN7WebCore8textAtomE -__ZN7WebCore9emptyAtomE -__ZN7WebCore9xmlnsAtomE -__ZN7WebCoreeqERKNS_12AtomicStringEPKc -__ZN7WebCoreplEPKcRKNS_6StringE -__ZN7WebCoreplERKNS_6StringEPKc -__ZN7WebCoreplERKNS_6StringES2_ __ZNK3JSC10JSFunction23isHostFunctionNonInlineEv -__ZNK3JSC11Interpreter14retrieveCallerEPNS_9ExecStateEPNS_16InternalFunctionE +__ZNK3JSC11Interpreter14retrieveCallerEPNS_9ExecStateEPNS_10JSFunctionE __ZNK3JSC11Interpreter18retrieveLastCallerEPNS_9ExecStateERiRlRNS_7UStringERNS_7JSValueE __ZNK3JSC12PropertySlot14functionGetterEPNS_9ExecStateE __ZNK3JSC14JSGlobalObject14isDynamicScopeERb -__ZNK3JSC16InternalFunction9classInfoEv __ZNK3JSC16JSVariableObject16isVariableObjectEv __ZNK3JSC17DebuggerCallFrame10thisObjectEv __ZNK3JSC17DebuggerCallFrame12functionNameEv @@ -472,74 +543,79 @@ __ZNK3JSC18PropertyDescriptor20isAccessorDescriptorEv __ZNK3JSC18PropertyDescriptor6getterEv __ZNK3JSC18PropertyDescriptor6setterEv __ZNK3JSC18PropertyDescriptor8writableEv -__ZNK3JSC4Heap10statisticsEv +__ZNK3JSC19SourceProviderCache8byteSizeEv __ZNK3JSC4Heap11objectCountEv +__ZNK3JSC4Heap4sizeEv +__ZNK3JSC4Heap8capacityEv __ZNK3JSC6JSCell11toPrimitiveEPNS_9ExecStateENS_22PreferredPrimitiveTypeE __ZNK3JSC6JSCell12toThisObjectEPNS_9ExecStateE __ZNK3JSC6JSCell14isGetterSetterEv __ZNK3JSC6JSCell8toNumberEPNS_9ExecStateE -__ZNK3JSC6JSCell8toObjectEPNS_9ExecStateE +__ZNK3JSC6JSCell8toObjectEPNS_9ExecStateEPNS_14JSGlobalObjectE __ZNK3JSC6JSCell8toStringEPNS_9ExecStateE -__ZNK3JSC6JSCell9classInfoEv __ZNK3JSC6JSCell9getStringEPNS_9ExecStateE __ZNK3JSC6JSCell9getStringEPNS_9ExecStateERNS_7UStringE __ZNK3JSC6JSCell9getUInt32ERj __ZNK3JSC6JSCell9toBooleanEPNS_9ExecStateE __ZNK3JSC7ArgList8getSliceEiRS0_ __ZNK3JSC7JSArray12subclassDataEv -__ZNK3JSC7JSValue16toObjectSlowCaseEPNS_9ExecStateE +__ZNK3JSC7JSValue16toObjectSlowCaseEPNS_9ExecStateEPNS_14JSGlobalObjectE __ZNK3JSC7JSValue19synthesizePrototypeEPNS_9ExecStateE __ZNK3JSC7JSValue20toThisObjectSlowCaseEPNS_9ExecStateE __ZNK3JSC7JSValue9toIntegerEPNS_9ExecStateE -__ZNK3JSC7UString10UTF8StringEb -__ZNK3JSC7UString14toStrictUInt32EPb +__ZNK3JSC7UString20substringSharingImplEjj +__ZNK3JSC7UString4utf8Eb __ZNK3JSC7UString5asciiEv -__ZNK3JSC7UString6is8BitEv -__ZNK3JSC7UString6substrEjj -__ZNK3JSC7UString8toUInt32EPb -__ZNK3JSC7UString8toUInt32EPbb __ZNK3JSC8JSObject11hasPropertyEPNS_9ExecStateERKNS_10IdentifierE __ZNK3JSC8JSObject11hasPropertyEPNS_9ExecStateEj __ZNK3JSC8JSObject12defaultValueEPNS_9ExecStateENS_22PreferredPrimitiveTypeE __ZNK3JSC8JSObject12toThisObjectEPNS_9ExecStateE +__ZNK3JSC8JSObject18toStrictThisObjectEPNS_9ExecStateE __ZNK3JSC8JSObject8toNumberEPNS_9ExecStateE -__ZNK3JSC8JSObject8toObjectEPNS_9ExecStateE +__ZNK3JSC8JSObject8toObjectEPNS_9ExecStateEPNS_14JSGlobalObjectE __ZNK3JSC8JSObject8toStringEPNS_9ExecStateE __ZNK3JSC8JSObject9classNameEv __ZNK3JSC8JSObject9toBooleanEPNS_9ExecStateE __ZNK3JSC8JSString11resolveRopeEPNS_9ExecStateE __ZNK3JSC9HashTable11createTableEPNS_12JSGlobalDataE __ZNK3JSC9HashTable11deleteTableEv +__ZNK3WTF12AtomicString5lowerEv +__ZNK3WTF13DecimalNumber15toStringDecimalEPtj +__ZNK3WTF13DecimalNumber19toStringExponentialEPtj +__ZNK3WTF13DecimalNumber28bufferLengthForStringDecimalEv +__ZNK3WTF13DecimalNumber32bufferLengthForStringExponentialEv +__ZNK3WTF6String11toIntStrictEPbi +__ZNK3WTF6String12toUIntStrictEPbi +__ZNK3WTF6String13toInt64StrictEPbi +__ZNK3WTF6String14threadsafeCopyEv +__ZNK3WTF6String15stripWhiteSpaceEv +__ZNK3WTF6String16removeCharactersEPFbtE +__ZNK3WTF6String17crossThreadStringEv +__ZNK3WTF6String18simplifyWhiteSpaceEv +__ZNK3WTF6String19characterStartingAtEj +__ZNK3WTF6String4utf8Eb +__ZNK3WTF6String5asciiEv +__ZNK3WTF6String5lowerEv +__ZNK3WTF6String5splitERKS0_RNS_6VectorIS0_Lm0EEE +__ZNK3WTF6String5splitERKS0_bRNS_6VectorIS0_Lm0EEE +__ZNK3WTF6String5splitEtRNS_6VectorIS0_Lm0EEE +__ZNK3WTF6String5splitEtbRNS_6VectorIS0_Lm0EEE +__ZNK3WTF6String5toIntEPb +__ZNK3WTF6String5upperEv +__ZNK3WTF6String6latin1Ev +__ZNK3WTF6String6toUIntEPb +__ZNK3WTF6String7toFloatEPbS1_ +__ZNK3WTF6String8foldCaseEv +__ZNK3WTF6String8toDoubleEPbS1_ +__ZNK3WTF6String8toIntPtrEPb +__ZNK3WTF6String8toUInt64EPb +__ZNK3WTF6String9substringEjj __ZNK3WTF8Collator7collateEPKtmS2_m -__ZNK7WebCore12AtomicString5lowerEv -__ZNK7WebCore6String11toIntStrictEPbi -__ZNK7WebCore6String12toUIntStrictEPbi -__ZNK7WebCore6String14threadsafeCopyEv -__ZNK7WebCore6String15stripWhiteSpaceEv -__ZNK7WebCore6String16removeCharactersEPFbtE -__ZNK7WebCore6String17crossThreadStringEv -__ZNK7WebCore6String18simplifyWhiteSpaceEv -__ZNK7WebCore6String19characterStartingAtEj -__ZNK7WebCore6String4utf8Ev -__ZNK7WebCore6String5asciiEv -__ZNK7WebCore6String5lowerEv -__ZNK7WebCore6String5splitERKS0_RN3WTF6VectorIS0_Lm0EEE -__ZNK7WebCore6String5splitERKS0_bRN3WTF6VectorIS0_Lm0EEE -__ZNK7WebCore6String5splitEtRN3WTF6VectorIS0_Lm0EEE -__ZNK7WebCore6String5splitEtbRN3WTF6VectorIS0_Lm0EEE -__ZNK7WebCore6String5toIntEPb -__ZNK7WebCore6String5upperEv -__ZNK7WebCore6String6latin1Ev -__ZNK7WebCore6String6toUIntEPb -__ZNK7WebCore6String7toFloatEPb -__ZNK7WebCore6String8foldCaseEv -__ZNK7WebCore6String8toDoubleEPb -__ZNK7WebCore6String8toIntPtrEPb -__ZNK7WebCore6String8toUInt64EPb -__ZNK7WebCore6String9substringEjj __ZTVN3JSC12StringObjectE __ZTVN3JSC14JSGlobalObjectE +__ZTVN3JSC14ScopeChainNodeE __ZTVN3JSC15JSWrapperObjectE +__ZTVN3JSC15WeakHandleOwnerE __ZTVN3JSC16InternalFunctionE __ZTVN3JSC16JSVariableObjectE __ZTVN3JSC8DebuggerE @@ -548,5 +624,12 @@ __ZTVN3JSC8JSStringE _jscore_fastmalloc_introspection _kJSClassDefinitionEmpty -# iOS Methods +# iOS methods +__ZN3WTF11isWebThreadEv +__ZN3JSC12JSGlobalData23recompileAllJSFunctionsEv __ZN3JSC12JSGlobalData20sharedInstanceExistsEv +__ZN3JSC25DefaultGCActivityCallbackC2EPNS_4HeapEP11__CFRunLoop +__ZN3JSC25DefaultGCActivityCallbackD2Ev +__ZN3JSC25DefaultGCActivityCallbackclEv +__ZN3JSC25DefaultGCActivityCallback11synchronizeEv +__ZTVN3JSC25DefaultGCActivityCallbackE diff --git a/JavaScriptCore.gyp/JavaScriptCore.gyp b/JavaScriptCore.gyp/JavaScriptCore.gyp index 9e014dd..eff3607 100644 --- a/JavaScriptCore.gyp/JavaScriptCore.gyp +++ b/JavaScriptCore.gyp/JavaScriptCore.gyp @@ -43,7 +43,7 @@ 'chromium_src_dir': '../../WebKit/chromium', },{ # WebKit is checked out in src/chromium/third_party/WebKit - 'chromium_src_dir': '../../../..', + 'chromium_src_dir': '../../../../..', }], ], }, @@ -106,6 +106,8 @@ '../wtf/unicode', ], 'sources': [ + '<@(javascriptcore_publicheader_files)', + '<@(javascriptcore_privateheader_files)', '<@(javascriptcore_files)', ], 'sources/': [ @@ -113,10 +115,27 @@ ['exclude', '../'], # ... Then include what we want. ['include', '../wtf/'], + # FIXME: This is clearly not sustainable. + ['exclude', '../wtf/android'], + ['exclude', '../wtf/brew'], + ['exclude', '../wtf/efl'], + ['exclude', '../wtf/gobject'], + ['exclude', '../wtf/gtk'], + ['exclude', '../wtf/haiku'], + ['exclude', '../wtf/mac'], + ['exclude', '../wtf/qt'], + ['exclude', '../wtf/url'], + ['exclude', '../wtf/wince'], + ['exclude', '../wtf/wx'], + ['exclude', '../wtf/unicode/brew'], + ['exclude', '../wtf/unicode/wince'], + ['exclude', '../wtf/unicode/glib'], + ['exclude', '../wtf/unicode/qt4'], # GLib/GTK, even though its name doesn't really indicate. ['exclude', '/(gtk|glib|gobject)/.*\\.(cpp|h)$'], - ['exclude', '(Default|Gtk|Mac|None|Qt|Win|Wx)\\.(cpp|mm)$'], + ['exclude', '(Default|Gtk|Mac|None|Qt|Win|Wx|Efl|Symbian)\\.(cpp|mm)$'], ['exclude', 'wtf/CurrentTime\\.cpp$'], + ['exclude', 'wtf/OSRandomSource\\.cpp$'], ['exclude', 'wtf/MainThread.cpp$'], ['exclude', 'wtf/TC.*\\.(cpp|h)$'], ], @@ -125,6 +144,16 @@ '../', '../wtf', ], + # Some warnings occur in JSC headers, so they must also be disabled + # in targets that use JSC. + 'msvs_disabled_warnings': [ + # Don't complain about calling specific versions of templatized + # functions (e.g. in RefPtrHashMap.h). + 4344, + # Don't complain about using "this" in an initializer list + # (e.g. in StringImpl.h). + 4355, + ], }, 'export_dependent_settings': [ 'wtf_config', @@ -137,16 +166,30 @@ 'sources/': [ ['exclude', 'ThreadIdentifierDataPthreads\\.(h|cpp)$'], ['exclude', 'ThreadingPthreads\\.cpp$'], - ['include', 'Thread(ing|Specific)Win\\.cpp$'] + ['include', 'Thread(ing|Specific)Win\\.cpp$'], + ['exclude', 'OSAllocatorPosix\\.cpp$'], + ['include', 'OSAllocatorWin\\.cpp$'] ], 'include_dirs!': [ '<(SHARED_INTERMEDIATE_DIR)/webkit', ], + 'conditions': [ + ['inside_chromium_build==1 and component=="shared_library"', { + # Chromium windows multi-dll build enables c++ exception and this + # causes wtf generates 4291 warning due to operator new/delete + # implementations. Disable the warning for chromium windows + # multi-dll build. + 'msvs_disabled_warnings': [4291], + 'direct_dependent_settings': { + 'msvs_disabled_warnings': [4291], + }, + }], + ], }], ], }, { - 'target_name': 'pcre', + 'target_name': 'yarr', 'type': '<(library)', 'dependencies': [ 'wtf', @@ -159,18 +202,35 @@ 'msvs_guid': '49909552-0B0C-4C14-8CF6-DB8A2ADE0934', 'actions': [ { - 'action_name': 'dftables', + 'action_name': 'retgen', + 'inputs': [ + '../create_regex_tables', + ], + 'arguments': [ + '--no-tables', + ], + 'outputs': [ + '<(INTERMEDIATE_DIR)/RegExpJitTables.h', + ], + 'action': ['python', '<@(_inputs)', '<@(_arguments)', '<@(_outputs)'], + }, + { + 'action_name': 'klgen', 'inputs': [ - '../pcre/dftables', + '../KeywordLookupGenerator.py', + '../parser/Keywords.table' + ], + 'arguments': [ ], 'outputs': [ - '<(INTERMEDIATE_DIR)/chartables.c', + '<(INTERMEDIATE_DIR)/KeywordLookup.h', ], - 'action': ['perl', '-w', '<@(_inputs)', '<@(_outputs)'], + 'action': ['python', '<@(_inputs)', '<@(_arguments)', '<@(_outputs)'], }, ], 'include_dirs': [ '<(INTERMEDIATE_DIR)', + '../runtime', ], 'sources': [ '<@(javascriptcore_files)', @@ -179,10 +239,9 @@ # First exclude everything ... ['exclude', '../'], # ... Then include what we want. - ['include', '../pcre/'], - # ucptable.cpp is #included by pcre_ucp_searchfunchs.cpp and is not - # intended to be compiled directly. - ['exclude', '../pcre/ucptable.cpp$'], + ['include', '../yarr/'], + # The Yarr JIT isn't used in WebCore. + ['exclude', '../yarr/YarrJIT\\.(h|cpp)$'], ], 'export_dependent_settings': [ 'wtf', diff --git a/JavaScriptCore.gypi b/JavaScriptCore.gypi index 787e0e6..c101031 100644 --- a/JavaScriptCore.gypi +++ b/JavaScriptCore.gypi @@ -1,12 +1,245 @@ { 'variables': { - 'javascriptcore_files': [ - 'API/APICast.h', + 'project_dir': ['.'], + # These headers are part of JavaScriptCore's public API in the Apple Mac build. + 'javascriptcore_publicheader_files': [ + 'API/JSBase.h', + 'API/JSContextRef.h', + 'API/JSObjectRef.h', + 'API/JSStringRef.h', + 'API/JSStringRefCF.h', + 'API/JSValueRef.h', 'API/JavaScript.h', 'API/JavaScriptCore.h', - 'API/JSBase.cpp', - 'API/JSBase.h', + 'API/WebKitAvailability.h', + ], + # These headers are part of JavaScriptCore's private API in the Apple Mac build. + 'javascriptcore_privateheader_files': [ + 'API/APICast.h', + 'API/APIShims.h', 'API/JSBasePrivate.h', + 'API/JSContextRefPrivate.h', + 'API/JSObjectRefPrivate.h', + 'API/JSProfilerPrivate.h', + 'API/JSRetainPtr.h', + 'API/JSWeakObjectMapRefInternal.h', + 'API/JSWeakObjectMapRefPrivate.h', + 'API/OpaqueJSString.h', + 'assembler/MacroAssemblerCodeRef.h', + 'bytecode/Opcode.h', + 'heap/ConservativeRoots.h', + 'heap/Handle.h', + 'heap/HandleHeap.h', + 'heap/HandleStack.h', + 'heap/HandleTypes.h', + 'heap/Heap.h', + 'heap/Local.h', + 'heap/LocalScope.h', + 'heap/Strong.h', + 'heap/Weak.h', + 'config.h', + 'debugger/Debugger.h', + 'debugger/DebuggerActivation.h', + 'debugger/DebuggerCallFrame.h', + 'interpreter/CallFrame.h', + 'interpreter/Interpreter.h', + 'interpreter/Register.h', + 'interpreter/RegisterFile.h', + 'jit/ExecutableAllocator.h', + 'jit/JITCode.h', + 'jit/JITStubs.h', + 'jit/ThunkGenerators.h', + 'parser/ResultType.h', + 'parser/SourceCode.h', + 'parser/SourceProvider.h', + 'parser/SourceProviderCache.h', + 'profiler/CallIdentifier.h', + 'profiler/Profile.h', + 'profiler/ProfileNode.h', + 'profiler/Profiler.h', + 'runtime/ArgList.h', + 'runtime/ArrayPrototype.h', + 'runtime/BooleanObject.h', + 'runtime/CachedTranscendentalFunction.h', + 'runtime/CallData.h', + 'runtime/ClassInfo.h', + 'runtime/CommonIdentifiers.h', + 'runtime/Completion.h', + 'runtime/ConstructData.h', + 'runtime/DateInstance.h', + 'runtime/DateInstanceCache.h', + 'runtime/Error.h', + 'runtime/ExceptionHelpers.h', + 'runtime/FunctionConstructor.h', + 'runtime/FunctionPrototype.h', + 'runtime/GCActivityCallback.h', + 'runtime/Identifier.h', + 'runtime/InitializeThreading.h', + 'runtime/InternalFunction.h', + 'runtime/JSAPIValueWrapper.h', + 'runtime/JSArray.h', + 'runtime/JSByteArray.h', + 'runtime/JSCell.h', + 'runtime/JSFunction.h', + 'runtime/JSGlobalData.h', + 'runtime/JSGlobalObject.h', + 'runtime/JSLock.h', + 'runtime/JSNumberCell.h', + 'runtime/JSObject.h', + 'runtime/JSObjectWithGlobalObject.h', + 'runtime/JSString.h', + 'runtime/JSType.h', + 'runtime/JSTypeInfo.h', + 'runtime/JSValue.h', + 'runtime/JSValueInlineMethods.h', + 'runtime/JSVariableObject.h', + 'runtime/JSWrapperObject.h', + 'runtime/Lookup.h', + 'runtime/MathObject.h', + 'runtime/MemoryStatistics.h', + 'runtime/NumberObject.h', + 'runtime/NumberPrototype.h', + 'runtime/NumericStrings.h', + 'runtime/ObjectPrototype.h', + 'runtime/Operations.h', + 'runtime/PropertyDescriptor.h', + 'runtime/PropertyMapHashTable.h', + 'runtime/PropertyNameArray.h', + 'runtime/PropertySlot.h', + 'runtime/Protect.h', + 'runtime/PutPropertySlot.h', + 'runtime/RegExp.h', + 'runtime/RegExpKey.h', + 'runtime/RegExpCache.h', + 'runtime/RegExpObject.h', + 'runtime/RopeImpl.h', + 'runtime/ScopeChain.h', + 'runtime/SmallStrings.h', + 'runtime/StringObject.h', + 'runtime/StringObjectThatMasqueradesAsUndefined.h', + 'runtime/StringPrototype.h', + 'runtime/Structure.h', + 'runtime/StructureChain.h', + 'runtime/StructureTransitionTable.h', + 'runtime/SymbolTable.h', + 'runtime/Terminator.h', + 'runtime/TimeoutChecker.h', + 'runtime/UString.h', + 'runtime/UStringBuilder.h', + 'runtime/WeakGCMap.h', + 'runtime/WeakRandom.h', + 'runtime/WriteBarrier.h', + 'wtf/ASCIICType.h', + 'wtf/AVLTree.h', + 'wtf/Alignment.h', + 'wtf/AlwaysInline.h', + 'wtf/Assertions.h', + 'wtf/Atomics.h', + 'wtf/Bitmap.h', + 'wtf/BlockStack.h', + 'wtf/BloomFilter.h', + 'wtf/BumpPointerAllocator.h', + 'wtf/ByteArray.h', + 'wtf/Complex.h', + 'wtf/CrossThreadRefCounted.h', + 'wtf/CryptographicallyRandomNumber.h', + 'wtf/CurrentTime.h', + 'wtf/DateMath.h', + 'wtf/DecimalNumber.h', + 'wtf/Decoder.h', + 'wtf/Deque.h', + 'wtf/DisallowCType.h', + 'wtf/DoublyLinkedList.h', + 'wtf/Encoder.h', + 'wtf/FastAllocBase.h', + 'wtf/FastMalloc.h', + 'wtf/FixedArray.h', + 'wtf/Forward.h', + 'wtf/GetPtr.h', + 'wtf/HashCountedSet.h', + 'wtf/HashFunctions.h', + 'wtf/HashIterators.h', + 'wtf/HashMap.h', + 'wtf/HashSet.h', + 'wtf/HashTable.h', + 'wtf/HashTraits.h', + 'wtf/HexNumber.h', + 'wtf/ListHashSet.h', + 'wtf/ListRefPtr.h', + 'wtf/Locker.h', + 'wtf/MD5.h', + 'wtf/MainThread.h', + 'wtf/MathExtras.h', + 'wtf/MessageQueue.h', + 'wtf/NonCopyingSort.h', + 'wtf/Noncopyable.h', + 'wtf/NotFound.h', + 'wtf/NullPtr.h', + 'wtf/OSAllocator.h', + 'wtf/OwnArrayPtr.h', + 'wtf/OwnFastMallocPtr.h', + 'wtf/OwnPtr.h', + 'wtf/OwnPtrCommon.h', + 'wtf/PageAllocation.h', + 'wtf/PageAllocationAligned.h', + 'wtf/PageBlock.h', + 'wtf/PageReservation.h', + 'wtf/PassOwnArrayPtr.h', + 'wtf/PassOwnPtr.h', + 'wtf/PassRefPtr.h', + 'wtf/PassTraits.h', + 'wtf/Platform.h', + 'wtf/PossiblyNull.h', + 'wtf/RandomNumber.h', + 'wtf/RefCounted.h', + 'wtf/RefCountedLeakCounter.h', + 'wtf/RefPtr.h', + 'wtf/RefPtrHashMap.h', + 'wtf/RetainPtr.h', + 'wtf/SentinelLinkedList.h', + 'wtf/SinglyLinkedList.h', + 'wtf/StackBounds.h', + 'wtf/StaticConstructors.h', + 'wtf/StdLibExtras.h', + 'wtf/StringExtras.h', + 'wtf/StringHasher.h', + 'wtf/ThreadSafeRefCounted.h', + 'wtf/ThreadSpecific.h', + 'wtf/Threading.h', + 'wtf/ThreadingPrimitives.h', + 'wtf/TypeTraits.h', + 'wtf/UnusedParam.h', + 'wtf/VMTags.h', + 'wtf/ValueCheck.h', + 'wtf/Vector.h', + 'wtf/VectorTraits.h', + 'wtf/WTFThreadData.h', + 'wtf/dtoa.h', + 'wtf/text/AtomicString.h', + 'wtf/text/AtomicStringHash.h', + 'wtf/text/AtomicStringImpl.h', + 'wtf/text/CString.h', + 'wtf/text/StringBuffer.h', + 'wtf/text/StringBuilder.h', + 'wtf/text/StringConcatenate.h', + 'wtf/text/StringHash.h', + 'wtf/text/StringImpl.h', + 'wtf/text/StringImplBase.h', + 'wtf/text/StringOperators.h', + 'wtf/text/TextPosition.h', + 'wtf/text/WTFString.h', + 'wtf/unicode/CharacterNames.h', + 'wtf/unicode/Collator.h', + 'wtf/unicode/UTF8.h', + 'wtf/unicode/Unicode.h', + 'wtf/unicode/icu/UnicodeIcu.h', + 'yarr/Yarr.h', + 'yarr/YarrInterpreter.h', + 'yarr/YarrPattern.h', + ], + 'javascriptcore_files': [ + 'API/APIShims.h', + 'API/JSBase.cpp', 'API/JSCallbackConstructor.cpp', 'API/JSCallbackConstructor.h', 'API/JSCallbackFunction.cpp', @@ -17,38 +250,49 @@ 'API/JSClassRef.cpp', 'API/JSClassRef.h', 'API/JSContextRef.cpp', - 'API/JSContextRef.h', - 'API/JSContextRefPrivate.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/JSWeakObjectMapRefPrivate.cpp', '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', + 'AllInOneFile.cpp', + 'ForwardingHeaders/JavaScriptCore/APICast.h', + 'ForwardingHeaders/JavaScriptCore/APIShims.h', + 'ForwardingHeaders/JavaScriptCore/JSBase.h', + 'ForwardingHeaders/JavaScriptCore/JSContextRef.h', + 'ForwardingHeaders/JavaScriptCore/JSObjectRef.h', + 'ForwardingHeaders/JavaScriptCore/JSRetainPtr.h', + 'ForwardingHeaders/JavaScriptCore/JSStringRef.h', + 'ForwardingHeaders/JavaScriptCore/JSStringRefCF.h', + 'ForwardingHeaders/JavaScriptCore/JSValueRef.h', + 'ForwardingHeaders/JavaScriptCore/JavaScript.h', + 'ForwardingHeaders/JavaScriptCore/JavaScriptCore.h', + 'ForwardingHeaders/JavaScriptCore/OpaqueJSString.h', + 'ForwardingHeaders/JavaScriptCore/WebKitAvailability.h', + 'JavaScriptCorePrefix.h', + 'assembler/ARMAssembler.cpp', + 'assembler/ARMAssembler.h', + 'assembler/ARMv7Assembler.cpp', 'assembler/ARMv7Assembler.h', + 'assembler/AbstractMacroAssembler.h', 'assembler/AssemblerBuffer.h', + 'assembler/AssemblerBufferWithConstantPool.h', 'assembler/CodeLocation.h', + 'assembler/LinkBuffer.h', + 'assembler/MIPSAssembler.h', 'assembler/MacroAssembler.h', + 'assembler/MacroAssemblerARM.cpp', + 'assembler/MacroAssemblerARM.h', 'assembler/MacroAssemblerARMv7.h', - 'assembler/MacroAssemblerCodeRef.h', + 'assembler/MacroAssemblerMIPS.h', 'assembler/MacroAssemblerX86.h', - 'assembler/MacroAssemblerX86_64.h', 'assembler/MacroAssemblerX86Common.h', + 'assembler/MacroAssemblerX86_64.h', + 'assembler/RepatchBuffer.h', 'assembler/X86Assembler.h', 'bytecode/CodeBlock.cpp', 'bytecode/CodeBlock.h', @@ -57,24 +301,53 @@ '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/NodesCodegen.cpp', 'bytecompiler/Label.h', 'bytecompiler/LabelScope.h', + 'bytecompiler/NodesCodegen.cpp', 'bytecompiler/RegisterID.h', - 'config.h', + 'heap/ConservativeRoots.cpp', + 'heap/HandleHeap.cpp', + 'heap/HandleStack.cpp', + 'heap/Heap.cpp', + 'heap/MachineStackMarker.cpp', + 'heap/MachineStackMarker.h', + 'heap/MarkStack.cpp', + 'heap/MarkStack.h', + 'heap/MarkStackPosix.cpp', + 'heap/MarkStackSymbian.cpp', + 'heap/MarkStackWin.cpp', + 'heap/MarkedBlock.cpp', + 'heap/MarkedBlock.h', + 'heap/MarkedSpace.cpp', + 'heap/MarkedSpace.h', 'debugger/Debugger.cpp', - 'debugger/Debugger.h', 'debugger/DebuggerActivation.cpp', - 'debugger/DebuggerActivation.h', 'debugger/DebuggerCallFrame.cpp', - 'debugger/DebuggerCallFrame.h', + 'dfg/DFGAliasTracker.h', + 'dfg/DFGByteCodeParser.cpp', + 'dfg/DFGByteCodeParser.h', + 'dfg/DFGGenerationInfo.h', + 'dfg/DFGGraph.cpp', + 'dfg/DFGGraph.h', + 'dfg/DFGJITCodeGenerator.cpp', + 'dfg/DFGJITCodeGenerator.h', + 'dfg/DFGJITCompiler.cpp', + 'dfg/DFGJITCompiler.h', + 'dfg/DFGNode.h', + 'dfg/DFGNonSpeculativeJIT.cpp', + 'dfg/DFGNonSpeculativeJIT.h', + 'dfg/DFGOperations.cpp', + 'dfg/DFGOperations.h', + 'dfg/DFGRegisterBank.h', + 'dfg/DFGScoreBoard.h', + 'dfg/DFGSpeculativeJIT.cpp', + 'dfg/DFGSpeculativeJIT.h', 'icu/unicode/parseerr.h', 'icu/unicode/platform.h', 'icu/unicode/putil.h', @@ -99,25 +372,17 @@ '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/JITArithmetic32_64.cpp', 'jit/JITCall.cpp', - 'jit/JITCode.h', + 'jit/JITCall32_64.cpp', 'jit/JITInlineMethods.h', 'jit/JITOpcodes.cpp', 'jit/JITOpcodes32_64.cpp', @@ -125,10 +390,16 @@ 'jit/JITPropertyAccess32_64.cpp', 'jit/JITStubCall.h', 'jit/JITStubs.cpp', - 'jit/JITStubs.h', - 'jsc.cpp', + 'jit/JSInterfaceJIT.h', + 'jit/SpecializedThunkJIT.h', + 'jit/ThunkGenerators.cpp', + 'os-win32/WinMain.cpp', + 'os-win32/inttypes.h', 'os-win32/stdbool.h', 'os-win32/stdint.h', + 'parser/ASTBuilder.h', + 'parser/JSParser.cpp', + 'parser/JSParser.h', 'parser/Lexer.cpp', 'parser/Lexer.h', 'parser/NodeConstructors.h', @@ -139,66 +410,75 @@ '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', + 'parser/SourceProviderCache.cpp', + 'parser/SourceProviderCacheItem.h', + 'parser/SyntaxChecker.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/ProfilerServer.mm', + 'qt/api/qscriptconverter_p.h', + 'qt/api/qscriptengine.cpp', + 'qt/api/qscriptengine.h', + 'qt/api/qscriptengine_p.cpp', + 'qt/api/qscriptengine_p.h', + 'qt/api/qscriptfunction.cpp', + 'qt/api/qscriptfunction_p.h', + 'qt/api/qscriptoriginalglobalobject_p.h', + 'qt/api/qscriptprogram.cpp', + 'qt/api/qscriptprogram.h', + 'qt/api/qscriptprogram_p.h', + 'qt/api/qscriptstring.cpp', + 'qt/api/qscriptstring.h', + 'qt/api/qscriptstring_p.h', + 'qt/api/qscriptsyntaxcheckresult.cpp', + 'qt/api/qscriptsyntaxcheckresult.h', + 'qt/api/qscriptsyntaxcheckresult_p.h', + 'qt/api/qscriptvalue.cpp', + 'qt/api/qscriptvalue.h', + 'qt/api/qscriptvalue_p.h', + 'qt/api/qscriptvalueiterator.cpp', + 'qt/api/qscriptvalueiterator.h', + 'qt/api/qscriptvalueiterator_p.h', + 'qt/api/qtscriptglobal.h', + 'qt/benchmarks/qscriptengine/tst_qscriptengine.cpp', + 'qt/benchmarks/qscriptvalue/tst_qscriptvalue.cpp', + 'qt/tests/qscriptengine/tst_qscriptengine.cpp', + 'qt/tests/qscriptstring/tst_qscriptstring.cpp', + 'qt/tests/qscriptvalue/tst_qscriptvalue.cpp', + 'qt/tests/qscriptvalue/tst_qscriptvalue.h', + 'qt/tests/qscriptvalue/tst_qscriptvalue_generated_comparison.cpp', + 'qt/tests/qscriptvalue/tst_qscriptvalue_generated_init.cpp', + 'qt/tests/qscriptvalue/tst_qscriptvalue_generated_istype.cpp', + 'qt/tests/qscriptvalue/tst_qscriptvalue_generated_totype.cpp', + 'qt/tests/qscriptvalueiterator/tst_qscriptvalueiterator.cpp', '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/DateInstanceCache.h', 'runtime/DatePrototype.cpp', 'runtime/DatePrototype.h', 'runtime/Error.cpp', - 'runtime/Error.h', 'runtime/ErrorConstructor.cpp', 'runtime/ErrorConstructor.h', 'runtime/ErrorInstance.cpp', @@ -206,268 +486,256 @@ 'runtime/ErrorPrototype.cpp', 'runtime/ErrorPrototype.h', 'runtime/ExceptionHelpers.cpp', - 'runtime/ExceptionHelpers.h', + 'runtime/Executable.cpp', + 'runtime/Executable.h', 'runtime/FunctionConstructor.cpp', - 'runtime/FunctionConstructor.h', 'runtime/FunctionPrototype.cpp', - 'runtime/FunctionPrototype.h', + 'runtime/GCActivityCallback.cpp', + 'runtime/GCActivityCallbackCF.cpp', '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/JSAPIValueWrapper.cpp', '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/JSObject.cpp', + 'runtime/JSObjectWithGlobalObject.cpp', 'runtime/JSPropertyNameIterator.cpp', 'runtime/JSPropertyNameIterator.h', 'runtime/JSStaticScopeObject.cpp', 'runtime/JSStaticScopeObject.h', 'runtime/JSString.cpp', - 'runtime/JSString.h', - 'runtime/JSType.h', - 'runtime/JSTypeInfo.h', + 'runtime/JSStringBuilder.h', 'runtime/JSValue.cpp', - 'runtime/JSValue.h', 'runtime/JSVariableObject.cpp', - 'runtime/JSVariableObject.h', 'runtime/JSWrapperObject.cpp', - 'runtime/JSWrapperObject.h', + 'runtime/JSZombie.cpp', + 'runtime/JSZombie.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/MemoryStatistics.cpp', '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/PropertyDescriptor.cpp', - 'runtime/PropertyDescriptor.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/RegExpCache.cpp', - 'runtime/RegExpCache.h', 'runtime/RegExpConstructor.cpp', 'runtime/RegExpConstructor.h', - 'runtime/RegExpKey.h', 'runtime/RegExpMatchesArray.h', 'runtime/RegExpObject.cpp', - 'runtime/RegExpObject.h', 'runtime/RegExpPrototype.cpp', 'runtime/RegExpPrototype.h', + 'runtime/RopeImpl.cpp', 'runtime/ScopeChain.cpp', - 'runtime/ScopeChain.h', 'runtime/ScopeChainMark.h', 'runtime/SmallStrings.cpp', - 'runtime/SmallStrings.h', + 'runtime/StrictEvalActivation.cpp', + 'runtime/StrictEvalActivation.h', 'runtime/StringConstructor.cpp', 'runtime/StringConstructor.h', 'runtime/StringObject.cpp', - 'runtime/StringObject.h', - 'runtime/StringObjectThatMasqueradesAsUndefined.h', 'runtime/StringPrototype.cpp', - 'runtime/StringPrototype.h', + 'runtime/StringRecursionChecker.cpp', + 'runtime/StringRecursionChecker.h', 'runtime/Structure.cpp', - 'runtime/Structure.h', 'runtime/StructureChain.cpp', - 'runtime/StructureChain.h', - 'runtime/StructureTransitionTable.h', - 'runtime/SymbolTable.h', - 'runtime/Terminator.h', 'runtime/TimeoutChecker.cpp', - 'runtime/TimeoutChecker.h', + 'runtime/Tracing.d', 'runtime/Tracing.h', 'runtime/UString.cpp', - 'runtime/UString.h', - 'runtime/WeakRandom.h', - 'wtf/AlwaysInline.h', - 'wtf/ASCIICType.h', + 'runtime/UStringConcatenate.h', 'wtf/Assertions.cpp', - 'wtf/Assertions.h', - 'wtf/Atomics.h', - 'wtf/AVLTree.h', 'wtf/ByteArray.cpp', - 'wtf/ByteArray.h', - 'wtf/chromium/ChromiumThreading.h', - 'wtf/chromium/MainThreadChromium.cpp', - 'wtf/CrossThreadRefCounted.h', + 'wtf/CryptographicallyRandomNumber.cpp', '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/DecimalNumber.cpp', + 'wtf/DynamicAnnotations.cpp', + 'wtf/DynamicAnnotations.h', 'wtf/FastMalloc.cpp', - 'wtf/FastMalloc.h', - 'wtf/Forward.h', - 'wtf/GetPtr.h', - 'wtf/gobject/GOwnPtr.cpp', - 'wtf/gobject/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/MD5.cpp', - 'wtf/MD5.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/PassOwnPtr.h', - 'wtf/PassRefPtr.h', - 'wtf/Platform.h', - 'wtf/PtrAndFlags.h', + 'wtf/NullPtr.cpp', + 'wtf/OSAllocatorPosix.cpp', + 'wtf/OSAllocatorSymbian.cpp', + 'wtf/OSAllocatorWin.cpp', + 'wtf/OSRandomSource.cpp', + 'wtf/OSRandomSource.h', + 'wtf/PageAllocationAligned.cpp', + 'wtf/PageAllocatorSymbian.h', + 'wtf/PageBlock.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/SHA1.cpp', + 'wtf/SHA1.h', 'wtf/SegmentedVector.h', - 'wtf/StaticConstructors.h', - 'wtf/StdLibExtras.h', - 'wtf/StringExtras.h', - 'wtf/StringHashFunctions.h', + 'wtf/SizeLimits.cpp', + 'wtf/StackBounds.cpp', + 'wtf/StringExtras.cpp', 'wtf/TCPackedCache.h', - 'wtf/qt/MainThreadQt.cpp', - 'wtf/qt/StringQt.cpp', - 'wtf/qt/ThreadingQt.cpp', 'wtf/TCPageMap.h', 'wtf/TCSpinLock.h', 'wtf/TCSystemAlloc.cpp', 'wtf/TCSystemAlloc.h', + 'wtf/ThreadFunctionInvocation.h', 'wtf/ThreadIdentifierDataPthreads.cpp', 'wtf/ThreadIdentifierDataPthreads.h', + 'wtf/ThreadSpecificWin.cpp', 'wtf/Threading.cpp', - 'wtf/Threading.h', 'wtf/ThreadingNone.cpp', - 'wtf/ThreadingPrimitives.h', 'wtf/ThreadingPthreads.cpp', 'wtf/ThreadingWin.cpp', - 'wtf/ThreadSafeShared.h', - 'wtf/ThreadSpecific.h', - 'wtf/ThreadSpecificWin.cpp', 'wtf/TypeTraits.cpp', - 'wtf/TypeTraits.h', + 'wtf/WTFThreadData.cpp', + 'wtf/android/AndroidThreading.h', + 'wtf/android/MainThreadAndroid.cpp', + 'wtf/brew/MainThreadBrew.cpp', + 'wtf/brew/OwnPtrBrew.cpp', + 'wtf/brew/RefPtrBrew.h', + 'wtf/brew/ShellBrew.h', + 'wtf/brew/StringBrew.cpp', + 'wtf/brew/SystemMallocBrew.h', + 'wtf/chromium/ChromiumThreading.h', + 'wtf/chromium/MainThreadChromium.cpp', + 'wtf/dtoa.cpp', + 'wtf/efl/MainThreadEfl.cpp', + 'wtf/gobject/GOwnPtr.cpp', + 'wtf/gobject/GOwnPtr.h', + 'wtf/gobject/GRefPtr.cpp', + 'wtf/gobject/GRefPtr.h', + 'wtf/gobject/GTypedefs.h', + 'wtf/gtk/MainThreadGtk.cpp', + 'wtf/gtk/ThreadingGtk.cpp', + 'wtf/haiku/MainThreadHaiku.cpp', + 'wtf/haiku/StringHaiku.cpp', + 'wtf/mac/MainThreadMac.mm', + 'wtf/qt/MainThreadQt.cpp', + 'wtf/qt/StringQt.cpp', + 'wtf/qt/ThreadingQt.cpp', 'wtf/text/AtomicString.cpp', - 'wtf/text/AtomicString.h', - 'wtf/text/AtomicStringImpl.h', 'wtf/text/CString.cpp', - 'wtf/text/CString.h', - 'wtf/text/StringHash.h', + 'wtf/text/StringBuilder.cpp', 'wtf/text/StringImpl.cpp', - 'wtf/text/StringImpl.h', 'wtf/text/StringStatics.cpp', 'wtf/text/WTFString.cpp', - 'wtf/text/WTFString.h', - 'wtf/unicode/Collator.h', 'wtf/unicode/CollatorDefault.cpp', + 'wtf/unicode/UTF8.cpp', + 'wtf/unicode/UnicodeMacrosFromICU.h', + 'wtf/unicode/brew/UnicodeBrew.cpp', + 'wtf/unicode/brew/UnicodeBrew.h', '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/ValueCheck.h', - 'wtf/Vector.h', - 'wtf/VectorTraits.h', - 'wtf/VMTags.h', - 'wtf/WTFThreadData.cpp', - 'wtf/WTFThreadData.h', + 'wtf/unicode/wince/UnicodeWinCE.cpp', + 'wtf/unicode/wince/UnicodeWinCE.h', + 'wtf/url/api/ParsedURL.cpp', + 'wtf/url/api/ParsedURL.h', + 'wtf/url/api/URLString.h', + 'wtf/url/src/RawURLBuffer.h', + 'wtf/url/src/URLBuffer.h', + 'wtf/url/src/URLCharacterTypes.cpp', + 'wtf/url/src/URLCharacterTypes.h', + 'wtf/url/src/URLComponent.h', + 'wtf/url/src/URLEscape.cpp', + 'wtf/url/src/URLEscape.h', + 'wtf/url/src/URLParser.h', + 'wtf/url/src/URLQueryCanonicalizer.h', + 'wtf/url/src/URLSegments.cpp', + 'wtf/url/src/URLSegments.h', 'wtf/win/MainThreadWin.cpp', 'wtf/win/OwnPtrWin.cpp', + 'wtf/wince/FastMallocWinCE.h', + 'wtf/wince/MemoryManager.cpp', + 'wtf/wince/MemoryManager.h', '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', - ] + 'wtf/wx/StringWx.cpp', + 'yarr/YarrInterpreter.cpp', + 'yarr/YarrJIT.cpp', + 'yarr/YarrJIT.h', + 'yarr/YarrParser.h', + 'yarr/YarrPattern.cpp', + 'yarr/YarrSyntaxChecker.cpp', + 'yarr/YarrSyntaxChecker.h', + ], + 'javascriptcore_derived_source_files': [ + '<(PRODUCT_DIR)/DerivedSources/JavaScriptCore/Lexer.lut.h', + '<(PRODUCT_DIR)/DerivedSources/JavaScriptCore/RegExpJitTables.h', + '<(PRODUCT_DIR)/DerivedSources/JavaScriptCore/TracingDtrace.h', + '<(PRODUCT_DIR)/DerivedSources/JavaScriptCore/ArrayConstructor.lut.h', + '<(PRODUCT_DIR)/DerivedSources/JavaScriptCore/ArrayPrototype.lut.h', + '<(PRODUCT_DIR)/DerivedSources/JavaScriptCore/BooleanPrototype.lut.h', + '<(PRODUCT_DIR)/DerivedSources/JavaScriptCore/DateConstructor.lut.h', + '<(PRODUCT_DIR)/DerivedSources/JavaScriptCore/DatePrototype.lut.h', + '<(PRODUCT_DIR)/DerivedSources/JavaScriptCore/ErrorPrototype.lut.h', + '<(PRODUCT_DIR)/DerivedSources/JavaScriptCore/JSGlobalObject.lut.h', + '<(PRODUCT_DIR)/DerivedSources/JavaScriptCore/JSONObject.lut.h', + '<(PRODUCT_DIR)/DerivedSources/JavaScriptCore/MathObject.lut.h', + '<(PRODUCT_DIR)/DerivedSources/JavaScriptCore/NumberConstructor.lut.h', + '<(PRODUCT_DIR)/DerivedSources/JavaScriptCore/NumberPrototype.lut.h', + '<(PRODUCT_DIR)/DerivedSources/JavaScriptCore/ObjectConstructor.lut.h', + '<(PRODUCT_DIR)/DerivedSources/JavaScriptCore/ObjectPrototype.lut.h', + '<(PRODUCT_DIR)/DerivedSources/JavaScriptCore/RegExpConstructor.lut.h', + '<(PRODUCT_DIR)/DerivedSources/JavaScriptCore/RegExpObject.lut.h', + '<(PRODUCT_DIR)/DerivedSources/JavaScriptCore/RegExpPrototype.lut.h', + '<(PRODUCT_DIR)/DerivedSources/JavaScriptCore/StringConstructor.lut.h', + '<(PRODUCT_DIR)/DerivedSources/JavaScriptCore/StringPrototype.lut.h', + ], + 'minidom_files': [ + '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', + ], + 'minidom_support_files': [ + 'API/tests/minidom.js', + ], + 'testapi_files': [ + 'API/tests/testapi.c', + ], + 'testapi_support_files': [ + 'API/tests/testapi.js', + ], + 'jsc_files': [ + 'jsc.cpp', + ], } } diff --git a/JavaScriptCore.order b/JavaScriptCore.order index 3cb3d1d..275f35c 100644 --- a/JavaScriptCore.order +++ b/JavaScriptCore.order @@ -10,338 +10,616 @@ __ZN3WTF25TCMalloc_Central_FreeList18FetchFromSpansSafeEv __ZN3WTF17TCMalloc_PageHeap10AllocLargeEm __ZN3WTF17TCMalloc_PageHeap8GrowHeapEm __ZN3WTF17TCMalloc_PageHeap6DeleteEPNS_4SpanE +__ZN3WTF16fastZeroedMallocEm __ZN3WTF8fastFreeEPv __ZN3WTF19initializeThreadingEv -__ZN3WTF36lockAtomicallyInitializedStaticMutexEv -__ZN3WTF38unlockAtomicallyInitializedStaticMutexEv +__ZN3WTFL14threadMapMutexEv +__ZN3WTF20initializeMainThreadEv +__ZN3WTFL24initializeMainThreadOnceEv +__ZN3WTF5MutexC1Ev +__ZN3WTF28initializeMainThreadPlatformEv __ZN3JSC19initializeThreadingEv __ZN3JSCL23initializeThreadingOnceEv +__ZN3WTF10StringImpl5emptyEv __ZN3WTF13WTFThreadDataC1Ev -__ZN3JSC17initializeUStringEv -__ZN7WebCore10StringImpl5emptyEv +__ZN3WTF11StackBounds10initializeEv __ZN3JSC12JSGlobalData10storeVPtrsEv -__ZN3JSC9StructureC1ENS_7JSValueERKNS_8TypeInfoEj -__ZN3JSC7JSArrayC1EN3WTF17NonNullPassRefPtrINS_9StructureEEE -__ZN3WTF16fastZeroedMallocEm -__ZN3JSC7JSArrayD1Ev -__ZN3JSC7JSArrayD2Ev -__ZN3JSC9StructureD1Ev -__ZN3JSC9StructureD2Ev -__ZN3JSC11JSByteArray15createStructureENS_7JSValueE -__ZN3JSC11JSByteArrayD1Ev -__ZN3JSC8JSStringD1Ev -__ZN3JSC10JSFunctionC1EN3WTF17NonNullPassRefPtrINS_9StructureEEE -__ZN3JSC10JSFunctionC2EN3WTF17NonNullPassRefPtrINS_9StructureEEE -__ZN3JSC10JSFunctionD1Ev -__ZN3JSC10JSFunctionD2Ev -__ZN3JSC18VPtrHackExecutableD0Ev -__ZN3WTF5MutexC1Ev +__ZN3JSC7JSArrayC1ENS_6JSCell20VPtrStealingHackTypeE +__ZN3JSC10JSFunctionC1ENS_6JSCell20VPtrStealingHackTypeE __ZN3WTF15initializeDatesEv __ZN3WTF11currentTimeEv __ZN3WTF8msToYearEd +__ZN3JSC12RegisterFile19initializeThreadingEv __ZN3WTF39initializeMainThreadToProcessMainThreadEv -__ZN3WTFL43initializeMainThreadToProcessMainThreadOnceEv -__ZN3WTF47initializeMainThreadToProcessMainThreadPlatformEv -__ZN3WTF20initializeMainThreadEv -__ZN3WTF15ThreadConditionC1Ev -__ZN7WebCore10StringImpl6createEPKtj -__ZN7WebCore10StringImpl19createUninitializedEjRPt +__ZN3WTF36lockAtomicallyInitializedStaticMutexEv +__ZN3WTF38unlockAtomicallyInitializedStaticMutexEv +__ZN3WTF6StringC1EPKc +__ZN3WTF10StringImpl6createEPKc +__ZN3WTF10StringImpl6createEPKcj +__ZN3WTF10StringImpl19createUninitializedEjRPt +__ZN3WTF5equalEPKNS_10StringImplES2_ +__ZN3WTF10StringImpl6createEPKtj +__ZN3WTF12isMainThreadEv +__ZN3WTF10StringImplD1Ev +__ZN3WTF10StringImplD2Ev __ZN3WTF5Mutex4lockEv +__ZNK3WTF6String14threadsafeCopyEv +__ZNK3WTF10StringImpl14threadsafeCopyEv __ZN3WTF5Mutex6unlockEv -__ZNK7WebCore6String17crossThreadStringEv -__ZN7WebCore10StringImpl17crossThreadStringEv -__ZN7WebCore10StringImpl12sharedBufferEv -__ZN7WebCore6StringC1EPKc -__ZN7WebCore10StringImpl6createEPKc -__ZN7WebCore10StringImpl6createEPKcj -__ZNK7WebCore6String14threadsafeCopyEv -__ZNK7WebCore10StringImpl14threadsafeCopyEv -__ZN7WebCore10StringImpl8endsWithEPS0_b -__ZN7WebCore10StringImpl4findEPS0_ib -__ZN7WebCore10StringImplD1Ev -__ZN7WebCore10StringImplD2Ev -__ZN7WebCoreplERKNS_6StringEPKc -__ZN7WebCore6String6appendERKS0_ -__ZN7WebCoreplERKNS_6StringES2_ +__ZN3WTF10StringImpl8endsWithEPS0_b +__ZN3WTF13tryFastMallocEm +__ZN3WTF7CString16newUninitializedEmRPc +__ZN3WTF15ThreadConditionC1Ev __ZN3WTF12createThreadEPFPvS0_ES0_PKc __ZN3WTF20createThreadInternalEPFPvS0_ES0_PKc __ZN3WTFL35establishIdentifierForPthreadHandleERKP17_opaque_pthread_t -__ZN3WTF9HashTableIjSt4pairIjP17_opaque_pthread_tENS_18PairFirstExtractorIS4_EENS_7IntHashIjEENS_14PairHashTraitsINS_10HashTrai +__ZN3WTF9HashTableIjSt4pairIjP17_opaque_pthread_tENS_18PairFirstExtractorIS4_EENS_7IntHashIjEENS_14PairHashTraitsINS_10HashTraitsIjEENSA_IS3_EEEESB_E6rehashEi +__ZN3WTF15ThreadCondition6signalEv __ZN3WTFL16threadEntryPointEPv __ZN3WTF31initializeCurrentThreadInternalEPKc __ZN3WTF20ThreadIdentifierData10initializeEj __ZN3WTF20ThreadIdentifierData23initializeKeyOnceHelperEv __ZN3WTF5MutexD1Ev -__ZN3WTF12isMainThreadEv -__ZN3WTF7CString16newUninitializedEmRPc -__ZNK3WTF7CString4dataEv -__ZN3WTF14FastMallocZone4sizeEP14_malloc_zone_tPKv -__ZN7WebCore6String29charactersWithNullTerminationEv -__ZN7WebCore10StringImpl34createWithTerminatingNullCharacterERKS0_ +__ZNK3WTF6String4utf8Eb +__ZN3WTF7Unicode18convertUTF16ToUTF8EPPKtS2_PPcS4_b +__ZN3WTF7CStringC1EPKcm +__ZN3WTF7CString4initEPKcm +__ZN3WTF15ThreadCondition9timedWaitERNS_5MutexEd +__ZN3WTF12AtomicString4initEv +__ZN3WTF12AtomicString3addEPKc +__ZN3WTF9HashTableIPNS_10StringImplES2_NS_17IdentityExtractorIS2_EENS_10StringHashENS_10HashTraitsIS2_EES7_E6rehashEi +__ZNK3WTF6String9substringEjj +__ZNK3WTF6String5lowerEv +__ZN3WTF10StringImpl5lowerEv +__ZN3WTF5equalEPKNS_10StringImplEPKc +__ZN3WTF6StringC1EPKcj +__ZN3WTF12AtomicString3addEPKtj +__ZN3WTF17equalIgnoringCaseEPNS_10StringImplEPKc +__ZN3WTF6String6appendERKS0_ +__ZN3WTF6StringC1EPKtj +__ZN3WTF18charactersToDoubleEPKtmPbS2_ +__ZN3WTF6strtodEPKcPPc +__ZN3WTF10StringImpl22containsOnlyWhitespaceEv +__ZN3WTF12AtomicString11addSlowCaseEPNS_10StringImplE +__ZN3WTF12AtomicString6removeEPNS_10StringImplE +__ZN3WTF6String6numberEy +__ZN3WTF6String6formatEPKcz +__ZN3WTF6VectorIcLm256EE4growEm +__ZN3WTF10StringImpl11reverseFindEtj +__ZN3WTF10StringImpl9substringEjj +__ZN3WTF7CString11mutableDataEv +__ZN3WTF7CString18copyBufferIfNeededEv +__ZNK3WTF6String17crossThreadStringEv +__ZN3WTF10StringImpl17crossThreadStringEv +__ZN3WTF10StringImpl12sharedBufferEv +__ZN3WTF6String29charactersWithNullTerminationEv +__ZN3WTF10StringImpl34createWithTerminatingNullCharacterERKS0_ __ZN3WTF13currentThreadEv __ZN3WTF20ThreadIdentifierData10identifierEv -__ZNK7WebCore6String15stripWhiteSpaceEv -__ZN7WebCore10StringImpl15stripWhiteSpaceEv -__ZN7WebCore5equalEPKNS_10StringImplES2_ -__ZN7WebCoreplEPKcRKNS_6StringE -__ZN7WebCore6StringC1EPKt -__ZN7WebCore6StringC2EPKt -__ZNK7WebCore6String7isEmptyEv +__ZNK3WTF6String15stripWhiteSpaceEv +__ZN3WTF10StringImpl15stripWhiteSpaceEv +_JSStringCreateWithCFString +_JSStringRetain +_JSStringRelease +__ZN3WTF6String6numberEi __ZN3WTF16callOnMainThreadEPFvPvES0_ -__ZN3WTF5DequeINS_19FunctionWithContextEE14expandCapacityEv +__ZN3WTF5DequeINS_19FunctionWithContextELm0EE14expandCapacityEv __ZN3WTF37scheduleDispatchFunctionsOnMainThreadEv __ZN3WTF15ThreadCondition4waitERNS_5MutexE -__ZN3WTF17TCMalloc_PageHeap3NewEm -__ZN7WebCore12AtomicString4initEv -__ZN3WTF7HashSetIPN7WebCore10StringImplENS1_10StringHashENS_10HashTraitsIS3_EEE3addIPKcNS1_17CStringTranslatorEEESt4pairINS_24H -__ZN3WTF9HashTableIPN7WebCore10StringImplES3_NS_17IdentityExtractorIS3_EENS1_10StringHashENS_10HashTraitsIS3_EES8_E6rehashEi -__ZN7WebCore12AtomicString3addEPKc -__ZN7WebCore12AtomicString3addEPNS_10StringImplE -__ZN7WebCore6StringC1EPKcj -__ZN7WebCore5equalEPKNS_10StringImplEPKc -__ZNK7WebCore6String6lengthEv -__ZNK7WebCore6StringixEj -__ZNK7WebCore6String9substringEjj -__ZN7WebCore10StringImpl9substringEjj -__ZNK7WebCore6String5lowerEv -__ZN7WebCore10StringImpl5lowerEv -__ZN7WebCore10StringImpl4findEti -__ZNK7WebCore6String10charactersEv -__ZN7WebCore17equalIgnoringCaseEPNS_10StringImplES1_ -__ZN7WebCore17equalIgnoringCaseEPNS_10StringImplEPKc -__ZN7WebCore12AtomicString3addEPKtj -__ZN3WTF7HashSetIPN7WebCore10StringImplENS1_10StringHashENS_10HashTraitsIS3_EEE3addINS1_11UCharBufferENS1_21UCharBufferTranslat -__ZN7WebCore18charactersToDoubleEPKtmPb -__ZN3WTF6strtodEPKcPPc +__ZN3WTF6String8fromUTF8EPKc +__ZN3WTF6String8fromUTF8EPKcm +__ZN3WTF7Unicode18convertUTF8ToUTF16EPPKcS2_PPtS4_b +__ZN3WTF7CStringC1EPKc +__ZN3WTF11fastReallocEPvm +-[WTFMainThreadCaller call] +__ZN3WTF31dispatchFunctionsFromMainThreadEv +__ZN3WTF25TCMalloc_Central_FreeList11InsertRangeEPvS1_i +__ZN3WTF25TCMalloc_Central_FreeList11ShrinkCacheEib __ZN3WTF15ThreadCondition9broadcastEv -__ZN3WTF15ThreadCondition6signalEv -__ZN7WebCore12AtomicString6removeEPNS_10StringImplE -__ZN3JSC12JSGlobalData12createLeakedENS_15ThreadStackTypeE -__ZN3JSC9Structure18startIgnoringLeaksEv +__ZN3WTF20TCMalloc_ThreadCache18DestroyThreadCacheEPv +__ZN3WTF20TCMalloc_ThreadCache11DeleteCacheEPS0_ +__ZN3WTF25TCMalloc_Central_FreeList18ReleaseListToSpansEPv +__ZN3WTF20ThreadIdentifierData8destructEPv +__ZN3WTF31clearPthreadHandleForIdentifierEj +__ZN3WTF12detachThreadEj +__ZN3WTFL26pthreadHandleForIdentifierEj +__ZN3WTF14FastMallocZone4sizeEP14_malloc_zone_tPKv +__ZN3WTF10StringImpl4findEtj +___initializeScavenger_block_invoke_1 +__ZN3WTF23waitForThreadCompletionEjPPv +__ZN3WTF22cancelCallOnMainThreadEPFvPvES0_ +__ZN3WTF6StringC1EPKt +__ZN3WTF6StringC2EPKt +__ZNK3WTF6String5splitEtRNS_6VectorIS0_Lm0EEE +__ZNK3WTF6String5splitERKS0_bRNS_6VectorIS0_Lm0EEE +__ZN3WTF10StringImpl4findEPS0_j +__ZN3WTF6VectorINS_6StringELm0EE14expandCapacityEm +_JSGlobalContextCreate +__ZN3JSC6JSLock4lockENS_14JSLockBehaviorE +__ZN3JSCL17createJSLockCountEv +__ZN3JSC12JSGlobalData14sharedInstanceEv __ZN3JSC12JSGlobalDataC2ENS0_14GlobalDataTypeENS_15ThreadStackTypeE +__ZN3JSC21createIdentifierTableEv __ZN3JSC17CommonIdentifiersC1EPNS_12JSGlobalDataE __ZN3JSC17CommonIdentifiersC2EPNS_12JSGlobalDataE __ZN3JSC10Identifier3addEPNS_12JSGlobalDataEPKc -__ZN3WTF7HashSetIPN7WebCore10StringImplENS1_10StringHashENS_10HashTraitsIS3_EEE3addIPKcN3JSC27IdentifierCStringTranslatorEEESt4 -__ZN3WTF9HashTableIPN7WebCore10StringImplES3_NS_17IdentityExtractorIS3_EENS1_10StringHashENS_10HashTraitsIS3_EES8_E6expandEv -__ZN3WTF9HashTableIPKcSt4pairIS2_NS_6RefPtrIN7WebCore10StringImplEEEENS_18PairFirstExtractorIS8_EENS_7PtrHashIS2_EENS_14PairHas +__ZN3JSC15IdentifierTable3addIPKcNS_27IdentifierCStringTranslatorEEESt4pairIN3WTF29HashTableConstIteratorAdapterINS6_9HashTableIPNS6_10StringImplESA_NS6_17IdentityExtractorISA_EENS6_10StringHashENS6_10HashTraitsISA_EESF_EESA_EEbET_ +__ZN3WTF9HashTableIPNS_10StringImplES2_NS_17IdentityExtractorIS2_EENS_10StringHashENS_10HashTraitsIS2_EES7_E6expandEv +__ZN3WTF9HashTableIPKcSt4pairIS2_NS_6RefPtrINS_10StringImplEEEENS_18PairFirstExtractorIS7_EENS_7PtrHashIS2_EENS_14PairHashTraitsINS_10HashTraitsIS2_EENSD_IS6_EEEESE_E6expandEv +__ZN3WTF9HashTableIPNS_10StringImplES2_NS_17IdentityExtractorIS2_EENS_10StringHashENS_10HashTraitsIS2_EES7_E4findIS2_NS_22IdentityHashTranslatorIS2_S2_S5_EEEENS_17HashTableIteratorIS2_S2_S4_S5_S7_S7_EERKT_ __ZN3JSC10IdentifierC1EPNS_12JSGlobalDataEPKc __ZN3JSC12SmallStringsC1Ev __ZN3JSC19ExecutableAllocator17intializePageSizeEv +__ZNK3JSC19ExecutableAllocator7isValidEv +__ZN3WTF11OSAllocator18reserveUncommittedEmNS0_5UsageEbb __ZN3JSC14ExecutablePool11systemAllocEm +__ZN3WTF11OSAllocator6commitEPvmbb __ZN3JSC5LexerC1EPNS_12JSGlobalDataE __ZN3JSC11ParserArenaC1Ev __ZN3JSC11ParserArenaC2Ev -__ZN3JSC11InterpreterC1Ev -__ZN3JSC11InterpreterC2Ev +__ZN3JSC14TimeoutCheckerC1Ev +__ZN3JSC4HeapC1EPNS_12JSGlobalDataE +__ZN3JSC4HeapC2EPNS_12JSGlobalDataE +__ZN3JSC11MarkedSpaceC1EPNS_12JSGlobalDataE +__ZN3JSC25DefaultGCActivityCallbackC1EPNS_4HeapE +__ZN3JSC25DefaultGCActivityCallback17commonConstructorEPNS_4HeapEP11__CFRunLoop +__ZN3JSC14MachineThreadsC1EPNS_4HeapE +__ZN3JSC9MarkStack18initializePagesizeEv +__ZN3WTF11OSAllocator16reserveAndCommitEmNS0_5UsageEbb +__ZN3JSC10HandleHeapC1EPNS_12JSGlobalDataE +__ZN3WTF10BlockStackIN3JSC10HandleHeap4NodeEE4growEv +__ZN3WTF6VectorIPN3JSC10HandleHeap4NodeELm0EE15reserveCapacityEm +__ZN3JSC11HandleStackC1Ev +__ZN3WTF10BlockStackIN3JSC7JSValueEE4growEv +__ZN3WTF6VectorIPN3JSC7JSValueELm0EE15reserveCapacityEm +__ZN3JSC25DefaultGCActivityCallbackclEv +__ZN3JSC11RegExpCacheC1EPNS_12JSGlobalDataE +__ZN3JSC11InterpreterC1ERNS_12JSGlobalDataE +__ZN3JSC10HandleHeap12writeBarrierEPNS_7JSValueERKS1_ +__ZN3JSC12RegisterFile23addToCommittedByteCountEl +__ZN3JSC11MarkedSpace21allocateFromSizeClassERNS0_9SizeClassE +__ZN3JSC11MarkedSpace13allocateBlockERNS0_9SizeClassE +__ZN3JSC11MarkedBlock6createEPNS_12JSGlobalDataEm +__ZN3WTF21PageAllocationAligned8allocateEmmNS_11OSAllocator5UsageEbb +__ZN3WTF9HashTableIPN3JSC11MarkedBlockES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E6rehashEi +__ZN3JSC6JSCellD1Ev +__ZN3JSC9StructureC1ERNS_12JSGlobalDataE +__ZN3JSC6StrongINS_9StructureEE3setERNS_12JSGlobalDataEPS1_ +__ZN3JSC9Structure6createERNS_12JSGlobalDataENS_7JSValueERKNS_8TypeInfoEjPKNS_9ClassInfoE +__ZN3JSC9StructureC1ERNS_12JSGlobalDataENS_7JSValueERKNS_8TypeInfoEjPKNS_9ClassInfoE +__ZN3WTF13wtfThreadDataEv +__ZN3JSC27startProfilerServerIfNeededEv ++[ProfilerServer sharedProfileServer] +-[ProfilerServer init] __ZN3JSC9JITThunksC1EPNS_12JSGlobalDataE +__ZN3JSC9JITThunksC2EPNS_12JSGlobalDataE __ZN3JSC3JITC1EPNS_12JSGlobalDataEPNS_9CodeBlockE __ZN3JSC3JITC2EPNS_12JSGlobalDataEPNS_9CodeBlockE -__ZN3JSC3JIT35privateCompileCTIMachineTrampolinesEPN3WTF6RefPtrINS_14ExecutablePoolEEEPNS_12JSGlobalDataEPNS_19TrampolineStruct -__ZN3JSC20MacroAssemblerX86_6413branchTestPtrENS_23MacroAssemblerX86Common9ConditionENS_12X86Registers10RegisterIDES4_ +__ZN3JSC3JIT35privateCompileCTIMachineTrampolinesEPN3WTF6RefPtrINS_14ExecutablePoolEEEPNS_12JSGlobalDataEPNS_19TrampolineStructureE +__ZN3JSC20MacroAssemblerX86_6413branchTestPtrENS_23MacroAssemblerX86Common15ResultConditionENS_12X86Registers10RegisterIDES4_ __ZN3JSC12X86Assembler23X86InstructionFormatter11oneByteOp64ENS0_15OneByteOpcodeIDEiNS_12X86Registers10RegisterIDE __ZN3JSC12X86Assembler3jCCENS0_9ConditionE +__ZN3JSC15AssemblerBuffer11ensureSpaceEi __ZN3JSC12X86Assembler23X86InstructionFormatter11oneByteOp64ENS0_15OneByteOpcodeIDEiNS_12X86Registers10RegisterIDEi __ZN3JSC12X86Assembler23X86InstructionFormatter9oneByteOpENS0_15OneByteOpcodeIDEiNS_12X86Registers10RegisterIDEi __ZN3JSC12X86Assembler23X86InstructionFormatter11memoryModRMEiNS_12X86Registers10RegisterIDEi +__ZN3JSC23MacroAssemblerX86Common8branch32ENS0_19RelationalConditionENS_12X86Registers10RegisterIDENS_22AbstractMacroAssemblerINS_12X86AssemblerEE12TrustedImm32E __ZN3JSC12X86Assembler23X86InstructionFormatter9oneByteOpENS0_15OneByteOpcodeIDEiNS_12X86Registers10RegisterIDE -__ZN3JSC15AssemblerBuffer11ensureSpaceEi -__ZN3JSC20MacroAssemblerX86_644callEv -__ZN3JSC20MacroAssemblerX86_647loadPtrENS_22AbstractMacroAssemblerINS_12X86AssemblerEE15ImplicitAddressENS_12X86Registers10Regi -__ZN3JSC12X86Assembler23X86InstructionFormatter9oneByteOpENS0_15OneByteOpcodeIDENS_12X86Registers10RegisterIDE __ZN3JSC3JIT32compileOpCallInitializeCallFrameEv -__ZN3JSC15AssemblerBuffer4growEi -__ZN3WTF11fastReallocEPvm -__ZN3WTF11fastReallocILb1EEEPvS1_m +__ZN3JSC20MacroAssemblerX86_6413branchTestPtrENS_23MacroAssemblerX86Common15ResultConditionENS_12X86Registers10RegisterIDENS_22AbstractMacroAssemblerINS_12X86AssemblerEE12TrustedImm32E +__ZN3JSC12X86Assembler23X86InstructionFormatter9oneByteOpENS0_15OneByteOpcodeIDENS_12X86Registers10RegisterIDE +__ZN3WTF6VectorIcLm128EE14expandCapacityEm +__ZN3WTF6VectorIcLm128EE4growEm +__ZN3JSC3JIT27privateCompileCTINativeCallEPNS_12JSGlobalDataEb +__ZNK3JSC22AbstractMacroAssemblerINS_12X86AssemblerEE4Jump4linkEPS2_ __ZN3WTF10RefCountedIN3JSC14ExecutablePoolEE5derefEv -__ZN3JSC14TimeoutCheckerC1Ev -__ZN3JSC4HeapC1EPNS_12JSGlobalDataE -__ZN3JSC4Heap13allocateBlockEv -__ZN3JSC9MarkStack18initializePagesizeEv -__ZN3JSC9MarkStack13allocateStackEm -__ZN3JSC27startProfilerServerIfNeededEv -+[ProfilerServer sharedProfileServer] --[ProfilerServer init] -__ZN3JSC9Structure17stopIgnoringLeaksEv -__ZNK7WebCore6String6latin1Ev -__ZNK3WTF7CString6lengthEv -__ZN7WebCore10StringImpl22containsOnlyWhitespaceEv -__ZN7WebCore12AtomicString3addEPKt -__ZN7WebCore10StringImpl11reverseFindEPS0_ib -__ZN7WebCore10StringImpl5adoptERNS_12StringBufferE -__ZNK7WebCore6String5splitEtRN3WTF6VectorIS0_Lm0EEE -__ZNK7WebCore6String5splitERKS0_bRN3WTF6VectorIS0_Lm0EEE --[WTFMainThreadCaller call] -__ZN3WTF31dispatchFunctionsFromMainThreadEv -__ZN3WTF15ThreadCondition9timedWaitERNS_5MutexEd -__ZN3WTF14FastMallocZone9forceLockEP14_malloc_zone_t -__ZN3WTF14FastMallocZone11forceUnlockEP14_malloc_zone_t -__ZN3WTF20TCMalloc_ThreadCache18DestroyThreadCacheEPv -__ZN3WTF20TCMalloc_ThreadCache11DeleteCacheEPS0_ -__ZN3WTF25TCMalloc_Central_FreeList11InsertRangeEPvS1_i -__ZN3WTF25TCMalloc_Central_FreeList18ReleaseListToSpansEPv -__ZN3WTF20ThreadIdentifierData8destructEPv -__ZN3WTF31clearPthreadHandleForIdentifierEj -__ZN3WTF12detachThreadEj -__ZN3WTFL26pthreadHandleForIdentifierEj -__ZN7WebCore6StringC1EPKtj -__Z15jsRegExpCompilePKti24JSRegExpIgnoreCaseOption23JSRegExpMultilineOptionPjPPKc -__ZL30calculateCompiledPatternLengthPKti24JSRegExpIgnoreCaseOptionR11CompileDataR9ErrorCode -__ZL11checkEscapePPKtS0_P9ErrorCodeib -__ZL13compileBranchiPiPPhPPKtS3_P9ErrorCodeS_S_R11CompileData -__Z15jsRegExpExecutePK8JSRegExpPKtiiPii -__ZL5matchPKtPKhiR9MatchData -__ZN7WebCore6String6formatEPKcz -__ZNK7WebCore6String19characterStartingAtEj -__ZN7WebCore10StringImpl19characterStartingAtEj -__ZN3WTF25TCMalloc_Central_FreeList11ShrinkCacheEib -__ZNK7WebCore6String16removeCharactersEPFbtE -__ZN7WebCore10StringImpl16removeCharactersEPFbtE -__ZN7WebCore10StringImpl7replaceEtt -__ZNK7WebCore6String4utf8Ev -__ZN3WTF7Unicode18convertUTF16ToUTF8EPPKtS2_PPcS4_b -__ZN3WTF7CStringC1EPKcj -__ZN3WTF7CString4initEPKcj -__ZN7WebCore10StringImpl4findEPFbtEi -__ZN3JSC4Heap8allocateEm -__ZN3JSC6JSCellD1Ev -__ZN3JSC4Heap7protectENS_7JSValueE -__ZN3WTF9HashTableIPN3JSC6JSCellESt4pairIS3_jENS_18PairFirstExtractorIS5_EENS_7PtrHashIS3_EENS_14PairHashTraitsINS_10HashTraits +__ZN3JSC14MachineThreads29makeUsableFromMultipleThreadsEv +_JSGlobalContextCreateInGroup +__ZN3JSC4Heap16activityCallbackEv +__ZN3JSC25DefaultGCActivityCallback11synchronizeEv +__ZN3JSC14TimeoutChecker5resetEv __ZN3JSC14JSGlobalObjectnwEmPNS_12JSGlobalDataE +__ZN3WTF12randomNumberEv +__ZN3WTF29cryptographicallyRandomNumberEv +__ZN3WTF35cryptographicallyRandomValuesFromOSEPhm __ZN3JSC14JSGlobalObject4initEPNS_8JSObjectE __ZN3JSC14JSGlobalObject5resetENS_7JSValueE -__ZN3JSC17FunctionPrototypeC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEE -__ZN3JSC17FunctionPrototypeC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEE -__ZN3JSC16InternalFunctionC2EPNS_12JSGlobalDataEN3WTF17NonNullPassRefPtrINS_9StructureEEERKNS_10IdentifierE +__ZN3JSC17FunctionPrototypeC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureE +__ZN3JSC17FunctionPrototypeC2EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureE +__ZN3JSC16InternalFunctionC2EPNS_12JSGlobalDataEPNS_14JSGlobalObjectEPNS_9StructureERKNS_10IdentifierE +__ZN3JSC24JSObjectWithGlobalObjectC2EPNS_14JSGlobalObjectEPNS_9StructureE __ZN3JSC7UStringC1EPKc __ZN3JSC12SmallStrings17createEmptyStringEPNS_12JSGlobalDataE -__ZN3JSC8JSObject17putDirectInternalERKNS_10IdentifierENS_7JSValueEjbRNS_15PutPropertySlotEPNS_6JSCellE __ZN3JSC9Structure40addPropertyTransitionToExistingStructureEPS0_RKNS_10IdentifierEjPNS_6JSCellERm -__ZN3JSC9Structure3getEPKN7WebCore10StringImplERjRPNS_6JSCellE -__ZN3JSC9Structure21addPropertyTransitionEPS0_RKNS_10IdentifierEjPNS_6JSCellERm -__ZN3JSC9Structure3putERKNS_10IdentifierEjPNS_6JSCellE -__ZN3JSC9Structure28addPropertyWithoutTransitionERKNS_10IdentifierEjPNS_6JSCellE -__ZN3JSC17FunctionPrototype21addFunctionPropertiesEPNS_9ExecStateEPNS_9StructureEPPNS_10JSFunctionES7_ -__ZN3JSC10JSFunctionC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEiRKNS_10IdentifierEPFNS_7JSValueES2_PNS_8JSObjec -__ZN3JSC10JSFunctionC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEiRKNS_10IdentifierEPFNS_7JSValueES2_PNS_8JSObjec -__ZN3JSC8JSObject34putDirectFunctionWithoutTransitionEPNS_9ExecStateEPNS_16InternalFunctionEj -__ZN3JSC16InternalFunction4nameEPNS_9ExecStateE -__ZN3JSC15ObjectPrototypeC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPS5_ -__ZN3JSC15ObjectPrototypeC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPS5_ -__ZN3JSC9Structure26rehashPropertyMapHashTableEj -__ZN3JSC8JSObject17createInheritorIDEv -__ZN3JSC14ArrayPrototypeC1EN3WTF17NonNullPassRefPtrINS_9StructureEEE -__ZN3JSC7JSArrayC2EN3WTF17NonNullPassRefPtrINS_9StructureEEE -__ZN3JSC15StringPrototypeC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEE -__ZN3JSC15StringPrototypeC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEE -__ZN3JSC12StringObjectC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEE -__ZN3JSC16BooleanPrototypeC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPS5_ -__ZN3JSC16BooleanPrototypeC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPS5_ -__ZN3JSC13BooleanObjectC2EN3WTF17NonNullPassRefPtrINS_9StructureEEE -__ZN3JSC15NumberPrototypeC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPS5_ -__ZN3JSC15NumberPrototypeC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPS5_ -__ZN3JSC12NumberObjectC2EN3WTF17NonNullPassRefPtrINS_9StructureEEE -__ZN3JSC13DatePrototypeC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEE -__ZN3JSC12DateInstanceC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEE -__ZN3JSC15RegExpPrototypeC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPS5_ -__ZN3JSC15RegExpPrototypeC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPS5_ -__ZN3JSC14ErrorPrototypeC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPS5_ -__ZN3JSC14ErrorPrototypeC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPS5_ -__ZN3JSC13ErrorInstanceC2EN3WTF17NonNullPassRefPtrINS_9StructureEEE -__ZN3JSC20NativeErrorPrototypeC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEERKNS_7UStringES9_ -__ZN3JSC20NativeErrorPrototypeC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEERKNS_7UStringES9_ -__ZN3JSC17ObjectConstructorC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPNS_15ObjectPrototypeEPS5_ -__ZN3JSC17ObjectConstructorC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPNS_15ObjectPrototypeEPS5_ -__ZN3JSC10Identifier3addEPNS_9ExecStateEPKc -__ZN3JSC19FunctionConstructorC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPNS_17FunctionPrototypeE -__ZN3JSC19FunctionConstructorC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPNS_17FunctionPrototypeE -__ZNK3JSC16InternalFunction9classInfoEv -__ZN3JSC16ArrayConstructorC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPNS_14ArrayPrototypeEPS5_ -__ZN3JSC16ArrayConstructorC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPNS_14ArrayPrototypeEPS5_ -__ZNK3JSC14ArrayPrototype9classInfoEv -__ZN3JSC17StringConstructorC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPS5_PNS_15StringPrototypeE -__ZN3JSC17StringConstructorC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPS5_PNS_15StringPrototypeE -__ZNK3JSC15StringPrototype9classInfoEv -__ZN3JSC9JITThunks16specializedThunkEPNS_12JSGlobalDataEPFN3WTF10PassRefPtrINS_16NativeExecutableEEES2_PNS_14ExecutablePoolEE -__ZN3JSC26fromCharCodeThunkGeneratorEPNS_12JSGlobalDataEPNS_14ExecutablePoolE -__ZN3JSC22AbstractMacroAssemblerINS_12X86AssemblerEE8JumpList6appendENS2_4JumpE -__ZN3JSCL12charToStringERNS_19SpecializedThunkJITEPNS_12JSGlobalDataENS_12X86Registers10RegisterIDES5_S5_ -__ZN3JSC19SpecializedThunkJIT8finalizeEv -__ZN3JSC10JSFunctionC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEiRKNS_10IdentifierEPNS_16NativeExecutableEPFNS_7 -__ZN3JSC10JSFunctionC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEiRKNS_10IdentifierEPNS_16NativeExecutableEPFNS_7 +__ZN3JSC9Structure3getERNS_12JSGlobalDataEPN3WTF10StringImplERjRPNS_6JSCellE +__ZN3JSC9Structure21addPropertyTransitionERNS_12JSGlobalDataEPS0_RKNS_10IdentifierEjPNS_6JSCellERm +__ZN3JSC9Structure17createPropertyMapEj +__ZN3WTF14deleteOwnedPtrIN3JSC13PropertyTableEEEvPT_ +__ZN3JSC9Structure16putSpecificValueERNS_12JSGlobalDataERKNS_10IdentifierEjPNS_6JSCellE +__ZN3JSC24StructureTransitionTable3addERNS_12JSGlobalDataEPNS_9StructureE +__ZN3JSC9Structure28addPropertyWithoutTransitionERNS_12JSGlobalDataERKNS_10IdentifierEjPNS_6JSCellE __ZN3JSC8JSObject23allocatePropertyStorageEmm -__ZN3JSC18BooleanConstructorC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPNS_16BooleanPrototypeE -__ZN3JSC18BooleanConstructorC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPNS_16BooleanPrototypeE -__ZNK3JSC13BooleanObject9classInfoEv -__ZN3JSC17NumberConstructorC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPNS_15NumberPrototypeE -__ZN3JSC17NumberConstructorC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPNS_15NumberPrototypeE -__ZN3JSC15DateConstructorC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPS5_PNS_13DatePrototypeE -__ZN3JSC15DateConstructorC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPS5_PNS_13DatePrototypeE -__ZNK3JSC13DatePrototype9classInfoEv -__ZN3JSC17RegExpConstructorC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPNS_15RegExpPrototypeE -__ZN3JSC17RegExpConstructorC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPNS_15RegExpPrototypeE -__ZN3JSC16ErrorConstructorC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPNS_14ErrorPrototypeE -__ZN3JSC16ErrorConstructorC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPNS_14ErrorPrototypeE -__ZNK3JSC13ErrorInstance9classInfoEv -__ZN3JSC22NativeErrorConstructorC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPNS_20NativeErrorPrototypeE -__ZN3JSC22NativeErrorConstructorC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPNS_20NativeErrorPrototypeE -__ZNK3JSC6JSCell9getStringEPNS_9ExecStateE -__ZN3JSC10Identifier11addSlowCaseEPNS_9ExecStateEPN7WebCore10StringImplE -__ZN3WTF7HashSetIPN7WebCore10StringImplENS1_10StringHashENS_10HashTraitsIS3_EEE3addERKS3_ -__ZN3JSC10MathObjectC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEE -__ZN3JSC10MathObjectC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEE +__ZN3JSC17FunctionPrototype21addFunctionPropertiesEPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEPPNS_10JSFunctionES9_ +__ZN3JSC10JSFunctionC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEiRKNS_10IdentifierEPFPvS2_E +__ZN3JSC10JSFunctionC2EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEiRKNS_10IdentifierEPFPvS2_E +__ZN3JSC12JSGlobalData15getHostFunctionEPFPvPNS_9ExecStateEE +__ZN3JSC9JITThunks16hostFunctionStubEPNS_12JSGlobalDataEPFPvPNS_9ExecStateEE +__ZN3WTF7HashMapIPFPvPN3JSC9ExecStateEENS2_4WeakINS2_16NativeExecutableEEENS_7PtrHashIS6_EENS_10HashTraitsIS6_EENSC_IS9_EEE3addERKS6_RKS9_ +__ZN3WTF9HashTableIPFPvPN3JSC9ExecStateEESt4pairIS6_NS2_4WeakINS2_16NativeExecutableEEEENS_18PairFirstExtractorISB_EENS_7PtrHashIS6_EENS_14PairHashTraitsINS_10HashTraitsIS6_EENSH_ISA_EEEESI_E6expandEv +__ZN3JSC3JIT27privateCompileCTINativeCallEN3WTF10PassRefPtrINS_14ExecutablePoolEEEPNS_12JSGlobalDataEPFPvPNS_9ExecStateEE +__ZN3JSC16NativeExecutable6createERNS_12JSGlobalDataENS_21MacroAssemblerCodePtrEPFPvPNS_9ExecStateEES3_S8_ +__ZN3JSC8JSObject34putDirectFunctionWithoutTransitionEPNS_9ExecStateEPNS_10JSFunctionEj +__ZN3JSC10JSFunction4nameEPNS_9ExecStateE +__ZN3JSC15ObjectPrototypeC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureE +__ZN3JSC8JSObject17createInheritorIDERNS_12JSGlobalDataE +__ZN3JSC14ArrayPrototypeC1EPNS_14JSGlobalObjectEPNS_9StructureE +__ZN3JSC7JSArrayC2ERNS_12JSGlobalDataEPNS_9StructureE +__ZN3JSC15StringPrototypeC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureE +__ZN3JSC15StringPrototypeC2EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureE +__ZN3JSC12StringObjectC2EPNS_9ExecStateEPNS_9StructureE +__ZN3JSC16BooleanPrototypeC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureE +__ZN3JSC13BooleanObjectC2ERNS_12JSGlobalDataEPNS_9StructureE +__ZN3JSC15NumberPrototypeC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureE +__ZN3JSC12NumberObjectC2ERNS_12JSGlobalDataEPNS_9StructureE +__ZN3JSC13DatePrototypeC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureE +__ZN3JSC12DateInstanceC2EPNS_9ExecStateEPNS_9StructureE +__ZN3JSC12nonInlineNaNEv +__ZN3JSC15RegExpPrototypeC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureE +__ZN3JSC15RegExpPrototypeC2EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureE +__ZN3JSC6RegExp6createEPNS_12JSGlobalDataERKNS_7UStringENS_11RegExpFlagsE +__ZN3JSC6RegExp7compileEPNS_12JSGlobalDataE +__ZN3JSC4Yarr11YarrPatternC1ERKNS_7UStringEbbPPKc +__ZN3JSC4Yarr11YarrPattern7compileERKNS_7UStringE +__ZN3WTF6VectorIPN3JSC4Yarr18PatternAlternativeELm0EE14expandCapacityEm +__ZN3JSC4Yarr6ParserINS0_22YarrPatternConstructorEE5parseEv +__ZN3JSC4Yarr10jitCompileERNS0_11YarrPatternEPNS_12JSGlobalDataERNS0_13YarrCodeBlockE +__ZN3JSC4Yarr13YarrGenerator13opCompileBodyEPNS0_18PatternDisjunctionE +__ZN3WTF6VectorIN3JSC22AbstractMacroAssemblerINS1_12X86AssemblerEE4JumpELm16EED1Ev +__ZN3JSC4Yarr13YarrGenerator20opCompileAlternativeEPNS0_18PatternAlternativeE +__ZN3JSC4Yarr13YarrGenerator8generateEv +__ZN3JSC4Yarr13YarrGenerator22jumpIfNoAvailableInputEj +__ZN3JSC22AbstractMacroAssemblerINS_12X86AssemblerEE8JumpList6appendENS2_4JumpE +__ZN3JSC4Yarr13YarrGenerator9backtrackEv +__ZN3JSC4Yarr13YarrGenerator17BacktrackingState4linkEPNS_14MacroAssemblerE +__ZN3JSC22AbstractMacroAssemblerINS_12X86AssemblerEE8JumpList4linkEPS2_ +__ZN3JSC12X86Assembler7addl_irEiNS_12X86Registers10RegisterIDE +__ZN3JSC14MacroAssembler4jumpENS_22AbstractMacroAssemblerINS_12X86AssemblerEE5LabelE +__ZN3WTF15deleteAllValuesIPN3JSC4Yarr18PatternDisjunctionELm4EEEvRKNS_6VectorIT_XT0_EEE +__ZN3WTF15deleteAllValuesIPN3JSC4Yarr14CharacterClassELm0EEEvRKNS_6VectorIT_XT0_EEE +__ZN3JSC12RegExpObjectC2EPNS_14JSGlobalObjectEPNS_9StructureEN3WTF17NonNullPassRefPtrINS_6RegExpEEE +__ZN3JSC14ErrorPrototypeC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureE +__ZN3JSC14ErrorPrototypeC2EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureE +__ZN3JSC13ErrorInstanceC2EPNS_12JSGlobalDataEPNS_9StructureE +__ZN3JSC17ObjectConstructorC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEPNS_15ObjectPrototypeE +__ZN3JSC17ObjectConstructorC2EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEPNS_15ObjectPrototypeE +__ZN3JSC10Identifier3addEPNS_9ExecStateEPKc +__ZN3JSC19FunctionConstructorC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEPNS_17FunctionPrototypeE +__ZN3JSC19FunctionConstructorC2EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEPNS_17FunctionPrototypeE +__ZN3JSC16ArrayConstructorC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEPNS_14ArrayPrototypeE +__ZN3JSC16ArrayConstructorC2EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEPNS_14ArrayPrototypeE +__ZN3JSC17StringConstructorC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEPNS_15StringPrototypeE +__ZN3JSC17StringConstructorC2EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEPNS_15StringPrototypeE +__ZN3JSC18BooleanConstructorC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEPNS_16BooleanPrototypeE +__ZN3JSC18BooleanConstructorC2EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEPNS_16BooleanPrototypeE +__ZN3JSC17NumberConstructorC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEPNS_15NumberPrototypeE +__ZN3JSC17NumberConstructorC2EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEPNS_15NumberPrototypeE +__ZN3JSC15DateConstructorC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEPNS_13DatePrototypeE +__ZN3JSC15DateConstructorC2EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEPNS_13DatePrototypeE +__ZN3JSC17RegExpConstructorC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEPNS_15RegExpPrototypeE +__ZN3JSC17RegExpConstructorC2EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEPNS_15RegExpPrototypeE +__ZN3JSC16ErrorConstructorC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEPNS_14ErrorPrototypeE +__ZN3JSC16ErrorConstructorC2EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEPNS_14ErrorPrototypeE +__ZN3JSC22NativeErrorConstructorC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureES6_RKNS_7UStringE +__ZN3JSC22NativeErrorConstructorC2EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureES6_RKNS_7UStringE +__ZN3JSC10Identifier11addSlowCaseEPNS_9ExecStateEPN3WTF10StringImplE +__ZN3JSC15IdentifierTable3addEPN3WTF10StringImplE +__ZN3JSC20NativeErrorPrototypeC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureERKNS_7UStringEPNS_22NativeErrorConstructorE +__ZN3JSC20NativeErrorPrototypeC2EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureERKNS_7UStringEPNS_22NativeErrorConstructorE +__ZN3JSC10IdentifierC1EPNS_9ExecStateEPKc +__ZN3JSC10MathObjectC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureE +__ZN3JSC10MathObjectC2EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureE __ZN3JSC12SmallStrings24singleCharacterStringRepEh __ZN3JSC19SmallStringsStorageC2Ev -__ZN3JSC18GlobalEvalFunctionC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEiRKNS_10IdentifierEPFNS_7JSValueES2_PNS_ -__ZN3JSC17PrototypeFunctionC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEiRKNS_10IdentifierEPFNS_7JSValueES2_PNS_8 -__ZN3JSC9Structure25changePrototypeTransitionEPS0_NS_7JSValueE -__ZN3JSC9Structure17copyPropertyTableEv -__ZN3WTF10RefCountedIN3JSC9StructureEE5derefEv +__ZN3JSC10JSONObjectC1EPNS_14JSGlobalObjectEPNS_9StructureE +__ZN3JSC14JSGlobalObject16addStaticGlobalsEPNS0_18GlobalPropertyInfoEi +__ZN3WTF7HashMapINS_6RefPtrINS_10StringImplEEEN3JSC16SymbolTableEntryENS4_17IdentifierRepHashENS_10HashTraitsIS3_EENS4_26SymbolTableIndexHashTraitsEE3addEPS2_RKS5_ +__ZN3JSC9Structure25changePrototypeTransitionERNS_12JSGlobalDataEPS0_NS_7JSValueE +__ZN3JSC9Structure17copyPropertyTableERNS_12JSGlobalDataEPS0_ __ZN3JSC14JSGlobalObject10globalExecEv -__ZN3JSC4Heap9unprotectENS_7JSValueE -__ZN3JSC14TimeoutChecker5resetEv -__ZN3JSC8evaluateEPNS_9ExecStateERNS_10ScopeChainERKNS_10SourceCodeENS_7JSValueE +_JSGlobalContextRetain +__ZN3JSC14MachineThreads16addCurrentThreadEv __ZN3JSC6JSLockC1EPNS_9ExecStateE -__ZN3JSC6JSLock4lockENS_14JSLockBehaviorE -__ZN3JSC17ProgramExecutable7compileEPNS_9ExecStateEPNS_14ScopeChainNodeE -__ZN3JSC6Parser5parseINS_11ProgramNodeEEEN3WTF10PassRefPtrIT_EEPNS_12JSGlobalDataEPNS_8DebuggerEPNS_9ExecStateERKNS_10SourceCod -__ZN3JSC6Parser5parseEPNS_12JSGlobalDataEPiPNS_7UStringE -__ZN3JSC5Lexer7setCodeERKNS_10SourceCodeERNS_11ParserArenaE -__Z10jscyyparsePv -__ZN3JSC5Lexer3lexEPvS1_ +__ZN3JSC4Heap7protectENS_7JSValueE +__ZN3WTF9HashTableIPN3JSC6JSCellESt4pairIS3_jENS_18PairFirstExtractorIS5_EENS_7PtrHashIS3_EENS_14PairHashTraitsINS_10HashTraitsIS3_EENSB_IjEEEESC_E4findIS3_NS_22IdentityHashTranslatorIS3_S5_S9_EEEENS_17HashTableIteratorIS3_S5_S7_S9_SE_SC_EERKT_ +__ZN3WTF9HashTableIPN3JSC6JSCellESt4pairIS3_jENS_18PairFirstExtractorIS5_EENS_7PtrHashIS3_EENS_14PairHashTraitsINS_10HashTraitsIS3_EENSB_IjEEEESC_E6rehashEi +__ZN3JSC6JSLock6unlockENS_14JSLockBehaviorE +_JSValueMakeFromJSONString +__ZNK14OpaqueJSString7ustringEv +__ZN3JSC7UStringC1EPKtj +__ZN3JSC13LiteralParser5Lexer3lexERNS1_18LiteralParserTokenE +__ZN3JSC13LiteralParser5parseENS0_11ParserStateE +__ZN3JSC7JSArrayC1ERNS_12JSGlobalDataEPNS_9StructureE +__ZN3WTF13StringBuilder6appendEPKtj +__ZN3WTF13StringBuilder19appendUninitializedEj +__ZN3WTF13StringBuilder14allocateBufferEPKtj +__ZN3WTF13StringBuilder11shrinkToFitEv +__ZN3WTF13StringBuilder11reifyStringEv +__ZN3JSC12SmallStrings27createSingleCharacterStringEPNS_12JSGlobalDataEh +__ZN3JSC7JSArray4pushEPNS_9ExecStateENS_7JSValueE +__ZN3JSC7JSArray20increaseVectorLengthEj +__ZN3WTF14tryFastReallocEPvm +_JSValueIsNull +_JSValueIsUndefined +_JSValueIsBoolean +_JSValueIsNumber +_JSValueIsString +_JSValueToObject +__ZN3JSC12APIEntryShimC1EPNS_9ExecStateEb +__ZNK3JSC8JSObject8toObjectEPNS_9ExecStateEPNS_14JSGlobalObjectE +_JSContextGetGlobalObject +__ZNK3JSC8JSObject12toThisObjectEPNS_9ExecStateE +_JSStringCreateWithUTF8CString +_JSObjectGetProperty +__ZNK14OpaqueJSString10identifierEPN3JSC12JSGlobalDataE __ZN3JSC10Identifier3addEPNS_12JSGlobalDataEPKti -__ZN3WTF7HashSetIPN7WebCore10StringImplENS1_10StringHashENS_10HashTraitsIS3_EEE3addIN3JSC11UCharBufferENS9_31IdentifierUCharBuf +__ZN3JSC14JSGlobalObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +_JSValueIsInstanceOfConstructor +__ZN3JSC16ArrayConstructor18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC8JSObject11hasInstanceEPNS_9ExecStateENS_7JSValueES3_ +__ZN3JSC6JSCell9getObjectEv +__ZN3JSC7JSArray18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +_JSValueToNumber +_JSObjectGetPropertyAtIndex +__ZN3JSC7JSArray18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE +_JSValueToStringCopy +__ZNK3JSC7JSValue8toStringEPNS_9ExecStateE +__ZN14OpaqueJSString6createERKN3JSC7UStringE +_JSStringCopyCFString +_JSObjectCopyPropertyNames +__ZN3JSC8JSObject16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE +__ZN3JSC8JSObject19getOwnPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE +__ZN3JSC9Structure16getPropertyNamesERNS_12JSGlobalDataERNS_17PropertyNameArrayENS_15EnumerationModeE +__ZN3JSC9ExecState20objectPrototypeTableEPS0_ __ZNK3JSC9HashTable11createTableEPNS_12JSGlobalDataE +_JSPropertyNameArrayGetCount +_JSPropertyNameArrayRelease +_JSGlobalContextRelease +__ZN3JSC4Heap9unprotectENS_7JSValueE +__ZN3JSC10HandleHeap4growEv +__ZN3JSC37DefaultGCActivityCallbackPlatformData7triggerEP16__CFRunLoopTimerPv +__ZN3JSC4Heap17collectAllGarbageEv +__ZN3JSC12JSGlobalData23recompileAllJSFunctionsEv +__ZN3JSC4Heap5resetENS0_11SweepToggleE +__ZN3JSC4Heap9markRootsEv +__ZN3JSC14MachineThreads23gatherConservativeRootsERNS_17ConservativeRootsEPv +__ZN3JSC14MachineThreads23gatherFromCurrentThreadERNS_17ConservativeRootsEPv +__ZN3JSC17ConservativeRoots3addEPvS1_ +__ZN3JSC12RegisterFile23gatherConservativeRootsERNS_17ConservativeRootsE +__ZN3JSC11MarkedSpace10clearMarksEv +__ZN3JSC9MarkStack6appendERNS_17ConservativeRootsE +__ZN3JSC9MarkStack5drainEv +__ZN3JSC4Heap20markProtectedObjectsERNS_15HeapRootVisitorE +__ZN3JSC4Heap19markTempSortVectorsERNS_15HeapRootVisitorE +__ZN3JSC10HandleHeap17markStrongHandlesERNS_15HeapRootVisitorE +__ZN3JSC9MarkStack13visitChildrenEPNS_6JSCellE +__ZN3JSC9Structure13visitChildrenERNS_9MarkStackE +__ZN3JSC11HandleStack4markERNS_15HeapRootVisitorE +__ZN3JSC12SmallStrings13visitChildrenERNS_15HeapRootVisitorE +__ZN3JSC10HandleHeap15markWeakHandlesERNS_15HeapRootVisitorE +__ZN3JSC9MarkStack5resetEv +__ZN3JSC10HandleHeap19finalizeWeakHandlesEv +__ZN3JSC11MarkedSpace5resetEv +__ZN3JSC11MarkedSpace5sweepEv +__ZN3JSC11MarkedBlock5sweepEv +__ZN3JSC9StructureD1Ev +__ZN3JSC8JSStringD1Ev +__ZN3JSC10JSFunctionD1Ev +__ZN3JSC14ArrayPrototypeD1Ev +__ZN3JSC7JSArrayD2Ev +__ZN3JSC13DatePrototypeD1Ev +__ZN3JSC13JSFinalObjectD1Ev +__ZN3JSC7JSArrayD1Ev +__ZN3JSC14ScopeChainNodeD1Ev +__ZN3JSC15ObjectPrototypeD1Ev +__ZN3JSC15StringPrototypeD1Ev +__ZN3JSC16BooleanPrototypeD1Ev +__ZN3JSC15NumberPrototypeD1Ev +__ZN3JSC15RegExpPrototypeD1Ev +__ZN3JSC12RegExpObjectD2Ev +__ZN3JSC6RegExpD1Ev +__ZN3JSC14ErrorPrototypeD1Ev +__ZN3JSC17RegExpConstructorD1Ev +__ZN3JSC22NativeErrorConstructorD1Ev +__ZN3JSC17FunctionPrototypeD1Ev +__ZN3JSC17ObjectConstructorD1Ev +__ZN3JSC19FunctionConstructorD1Ev +__ZN3JSC16ArrayConstructorD1Ev +__ZN3JSC17StringConstructorD1Ev +__ZN3JSC18BooleanConstructorD1Ev +__ZN3JSC17NumberConstructorD1Ev +__ZN3JSC15DateConstructorD1Ev +__ZN3JSC16ErrorConstructorD1Ev +__ZN3JSC20NativeErrorPrototypeD1Ev +__ZN3JSC10MathObjectD1Ev +__ZN3JSC10JSONObjectD1Ev +__ZN3JSC16NativeExecutableD1Ev +__ZN3JSC14JSGlobalObjectD1Ev +__ZN3JSC14JSGlobalObjectD2Ev +__ZN3WTF9HashTableINS_6RefPtrI21OpaqueJSWeakObjectMapEES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E15deallocateTableEPS3_i +__ZN3WTF9HashTableINS_6RefPtrI21OpaqueJSWeakObjectMapEES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E6rehashEi +__ZN3JSC11MarkedSpace6shrinkEv +__ZN3JSC11MarkedSpace10freeBlocksERN3WTF16DoublyLinkedListINS_11MarkedBlockEEE +__ZN3JSC11MarkedBlock7destroyEPS0_ +__ZN3WTF21PageAllocationAligned10deallocateEv +__ZNK3JSC11MarkedSpace4sizeEv +__Z22TCMalloc_SystemReleasePvm +__Z21TCMalloc_SystemCommitPvm +__ZN3WTFL10timerFiredEP16__CFRunLoopTimerPv +__ZN3WTF15ThreadConditionD1Ev +__ZNK3WTF6String5toIntEPb +__ZN3WTF10StringImpl5toIntEPb +__ZN3WTF15charactersToIntEPKtmPb +__ZN3WTF22charactersToUIntStrictEPKtmPbi +__ZN3WTF6VectorIN3JSC4Yarr11PatternTermELm0EE14expandCapacityEm +__ZN3JSC4Yarr6ParserINS0_22YarrPatternConstructorEE28CharacterClassParserDelegate20atomPatternCharacterEtb +__ZN3JSC4Yarr25CharacterClassConstructor14addSortedRangeERN3WTF6VectorINS0_14CharacterRangeELm0EEEtt +__ZN3WTF6VectorIN3JSC4Yarr14CharacterRangeELm0EE14expandCapacityEmPKS3_ +__ZN3WTF6VectorIN3JSC4Yarr14CharacterRangeELm0EE14expandCapacityEm +__ZN3JSC4Yarr6ParserINS0_22YarrPatternConstructorEE11parseEscapeILb1ENS3_28CharacterClassParserDelegateEEEbRT0_ +__ZN3JSC4Yarr25CharacterClassConstructor7putCharEt +__ZN3WTF6VectorItLm0EE14expandCapacityEm +__ZN3JSC4Yarr22YarrPatternConstructor21atomCharacterClassEndEv +__ZN3WTF6VectorIPN3JSC4Yarr14CharacterClassELm0EE14expandCapacityEm +__ZN3JSC4Yarr22YarrPatternConstructor20atomPatternCharacterEt +__ZN3JSC4Yarr6ParserINS0_22YarrPatternConstructorEE11parseEscapeILb0ES2_EEbRT0_ +__ZN3JSC4Yarr11byteCompileERNS0_11YarrPatternEPN3WTF20BumpPointerAllocatorE +__ZN3WTF6VectorIN3JSC4Yarr8ByteTermELm0EE14expandCapacityEm +__ZN3JSC4Yarr12ByteCompiler15emitDisjunctionEPNS0_18PatternDisjunctionEjj +__ZN3JSC4Yarr13newlineCreateEv +__ZN3JSC4Yarr14wordcharCreateEv +__ZN3JSC4Yarr9interpretEPNS0_15BytecodePatternEPKtjjPi +__ZN3JSC4Yarr11Interpreter16matchDisjunctionEPNS0_15ByteDisjunctionEPNS1_18DisjunctionContextEb +__ZN3WTF10StringImpl23reverseFindIgnoringCaseEPS0_j +__ZN3JSC12JSGlobalData12createLeakedENS_15ThreadStackTypeE +__ZN3WTF10StringImpl5adoptERNS_12StringBufferE +__ZN3WTF10StringImpl7replaceEtt +__ZNK3WTF6String16removeCharactersEPFbtE +__ZN3WTF10StringImpl16removeCharactersEPFbtE +__ZN3WTF10StringImpl4findEPFbtEj +__ZN3JSC24JSObjectWithGlobalObjectC2ERNS_12JSGlobalDataEPNS_14JSGlobalObjectEPNS_9StructureE +_JSContextGetGlobalContext +_JSWeakObjectMapCreate +__ZN3JSC14JSGlobalObject17weakMapsFinalizerEv +_JSWeakObjectMapGet +_JSClassCreate +__ZN13OpaqueJSClass6createEPK17JSClassDefinition +__ZN13OpaqueJSClassC2EPK17JSClassDefinitionPS_ +__ZN3WTF9HashTableINS_6RefPtrINS_10StringImplEEESt4pairIS3_P16StaticValueEntryENS_18PairFirstExtractorIS7_EENS_10StringHashENS_14PairHashTraitsINS_10HashTraitsIS3_EENSC_IS6_EEEESD_E6expandEv +_JSClassRetain +_JSObjectMake +__ZN3JSC16JSCallbackObjectINS_24JSObjectWithGlobalObjectEEC2EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEP13OpaqueJSClassPv +__ZN3JSC16JSCallbackObjectINS_24JSObjectWithGlobalObjectEE4initEPNS_9ExecStateE +__ZN3JSC6JSLock12DropAllLocksC1EPNS_9ExecStateE +_JSObjectGetPrivate +__ZN3JSC6JSLock12DropAllLocksD1Ev +__ZN13OpaqueJSClass9prototypeEPN3JSC9ExecStateE +__ZN13OpaqueJSClass11contextDataEPN3JSC9ExecStateE +__ZN3WTF9HashTableIP13OpaqueJSClassSt4pairIS2_P24OpaqueJSClassContextDataENS_18PairFirstExtractorIS6_EENS_7PtrHashIS2_EENS_14PairHashTraitsINS_10HashTraitsIS2_EENSC_IS5_EEEESD_E6expandEv +__ZN24OpaqueJSClassContextDataC2ERN3JSC12JSGlobalDataEP13OpaqueJSClass +_JSWeakObjectMapSet +__ZN3WTF9HashTableIPvSt4pairIS1_PN3JSC7JSValueEENS_18PairFirstExtractorIS6_EENS_7PtrHashIS1_EENS_14PairHashTraitsINS_10HashTraitsIS1_EENSC_IS5_EEEESD_E6rehashEi +_JSObjectSetProperty +__ZNK3JSC8JSObject11hasPropertyEPNS_9ExecStateERKNS_10IdentifierE +__ZN3JSC16JSCallbackObjectINS_24JSObjectWithGlobalObjectEE18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC15ObjectPrototype18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC8JSObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueEj +__ZN3JSC10Identifier8toUInt32ERKNS_7UStringERb +__ZN3WTF12AtomicString4findEPKtjj +__ZNK3WTF9HashTableIPNS_10StringImplES2_NS_17IdentityExtractorIS2_EENS_10StringHashENS_10HashTraitsIS2_EES7_E4findINS_17HashAndCharactersENS_24HashSetTranslatorAdapterIS2_S7_SA_NS_27HashAndCharactersTranslatorEEEEENS_22HashTableConstIteratorIS2_S2_S4_S5_S7_S7_EERKT_ +__ZN3JSC14JSGlobalObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueEj +__ZN3JSC8JSObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSC8evaluateEPNS_9ExecStateEPNS_14ScopeChainNodeERKNS_10SourceCodeENS_7JSValueE +__ZN3JSC17ProgramExecutableC1EPNS_9ExecStateERKNS_10SourceCodeE +__ZN3JSC11Interpreter7executeEPNS_17ProgramExecutableEPNS_9ExecStateEPNS_14ScopeChainNodeEPNS_8JSObjectE +__ZN3JSC24DynamicGlobalObjectScopeC1ERNS_12JSGlobalDataEPNS_14JSGlobalObjectE +__ZN3JSC19ExecutableAllocator19underMemoryPressureEv +__ZN3JSC12JSGlobalData14resetDateCacheEv +__ZN3JSC17ProgramExecutable15compileInternalEPNS_9ExecStateEPNS_14ScopeChainNodeE +__ZN3JSC6Parser5parseINS_11ProgramNodeEEEN3WTF10PassRefPtrIT_EEPNS_14JSGlobalObjectEPNS_8DebuggerEPNS_9ExecStateERKNS_10SourceCodeEPNS_18FunctionParametersENS_18JSParserStrictnessEPPNS_8JSObjectE +__ZN3JSC6Parser5parseEPNS_12JSGlobalDataEPNS_18FunctionParametersENS_18JSParserStrictnessENS_12JSParserModeEPiPNS_7UStringE +__ZN3JSC5Lexer7setCodeERKNS_10SourceCodeERNS_11ParserArenaE +__ZN3JSC7jsParseEPNS_12JSGlobalDataEPNS_18FunctionParametersENS_18JSParserStrictnessENS_12JSParserModeEPKNS_10SourceCodeE +__ZN3JSC8JSParserC2EPNS_5LexerEPNS_12JSGlobalDataEPNS_18FunctionParametersEbbPNS_14SourceProviderE +__ZN3JSC8JSParser9pushScopeEv +__ZN3JSC8JSParser4nextENS_5Lexer7LexTypeE +__ZN3JSC5Lexer3lexEPNS_11JSTokenDataEPNS_11JSTokenInfoENS0_7LexTypeEb +__ZN3WTF15SegmentedVectorIN3JSC10IdentifierELm64EE6appendIS2_EEvRKT_ +__ZN3JSC8JSParser12parseProgramEv +__ZNK3JSC19SourceProviderCache8byteSizeEv +__ZN3WTF6VectorIPN3JSC20ParserArenaDeletableELm0EE15reserveCapacityEm +__ZN3JSC8JSParser19parseSourceElementsILNS0_18SourceElementsModeE0ENS_10ASTBuilderEEENT0_14SourceElementsERS4_ +__ZN3JSC8JSParser14parseStatementINS_10ASTBuilderEEENT_9StatementERS3_RPKNS_10IdentifierE +__ZN3JSC8JSParser24parseFunctionDeclarationINS_10ASTBuilderEEENT_9StatementERS3_ +__ZN3JSC8JSParser17parseFunctionInfoILNS0_20FunctionRequirementsE1ELb1ENS_10ASTBuilderEEEbRT1_RPKNS_10IdentifierERNS4_19FormalParameterListERNS4_12FunctionBodyERiSE_SE_ +__ZN3JSC8JSParser16declareParameterEPKNS_10IdentifierE +__ZN3JSC11ParserArena16allocateFreeableEm __ZN3JSC11ParserArena20allocateFreeablePoolEv -__ZL20makeFunctionCallNodePN3JSC12JSGlobalDataENS_8NodeInfoIPNS_14ExpressionNodeEEENS2_IPNS_13ArgumentsNodeEEEiii -__ZNK3JSC15DotAccessorNode10isLocationEv -__ZNK3JSC14ExpressionNode13isResolveNodeEv -__ZNK3JSC14ExpressionNode21isBracketAccessorNodeEv -__ZL14makeAssignNodePN3JSC12JSGlobalDataEPNS_14ExpressionNodeENS_8OperatorES3_bbiii -__ZNK3JSC11ResolveNode10isLocationEv -__ZNK3JSC11ResolveNode13isResolveNodeEv +__ZN3JSC8JSParser19parseSourceElementsILNS0_18SourceElementsModeE0ENS_13SyntaxCheckerEEENT0_14SourceElementsERS4_ +__ZN3JSC8JSParser14parseStatementINS_13SyntaxCheckerEEENT_9StatementERS3_RPKNS_10IdentifierE +__ZN3JSC8JSParser17parseForStatementINS_13SyntaxCheckerEEENT_9StatementERS3_ +__ZN3JSC8JSParser5Scope15declareVariableEPKNS_10IdentifierE +__ZN3JSC5Lexer7record8Ei +__ZN3JSC8JSParser25parseAssignmentExpressionINS_13SyntaxCheckerEEENT_10ExpressionERS3_ +__ZN3JSC8JSParser21parseMemberExpressionINS_13SyntaxCheckerEEENT_10ExpressionERS3_ +__ZN3JSC8JSParser15parseExpressionINS_13SyntaxCheckerEEENT_10ExpressionERS3_ +__ZN3WTF7HashSetINS_6RefPtrINS_10StringImplEEEN3JSC17IdentifierRepHashENS_10HashTraitsIS3_EEE3addERKS3_ +__ZN3JSC8JSParser16parseIfStatementINS_13SyntaxCheckerEEENT_9StatementERS3_ +__ZN3JSC8JSParser31parseExpressionOrLabelStatementINS_13SyntaxCheckerEEENT_9StatementERS3_ +__ZN3JSC5Lexer16nextTokenIsColonEv +__ZN3JSC16FunctionBodyNode6createEPNS_12JSGlobalDataEb +__ZN3JSC11ParserArena14derefWithArenaEN3WTF10PassRefPtrINS_21ParserArenaRefCountedEEE +__ZN3WTF14deleteOwnedPtrIN3JSC23SourceProviderCacheItemEEEvPT_ +__ZN3JSC8JSParser5Scope29copyCapturedVariablesToVectorERKN3WTF7HashSetINS2_6RefPtrINS2_10StringImplEEENS_17IdentifierRepHashENS2_10HashTraitsIS6_EEEERNS2_6VectorIS6_Lm0EEE +__ZN3WTF9HashTableINS_6RefPtrINS_10StringImplEEES3_NS_17IdentityExtractorIS3_EEN3JSC17IdentifierRepHashENS_10HashTraitsIS3_EES9_E13isEmptyBucketERKS3_ +__ZN3WTF9HashTableINS_6RefPtrINS_10StringImplEEES3_NS_17IdentityExtractorIS3_EEN3JSC17IdentifierRepHashENS_10HashTraitsIS3_EES9_E15deallocateTableEPS3_i +__ZN3WTF9HashTableINS_6RefPtrINS_10StringImplEEES3_NS_17IdentityExtractorIS3_EEN3JSC17IdentifierRepHashENS_10HashTraitsIS3_EES9_E6expandEv +__ZN3WTF9HashTableINS_6RefPtrINS_10StringImplEEES3_NS_17IdentityExtractorIS3_EEN3JSC17IdentifierRepHashENS_10HashTraitsIS3_EES9_E6rehashEi +__ZN3WTF6VectorINS_6RefPtrINS_10StringImplEEELm0EE14expandCapacityEm +__ZN3JSC8JSParser5ScopeD1Ev +__ZN3JSC19SourceProviderCache3addEiN3WTF10PassOwnPtrINS_23SourceProviderCacheItemEEEj +__ZN3WTF9HashTableIiSt4pairIiPN3JSC23SourceProviderCacheItemEENS_18PairFirstExtractorIS5_EENS_7IntHashIjEENS_14PairHashTraitsINS_10HashTraitsIiEENSB_IS4_EEEESC_E6expandEv +__ZN3JSC5Lexer10sourceCodeEiii +__ZN3JSC16FunctionBodyNode13finishParsingERKNS_10SourceCodeEPNS_13ParameterNodeERKNS_10IdentifierE +__ZN3WTF6VectorIN3JSC10IdentifierELm0EE14expandCapacityEm +__ZN3JSC16FunctionBodyNode13finishParsingEN3WTF10PassRefPtrINS_18FunctionParametersEEERKNS_10IdentifierE +__ZN3WTF6VectorIPN3JSC16FunctionBodyNodeELm0EE15reserveCapacityEm __ZN3JSC13StatementNode6setLocEii -__ZN3WTF6VectorIPN3JSC20ParserArenaDeletableELm0EE14expandCapacityEm __ZN3JSC14SourceElements6appendEPNS_13StatementNodeE __ZNK3JSC13StatementNode16isEmptyStatementEv __ZN3WTF6VectorIPN3JSC13StatementNodeELm0EE14expandCapacityEm -__ZN3JSC6Parser16didFinishParsingEPNS_14SourceElementsEPNS_15ParserArenaDataIN3WTF6VectorISt4pairIPKNS_10IdentifierEjELm0EEEEEP +__ZN3JSC8JSParser21parseConstDeclarationINS_10ASTBuilderEEENT_9StatementERS3_ +__ZN3WTF6VectorISt4pairIPKN3JSC10IdentifierEjELm0EE15reserveCapacityEm +__ZN3JSC8JSParser25parseAssignmentExpressionINS_10ASTBuilderEEENT_10ExpressionERS3_ +__ZN3JSC8JSParser21parseMemberExpressionINS_10ASTBuilderEEENT_10ExpressionERS3_ +__ZN3JSC5Lexer10scanRegExpERPKNS_10IdentifierES4_t +__ZN3JSC4Yarr11checkSyntaxERKNS_7UStringE +__ZN3JSC4Yarr6ParserINS0_13SyntaxCheckerEE5parseEv +__ZN3JSC4Yarr6ParserINS0_13SyntaxCheckerEE11parseEscapeILb1ENS3_28CharacterClassParserDelegateEEEbRT0_ +__ZN3JSC8JSParser20parseReturnStatementINS_13SyntaxCheckerEEENT_9StatementERS3_ +__ZN3WTF6VectorIiLm0EE14expandCapacityEm +__ZN3JSC8JSParser19parseVarDeclarationINS_13SyntaxCheckerEEENT_9StatementERS3_ +__ZN3JSC8JSParser17parseFunctionInfoILNS0_20FunctionRequirementsE0ELb0ENS_13SyntaxCheckerEEEbRT1_RPKNS_10IdentifierERNS4_19FormalParameterListERNS4_12FunctionBodyERiSE_SE_ +__ZN3JSC8JSParser19parseWhileStatementINS_13SyntaxCheckerEEENT_9StatementERS3_ +__ZN3JSC10ASTBuilder20makeFunctionCallNodeEPNS_14ExpressionNodeEPNS_13ArgumentsNodeEiii +__ZNK3JSC11ResolveNode10isLocationEv +__ZNK3JSC11ResolveNode13isResolveNodeEv +__ZN3WTF6VectorISt4pairIiiELm0EE14expandCapacityEm +__ZN3JSC8JSParser22parseContinueStatementINS_13SyntaxCheckerEEENT_9StatementERS3_ +__ZN3JSC8JSParser17parseTryStatementINS_13SyntaxCheckerEEENT_9StatementERS3_ +__ZN3JSC6Parser16didFinishParsingEPNS_14SourceElementsEPNS_15ParserArenaDataIN3WTF6VectorISt4pairIPKNS_10IdentifierEjELm0EEEEEPNS3_INS5_IPNS_16FunctionBodyNodeELm0EEEEEjiiRNS4_7HashSetINS4_6RefPtrINS4_10StringImplEEENS_17IdentifierRepHashENS4_10HashTraitsISM_EEEE +__ZN3JSC11ParserArenaD1Ev __ZN3JSC5Lexer5clearEv -__ZN3JSC11ProgramNode6createEPNS_12JSGlobalDataEPNS_14SourceElementsEPN3WTF6VectorISt4pairIPKNS_10IdentifierEjELm0EEEPNS6_IPNS_ -__ZN3JSC9ScopeNodeC2EPNS_12JSGlobalDataERKNS_10SourceCodeEPNS_14SourceElementsEPN3WTF6VectorISt4pairIPKNS_10IdentifierEjELm0EEE -__ZN3JSC11ParserArena14derefWithArenaEN3WTF10PassRefPtrINS_21ParserArenaRefCountedEEE +__ZN3JSC11ProgramNode6createEPNS_12JSGlobalDataEPNS_14SourceElementsEPN3WTF6VectorISt4pairIPKNS_10IdentifierEjELm0EEEPNS6_IPNS_16FunctionBodyNodeELm0EEERNS5_7HashSetINS5_6RefPtrINS5_10StringImplEEENS_17IdentifierRepHashENS5_10HashTraitsISL_EEEERKNS_10SourceCodeEji +__ZN3JSC9ScopeNodeC2EPNS_12JSGlobalDataERKNS_10SourceCodeEPNS_14SourceElementsEPN3WTF6VectorISt4pairIPKNS_10IdentifierEjELm0EEEPNS9_IPNS_16FunctionBodyNodeELm0EEERNS8_7HashSetINS8_6RefPtrINS8_10StringImplEEENS_17IdentifierRepHashENS8_10HashTraitsISO_EEEEji __ZN3JSC11ParserArena10removeLastEv __ZN3JSC11ParserArena5resetEv __ZN3WTF6VectorIN3JSC10IdentifierELm64EE14shrinkCapacityEm -__ZN3JSC9CodeBlockC2EPNS_16ScriptExecutableENS_8CodeTypeEN3WTF10PassRefPtrINS_14SourceProviderEEEjPNS4_7HashMapINS4_6RefPtrIN7W -__ZN3WTF7HashSetIPN3JSC15GlobalCodeBlockENS_7PtrHashIS3_EENS_10HashTraitsIS3_EEE3addERKS3_ -__ZN3WTF9HashTableIPN3JSC15GlobalCodeBlockES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E6rehashEi -__ZN3JSC17BytecodeGeneratorC1EPNS_11ProgramNodeEPKNS_8DebuggerERKNS_10ScopeChainEPN3WTF7HashMapINS9_6RefPtrIN7WebCore10StringIm -__ZN3JSC17BytecodeGeneratorC2EPNS_11ProgramNodeEPKNS_8DebuggerERKNS_10ScopeChainEPN3WTF7HashMapINS9_6RefPtrIN7WebCore10StringIm +__ZN3JSC9CodeBlockC2EPNS_16ScriptExecutableENS_8CodeTypeEPNS_14JSGlobalObjectEN3WTF10PassRefPtrINS_14SourceProviderEEEjPNS6_7HashMapINS6_6RefPtrINS6_10StringImplEEENS_16SymbolTableEntryENS_17IdentifierRepHashENS6_10HashTraitsISD_EENS_26SymbolTableIndexHashTraitsEEEb +__ZN3JSC17BytecodeGeneratorC1EPNS_11ProgramNodeEPNS_14ScopeChainNodeEPN3WTF7HashMapINS5_6RefPtrINS5_10StringImplEEENS_16SymbolTableEntryENS_17IdentifierRepHashENS5_10HashTraitsIS9_EENS_26SymbolTableIndexHashTraitsEEEPNS_16ProgramCodeBlockE +__ZN3JSC17BytecodeGeneratorC2EPNS_11ProgramNodeEPNS_14ScopeChainNodeEPN3WTF7HashMapINS5_6RefPtrINS5_10StringImplEEENS_16SymbolTableEntryENS_17IdentifierRepHashENS5_10HashTraitsIS9_EENS_26SymbolTableIndexHashTraitsEEEPNS_16ProgramCodeBlockE +__ZN3JSC17BytecodeGenerator10emitOpcodeENS_8OpcodeIDE __ZN3WTF6VectorIN3JSC11InstructionELm0EE15reserveCapacityEm -__ZN3JSC9Structure31toCacheableDictionaryTransitionEPS0_ -__ZN3JSC9Structure22toDictionaryTransitionEPS0_NS0_14DictionaryKindE -__ZN3JSC9Structure26flattenDictionaryStructureEPNS_8JSObjectE +__ZN3WTF15SegmentedVectorIN3JSC10RegisterIDELm32EE13ensureSegmentEmm +__ZN3JSC8JSObject12removeDirectERNS_12JSGlobalDataERKNS_10IdentifierE +__ZN3WTF9HashTableINS_6RefPtrINS_10StringImplEEESt4pairIS3_N3JSC16SymbolTableEntryEENS_18PairFirstExtractorIS7_EENS5_17IdentifierRepHashENS_14PairHashTraitsINS_10HashTraitsIS3_EENS5_26SymbolTableIndexHashTraitsEEESD_E13isEmptyBucketERKS7_ +__ZN3WTF9HashTableINS_6RefPtrINS_10StringImplEEESt4pairIS3_N3JSC16SymbolTableEntryEENS_18PairFirstExtractorIS7_EENS5_17IdentifierRepHashENS_14PairHashTraitsINS_10HashTraitsIS3_EENS5_26SymbolTableIndexHashTraitsEEESD_E6expandEv +__ZN3WTF9HashTableINS_6RefPtrINS_10StringImplEEESt4pairIS3_N3JSC16SymbolTableEntryEENS_18PairFirstExtractorIS7_EENS5_17IdentifierRepHashENS_14PairHashTraitsINS_10HashTraitsIS3_EENS5_26SymbolTableIndexHashTraitsEEESD_E6rehashEi +__ZN3WTF9HashTableIPNS_10StringImplES2_NS_17IdentityExtractorIS2_EEN3JSC17IdentifierRepHashENS_10HashTraitsIS2_EES8_E6rehashEi +__ZN3JSC14JSGlobalObject15resizeRegistersEii +__ZN3JSC17BytecodeGenerator12addGlobalVarERKNS_10IdentifierEbRPNS_10RegisterIDE +__ZN3JSC18FunctionExecutableC1EPNS_9ExecStateERKNS_10IdentifierERKNS_10SourceCodeEbPNS_18FunctionParametersEbii +__ZN3JSC10JSFunctionC1EPNS_9ExecStateEPNS_18FunctionExecutableEPNS_14ScopeChainNodeE +__ZN3JSC10JSFunctionC2EPNS_9ExecStateEPNS_18FunctionExecutableEPNS_14ScopeChainNodeE __ZN3JSC17BytecodeGenerator8generateEv __ZN3JSC11ProgramNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC17BytecodeGenerator13emitDebugHookENS_11DebugHookIDEii @@ -349,1787 +627,1589 @@ __ZN3JSC17BytecodeGenerator12newTemporaryEv __ZN3JSC17BytecodeGenerator11newRegisterEv __ZN3JSC17BytecodeGenerator8emitLoadEPNS_10RegisterIDENS_7JSValueE __ZN3JSC17BytecodeGenerator16addConstantValueENS_7JSValueE -__ZN3WTF9HashTableIPvSt4pairIS1_jENS_18PairFirstExtractorIS3_EENS_7PtrHashIS1_EENS_14PairHashTraitsIN3JSC24EncodedJSValueHashTr -__ZN3WTF6VectorIN3JSC8RegisterELm0EE15reserveCapacityEm -__ZN3WTF6VectorIN3JSC8LineInfoELm0EE14expandCapacityEm -__ZN3JSC17ExprStatementNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17AssignResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3WTF9HashTableIPvSt4pairIS1_jENS_18PairFirstExtractorIS3_EENS_7PtrHashIS1_EENS_14PairHashTraitsIN3JSC24EncodedJSValueHashTraitsENS_10HashTraitsIjEEEESA_E6expandEv +__ZN3WTF6VectorIN3JSC12WriteBarrierINS1_7UnknownEEELm0EE14expandCapacityEm +__ZN3JSC12FuncDeclNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC18ConstStatementNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator8emitNodeEPNS_10RegisterIDEPNS_4NodeE +__ZN3JSC13ConstDeclNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC13ConstDeclNode14emitCodeSingleERNS_17BytecodeGeneratorE +__ZN3JSC17BytecodeGenerator16constRegisterForERKNS_10IdentifierE +__ZN3JSC10RegExpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC11regExpFlagsERKNS_7UStringE +__ZN3JSC11RegExpCache14lookupOrCreateERKNS_7UStringENS_11RegExpFlagsE +__ZN3WTF9HashTableIN3JSC9RegExpKeyESt4pairIS2_NS_6RefPtrINS1_6RegExpEEEENS_18PairFirstExtractorIS7_EENS_10RegExpHashIS2_EENS_14PairHashTraitsINS_10HashTraitsIS2_EENSD_IS6_EEEESE_E6rehashEi +__ZN3JSC11RegExpCache6createERKNS_7UStringENS_11RegExpFlagsEN3WTF24HashTableIteratorAdapterINS5_9HashTableINS_9RegExpKeyESt4pairIS8_NS5_6RefPtrINS_6RegExpEEEENS5_18PairFirstExtractorISD_EENS5_10RegExpHashIS8_EENS5_14PairHashTraitsINS5_10HashTraitsIS8_EENSJ_ISC_EEEESK_EESD_EE +__ZN3JSC4Yarr13YarrGenerator12generateTermEm +__ZN3JSC4Yarr13YarrGenerator13readCharacterEiNS_12X86Registers10RegisterIDE +__ZN3JSC4Yarr13YarrGenerator19matchCharacterClassENS_12X86Registers10RegisterIDERNS_22AbstractMacroAssemblerINS_12X86AssemblerEE8JumpListEPKNS0_14CharacterClassE +__ZN3JSC23MacroAssemblerX86Common4moveENS_22AbstractMacroAssemblerINS_12X86AssemblerEE12TrustedImm32ENS_12X86Registers10RegisterIDE +__ZN3JSC4Yarr13YarrGenerator12atEndOfInputEv +__ZN3JSC14MacroAssembler4pokeENS_12X86Registers10RegisterIDEi +__ZN3JSC4Yarr13YarrGenerator19jumpIfCharNotEqualsEti +__ZN3JSC12X86Assembler23X86InstructionFormatter9oneByteOpENS0_15OneByteOpcodeIDEiNS_12X86Registers10RegisterIDES4_ii +__ZN3JSC12X86Assembler7subl_irEiNS_12X86Registers10RegisterIDE +__ZN3JSC4Yarr13YarrGenerator13backtrackTermEm +__ZN3JSC4Yarr13YarrGenerator20backtrackTermDefaultEm +__ZN3JSC4Yarr13YarrGenerator17BacktrackingState6linkToENS_22AbstractMacroAssemblerINS_12X86AssemblerEE5LabelEPNS_14MacroAssemblerE +__ZN3JSC17BytecodeGenerator13emitNewRegExpEPNS_10RegisterIDEN3WTF10PassRefPtrINS_6RegExpEEE +__ZN3JSC17BytecodeGenerator9addRegExpEN3WTF10PassRefPtrINS_6RegExpEEE +__ZN3JSC9CodeBlock25createRareDataIfNecessaryEv +__ZN3WTF16VectorBufferBaseIcE14allocateBufferEm +__ZN3WTF6VectorIcLm128EE15reserveCapacityEm +__ZN3JSC23FunctionCallResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC17BytecodeGenerator11registerForERKNS_10IdentifierE -__ZN3JSC17BytecodeGenerator18findScopedPropertyERKNS_10IdentifierERiRmbRbRPNS_8JSObjectE -__ZN3JSC17BytecodeGenerator15emitResolveBaseEPNS_10RegisterIDERKNS_10IdentifierE -__ZN3JSC19FunctionCallDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC11NewExprNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC11ResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3WTF6VectorIN3JSC19ExpressionRangeInfoELm0EE14expandCapacityEm -__ZN3JSC17BytecodeGenerator11emitResolveEPNS_10RegisterIDERKNS_10IdentifierE -__ZN3WTF6VectorIN3JSC17GlobalResolveInfoELm0EE14expandCapacityEm -__ZN3JSC17BytecodeGenerator11addConstantERKNS_10IdentifierE -__ZN3WTF9HashTableINS_6RefPtrIN7WebCore10StringImplEEESt4pairIS4_iENS_18PairFirstExtractorIS6_EEN3JSC17IdentifierRepHashENS_14P -__ZN3WTF6VectorIN3JSC10IdentifierELm0EE14expandCapacityEmPKS2_ -__ZN3WTF6VectorIN3JSC10IdentifierELm0EE15reserveCapacityEm -__ZN3JSC17BytecodeGenerator13emitConstructEPNS_10RegisterIDES2_PNS_13ArgumentsNodeEjjj -__ZN3WTF6VectorIN3JSC20GetByIdExceptionInfoELm0EE14expandCapacityEm -__ZN3JSC17BytecodeGenerator11emitGetByIdEPNS_10RegisterIDES2_RKNS_10IdentifierE -__ZN3WTF6VectorIN3JSC17StructureStubInfoELm0EE14expandCapacityEm -__ZN3WTF6VectorIN3JSC12CallLinkInfoELm0EE15reserveCapacityEm -__ZN3JSC17BytecodeGenerator15emitMethodCheckEv -__ZN3JSC17BytecodeGenerator8emitCallEPNS_10RegisterIDES2_S2_PNS_13ArgumentsNodeEjjj -__ZN3JSC17BytecodeGenerator8emitCallENS_8OpcodeIDEPNS_10RegisterIDES3_S3_PNS_13ArgumentsNodeEjjj -__ZN3JSC17BytecodeGenerator11emitPutByIdEPNS_10RegisterIDERKNS_10IdentifierES2_ +__ZN3JSC13CallArgumentsC2ERNS_17BytecodeGeneratorEPNS_13ArgumentsNodeE +__ZN3JSC17BytecodeGenerator8emitCallEPNS_10RegisterIDES2_RNS_13CallArgumentsEjjj +__ZN3JSC17BytecodeGenerator8emitCallENS_8OpcodeIDEPNS_10RegisterIDES3_RNS_13CallArgumentsEjjj +__ZN3JSC16ArgumentListNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC10StringNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator8emitLoadEPNS_10RegisterIDERKNS_10IdentifierE +__ZN3WTF9HashTableIPNS_10StringImplESt4pairIS2_PN3JSC8JSStringEENS_18PairFirstExtractorIS7_EENS4_17IdentifierRepHashENS_14PairHashTraitsINS_10HashTraitsIS2_EENSC_IS6_EEEESD_E6rehashEi +__ZN3WTF6VectorIN3JSC12CallLinkInfoELm0EE14expandCapacityEm +__ZN3JSC11ResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator8emitMoveEPNS_10RegisterIDES2_ +__ZN3JSC9ArrayNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator12emitNewArrayEPNS_10RegisterIDEPNS_11ElementNodeE __ZN3JSC17BytecodeGenerator16emitUnaryNoDstOpENS_8OpcodeIDEPNS_10RegisterIDE -__ZN3JSC12JSGlobalData22numericCompareFunctionEPNS_9ExecStateE -__ZNK3JSC21UStringSourceProvider6lengthEv -__ZN3JSC18FunctionExecutable14fromGlobalCodeERKNS_10IdentifierEPNS_9ExecStateEPNS_8DebuggerERKNS_10SourceCodeEPiPNS_7UStringE -__ZNK3JSC21UStringSourceProvider4dataEv -__ZN3JSC16FunctionBodyNode6createEPNS_12JSGlobalDataE -__ZN3JSC5Lexer10sourceCodeEiii -__ZN3JSC16FunctionBodyNode13finishParsingERKNS_10SourceCodeEPNS_13ParameterNodeERKNS_10IdentifierE -__ZN3WTF6VectorIN3JSC10IdentifierELm0EE14expandCapacityEm -__ZN3JSC16FunctionBodyNode13finishParsingEN3WTF10PassRefPtrINS_18FunctionParametersEEERKNS_10IdentifierE -__ZNK3JSC9ScopeNode15singleStatementEv -__ZNK3JSC17ExprStatementNode15isExprStatementEv -__ZNK3JSC12FuncExprNode14isFuncExprNodeEv -__ZThn16_N3JSC11ProgramNodeD0Ev -__ZN3JSC11ProgramNodeD0Ev -__ZN3JSC11ParserArenaD1Ev -__ZN3JSC14SourceElementsD1Ev -__ZThn16_N3JSC16FunctionBodyNodeD0Ev -__ZN3JSC16FunctionBodyNodeD0Ev -__ZN3JSC18FunctionExecutable7compileEPNS_9ExecStateEPNS_14ScopeChainNodeE -__ZN3JSC6Parser5parseINS_16FunctionBodyNodeEEEN3WTF10PassRefPtrIT_EEPNS_12JSGlobalDataEPNS_8DebuggerEPNS_9ExecStateERKNS_10Sour -__ZL11makeSubNodePN3JSC12JSGlobalDataEPNS_14ExpressionNodeES3_b -__ZN3JSC14ExpressionNode14stripUnaryPlusEv -__ZNK3JSC14ExpressionNode8isNumberEv -__ZN3JSC16FunctionBodyNode6createEPNS_12JSGlobalDataEPNS_14SourceElementsEPN3WTF6VectorISt4pairIPKNS_10IdentifierEjELm0EEEPNS6_ -__ZN3JSC17BytecodeGeneratorC1EPNS_16FunctionBodyNodeEPKNS_8DebuggerERKNS_10ScopeChainEPN3WTF7HashMapINS9_6RefPtrIN7WebCore10Str -__ZN3JSC17BytecodeGeneratorC2EPNS_16FunctionBodyNodeEPKNS_8DebuggerERKNS_10ScopeChainEPN3WTF7HashMapINS9_6RefPtrIN7WebCore10Str -__ZN3JSC17BytecodeGenerator12addParameterERKNS_10IdentifierE -__ZN3JSC16FunctionBodyNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC9BlockNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC10ReturnNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC12BinaryOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZNK3JSC11ResolveNode6isPureERNS_17BytecodeGeneratorE -__ZN3JSC17BytecodeGenerator7isLocalERKNS_10IdentifierE -__ZN3JSC17BytecodeGenerator12emitBinaryOpENS_8OpcodeIDEPNS_10RegisterIDES3_S3_NS_12OperandTypesE -__ZN3JSC17BytecodeGenerator10emitReturnEPNS_10RegisterIDE -__ZNK3JSC9BlockNode7isBlockEv -__ZNK3JSC10ReturnNode12isReturnNodeEv __ZN3JSC9CodeBlock11shrinkToFitEv __ZN3WTF6VectorIN3JSC11InstructionELm0EE14shrinkCapacityEm -__ZN3WTF6VectorIPN3JSC12CallLinkInfoELm0EE14shrinkCapacityEm +__ZN3WTF6VectorIN3JSC17StructureStubInfoELm0EE14shrinkCapacityEm __ZN3WTF6VectorIN3JSC10IdentifierELm0EE14shrinkCapacityEm -__ZN3JSC17BytecodeGeneratorD2Ev -__ZN3WTF6VectorIN3JSC11InstructionELm0EEaSERKS3_ -__ZN3JSC18FunctionExecutableD0Ev -__ZN3JSC17FunctionCodeBlockD0Ev -__ZN3JSC9CodeBlockD2Ev -__ZN3JSC21UStringSourceProviderD0Ev -__ZNK3JSC8JSObject8toObjectEPNS_9ExecStateE -__ZN3JSC11Interpreter7executeEPNS_17ProgramExecutableEPNS_9ExecStateEPNS_14ScopeChainNodeEPNS_8JSObjectEPNS_7JSValueE -__ZN3JSC12JSGlobalData14resetDateCacheEv -__ZN3JSC12RegisterFile12globalObjectEv -__ZN3JSC14JSGlobalObject13copyGlobalsToERNS_12RegisterFileE -__ZN3JSC12RegisterFile15setGlobalObjectEPNS_14JSGlobalObjectE -__ZN3JSC17ProgramExecutable15generateJITCodeEPNS_9ExecStateEPNS_14ScopeChainNodeE -__ZN3JSC3JIT14privateCompileEv +__ZN3WTF6VectorIN3JSC12WriteBarrierINS1_18FunctionExecutableEEELm0EE14shrinkCapacityEm +__ZN3WTF6VectorIN3JSC12WriteBarrierINS1_7UnknownEEELm0EE14shrinkCapacityEm +__ZN3WTF6VectorIN3JSC11HandlerInfoELm0EE14shrinkCapacityEm +__ZN3WTF6VectorIN3JSC15SimpleJumpTableELm0EE14shrinkCapacityEm +__ZN3WTF6VectorIN3JSC15StringJumpTableELm0EE14shrinkCapacityEm +__ZN3WTF6VectorIN3JSC8LineInfoELm0EE14shrinkCapacityEm +__ZN3JSC15ParserArenaDataIN3WTF6VectorISt4pairIPKNS_10IdentifierEjELm0EEEED1Ev +__ZN3JSC15ParserArenaDataIN3WTF6VectorIPNS_16FunctionBodyNodeELm0EEEED1Ev +__ZN3JSC14SourceElementsD1Ev +__ZThn16_N3JSC16FunctionBodyNodeD0Ev +__ZN3JSC16FunctionBodyNodeD0Ev +__ZN3JSC3JIT14privateCompileEPNS_21MacroAssemblerCodePtrE __ZN3JSC3JIT22privateCompileMainPassEv __ZN3JSC3JIT13emit_op_enterEPNS_11InstructionE __ZN3JSC3JIT11emit_op_movEPNS_11InstructionE -__ZN3JSC3JIT22emit_op_resolve_globalEPNS_11InstructionEb -__ZN3JSC23MacroAssemblerX86Common4moveENS_12X86Registers10RegisterIDES2_ -__ZN3WTF6VectorIN3JSC13SlowCaseEntryELm0EE14expandCapacityEmPKS2_ -__ZN3WTF6VectorIN3JSC13SlowCaseEntryELm0EE14expandCapacityEm -__ZN3JSC3JIT17emit_op_get_by_idEPNS_11InstructionE -__ZN3JSC3JIT21compileGetByIdHotPathEiiPNS_10IdentifierEj -__ZN3JSC3JIT17emit_op_constructEPNS_11InstructionE -__ZN3JSC3JIT13compileOpCallENS_8OpcodeIDEPNS_11InstructionEj -__ZN3JSC11JITStubCall4callEv -__ZN3WTF6VectorIN3JSC10CallRecordELm0EE14expandCapacityEm -__ZN3JSC3JIT24emit_op_construct_verifyEPNS_11InstructionE -__ZN3JSC3JIT20emit_op_method_checkEPNS_11InstructionE -__ZN3WTF6VectorIN3JSC25MethodCallCompilationInfoELm0EE14expandCapacityEm +__ZN3JSC3JIT18emit_op_new_regexpEPNS_11InstructionE +__ZN3JSC11JITStubCall4callEj +__ZN3WTF6VectorIN3JSC10CallRecordELm0EE15reserveCapacityEm __ZN3JSC3JIT12emit_op_callEPNS_11InstructionE -__ZN3JSC3JIT17emit_op_put_by_idEPNS_11InstructionE +__ZN3JSC3JIT13compileOpCallENS_8OpcodeIDEPNS_11InstructionEj +__ZN3WTF6VectorIN3JSC13SlowCaseEntryELm0EE14expandCapacityEm +__ZN3JSC3JIT23emit_op_call_put_resultEPNS_11InstructionE +__ZN3JSC3JIT17emit_op_new_arrayEPNS_11InstructionE __ZN3JSC3JIT11emit_op_endEPNS_11InstructionE -__ZN3WTF6VectorIN3JSC9JumpTableELm0EE14shrinkCapacityEm +__ZN3JSC3JIT22privateCompileLinkPassEv __ZN3JSC3JIT23privateCompileSlowCasesEv -__ZN3JSC3JIT26emitSlow_op_resolve_globalEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC20MacroAssemblerX86_648storePtrENS_22AbstractMacroAssemblerINS_12X86AssemblerEE6ImmPtrENS3_15ImplicitAddressE -__ZN3JSC11JITStubCall4callEj -__ZN3JSC3JIT21emitSlow_op_get_by_idEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC3JIT22compileGetByIdSlowCaseEiiPNS_10IdentifierERPNS_13SlowCaseEntryEb -__ZN3JSC3JIT21emitSlow_op_constructEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC3JIT21compileOpCallSlowCaseEPNS_11InstructionERPNS_13SlowCaseEntryEjNS_8OpcodeIDE -__ZN3JSC3JIT27compileOpConstructSetupArgsEPNS_11InstructionE -__ZN3JSC3JIT28emitSlow_op_construct_verifyEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC3JIT24emitSlow_op_method_checkEPNS_11InstructionERPNS_13SlowCaseEntryE __ZN3JSC3JIT16emitSlow_op_callEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC3JIT22compileOpCallSetupArgsEPNS_11InstructionE -__ZN3JSC3JIT21emitSlow_op_put_by_idEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3WTF6VectorIN3JSC18MethodCallLinkInfoELm0EE14expandCapacityEm +__ZN3JSC3JIT21compileOpCallSlowCaseEPNS_11InstructionERPNS_13SlowCaseEntryEjNS_8OpcodeIDE +__ZN3WTF6VectorIN3JSC18MethodCallLinkInfoELm0EE4growEm __ZN3JSC17BytecodeGenerator18dumpsGeneratedCodeEv +__ZN3JSC4Heap29reportExtraMemoryCostSlowCaseEm +__ZN3JSC17BytecodeGeneratorD2Ev +__ZThn16_N3JSC11ProgramNodeD0Ev +__ZN3JSC11ProgramNodeD0Ev +__ZN3JSC12RegisterFile12globalObjectEv +__ZN3JSC14JSGlobalObject13copyGlobalsToERNS_12RegisterFileE +__ZN3JSC12RegisterFile15setGlobalObjectEPNS_14JSGlobalObjectE _ctiTrampoline -_cti_op_resolve_global -_cti_op_get_by_id -__ZNK3JSC7JSValue3getEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -_cti_op_construct_NotJSConstruct -__ZN3JSC15DateConstructor16getConstructDataERNS_13ConstructDataE -__ZN3JSCL28constructWithDateConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE -__ZN3JSC13constructDateEPNS_9ExecStateERKNS_7ArgListE -__ZN3JSC12DateInstanceC1EPNS_9ExecStateEd -__ZN3JSC12DateInstanceC2EPNS_9ExecStateEd -__ZN3WTF8timeClipEd +_cti_op_new_regexp +__ZN3JSC12RegExpObjectC1EPNS_14JSGlobalObjectEPNS_9StructureEN3WTF17NonNullPassRefPtrINS_6RegExpEEE +_cti_vm_lazyLinkCall +__ZN3JSC18FunctionExecutable22compileForCallInternalEPNS_9ExecStateEPNS_14ScopeChainNodeE +__ZN3JSC6Parser5parseINS_16FunctionBodyNodeEEEN3WTF10PassRefPtrIT_EEPNS_14JSGlobalObjectEPNS_8DebuggerEPNS_9ExecStateERKNS_10SourceCodeEPNS_18FunctionParametersENS_18JSParserStrictnessEPPNS_8JSObjectE +__ZN3JSC8JSParser19parseSourceElementsILNS0_18SourceElementsModeE1ENS_10ASTBuilderEEENT0_14SourceElementsERS4_ +__ZN3JSC8JSParser20parseReturnStatementINS_10ASTBuilderEEENT_9StatementERS3_ +__ZN3JSC8JSParser15parseExpressionINS_10ASTBuilderEEENT_10ExpressionERS3_ +__ZNK3JSC15DotAccessorNode10isLocationEv +__ZNK3JSC14ExpressionNode13isResolveNodeEv +__ZNK3JSC14ExpressionNode21isBracketAccessorNodeEv +__ZN3JSC16FunctionBodyNode6createEPNS_12JSGlobalDataEPNS_14SourceElementsEPN3WTF6VectorISt4pairIPKNS_10IdentifierEjELm0EEEPNS6_IPS0_Lm0EEERNS5_7HashSetINS5_6RefPtrINS5_10StringImplEEENS_17IdentifierRepHashENS5_10HashTraitsISK_EEEERKNS_10SourceCodeEji +__ZN3JSC17BytecodeGeneratorC1EPNS_16FunctionBodyNodeEPNS_14ScopeChainNodeEPN3WTF7HashMapINS5_6RefPtrINS5_10StringImplEEENS_16SymbolTableEntryENS_17IdentifierRepHashENS5_10HashTraitsIS9_EENS_26SymbolTableIndexHashTraitsEEEPNS_9CodeBlockE +__ZN3JSC17BytecodeGeneratorC2EPNS_16FunctionBodyNodeEPNS_14ScopeChainNodeEPN3WTF7HashMapINS5_6RefPtrINS5_10StringImplEEENS_16SymbolTableEntryENS_17IdentifierRepHashENS5_10HashTraitsIS9_EENS_26SymbolTableIndexHashTraitsEEEPNS_9CodeBlockE +__ZN3WTF15SegmentedVectorIN3JSC10RegisterIDELm32EEC1Ev +__ZN3WTF6VectorIN3JSC11InstructionELm0EE14expandCapacityEm +__ZN3JSC17BytecodeGenerator12addParameterERKNS_10IdentifierEi +__ZN3JSC16FunctionBodyNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC9BlockNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC10ReturnNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC19FunctionCallDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator11emitResolveEPNS_10RegisterIDERKNS_10IdentifierE +__ZN3JSC17BytecodeGenerator18findScopedPropertyERKNS_10IdentifierERiRmbRbRPNS_8JSObjectE +__ZNK3JSC16JSVariableObject16isVariableObjectEv +__ZN3JSC17BytecodeGenerator16emitGetScopedVarEPNS_10RegisterIDEmiNS_7JSValueE +__ZN3JSC17BytecodeGenerator15emitMethodCheckEv +__ZN3JSC17BytecodeGenerator11emitGetByIdEPNS_10RegisterIDES2_RKNS_10IdentifierE +__ZN3WTF6VectorIN3JSC17StructureStubInfoELm0EE14expandCapacityEm +__ZN3JSC17BytecodeGenerator11addConstantERKNS_10IdentifierE +__ZN3WTF6VectorIN3JSC10IdentifierELm0EE14expandCapacityEmPKS2_ +__ZN3WTF6VectorIN3JSC10IdentifierELm0EE15reserveCapacityEm +__ZN3JSC17BytecodeGenerator10emitReturnEPNS_10RegisterIDE +__ZNK3JSC9ScopeNode15singleStatementEv +__ZNK3JSC9BlockNode7isBlockEv +__ZNK3JSC10ReturnNode12isReturnNodeEv +__ZNK3JSC14SourceElements15singleStatementEv +__ZNK3JSC14ExpressionNode10isSubtractEv +__ZN3JSC3JIT22emit_op_get_global_varEPNS_11InstructionE +__ZN3JSC3JIT20emit_op_method_checkEPNS_11InstructionE +__ZN3WTF6VectorIN3JSC25MethodCallCompilationInfoELm0EE14expandCapacityEm +__ZN3JSC3JIT21compileGetByIdHotPathEiiPNS_10IdentifierEj +__ZN3WTF6VectorIN3JSC13SlowCaseEntryELm0EE14expandCapacityEmPKS2_ +__ZN3WTF6VectorIN3JSC10CallRecordELm0EE14expandCapacityEmPKS2_ +__ZN3JSC3JIT11emit_op_retEPNS_11InstructionE +__ZN3JSC3JIT24emitSlow_op_method_checkEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT22compileGetByIdSlowCaseEiiPNS_10IdentifierERPNS_13SlowCaseEntryEb +__ZN3JSC11JITStubCall4callEv +_cti_register_file_check _cti_op_get_by_id_method_check -__ZN3JSC13DatePrototype18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZNK3JSC7JSValue3getEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE __ZN3JSC23setUpStaticFunctionSlotEPNS_9ExecStateEPKNS_9HashEntryEPNS_8JSObjectERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC9Structure13hasTransitionEPN7WebCore10StringImplEj -_cti_vm_lazyLinkCall -__ZN3JSCL20dateProtoFuncGetTimeEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK3JSC12DateInstance9classInfoEv -_cti_op_put_by_id -__ZN3JSC14JSGlobalObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE -__ZN3JSC8JSObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE -__ZN3JSC17ProgramExecutableD0Ev -__ZN3JSC16ProgramCodeBlockD0Ev -__ZN3WTF9HashTableIPN3JSC15GlobalCodeBlockES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E4findIS3_NS +__ZNK3WTF12AtomicString5lowerEv +__ZNK3JSC8JSObject24getPropertySpecificValueEPNS_9ExecStateERKNS_10IdentifierERPNS_6JSCellE +__ZN3JSC27ctiPatchCallByReturnAddressEPNS_9CodeBlockENS_16ReturnAddressPtrENS_11FunctionPtrE +__ZN3JSC3JIT8linkCallEPNS_10JSFunctionEPNS_9CodeBlockES4_NS_21MacroAssemblerCodePtrEPNS_12CallLinkInfoEiPNS_12JSGlobalDataE +_cti_op_get_by_id +_cti_op_new_array +__ZN3JSC7JSArrayC1ERNS_12JSGlobalDataEPNS_9StructureERKNS_7ArgListE +__ZN3JSC18FunctionExecutable11discardCodeEv +__ZN3JSC17FunctionCodeBlockD0Ev +__ZN3JSC9CodeBlockD2Ev __ZN3JSC17StructureStubInfo5derefEv -__ZN7WebCore6String8truncateEj -__ZN3JSC5Lexer10skipRegExpEv -__ZNK3JSC14ExpressionNode10isLocationEv -__ZN3WTF6VectorIPN3JSC16FunctionBodyNodeELm0EE14expandCapacityEm -__ZNK3JSC18EmptyStatementNode16isEmptyStatementEv -__ZN3WTF6VectorISt4pairIPKN3JSC10IdentifierEjELm0EE14expandCapacityEm -__ZN3JSC8JSObject12removeDirectERKNS_10IdentifierE -__ZN3JSC9Structure24removePropertyTransitionEPS0_RKNS_10IdentifierERm -__ZN3JSC9Structure6removeERKNS_10IdentifierE -__ZN3JSC17BytecodeGenerator12addGlobalVarERKNS_10IdentifierEbRPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator15emitNewFunctionEPNS_10RegisterIDEPNS_16FunctionBodyNodeE -__ZN3WTF6VectorINS_6RefPtrIN3JSC18FunctionExecutableEEELm0EE14expandCapacityEm -__ZN3JSC9Structure31removePropertyWithoutTransitionERKNS_10IdentifierE -__ZNK3JSC8JSObject11hasPropertyEPNS_9ExecStateERKNS_10IdentifierE -__ZNK3JSC7UString14toStrictUInt32EPb -__ZN7WebCore12AtomicString4findEPKtjj -__ZN3WTF9HashTableINS_6RefPtrIN7WebCore10StringImplEEESt4pairIS4_N3JSC16SymbolTableEntryEENS_18PairFirstExtractorIS8_EENS6_17Id -__ZN3JSCL30comparePropertyMapEntryIndicesEPKvS1_ +__ZN3JSC8JSObject13visitChildrenERNS_9MarkStackE +__ZN3JSC14JSGlobalObject13visitChildrenERNS_9MarkStackE +__ZN3JSC9MarkStack14MarkStackArrayIPNS_6JSCellEE6appendERKS3_ +__ZN3JSC10JSFunction13visitChildrenERNS_9MarkStackE +__ZN3JSC12RegExpObject13visitChildrenERNS_9MarkStackE +__ZN3JSC15JSWrapperObject13visitChildrenERNS_9MarkStackE +__ZN3JSC7JSArray13visitChildrenERNS_9MarkStackE +__ZN3JSC22NativeErrorConstructor13visitChildrenERNS_9MarkStackE +__ZN3JSC14ScopeChainNode13visitChildrenERNS_9MarkStackE +__ZN3JSC16JSCallbackObjectINS_24JSObjectWithGlobalObjectEE13visitChildrenERNS_9MarkStackE +__ZN3JSC18FunctionExecutable13visitChildrenERNS_9MarkStackE +__ZN3JSC17ProgramExecutableD1Ev +__ZN3JSC16ProgramCodeBlockD0Ev +__ZN3JSC8JSParser31parseExpressionOrLabelStatementINS_10ASTBuilderEEENT_9StatementERS3_ +__ZN3JSC8JSParser17parseFunctionInfoILNS0_20FunctionRequirementsE0ELb0ENS_10ASTBuilderEEEbRT1_RPKNS_10IdentifierERNS4_19FormalParameterListERNS4_12FunctionBodyERiSE_SE_ +__ZN3JSC10ASTBuilder14makeAssignNodeEPNS_14ExpressionNodeENS_8OperatorES2_bbiii +__ZN3JSC8JSParser19parseBreakStatementINS_13SyntaxCheckerEEENT_9StatementERS3_ +__ZN3JSC17ExprStatementNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC13AssignDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZNK3JSC14ExpressionNode6isPureERNS_17BytecodeGeneratorE -__ZN3JSC17BytecodeGenerator8emitMoveEPNS_10RegisterIDES2_ -__ZN3JSC17ObjectLiteralNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator13emitNewObjectEPNS_10RegisterIDE -__ZN3JSC21FunctionCallValueNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC15DotAccessorNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC12FuncExprNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC17BytecodeGenerator25emitNewFunctionExpressionEPNS_10RegisterIDEPNS_12FuncExprNodeE -__ZN3JSC12FuncDeclNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC15DotAccessorNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC16VarStatementNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator15isLocalConstantERKNS_10IdentifierE -__ZN3JSC16ArgumentListNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC11BooleanNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator8emitLoadEPNS_10RegisterIDEb -__ZN3JSC9ArrayNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator12emitNewArrayEPNS_10RegisterIDEPNS_11ElementNodeE -__ZN3JSC23FunctionCallResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator19emitResolveWithBaseEPNS_10RegisterIDES2_RKNS_10IdentifierE -__ZN3JSC10NumberNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator8emitLoadEPNS_10RegisterIDEd -__ZN3WTF9HashTableIdSt4pairIdN3JSC7JSValueEENS_18PairFirstExtractorIS4_EENS_9FloatHashIdEENS_14PairHashTraitsINS_10HashTraitsId -__ZN3JSC10StringNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator8emitLoadEPNS_10RegisterIDERKNS_10IdentifierE -__ZN3WTF9HashTableIPN7WebCore10StringImplESt4pairIS3_PN3JSC8JSStringEENS_18PairFirstExtractorIS8_EENS5_17IdentifierRepHashENS_1 -__ZN3JSC12SmallStrings27createSingleCharacterStringEPNS_12JSGlobalDataEh -__ZN3JSC8NullNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC15ParserArenaDataIN3WTF6VectorIPNS_16FunctionBodyNodeELm0EEEED1Ev -__ZN3JSC15ParserArenaDataIN3WTF6VectorISt4pairIPKNS_10IdentifierEjELm0EEEED1Ev -__ZN3JSC3JIT16emit_op_new_funcEPNS_11InstructionE -__ZN3JSC3JIT18emit_op_new_objectEPNS_11InstructionE +__ZN3JSC18FunctionExecutableC1EPNS_12JSGlobalDataERKNS_10IdentifierERKNS_10SourceCodeEbPNS_18FunctionParametersEbii +__ZN3WTF6VectorIN3JSC12WriteBarrierINS1_18FunctionExecutableEEELm0EE14expandCapacityEm +__ZN3JSC17BytecodeGenerator11emitPutByIdEPNS_10RegisterIDERKNS_10IdentifierES2_ +__ZN3JSC3JIT17emit_op_get_by_idEPNS_11InstructionE __ZN3JSC3JIT20emit_op_new_func_expEPNS_11InstructionE -__ZN3JSC3JIT17emit_op_new_arrayEPNS_11InstructionE -__ZN3JSC3JIT25emit_op_resolve_with_baseEPNS_11InstructionE -_cti_op_new_func -__ZN3JSC10JSFunctionC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_18FunctionExecutableEEEPNS_14ScopeChainNodeE -_cti_op_new_object -_cti_op_new_func_exp -_cti_op_call_JSFunction -__ZN3JSC18FunctionExecutable15generateJITCodeEPNS_9ExecStateEPNS_14ScopeChainNodeE -__ZN3WTF7HashSetINS_6RefPtrIN7WebCore10StringImplEEEN3JSC17IdentifierRepHashENS_10HashTraitsIS4_EEE3addERKS4_ -__ZN3WTF9HashTableINS_6RefPtrIN7WebCore10StringImplEEES4_NS_17IdentityExtractorIS4_EEN3JSC17IdentifierRepHashENS_10HashTraitsIS -__ZN3JSC17BytecodeGenerator6addVarERKNS_10IdentifierEbRPNS_10RegisterIDE -__ZNK3JSC16JSVariableObject16isVariableObjectEv -__ZN3JSC17BytecodeGenerator16emitGetScopedVarEPNS_10RegisterIDEmiNS_7JSValueE -__ZNK3JSC13StatementNode12isReturnNodeEv -__ZN3JSC3JIT29emit_op_enter_with_activationEPNS_11InstructionE -__ZN3JSC3JIT22emit_op_get_global_varEPNS_11InstructionE -__ZN3JSC3JIT29emitGetVariableObjectRegisterENS_12X86Registers10RegisterIDEiS2_ -__ZN3JSC3JIT27emit_op_tear_off_activationEPNS_11InstructionE -__ZN3JSC11JITStubCall11addArgumentEjNS_12X86Registers10RegisterIDE -__ZN3JSC3JIT11emit_op_retEPNS_11InstructionE -_cti_register_file_check -_cti_op_push_activation -__ZN3JSC12JSActivationC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_18FunctionExecutableEEE -__ZN3JSC12JSActivationC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_18FunctionExecutableEEE -_cti_op_tear_off_activation -_cti_op_ret_scopeChain +__ZN3JSC20MacroAssemblerX86_648storePtrENS_22AbstractMacroAssemblerINS_12X86AssemblerEE13TrustedImmPtrENS3_15ImplicitAddressE +__ZN3JSC3JIT17emit_op_put_by_idEPNS_11InstructionE +__ZN3JSC3JIT21emitSlow_op_get_by_idEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT21emitSlow_op_put_by_idEPNS_11InstructionERPNS_13SlowCaseEntryE __ZN3JSC10JSFunction18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC9Structure18transitionTableAddERKSt4pairIN3WTF6RefPtrIN7WebCore10StringImplEEEjEPS0_PNS_6JSCellE -__ZN3WTF7HashMapISt4pairINS_6RefPtrIN7WebCore10StringImplEEEjES1_IPN3JSC9StructureES9_ENS7_28StructureTransitionTableHashENS7_3 -__ZN3WTF9HashTableISt4pairINS_6RefPtrIN7WebCore10StringImplEEEjES1_IS6_S1_IPN3JSC9StructureES9_EENS_18PairFirstExtractorISB_EEN -_cti_op_new_array -__ZN3JSC7JSArrayC1EN3WTF17NonNullPassRefPtrINS_9StructureEEERKNS_7ArgListE -_cti_op_construct_JSConstruct -__ZNK3JSC10NumberNode6isPureERNS_17BytecodeGeneratorE -__ZN3JSC8ThisNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC3JIT20emit_op_convert_thisEPNS_11InstructionE -__ZN3JSC3JIT24emitSlow_op_convert_thisEPNS_11InstructionERPNS_13SlowCaseEntryE -_cti_op_resolve_with_base -__ZN3JSC10JSFunction11getCallDataERNS_8CallDataE -__ZNK3JSC7ArgList8getSliceEiRS0_ -__ZN3JSC9Structure22materializePropertyMapEv -_cti_op_end -__ZNK7WebCore6String7toFloatEPb -__ZN7WebCore10StringImpl7toFloatEPb -__ZN7WebCore17charactersToFloatEPKtmPb -__ZN7WebCoreeqERKNS_12AtomicStringEPKc -__ZNK7WebCore6String5toIntEPb -__ZN7WebCore10StringImpl5toIntEPb -__ZN7WebCore15charactersToIntEPKtmPb -__ZN7WebCore6String6numberEi -__ZNK7WebCore6String11toIntStrictEPbi -__ZN7WebCore10StringImpl11toIntStrictEPbi -__ZN7WebCore21charactersToIntStrictEPKtmPbi -__ZN7WebCore10StringImpl7replaceEPS0_S1_ -__ZN7WebCore6String6numberEt -__ZL11makeDivNodePN3JSC12JSGlobalDataEPNS_14ExpressionNodeES3_b -__ZNK3JSC10NumberNode8isNumberEv +__ZN3JSC9Structure22materializePropertyMapERNS_12JSGlobalDataE +__ZN3WTF9HashTableISt4pairINS_6RefPtrINS_10StringImplEEEjES1_IS5_PN3JSC7JSValueEENS_18PairFirstExtractorIS9_EENS6_24StructureTransitionTable4HashENS_14PairHashTraitsINSC_10HashTraitsENS_10HashTraitsIS8_EEEESF_E6rehashEi +_cti_op_new_func_exp +_cti_op_put_by_id +__ZN3JSC8JSParser20parseSwitchStatementINS_13SyntaxCheckerEEENT_9StatementERS3_ +__ZN3JSC8JSParser18parseSwitchClausesINS_13SyntaxCheckerEEENT_10ClauseListERS3_ __ZN3WTF6VectorIPvLm0EE14expandCapacityEm -__ZN3WTF6VectorIjLm16EE6resizeEm -__ZN3WTFL7multaddERNS_6BigIntEii -__ZN3WTF6VectorIjLm16EEaSERKS1_ -__ZN3WTFL4multERNS_6BigIntERKS0_ -__ZL11makeAddNodePN3JSC12JSGlobalDataEPNS_14ExpressionNodeES3_b -__ZN3WTF6VectorIPNS0_IN3JSC10IdentifierELm64EEELm32EE15reserveCapacityEm -__ZL14makePrefixNodePN3JSC12JSGlobalDataEPNS_14ExpressionNodeENS_8OperatorEiii -__ZN3WTF6VectorIPN3JSC10RegisterIDELm32EE15reserveCapacityEm +__ZN3JSC8JSParser17parseForStatementINS_10ASTBuilderEEENT_9StatementERS3_ +__ZN3JSC8JSParser19parseVarDeclarationINS_10ASTBuilderEEENT_9StatementERS3_ +__ZN3JSC8JSParser21parseDoWhileStatementINS_10ASTBuilderEEENT_9StatementERS3_ +__ZNK3JSC19BracketAccessorNode10isLocationEv +__ZNK3JSC19BracketAccessorNode21isBracketAccessorNodeEv +__ZN3JSC10ASTBuilder14makeBinaryNodeEiSt4pairIPNS_14ExpressionNodeENS0_12BinaryOpInfoEES5_ +__ZN3JSC17ObjectLiteralNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC16PropertyListNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC15ConditionalNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator13emitNewObjectEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator17emitDirectPutByIdEPNS_10RegisterIDERKNS_10IdentifierES2_ +__ZN3WTF9HashTableINS_6RefPtrINS_10StringImplEEESt4pairIS3_iENS_18PairFirstExtractorIS5_EEN3JSC17IdentifierRepHashENS_14PairHashTraitsINS_10HashTraitsIS3_EENS8_17BytecodeGenerator28IdentifierMapIndexHashTraitsEEESC_E4findIS3_NS_22IdentityHashTranslatorIS3_S5_S9_EEEENS_17HashTableIteratorIS3_S5_S7_S9_SF_SC_EERKT_ +__ZN3WTF9HashTableINS_6RefPtrINS_10StringImplEEESt4pairIS3_iENS_18PairFirstExtractorIS5_EEN3JSC17IdentifierRepHashENS_14PairHashTraitsINS_10HashTraitsIS3_EENS8_17BytecodeGenerator28IdentifierMapIndexHashTraitsEEESC_E6rehashEi +__ZN3JSC9ForInNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator13newLabelScopeENS_10LabelScope4TypeEPKNS_10IdentifierE __ZN3JSC17BytecodeGenerator8newLabelEv -__ZNK3JSC14ExpressionNode26hasConditionContextCodegenEv -__ZN3JSC17BytecodeGenerator15emitJumpIfFalseEPNS_10RegisterIDEPNS_5LabelE +__ZN3JSC17BytecodeGenerator20emitGetPropertyNamesEPNS_10RegisterIDES2_S2_S2_PNS_5LabelE __ZN3JSC17BytecodeGenerator8emitJumpEPNS_5LabelE __ZN3JSC17BytecodeGenerator9emitLabelEPNS_5LabelE -__ZN3WTF6VectorIjLm0EE14expandCapacityEm -__ZN3JSC17BytecodeGenerator14emitPutByIndexEPNS_10RegisterIDEjS2_ -__ZN3JSC6IfNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZNK3JSC14LogicalNotNode26hasConditionContextCodegenEv -__ZN3JSC11UnaryOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator11emitUnaryOpENS_8OpcodeIDEPNS_10RegisterIDES3_ -__ZNK3JSC10StringNode6isPureERNS_17BytecodeGeneratorE -__ZNK3JSC14ExpressionNode5isAddEv -__ZN3JSC7ForNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator13newLabelScopeENS_10LabelScope4TypeEPKNS_10IdentifierE +__ZN3WTF6VectorIjLm0EE15reserveCapacityEm +__ZN3WTF6VectorIN3JSC12ForInContextELm0EE14expandCapacityEm +__ZN3JSC16VarStatementNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17AssignResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator15isLocalConstantERKNS_10IdentifierE +__ZN3WTF6VectorIN3JSC17GlobalResolveInfoELm0EE14expandCapacityEm +__ZN3JSC11DoWhileNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17AssignBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZNK3JSC11ResolveNode6isPureERNS_17BytecodeGeneratorE +__ZN3JSC17BytecodeGenerator7isLocalERKNS_10IdentifierE +__ZN3JSC8ThisNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC19BracketAccessorNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator22willResolveToArgumentsERKNS_10IdentifierE __ZN3JSC17BytecodeGenerator12emitGetByValEPNS_10RegisterIDES2_S2_ -__ZN3JSC17PrefixResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator10emitPreIncEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator12emitPutByValEPNS_10RegisterIDES2_S2_ +__ZNK3JSC14ExpressionNode26hasConditionContextCodegenEv +__ZN3JSC15StrictEqualNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator14emitEqualityOpENS_8OpcodeIDEPNS_10RegisterIDES3_S3_ __ZN3JSC17BytecodeGenerator14emitJumpIfTrueEPNS_10RegisterIDEPNS_5LabelE -__ZN3JSC3JIT11emit_op_divEPNS_11InstructionE -__ZN3JSC20MacroAssemblerX86_649branchPtrENS_23MacroAssemblerX86Common9ConditionENS_12X86Registers10RegisterIDES4_ -__ZN3JSC12X86Assembler11cvtsi2sd_rrENS_12X86Registers10RegisterIDENS1_13XMMRegisterIDE -__ZN3JSC12X86Assembler23X86InstructionFormatter9twoByteOpENS0_15TwoByteOpcodeIDEiNS_12X86Registers10RegisterIDE -__ZN3JSC12X86Assembler7movq_rrENS_12X86Registers10RegisterIDENS1_13XMMRegisterIDE -__ZN3JSC23MacroAssemblerX86Common4moveENS_22AbstractMacroAssemblerINS_12X86AssemblerEE5Imm32ENS_12X86Registers10RegisterIDE -__ZN3JSC15AssemblerBuffer7putByteEi -__ZN3JSC3JIT14emit_op_jfalseEPNS_11InstructionE -__ZN3JSC20MacroAssemblerX86_649branchPtrENS_23MacroAssemblerX86Common9ConditionENS_12X86Registers10RegisterIDENS_22AbstractMacr +__ZN3JSC17BytecodeGenerator20emitNextPropertyNameEPNS_10RegisterIDES2_S2_S2_S2_PNS_5LabelE +__ZN3JSC3JIT18emit_op_new_objectEPNS_11InstructionE +__ZN3JSC3JIT18emit_op_get_pnamesEPNS_11InstructionE __ZN3WTF6VectorIN3JSC9JumpTableELm0EE14expandCapacityEmPKS2_ __ZN3WTF6VectorIN3JSC9JumpTableELm0EE14expandCapacityEm __ZN3JSC3JIT11emit_op_jmpEPNS_11InstructionE -__ZN3JSC3JIT20emit_op_put_by_indexEPNS_11InstructionE -__ZN3JSC3JIT13emit_op_jtrueEPNS_11InstructionE -__ZN3JSC3JIT11emit_op_addEPNS_11InstructionE -__ZN3JSC3JIT18emit_op_get_by_valEPNS_11InstructionE -__ZN3JSC20MacroAssemblerX86_649branchPtrENS_23MacroAssemblerX86Common9ConditionENS_22AbstractMacroAssemblerINS_12X86AssemblerEE -__ZN3JSC12X86Assembler23X86InstructionFormatter11oneByteOp64ENS0_15OneByteOpcodeIDEiNS_12X86Registers10RegisterIDES4_ii -__ZN3JSC3JIT15emit_op_pre_incEPNS_11InstructionE +__ZN3JSC3JIT22emit_op_resolve_globalEPNS_11InstructionEb +__ZN3JSC3JIT20emit_op_get_by_pnameEPNS_11InstructionE +__ZN3JSC12X86Assembler23X86InstructionFormatter11oneByteOp64ENS0_15OneByteOpcodeIDEiNS_12X86Registers10RegisterIDES4_ii +__ZN3JSC3JIT18emit_op_get_by_valEPNS_11InstructionE +__ZN3JSC20MacroAssemblerX86_649branchPtrENS_23MacroAssemblerX86Common19RelationalConditionENS_22AbstractMacroAssemblerINS_12X86AssemblerEE7AddressENS5_13TrustedImmPtrE +__ZN3JSC3JIT18emit_op_put_by_valEPNS_11InstructionE +__ZN3JSC3JIT16emit_op_stricteqEPNS_11InstructionE +__ZN3JSC3JIT17compileOpStrictEqEPNS_11InstructionENS0_21CompileOpStrictEqTypeE +__ZN3JSC12X86Assembler6orl_irEiNS_12X86Registers10RegisterIDE __ZN3JSC3JIT16emitTimeoutCheckEv -__ZN3JSC3JIT13emit_op_jlessEPNS_11InstructionE -__ZN3JSC3JIT15emitSlow_op_divEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC3JIT18emitSlow_op_jfalseEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC23MacroAssemblerX86Common12branchTest32ENS0_9ConditionENS_12X86Registers10RegisterIDENS_22AbstractMacroAssemblerINS_12X -__ZN3JSC3JIT17emitSlow_op_jtrueEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT13emit_op_jtrueEPNS_11InstructionE +__ZN3JSC20MacroAssemblerX86_649branchPtrENS_23MacroAssemblerX86Common19RelationalConditionENS_12X86Registers10RegisterIDES4_ +__ZN3JSC3JIT18emit_op_next_pnameEPNS_11InstructionE +__ZN3JSC20MacroAssemblerX86_6413branchTestPtrENS_23MacroAssemblerX86Common15ResultConditionENS_22AbstractMacroAssemblerINS_12X86AssemblerEE7AddressENS5_12TrustedImm32E +__ZN3JSC23MacroAssemblerX86Common12branchTest32ENS0_15ResultConditionENS_12X86Registers10RegisterIDENS_22AbstractMacroAssemblerINS_12X86AssemblerEE12TrustedImm32E +__ZN3JSC3JIT26emitSlow_op_resolve_globalEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT24emitSlow_op_get_by_pnameEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC11JITStubCall11addArgumentEjNS_12X86Registers10RegisterIDE __ZN3JSC3JIT22emitSlow_op_get_by_valEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC9JITThunks7ctiStubEPNS_12JSGlobalDataEPFNS_21MacroAssemblerCodePtrES2_PNS_14ExecutablePoolEE +__ZN3WTF9HashTableIPFN3JSC21MacroAssemblerCodePtrEPNS1_12JSGlobalDataEPNS1_14ExecutablePoolEESt4pairIS8_S2_ENS_18PairFirstExtractorISA_EENS_7PtrHashIS8_EENS_14PairHashTraitsINS_10HashTraitsIS8_EENSG_IS2_EEEESH_E6expandEv __ZN3JSC3JIT27stringGetByValStubGeneratorEPNS_12JSGlobalDataEPNS_14ExecutablePoolE -__ZN3JSC15AssemblerBuffer14executableCopyEPNS_14ExecutablePoolE -__ZN3JSC3JIT19emitSlow_op_pre_incEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC11JITStubCall11addArgumentENS_12X86Registers10RegisterIDE -__ZN3JSC3JIT17emitSlow_op_jlessEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC23MacroAssemblerX86Common12branchDoubleENS0_15DoubleConditionENS_12X86Registers13XMMRegisterIDES3_ -__ZNK3JSC13LogicalOpNode26hasConditionContextCodegenEv -__ZN3JSC13LogicalOpNode30emitBytecodeInConditionContextERNS_17BytecodeGeneratorEPNS_5LabelES4_b -__ZN3JSC21ReadModifyResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC3JIT11emit_op_subEPNS_11InstructionE -__ZN3JSC3JIT20compileBinaryArithOpENS_8OpcodeIDEjjjNS_12OperandTypesE -__ZN3JSC3JIT15emitSlow_op_subEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC3JIT28compileBinaryArithOpSlowCaseENS_8OpcodeIDERPNS_13SlowCaseEntryEjjjNS_12OperandTypesEbb -__ZN3JSC3JIT15emitSlow_op_addEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZNK3JSC14JSGlobalObject14isDynamicScopeERb -_cti_op_jtrue -__ZNK3JSC8JSObject9toBooleanEPNS_9ExecStateE -__ZNK3JSC8JSObject24getPropertySpecificValueEPNS_9ExecStateERKNS_10IdentifierERPNS_6JSCellE -__ZN3JSC27ctiPatchCallByReturnAddressEPNS_9CodeBlockENS_16ReturnAddressPtrENS_11FunctionPtrE -__ZN3JSC3JIT8linkCallEPNS_10JSFunctionEPNS_9CodeBlockES4_RNS_7JITCodeEPNS_12CallLinkInfoEiPNS_12JSGlobalDataE -_cti_op_add -__ZN3JSC13jsAddSlowCaseEPNS_9ExecStateENS_7JSValueES2_ -__ZNK3JSC8JSString11toPrimitiveEPNS_9ExecStateENS_22PreferredPrimitiveTypeE -__ZNK3JSC7JSValue8toStringEPNS_9ExecStateE -__ZN3JSC7UString4fromEi -__ZNK3JSC8JSString11resolveRopeEPNS_9ExecStateE -__ZN3WTF13tryFastMallocEm -__ZN7WebCore10StringImpl4findEPKcib -__ZN3JSC13LogicalOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZNK3JSC14ExpressionNode6isNullEv -__ZN3JSC3JIT11emit_op_neqEPNS_11InstructionE -__ZN3JSC12X86Assembler8shll_i8rEiNS_12X86Registers10RegisterIDE -__ZN3JSC12X86Assembler6orl_irEiNS_12X86Registers10RegisterIDE -__ZN3JSC3JIT15emitSlow_op_neqEPNS_11InstructionERPNS_13SlowCaseEntryE -_cti_op_call_arityCheck -_cti_op_eq -__ZN3JSC9JITThunks15tryCacheGetByIDEPNS_9ExecStateEPNS_9CodeBlockENS_16ReturnAddressPtrENS_7JSValueERKNS_10IdentifierERKNS_12Pr -__ZN3JSC14StructureChainC1EPNS_9StructureE -__ZN3JSC14StructureChainC2EPNS_9StructureE -__ZN3JSC3JIT26privateCompileGetByIdChainEPNS_17StructureStubInfoEPNS_9StructureEPNS_14StructureChainEmRKNS_10IdentifierERKNS_12 -__ZN3JSC3JIT22compileGetDirectOffsetEPNS_8JSObjectENS_12X86Registers10RegisterIDES4_m +__ZN3JSC21roundUpAllocationSizeEmm +__ZN3JSC3JIT22emitSlow_op_put_by_valEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT20emitSlow_op_stricteqEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT17emitSlow_op_jtrueEPNS_11InstructionERPNS_13SlowCaseEntryE +_cti_op_new_object +_cti_op_put_by_id_direct +__ZN3JSC9Structure22toDictionaryTransitionERNS_12JSGlobalDataEPS0_NS0_14DictionaryKindE +_cti_op_get_pnames +__ZN3JSC22JSPropertyNameIterator6createEPNS_9ExecStateEPNS_8JSObjectE +__ZN3WTF6VectorIN3JSC10IdentifierELm20EE14expandCapacityEm +_cti_has_property +_cti_op_resolve_global +_cti_op_get_by_val +_cti_op_put_by_val +__ZN3JSC14JSGlobalObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSC8JSParser20parseSwitchStatementINS_10ASTBuilderEEENT_9StatementERS3_ +__ZN3JSC8JSParser18parseSwitchClausesINS_10ASTBuilderEEENT_10ClauseListERS3_ +__ZN3JSC10SwitchNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC13CaseBlockNode20emitBytecodeForBlockERNS_17BytecodeGeneratorEPNS_10RegisterIDES4_ +__ZN3JSC13CaseBlockNode18tryOptimizedSwitchERN3WTF6VectorIPNS_14ExpressionNodeELm8EEERiS7_ +__ZN3JSCL17processClauseListEPNS_14ClauseListNodeERN3WTF6VectorIPNS_14ExpressionNodeELm8EEERNS_10SwitchKindERbRiSB_ +__ZNK3JSC14ExpressionNode8isNumberEv +__ZNK3JSC10StringNode8isStringEv +__ZN3JSC17BytecodeGenerator11beginSwitchEPNS_10RegisterIDENS_10SwitchInfo10SwitchTypeE +__ZN3WTF6VectorIN3JSC10SwitchInfoELm0EE14expandCapacityEm +__ZN3JSC17BytecodeGenerator9endSwitchEjPN3WTF6RefPtrINS_5LabelEEEPPNS_14ExpressionNodeEPS3_ii +__ZN3WTF6VectorIN3JSC15StringJumpTableELm0EE14expandCapacityEm +__ZNK3JSC13StatementNode12isReturnNodeEv +__ZN3JSC15StringJumpTableC1ERKS0_ +__ZN3JSC3JIT21emit_op_switch_stringEPNS_11InstructionE +__ZN3WTF6VectorIN3JSC12SwitchRecordELm0EE14expandCapacityEm +_cti_op_switch_string +__ZN3JSC9JITThunks15tryCacheGetByIDEPNS_9ExecStateEPNS_9CodeBlockENS_16ReturnAddressPtrENS_7JSValueERKNS_10IdentifierERKNS_12PropertySlotEPNS_17StructureStubInfoE _cti_op_get_by_id_self_fail -__ZN3JSC3JIT29privateCompileGetByIdSelfListEPNS_17StructureStubInfoEPNS_30PolymorphicAccessStructureListEiPNS_9StructureERKNS_1 +__ZN3JSC3JIT29privateCompileGetByIdSelfListEPNS_17StructureStubInfoEPNS_30PolymorphicAccessStructureListEiPNS_9StructureERKNS_10IdentifierERKNS_12PropertySlotEm _cti_op_get_by_id_custom_stub -__ZN3JSC10MathObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSCL16mathProtoFuncMaxEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZL17combineCommaNodesPN3JSC12JSGlobalDataEPNS_14ExpressionNodeES3_ -__ZNK3JSC14ExpressionNode11isCommaNodeEv -__ZNK3JSC9CommaNode11isCommaNodeEv -__ZN3JSC9CommaNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC19ReverseBinaryOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC9BreakNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator11breakTargetERKNS_10IdentifierE -__ZN3JSC17BytecodeGenerator14emitJumpScopesEPNS_5LabelEi -__ZN3JSC9CommaNodeD1Ev +__ZN3JSC8JSParser16parseIfStatementINS_10ASTBuilderEEENT_9StatementERS3_ +__ZN3JSC5Lexer19getUnicodeCharacterEv +__ZN3WTF6VectorIPN3JSC14ExpressionNodeELm0EE14expandCapacityEm +__ZN3WTF6VectorIPN3JSC13StatementNodeELm0EE14expandCapacityEmPKS3_ +__ZN3WTF6VectorIPN3JSC13StatementNodeELm0EE15reserveCapacityEm +__ZN3JSC9Structure26flattenDictionaryStructureERNS_12JSGlobalDataEPNS_8JSObjectE +__ZN3JSC6IfNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator15emitJumpIfFalseEPNS_10RegisterIDEPNS_5LabelE +__ZNK3JSC11BooleanNode6isPureERNS_17BytecodeGeneratorE +__ZN3JSC11BooleanNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator8emitLoadEPNS_10RegisterIDEb +__ZN3JSC10NumberNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator8emitLoadEPNS_10RegisterIDEd +__ZN3WTF9HashTableIdSt4pairIdN3JSC7JSValueEENS_18PairFirstExtractorIS4_EENS_9FloatHashIdEENS_14PairHashTraitsINS_10HashTraitsIdEENSA_IS3_EEEESB_E6expandEv +__ZN3JSC11NewExprNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator13emitConstructEPNS_10RegisterIDES2_RNS_13CallArgumentsEjjj +__ZN3JSC10IfElseNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC12BinaryOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZNK3JSC10NumberNode6isPureERNS_17BytecodeGeneratorE +__ZN3JSC17BytecodeGenerator12emitBinaryOpENS_8OpcodeIDEPNS_10RegisterIDES3_S3_NS_12OperandTypesE +__ZN3JSC3JIT14emit_op_jfalseEPNS_11InstructionE +__ZN3JSC3JIT17emit_op_constructEPNS_11InstructionE __ZN3JSC3JIT14emit_op_jnlessEPNS_11InstructionE +__ZN3JSC3JIT18emitSlow_op_jfalseEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT21emitSlow_op_constructEPNS_11InstructionERPNS_13SlowCaseEntryE __ZN3JSC3JIT18emitSlow_op_jnlessEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC7JSArray18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC12X86Assembler7movq_rrENS_12X86Registers10RegisterIDENS1_13XMMRegisterIDE +__ZN3JSC12X86Assembler11cvtsi2sd_rrENS_12X86Registers10RegisterIDENS1_13XMMRegisterIDE +__ZN3JSC12X86Assembler23X86InstructionFormatter9twoByteOpENS0_15TwoByteOpcodeIDEiNS_12X86Registers10RegisterIDE +__ZN3JSC23MacroAssemblerX86Common12branchDoubleENS0_15DoubleConditionENS_12X86Registers13XMMRegisterIDES3_ +__ZN3JSC12RegExpObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC15RegExpPrototype18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSCL19regExpProtoFuncTestEPNS_9ExecStateE +__ZN3JSC12RegExpObject4testEPNS_9ExecStateE +__ZN3JSC12RegExpObject5matchEPNS_9ExecStateE +__ZN3JSC6RegExp5matchERKNS_7UStringEiPN3WTF6VectorIiLm32EEE +__ZN3JSC4Yarr7executeERNS0_13YarrCodeBlockEPKtjjPi +__ZN3JSC16JSCallbackObjectINS_24JSObjectWithGlobalObjectEE17staticValueGetterEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +_JSValueIsObjectOfClass +__ZN3WTF9HashTableINS_6RefPtrINS_10StringImplEEESt4pairIS3_P19StaticFunctionEntryENS_18PairFirstExtractorIS7_EENS_10StringHashENS_14PairHashTraitsINS_10HashTraitsIS3_EENSC_IS6_EEEESD_E6expandEv +__ZN3JSC16JSCallbackObjectINS_24JSObjectWithGlobalObjectEE3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +_JSValueCreateJSONString +__ZN3JSC13JSONStringifyEPNS_9ExecStateENS_7JSValueEj +__ZN3JSC11StringifierC2EPNS_9ExecStateERKNS_5LocalINS_7UnknownEEES7_ +__ZN3JSC11Stringifier9stringifyENS_6HandleINS_7UnknownEEE +__ZN3JSC11Stringifier22appendStringifiedValueERNS_14UStringBuilderENS_7JSValueEPNS_8JSObjectERKNS_27PropertyNameForFunctionCallE +__ZN3WTF13StringBuilder6appendEPKcj +__ZNK3JSC6JSCell9getStringEPNS_9ExecStateE +_cti_vm_lazyLinkConstruct +__ZN3JSC18FunctionExecutable27compileForConstructInternalEPNS_9ExecStateEPNS_14ScopeChainNodeE +__ZN3JSC3JIT18emit_op_get_calleeEPNS_11InstructionE +__ZN3JSC3JIT19emit_op_create_thisEPNS_11InstructionE +_cti_op_create_this +__ZN3JSC16JSCallbackObjectINS_24JSObjectWithGlobalObjectEE20staticFunctionGetterEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +__ZN3JSC18JSCallbackFunctionC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPFPK13OpaqueJSValuePK15OpaqueJSContextPS5_SB_mPKS7_PS7_ERKNS_10IdentifierE +_cti_op_call_NotJSFunction +__ZN3JSC18JSCallbackFunction11getCallDataERNS_8CallDataE +__ZN3JSC18JSCallbackFunction4callEPNS_9ExecStateE +_JSValueToBoolean +_JSValueProtect +_JSValueMakeUndefined _cti_op_jless -__ZN3JSC3JIT33privateCompilePatchGetArrayLengthENS_16ReturnAddressPtrE -__ZN3JSC3JIT16patchGetByIdSelfEPNS_9CodeBlockEPNS_17StructureStubInfoEPNS_9StructureEmNS_16ReturnAddressPtrE +__ZN3JSC7UString6numberEd +__ZN3WTF14numberToStringEdPt +__ZN3WTF4dtoaILb1ELb0ELb0ELb1EEEvPcdiRbRiRj +__ZNK3WTF13DecimalNumber15toStringDecimalEPtj +__ZN3WTF6String6appendEPKtj +__ZN3WTF10StringImpl11reverseFindEPS0_j +__ZN3WTF17equalIgnoringCaseEPNS_10StringImplES1_ +__ZN3WTF6String8truncateEj +__ZN3JSC14JSGlobalObject15copyGlobalsFromERNS_12RegisterFileE +__ZN3JSC8JSParser24parseFunctionDeclarationINS_13SyntaxCheckerEEENT_9StatementERS3_ +__ZN3JSC8JSParser17parseFunctionInfoILNS0_20FunctionRequirementsE1ELb1ENS_13SyntaxCheckerEEEbRT1_RPKNS_10IdentifierERNS4_19FormalParameterListERNS4_12FunctionBodyERiSE_SE_ +__ZN3JSC17BytecodeGenerator21emitResolveBaseForPutEPNS_10RegisterIDERKNS_10IdentifierE +__ZN3JSC17BytecodeGenerator15emitResolveBaseEPNS_10RegisterIDERKNS_10IdentifierE +__ZN3JSC17StringConstructor18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC12StringObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSCL27objectProtoFuncDefineGetterEPNS_9ExecStateE +__ZN3JSC10JSFunction11getCallDataERNS_8CallDataE +__ZN3JSC8JSObject12defineGetterEPNS_9ExecStateERKNS_10IdentifierEPS0_j +__ZN3JSC7JSArray3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSC10JSFunction3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSC8JSParser21parseConstDeclarationINS_13SyntaxCheckerEEENT_9StatementERS3_ +__ZN3JSC8JSParser17parseFunctionInfoILNS0_20FunctionRequirementsE1ELb0ENS_10ASTBuilderEEEbRT1_RPKNS_10IdentifierERNS4_19FormalParameterListERNS4_12FunctionBodyERiSE_SE_ +__ZN3JSC8JSParser5Scope19restoreFunctionInfoEPKNS_23SourceProviderCacheItemE +__ZN3WTF7HashMapINS_6RefPtrINS_10StringImplEEEjN3JSC17IdentifierRepHashENS_10HashTraitsIS3_EENS6_IjEEE3addEPS2_RKj +__ZN3WTF9HashTableINS_6RefPtrINS_10StringImplEEESt4pairIS3_jENS_18PairFirstExtractorIS5_EEN3JSC17IdentifierRepHashENS_14PairHashTraitsINS_10HashTraitsIS3_EENSB_IjEEEESC_E6rehashEi +__ZN3JSC17BytecodeGenerator13emitPutGetterEPNS_10RegisterIDERKNS_10IdentifierES2_ +__ZN3JSC17BytecodeGenerator13emitPutSetterEPNS_10RegisterIDERKNS_10IdentifierES2_ +__ZN3JSC8NullNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC3JIT18emit_op_put_getterEPNS_11InstructionE +__ZN3JSC3JIT18emit_op_put_setterEPNS_11InstructionE +_cti_op_put_getter +_cti_op_put_setter +__ZN3JSC8JSObject12defineSetterEPNS_9ExecStateERKNS_10IdentifierEPS0_j +__ZNK3JSC12GetterSetter14isGetterSetterEv +__ZNK3JSC18EmptyStatementNode16isEmptyStatementEv +__ZN3JSC10ASTBuilder11makeAddNodeEPNS_14ExpressionNodeES2_b +__ZN3JSC9ScopeNode8capturesERKNS_10IdentifierE +__ZN3JSC17BytecodeGenerator6addVarERKNS_10IdentifierEbRPNS_10RegisterIDE +__ZNK3JSC13LogicalOpNode26hasConditionContextCodegenEv +__ZN3JSC13LogicalOpNode30emitBytecodeInConditionContextERNS_17BytecodeGeneratorEPNS_5LabelES4_b +__ZNK3JSC14LogicalNotNode26hasConditionContextCodegenEv +__ZN3JSC11UnaryOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator11emitUnaryOpENS_8OpcodeIDEPNS_10RegisterIDES3_ +__ZNK3JSC10StringNode6isPureERNS_17BytecodeGeneratorE +__ZNK3JSC14ExpressionNode5isAddEv +__ZNK3JSC14JSGlobalObject14isDynamicScopeERb __ZNK3JSC7AddNode5isAddEv -__ZN3JSC9JITThunks15tryCachePutByIDEPNS_9ExecStateEPNS_9CodeBlockENS_16ReturnAddressPtrENS_7JSValueERKNS_15PutPropertySlotEPNS_ -_cti_op_negate -__ZN3JSC7UString4fromEj -__ZL12makeMultNodePN3JSC12JSGlobalDataEPNS_14ExpressionNodeES3_b -__ZN3JSC9EqualNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator14emitEqualityOpENS_8OpcodeIDEPNS_10RegisterIDES3_S3_ -__ZN3JSC3JIT11emit_op_notEPNS_11InstructionE -__ZN3JSC3JIT11emit_op_mulEPNS_11InstructionE -__ZN3JSC3JIT10emit_op_eqEPNS_11InstructionE -__ZN3JSC3JIT15emitSlow_op_notEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC3JIT15emitSlow_op_mulEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC3JIT14emitSlow_op_eqEPNS_11InstructionERPNS_13SlowCaseEntryE -_cti_op_not -__ZN3JSC17ReadModifyDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator10emitPreDecEPNS_10RegisterIDE -__ZN3JSC3JIT16emit_op_jnlesseqEPNS_11InstructionE -__ZN3JSC3JIT15emit_op_jlesseqEPNS_11InstructionEb -__ZN3JSC3JIT15emit_op_pre_decEPNS_11InstructionE -__ZN3JSC3JIT22emit_op_loop_if_lesseqEPNS_11InstructionE -__ZN3JSC3JIT20emitSlow_op_jnlesseqEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC3JIT19emitSlow_op_jlesseqEPNS_11InstructionERPNS_13SlowCaseEntryEb -__ZN3JSC3JIT19emitSlow_op_pre_decEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC3JIT26emitSlow_op_loop_if_lesseqEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC17powThunkGeneratorEPNS_12JSGlobalDataEPNS_14ExecutablePoolE -__ZN3JSC19SpecializedThunkJIT12returnDoubleENS_12X86Registers13XMMRegisterIDE -__ZN3JSC19SpecializedThunkJITD1Ev -__ZN3JSCL16mathProtoFuncSinEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL16mathProtoFuncMinEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL18mathProtoFuncRoundEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL16mathProtoFuncLogEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC3JIT20patchMethodCallProtoEPNS_9CodeBlockERNS_18MethodCallLinkInfoEPNS_10JSFunctionEPNS_9StructureEPNS_8JSObjectENS_16R -__ZN3JSC3JIT31privateCompilePutByIdTransitionEPNS_17StructureStubInfoEPNS_9StructureES4_mPNS_14StructureChainENS_16ReturnAddres -__ZN3JSC3JIT13testPrototypeEPNS_9StructureERNS_22AbstractMacroAssemblerINS_12X86AssemblerEE8JumpListE -__ZN3JSCL16mathProtoFuncAbsEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -_cti_op_jlesseq -__ZN3WTF6VectorIPN3JSC12CallLinkInfoELm0EE15reserveCapacityEm -__ZN3JSC10IfElseNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17TypeOfResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC7TryNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator9emitCatchEPNS_10RegisterIDEPNS_5LabelES4_ -__ZN3JSC9CodeBlock25createRareDataIfNecessaryEv -__ZN3WTF6VectorIN3JSC11HandlerInfoELm0EE14expandCapacityEm -__ZN3JSC17BytecodeGenerator16emitPushNewScopeEPNS_10RegisterIDERKNS_10IdentifierES2_ -__ZN3WTF6VectorIN3JSC18ControlFlowContextELm0EE14expandCapacityEm -__ZN3JSC15TypeOfValueNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSCeqERKNS_7UStringEPKc -__ZN3JSC17BytecodeGenerator12emitPopScopeEv -__ZN3WTF6VectorIN3JSC15SimpleJumpTableELm0EE14shrinkCapacityEm -__ZN3WTF6VectorIN3JSC15StringJumpTableELm0EE14shrinkCapacityEm -__ZN3JSC3JIT13emit_op_catchEPNS_11InstructionE -__ZN3JSC3JIT22emit_op_push_new_scopeEPNS_11InstructionE -__ZN3JSC3JIT15emit_op_resolveEPNS_11InstructionE -__ZN3JSC3JIT20emit_op_resolve_baseEPNS_11InstructionE -__ZN3JSC3JIT17emit_op_pop_scopeEPNS_11InstructionE -__ZL15makePostfixNodePN3JSC12JSGlobalDataEPNS_14ExpressionNodeENS_8OperatorEiii __ZN3JSC12BinaryOpNode10emitStrcatERNS_17BytecodeGeneratorEPNS_10RegisterIDES4_PNS_21ReadModifyResolveNodeE -__ZNK3JSC10StringNode8isStringEv __ZNK3JSC14ExpressionNode8isStringEv __ZN3JSC17BytecodeGenerator15emitToPrimitiveEPNS_10RegisterIDES2_ __ZN3JSC17BytecodeGenerator10emitStrcatEPNS_10RegisterIDES2_i -__ZN3JSC18PostfixResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC3JIT11emit_op_modEPNS_11InstructionE -__ZN3JSC23MacroAssemblerX86Common8branch32ENS0_9ConditionENS_12X86Registers10RegisterIDENS_22AbstractMacroAssemblerINS_12X86Ass +__ZN3JSC3JIT11emit_op_addEPNS_11InstructionE __ZN3JSC3JIT20emit_op_to_primitiveEPNS_11InstructionE -__ZN3JSC23MacroAssemblerX86Common4moveENS_22AbstractMacroAssemblerINS_12X86AssemblerEE6ImmPtrENS_12X86Registers10RegisterIDE __ZN3JSC3JIT14emit_op_strcatEPNS_11InstructionE -__ZN3JSC3JIT15emitSlow_op_modEPNS_11InstructionERPNS_13SlowCaseEntryE __ZN3JSC3JIT24emitSlow_op_to_primitiveEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSCL18mathProtoFuncFloorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL17mathProtoFuncCeilEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +_JSValueMakeString +_cti_op_jtrue +__ZNK3JSC8JSString9toBooleanEPNS_9ExecStateE _cti_op_strcat -__ZNK3JSC19BracketAccessorNode10isLocationEv -__ZNK3JSC19BracketAccessorNode21isBracketAccessorNodeEv -__ZN3JSC17AssignBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator12emitPutByValEPNS_10RegisterIDES2_S2_ -__ZN3JSC3JIT18emit_op_put_by_valEPNS_11InstructionE -__ZN3JSC3JIT22emitSlow_op_put_by_valEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC14ArrayPrototype18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC14LogicalNotNode30emitBytecodeInConditionContextERNS_17BytecodeGeneratorEPNS_5LabelES4_b +__ZNK3JSC8JSString11resolveRopeEPNS_9ExecStateE +__ZNK3JSC8JSString19resolveRopeSlowCaseEPNS_9ExecStateEPt +__ZN3JSC8RopeImpl20destructNonRecursiveEv +__ZN3JSC8RopeImpl23derefFibersNonRecursiveERN3WTF6VectorIPS0_Lm32EEE +_cti_op_construct_NotJSConstruct +__ZN3JSC17ObjectConstructor16getConstructDataERNS_13ConstructDataE +__ZN3JSCL30constructWithObjectConstructorEPNS_9ExecStateE +__ZN3WTF21charactersToIntStrictEPKtmPbi +__ZN3JSC41constructFunctionSkippingEvalEnabledCheckEPNS_9ExecStateEPNS_14JSGlobalObjectERKNS_7ArgListERKNS_10IdentifierERKNS_7UStringEi +__ZNK3JSC21UStringSourceProvider6lengthEv +__ZN3JSC18FunctionExecutable14fromGlobalCodeERKNS_10IdentifierEPNS_9ExecStateEPNS_8DebuggerERKNS_10SourceCodeEPPNS_8JSObjectE +__ZNK3JSC21UStringSourceProvider4dataEv +__ZN3JSC4callEPNS_9ExecStateENS_7JSValueENS_8CallTypeERKNS_8CallDataES2_RKNS_7ArgListE +__ZN3JSC11Interpreter11executeCallEPNS_9ExecStateEPNS_8JSObjectENS_8CallTypeERKNS_8CallDataENS_7JSValueERKNS_7ArgListE +__ZN3JSC10ASTBuilder15makePostfixNodeEPNS_14ExpressionNodeENS_8OperatorEiii +__ZN3JSC7ForNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC18PostfixResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator10emitPreIncEPNS_10RegisterIDE +__ZN3JSC9EqualNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZNK3JSC14ExpressionNode6isNullEv +__ZN3JSC3JIT15emit_op_pre_incEPNS_11InstructionE +__ZN3JSC3JIT13emit_op_jlessEPNS_11InstructionE +__ZN3JSC3JIT10emit_op_eqEPNS_11InstructionE +__ZN3JSC3JIT19emitSlow_op_pre_incEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT17emitSlow_op_jlessEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT14emitSlow_op_eqEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3WTF11emptyStringEv +__ZN3JSC13LogicalOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +_cti_op_stricteq +_cti_op_eq +__ZN3JSC10ASTBuilder14makePrefixNodeEPNS_14ExpressionNodeENS_8OperatorEiii +__ZN3JSC17PrefixResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC21ThrowableBinaryOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZNK3JSC8JSObject9toBooleanEPNS_9ExecStateE +_cti_op_in +__ZN3JSC9JITThunks15tryCachePutByIDEPNS_9ExecStateEPNS_9CodeBlockENS_16ReturnAddressPtrENS_7JSValueERKNS_15PutPropertySlotEPNS_17StructureStubInfoEb +_cti_op_get_by_id_generic +_cti_op_put_by_id_generic +__ZN3JSC3JIT16patchGetByIdSelfEPNS_9CodeBlockEPNS_17StructureStubInfoEPNS_9StructureEmNS_16ReturnAddressPtrE +__ZNK3JSC6JSCell14isGetterSetterEv +_JSObjectIsFunction +_JSObjectCallAsFunction +__ZN3JSC3JIT20emit_op_convert_thisEPNS_11InstructionE +__ZN3JSC23MacroAssemblerX86Common11branchTest8ENS0_15ResultConditionENS_22AbstractMacroAssemblerINS_12X86AssemblerEE7AddressENS4_12TrustedImm32E +__ZN3JSC3JIT24emitSlow_op_convert_thisEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC8JSObject22fillGetterPropertySlotERNS_12PropertySlotEPNS_16WriteBarrierBaseINS_7UnknownEEE +__ZNK3JSC12PropertySlot14functionGetterEPNS_9ExecStateE +__ZN3JSC17ReadModifyDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC15ConditionalNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC3JIT20compileBinaryArithOpENS_8OpcodeIDEjjjNS_12OperandTypesE +__ZN3JSC3JIT15emitSlow_op_addEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT28compileBinaryArithOpSlowCaseENS_8OpcodeIDERPNS_13SlowCaseEntryEjjjNS_12OperandTypesEbb +__ZNK3JSC10NumberNode8isNumberEv +__ZN3JSC3JIT17emit_op_nstricteqEPNS_11InstructionE +__ZN3JSC3JIT21emitSlow_op_nstricteqEPNS_11InstructionERPNS_13SlowCaseEntryE __ZN3JSC8JSString18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE __ZN3JSC15StringPrototype18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE __ZN3JSC12StringObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSCL21stringProtoFuncSubstrEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL22stringProtoFuncIndexOfEPNS_9ExecStateE +_cti_op_add +__ZN3JSC10ASTBuilder12makeMultNodeEPNS_14ExpressionNodeES2_b +__ZN3JSC14ExpressionNode14stripUnaryPlusEv +__ZN3JSC17BytecodeGenerator20emitInitLazyRegisterEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator29uncheckedRegisterForArgumentsEv +__ZN3JSC17BytecodeGenerator20emitGetArgumentByValEPNS_10RegisterIDES2_S2_ +__ZN3JSC17BytecodeGenerator22emitGetArgumentsLengthEPNS_10RegisterIDES2_ +__ZN3JSC3JIT21emit_op_init_lazy_regEPNS_11InstructionE +__ZN3JSC3JIT11emit_op_mulEPNS_11InstructionE +__ZN3JSC3JIT27emit_op_get_argument_by_valEPNS_11InstructionE +__ZN3JSC3JIT28emit_op_get_arguments_lengthEPNS_11InstructionE +__ZN3JSC3JIT15emitSlow_op_mulEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT31emitSlow_op_get_argument_by_valEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT32emitSlow_op_get_arguments_lengthEPNS_11InstructionERPNS_13SlowCaseEntryE +_cti_op_call_arityCheck +_cti_op_convert_this +__ZNK3JSC8JSString12toThisObjectEPNS_9ExecStateE +__ZN3JSC12StringObjectC1ERNS_12JSGlobalDataEPNS_9StructureEPNS_8JSStringE +__ZN3JSCL20stringProtoFuncSplitEPNS_9ExecStateE +__ZNK3JSC8JSObject8toStringEPNS_9ExecStateE +__ZNK3JSC8JSObject11toPrimitiveEPNS_9ExecStateENS_22PreferredPrimitiveTypeE +__ZNK3JSC8JSObject12defaultValueEPNS_9ExecStateENS_22PreferredPrimitiveTypeE +__ZN3JSCL23stringProtoFuncToStringEPNS_9ExecStateE +__ZN3JSC11jsSubstringEPNS_12JSGlobalDataERKNS_7UStringEjj +__ZN3JSC7JSArray3putEPNS_9ExecStateEjNS_7JSValueE +__ZN3JSC7JSArray11putSlowCaseEPNS_9ExecStateEjNS_7JSValueE +__ZN3JSC14ArrayPrototype18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSCL20arrayProtoFuncSpliceEPNS_9ExecStateE +__ZNK3JSC8JSObject3getEPNS_9ExecStateERKNS_10IdentifierE __ZNK3JSC7JSValue9toIntegerEPNS_9ExecStateE -__ZN7WebCore10StringImpl6createEN3WTF10PassRefPtrIS0_EEjj -__ZN3WTF6RefPtrIN7WebCore10StringImplEED1Ev -__ZN3JSCL18arrayProtoFuncJoinEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK3JSC8JSObject12toThisObjectEPNS_9ExecStateE -__ZN3WTF7HashSetIPN3JSC8JSObjectENS_7PtrHashIS3_EENS_10HashTraitsIS3_EEE3addERKS3_ +__ZN3JSC7JSArrayC1ERNS_12JSGlobalDataEPNS_9StructureEjNS_17ArrayCreationModeE +__ZN3JSC7JSArray9setLengthEj +__ZN3JSCL11getPropertyEPNS_9ExecStateEPNS_8JSObjectEj +__ZN3JSCL18arrayProtoFuncJoinEPNS_9ExecStateE __ZN3WTF9HashTableIPN3JSC8JSObjectES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E6rehashEi -__ZNK3JSC8JSObject3getEPNS_9ExecStateERKNS_10IdentifierE __ZN3JSC15JSStringBuilder5buildEPNS_9ExecStateE -__ZN3WTF6VectorItLm64EE17tryExpandCapacityEm -__ZN3JSCL18arrayProtoFuncPushEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC7JSArray4pushEPNS_9ExecStateENS_7JSValueE -__ZN3WTF14tryFastReallocEPvm -__ZN3JSC4Heap15recordExtraCostEm -__ZN3JSC17BytecodeGenerator16emitPutScopedVarEmiPNS_10RegisterIDENS_7JSValueE -__ZN3JSC3JIT22emit_op_put_scoped_varEPNS_11InstructionE -__ZN3JSC3JIT29emitPutVariableObjectRegisterENS_12X86Registers10RegisterIDES2_i -__ZN3JSC3JIT22emit_op_put_global_varEPNS_11InstructionE -_cti_op_put_by_index -__ZN3JSC7JSArray3putEPNS_9ExecStateEjNS_7JSValueE -__ZN3JSC7JSArray11putSlowCaseEPNS_9ExecStateEjNS_7JSValueE -__ZNK3JSC11BooleanNode6isPureERNS_17BytecodeGeneratorE -__ZN3JSC10JSFunction3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE -__ZNK7WebCore12AtomicString5lowerEv +__ZN3JSC3JIT20patchMethodCallProtoERNS_12JSGlobalDataEPNS_9CodeBlockERNS_18MethodCallLinkInfoEPNS_10JSFunctionEPNS_9StructureEPNS_8JSObjectENS_16ReturnAddressPtrE +__ZN3JSC27ctiPatchCallByReturnAddressEPNS_9CodeBlockENS_16ReturnAddressPtrENS_21MacroAssemblerCodePtrE +__ZN3JSC23CallFunctionCallDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator25emitJumpIfNotFunctionCallEPNS_10RegisterIDEPNS_5LabelE +__ZN3JSC3JIT16emit_op_jneq_ptrEPNS_11InstructionE +__ZN3JSC3JIT24emit_op_create_argumentsEPNS_11InstructionE +__ZN3JSC3JIT25emit_op_create_activationEPNS_11InstructionE +__ZN3JSC3JIT27emit_op_tear_off_activationEPNS_11InstructionE +_cti_op_create_arguments +__ZN3JSCL19arrayProtoFuncSliceEPNS_9ExecStateE +__ZN3JSC9Arguments18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +_cti_op_push_activation +__ZN3JSC12JSActivationC1EPNS_9ExecStateEPNS_18FunctionExecutableE +_cti_op_tear_off_activation +__ZN3JSCL18arrayProtoFuncPushEPNS_9ExecStateE +__ZN3JSC5Lexer9setOffsetEi +__ZN3WTF7HashMapIjPN3JSC16FunctionBodyNodeENS_7IntHashIjEENS_29UnsignedWithZeroKeyHashTraitsIjEENS_10HashTraitsIS3_EEE3setERKjRKS3_ +__ZN3WTF9HashTableIjSt4pairIjPN3JSC16FunctionBodyNodeEENS_18PairFirstExtractorIS5_EENS_7IntHashIjEENS_14PairHashTraitsINS_29UnsignedWithZeroKeyHashTraitsIjEENS_10HashTraitsIS4_EEEESC_E6rehashEi +__ZN3JSC17BytecodeGenerator19emitLazyNewFunctionEPNS_10RegisterIDEPNS_16FunctionBodyNodeE +__ZN3JSC17BytecodeGenerator23emitNewFunctionInternalEPNS_10RegisterIDEjb +__ZN3JSC3JIT16emit_op_new_funcEPNS_11InstructionE +__ZN3JSC8JSParser19parseWhileStatementINS_10ASTBuilderEEENT_9StatementERS3_ +__ZN3JSC9WhileNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +_JSValueMakeNumber +_JSObjectMakeArray +_JSValueMakeBoolean +__ZN3JSC20MarkedArgumentBuffer10slowAppendENS_7JSValueE +_JSValueUnprotect +__ZN3WTF9HashTableIPN3JSC20MarkedArgumentBufferES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E6expandEv +_cti_op_new_func +__ZN3JSC3JIT26privateCompileGetByIdProtoEPNS_17StructureStubInfoEPNS_9StructureES4_RKNS_10IdentifierERKNS_12PropertySlotEmNS_16ReturnAddressPtrEPNS_9ExecStateE +__ZN3JSC3JIT22compileGetDirectOffsetEPNS_8JSObjectENS_12X86Registers10RegisterIDEm +__ZN3JSC10ASTBuilder11makeSubNodeEPNS_14ExpressionNodeES2_b +__ZN3JSC8JSParser22parseContinueStatementINS_10ASTBuilderEEENT_9StatementERS3_ +__ZN3JSC8JSParser19parseBreakStatementINS_10ASTBuilderEEENT_9StatementERS3_ +__ZN3JSC17BytecodeGenerator15emitNewFunctionEPNS_10RegisterIDEPNS_16FunctionBodyNodeE +__ZN3JSC15TypeOfValueNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSCeqERKNS_7UStringEPKc +__ZN3WTF6VectorIPN3JSC14ExpressionNodeELm8EE14expandCapacityEm +__ZN3WTF6VectorINS_6RefPtrIN3JSC5LabelEEELm8EE14expandCapacityEm +__ZN3JSC19ReverseBinaryOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC12ContinueNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator14continueTargetERKNS_10IdentifierE +__ZN3JSC17BytecodeGenerator14emitJumpScopesEPNS_5LabelEi +__ZN3JSC9BreakNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator11breakTargetERKNS_10IdentifierE +__ZN3WTF6VectorISt4pairIiiELm8EE14expandCapacityEm +__ZN3JSC14InstanceOfNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator20emitCheckHasInstanceEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator14emitInstanceOfEPNS_10RegisterIDES2_S2_S2_ +__ZN3JSC17BytecodeGenerator19emitResolveWithBaseEPNS_10RegisterIDES2_RKNS_10IdentifierE +__ZN3JSC23FunctionCallBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC3JIT11emit_op_subEPNS_11InstructionE +__ZN3JSC3JIT16emit_op_jnlesseqEPNS_11InstructionE +__ZN3JSC3JIT15emit_op_jlesseqEPNS_11InstructionEb +__ZN3JSC3JIT11emit_op_notEPNS_11InstructionE +__ZN3JSC3JIT26emit_op_check_has_instanceEPNS_11InstructionE +__ZN3JSC3JIT18emit_op_instanceofEPNS_11InstructionE +__ZN3JSC3JIT15emitSlow_op_subEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT20emitSlow_op_jnlesseqEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT19emitSlow_op_jlesseqEPNS_11InstructionERPNS_13SlowCaseEntryEb +__ZN3JSC3JIT15emitSlow_op_notEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT30emitSlow_op_check_has_instanceEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT22emitSlow_op_instanceofEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC7UString6numberEi +_cti_op_is_function +__ZN3JSC16jsIsFunctionTypeENS_7JSValueE +__ZN3JSC3JIT33privateCompilePatchGetArrayLengthENS_16ReturnAddressPtrE +__ZN3JSC14StructureChainC1ERNS_12JSGlobalDataEPNS_9StructureES4_ +__ZN3JSC14StructureChainC2ERNS_12JSGlobalDataEPNS_9StructureES4_ +__ZN3JSC3JIT31privateCompilePutByIdTransitionEPNS_17StructureStubInfoEPNS_9StructureES4_mPNS_14StructureChainENS_16ReturnAddressPtrEb +__ZN3JSC3JIT13testPrototypeENS_7JSValueERNS_22AbstractMacroAssemblerINS_12X86AssemblerEE8JumpListE +__ZN3JSC3JIT26privateCompileGetByIdChainEPNS_17StructureStubInfoEPNS_9StructureEPNS_14StructureChainEmRKNS_10IdentifierERKNS_12PropertySlotEmNS_16ReturnAddressPtrEPNS_9ExecStateE +__ZN3JSC17BytecodeGenerator10emitPreDecEPNS_10RegisterIDE +__ZN3JSC3JIT15emit_op_pre_decEPNS_11InstructionE +__ZN3JSC23MacroAssemblerX86Common4moveENS_12X86Registers10RegisterIDES2_ +__ZN3JSC3JIT19emitSlow_op_pre_decEPNS_11InstructionERPNS_13SlowCaseEntryE _cti_op_get_by_id_proto_list -__ZN3JSC3JIT30privateCompileGetByIdChainListEPNS_17StructureStubInfoEPNS_30PolymorphicAccessStructureListEiPNS_9StructureEPNS_1 +__ZN3JSC3JIT30privateCompileGetByIdChainListEPNS_17StructureStubInfoEPNS_30PolymorphicAccessStructureListEiPNS_9StructureEPNS_14StructureChainEmRKNS_10IdentifierERKNS_12PropertySlotEmPNS_9ExecStateE +__ZN3WTF13StringBuilder15reserveCapacityEj +__ZN3WTF4dtoaEPcdRbRiRj +__ZNK3WTF13DecimalNumber28bufferLengthForStringDecimalEv +__ZN3JSC18globalFuncParseIntEPNS_9ExecStateE +__ZN3JSC7toInt32Ed +__ZN3JSCL8parseIntERKNS_7UStringEi +_cti_op_nstricteq +__ZN3JSC9Arguments18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE +__ZN3JSC10ASTBuilder14makeDeleteNodeEPNS_14ExpressionNodeEiii +__ZN3JSC13DeleteDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator14emitDeleteByIdEPNS_10RegisterIDES2_RKNS_10IdentifierE +__ZN3JSC3JIT17emit_op_del_by_idEPNS_11InstructionE +_cti_op_del_by_id +__ZN3JSC8JSObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE +_cti_op_not +__ZN3WTF13tryFastCallocEmm +__ZN3WTF9ByteArray6createEm __ZN3JSC3JIT22emit_op_get_scoped_varEPNS_11InstructionE -_cti_op_put_by_val -__ZNK3JSC12JSActivation14isDynamicScopeERb +__ZN3JSCL22stringProtoFuncReplaceEPNS_9ExecStateE +__ZNK3JSC7JSValue14toThisJSStringEPNS_9ExecStateE +__ZN3JSC9ExecState8argumentEi +__ZN3JSC6JSCell11getCallDataERNS_8CallDataE +__ZN3WTF6RefPtrINS_10StringImplEEaSERKS2_ +__ZNK3JSC7UString20substringSharingImplEjj +__ZN3JSC4Heap8allocateEm __ZN3JSC24ApplyFunctionCallDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZNK3JSC14ExpressionNode13isSimpleArrayEv __ZN3JSC17BytecodeGenerator26emitJumpIfNotFunctionApplyEPNS_10RegisterIDEPNS_5LabelE -__ZN3JSC17BytecodeGenerator22willResolveToArgumentsERKNS_10IdentifierE -__ZN3JSC17BytecodeGenerator15emitLoadVarargsEPNS_10RegisterIDES2_ +__ZNK3JSC12JSActivation14isDynamicScopeERb +__ZN3JSC17BytecodeGenerator15emitLoadVarargsEPNS_10RegisterIDES2_S2_ __ZN3JSC17BytecodeGenerator15emitCallVarargsEPNS_10RegisterIDES2_S2_S2_jjj -__ZN3JSC3JIT16emit_op_jneq_ptrEPNS_11InstructionE __ZN3JSC3JIT20emit_op_load_varargsEPNS_11InstructionE __ZN3JSC3JIT20emit_op_call_varargsEPNS_11InstructionE __ZN3JSC3JIT20compileOpCallVarargsEPNS_11InstructionE -__ZN3JSC3JIT29compileOpCallVarargsSetupArgsEPNS_11InstructionE +__ZN3JSC3JIT24emitSlow_op_load_varargsEPNS_11InstructionERPNS_13SlowCaseEntryE __ZN3JSC3JIT24emitSlow_op_call_varargsEPNS_11InstructionERPNS_13SlowCaseEntryE __ZN3JSC3JIT28compileOpCallVarargsSlowCaseEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC14ExecutablePool13systemReleaseERKNS0_10AllocationE -_JSStringCreateWithCFString -_JSStringRetain -_JSStringRelease -_JSEvaluateScript -__ZN3JSC4Heap14registerThreadEv -__ZNK14OpaqueJSString7ustringEv -__ZN3JSC7UStringC1EPKtj -__ZN3JSC5Lexer10scanRegExpERPKNS_10IdentifierES4_t -__ZN3JSC18ConstStatementNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC13ConstDeclNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC13ConstDeclNode14emitCodeSingleERNS_17BytecodeGeneratorE -__ZN3JSC17BytecodeGenerator16constRegisterForERKNS_10IdentifierE -__ZN3JSC10RegExpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC6RegExp6createEPNS_12JSGlobalDataERKNS_7UStringES5_ -__ZNK3JSC7UString4findEtj -__ZN3JSC4Yarr15jitCompileRegexEPNS_12JSGlobalDataERNS0_14RegexCodeBlockERKNS_7UStringERjRPKcbb -__ZN3JSC4Yarr12compileRegexERKNS_7UStringERNS0_12RegexPatternE -__ZN3JSC4Yarr6ParserINS0_23RegexPatternConstructorEE5parseEv -__ZN3JSC4Yarr18PatternDisjunction17addNewAlternativeEv -__ZN3WTF6VectorIPN3JSC4Yarr18PatternAlternativeELm0EE15reserveCapacityEm -__ZN3JSC4Yarr23RegexPatternConstructor20atomPatternCharacterEt +_cti_op_create_arguments_no_params +__ZN3JSCL20arrayProtoFuncConcatEPNS_9ExecStateE +_cti_op_load_varargs +__ZN3JSC7JSArray15copyToRegistersEPNS_9ExecStateEPNS_8RegisterEj +_cti_op_call_jitCompile +__ZN3JSC16JSCallbackObjectINS_24JSObjectWithGlobalObjectEE14callbackGetterEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +__ZNK3JSC6JSCell9getStringEPNS_9ExecStateERNS_7UStringE +__ZN3JSC11Stringifier6Holder18appendNextPropertyERS0_RNS_14UStringBuilderE +__ZN3JSC8JSObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC11Stringifier18appendQuotedStringERNS_14UStringBuilderERKNS_7UStringE +__ZN3WTF10StringImpl4costEv +__ZN3JSC7UStringC1EPKcj +_JSObjectGetPrivateProperty +_JSObjectSetPrivateProperty +__ZN3JSC20JSCallbackObjectData18setPrivatePropertyERNS_12JSGlobalDataEPNS_6JSCellERKNS_10IdentifierENS_7JSValueE +__ZN3WTF9HashTableINS_6RefPtrINS_10StringImplEEESt4pairIS3_N3JSC12WriteBarrierINS5_7UnknownEEEENS_18PairFirstExtractorIS9_EENS5_17IdentifierRepHashENS_14PairHashTraitsINS_10HashTraitsIS3_EENSE_IS8_EEEESF_E6rehashEi +__ZN3JSC17BytecodeGenerator16emitPutScopedVarEmiPNS_10RegisterIDENS_7JSValueE +__ZN3JSC3JIT22emit_op_put_global_varEPNS_11InstructionE +__ZN3JSC13LiteralParser5Lexer9lexNumberERNS1_18LiteralParserTokenE +__ZN3JSC8JSParser17parseTryStatementINS_10ASTBuilderEEENT_9StatementERS3_ +__ZN3JSC7TryNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator9emitCatchEPNS_10RegisterIDEPNS_5LabelES4_ +__ZN3WTF6VectorIN3JSC11HandlerInfoELm0EE14expandCapacityEm +__ZN3JSC17BytecodeGenerator16emitPushNewScopeEPNS_10RegisterIDERKNS_10IdentifierES2_ +__ZN3WTF6VectorIN3JSC18ControlFlowContextELm0EE14expandCapacityEm +__ZN3JSC17BytecodeGenerator12emitPopScopeEv +__ZN3JSC3JIT13emit_op_catchEPNS_11InstructionE +__ZN3JSC20MacroAssemblerX86_647loadPtrENS_22AbstractMacroAssemblerINS_12X86AssemblerEE15ImplicitAddressENS_12X86Registers10RegisterIDE +__ZN3JSC3JIT22emit_op_push_new_scopeEPNS_11InstructionE +__ZN3JSC3JIT18emit_op_jmp_scopesEPNS_11InstructionE +__ZN3JSC3JIT17emit_op_pop_scopeEPNS_11InstructionE +__ZN3WTF6VectorIN3JSC32CallReturnOffsetToBytecodeOffsetELm0EE15reserveCapacityEm +_JSObjectDeletePrivateProperty +__ZN3WTF6VectorIjLm16EE6resizeEm +__ZN3WTFL7multaddERNS_6BigIntEii +__ZN3WTFL4multERNS_6BigIntERKS0_ +__ZN3WTF6VectorIjLm16EEaSERKS1_ +__ZN3JSC4Yarr22YarrPatternConstructor23setupDisjunctionOffsetsEPNS0_18PatternDisjunctionEjj +__ZN3JSC23MacroAssemblerX86Common4jumpEv __ZN3WTF6VectorIN3JSC4Yarr11PatternTermELm0EE14expandCapacityEmPKS3_ -__ZN3WTF6VectorIN3JSC4Yarr11PatternTermELm0EE14expandCapacityEm -__ZN3JSC4Yarr6ParserINS0_23RegexPatternConstructorEE11parseEscapeILb0ES2_EEbRT0_ -__ZN3JSC4Yarr14RegexGenerator19generateDisjunctionEPNS0_18PatternDisjunctionE -__ZN3JSC12X86Assembler7addl_irEiNS_12X86Registers10RegisterIDE -__ZN3JSC23MacroAssemblerX86Common8branch32ENS0_9ConditionENS_12X86Registers10RegisterIDES3_ -__ZN3JSC4Yarr14RegexGenerator12generateTermERNS1_19TermGenerationStateE -__ZN3JSC12X86Assembler23X86InstructionFormatter9oneByteOpENS0_15OneByteOpcodeIDEiNS_12X86Registers10RegisterIDES4_ii -__ZN3JSC4Yarr14RegexGenerator19TermGenerationState15jumpToBacktrackENS_22AbstractMacroAssemblerINS_12X86AssemblerEE4JumpEPNS_14 -__ZN3JSC4Yarr14RegexGenerator19jumpIfCharNotEqualsEti -__ZN3JSC12X86Assembler7subl_irEiNS_12X86Registers10RegisterIDE -__ZN3JSC22AbstractMacroAssemblerINS_12X86AssemblerEE8JumpList4linkEPS2_ -__ZN3WTF15deleteAllValuesIPN3JSC4Yarr18PatternDisjunctionELm4EEEvRKNS_6VectorIT_XT0_EEE -__ZN3WTF15deleteAllValuesIPN3JSC4Yarr14CharacterClassELm0EEEvRKNS_6VectorIT_XT0_EEE -__ZN3JSC17BytecodeGenerator8emitLoadEPNS_10RegisterIDEPNS_6RegExpE -__ZN3JSC12RegExpObjectC1EN3WTF17NonNullPassRefPtrINS_9StructureEEENS2_INS_6RegExpEEE -__ZN3JSC12RegExpObjectC2EN3WTF17NonNullPassRefPtrINS_9StructureEEENS2_INS_6RegExpEEE -__ZN3JSC4Yarr23RegexPatternConstructor30atomParenthesesSubpatternBeginEb -__ZN3JSC4Yarr25CharacterClassConstructor7putCharEt -__ZN3JSC4Yarr25CharacterClassConstructor9addSortedERN3WTF6VectorItLm0EEEt -__ZN3WTF6VectorItLm0EE14expandCapacityEm -__ZN3JSC4Yarr23RegexPatternConstructor21atomCharacterClassEndEv -__ZN3WTF6VectorIPN3JSC4Yarr14CharacterClassELm0EE14expandCapacityEmPKS4_ -__ZN3WTF6VectorIPN3JSC4Yarr14CharacterClassELm0EE14expandCapacityEm +__ZN3JSC4Yarr18PatternDisjunction17addNewAlternativeEv +__ZN3JSC4Yarr22YarrPatternConstructor15copyDisjunctionEPNS0_18PatternDisjunctionEb __ZN3WTF6VectorIPN3JSC4Yarr18PatternDisjunctionELm4EE14expandCapacityEm -__ZN3JSC4Yarr23RegexPatternConstructor23setupDisjunctionOffsetsEPNS0_18PatternDisjunctionEjj -__ZN3JSC4Yarr14RegexGenerator25generateParenthesesSingleERNS1_19TermGenerationStateE -__ZN3JSC4Yarr14RegexGenerator30generateParenthesesDisjunctionERNS0_11PatternTermERNS1_19TermGenerationStateEj -__ZN3WTF6VectorIN3JSC4Yarr14RegexGenerator26AlternativeBacktrackRecordELm0EE14expandCapacityEm -__ZN3JSC4Yarr14RegexGenerator28generateCharacterClassGreedyERNS1_19TermGenerationStateE -__ZN3JSC4Yarr14RegexGenerator19matchCharacterClassENS_12X86Registers10RegisterIDERNS_22AbstractMacroAssemblerINS_12X86Assembler -__ZN3JSC23MacroAssemblerX86Common4jumpEv -__ZN3JSC4Yarr14RegexGenerator13readCharacterEiNS_12X86Registers10RegisterIDE -__ZN3JSC12StringObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE -_JSContextGetGlobalObject -__ZN3WTF13wtfThreadDataEv -_JSClassCreate -__ZN13OpaqueJSClass6createEPK17JSClassDefinition -__ZN13OpaqueJSClassC2EPK17JSClassDefinitionPS_ -__ZN3WTF7Unicode18convertUTF8ToUTF16EPPKcS2_PPtS4_b -_JSClassRetain -_JSObjectMake -__ZN3JSC16JSCallbackObjectINS_8JSObjectEE4initEPNS_9ExecStateE -__ZN13OpaqueJSClass9prototypeEPN3JSC9ExecStateE -__ZN13OpaqueJSClass11contextDataEPN3JSC9ExecStateE -__ZN3WTF9HashTableIP13OpaqueJSClassSt4pairIS2_P24OpaqueJSClassContextDataENS_18PairFirstExtractorIS6_EENS_7PtrHashIS2_EENS_14Pa -__ZN24OpaqueJSClassContextDataC2EP13OpaqueJSClass -_JSStringCreateWithUTF8CString -_JSObjectSetProperty -__ZN3JSC12APIEntryShimC1EPNS_9ExecStateEb -__ZNK14OpaqueJSString10identifierEPN3JSC12JSGlobalDataE -_JSClassRelease -_JSContextGetGlobalContext -_JSGlobalContextRetain -_JSObjectGetProperty -_JSValueToObject -_JSValueProtect -_JSObjectIsFunction -_JSObjectCallAsFunction -__ZN3JSC4callEPNS_9ExecStateENS_7JSValueENS_8CallTypeERKNS_8CallDataES2_RKNS_7ArgListE -__ZN3JSC10JSFunction4callEPNS_9ExecStateENS_7JSValueERKNS_7ArgListE -__ZN3JSC11Interpreter7executeEPNS_18FunctionExecutableEPNS_9ExecStateEPNS_10JSFunctionEPNS_8JSObjectERKNS_7ArgListEPNS_14ScopeC -__ZNK3JSC8NullNode6isNullEv -__ZN3JSC3JIT16emit_op_neq_nullEPNS_11InstructionE -__ZNK3JSC19JSStaticScopeObject14isDynamicScopeERb -__ZN3JSC12RegExpObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSCL19regExpProtoFuncTestEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK3JSC12RegExpObject9classInfoEv -__ZN3JSC12RegExpObject4testEPNS_9ExecStateERKNS_7ArgListE -__ZN3JSC12RegExpObject5matchEPNS_9ExecStateERKNS_7ArgListE -__ZN3JSC6RegExp5matchERKNS_7UStringEiPN3WTF6VectorIiLm32EEE -__ZN3JSC9WhileNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC15StrictEqualNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC3JIT16emit_op_stricteqEPNS_11InstructionE -__ZN3JSC3JIT17compileOpStrictEqEPNS_11InstructionENS0_21CompileOpStrictEqTypeE -__ZN3JSC3JIT17emit_op_nstricteqEPNS_11InstructionE -__ZN3JSC3JIT20emitSlow_op_stricteqEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC3JIT21emitSlow_op_nstricteqEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC12ContinueNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator14continueTargetERKNS_10IdentifierE -__ZN3JSCL7dateNowEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -_cti_op_get_by_val -__ZN7WebCore10StringImpl5upperEv -_cti_op_get_by_id_generic -_cti_op_put_by_id_fail -__ZNK3JSC7UString8toUInt32EPbb -__ZNK3JSC7UString8toDoubleEbb -__ZNK3JSC7UString10UTF8StringEb -__ZN3JSC18globalFuncParseIntEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC12nonInlineNaNEv -__ZN3JSC15toInt32SlowCaseEdRb -__ZN3JSCL8parseIntERKNS_7UStringEi -__ZN3JSC15globalFuncIsNaNEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK7WebCore6String8toDoubleEPb -__ZN7WebCore10StringImpl8toDoubleEPb -__ZN3JSC4Yarr6ParserINS0_23RegexPatternConstructorEE11parseEscapeILb1ENS3_28CharacterClassParserDelegateEEEbRT0_ -__ZN3JSC4Yarr12spacesCreateEv -__ZN3WTF6VectorIN3JSC4Yarr14CharacterRangeELm0EE14expandCapacityEmPKS3_ -__ZN3WTF6VectorIN3JSC4Yarr14CharacterRangeELm0EE14expandCapacityEm -__ZN3JSC4Yarr25CharacterClassConstructor6appendEPKNS0_14CharacterClassE -__ZN3JSC4Yarr25CharacterClassConstructor14addSortedRangeERN3WTF6VectorINS0_14CharacterRangeELm0EEEtt -__ZN3JSC4Yarr6ParserINS0_23RegexPatternConstructorEE28CharacterClassParserDelegate20atomPatternCharacterEt -__ZN3JSC4Yarr14RegexGenerator24matchCharacterClassRangeENS_12X86Registers10RegisterIDERNS_22AbstractMacroAssemblerINS_12X86Asse -__ZN3WTF6VectorIN3JSC22AbstractMacroAssemblerINS1_12X86AssemblerEE4JumpELm16EED1Ev -_cti_op_nstricteq -__ZN3JSC27ctiPatchCallByReturnAddressEPNS_9CodeBlockENS_16ReturnAddressPtrENS_21MacroAssemblerCodePtrE -__ZNK3JSC8JSString9toBooleanEPNS_9ExecStateE -_cti_op_is_string -__ZN3JSCL16mathProtoFuncPowEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -_cti_op_get_by_id_proto_list_full -_cti_op_put_by_id_transition_realloc -_cti_timeout_check -__ZN3JSC14TimeoutChecker10didTimeOutEPNS_9ExecStateE -_cti_op_mul -__ZN3JSC4Yarr23RegexPatternConstructor25atomBuiltInCharacterClassENS0_23BuiltInCharacterClassIDEb -_cti_op_convert_this -__ZNK3JSC8JSString12toThisObjectEPNS_9ExecStateE -__ZN3JSC12StringObjectC1EN3WTF17NonNullPassRefPtrINS_9StructureEEEPNS_8JSStringE -__ZN3JSCL22stringProtoFuncReplaceEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK3JSC7JSValue12toThisObjectEPNS_9ExecStateE -__ZNK3JSC8JSObject8toStringEPNS_9ExecStateE -__ZNK3JSC8JSObject11toPrimitiveEPNS_9ExecStateENS_22PreferredPrimitiveTypeE -__ZNK3JSC8JSObject12defaultValueEPNS_9ExecStateENS_22PreferredPrimitiveTypeE -__ZN3JSCL23stringProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK3JSC12StringObject9classInfoEv -__ZN7WebCore10StringImpl4costEv -__ZN3JSC6JSCell11getCallDataERNS_8CallDataE -__ZN3JSC24charCodeAtThunkGeneratorEPNS_12JSGlobalDataEPNS_14ExecutablePoolE -__ZN3JSCL14stringCharLoadERNS_19SpecializedThunkJITE -_cti_op_get_by_val_string -_JSValueToBoolean -_JSValueUnprotect -_JSGlobalContextRelease -__ZN3JSC4Heap17collectAllGarbageEv -__ZN3JSC4Heap9markRootsEv -__ZN3JSC4Heap30markStackObjectsConservativelyERNS_9MarkStackE -__ZN3JSC4Heap31markCurrentThreadConservativelyERNS_9MarkStackE -__ZN3JSC4Heap39markCurrentThreadConservativelyInternalERNS_9MarkStackE -__ZN3JSC4Heap18markConservativelyERNS_9MarkStackEPvS3_ -__ZN3JSC9MarkStack12markChildrenEPNS_6JSCellE -__ZN3JSC8JSObject12markChildrenERNS_9MarkStackE -__ZN3JSC14JSGlobalObject12markChildrenERNS_9MarkStackE -__ZN3JSCL12markIfNeededERNS_9MarkStackENS_7JSValueE -__ZN3JSC10JSFunction12markChildrenERNS_9MarkStackE -__ZN3JSC18FunctionExecutable13markAggregateERNS_9MarkStackE -__ZN3JSC12JSActivation12markChildrenERNS_9MarkStackE -__ZN3JSC15JSWrapperObject12markChildrenERNS_9MarkStackE -__ZN3JSC7JSArray12markChildrenERNS_9MarkStackE -__ZN3JSC18GlobalEvalFunction12markChildrenERNS_9MarkStackE -__ZN3JSC9CodeBlock13markAggregateERNS_9MarkStackE -__ZN3JSC16JSCallbackObjectINS_8JSObjectEE12markChildrenERNS_9MarkStackE -__ZN3JSC19JSStaticScopeObject12markChildrenERNS_9MarkStackE -__ZN3JSC9MarkStack12releaseStackEPvm -__ZN3JSC4Heap20markProtectedObjectsERNS_9MarkStackE -__ZN3JSC12SmallStrings12markChildrenERNS_9MarkStackE -__ZN3JSC9MarkStack7compactEv -__ZN3JSC4Heap5sweepEv -__ZN3JSC12DateInstanceD1Ev -__ZN3JSC9CodeBlock13unlinkCallersEv -__ZN3JSC8JSObjectD1Ev -__ZN3JSC12JSActivationD1Ev -__ZN3JSC12JSActivationD2Ev -__ZN3JSC12StringObjectD1Ev -__ZN3JSC4Heap12resizeBlocksEv -__ZN3WTF6VectorIPN3JSC14ExpressionNodeELm8EE14expandCapacityEm -__ZN3WTF6VectorIPNS0_IN3JSC10RegisterIDELm32EEELm32EE14expandCapacityEmPKS4_ -__ZN3WTF6VectorIPNS0_IN3JSC10RegisterIDELm32EEELm32EE15reserveCapacityEm -__ZN3JSC8VoidNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC4Yarr6ParserINS0_23RegexPatternConstructorEE15parseQuantifierEbjj -__ZN3JSC4Yarr14RegexGenerator19TermGenerationState15jumpToBacktrackERNS_22AbstractMacroAssemblerINS_12X86AssemblerEE8JumpListEP -__ZN3JSC4Yarr14wordcharCreateEv -__ZN3JSC4Yarr12digitsCreateEv -__ZN3JSC4Yarr14RegexGenerator30generatePatternCharacterGreedyERNS1_19TermGenerationStateE -__ZN3WTF6VectorINS_6RefPtrIN3JSC10RegisterIDEEELm16EE14expandCapacityEm -___initializeScavenger_block_invoke_1 -__Z22TCMalloc_SystemReleasePvm -__Z21TCMalloc_SystemCommitPvm -__ZNK3JSC7JSValue20toThisObjectSlowCaseEPNS_9ExecStateE -__ZN3JSCL19mathProtoFuncRandomEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK3JSC7JSValue19synthesizePrototypeEPNS_9ExecStateE -__ZN3JSCL23numberProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC17NumberConstructor18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSCL25numberConstructorMaxValueEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZN3JSC18sqrtThunkGeneratorEPNS_12JSGlobalDataEPNS_14ExecutablePoolE -__ZN3JSC3JIT26privateCompileGetByIdProtoEPNS_17StructureStubInfoEPNS_9StructureES4_RKNS_10IdentifierERKNS_12PropertySlotEmNS_16 -__ZN3JSC8JSObject3putEPNS_9ExecStateEjNS_7JSValueE -__ZN3JSC10Identifier4fromEPNS_9ExecStateEj -__ZN3JSC4Yarr13newlineCreateEv -__ZN3JSC4Yarr14RegexGenerator29generateAssertionWordBoundaryERNS1_19TermGenerationStateE -__ZN3JSC4Yarr14RegexGenerator22matchAssertionWordcharERNS1_19TermGenerationStateERNS_22AbstractMacroAssemblerINS_12X86Assembler -__ZN3JSCL26stringProtoFuncToLowerCaseEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL22stringProtoFuncIndexOfEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK3JSC7UString4findERKS0_j -__ZN3JSC17RegExpConstructor18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC17RegExpConstructor16getConstructDataERNS_13ConstructDataE -__ZN3JSCL30constructWithRegExpConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE -__ZN3JSC15constructRegExpEPNS_9ExecStateERKNS_7ArgListE -__ZNK3JSC6JSCell9classInfoEv -__ZN3JSCL19regExpProtoFuncExecEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC12RegExpObject4execEPNS_9ExecStateERKNS_7ArgListE +__ZN3WTF6VectorIN3JSC4Yarr13YarrGenerator17BacktrackingState19ReturnAddressRecordELm4EE14expandCapacityEm +__ZN3JSCL19regExpProtoFuncExecEPNS_9ExecStateE +__ZN3JSC12RegExpObject4execEPNS_9ExecStateE __ZNK3JSC17RegExpConstructor14arrayOfMatchesEPNS_9ExecStateE __ZN3JSC18RegExpMatchesArrayC2EPNS_9ExecStateEPNS_24RegExpConstructorPrivateE -__ZN3JSC7JSArrayC2EN3WTF17NonNullPassRefPtrINS_9StructureEEEj +__ZN3JSC7JSArrayC2ERNS_12JSGlobalDataEPNS_9StructureEjNS_17ArrayCreationModeE __ZN3JSC7JSArray15setSubclassDataEPv -__ZN3JSCL24regExpConstructorDollar1EPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZNK3JSC17RegExpConstructor10getBackrefEPNS_9ExecStateEj -__ZN3JSC20globalFuncParseFloatEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -_cti_op_put_by_id_generic -__ZN3JSC17BytecodeGenerator29uncheckedRegisterForArgumentsEv -__ZN3JSC3JIT22emit_op_init_argumentsEPNS_11InstructionE -__ZN3JSC3JIT24emit_op_create_argumentsEPNS_11InstructionE -__ZN3JSC20MacroAssemblerX86_6413branchTestPtrENS_23MacroAssemblerX86Common9ConditionENS_22AbstractMacroAssemblerINS_12X86Assemb -_cti_op_load_varargs -__ZN3JSC3JIT19patchPutByIdReplaceEPNS_9CodeBlockEPNS_17StructureStubInfoEPNS_9StructureEmNS_16ReturnAddressPtrE -__ZN3JSC21ThrowableBinaryOpNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSCL20stringProtoFuncSplitEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -_cti_op_in -__ZN3JSCL19arrayProtoFuncShiftEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK3JSC7JSValue8toUInt32EPNS_9ExecStateE -__ZN3JSC7JSArray18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE -__ZN3JSC7JSArray14deletePropertyEPNS_9ExecStateEj -__ZN3JSC7JSArray3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE -__ZN3JSC7JSArray9setLengthEj -__ZN3JSC23CallFunctionCallDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator25emitJumpIfNotFunctionCallEPNS_10RegisterIDEPNS_5LabelE -_cti_op_create_arguments -__ZN3JSC9Arguments18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC3JIT30privateCompileGetByIdProtoListEPNS_17StructureStubInfoEPNS_30PolymorphicAccessStructureListEiPNS_9StructureES6_RK -__ZN3JSC9ForInNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator20emitGetPropertyNamesEPNS_10RegisterIDES2_S2_S2_PNS_5LabelE -__ZN3WTF6VectorIN3JSC12ForInContextELm0EE15reserveCapacityEm -__ZN3JSC17BytecodeGenerator20emitNextPropertyNameEPNS_10RegisterIDES2_S2_S2_S2_PNS_5LabelE -__ZN3JSC3JIT18emit_op_get_pnamesEPNS_11InstructionE -__ZN3JSC3JIT20emit_op_get_by_pnameEPNS_11InstructionE -__ZN3JSC3JIT22compileGetDirectOffsetENS_12X86Registers10RegisterIDES2_S2_S2_S2_ -__ZN3JSC3JIT18emit_op_next_pnameEPNS_11InstructionE -__ZN3JSC3JIT24emitSlow_op_get_by_pnameEPNS_11InstructionERPNS_13SlowCaseEntryE -_cti_op_get_pnames -__ZN3JSC22JSPropertyNameIterator6createEPNS_9ExecStateEPNS_8JSObjectE -__ZN3JSC8JSObject16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE -__ZN3JSC8JSObject19getOwnPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE -__ZN3JSC9Structure16getPropertyNamesERNS_17PropertyNameArrayENS_15EnumerationModeE -__ZN3JSCL29objectProtoFuncHasOwnPropertyEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK3JSC8JSObject14hasOwnPropertyEPNS_9ExecStateERKNS_10IdentifierE -__ZN3JSC8JSObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -_cti_op_typeof -__ZN3JSC20jsTypeStringForValueEPNS_9ExecStateENS_7JSValueE -__ZN3JSC9Structure27despecifyFunctionTransitionEPS0_RKNS_10IdentifierE -_cti_has_property -__ZN3JSC3JIT26emit_op_tear_off_argumentsEPNS_11InstructionE -__ZN3JSCL19arrayProtoFuncSliceEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL11getPropertyEPNS_9ExecStateEPNS_8JSObjectEj -__ZN3JSC9Arguments18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE -_cti_op_tear_off_arguments -__ZN3JSC10JSFunction19getOwnPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE -__ZNK3JSC10JSFunction9classInfoEv -__ZN3JSC17DeleteBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator15emitDeleteByValEPNS_10RegisterIDES2_S2_ -__ZN3JSC8JSObject18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE -_cti_op_del_by_val -__ZN3JSC8JSObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE -_cti_op_is_boolean -__ZN3JSC10SwitchNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC13CaseBlockNode20emitBytecodeForBlockERNS_17BytecodeGeneratorEPNS_10RegisterIDES4_ -__ZN3JSC13CaseBlockNode18tryOptimizedSwitchERN3WTF6VectorIPNS_14ExpressionNodeELm8EEERiS7_ -__ZN3JSCL17processClauseListEPNS_14ClauseListNodeERN3WTF6VectorIPNS_14ExpressionNodeELm8EEERNS_10SwitchKindERbRiSB_ -__ZN3JSC17BytecodeGenerator11beginSwitchEPNS_10RegisterIDENS_10SwitchInfo10SwitchTypeE -__ZN3WTF6VectorIN3JSC10SwitchInfoELm0EE14expandCapacityEm -__ZN3JSC17BytecodeGenerator9endSwitchEjPN3WTF6RefPtrINS_5LabelEEEPPNS_14ExpressionNodeEPS3_ii -__ZN3WTF6VectorIN3JSC15SimpleJumpTableELm0EE14expandCapacityEm -__ZNK3JSC5Label4bindEii -__ZN3JSC3JIT18emit_op_switch_immEPNS_11InstructionE -__ZN3WTF6VectorIN3JSC12SwitchRecordELm0EE14expandCapacityEm -__ZN3WTF6VectorIN3JSC17CodeLocationLabelELm0EE4growEm -_cti_op_switch_imm -__ZN3JSC4Yarr23RegexPatternConstructor8copyTermERNS0_11PatternTermE -__ZL14compileBracketiPiPPhPPKtS3_P9ErrorCodeiS_S_R11CompileData -__ZL32branchFindFirstAssertedCharacterPKhb -__ZL20branchNeedsLineStartPKhjj -__ZL17bracketIsAnchoredPKh -_cti_op_get_by_id_array_fail -__ZN3JSC17PropertyNameArray3addEPN7WebCore10StringImplE -__ZN3WTF7HashSetIPN7WebCore10StringImplENS_7PtrHashIS3_EENS_10HashTraitsIS3_EEE3addERKS3_ -__ZN3WTF9HashTableIPN7WebCore10StringImplES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E6rehashEi -__ZN3WTF6VectorIN3JSC10IdentifierELm20EE14expandCapacityEm -__ZN3JSCL28numberConstructorPosInfinityEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZN3JSCL28numberConstructorNegInfinityEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZN3JSC4Heap5resetEv -__ZN3JSC9Arguments12markChildrenERNS_9MarkStackE -__ZN3JSC22JSPropertyNameIterator12markChildrenERNS_9MarkStackE -__ZN3JSC3JIT10unlinkCallEPNS_12CallLinkInfoE -__ZN3JSC9LabelNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC18RegExpMatchesArray18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE +__ZNK3JSC7JSArray12subclassDataEv +__ZN3JSC18RegExpMatchesArray17fillArrayInstanceEPNS_9ExecStateE +__ZN3JSCL20stringProtoFuncMatchEPNS_9ExecStateE +__ZN3JSC4Yarr22YarrPatternConstructor25atomBuiltInCharacterClassENS0_23BuiltInCharacterClassIDEb +__ZN3JSC4Yarr12spacesCreateEv +__ZN3JSC28globalFuncDecodeURIComponentEPNS_9ExecStateE +__ZN3JSCL6decodeEPNS_9ExecStateEPKcb +__ZN3WTF6VectorItLm64EE9tryAppendItEEbPKT_m +__ZN3WTF7Unicode18UTF8SequenceLengthEc +__ZN3WTF7Unicode18decodeUTF8SequenceEPKc +__ZN3WTF6VectorItLm64EE18tryReserveCapacityEm +__ZN3JSCL24stringProtoFuncSubstringEPNS_9ExecStateE +__ZN3JSC16globalFuncEscapeEPNS_9ExecStateE +__ZN3JSC16ArrayConstructor16getConstructDataERNS_13ConstructDataE +__ZN3JSCL29constructWithArrayConstructorEPNS_9ExecStateE +__ZN3JSCL27constructArrayWithSizeQuirkEPNS_9ExecStateERKNS_7ArgListE +__ZN3JSC13PrefixDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator11emitPostDecEPNS_10RegisterIDES2_ +__ZN3JSC3JIT16emit_op_post_decEPNS_11InstructionE +__ZN3JSC3JIT20emitSlow_op_post_decEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC3JIT22emit_op_loop_if_lesseqEPNS_11InstructionE +__ZN3JSC3JIT26emitSlow_op_loop_if_lesseqEPNS_11InstructionERPNS_13SlowCaseEntryE +_cti_op_pre_dec +__ZN3JSC7JSArray19getOwnPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE +__ZN3JSC10Identifier4fromEPNS_9ExecStateEj +__ZN3JSC7UString6numberEj +__ZN3JSC17PropertyNameArray3addEPN3WTF10StringImplE +__ZN3JSC9ExecState19arrayPrototypeTableEPS0_ +__ZN3JSC3JIT22emit_op_put_scoped_varEPNS_11InstructionE +__ZN3JSC12JSGlobalData15getHostFunctionEPFPvPNS_9ExecStateEEPFNS_21MacroAssemblerCodePtrEPS0_PNS_14ExecutablePoolEE +__ZN3JSC9JITThunks16hostFunctionStubEPNS_12JSGlobalDataEPFPvPNS_9ExecStateEEPFNS_21MacroAssemblerCodePtrES2_PNS_14ExecutablePoolEE +__ZN3JSC20charAtThunkGeneratorEPNS_12JSGlobalDataEPNS_14ExecutablePoolE +__ZN3JSCL14stringCharLoadERNS_19SpecializedThunkJITE +__ZN3JSCL12charToStringERNS_19SpecializedThunkJITEPNS_12JSGlobalDataENS_12X86Registers10RegisterIDES5_S5_ +__ZN3JSC19SpecializedThunkJIT8finalizeENS_21MacroAssemblerCodePtrE +__ZN3JSC10JSFunctionC1EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEiRKNS_10IdentifierEPNS_16NativeExecutableE +__ZN3JSC10JSFunctionC2EPNS_9ExecStateEPNS_14JSGlobalObjectEPNS_9StructureEiRKNS_10IdentifierEPNS_16NativeExecutableE +__ZN3JSCL21stringProtoFuncCharAtEPNS_9ExecStateE +__ZN3WTF14FastMallocZone9forceLockEP14_malloc_zone_t +__ZN3WTF14FastMallocZone11forceUnlockEP14_malloc_zone_t +__ZN3WTF6VectorIPN3JSC9StructureELm8EE14expandCapacityEm +__ZN3JSCL21stringProtoFuncSearchEPNS_9ExecStateE +__ZN3JSC3JIT30privateCompileGetByIdProtoListEPNS_17StructureStubInfoEPNS_30PolymorphicAccessStructureListEiPNS_9StructureES6_RKNS_10IdentifierERKNS_12PropertySlotEmPNS_9ExecStateE +__ZN3WTF6VectorItLm0EE14expandCapacityEmPKt +__ZN3JSC4Yarr13YarrGenerator24matchCharacterClassRangeENS_12X86Registers10RegisterIDERNS_22AbstractMacroAssemblerINS_12X86AssemblerEE8JumpListES8_PKNS0_14CharacterRangeEjPjPKtj +__ZN3JSC12X86Assembler23X86InstructionFormatter11memoryModRMEiNS_12X86Registers10RegisterIDES3_ii +__ZN3JSC23MacroAssemblerX86Common8branch32ENS0_19RelationalConditionENS_12X86Registers10RegisterIDES3_ +__ZN3JSC4Yarr13YarrGenerator17BacktrackingState24takeBacktracksToJumpListERNS_22AbstractMacroAssemblerINS_12X86AssemblerEE8JumpListEPNS_14MacroAssemblerE +_cti_op_get_by_id_proto_list_full +__ZN3WTF6VectorIN3JSC4Yarr13YarrGenerator6YarrOpELm128EE14expandCapacityEmPKS4_ +__ZN3WTF6VectorIN3JSC4Yarr13YarrGenerator6YarrOpELm128EE15reserveCapacityEm +__ZN3JSCL26stringProtoFuncLastIndexOfEPNS_9ExecStateE +__ZNK3JSC7JSValue20toIntegerPreserveNaNEPNS_9ExecStateE +__ZN3JSC17RegExpConstructor16getConstructDataERNS_13ConstructDataE +__ZN3JSCL30constructWithRegExpConstructorEPNS_9ExecStateE +__ZN3JSC15constructRegExpEPNS_9ExecStateEPNS_14JSGlobalObjectERKNS_7ArgListE +__ZNK3JSC7JSValue19synthesizePrototypeEPNS_9ExecStateE +__ZN3JSC16BooleanPrototype18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC3JIT22compileGetDirectOffsetENS_12X86Registers10RegisterIDES2_PNS_9StructureEm +__ZN3JSC3JIT15emit_op_resolveEPNS_11InstructionE +_JSWeakObjectMapRemove +__ZN3WTF7HashMapIPvPN3JSC7JSValueENS_7PtrHashIS1_EENS_10HashTraitsIS1_EENS7_IS4_EEE4takeERKS1_ +_JSObjectSetPrivate +_cti_op_put_by_id_fail +__ZN3JSC4Heap16allocateSlowCaseEm +__ZN3JSC9CodeBlock14visitAggregateERNS_9MarkStackE +__ZN3JSC13EvalCodeCache14visitAggregateERNS_9MarkStackE +__ZN3JSC17StructureStubInfo14visitAggregateERNS_9MarkStackE +__ZN3JSC14StructureChain13visitChildrenERNS_9MarkStackE +__ZN3JSC12JSActivation13visitChildrenERNS_9MarkStackE +__ZN3JSC15WeakHandleOwner26isReachableFromOpaqueRootsENS_6HandleINS_7UnknownEEEPvRNS_9MarkStackE +__ZN3JSC9WeakGCMapIPvNS_8JSObjectENS_33DefaultWeakGCMapFinalizerCallbackIS1_S2_EEN3WTF7PtrHashIS1_EENS5_10HashTraitsIS1_EEE8finalizeENS_6HandleINS_7UnknownEEES1_ +__ZN3JSC20JSCallbackObjectData8finalizeENS_6HandleINS_7UnknownEEEPv +__ZN3WTF7HashMapISt4pairINS_6RefPtrINS_10StringImplEEEjEPN3JSC7JSValueENS6_24StructureTransitionTable4HashENS9_10HashTraitsENS_10HashTraitsIS8_EEE4takeERKS5_ __ZN3JSC12RegExpObjectD1Ev +__ZN3JSC12JSActivationD1Ev +__ZN3JSC16JSCallbackObjectINS_24JSObjectWithGlobalObjectEED1Ev +__ZN3JSC20JSCallbackObjectDataD0Ev +_JSClassRelease +__ZN3JSC15WeakHandleOwnerD2Ev +__ZN3JSC14ExecutablePool13systemReleaseERNS0_10AllocationE +__ZN3WTF11OSAllocator8decommitEPvm __ZN3JSC18RegExpMatchesArrayD1Ev -__ZNK3JSC7JSArray12subclassDataEv -__ZN3JSC15ObjectPrototype18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE __ZN3JSC22JSPropertyNameIteratorD1Ev -__ZN3JSC22JSPropertyNameIteratorD2Ev -__ZNK3JSC7JSArray9classInfoEv -__ZN3JSC7JSArray15copyToRegistersEPNS_9ExecStateEPNS_8RegisterEj +__ZN3JSC14StructureChainD1Ev +__ZN3JSC18JSCallbackFunctionD1Ev +__ZN3JSC9WeakGCMapISt4pairIN3WTF6RefPtrINS2_10StringImplEEEjENS_9StructureENS_24StructureTransitionTable26WeakGCMapFinalizerCallbackENS8_4HashENS8_10HashTraitsEE8finalizeENS_6HandleINS_7UnknownEEEPv +__ZN3JSC9WeakGCMapISt4pairIN3WTF6RefPtrINS2_10StringImplEEEjENS_9StructureENS_24StructureTransitionTable26WeakGCMapFinalizerCallbackENS8_4HashENS8_10HashTraitsEED0Ev +__ZN3JSC9WeakGCMapISt4pairIN3WTF6RefPtrINS2_10StringImplEEEjENS_9StructureENS_24StructureTransitionTable26WeakGCMapFinalizerCallbackENS8_4HashENS8_10HashTraitsEED1Ev +__ZN3JSC18FunctionExecutableD1Ev +_cti_op_put_by_id_transition_realloc +__ZN3JSC22createNotAnObjectErrorEPNS_9ExecStateENS_7JSValueE +__ZN3JSC11makeUStringIPKcNS_7UStringES2_EES3_T_T0_T1_ +__ZN3WTF13tryMakeStringIPKcN3JSC7UStringES2_EENS_10PassRefPtrINS_10StringImplEEET_T0_T1_ +__ZN3JSC15createTypeErrorEPNS_9ExecStateERKNS_7UStringE +__ZN3JSC13ErrorInstance6createEPNS_12JSGlobalDataEPNS_9StructureERKNS_7UStringE +__ZN3JSC13ErrorInstanceC2EPNS_12JSGlobalDataEPNS_9StructureERKNS_7UStringE +__ZN3JSC10throwErrorEPNS_9ExecStateEPNS_8JSObjectE +__ZN3JSC13JSNotAnObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSCL23returnToThrowTrampolineEPNS_12JSGlobalDataENS_16ReturnAddressPtrERS2_ +_ctiVMThrowTrampoline +_cti_vm_throw +__ZN3JSC11Interpreter14throwExceptionERPNS_9ExecStateERNS_7JSValueEj +__ZNK3JSC13ErrorInstance15isErrorInstanceEv +__ZNK3JSC8JSObject13exceptionTypeEv +__ZN3JSC9CodeBlock24handlerForBytecodeOffsetEj +__ZN3JSC11Interpreter15unwindCallFrameERPNS_9ExecStateENS_7JSValueERjRPNS_9CodeBlockE +_ctiOpThrowNotCaught +__ZN3JSC14ErrorPrototype18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSCL22errorProtoFuncToStringEPNS_9ExecStateE +__ZN3WTF13tryMakeStringIN3JSC7UStringEPKcS2_EENS_10PassRefPtrINS_10StringImplEEET_T0_T1_ +__ZN3JSC13JSNotAnObjectD1Ev +__ZN3JSC13ErrorInstanceD1Ev +__ZN3WTF10StringImpl16findIgnoringCaseEPKcj +_cti_op_is_undefined +__ZN3JSC21ReadModifyResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17NumberConstructor18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC13jsAddSlowCaseEPNS_9ExecStateENS_7JSValueES2_ +__ZNK3JSC8JSString11toPrimitiveEPNS_9ExecStateENS_22PreferredPrimitiveTypeE +__ZN3JSC3JIT19patchPutByIdReplaceEPNS_9CodeBlockEPNS_17StructureStubInfoEPNS_9StructureEmNS_16ReturnAddressPtrEb +_cti_op_get_by_id_getter_stub +__ZN3JSC10ASTBuilder11makeDivNodeEPNS_14ExpressionNodeES2_b +__ZN3JSC3JIT11emit_op_divEPNS_11InstructionE +__ZN3JSC3JIT15emitSlow_op_divEPNS_11InstructionERPNS_13SlowCaseEntryE +_cti_op_lesseq +__ZN3JSC9Structure24removePropertyTransitionERNS_12JSGlobalDataEPS0_RKNS_10IdentifierERm +__ZN3JSC9Structure6removeERKNS_10IdentifierE +__ZN3WTF6VectorIjLm0EE14expandCapacityEm +__ZN3JSC9Structure31removePropertyWithoutTransitionERNS_12JSGlobalDataERKNS_10IdentifierE +__ZN3JSC12GetterSetter13visitChildrenERNS_9MarkStackE +__ZN3JSC9Arguments13visitChildrenERNS_9MarkStackE +__ZN3JSC14JSGlobalObject17WeakMapsFinalizer8finalizeENS_6HandleINS_7UnknownEEEPv +__ZN3JSC12StringObjectD1Ev __ZN3JSC9ArgumentsD1Ev __ZN3JSC9ArgumentsD2Ev -__ZN3JSC7UString4fromEd -__ZN3WTF32doubleToStringInJavaScriptFormatEdPcPj -__ZN3WTF4dtoaEPcdiPiS1_PS0_ -__ZN3JSC10Identifier11addSlowCaseEPNS_12JSGlobalDataEPN7WebCore10StringImplE -__ZN3WTF6VectorIPN3JSC9StructureELm8EE14expandCapacityEm -_cti_op_resolve_base -__ZN3JSC12JSActivation18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC20charAtThunkGeneratorEPNS_12JSGlobalDataEPNS_14ExecutablePoolE -__ZN3JSCL21stringProtoFuncCharAtEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC17PrefixBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC14PostfixDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator11emitPostIncEPNS_10RegisterIDES2_ -__ZN3JSC3JIT16emit_op_post_incEPNS_11InstructionE -__ZN3JSC3JIT20emitSlow_op_post_incEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC18PostfixBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator18pushFinallyContextEPNS_5LabelEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator17popFinallyContextEv -__ZN3JSC17BytecodeGenerator19highestUsedRegisterEv -__ZN3JSC17BytecodeGenerator18emitJumpSubroutineEPNS_10RegisterIDEPNS_5LabelE -__ZN3JSC17BytecodeGenerator20emitSubroutineReturnEPNS_10RegisterIDE -__ZN3JSC3JIT11emit_op_jsrEPNS_11InstructionE -__ZN3WTF6VectorIN3JSC3JIT7JSRInfoELm0EE14expandCapacityEm +__ZN3JSC19SourceProviderCacheD1Ev +__ZN3WTF20deleteAllPairSecondsIPN3JSC23SourceProviderCacheItemEKNS_7HashMapIiS3_NS_7IntHashIjEENS_10HashTraitsIiEENS7_IS3_EEEEEEvRT0_ +__ZN3WTF6VectorIN3JSC8LineInfoELm0EE14expandCapacityEm +__ZN3WTF6VectorIN3JSC19ExpressionRangeInfoELm0EE14expandCapacityEm +__ZNK3WTF6String8toDoubleEPbS1_ +__ZN3WTF6String6appendEc +__ZN3WTF6String6numberEt +__ZNK3WTF6String8foldCaseEv +__ZN3WTF10StringImpl8foldCaseEv +__ZN3JSC15NumberPrototype18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSCL23numberProtoFuncToStringEPNS_9ExecStateE +__ZN3JSC3JIT20emit_op_resolve_skipEPNS_11InstructionE +_cti_op_resolve_skip +__ZN3JSC19SourceProviderCache5clearEv +__ZN3WTF11OSAllocator18releaseDecommittedEPvm +__ZN3WTFeqERKNS_12AtomicStringEPKc +_JSStringIsEqualToUTF8CString +__ZN3JSC12RegisterFile17GlobalObjectOwner8finalizeENS_6HandleINS_7UnknownEEEPv +__ZN3JSC12GetterSetterD1Ev +__ZN3WTF6VectorIPNS0_IN3JSC10IdentifierELm64EEELm32EE14expandCapacityEm +__ZNK3WTF6String18simplifyWhiteSpaceEv +__ZN3WTF10StringImpl18simplifyWhiteSpaceEv +__ZN3JSC22JSPropertyNameIterator13visitChildrenERNS_9MarkStackE +__ZN3WTFL43initializeMainThreadToProcessMainThreadOnceEv +__ZN3WTF47initializeMainThreadToProcessMainThreadPlatformEv +__ZN3WTF6String6numberEd +__ZN3WTF10StringImpl5upperEv +__ZN3WTF6String6removeEji +__ZN3WTF6String6insertERKS0_j +__ZN3WTF6String6insertEPKtjj +__ZN3WTF10StringImpl7replaceEPS0_S1_ +__ZNK3WTF6String5splitEtbRNS_6VectorIS0_Lm0EEE +__ZN3JSC12JSGlobalData18createContextGroupENS_15ThreadStackTypeE +__ZN3JSC12JSGlobalData22clearBuiltinStructuresEv +__ZN3JSC4Heap7destroyEv +__ZN3JSC9JITThunks22clearHostFunctionStubsEv +__ZN3JSC11MarkedSpace7destroyEv +__ZN3JSC12JSGlobalDataD1Ev +__ZN3JSC12JSGlobalDataD2Ev +__ZN3JSC12RegisterFileD1Ev +__ZN3JSC12RegisterFileD2Ev +__ZNK3JSC9HashTable11deleteTableEv +__ZN3JSC5LexerD1Ev +__ZN3WTF20deleteAllPairSecondsIP24OpaqueJSClassContextDataKNS_7HashMapIP13OpaqueJSClassS2_NS_7PtrHashIS5_EENS_10HashTraitsIS5_EENS8_IS2_EEEEEEvRT0_ +__ZN24OpaqueJSClassContextDataD1Ev +__ZN24OpaqueJSClassContextDataD2Ev +__ZN3JSC17CommonIdentifiersD2Ev +__ZN3JSC21deleteIdentifierTableEPNS_15IdentifierTableE +__ZN3JSC15IdentifierTableD2Ev +__ZN3JSC4HeapD1Ev +__ZN3JSC4HeapD2Ev +__ZN3JSC14MachineThreadsD1Ev +__ZN3JSC14MachineThreadsD2Ev +__ZN3JSC25DefaultGCActivityCallbackD0Ev +__ZN3JSC9JITThunksD1Ev +__ZN3JSC12SmallStringsD1Ev +__ZN13OpaqueJSClass26createNoAutomaticPrototypeEPK17JSClassDefinition +__ZN3JSC16JSCallbackObjectINS_14JSGlobalObjectEEC2ERNS_12JSGlobalDataEP13OpaqueJSClassPNS_9StructureE +__ZN3JSC16JSCallbackObjectINS_14JSGlobalObjectEE4initEPNS_9ExecStateE +__ZN3JSC16JSCallbackObjectINS_14JSGlobalObjectEE18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN13OpaqueJSClass12staticValuesEPN3JSC9ExecStateE +__ZN13OpaqueJSClass15staticFunctionsEPN3JSC9ExecStateE +__ZN3JSC14JSGlobalObject14resetPrototypeERNS_12JSGlobalDataENS_7JSValueE +_JSReportExtraMemoryCost +_JSValueIsObject +_JSValueMakeNull +_JSObjectSetPrototype +_JSStringCreateWithCharacters +_JSValueGetType +__ZN3JSC16JSCallbackObjectINS_14JSGlobalObjectEE3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +_JSGarbageCollect +__ZN3JSC16JSCallbackObjectINS_14JSGlobalObjectEE13visitChildrenERNS_9MarkStackE +__ZN3JSC11makeUStringINS_7UStringES1_EES1_T_T0_ +__ZN3WTF13tryMakeStringIN3JSC7UStringES2_EENS_10PassRefPtrINS_10StringImplEEET_T0_ +__ZN3WTF13StringBuilder6appendEc +_JSEvaluateScript +__ZNK3JSC14JSGlobalObject17supportsProfilingEv +__ZNK3JSC14JSGlobalObject22supportsRichSourceInfoEv +__ZN3JSC8JSParser19parseThrowStatementINS_10ASTBuilderEEENT_9StatementERS3_ +__ZN3JSC9ThrowNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC3JIT13emit_op_throwEPNS_11InstructionE -__ZN3JSC3JIT12emit_op_sretEPNS_11InstructionE -__ZN3JSC21ReadModifyBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -_cti_op_lesseq -__ZN3JSCL20stringProtoFuncMatchEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC18RegExpMatchesArray18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE -__ZN3JSC18RegExpMatchesArray17fillArrayInstanceEPNS_9ExecStateE -__ZN3JSC14jsReplaceRangeEPNS_9ExecStateERKNS_7UStringEiiS4_ -__ZN3JSC18RegExpMatchesArray18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZNK3JSC8JSObject11hasPropertyEPNS_9ExecStateEj -__ZN3JSCL24stringProtoFuncSubstringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -_cti_op_create_arguments_no_params -__ZN3JSCL21arrayProtoFuncUnShiftEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -_cti_op_pre_dec -_cti_op_is_undefined -__ZN3JSC13DeleteDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator14emitDeleteByIdEPNS_10RegisterIDES2_RKNS_10IdentifierE -__ZN3JSC23FunctionCallBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC3JIT17emit_op_del_by_idEPNS_11InstructionE -_cti_op_del_by_id -__ZN3WTF37parseDateFromNullTerminatedCharactersEPKc -__ZN3WTFL37parseDateFromNullTerminatedCharactersEPKcRbRi -_cti_op_get_by_id_proto_fail -__ZN3JSC17constructFunctionEPNS_9ExecStateERKNS_7ArgListERKNS_10IdentifierERKNS_7UStringEi -__ZN3WTF6VectorItLm64EE15reserveCapacityEm +_cti_op_throw +__ZNK3JSC7JSValue16toObjectSlowCaseEPNS_9ExecStateEPNS_14JSGlobalObjectE +__ZNK3JSC8JSObject8toNumberEPNS_9ExecStateE +_JSValueIsEqual +__ZN3JSC7JSValue13equalSlowCaseEPNS_9ExecStateES0_S0_ +__ZN3JSC8JSObject18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE +__ZN3JSC10throwErrorEPNS_9ExecStateENS_7JSValueE +__ZNK3JSC8JSString8toNumberEPNS_9ExecStateE +__ZN3JSC10jsToNumberERKNS_7UStringE +_JSStringGetLength +_JSStringGetCharactersPtr +_JSStringGetMaximumUTF8CStringSize +_JSStringGetUTF8CString +_JSValueIsStrictEqual +__ZN3JSC21UStringSourceProviderD0Ev +_JSCheckScriptSyntax +__ZN3JSC11checkSyntaxEPNS_9ExecStateERKNS_10SourceCodeE +__ZN3JSC17ProgramExecutable11checkSyntaxEPNS_9ExecStateE +__ZN3WTF6VectorIN3JSC9LabelInfoELm0EE14expandCapacityEmPKS2_ +__ZN3WTF6VectorIN3JSC9LabelInfoELm0EE15reserveCapacityEm +__ZN3JSC17createSyntaxErrorEPNS_14JSGlobalObjectERKNS_7UStringE +__ZN3JSC12addErrorInfoEPNS_12JSGlobalDataEPNS_8JSObjectEiRKNS_10SourceCodeE +__ZN3JSC8JSObject17putWithAttributesEPNS_12JSGlobalDataERKNS_10IdentifierENS_7JSValueEj +_JSObjectCallAsConstructor +__ZN3JSC9constructEPNS_9ExecStateENS_7JSValueENS_13ConstructTypeERKNS_13ConstructDataERKNS_7ArgListE +__ZN3JSC11Interpreter16executeConstructEPNS_9ExecStateEPNS_8JSObjectENS_13ConstructTypeERKNS_13ConstructDataERKNS_7ArgListE +__ZN3JSC15ObjectPrototype18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE +_JSObjectSetPropertyAtIndex +_JSObjectMakeFunction +__ZN3JSC17constructFunctionEPNS_9ExecStateEPNS_14JSGlobalObjectERKNS_7ArgListERKNS_10IdentifierERKNS_7UStringEi +__ZN3JSC8JSParser8popScopeERNS0_15AutoPopScopeRefEb +__ZN3JSCL25functionProtoFuncToStringEPNS_9ExecStateE +__ZNK3JSC21UStringSourceProvider8getRangeEii +__ZNK3JSC18FunctionExecutable11paramStringEv +__ZN3WTF13tryMakeStringIPKcN3JSC7UStringES2_S4_S2_S4_EENS_10PassRefPtrINS_10StringImplEEET_T0_T1_T2_T3_T4_ +_JSObjectMakeFunctionWithCallback +_JSObjectMakeConstructor +__ZN3JSC21JSCallbackConstructorC1EPNS_14JSGlobalObjectEPNS_9StructureEP13OpaqueJSClassPFP13OpaqueJSValuePK15OpaqueJSContextS8_mPKPKS7_PSD_E +_JSPropertyNameArrayGetNameAtIndex +_JSObjectMakeDate +__ZN3JSC13constructDateEPNS_9ExecStateEPNS_14JSGlobalObjectERKNS_7ArgListE +__ZN3JSC12DateInstanceC1EPNS_9ExecStateEPNS_9StructureEd +__ZN3WTF8timeClipEd +__ZN3JSC13DatePrototype18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSCL21dateProtoFuncToStringEPNS_9ExecStateE +__ZNK3JSC12DateInstance26calculateGregorianDateTimeEPNS_9ExecStateE +__ZN3JSC21msToGregorianDateTimeEPNS_9ExecStateEdbRNS_17GregorianDateTimeE +__ZN3JSCL12getDSTOffsetEPNS_9ExecStateEdd +__ZN3WTF18calculateDSTOffsetEdd +__ZN3WTF18dateToDaysFrom1970Eiii +__ZN3JSC10formatDateERKNS_17GregorianDateTimeERA100_c +__ZN3JSC10formatTimeERKNS_17GregorianDateTimeERA100_c +__ZN3WTF13tryMakeStringIPcPKcS1_EENS_10PassRefPtrINS_10StringImplEEET_T0_T1_ +_JSObjectMakeError +__ZN3JSC13ErrorInstance6createEPNS_9ExecStateEPNS_9StructureENS_7JSValueE +_JSObjectMakeRegExp +__ZN3JSCL23regExpProtoFuncToStringEPNS_9ExecStateE +__ZN3JSCL18regExpObjectGlobalEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +__ZN3JSCL22regExpObjectIgnoreCaseEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +__ZN3JSCL21regExpObjectMultilineEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +__ZN3JSCL18regExpObjectSourceEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +__ZN3WTF13tryMakeStringIPKcN3JSC7UStringEPcEENS_10PassRefPtrINS_10StringImplEEET_T0_T1_ +__ZN13OpaqueJSClassD1Ev +__ZN13OpaqueJSClassD2Ev __ZN3JSC20EvalFunctionCallNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator12emitCallEvalEPNS_10RegisterIDES2_S2_PNS_13ArgumentsNodeEjjj +__ZN3JSC17BytecodeGenerator12emitCallEvalEPNS_10RegisterIDES2_RNS_13CallArgumentsEjjj +__ZN3JSC3JIT25emit_op_resolve_with_baseEPNS_11InstructionE __ZN3JSC3JIT17emit_op_call_evalEPNS_11InstructionE __ZN3JSC3JIT21emitSlow_op_call_evalEPNS_11InstructionERPNS_13SlowCaseEntryE -_cti_op_resolve +_cti_op_resolve_with_base +__ZN3JSC12JSActivation18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE _cti_op_call_eval -__ZN3JSC11Interpreter8callEvalEPNS_9ExecStateEPNS_12RegisterFileEPNS_8RegisterEiiRNS_7JSValueE -__ZN3JSC13LiteralParser5Lexer3lexERNS1_18LiteralParserTokenE -__ZN3JSC13LiteralParser5parseENS0_11ParserStateE -__ZN3JSC14EvalExecutable7compileEPNS_9ExecStateEPNS_14ScopeChainNodeE -__ZN3JSC6Parser5parseINS_8EvalNodeEEEN3WTF10PassRefPtrIT_EEPNS_12JSGlobalDataEPNS_8DebuggerEPNS_9ExecStateERKNS_10SourceCodeEPi -__ZN3JSC8EvalNode6createEPNS_12JSGlobalDataEPNS_14SourceElementsEPN3WTF6VectorISt4pairIPKNS_10IdentifierEjELm0EEEPNS6_IPNS_16Fu -__ZNK3JSC10ScopeChain10localDepthEv -__ZNK3JSC12JSActivation9classInfoEv -__ZN3JSC17BytecodeGeneratorC1EPNS_8EvalNodeEPKNS_8DebuggerERKNS_10ScopeChainEPN3WTF7HashMapINS9_6RefPtrIN7WebCore10StringImplEE -__ZN3JSC17BytecodeGeneratorC2EPNS_8EvalNodeEPKNS_8DebuggerERKNS_10ScopeChainEPN3WTF7HashMapINS9_6RefPtrIN7WebCore10StringImplEE +__ZN3JSC11Interpreter8callEvalEPNS_9ExecStateEPNS_12RegisterFileEPNS_8RegisterEii +__ZN3JSC14EvalExecutableC1EPNS_9ExecStateERKNS_10SourceCodeEb +__ZN3JSC14EvalExecutable15compileInternalEPNS_9ExecStateEPNS_14ScopeChainNodeE +__ZN3JSC6Parser5parseINS_8EvalNodeEEEN3WTF10PassRefPtrIT_EEPNS_14JSGlobalObjectEPNS_8DebuggerEPNS_9ExecStateERKNS_10SourceCodeEPNS_18FunctionParametersENS_18JSParserStrictnessEPPNS_8JSObjectE +__ZN3JSCL19isNonASCIIIdentPartEi +__ZN3JSC8EvalNode6createEPNS_12JSGlobalDataEPNS_14SourceElementsEPN3WTF6VectorISt4pairIPKNS_10IdentifierEjELm0EEEPNS6_IPNS_16FunctionBodyNodeELm0EEERNS5_7HashSetINS5_6RefPtrINS5_10StringImplEEENS_17IdentifierRepHashENS5_10HashTraitsISL_EEEERKNS_10SourceCodeEji +__ZN3JSC14ScopeChainNode10localDepthEv +__ZN3JSC17BytecodeGeneratorC1EPNS_8EvalNodeEPNS_14ScopeChainNodeEPN3WTF7HashMapINS5_6RefPtrINS5_10StringImplEEENS_16SymbolTableEntryENS_17IdentifierRepHashENS5_10HashTraitsIS9_EENS_26SymbolTableIndexHashTraitsEEEPNS_13EvalCodeBlockE +__ZN3JSC17BytecodeGeneratorC2EPNS_8EvalNodeEPNS_14ScopeChainNodeEPN3WTF7HashMapINS5_6RefPtrINS5_10StringImplEEENS_16SymbolTableEntryENS_17IdentifierRepHashENS5_10HashTraitsIS9_EENS_26SymbolTableIndexHashTraitsEEEPNS_13EvalCodeBlockE __ZN3JSC8EvalNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZThn16_N3JSC8EvalNodeD0Ev __ZN3JSC8EvalNodeD0Ev -__ZN3WTF9HashTableINS_6RefPtrIN7WebCore10StringImplEEESt4pairIS4_NS1_IN3JSC14EvalExecutableEEEENS_18PairFirstExtractorIS9_EENS2 -__ZN3JSC9ExecState9thisValueEv -__ZN3JSC11Interpreter7executeEPNS_14EvalExecutableEPNS_9ExecStateEPNS_8JSObjectEiPNS_14ScopeChainNodeEPNS_7JSValueE -__ZN3JSC14EvalExecutable15generateJITCodeEPNS_9ExecStateEPNS_14ScopeChainNodeE -__ZN3JSC9ThrowNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -_cti_op_throw -__ZN3JSC9CodeBlock34reparseForExceptionInfoIfNecessaryEPNS_9ExecStateE -__ZN3JSC18FunctionExecutable20reparseExceptionInfoEPNS_12JSGlobalDataEPNS_14ScopeChainNodeEPNS_9CodeBlockE -__ZN3JSC11Interpreter14throwExceptionERPNS_9ExecStateERNS_7JSValueEjb -__ZN3JSC9CodeBlock24handlerForBytecodeOffsetEj -__ZN3JSC11Interpreter15unwindCallFrameERPNS_9ExecStateENS_7JSValueERjRPNS_9CodeBlockE -__ZN3JSC9CodeBlock36hasGlobalResolveInfoAtBytecodeOffsetEj +__ZN3WTF7HashMapINS_6RefPtrINS_10StringImplEEEN3JSC12WriteBarrierINS4_14EvalExecutableEEENS_10StringHashENS_10HashTraitsIS3_EENS9_IS7_EEE3setEPS2_RKS7_ +__ZN3WTF9HashTableINS_6RefPtrINS_10StringImplEEESt4pairIS3_N3JSC12WriteBarrierINS5_14EvalExecutableEEEENS_18PairFirstExtractorIS9_EENS_10StringHashENS_14PairHashTraitsINS_10HashTraitsIS3_EENSE_IS8_EEEESF_E6expandEv +__ZN3JSC11Interpreter7executeEPNS_14EvalExecutableEPNS_9ExecStateEPNS_8JSObjectEiPNS_14ScopeChainNodeE +__ZN3JSC16JSCallbackObjectINS_14JSGlobalObjectEE20staticFunctionGetterEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +__ZN3JSC17ProgramExecutable13visitChildrenERNS_9MarkStackE +__ZN3JSC19JSStaticScopeObject13visitChildrenERNS_9MarkStackE +__ZN3JSC14EvalExecutableD1Ev +__ZN3JSC13EvalCodeBlockD0Ev +__ZN3JSC12DateInstanceD1Ev +__ZN3JSC21JSCallbackConstructorD1Ev +__ZN3JSC17TypeOfResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC3JIT20emit_op_resolve_baseEPNS_11InstructionE +__ZNK3JSC7JSValue20toThisObjectSlowCaseEPNS_9ExecStateE +_cti_op_resolve +__ZN3JSC16JSCallbackObjectINS_14JSGlobalObjectEE17staticValueGetterEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +_cti_op_resolve_base +_cti_op_typeof +__ZN3JSC20jsTypeStringForValueEPNS_9ExecStateENS_7JSValueE +__ZN3JSC16JSCallbackObjectINS_24JSObjectWithGlobalObjectEE11getCallDataERNS_8CallDataE +__ZN3JSC16JSCallbackObjectINS_24JSObjectWithGlobalObjectEE14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE _cti_op_push_new_scope -__ZN3WTF7HashMapINS_6RefPtrIN7WebCore10StringImplEEEN3JSC16SymbolTableEntryENS5_17IdentifierRepHashENS_10HashTraitsIS4_EENS5_26 __ZN3JSC19JSStaticScopeObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE __ZN3JSC12JSActivation3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE _cti_op_pop_scope -_cti_op_is_number -__ZN3JSCL20arrayProtoFuncConcatEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -_cti_op_stricteq -__ZN3JSCL20arrayProtoFuncSpliceEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK3JSC11Interpreter18retrieveLastCallerEPNS_9ExecStateERiRlRNS_7UStringERNS_7JSValueE -__ZN3JSC9CodeBlock27lineNumberForBytecodeOffsetEPNS_9ExecStateEj -__ZN3JSC8RopeImpl20destructNonRecursiveEv -__ZN3JSC8RopeImpl23derefFibersNonRecursiveERN3WTF6VectorIPS0_Lm32EEE -__ZN3JSCL17arrayProtoFuncPopEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC7JSArray3popEv -__ZN7WebCore6String6numberEd -__ZN3JSC10Identifier5equalEPKN7WebCore10StringImplEPKc -__ZNK3JSC9Arguments9classInfoEv -__ZN3JSC9Arguments15copyToRegistersEPNS_9ExecStateEPNS_8RegisterEj -__ZN3JSC14InstanceOfNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC17BytecodeGenerator14emitInstanceOfEPNS_10RegisterIDES2_S2_S2_ -__ZN3JSC3JIT18emit_op_instanceofEPNS_11InstructionE -__ZN3JSC3JIT22emitSlow_op_instanceofEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC17BytecodeGenerator11emitPostDecEPNS_10RegisterIDES2_ -__ZN3JSC3JIT16emit_op_post_decEPNS_11InstructionE -__ZN3JSC3JIT20emitSlow_op_post_decEPNS_11InstructionERPNS_13SlowCaseEntryE -_cti_op_less -__ZN3JSC13PrefixDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -_cti_op_call_NotJSFunction +__ZN3JSCL20isNonASCIIIdentStartEi +__ZN3JSC16JSCallbackObjectINS_24JSObjectWithGlobalObjectEE4callEPNS_9ExecStateE +__ZN3JSC16JSCallbackObjectINS_24JSObjectWithGlobalObjectEE16getConstructDataERNS_13ConstructDataE +__ZN3JSC16JSCallbackObjectINS_24JSObjectWithGlobalObjectEE9constructEPNS_9ExecStateE +_cti_op_instanceof +__ZN3JSC16JSCallbackObjectINS_24JSObjectWithGlobalObjectEE11hasInstanceEPNS_9ExecStateENS_7JSValueES5_ +__ZN3JSC16JSCallbackObjectINS_24JSObjectWithGlobalObjectEE19getOwnPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE +_JSPropertyNameAccumulatorAddName +__ZN3JSC17ObjectConstructor18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSCL41objectConstructorGetOwnPropertyDescriptorEPNS_9ExecStateE +__ZN3JSC16JSCallbackObjectINS_24JSObjectWithGlobalObjectEE24getOwnPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE +__ZN3JSC18PropertyDescriptor15setConfigurableEb +__ZN3JSC18PropertyDescriptor13setEnumerableEb +__ZNK3JSC18PropertyDescriptor20isAccessorDescriptorEv +__ZNK3JSC18PropertyDescriptor8writableEv +__ZNK3JSC18PropertyDescriptor10enumerableEv +__ZNK3JSC18PropertyDescriptor12configurableEv +__ZN3JSC20createReferenceErrorEPNS_9ExecStateERKNS_7UStringE +__ZN3JSC12hasErrorInfoEPNS_9ExecStateEPNS_8JSObjectE +__ZN3JSC9CodeBlock27lineNumberForBytecodeOffsetEj +__ZN3JSC12addErrorInfoEPNS_9ExecStateEPNS_8JSObjectEiRKNS_10SourceCodeE +__ZN3JSC8JSObject24getOwnPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE +__ZN3JSC15constructNumberEPNS_9ExecStateEPNS_14JSGlobalObjectENS_7JSValueE +__ZN3JSC3JIT19emit_op_to_jsnumberEPNS_11InstructionE +__ZN3JSC3JIT23emitSlow_op_to_jsnumberEPNS_11InstructionERPNS_13SlowCaseEntryE +_cti_op_to_jsnumber +__ZNK3JSC16JSCallbackObjectINS_24JSObjectWithGlobalObjectEE8toNumberEPNS_9ExecStateE +__ZN3JSC23objectProtoFuncToStringEPNS_9ExecStateE +__ZNK3JSC16JSCallbackObjectINS_24JSObjectWithGlobalObjectEE9classNameEv __ZN3JSC17StringConstructor11getCallDataERNS_8CallDataE -__ZN3JSCL21callStringConstructorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK3JSC8JSString8toNumberEPNS_9ExecStateE -__ZNK3JSC7UString8toDoubleEv +__ZN3JSCL21callStringConstructorEPNS_9ExecStateE +__ZNK3JSC16JSCallbackObjectINS_24JSObjectWithGlobalObjectEE8toStringEPNS_9ExecStateE +_cti_op_sub +__ZN3JSC21JSCallbackConstructor16getConstructDataERNS_13ConstructDataE +__ZN3JSCL19constructJSCallbackEPNS_9ExecStateE +_cti_op_to_primitive +__ZN3JSCL22objectProtoFuncValueOfEPNS_9ExecStateE +_cti_op_jmp_scopes +__ZN3JSC24createStackOverflowErrorEPNS_9ExecStateE +__ZN3JSC16createRangeErrorEPNS_9ExecStateERKNS_7UStringE +__ZN3JSC9Structure27despecifyFunctionTransitionERNS_12JSGlobalDataEPS0_RKNS_10IdentifierE +__ZN3JSC13PropertyTableC2ERNS_12JSGlobalDataEPNS_6JSCellERKS0_ +_cti_op_mul +__ZNK3JSC8JSObject9classNameEv +__ZN3JSC12RegisterFile21releaseExcessCapacityEv +__ZN3JSC16JSCallbackObjectINS_14JSGlobalObjectEED1Ev +__ZN3JSC19JSStaticScopeObjectD1Ev +__ZN3JSC12NumberObjectD1Ev +_JSObjectHasProperty +_JSObjectGetPrototype +__ZN3JSC8JSObject15unwrappedObjectEv +__ZN3JSC11createErrorEPNS_9ExecStateERKNS_7UStringE +__ZN3JSC12JSGlobalData6createENS_15ThreadStackTypeE +__ZN3JSC8JSObject17putDirectFunctionEPNS_9ExecStateEPNS_10JSFunctionEj +__ZNK3JSC7UString4utf8Eb +__ZN3JSC12JSGlobalData13startSamplingEv +__ZN3JSC11Interpreter13startSamplingEv +__ZN3JSC15DateConstructor16getConstructDataERNS_13ConstructDataE +__ZN3JSCL28constructWithDateConstructorEPNS_9ExecStateE +__ZN3JSC21gregorianDateTimeToMSEPNS_9ExecStateERKNS_17GregorianDateTimeEdb +__ZN3JSCL30dateProtoFuncGetTimezoneOffsetEPNS_9ExecStateE +_cti_op_negate +__ZN3JSC12JSGlobalData12stopSamplingEv +__ZN3JSC11Interpreter12stopSamplingEv +__ZN3JSC17BytecodeGenerator11emitPostIncEPNS_10RegisterIDES2_ +__ZN3JSC3JIT16emit_op_post_incEPNS_11InstructionE +__ZN3JSC3JIT20emitSlow_op_post_incEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC10MathObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC17powThunkGeneratorEPNS_12JSGlobalDataEPNS_14ExecutablePoolE +__ZN3JSC12X86Assembler7cmpl_imEiiNS_12X86Registers10RegisterIDE +__ZN3JSC23MacroAssemblerX86Common26branchConvertDoubleToInt32ENS_12X86Registers13XMMRegisterIDENS1_10RegisterIDERNS_22AbstractMacroAssemblerINS_12X86AssemblerEE8JumpListES2_ +__ZN3JSC19SpecializedThunkJIT11returnInt32ENS_12X86Registers10RegisterIDE +__ZN3JSC19SpecializedThunkJIT12returnDoubleENS_12X86Registers13XMMRegisterIDE +__ZN3JSC19SpecializedThunkJITD1Ev +__ZN3WTF9HashTableIjSt4pairIjN3JSC12WriteBarrierINS2_7UnknownEEEENS_18PairFirstExtractorIS6_EENS_7IntHashIjEENS_14PairHashTraitsINS_10HashTraitsIjEENSC_IS5_EEEESD_E6rehashEi +__ZN3JSC3JIT11emit_op_neqEPNS_11InstructionE +__ZN3JSC3JIT15emitSlow_op_neqEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC12JSGlobalData14dumpSampleDataEPNS_9ExecStateE +__ZN3JSC11Interpreter14dumpSampleDataEPNS_9ExecStateE +__ZN3JSCL22arrayProtoFuncToStringEPNS_9ExecStateE +__ZN3JSC16ArrayConstructor11getCallDataERNS_8CallDataE +__ZN3JSCL20callArrayConstructorEPNS_9ExecStateE +__ZN3JSC10ASTBuilder11makeModNodeEPNS_14ExpressionNodeES2_b +__ZN3JSC3JIT11emit_op_modEPNS_11InstructionE +__ZN3JSC3JIT15emitSlow_op_modEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3JSC17NumberConstructor11getCallDataERNS_8CallDataE +__ZN3JSCL21callNumberConstructorEPNS_9ExecStateE +__ZN3JSCL16mathProtoFuncAbsEPNS_9ExecStateE +__ZN3JSCL28numberConstructorPosInfinityEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +__ZN3JSCL18mathProtoFuncFloorEPNS_9ExecStateE +_cti_op_mod +_cti_timeout_check +__ZN3JSC14TimeoutChecker10didTimeOutEPNS_9ExecStateE +__ZN3WTF6VectorINS_6RefPtrIN3JSC10RegisterIDEEELm16EE14expandCapacityEm +__ZN3WTF6VectorIPNS0_IN3JSC10RegisterIDELm32EEELm32EE14expandCapacityEmPKS4_ +__ZN3WTF6VectorIPNS0_IN3JSC10RegisterIDELm32EEELm32EE15reserveCapacityEm +__ZN3JSC3JIT13linkConstructEPNS_10JSFunctionEPNS_9CodeBlockES4_NS_21MacroAssemblerCodePtrEPNS_12CallLinkInfoEiPNS_12JSGlobalDataE +__ZN3JSC14EvalExecutable13visitChildrenERNS_9MarkStackE +__ZN3JSC17NumberConstructor16getConstructDataERNS_13ConstructDataE +__ZN3JSCL30constructWithNumberConstructorEPNS_9ExecStateE +__ZN3JSC12NumberObjectC1ERNS_12JSGlobalDataEPNS_9StructureE +__ZN3JSC18BooleanConstructor16getConstructDataERNS_13ConstructDataE +__ZN3JSCL31constructWithBooleanConstructorEPNS_9ExecStateE +__ZN3JSC16constructBooleanEPNS_9ExecStateERKNS_7ArgListE +__ZN3JSC13BooleanObjectC1ERNS_12JSGlobalDataEPNS_9StructureE +__ZN3JSC13BooleanObjectD1Ev +__ZN3JSC9ExecState21arrayConstructorTableEPS0_ +__ZN3JSC17FunctionPrototype11getCallDataERNS_8CallDataE +__ZN3JSC16InternalFunction4nameEPNS_9ExecStateE +__ZN3JSC8VoidNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSCL25numberConstructorNaNValueEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +__ZN3JSCL28numberConstructorNegInfinityEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE __ZN3JSC18BooleanConstructor11getCallDataERNS_8CallDataE -__ZN3JSCL22callBooleanConstructorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC7JSArray19getOwnPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE -__ZN3JSC9ExecState10arrayTableEPS0_ -__ZN3JSC17DeleteResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSCL18arrayProtoFuncSortEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL22callBooleanConstructorEPNS_9ExecStateE +__ZN3JSC8JSString17substringFromRopeEPNS_9ExecStateEjj +__ZN3WTF6VectorIN3JSC8JSString12RopeIterator8WorkItemELm16EE14expandCapacityEmPKS4_ +__ZN3WTF6VectorIN3JSC8JSString12RopeIterator8WorkItemELm16EE15reserveCapacityEm +__ZN3JSC10JSFunction14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE +__ZN3JSCL24booleanProtoFuncToStringEPNS_9ExecStateE +__ZN3JSC18globalFuncUnescapeEPNS_9ExecStateE +__ZN3WTF6VectorItLm64EE17tryExpandCapacityEm +__ZNK3WTF13DecimalNumber19toStringExponentialEPtj +__ZN3JSC8JSObject3putEPNS_9ExecStateEjNS_7JSValueE +__ZN3JSCL21arrayProtoFuncReverseEPNS_9ExecStateE +__ZN3JSC9CommaNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC9CommaNodeD1Ev +__ZN3JSC7JSArray14deletePropertyEPNS_9ExecStateEj +__ZN3JSC19FunctionConstructor16getConstructDataERNS_13ConstructDataE +__ZN3JSCL32constructWithFunctionConstructorEPNS_9ExecStateE +__ZN3JSC17constructFunctionEPNS_9ExecStateEPNS_14JSGlobalObjectERKNS_7ArgListE +__ZN3JSC17StringConstructor16getConstructDataERNS_13ConstructDataE +__ZN3JSCL30constructWithStringConstructorEPNS_9ExecStateE +__ZN3JSC12StringObjectC1EPNS_9ExecStateEPNS_9StructureERKNS_7UStringE +__ZN3JSC12StringObjectC2EPNS_9ExecStateEPNS_9StructureERKNS_7UStringE +__ZN3JSCL22numberProtoFuncValueOfEPNS_9ExecStateE +__ZN3JSC12NumberObject11getJSNumberEv +__ZN3JSC11makeUStringINS_7UStringEPKcS1_EES1_T_T0_T1_ +__ZN3JSCL23booleanProtoFuncValueOfEPNS_9ExecStateE +__ZN3JSC21ReadModifyBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC26fromCharCodeThunkGeneratorEPNS_12JSGlobalDataEPNS_14ExecutablePoolE +__ZN3JSCL18stringFromCharCodeEPNS_9ExecStateE +__ZN3JSCL18arrayProtoFuncSortEPNS_9ExecStateE +__ZN3JSC7JSArray4sortEPNS_9ExecStateE +__ZN3JSC7JSArray17compactForSortingEv +__ZN3JSC4Heap18pushTempSortVectorEPN3WTF6VectorISt4pairINS_7JSValueENS_7UStringEELm0EEE +__ZN3WTF6VectorIPNS0_ISt4pairIN3JSC7JSValueENS2_7UStringEELm0EEELm0EE15reserveCapacityEm +__ZN3JSC4Heap17popTempSortVectorEPN3WTF6VectorISt4pairINS_7JSValueENS_7UStringEELm0EEE +__ZN3JSCltERKNS_7UStringES2_ +__ZN3JSCL27compareByStringPairForQSortEPKvS1_ +__ZN3WTF16codePointCompareEPKNS_10StringImplES2_ __ZN3JSC7JSArray4sortEPNS_9ExecStateENS_7JSValueENS_8CallTypeERKNS_8CallDataE -__ZN3WTF6VectorIN3JSC26AVLTreeNodeForArrayCompareELm0EE14expandCapacityEm -__ZN3JSC11Interpreter20prepareForRepeatCallEPNS_18FunctionExecutableEPNS_9ExecStateEPNS_10JSFunctionEiPNS_14ScopeChainNodeEPNS_ +__ZN3JSC11Interpreter20prepareForRepeatCallEPNS_18FunctionExecutableEPNS_9ExecStateEPNS_10JSFunctionEiPNS_14ScopeChainNodeE __ZN3WTF7AVLTreeIN3JSC32AVLTreeAbstractorForArrayCompareELj44ENS_18AVLTreeDefaultBSetILj44EEEE6insertEi -__ZN3JSC11Interpreter7executeERNS_16CallFrameClosureEPNS_7JSValueE -__ZN3WTF7AVLTreeIN3JSC32AVLTreeAbstractorForArrayCompareELj44ENS_18AVLTreeDefaultBSetILj44EEEE7balanceEi __ZN3JSC11Interpreter13endRepeatCallERNS_16CallFrameClosureE -__ZN3JSCL16mathProtoFuncExpEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL17mathProtoFuncATanEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZL17makeLeftShiftNodePN3JSC12JSGlobalDataEPNS_14ExpressionNodeES3_b -__ZN3JSC3JIT14emit_op_lshiftEPNS_11InstructionE -__ZN3JSC3JIT14emit_op_bitandEPNS_11InstructionE -__ZN3JSC3JIT14emit_op_rshiftEPNS_11InstructionE -__ZN3JSC3JIT18emitSlow_op_lshiftEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC3JIT18emitSlow_op_bitandEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC3JIT18emitSlow_op_rshiftEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC32jsSpliceSubstringsWithSeparatorsEPNS_9ExecStateEPNS_8JSStringERKNS_7UStringEPKNS_11StringRangeEiPS5_i -__ZN3JSCL26stringProtoFuncLastIndexOfEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK3JSC7JSValue20toIntegerPreserveNaNEPNS_9ExecStateE -__ZNK3JSC7UString5rfindERKS0_j -__ZN3WTF6VectorIiLm0EE15reserveCapacityEm -__ZN3WTF6VectorINS_6RefPtrIN3JSC5LabelEEELm8EE15reserveCapacityEm -__ZN3WTF6VectorISt4pairIiiELm8EE14expandCapacityEm -__ZN3JSC11DoWhileNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC3JIT19emit_op_switch_charEPNS_11InstructionE -_cti_op_switch_char -__ZN3JSCL21stringProtoFuncSearchEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3WTF10RefCountedIN3JSC6RegExpEE5derefEv -__ZN3JSC14JSGlobalObjectD2Ev -__ZN3JSC12RegisterFile17clearGlobalObjectEPNS_14JSGlobalObjectE -__ZN3JSC17FunctionPrototypeD1Ev -__ZN3JSC15ObjectPrototypeD1Ev -__ZN3JSC14ArrayPrototypeD1Ev -__ZN3JSC15StringPrototypeD1Ev -__ZN3JSC16BooleanPrototypeD1Ev -__ZN3JSC15NumberPrototypeD1Ev -__ZN3JSC13DatePrototypeD1Ev -__ZN3JSC15RegExpPrototypeD1Ev -__ZN3JSC14ErrorPrototypeD1Ev -__ZN3JSC20NativeErrorPrototypeD1Ev -__ZN3JSC17ObjectConstructorD1Ev -__ZN3JSC19FunctionConstructorD1Ev -__ZN3JSC16ArrayConstructorD1Ev -__ZN3JSC17StringConstructorD1Ev -__ZN3JSC18BooleanConstructorD1Ev -__ZN3JSC17NumberConstructorD1Ev -__ZN3JSC15DateConstructorD1Ev -__ZN3JSC17RegExpConstructorD1Ev -__ZN3JSC16ErrorConstructorD1Ev -__ZN3JSC22NativeErrorConstructorD1Ev -__ZN3JSC10MathObjectD1Ev -__ZN3JSC10JSONObjectD1Ev -__ZN3JSC18GlobalEvalFunctionD1Ev -__ZN3JSC19JSStaticScopeObjectD1Ev -__ZN3JSC19JSStaticScopeObjectD2Ev -__ZN3WTF6VectorIPvLm0EE14expandCapacityEmPKS1_ -__ZN3WTF6VectorIPvLm0EE15reserveCapacityEm -__ZN3JSC16JSCallbackObjectINS_8JSObjectEED1Ev -__ZL25clearReferenceToPrototypeP13OpaqueJSValue -_JSObjectGetPrivate -__ZNK3JSC16JSCallbackObjectINS_8JSObjectEE9classInfoEv -__ZN3JSC28globalFuncEncodeURIComponentEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL6encodeEPNS_9ExecStateERKNS_7ArgListEPKc -__ZN3WTF6VectorItLm64EE9tryAppendItEEbPKT_m -__ZN3WTF6VectorItLm64EE18tryReserveCapacityEm -__ZN3JSC28globalFuncDecodeURIComponentEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL6decodeEPNS_9ExecStateERKNS_7ArgListEPKcb -__ZN3WTF7Unicode18UTF8SequenceLengthEc -__ZN3WTF7Unicode18decodeUTF8SequenceEPKc -__ZN3JSC18EmptyStatementNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSCltERKNS_7UStringES2_ -__ZN3WTF6VectorItLm0EE14expandCapacityEmPKt -__ZN3WTF6VectorItLm0EE15reserveCapacityEm -__ZN3JSC18RegExpMatchesArray3putEPNS_9ExecStateEjNS_7JSValueE -__ZN3JSC18RegExpMatchesArray14deletePropertyEPNS_9ExecStateEj -__ZN3JSC18RegExpMatchesArray3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE -__ZN3JSC14EvalExecutableD0Ev -__ZN3JSC13EvalCodeBlockD0Ev -__ZN3JSC3JIT30emit_op_resolve_global_dynamicEPNS_11InstructionE -__ZN3JSC3JIT34emitSlow_op_resolve_global_dynamicEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSC19FunctionConstructor16getConstructDataERNS_13ConstructDataE -__ZN3JSCL32constructWithFunctionConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE -__ZN3JSC17constructFunctionEPNS_9ExecStateERKNS_7ArgListE -__ZN3JSC3JIT18emit_op_jmp_scopesEPNS_11InstructionE +__ZN3JSC11Interpreter7executeERNS_16CallFrameClosureE +__ZN3WTF7AVLTreeIN3JSC32AVLTreeAbstractorForArrayCompareELj44ENS_18AVLTreeDefaultBSetILj44EEEE7balanceEi +__ZNK3JSC14ExpressionNode11isCommaNodeEv +__ZNK3JSC7SubNode10isSubtractEv +__ZN3JSC17BytecodeGenerator17argumentNumberForERKNS_10IdentifierE +__ZN3JSC17BytecodeGenerator27setIsNumericCompareFunctionEb +__ZN3JSC7JSArray11sortNumericEPNS_9ExecStateENS_7JSValueENS_8CallTypeERKNS_8CallDataE +__ZN3JSCL20dateProtoFuncGetTimeEPNS_9ExecStateE +__ZN3JSC8JSObject18getPrimitiveNumberEPNS_9ExecStateERdRNS_7JSValueE +__ZN3JSC24charCodeAtThunkGeneratorEPNS_12JSGlobalDataEPNS_14ExecutablePoolE +__ZN3JSC7JSArray14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE +__ZNK3JSC8NullNode6isNullEv +__ZN3JSC3JIT15emit_op_eq_nullEPNS_11InstructionE +_cti_op_is_number +__ZNK3JSC7JSValue16synthesizeObjectEPNS_9ExecStateE +__ZN3JSC36constructBooleanFromImmediateBooleanEPNS_9ExecStateEPNS_14JSGlobalObjectENS_7JSValueE +__ZN3JSC14throwTypeErrorEPNS_9ExecStateE +__ZN3JSCL27dateProtoFuncGetUTCFullYearEPNS_9ExecStateE +__ZNK3JSC12DateInstance29calculateGregorianDateTimeUTCEPNS_9ExecStateE +__ZN3JSC23MacroAssemblerX86Common4moveENS_22AbstractMacroAssemblerINS_12X86AssemblerEE13TrustedImmPtrENS_12X86Registers10RegisterIDE +__ZN3JSCL24dateProtoFuncGetUTCMonthEPNS_9ExecStateE +__ZN3JSCL23dateProtoFuncGetUTCDateEPNS_9ExecStateE +__ZN3JSCL22dateProtoFuncGetUTCDayEPNS_9ExecStateE +__ZN3JSCL24dateProtoFuncGetUTCHoursEPNS_9ExecStateE +__ZN3JSCL26dateProtoFuncGetUTCMinutesEPNS_9ExecStateE +__ZN3JSCL26dateProtoFuncGetUTCSecondsEPNS_9ExecStateE +__ZN3JSCL31dateProtoFuncGetUTCMillisecondsEPNS_9ExecStateE +__ZN3JSCL24dateProtoFuncGetFullYearEPNS_9ExecStateE +__ZN3JSCL21dateProtoFuncGetMonthEPNS_9ExecStateE +__ZN3JSCL20dateProtoFuncGetDateEPNS_9ExecStateE +__ZN3JSCL19dateProtoFuncGetDayEPNS_9ExecStateE +__ZN3JSCL21dateProtoFuncGetHoursEPNS_9ExecStateE +__ZN3JSCL23dateProtoFuncGetMinutesEPNS_9ExecStateE +__ZN3JSCL23dateProtoFuncGetSecondsEPNS_9ExecStateE +__ZN3JSCL28dateProtoFuncGetMilliSecondsEPNS_9ExecStateE +__ZN3JSC9parseDateEPNS_9ExecStateERKNS_7UStringE +__ZN3WTF40parseES5DateFromNullTerminatedCharactersEPKc +__ZN3JSC37parseDateFromNullTerminatedCharactersEPNS_9ExecStateEPKc +__ZN3WTFL37parseDateFromNullTerminatedCharactersEPKcRbRi +__ZN3JSCL24dateProtoFuncToUTCStringEPNS_9ExecStateE +__ZN3JSC20formatDateUTCVariantERKNS_17GregorianDateTimeERA100_c +__ZN3JSC13formatTimeUTCERKNS_17GregorianDateTimeERA100_c +__ZN3JSCL24dateProtoFuncToGMTStringEPNS_9ExecStateE +__ZN3JSC15DateConstructor18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSCL9dateParseEPNS_9ExecStateE +__ZN3JSCL7dateUTCEPNS_9ExecStateE +__ZN3JSC15globalFuncIsNaNEPNS_9ExecStateE +_cti_op_is_object +__ZN3JSC14jsIsObjectTypeENS_7JSValueE +_cti_op_less +__ZN3JSCL19jsStrDecimalLiteralERPKtS1_ +__ZN3WTF6VectorIcLm32EE14expandCapacityEm +__ZN3JSCL20dateProtoFuncGetYearEPNS_9ExecStateE +_cti_op_pre_inc +__ZN3JSCL20dateProtoFuncSetTimeEPNS_9ExecStateE +__ZN3JSCL28dateProtoFuncSetMilliSecondsEPNS_9ExecStateE +__ZN3JSCL23setNewValueFromTimeArgsEPNS_9ExecStateEib +__ZN3JSCL31dateProtoFuncSetUTCMillisecondsEPNS_9ExecStateE +__ZN3JSCL23dateProtoFuncSetSecondsEPNS_9ExecStateE +__ZN3JSCL23dateProtoFuncSetMinutesEPNS_9ExecStateE +__ZN3JSCL26dateProtoFuncSetUTCMinutesEPNS_9ExecStateE +__ZN3JSCL21dateProtoFuncSetHoursEPNS_9ExecStateE +__ZN3JSCL24dateProtoFuncSetUTCHoursEPNS_9ExecStateE +__ZN3JSCL20dateProtoFuncSetDateEPNS_9ExecStateE +__ZN3JSCL23setNewValueFromDateArgsEPNS_9ExecStateEib +__ZN3JSCL23dateProtoFuncSetUTCDateEPNS_9ExecStateE +__ZN3JSCL21dateProtoFuncSetMonthEPNS_9ExecStateE +__ZN3JSCL24dateProtoFuncSetUTCMonthEPNS_9ExecStateE +__ZN3JSCL24dateProtoFuncSetFullYearEPNS_9ExecStateE +__ZN3JSCL27dateProtoFuncSetUTCFullYearEPNS_9ExecStateE +__ZN3JSC8JSParser18parseWithStatementINS_13SyntaxCheckerEEENT_9StatementERS3_ +_cti_op_construct_arityCheck +__ZN3JSC8JSParser18parseWithStatementINS_10ASTBuilderEEENT_9StatementERS3_ __ZN3JSC8WithNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE __ZN3JSC17BytecodeGenerator13emitPushScopeEPNS_10RegisterIDE __ZN3JSC3JIT18emit_op_push_scopeEPNS_11InstructionE _cti_op_push_scope -_cti_op_jmp_scopes -__ZN3WTF6VectorIN3JSC14ExecutablePool10AllocationELm2EE14expandCapacityEm -__ZN3JSCL26stringProtoFuncToUpperCaseEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL21arrayProtoFuncIndexOfEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL16mathProtoFuncCosEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL17mathProtoFuncASinEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -_cti_op_loop_if_lesseq -__ZN3JSC7JSArray4sortEPNS_9ExecStateE -__ZN3JSC7JSArray17compactForSortingEv -__ZL18makeRightShiftNodePN3JSC12JSGlobalDataEPNS_14ExpressionNodeES3_b +__ZN3JSC17DeleteResolveNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC3JIT17emit_op_jneq_nullEPNS_11InstructionE +__ZN3JSC3JIT26emit_op_ret_object_or_thisEPNS_11InstructionE +__ZN3JSC16JSVariableObject19getOwnPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE +__ZN3WTF9HashTableIPNS_10StringImplES2_NS_17IdentityExtractorIS2_EENS_7PtrHashIS2_EENS_10HashTraitsIS2_EES8_E6expandEv +__ZN3WTF6VectorIN3JSC10IdentifierELm20EE15reserveCapacityEm +__ZN3JSC9ExecState17globalObjectTableEPS0_ +__ZNK3JSC8JSObject16isVariableObjectEv +__ZN3JSC17ObjectConstructor11getCallDataERNS_8CallDataE +__ZN3JSC19FunctionConstructor11getCallDataERNS_8CallDataE +__ZN3JSC15DateConstructor11getCallDataERNS_8CallDataE +__ZN3JSCL25numberConstructorMaxValueEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +__ZN3JSCL25numberConstructorMinValueEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +__ZN3JSC18sqrtThunkGeneratorEPNS_12JSGlobalDataEPNS_14ExecutablePoolE +__ZN3JSC9CodeBlock32expressionRangeForBytecodeOffsetEjRiS1_S1_ +__ZN3JSC11makeUStringINS_7UStringEPKcS1_S3_EES1_T_T0_T1_T2_ +__ZN3WTF13tryMakeStringIN3JSC7UStringEPKcS2_S4_EENS_10PassRefPtrINS_10StringImplEEET_T0_T1_T2_ +__ZN3JSC6JSCell16getConstructDataERNS_13ConstructDataE +__ZN3JSC26createNotAConstructorErrorEPNS_9ExecStateENS_7JSValueE +_cti_op_post_inc +_cti_op_post_dec +__ZN3JSC16JSVariableObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE +__ZN3JSC10ASTBuilder18makeBitwiseNotNodeEPNS_14ExpressionNodeE +__ZN3JSC3JIT14emit_op_bitnotEPNS_11InstructionE +__ZN3JSC3JIT18emitSlow_op_bitnotEPNS_11InstructionERPNS_13SlowCaseEntryE +_cti_op_jlesseq +_cti_op_bitnot +__ZN3JSC12StringObjectC1EPNS_9ExecStateEPNS_9StructureE +__ZN3WTF6VectorIjLm16EE15reserveCapacityEm +__ZNK3JSC8JSString8toObjectEPNS_9ExecStateEPNS_14JSGlobalObjectE +__ZN3JSC10ASTBuilder17makeLeftShiftNodeEPNS_14ExpressionNodeES2_b +__ZN3JSC3JIT14emit_op_lshiftEPNS_11InstructionE +__ZN3JSC3JIT18emitSlow_op_lshiftEPNS_11InstructionERPNS_13SlowCaseEntryE +_cti_op_lshift +__ZN3JSC10ASTBuilder18makeRightShiftNodeEPNS_14ExpressionNodeES2_b +__ZN3JSC3JIT14emit_op_rshiftEPNS_11InstructionE +__ZN3JSC3JIT18emitSlow_op_rshiftEPNS_11InstructionERPNS_13SlowCaseEntryE +_cti_op_rshift +__ZN3JSC10ASTBuilder19makeURightShiftNodeEPNS_14ExpressionNodeES2_b +__ZN3JSC3JIT15emit_op_urshiftEPNS_11InstructionE +__ZN3JSC3JIT19emitSlow_op_urshiftEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZN3WTF6VectorIPNS_14StringImplBaseELm32EE14expandCapacityEm +_cti_op_urshift +__ZN3JSC3JIT16emit_op_neq_nullEPNS_11InstructionE +__ZN3JSC10ASTBuilder14makeBitAndNodeEPNS_14ExpressionNodeES2_b +__ZN3JSC3JIT14emit_op_bitandEPNS_11InstructionE +__ZN3JSC3JIT18emitSlow_op_bitandEPNS_11InstructionERPNS_13SlowCaseEntryE +_cti_op_bitand +__ZN3JSC10ASTBuilder13makeBitOrNodeEPNS_14ExpressionNodeES2_b __ZN3JSC3JIT13emit_op_bitorEPNS_11InstructionE __ZN3JSC3JIT17emitSlow_op_bitorEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3WTF6VectorIN3JSC11StringRangeELm16EE14expandCapacityEm -__ZN3WTF6VectorIN3JSC7UStringELm16EE14expandCapacityEmPKS2_ -__ZN3WTF6VectorIN3JSC7UStringELm16EE15reserveCapacityEm -__ZNK3JSC8JSString8toObjectEPNS_9ExecStateE -__ZN3JSC12StringObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE -_cti_op_post_dec +_cti_op_bitor +__ZN3JSC10ASTBuilder14makeBitXOrNodeEPNS_14ExpressionNodeES2_b __ZN3JSC3JIT14emit_op_bitxorEPNS_11InstructionE __ZN3JSC3JIT18emitSlow_op_bitxorEPNS_11InstructionERPNS_13SlowCaseEntryE -_cti_op_bitand -_cti_op_bitor -__ZN7WebCore10StringImpl18simplifyWhiteSpaceEv -_cti_op_is_object -__ZN3JSC14jsIsObjectTypeENS_7JSValueE -__ZN3JSC17PrototypeFunction11getCallDataERNS_8CallDataE -__ZN3JSC14globalFuncEvalEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL19isNonASCIIIdentPartEi -__ZN3JSC11Interpreter7executeEPNS_14EvalExecutableEPNS_9ExecStateEPNS_8JSObjectEPNS_14ScopeChainNodeEPNS_7JSValueE -_cti_op_mod -__ZN7WebCore6String6appendEc -__ZN7WebCore6String6appendEPKtj -__ZN3JSC16globalFuncEscapeEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK7WebCore6String8foldCaseEv -__ZN7WebCore10StringImpl8foldCaseEv +_cti_op_bitxor +_cti_op_div +__ZN3JSCL23callFunctionConstructorEPNS_9ExecStateE +__ZN3JSC10JSFunction12lengthGetterEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE __ZN3JSC10JSFunction15argumentsGetterEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE __ZNK3JSC11Interpreter17retrieveArgumentsEPNS_9ExecStateEPNS_10JSFunctionE -__ZN3WTF6VectorIPN3JSC14ExpressionNodeELm16EE14expandCapacityEm -__ZN3WTF6VectorINS_6RefPtrIN3JSC10RegisterIDEEELm16EE15reserveCapacityEm -__ZN3WTF6VectorIN7WebCore6StringELm0EE14expandCapacityEm -__ZN3JSC8JSObject14deletePropertyEPNS_9ExecStateEj -__ZN3JSC18globalFuncUnescapeEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3WTF6VectorItLm64EE14expandCapacityEm -__ZN3JSC3JIT16emit_op_jeq_nullEPNS_11InstructionE -__ZN3WTF7CStringC1EPKc -__ZN3WTFeqERKNS_7CStringES2_ -__ZN7WebCore17equalIgnoringCaseEPKtPKcj -__ZNK7WebCore6String6toUIntEPb -__ZN7WebCore10StringImpl6toUIntEPb -__ZN7WebCore16charactersToUIntEPKtmPb -__ZN7WebCore10StringImpl11reverseFindEti -__ZN3WTF23waitForThreadCompletionEjPPv -__ZN3WTF14FastMallocZone10statisticsEP14_malloc_zone_tP19malloc_statistics_t -__ZNK7WebCore6String18simplifyWhiteSpaceEv -__ZN7WebCore10StringImpl23defaultWritingDirectionEv -__ZN3JSCL20dateProtoFuncSetTimeEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL21dateProtoFuncGetMonthEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK3JSC12DateInstance26calculateGregorianDateTimeEPNS_9ExecStateE -__ZN3JSC21msToGregorianDateTimeEPNS_9ExecStateEdbRNS_17GregorianDateTimeE -__ZN3WTFL18calculateDSTOffsetEdd -__ZN3JSCL20dateProtoFuncGetDateEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK3JSC7JSValue8inheritsEPKNS_9ClassInfoE -__ZN3JSCL20dateProtoFuncGetYearEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL21dateProtoFuncGetHoursEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL23dateProtoFuncGetMinutesEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC3JIT17emit_op_jneq_nullEPNS_11InstructionE -__ZN3JSCL20dateProtoFuncSetYearEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK3JSC7JSValue7toInt32EPNS_9ExecStateERb -__ZN3JSC21gregorianDateTimeToMSEPNS_9ExecStateERKNS_17GregorianDateTimeEdb -__ZN3WTF18dateToDaysFrom1970Eiii -__ZN3JSCL21dateProtoFuncSetMonthEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL23setNewValueFromDateArgsEPNS_9ExecStateENS_7JSValueERKNS_7ArgListEib -__ZN3JSCL20dateProtoFuncSetDateEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL24dateProtoFuncToGMTStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK3JSC12DateInstance29calculateGregorianDateTimeUTCEPNS_9ExecStateE -__ZN3JSC20formatDateUTCVariantERKNS_17GregorianDateTimeERA100_c -__ZN3JSC13formatTimeUTCERKNS_17GregorianDateTimeERA100_c -__ZN3JSC13tryMakeStringIPcPKcS1_EEN3WTF10PassRefPtrIN7WebCore10StringImplEEET_T0_T1_ -__ZN3JSC9parseDateEPNS_9ExecStateERKNS_7UStringE -__ZN3JSC37parseDateFromNullTerminatedCharactersEPNS_9ExecStateEPKc -__ZN3JSC16ArrayConstructor16getConstructDataERNS_13ConstructDataE -__ZN3JSCL29constructWithArrayConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE -__ZN3JSCL27constructArrayWithSizeQuirkEPNS_9ExecStateERKNS_7ArgListE -__ZN3JSC7JSArrayC1EN3WTF17NonNullPassRefPtrINS_9StructureEEEj -__ZN3JSC17StringConstructor16getConstructDataERNS_13ConstructDataE -__ZN3JSCL30constructWithStringConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE -__ZN3JSC12StringObjectC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEERKNS_7UStringE -__ZN3JSC12StringObjectC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEERKNS_7UStringE -_cti_op_pre_inc -__ZN3JSCL23dateProtoFuncGetSecondsEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN7WebCore6String6removeEji -__ZN3JSC23MacroAssemblerX86Common12branchTest32ENS0_9ConditionENS_22AbstractMacroAssemblerINS_12X86AssemblerEE7AddressENS4_5Imm -__ZN3JSC23MacroAssemblerX86Common8branch32ENS0_9ConditionENS_22AbstractMacroAssemblerINS_12X86AssemblerEE7AddressENS4_5Imm32E -__ZN3JSC12X86Assembler23X86InstructionFormatter9twoByteOpENS0_15TwoByteOpcodeIDEiNS_12X86Registers10RegisterIDEi -__ZNK3JSC7UStringixEj -__ZN3JSC3JIT19emit_op_to_jsnumberEPNS_11InstructionE -__ZN3JSC3JIT23emitSlow_op_to_jsnumberEPNS_11InstructionERPNS_13SlowCaseEntryE -_cti_op_to_jsnumber -__ZN3JSCL30dateProtoFuncGetTimezoneOffsetEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC5Error6createEPNS_9ExecStateENS_9ErrorTypeERKNS_7UStringEilS6_ -__ZN3JSC22NativeErrorConstructor16getConstructDataERNS_13ConstructDataE -__ZN3JSC9constructEPNS_9ExecStateENS_7JSValueENS_13ConstructTypeERKNS_13ConstructDataERKNS_7ArgListE -__ZN3JSCL35constructWithNativeErrorConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE -__ZN3JSC22NativeErrorConstructor9constructEPNS_9ExecStateERKNS_7ArgListE -__ZN3JSC13ErrorInstanceC1EN3WTF17NonNullPassRefPtrINS_9StructureEEE -__ZN3JSC8JSObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueEj -__ZNK3JSC8JSObject13exceptionTypeEv -__ZN3JSCL22errorProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC13tryMakeStringINS_7UStringEPKcS1_EEN3WTF10PassRefPtrIN7WebCore10StringImplEEET_T0_T1_ -__ZN3JSC13ErrorInstanceD1Ev -__ZN3JSC4Heap9freeBlockEm -__ZN3JSC4Heap12freeBlockPtrEPNS_14CollectorBlockE -__ZN3JSC28createUndefinedVariableErrorEPNS_9ExecStateERKNS_10IdentifierEjPNS_9CodeBlockE -__ZN3JSC9CodeBlock32expressionRangeForBytecodeOffsetEPNS_9ExecStateEjRiS3_S3_ -__ZN3JSC10makeStringIPKcNS_7UStringEEES3_T_T0_ -__ZN3JSC13tryMakeStringIPKcNS_7UStringEEEN3WTF10PassRefPtrIN7WebCore10StringImplEEET_T0_ -__ZN3JSCL23returnToThrowTrampolineEPNS_12JSGlobalDataENS_16ReturnAddressPtrERS2_ -_ctiVMThrowTrampoline -_cti_vm_throw -__ZNK3JSC8JSObject22isNotAnObjectErrorStubEv -__ZNK3JSC7UString5asciiEv -__ZN3JSC6JSLock12DropAllLocksC1ENS_14JSLockBehaviorE -__ZN3JSCL17createJSLockCountEv -__ZN3JSC6JSLock12DropAllLocksD1Ev -__ZNK7WebCore6String5upperEv -__ZN3JSC4Yarr23RegexPatternConstructor31atomParentheticalAssertionBeginEb -__ZN3JSC4Yarr14RegexGenerator30generateParentheticalAssertionERNS1_19TermGenerationStateE -__ZNK3JSC8JSObject8toNumberEPNS_9ExecStateE -__ZN3WTF6VectorIPN3JSC4Yarr18PatternDisjunctionELm4EE14expandCapacityEmPKS4_ -__ZN3JSCL18regExpObjectSourceEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZN3JSC17RegExpConstructor11getCallDataERNS_8CallDataE -__ZN3JSCL21callRegExpConstructorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC23objectProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK3JSC8JSObject9classNameEv -__ZN3JSC13tryMakeStringIPKcNS_7UStringES2_EEN3WTF10PassRefPtrIN7WebCore10StringImplEEET_T0_T1_ -__ZN3JSC16JSVariableObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE -__ZN3JSC9Structure27despecifyDictionaryFunctionERKNS_10IdentifierE -__ZN3JSC36constructBooleanFromImmediateBooleanEPNS_9ExecStateENS_7JSValueE -__ZN3JSC13BooleanObjectC1EN3WTF17NonNullPassRefPtrINS_9StructureEEE -__ZN3JSC17ObjectConstructor16getConstructDataERNS_13ConstructDataE -__ZN3JSCL30constructWithObjectConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE -__ZNK3JSC9ArrayNode13isSimpleArrayEv -__ZN3JSC7JSArray14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE -__ZN3JSCL27compareByStringPairForQSortEPKvS1_ -__ZN3JSC7compareERKNS_7UStringES2_ -__ZN3JSCL24dateProtoFuncToUTCStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC17NumberConstructor16getConstructDataERNS_13ConstructDataE -__ZN3JSCL30constructWithNumberConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE -__ZN3JSC12NumberObjectC1EN3WTF17NonNullPassRefPtrINS_9StructureEEE -__ZN3JSCL20isNonASCIIIdentStartEi -__ZN3JSC9Arguments3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE -__ZN3JSC14MacroAssembler4peekENS_12X86Registers10RegisterIDEi -__ZN3JSC4Yarr14RegexGenerator12atEndOfInputEv -__ZN3JSC14MacroAssembler8branch32ENS_23MacroAssemblerX86Common9ConditionENS_12X86Registers10RegisterIDENS_22AbstractMacroAssemb -__ZN3JSC22AbstractMacroAssemblerINS_12X86AssemblerEE8JumpList6linkToENS2_5LabelEPS2_ -__ZN3JSC14MacroAssembler4pokeENS_12X86Registers10RegisterIDEi -__ZN3JSCL28substituteBackreferencesSlowERKNS_7UStringES2_PKiPNS_6RegExpEj -__ZN3WTF6VectorItLm0EE6appendItEEvPKT_m -_cti_op_to_primitive -__ZN3JSC15constructNumberEPNS_9ExecStateENS_7JSValueE -__ZNK3JSC12NumberObject9classInfoEv -__Z12jsRegExpFreeP8JSRegExp -__ZN3JSC13BooleanObjectD1Ev -__ZN3JSCL18stringFromCharCodeEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC10makeStringIPKcNS_7UStringES2_EES3_T_T0_T1_ -__ZN3JSCL19dateProtoFuncGetDayEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC14EvalExecutable20reparseExceptionInfoEPNS_12JSGlobalDataEPNS_14ScopeChainNodeEPNS_9CodeBlockE -__ZN3JSCL22objectProtoFuncValueOfEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC8JSObject18getPrimitiveNumberEPNS_9ExecStateERdRNS_7JSValueE -__ZN3JSCL24dateProtoFuncGetFullYearEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC12RegExpObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE -__ZN3JSCL24setRegExpObjectLastIndexEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueE -__Z15jsc_pcre_xclassiPKh -__ZN3JSCL28regExpConstructorLeftContextEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZNK3JSC17RegExpConstructor14getLeftContextEPNS_9ExecStateE +__ZN3JSCL21callFunctionPrototypeEPNS_9ExecStateE +__ZNK3JSC14ExpressionNode10isLocationEv +__ZN3JSC21FunctionCallValueNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC23createNotAFunctionErrorEPNS_9ExecStateENS_7JSValueE +__ZN3JSC10JSFunction19getOwnPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE +__ZNK3JSC9CommaNode11isCommaNodeEv +__ZN3JSC20globalFuncParseFloatEPNS_9ExecStateE +__ZN3WTF6VectorIN3JSC15SimpleJumpTableELm0EE14expandCapacityEm +__ZNK3JSC5Label4bindEii +__ZN3WTF6VectorIiLm0EEC2ERKS1_ +__ZN3JSC3JIT18emit_op_switch_immEPNS_11InstructionE +__ZN3WTF6VectorIN3JSC17CodeLocationLabelELm0EE14expandCapacityEm +_cti_op_switch_imm +__ZN3JSC18globalFuncIsFiniteEPNS_9ExecStateE +__ZN3JSC28createUndefinedVariableErrorEPNS_9ExecStateERKNS_10IdentifierE +__ZN3JSC11makeUStringIPKcNS_7UStringEEES3_T_T0_ +__ZN3WTF13tryMakeStringIPKcN3JSC7UStringEEENS_10PassRefPtrINS_10StringImplEEET_T0_ +__ZN3JSC15AssignErrorNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator23emitThrowReferenceErrorERKNS_7UStringE +__ZN3JSC3JIT29emit_op_throw_reference_errorEPNS_11InstructionE +_cti_op_throw_reference_error +__ZN3JSC16parseIntOverflowEPKcii +__ZN3JSC9ExecState9mathTableEPS0_ +__ZN3JSCL17mathProtoFuncACosEPNS_9ExecStateE +__ZN3JSCL17mathProtoFuncASinEPNS_9ExecStateE +__ZN3JSCL17mathProtoFuncATanEPNS_9ExecStateE +__ZN3JSCL18mathProtoFuncATan2EPNS_9ExecStateE +__ZN3JSCL17mathProtoFuncCeilEPNS_9ExecStateE +__ZN3JSCL16mathProtoFuncCosEPNS_9ExecStateE +__ZN3JSCL16mathProtoFuncExpEPNS_9ExecStateE +__ZN3JSCL16mathProtoFuncLogEPNS_9ExecStateE +__ZN3JSCL16mathProtoFuncMaxEPNS_9ExecStateE +__ZN3JSCL16mathProtoFuncMinEPNS_9ExecStateE +__ZN3JSCL16mathProtoFuncPowEPNS_9ExecStateE +__ZN3JSCL19mathProtoFuncRandomEPNS_9ExecStateE +__ZN3JSCL18mathProtoFuncRoundEPNS_9ExecStateE +__ZN3JSCL16mathProtoFuncSinEPNS_9ExecStateE +__ZN3JSCL17mathProtoFuncSqrtEPNS_9ExecStateE +__ZN3JSCL16mathProtoFuncTanEPNS_9ExecStateE +__ZN3JSC9ExecState22numberConstructorTableEPS0_ +__ZN3JSC6JSCell11getJSNumberEv +__ZN3JSCL21callObjectConstructorEPNS_9ExecStateE +__ZN3JSC9ExecState22objectConstructorTableEPS0_ _cti_to_object -__ZNK3JSC7JSValue16toObjectSlowCaseEPNS_9ExecStateE -_cti_op_sub -__ZN3JSC17NumberConstructor11getCallDataERNS_8CallDataE -__ZN3JSCL21callNumberConstructorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -_cti_op_bitxor -_cti_op_is_function -__ZN3JSC16jsIsFunctionTypeENS_7JSValueE -__ZN3JSC12NumberObjectD1Ev -__ZN3WTF6VectorIN3JSC22AbstractMacroAssemblerINS1_12X86AssemblerEE4JumpELm16EE14expandCapacityEm -__ZN3JSC8JSString18getPrimitiveNumberEPNS_9ExecStateERdRNS_7JSValueE -__ZN7WebCore6String26fromUTF8WithLatin1FallbackEPKcm -__ZN7WebCore6String8fromUTF8EPKcm -__ZN3WTF10fastStrDupEPKc -__ZN3JSC10throwErrorEPNS_9ExecStateENS_9ErrorTypeE -__ZN3WTF6VectorIN3JSC15StringJumpTableELm0EE14expandCapacityEm -__ZN3WTF9HashTableINS_6RefPtrIN7WebCore10StringImplEEESt4pairIS4_N3JSC14OffsetLocationEENS_18PairFirstExtractorIS8_EENS2_10Stri -__ZN3JSC3JIT21emit_op_switch_stringEPNS_11InstructionE -__ZN3JSC13LiteralParser5Lexer9lexNumberERNS1_18LiteralParserTokenE -__ZN3WTF6VectorIPNS_14StringImplBaseELm32EE14expandCapacityEm -__ZN3JSC4Yarr17nonwordcharCreateEv -__ZN3JSC3JIT15emit_op_eq_nullEPNS_11InstructionE -_cti_op_switch_string -__ZN3JSC12X86Assembler23X86InstructionFormatter15emitRexIfNeededEiii -__ZN3JSC12X86Assembler23X86InstructionFormatter11memoryModRMEiNS_12X86Registers10RegisterIDES3_ii -__ZN3JSC4Yarr6ParserINS0_23RegexPatternConstructorEE28CharacterClassParserDelegate25atomBuiltInCharacterClassENS0_23BuiltInChar +__ZN3JSC9ExecState20numberPrototypeTableEPS0_ +__ZNK3JSC15DotAccessorNode17isDotAccessorNodeEv +__ZN3JSC10Identifier11addSlowCaseEPNS_12JSGlobalDataEPN3WTF10StringImplE +__ZNK3JSC14ExpressionNode17isDotAccessorNodeEv +__ZN3JSC9ExecState22stringConstructorTableEPS0_ +__ZN3JSCL26stringFromCharCodeSlowCaseEPNS_9ExecStateE +__ZN3JSCL25stringProtoFuncCharCodeAtEPNS_9ExecStateE +__ZNK3JSC12JSActivation12toThisObjectEPNS_9ExecStateE +__ZN3JSCL26stringProtoFuncToLowerCaseEPNS_9ExecStateE +__ZN3JSCL26stringProtoFuncToUpperCaseEPNS_9ExecStateE +__ZN3JSC12StringObject19getOwnPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE +__ZN3JSC9ExecState11stringTableEPS0_ +__ZN3JSC12StringObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE +__ZN3JSC17BytecodeGenerator18pushFinallyContextEPNS_5LabelEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator17popFinallyContextEv +__ZN3JSC17BytecodeGenerator19highestUsedRegisterEv +__ZN3JSC17BytecodeGenerator18emitJumpSubroutineEPNS_10RegisterIDEPNS_5LabelE +__ZN3JSC17BytecodeGenerator20emitSubroutineReturnEPNS_10RegisterIDE +__ZN3JSC3JIT11emit_op_jsrEPNS_11InstructionE +__ZN3WTF6VectorIN3JSC3JIT7JSRInfoELm0EE14expandCapacityEm +__ZN3JSC3JIT12emit_op_sretEPNS_11InstructionE +_cti_op_check_has_instance +__ZN3JSC23createInvalidParamErrorEPNS_9ExecStateEPKcNS_7JSValueE +__ZN3JSC11makeUStringIPKcNS_7UStringES2_S2_S2_EES3_T_T0_T1_T2_T3_ +__ZN3WTF13tryMakeStringIPKcN3JSC7UStringES2_S2_S2_EENS_10PassRefPtrINS_10StringImplEEET_T0_T1_T2_T3_ +_cti_op_is_string +__ZN3JSC17RegExpConstructor18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC12RegExpObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSCL21regExpObjectLastIndexEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +__ZN3JSC4Yarr12digitsCreateEv +__ZN3WTF6VectorIN3JSC4Yarr12ByteCompiler21ParenthesesStackEntryELm0EE14expandCapacityEm +__ZN3JSC4Yarr12ByteCompiler16closeAlternativeEi +__ZN3WTF6VectorIN3JSC4Yarr8ByteTermELm0EE14expandCapacityEmPKS3_ +__ZN3WTF6VectorIPN3JSC4Yarr15ByteDisjunctionELm0EE14expandCapacityEm +__ZN3JSC3JIT16emit_op_jeq_nullEPNS_11InstructionE +__ZN3JSC18RegExpMatchesArray18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE +__ZN3JSC4Yarr11Interpreter20backtrackParenthesesERNS0_8ByteTermEPNS1_18DisjunctionContextE +__ZN3JSC4Yarr11YarrPattern21newlineCharacterClassEv +__ZN3JSC4Yarr6ParserINS0_22YarrPatternConstructorEE28CharacterClassParserDelegate25atomBuiltInCharacterClassENS0_23BuiltInCharacterClassIDEb +__ZN3WTF6VectorIPN3JSC4Yarr14CharacterClassELm0EE14expandCapacityEmPKS4_ +__ZN3JSC4Yarr25CharacterClassConstructor6appendEPKNS0_14CharacterClassE __ZN3JSC4Yarr15nonspacesCreateEv -__ZN3JSCL25functionProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK3JSC21UStringSourceProvider8getRangeEii -__ZNK3JSC7UString6substrEjj -__ZN3JSC10makeStringINS_7UStringEPKcS1_EES1_T_T0_T1_ -__ZNK3JSC18FunctionExecutable11paramStringEv -__ZN3WTF6VectorItLm64EE6appendItEEvPKT_m -__ZN3JSC13tryMakeStringIPKcNS_7UStringES2_S3_S2_S3_EEN3WTF10PassRefPtrIN7WebCore10StringImplEEET_T0_T1_T2_T3_T4_ -__ZN3JSC17RegExpConstructor3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE -__ZN3JSCL21arrayProtoFuncForEachEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC10JSFunction14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE -__ZN3JSCL22arrayProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3WTF6VectorIN3JSC22AbstractMacroAssemblerINS1_12X86AssemblerEE4JumpELm16EE14expandCapacityEmPKS5_ +__ZN3WTF6VectorIN3JSC22AbstractMacroAssemblerINS1_12X86AssemblerEE4JumpELm16EE14expandCapacityEm +__ZN3JSC4Yarr15nondigitsCreateEv +__ZN3JSC4Yarr13YarrGenerator29generateAssertionWordBoundaryEm +__ZN3JSCL24setRegExpObjectLastIndexEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueE +__ZN3JSC9ExecState11regExpTableEPS0_ +__ZN3JSC9ExecState20regExpPrototypeTableEPS0_ +__ZN3JSC8JSParser21parseDoWhileStatementINS_13SyntaxCheckerEEENT_9StatementERS3_ +__ZN3JSC9LabelNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC14PostfixDotNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3WTF6VectorIiLm0EE15reserveCapacityEm +__ZN3JSC3JIT19emit_op_switch_charEPNS_11InstructionE +_cti_op_switch_char +__ZN3JSC22AbstractMacroAssemblerINS_12X86AssemblerEE8JumpList6appendERS3_ +__ZNK3WTF9HashTableIPN3JSC20MarkedArgumentBufferES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E4findIS3_NS_22IdentityHashTranslatorIS3_S3_S7_EEEENS_22HashTableConstIteratorIS3_S3_S5_S7_S9_S9_EERKT_ +__ZN3JSCL20stringProtoFuncSliceEPNS_9ExecStateE +_cti_op_get_by_id_proto_fail +__ZN3JSCL28arrayProtoFuncToLocaleStringEPNS_9ExecStateE +__ZN3JSCL17arrayProtoFuncPopEPNS_9ExecStateE +__ZN3JSC7JSArray3popEv __ZN3JSC16ErrorConstructor16getConstructDataERNS_13ConstructDataE -__ZN3JSCL29constructWithErrorConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE -__ZN3JSC14constructErrorEPNS_9ExecStateERKNS_7ArgListE -_cti_op_instanceof -__ZN3JSC6RegExp6createEPNS_12JSGlobalDataERKNS_7UStringE -__ZN3WTF9HashTableIPN7WebCore10StringImplES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E4findIS3_NS_ -_cti_op_get_by_id_string_fail -__ZN3JSCL20stringProtoFuncSliceEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC14MacroAssembler4jumpENS_22AbstractMacroAssemblerINS_12X86AssemblerEE5LabelE -__ZN3JSCL23regExpProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL18regExpObjectGlobalEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZN3JSCL22regExpObjectIgnoreCaseEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZN3JSCL21regExpObjectMultilineEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZN3JSC13tryMakeStringIPKcNS_7UStringEPcEEN3WTF10PassRefPtrIN7WebCore10StringImplEEET_T0_T1_ -__ZN3JSC12JSActivation14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE -__ZN3WTFL10timerFiredEP16__CFRunLoopTimerPv -__ZN7WebCore22charactersToUIntStrictEPKtmPbi -__ZN3WTF9HashTableIjSt4pairIjN3JSC7JSValueEENS_18PairFirstExtractorIS4_EENS_7IntHashIjEENS_14PairHashTraitsINS_10HashTraitsIjEE -__ZN3JSCL23dateProtoFuncSetMinutesEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL23setNewValueFromTimeArgsEPNS_9ExecStateENS_7JSValueERKNS_7ArgListEib -__ZN3JSCL23dateProtoFuncSetSecondsEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL28dateProtoFuncSetMilliSecondsEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL9dateParseEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL21dateProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC10formatDateERKNS_17GregorianDateTimeERA100_c -__ZN3JSC10formatTimeERKNS_17GregorianDateTimeERA100_c -__ZN3JSC19globalFuncEncodeURIEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC13UnaryPlusNode14stripUnaryPlusEv -__ZN3JSCL20arrayProtoFuncFilterEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL27objectProtoFuncLookupGetterEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC8JSObject12lookupGetterEPNS_9ExecStateERKNS_10IdentifierE -__ZNK3JSC6JSCell14isGetterSetterEv -__ZN3JSCL27objectProtoFuncDefineSetterEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC8JSObject12defineSetterEPNS_9ExecStateERKNS_10IdentifierEPS0_j -__ZN3JSCL27objectProtoFuncDefineGetterEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC8JSObject12defineGetterEPNS_9ExecStateERKNS_10IdentifierEPS0_j -__ZNK3JSC12GetterSetter14isGetterSetterEv -__ZN3JSC8JSObject15unwrappedObjectEv -__ZN3JSC10JSFunction12callerGetterEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZNK3JSC11Interpreter14retrieveCallerEPNS_9ExecStateEPNS_16InternalFunctionE -__ZN3JSC16toUInt32SlowCaseEdRb -__ZN3JSC8JSObject22fillGetterPropertySlotERNS_12PropertySlotEPNS_7JSValueE -__ZNK3JSC12PropertySlot14functionGetterEPNS_9ExecStateE -_cti_op_get_by_id_getter_stub -__ZN3JSC12GetterSetter12markChildrenERNS_9MarkStackE -__ZN3JSCL17mathProtoFuncACosEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3WTF13tryFastCallocEmm -__ZN3JSC3JIT20emit_op_resolve_skipEPNS_11InstructionE -_cti_op_resolve_skip -__ZN3JSC3JIT15emit_op_urshiftEPNS_11InstructionE -__ZN3JSC3JIT19emitSlow_op_urshiftEPNS_11InstructionERPNS_13SlowCaseEntryE -__ZN3JSCL25stringProtoFuncCharCodeAtEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3WTF6VectorIcLm0EE14expandCapacityEm -__ZN3JSC15AssignErrorNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC23ThrowableExpressionData14emitThrowErrorERNS_17BytecodeGeneratorENS_9ErrorTypeEPKc -__ZN3JSC17BytecodeGenerator12emitNewErrorEPNS_10RegisterIDENS_9ErrorTypeENS_7JSValueE -__ZN3JSC3JIT17emit_op_new_errorEPNS_11InstructionE -__ZN3JSCL27objectProtoFuncLookupSetterEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC8JSObject12lookupSetterEPNS_9ExecStateERKNS_10IdentifierE -__ZN3JSC26createNotAnObjectErrorStubEPNS_9ExecStateEb -__ZN3JSC13JSNotAnObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZNK3JSC22JSNotAnObjectErrorStub22isNotAnObjectErrorStubEv -__ZN3JSC22createNotAnObjectErrorEPNS_9ExecStateEPNS_22JSNotAnObjectErrorStubEjPNS_9CodeBlockE -__ZN3JSC9CodeBlock37getByIdExceptionInfoForBytecodeOffsetEPNS_9ExecStateEjRNS_8OpcodeIDE -__ZN3JSCL18createErrorMessageEPNS_9ExecStateEPNS_9CodeBlockEiiiNS_7JSValueENS_7UStringE -__ZN3JSC10makeStringIPKcNS_7UStringES2_S3_S2_S3_S2_EES3_T_T0_T1_T2_T3_T4_T5_ -__ZN3JSC13tryMakeStringIPKcNS_7UStringES2_S3_S2_S3_S2_EEN3WTF10PassRefPtrIN7WebCore10StringImplEEET_T0_T1_T2_T3_T4_T5_ -__ZN3JSC22JSNotAnObjectErrorStubD1Ev -__ZN3JSC13JSNotAnObjectD1Ev -__ZN3JSC12GetterSetterD1Ev -__ZN3JSC20FixedVMPoolAllocator17coalesceFreeSpaceEv -__ZN3WTF6VectorIPN3JSC13FreeListEntryELm0EE15reserveCapacityEm -__ZN3JSCL35reverseSortFreeListEntriesByPointerEPKvS1_ -__ZN3JSCL33reverseSortCommonSizedAllocationsEPKvS1_ -__ZN7WebCore20equalIgnoringNullityEPNS_10StringImplES1_ -__ZN3JSC19globalFuncDecodeURIEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL29constructWithErrorConstructorEPNS_9ExecStateE +__ZN3JSCL22compareNumbersForQSortEPKvS1_ +__ZN3JSCL25dateProtoFuncToDateStringEPNS_9ExecStateE +__ZN3JSCL25dateProtoFuncToTimeStringEPNS_9ExecStateE +_cti_op_get_by_val_string +__ZN3JSCL27dateProtoFuncToLocaleStringEPNS_9ExecStateE +__ZN3JSCL16formatLocaleDateEPNS_9ExecStateEPNS_12DateInstanceEdNS_20LocaleDateTimeFormatE +__ZN3JSCL31dateProtoFuncToLocaleDateStringEPNS_9ExecStateE __ZN3JSC16ErrorConstructor11getCallDataERNS_8CallDataE -__ZN3JSCL20callErrorConstructorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL22functionProtoFuncApplyEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC9Arguments11fillArgListEPNS_9ExecStateERNS_20MarkedArgumentBufferE -__ZN3JSCL21functionProtoFuncCallEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC10JSONObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -_cti_op_lshift +__ZN3JSCL20callErrorConstructorEPNS_9ExecStateE +__ZN3JSC17RegExpConstructor11getCallDataERNS_8CallDataE +__ZN3JSCL21callRegExpConstructorEPNS_9ExecStateE +__ZNK3JSC8JSObject15isErrorInstanceEv +__ZN3JSC3JIT26emit_op_tear_off_argumentsEPNS_11InstructionE +__ZN3JSC8jsStringEPNS_9ExecStateERKNS_7UStringE +__ZN3JSC12JSActivation14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE +__ZN3JSC17BytecodeGenerator14emitPutByIndexEPNS_10RegisterIDEjS2_ +__ZN3JSC3JIT20emit_op_put_by_indexEPNS_11InstructionE +_cti_op_put_by_index +__ZN3JSC18EmptyStatementNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC9Arguments14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE +__ZN3JSC17DeleteBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC17BytecodeGenerator15emitDeleteByValEPNS_10RegisterIDES2_S2_ +_cti_op_del_by_val +__ZN3JSC9Arguments14deletePropertyEPNS_9ExecStateEj +__ZN3JSC14LogicalNotNode30emitBytecodeInConditionContextERNS_17BytecodeGeneratorEPNS_5LabelES4_b +_cti_op_tear_off_arguments +__ZN3JSC9Arguments3putEPNS_9ExecStateEjNS_7JSValueE +__ZN3JSCL29objectProtoFuncHasOwnPropertyEPNS_9ExecStateE +__ZNK3JSC8JSObject14hasOwnPropertyEPNS_9ExecStateERKNS_10IdentifierE +__ZN3JSCL22numberProtoFuncToFixedEPNS_9ExecStateE +__ZN3WTF11dtoaRoundDPEPcdiRbRiRj +__ZN3WTF4dtoaILb0ELb0ELb1ELb0EEEvPcdiRbRiRj +__ZN3JSCL28numberProtoFuncToExponentialEPNS_9ExecStateE +__ZN3WTF11dtoaRoundSFEPcdiRbRiRj +__ZN3WTF4dtoaILb0ELb1ELb0ELb0EEEvPcdiRbRiRj +__ZN3JSCL26numberProtoFuncToPrecisionEPNS_9ExecStateE +__ZN3JSC22NativeErrorConstructor16getConstructDataERNS_13ConstructDataE +__ZN3JSCL35constructWithNativeErrorConstructorEPNS_9ExecStateE +__ZN3JSC23MacroAssemblerX86Common8branch16ENS0_19RelationalConditionENS_22AbstractMacroAssemblerINS_12X86AssemblerEE9BaseIndexENS4_12TrustedImm32E +__ZN3JSC4Yarr17nonwordcharCreateEv +__ZN3JSC12X86Assembler23X86InstructionFormatter15emitRexIfNeededEiii +__ZN3JSC8JSString18getPrimitiveNumberEPNS_9ExecStateERdRNS_7JSValueE +__ZN3JSCL28substituteBackreferencesSlowERKNS_7UStringES2_PKiPNS_6RegExpEm +__ZN3WTF6VectorItLm0EE6appendItEEvPKT_m +__ZN3JSC17createSyntaxErrorEPNS_9ExecStateERKNS_7UStringE +__ZN3JSCL26regExpConstructorLastMatchEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +__ZNK3JSC17RegExpConstructor10getBackrefEPNS_9ExecStateEj +__ZN3JSCL28regExpConstructorLeftContextEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +__ZNK3JSC17RegExpConstructor14getLeftContextEPNS_9ExecStateE __ZN3JSCL29regExpConstructorRightContextEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE __ZNK3JSC17RegExpConstructor15getRightContextEPNS_9ExecStateE -__ZN3JSC20MarkedArgumentBuffer10slowAppendENS_7JSValueE -__ZN3WTF9HashTableIPN3JSC20MarkedArgumentBufferES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E6expan -__ZN3WTF6VectorIN3JSC8RegisterELm8EE15reserveCapacityEm -__ZN3WTF9HashTableIPN3JSC20MarkedArgumentBufferES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E4findI -__ZN3JSCL26stringFromCharCodeSlowCaseEPNS_9ExecStateERKNS_7ArgListE -__ZN3JSC4Yarr12RegexPattern21newlineCharacterClassEv -__ZN3JSC10JSFunction12lengthGetterEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZN3JSC18globalFuncIsFiniteEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC16ArrayConstructor11getCallDataERNS_8CallDataE -__ZN3JSCL20callArrayConstructorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL19stringProtoFuncTrimEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC15isStrWhiteSpaceEt -__ZN3JSC6JSCell9getObjectEv -_ctiOpThrowNotCaught -__ZN3JSCL22numberProtoFuncValueOfEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC12NumberObject11getJSNumberEv -__ZN7WebCore10StringImpl6secureEt -__ZN3JSC23createNotAFunctionErrorEPNS_9ExecStateENS_7JSValueEjPNS_9CodeBlockE -_cti_op_rshift -__ZN3JSC13JSNotAnObject18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE -__ZN3WTF6VectorIN3JSC22AbstractMacroAssemblerINS1_12X86AssemblerEE4JumpELm16EEC2ERKS6_ -__ZN3JSCL21arrayProtoFuncReverseEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3WTF21CrossThreadRefCountedINS_16OwnFastMallocPtrIKtEEE5derefEv -_cti_op_post_inc -__ZN3JSCL21regExpObjectLastIndexEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZN3JSC3JIT14emit_op_bitnotEPNS_11InstructionE -__ZN3JSC3JIT18emitSlow_op_bitnotEPNS_11InstructionERPNS_13SlowCaseEntryE -_cti_op_bitnot -__ZNK3JSC10JSONObject9classInfoEv -_JSGlobalContextCreate -_JSGlobalContextCreateInGroup -__ZN3JSC12JSGlobalData18createContextGroupENS_15ThreadStackTypeE -__ZN3JSC21createIdentifierTableEv -__ZN3JSC4Heap29makeUsableFromMultipleThreadsEv -__ZN3JSC6JSLock6unlockENS_14JSLockBehaviorE -_JSValueMakeFromJSONString -_JSValueIsNull -_JSValueIsUndefined -_JSValueIsBoolean -_JSValueIsNumber -_JSValueIsString -__ZN3JSC14JSGlobalObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -_JSValueIsInstanceOfConstructor -__ZN3JSC8JSObject11hasInstanceEPNS_9ExecStateENS_7JSValueES3_ -_JSValueToNumber -_JSObjectGetPropertyAtIndex -_JSValueToStringCopy -__ZN14OpaqueJSString6createERKN3JSC7UStringE -_JSStringCopyCFString -__ZN3JSC4Heap7destroyEv -__ZN3JSC4Heap10freeBlocksEv -__ZN3JSC14JSGlobalObjectD1Ev -__ZN3JSC14JSGlobalObject25destroyJSGlobalObjectDataEPv -__ZN3JSC12JSGlobalDataD1Ev -__ZN3JSC12JSGlobalDataD2Ev -__ZN3JSC12RegisterFileD1Ev -__ZNK3JSC9HashTable11deleteTableEv -__ZN3JSC5LexerD1Ev -__ZN3WTF20deleteAllPairSecondsIP24OpaqueJSClassContextDataKNS_7HashMapIP13OpaqueJSClassS2_NS_7PtrHashIS5_EENS_10HashTraitsIS5_E -__ZN3JSC17CommonIdentifiersD2Ev -__ZN3JSC21deleteIdentifierTableEPNS_15IdentifierTableE -__ZN3JSC15IdentifierTableD2Ev -__ZN3JSC4HeapD1Ev -__ZN3JSC9JITThunksD1Ev -__ZN3JSC16NativeExecutableD0Ev -__ZN3JSC12SmallStringsD1Ev -__ZN3JSC14JSGlobalObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueEj -__ZN3JSC17ObjectConstructor11getCallDataERNS_8CallDataE -__ZN3JSCL21callObjectConstructorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC9Arguments14deletePropertyEPNS_9ExecStateEj -__ZN3JSCL18JSONProtoFuncParseEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC7JSArray11fillArgListEPNS_9ExecStateERNS_20MarkedArgumentBufferE -__ZN3JSCL17arrayProtoFuncMapEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC12StringObjectC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEE -__ZN3JSC23MacroAssemblerX86Common9urshift32ENS_12X86Registers10RegisterIDES2_ -_cti_op_urshift -__ZN3JSC15ObjectPrototype3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE -__ZN3JSCL21stringProtoFuncConcatEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3WTF6VectorIiLm32EE15reserveCapacityEm +__ZN3WTF6VectorIN3JSC11StringRangeELm16EE14expandCapacityEmPKS2_ +__ZN3WTF6VectorIN3JSC11StringRangeELm16EE15reserveCapacityEm +__ZN3WTF6VectorIN3JSC7UStringELm16EE14expandCapacityEmPKS2_ +__ZN3WTF6VectorIN3JSC7UStringELm16EE15reserveCapacityEm +__ZN3JSCL24regExpConstructorDollar1EPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE __ZN3JSCL24regExpConstructorDollar2EPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +__ZN3WTF6VectorIPNS0_IN3JSC5LabelELm32EEELm32EE14expandCapacityEmPKS4_ +__ZN3WTF6VectorIPNS0_IN3JSC5LabelELm32EEELm32EE15reserveCapacityEm +__ZN3JSC8JSString16replaceCharacterEPNS_9ExecStateEtRKNS_7UStringE +__ZN3JSCL19arrayProtoFuncShiftEPNS_9ExecStateE +__ZN3JSC7JSArray10shiftCountEPNS_9ExecStateEi +__ZN3JSCL21arrayProtoFuncUnShiftEPNS_9ExecStateE +__ZN3JSC7JSArray12unshiftCountEPNS_9ExecStateEi +__ZN3JSC7JSArray26increaseVectorPrefixLengthEj +__ZN3WTF6VectorIPN3JSC14ExpressionNodeELm16EE14expandCapacityEm +__ZN3JSCL21stringProtoFuncConcatEPNS_9ExecStateE __ZN3JSCL24regExpConstructorDollar3EPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE __ZN3JSCL24regExpConstructorDollar4EPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZN3JSC20MarkedArgumentBuffer9markListsERNS_9MarkStackERN3WTF7HashSetIPS0_NS3_7PtrHashIS5_EENS3_10HashTraitsIS5_EEEE -__ZN3JSCL22numberProtoFuncToFixedEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL16integerPartNoExpEd -__ZN3JSC10makeStringINS_7UStringES1_PKcS1_EES1_T_T0_T1_T2_ -__ZN3JSC13tryMakeStringINS_7UStringES1_PKcS1_EEN3WTF10PassRefPtrIN7WebCore10StringImplEEET_T0_T1_T2_ -__ZN3JSCL26numberProtoFuncToPrecisionEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL12charSequenceEci -__ZN3JSC13tryMakeStringINS_7UStringEPKcS1_S1_EEN3WTF10PassRefPtrIN7WebCore10StringImplEEET_T0_T1_T2_ -__ZN3JSCL24booleanProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK3JSC12JSActivation12toThisObjectEPNS_9ExecStateE -_cti_op_div -__ZN3JSC17BytecodeGenerator21emitComplexJumpScopesEPNS_5LabelEPNS_18ControlFlowContextES4_ -__ZN7WebCore10StringImpl7replaceEjjPS0_ -__ZN3JSC12RegExpObject11getCallDataERNS_8CallDataE -__ZN3JSC12StringObject19getOwnPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE -__ZN3JSC9ExecState11stringTableEPS0_ -__ZNK3JSC7JSValue16synthesizeObjectEPNS_9ExecStateE -__ZN3JSC13JSNotAnObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE -__ZN3JSCL35objectProtoFuncPropertyIsEnumerableEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE +__ZN3JSCL24regExpConstructorDollar5EPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +__ZN3JSCL24regExpConstructorDollar6EPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +__ZN3JSCL24regExpConstructorDollar7EPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +__ZN3JSCL24regExpConstructorDollar8EPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +__ZN3JSCL24regExpConstructorDollar9EPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +__ZN3JSC17RegExpConstructor3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSCL25setRegExpConstructorInputEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueE +__ZN3JSCL22regExpConstructorInputEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +__ZN3JSCL26regExpConstructorLastParenEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +__ZNK3JSC17RegExpConstructor12getLastParenEPNS_9ExecStateE +__ZN3JSCL26regExpConstructorMultilineEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE +__ZN3JSCL29setRegExpConstructorMultilineEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueE +__ZN3JSCL22regExpProtoFuncCompileEPNS_9ExecStateE +__ZN3JSC14globalFuncEvalEPNS_9ExecStateE +__ZN3JSC11Interpreter7executeEPNS_14EvalExecutableEPNS_9ExecStateEPNS_8JSObjectEPNS_14ScopeChainNodeE +__ZNK3JSC19JSStaticScopeObject14isDynamicScopeERb +__ZN3JSC9Arguments3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSC17ConservativeRoots4growEv +__ZN3JSCL27objectProtoFuncDefineSetterEPNS_9ExecStateE +__ZN3JSC15ObjectPrototype3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE +__ZN3JSCL27objectProtoFuncLookupSetterEPNS_9ExecStateE +__ZN3JSC8JSObject12lookupSetterEPNS_9ExecStateERKNS_10IdentifierE +__ZN3JSCL27objectProtoFuncLookupGetterEPNS_9ExecStateE +__ZN3JSC8JSObject12lookupGetterEPNS_9ExecStateERKNS_10IdentifierE +__ZN3JSCL21stringProtoFuncAnchorEPNS_9ExecStateE +__ZN3WTF13tryMakeStringIPKcN3JSC7UStringES2_S4_S2_EENS_10PassRefPtrINS_10StringImplEEET_T0_T1_T2_T3_ +__ZN3JSCL18stringProtoFuncBigEPNS_9ExecStateE +__ZN3JSCL20stringProtoFuncBlinkEPNS_9ExecStateE +__ZN3JSC22jsMakeNontrivialStringIPKcNS_7UStringES2_EENS_7JSValueEPNS_9ExecStateET_T0_T1_ +__ZN3JSCL19stringProtoFuncBoldEPNS_9ExecStateE +__ZN3JSCL22stringProtoFuncItalicsEPNS_9ExecStateE +__ZN3JSCL20stringProtoFuncFixedEPNS_9ExecStateE +__ZN3JSCL24stringProtoFuncFontcolorEPNS_9ExecStateE +__ZN3JSCL23stringProtoFuncFontsizeEPNS_9ExecStateE +__ZN3JSCL19stringProtoFuncLinkEPNS_9ExecStateE +__ZN3JSCL20stringProtoFuncSmallEPNS_9ExecStateE +__ZN3JSCL21stringProtoFuncStrikeEPNS_9ExecStateE +__ZN3JSCL18stringProtoFuncSubEPNS_9ExecStateE +__ZN3JSCL18stringProtoFuncSupEPNS_9ExecStateE +__ZN3JSC18PostfixBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3JSC19globalFuncEncodeURIEPNS_9ExecStateE +__ZN3JSCL6encodeEPNS_9ExecStateEPKc +__ZN3JSC8JSString18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE +__ZN3JSCL35objectProtoFuncPropertyIsEnumerableEPNS_9ExecStateE __ZNK3JSC8JSObject20propertyIsEnumerableEPNS_9ExecStateERKNS_10IdentifierE -__ZN3JSC7JSArray24getOwnPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE +__ZN3JSC14JSGlobalObject24getOwnPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE +__ZN3JSC16JSVariableObject14symbolTableGetERKNS_10IdentifierERNS_18PropertyDescriptorE __ZN3JSC18PropertyDescriptor13setDescriptorENS_7JSValueEj -__ZNK3JSC18PropertyDescriptor10enumerableEv -__ZN3JSCL22JSONProtoFuncStringifyEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC11StringifierC2EPNS_9ExecStateENS_7JSValueES3_ -__ZN3JSC11Stringifier9stringifyENS_7JSValueE -__ZN3JSC11Stringifier22appendStringifiedValueERNS_13StringBuilderENS_7JSValueEPNS_8JSObjectERKNS_27PropertyNameForFunctionCallE -__ZNK3JSC6JSCell9getStringEPNS_9ExecStateERNS_7UStringE -__ZN3JSC11Stringifier6Holder18appendNextPropertyERS0_RNS_13StringBuilderE -__ZN3JSC11Stringifier18appendQuotedStringERNS_13StringBuilderERKNS_7UStringE -__ZN3JSC11StringifierD2Ev -__ZN3JSC5Lexer19copyCodeWithoutBOMsEv -__ZN3JSCL21dateProtoFuncSetHoursEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC17FunctionPrototype11getCallDataERNS_8CallDataE -__ZN3JSCL28dateProtoFuncGetMilliSecondsEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC10makeStringINS_7UStringES1_EES1_T_T0_ -__ZN3JSC13tryMakeStringINS_7UStringES1_EEN3WTF10PassRefPtrIN7WebCore10StringImplEEET_T0_ -__ZN3JSC23MacroAssemblerX86Common8branch16ENS0_9ConditionENS_22AbstractMacroAssemblerINS_12X86AssemblerEE9BaseIndexENS4_5Imm32E -__Z22jsc_pcre_ucp_othercasej -__ZN3JSC8JSString18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE -__ZN3JSCL24dateProtoFuncSetUTCHoursEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL26dateProtoFuncSetUTCMinutesEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL26dateProtoFuncSetUTCSecondsEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL23dateProtoFuncGetUTCDateEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL23dateProtoFuncSetUTCDateEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL24dateProtoFuncGetUTCHoursEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL26dateProtoFuncGetUTCMinutesEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL26dateProtoFuncGetUTCSecondsEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL24dateProtoFuncSetFullYearEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3WTF6VectorIiLm32EE15reserveCapacityEm -__ZN3JSCL22regExpProtoFuncCompileEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK3JSC27PropertyNameForFunctionCall5valueEPNS_9ExecStateE -_cti_op_new_error -__ZN7WebCore6String6numberEj -__ZN3JSCL27dateProtoFuncGetUTCFullYearEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL24dateProtoFuncGetUTCMonthEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL31dateProtoFuncToLocaleDateStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL16formatLocaleDateEPNS_9ExecStateEPNS_12DateInstanceEdNS_20LocaleDateTimeFormatERKNS_7ArgListE -__ZN3JSC10throwErrorEPNS_9ExecStateENS_9ErrorTypeEPKc -__ZN3JSCL23throwStackOverflowErrorEPNS_9ExecStateEPNS_12JSGlobalDataENS_16ReturnAddressPtrERS4_ -__ZN3JSC24createStackOverflowErrorEPNS_9ExecStateE -__ZN3JSC12RegisterFile21releaseExcessCapacityEv +__ZN3JSC19globalFuncDecodeURIEPNS_9ExecStateE +__ZN3JSC14createURIErrorEPNS_9ExecStateERKNS_7UStringE +__ZN3WTF6VectorISt4pairIPN3JSC14ExpressionNodeENS2_10ASTBuilder12BinaryOpInfoEELm10EE14expandCapacityEmPKS7_ +__ZN3WTF6VectorISt4pairIPN3JSC14ExpressionNodeENS2_10ASTBuilder12BinaryOpInfoEELm10EE15reserveCapacityEm +__ZN3WTF6VectorISt4pairIiiELm10EE14expandCapacityEm +__ZN3JSC29callHostFunctionAsConstructorEPNS_9ExecStateE +__ZN3JSC3JIT30emit_op_resolve_global_dynamicEPNS_11InstructionE +__ZN3JSC3JIT34emitSlow_op_resolve_global_dynamicEPNS_11InstructionERPNS_13SlowCaseEntryE +__ZNK3JSC9ArrayNode13isSimpleArrayEv +__ZN3JSCL17arrayProtoFuncMapEPNS_9ExecStateE +__ZN3JSCL21arrayProtoFuncForEachEPNS_9ExecStateE +__ZN3JSCL20arrayProtoFuncFilterEPNS_9ExecStateE +__ZN3JSCL19arrayProtoFuncEveryEPNS_9ExecStateE +__ZN3JSCL18arrayProtoFuncSomeEPNS_9ExecStateE +__ZN3JSCL21arrayProtoFuncIndexOfEPNS_9ExecStateE __ZN3JSC12StringObject18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE -__ZN3JSC19FunctionConstructor11getCallDataERNS_8CallDataE -__ZN7WebCore6String8fromUTF8EPKc -__ZN3JSCL27dateProtoFuncToLocaleStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC18BooleanConstructor16getConstructDataERNS_13ConstructDataE -__ZN3JSCL31constructWithBooleanConstructorEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE -__ZN3JSC16constructBooleanEPNS_9ExecStateERKNS_7ArgListE -__ZN3JSC7JSArray11sortNumericEPNS_9ExecStateENS_7JSValueENS_8CallTypeERKNS_8CallDataE -__ZN3JSCL22compareNumbersForQSortEPKvS1_ -__ZN3WTF6VectorIjLm16EE15reserveCapacityEm -__ZN3JSC8JSString16getIndexSlowCaseEPNS_9ExecStateEj -__ZN3JSCL25numberConstructorNaNValueEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZN3JSC6JSCell3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE -__ZN3JSC4Yarr15nondigitsCreateEv -__ZN3JSCL7dateUTCEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK3JSC7ArgList2atEm -__ZN3JSCL16mathProtoFuncTanEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK3JSC8JSObject16isVariableObjectEv -__ZN7WebCore6String6insertERKS0_j -__ZN7WebCore6String6insertEPKtjj -__ZN7WebCore10StringImpl37createStrippingNullCharactersSlowCaseEPKtj -__ZN3JSCL31dateProtoFuncToLocaleTimeStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3WTF7CString11mutableDataEv -__ZN3WTF7CString18copyBufferIfNeededEv -__ZN3JSCL18arrayProtoFuncSomeEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC21DebuggerStatementNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSCL31dateProtoFuncGetUTCMillisecondsEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3WTF15ThreadConditionD1Ev -__ZN3JSC18RegExpMatchesArray19getOwnPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE -__ZN3WTF6VectorIPNS0_IN3JSC10IdentifierELm64EEELm32EE14expandCapacityEm -__ZN3JSC15DateConstructor11getCallDataERNS_8CallDataE -__ZN3JSCL8callDateEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL22dateProtoFuncGetUTCDayEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL25arrayProtoFuncLastIndexOfEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL19arrayProtoFuncEveryEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL23callFunctionConstructorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL19stringProtoFuncLinkEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL25dateProtoFuncToDateStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC10throwErrorEPNS_9ExecStateEPNS_8JSObjectE -__ZN3JSCL27dateProtoFuncSetUTCFullYearEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL24dateProtoFuncSetUTCMonthEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL31dateProtoFuncSetUTCMillisecondsEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN7WebCore6String6numberEx -__ZNK3JSC17NumberConstructor9classInfoEv -__ZNK3JSC17RegExpConstructor9classInfoEv -__ZN3WTF9HashTableINS_6RefPtrIN7WebCore10StringImplEEESt4pairIS4_P19StaticFunctionEntryENS_18PairFirstExtractorIS8_EENS2_10Stri -__ZN3WTF9HashTableINS_6RefPtrIN7WebCore10StringImplEEESt4pairIS4_P16StaticValueEntryENS_18PairFirstExtractorIS8_EENS2_10StringH -__ZN3JSC16JSCallbackObjectINS_8JSObjectEE18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE -__ZN3JSC16JSCallbackObjectINS_8JSObjectEE20staticFunctionGetterEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZN3JSC18JSCallbackFunctionC1EPNS_9ExecStateEPFPK13OpaqueJSValuePK15OpaqueJSContextPS3_S9_mPKS5_PS5_ERKNS_10IdentifierE -__ZN3JSC18JSCallbackFunction11getCallDataERNS_8CallDataE -__ZN3JSC18JSCallbackFunction4callEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC6JSLock12DropAllLocksC1EPNS_9ExecStateE -_JSValueMakeUndefined -__ZN3JSC16JSCallbackObjectINS_8JSObjectEE17staticValueGetterEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -_JSValueMakeString -__ZN3JSC18JSCallbackFunctionD1Ev -_JSValueMakeBoolean -_JSStringCreateWithCharacters -_JSValueMakeNumber -__ZN3JSC4Heap6isBusyEv -__ZN7WebCore10StringImpl7replaceEtPS0_ -__ZNK3JSC8JSObject14isGlobalObjectEv -__ZNK7WebCore6String5splitEtbRN3WTF6VectorIS0_Lm0EEE -__ZN7WebCore6String6appendEt -__ZNK3JSC7UString8toUInt32EPb -__ZN3WTF9ByteArray6createEm -__ZN3JSC11JSByteArrayC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPNS3_9ByteArrayEPKNS_9ClassInfoE -__ZN3JSC11JSByteArrayC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEPNS3_9ByteArrayEPKNS_9ClassInfoE +__ZN3JSC8JSObject14deletePropertyEPNS_9ExecStateEj +__ZN3JSCL25arrayProtoFuncLastIndexOfEPNS_9ExecStateE +__ZNK3WTF6String7toFloatEPbS1_ +__ZN3WTF10StringImpl7toFloatEPbS1_ +__ZN3WTF17charactersToFloatEPKtmPbS2_ +__ZNK3JSC7UString5asciiEv +__ZN3JSC6JSLock12DropAllLocksC1ENS_14JSLockBehaviorE +__ZN3WTF10StringImpl8toDoubleEPbS1_ +__ZN3JSCL21stringProtoFuncSubstrEPNS_9ExecStateE +__ZN3WTF10StringImpl4findEPKcj +__ZN3WTF6String26fromUTF8WithLatin1FallbackEPKcm +__ZN3WTF10fastStrDupEPKc +__ZN3WTF17equalIgnoringCaseEPKtPKcj +__ZN3JSC10Identifier5equalEPKN3WTF10StringImplEPKc +__ZN3JSC11JSByteArray15createStructureERNS_12JSGlobalDataENS_7JSValueEPKNS_9ClassInfoE +__ZN3JSC11JSByteArrayC1EPNS_9ExecStateEPNS_9StructureEPN3WTF9ByteArrayE +__ZN3JSC11JSByteArrayC2EPNS_9ExecStateEPNS_9StructureEPN3WTF9ByteArrayE +__ZN3JSC11JSByteArrayD1Ev +_cti_op_get_by_val_byte_array __ZN3JSC11JSByteArray18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE __ZN3JSC11JSByteArray3putEPNS_9ExecStateEjNS_7JSValueE +_cti_op_put_by_val_byte_array +__ZN3JSC16throwSyntaxErrorEPNS_9ExecStateE +__ZN3WTF10StringImpl16findIgnoringCaseEPS0_j +__ZNK3WTF6String6toUIntEPb +__ZN3WTF10StringImpl6toUIntEPb +__ZN3WTF16charactersToUIntEPKtmPb +__ZN3WTFeqERKNS_12AtomicStringERKNS_6VectorItLm0EEE +__ZN3WTF12AtomicString16fromUTF8InternalEPKcS2_ +__ZN3WTF7Unicode36calculateStringHashAndLengthFromUTF8EPKcS2_RjS3_ +__ZNK3WTF6String5splitERKS0_RNS_6VectorIS0_Lm0EEE +__ZN3WTF10StringImpl7replaceEtPS0_ +__ZN3WTFeqERKNS_7CStringES2_ +__ZN3WTF10StringImpl6secureEtNS0_21LastCharacterBehaviorE +__ZNK3WTF6String5upperEv +__ZNK3JSC11Interpreter18retrieveLastCallerEPNS_9ExecStateERiRlRNS_7UStringERNS_7JSValueE +__ZNK3WTF6String6latin1Ev +__ZN3WTF6VectorIN3JSC14ExecutablePool10AllocationELm2EE15reserveCapacityEm +__ZN3WTF6String6numberEj +__ZNK3JSC8JSObject14isGlobalObjectEv +__ZN3WTF10StringImpl19characterStartingAtEj +__ZN3WTF6String6appendEt +__ZNK3WTF6String19characterStartingAtEj __ZN3JSC11JSByteArray3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE __ZN3JSC11JSByteArray18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE -_cti_op_get_by_val_byte_array -_cti_op_put_by_val_byte_array -_JSStringGetUTF8CString -__ZN3JSC16JSVariableObject19getOwnPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE -__ZNK3JSC22NativeErrorConstructor9classInfoEv -__ZNK3JSC16JSCallbackObjectINS_8JSObjectEE9classNameEv -__ZN3JSC6JSCell16getConstructDataERNS_13ConstructDataE -__ZN3JSC26createNotAConstructorErrorEPNS_9ExecStateENS_7JSValueEjPNS_9CodeBlockE -__ZNK3JSC4Heap11objectCountEv -__ZN3JSC14JSGlobalObject12defineGetterEPNS_9ExecStateERKNS_10IdentifierEPNS_8JSObjectEj -__ZN3JSC14JSGlobalObject12defineSetterEPNS_9ExecStateERKNS_10IdentifierEPNS_8JSObjectEj -__ZN3JSC9Structure22getterSetterTransitionEPS0_ -__ZN3JSCL28objectProtoFuncIsPrototypeOfEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC16JSCallbackObjectINS_8JSObjectEE11getCallDataERNS_8CallDataE -__ZN3JSCL23arrayConstructorIsArrayEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL21objectConstructorKeysEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC12DateInstanceC1EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEd -__ZN3JSC12DateInstanceC2EPNS_9ExecStateEN3WTF17NonNullPassRefPtrINS_9StructureEEEd -__ZN3JSCL24dateProtoFuncToISOStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC15createTypeErrorEPNS_9ExecStateEPKc -__ZNK3JSC11JSByteArray9classInfoEv -__ZN3JSC11JSByteArray19getOwnPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE -__ZN3JSC22NativeErrorConstructor11getCallDataERNS_8CallDataE -__ZN3JSCL36objectConstructorGetOwnPropertyNamesEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL41objectConstructorGetOwnPropertyDescriptorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC16JSVariableObject14symbolTableGetERKNS_10IdentifierERNS_18PropertyDescriptorE -__ZN3JSC8JSObject24getOwnPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE -__ZNK3JSC18PropertyDescriptor20isAccessorDescriptorEv -__ZNK3JSC18PropertyDescriptor8writableEv -__ZNK3JSC18PropertyDescriptor12configurableEv -__ZN3JSC12JSGlobalData6createENS_15ThreadStackTypeE +__ZN3WTF20equalIgnoringNullityEPNS_10StringImplES1_ +_cti_op_get_by_id_array_fail +__ZN3JSC17PrefixBracketNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE +__ZN3WTF21CrossThreadRefCountedINS_16OwnFastMallocPtrIKtEEE5derefEv __ZN3JSC12JSGlobalData10ClientDataD2Ev +__ZN3JSC8DebuggerD2Ev __ZN3WTF14ThreadSpecificINS_13WTFThreadDataEE7destroyEPv __ZN3WTF13WTFThreadDataD1Ev -__ZN7WebCore17AtomicStringTable7destroyEPS0_ +__ZN3WTF17AtomicStringTable7destroyEPS0_ __ZN3JSC15IdentifierTableD1Ev -__ZN3WTF9dayInYearEdi -__ZN3WTF18monthFromDayInYearEib -__ZN3WTF23dayInMonthFromDayInYearEib -__ZN3JSC6Walker4walkENS_7JSValueE -__ZN3WTF9HashTableIPN7WebCore10StringImplES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_EC2ERKSA_ -__ZN3WTF6VectorIPN3JSC7JSArrayELm16EE14expandCapacityEm -__ZN3WTF6VectorIjLm16EE14expandCapacityEm -__ZN3WTF6VectorIN3JSC11WalkerStateELm16EE14expandCapacityEm -__ZL30makeGetterOrSetterPropertyNodePN3JSC12JSGlobalDataERKNS_10IdentifierES4_PNS_13ParameterNodeEPNS_16FunctionBodyNodeERKNS_1 -__ZN3JSC17BytecodeGenerator13emitPutGetterEPNS_10RegisterIDERKNS_10IdentifierES2_ -__ZN3JSC3JIT18emit_op_put_getterEPNS_11InstructionE -_cti_op_put_getter -__ZN3JSCL23booleanProtoFuncValueOfEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL19dateProtoFuncToJSONEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC9ExecState9dateTableEPS0_ -__ZN3JSC10Identifier4fromEPNS_9ExecStateEd -__ZN3JSC13StringBuilder6appendEt -__ZN3JSC17BytecodeGenerator13emitPutSetterEPNS_10RegisterIDERKNS_10IdentifierES2_ -__ZN3JSC3JIT18emit_op_put_setterEPNS_11InstructionE -_cti_op_put_setter -__ZN3JSCL23objectConstructorCreateEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL16definePropertiesEPNS_9ExecStateEPNS_8JSObjectES3_ -__ZN3JSCL20toPropertyDescriptorEPNS_9ExecStateENS_7JSValueERNS_18PropertyDescriptorE -__ZN3JSC18PropertyDescriptor13setEnumerableEb -__ZN3WTF6VectorIN3JSC18PropertyDescriptorELm0EE14expandCapacityEm -__ZNK3JSC18PropertyDescriptor16isDataDescriptorEv -__ZN3JSC8JSObject17defineOwnPropertyEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorEb -__ZN3JSCL13putDescriptorEPNS_9ExecStateEPNS_8JSObjectERKNS_10IdentifierERNS_18PropertyDescriptorEjNS_7JSValueE -__ZNK3JSC18PropertyDescriptor19isGenericDescriptorEv -__ZN3JSCL31objectConstructorGetPrototypeOfEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC18PropertyDescriptor9setGetterENS_7JSValueE -__ZNK3JSC18PropertyDescriptor6getterEv -__ZNK3JSC18PropertyDescriptor6setterEv -__ZN3JSC18PropertyDescriptor15setConfigurableEb -__ZN3JSC18PropertyDescriptor11setWritableEb -__ZN3JSC18PropertyDescriptor9setSetterENS_7JSValueE -__ZN3JSCL33objectConstructorDefinePropertiesEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZNK3JSC18PropertyDescriptor7equalToEPNS_9ExecStateERKS0_ -__ZNK3JSC18PropertyDescriptor15attributesEqualERKS0_ -__ZNK3JSC18PropertyDescriptor22attributesWithOverrideERKS0_ -__ZN3JSCL31objectConstructorDefinePropertyEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC9ExecState11regExpTableEPS0_ -__ZN3JSC9Arguments19getOwnPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE -__ZN3JSC9ExecState11numberTableEPS0_ -__ZN3JSC9ExecState22regExpConstructorTableEPS0_ -__ZNK3JSC15RegExpPrototype9classInfoEv -__ZNK3JSC10MathObject9classInfoEv -__ZN3JSC9ExecState9mathTableEPS0_ -__ZN3JSC9ExecState9jsonTableEPS0_ -__ZN3JSCL20arrayProtoFuncReduceEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL25arrayProtoFuncReduceRightEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL28arrayProtoFuncToLocaleStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC19JSStaticScopeObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE -__ZN3JSCL25dateProtoFuncToTimeStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC7JSValueC1EPNS_9ExecStateEd -__ZN3JSC15DeleteValueNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC16PostfixErrorNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC23ThrowableExpressionData14emitThrowErrorERNS_17BytecodeGeneratorENS_9ErrorTypeEPKcRKNS_7UStringE -__ZN3JSC10makeStringINS_7UStringES1_S1_EES1_T_T0_T1_ -__ZN3JSC13tryMakeStringINS_7UStringES1_S1_EEN3WTF10PassRefPtrIN7WebCore10StringImplEEET_T0_T1_ -__ZN3JSC15PrefixErrorNode12emitBytecodeERNS_17BytecodeGeneratorEPNS_10RegisterIDE -__ZN3JSC23createInvalidParamErrorEPNS_9ExecStateEPKcNS_7JSValueEjPNS_9CodeBlockE -__ZN3JSC10makeStringIPKcS2_S2_EENS_7UStringET_T0_T1_ -__ZN3JSC13tryMakeStringIPKcS2_S2_EEN3WTF10PassRefPtrIN7WebCore10StringImplEEET_T0_T1_ -__ZNK3JSC15DotAccessorNode17isDotAccessorNodeEv -__ZNK3JSC14ExpressionNode17isDotAccessorNodeEv -__ZN3JSC13JSNotAnObject3putEPNS_9ExecStateEjNS_7JSValueE -__ZN3JSC14ArrayPrototype24getOwnPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE -__ZN3JSC13DatePrototype24getOwnPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE -__ZN3JSC15StringPrototype24getOwnPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE -__ZN3JSC12StringObject24getOwnPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE -__ZN3JSC8JSString27getStringPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE -__ZN3JSC17NumberConstructor24getOwnPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE -__ZN3JSC17RegExpConstructor24getOwnPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE -__ZN3JSCL22regExpConstructorInputEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZN3JSC12RegExpObject24getOwnPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE -__ZN3JSC10MathObject24getOwnPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE -__ZN3JSC18RegExpMatchesArray24getOwnPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE -__ZN3JSC10JSFunction24getOwnPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE -__ZN3JSC11JSByteArray24getOwnPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE -__ZNK3JSC16JSCallbackObjectINS_8JSObjectEE8toStringEPNS_9ExecStateE -__ZN3JSC10throwErrorEPNS_9ExecStateENS_9ErrorTypeERKNS_7UStringEilS5_ -__ZN3JSC17BytecodeGenerator35emitThrowExpressionTooDeepExceptionEv -__ZN3JSCL25numberConstructorMinValueEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZN3JSCL18mathProtoFuncATan2EPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL28numberProtoFuncToExponentialEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC16parseIntOverflowEPKcii -__ZN3JSCL29objectProtoFuncToLocaleStringEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL24regExpConstructorDollar5EPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZN3JSCL24regExpConstructorDollar6EPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZN3JSCL24regExpConstructorDollar7EPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZN3JSCL24regExpConstructorDollar8EPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZN3JSCL24regExpConstructorDollar9EPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZN3JSCL25setRegExpConstructorInputEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueE -__ZN3JSCL26regExpConstructorLastMatchEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZN3JSCL26regExpConstructorLastParenEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZNK3JSC17RegExpConstructor12getLastParenEPNS_9ExecStateE -__ZN3JSCL26regExpConstructorMultilineEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZN3JSCL29setRegExpConstructorMultilineEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueE -__ZNK3JSC17RegExpConstructor5inputEv -__ZN3JSC10makeStringIPKcS2_EENS_7UStringET_T0_ -__ZN3JSC13tryMakeStringIPKcS2_EEN3WTF10PassRefPtrIN7WebCore10StringImplEEET_T0_ -__ZN3JSC10throwErrorEPNS_9ExecStateENS_9ErrorTypeERKNS_7UStringE -__ZNK3JSC19JSStaticScopeObject12toThisObjectEPNS_9ExecStateE -__ZN3JSCL23stringProtoFuncTrimLeftEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL24stringProtoFuncTrimRightEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC12JSActivation18getArgumentsGetterEv -__ZN3JSC12JSActivation15argumentsGetterEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -__ZN3JSCL28stringProtoFuncLocaleCompareEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3WTF8Collator11userDefaultEv -__ZNK3WTF8Collator7collateEPKtmS2_m -__ZNK3WTF8Collator14createCollatorEv -__ZN3WTF8CollatorD1Ev -__ZN3WTF8Collator15releaseCollatorEv -__ZN3JSC9Arguments14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE -__ZN3JSCL26callNativeErrorConstructorEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSCL21callFunctionPrototypeEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3JSC6JSCell11getJSNumberEv -__ZN3JSCL16callRegExpObjectEPNS_9ExecStateEPNS_8JSObjectENS_7JSValueERKNS_7ArgListE -__ZN3WTF6VectorIN3JSC20FunctionRegisterInfoELm0EE14expandCapacityEm -__ZN3JSC3JIT25emit_op_profile_will_callEPNS_11InstructionE -__ZN3JSC3JIT24emit_op_profile_did_callEPNS_11InstructionE -__ZN3JSC8Profiler8profilerEv -__ZN3JSC8Profiler14startProfilingEPNS_9ExecStateERKNS_7UStringE -__ZN3JSC16ProfileGenerator6createERKNS_7UStringEPNS_9ExecStateEj -__ZN3JSC16ProfileGeneratorC2ERKNS_7UStringEPNS_9ExecStateEj -__ZN3JSC7Profile6createERKNS_7UStringEj -__ZN3JSC7ProfileC2ERKNS_7UStringEj -__ZN3JSC11ProfileNodeC1ERKNS_14CallIdentifierEPS0_S4_ -__ZN3JSC16ProfileGenerator24addParentForConsoleStartEPNS_9ExecStateE -__ZN3JSC8Profiler20createCallIdentifierEPNS_9ExecStateENS_7JSValueERKNS_7UStringEi -__ZN3JSC16InternalFunction21calculatedDisplayNameEPNS_9ExecStateE -__ZN3JSC16InternalFunction11displayNameEPNS_9ExecStateE -__ZN3JSC11ProfileNode10insertNodeEN3WTF10PassRefPtrIS0_EE -__ZN3WTF6VectorINS_6RefPtrIN3JSC11ProfileNodeEEELm0EE14expandCapacityEm -__ZN3WTF6VectorINS_6RefPtrIN3JSC16ProfileGeneratorEEELm0EE15reserveCapacityEm -_cti_op_profile_did_call -__ZN3JSC8Profiler10didExecuteEPNS_9ExecStateENS_7JSValueE -__ZN3JSC16ProfileGenerator10didExecuteERKNS_14CallIdentifierE -__ZN3JSC11ProfileNode10didExecuteEv -_cti_op_profile_will_call -__ZN3JSC8Profiler11willExecuteEPNS_9ExecStateENS_7JSValueE -__ZN3JSC16ProfileGenerator11willExecuteERKNS_14CallIdentifierE -__ZN3JSC11ProfileNode11willExecuteERKNS_14CallIdentifierE -__ZN3JSC8Profiler13stopProfilingEPNS_9ExecStateERKNS_7UStringE -__ZN3JSC16ProfileGenerator13stopProfilingEv -__ZN3JSC7Profile7forEachEMNS_11ProfileNodeEFvvE -__ZNK3JSC11ProfileNode25traverseNextNodePostOrderEv -__ZN3JSC11ProfileNode13stopProfilingEv -__ZN3JSC11ProfileNode11removeChildEPS0_ -__ZN3JSC11ProfileNode8addChildEN3WTF10PassRefPtrIS0_EE -__ZN3JSC8Debugger23recompileAllJSFunctionsEPNS_12JSGlobalDataE -__ZN3JSC4Heap16primaryHeapBeginEv -__ZN3JSC4Heap14primaryHeapEndEv -__ZNK3JSC18JSCallbackFunction9classInfoEv -__ZN3WTF7HashSetIPN3JSC18FunctionExecutableENS_7PtrHashIS3_EENS_10HashTraitsIS3_EEE3addERKS3_ -__ZN3WTF9HashTableIPN3JSC18FunctionExecutableES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E6expandE -__ZN3JSC18FunctionExecutable9recompileEPNS_9ExecStateE -__ZN3JSC8Profiler11willExecuteEPNS_9ExecStateERKNS_7UStringEi -__ZN3JSC8Profiler10didExecuteEPNS_9ExecStateERKNS_7UStringEi -__ZNK3JSC16ProfileGenerator5titleEv -__ZN3JSC9CodeBlock33functionRegisterForBytecodeOffsetEjRi -__ZN3JSC7ProfileD0Ev -__ZN3WTF10RefCountedIN3JSC11ProfileNodeEE5derefEv -__ZN3JSC34createTerminatedExecutionExceptionEPNS_12JSGlobalDataE -__ZNK3JSC24TerminatedExecutionError13exceptionTypeEv -__ZN3JSC24TerminatedExecutionErrorD1Ev -__ZN3WTF8CollatorC1EPKc -__ZN3WTF8Collator18setOrderLowerFirstEb -_JSValueIsEqual -__ZN3JSC7JSValue13equalSlowCaseEPNS_9ExecStateES0_S0_ -__ZNK3JSC14JSGlobalObject17supportsProfilingEv -__ZNK7WebCore6String12toUIntStrictEPbi -__ZN7WebCore10StringImpl12toUIntStrictEPbi -__ZN3WTF12randomNumberEv -__ZNK7WebCore6String8toUInt64EPb -__ZN7WebCore10StringImpl8toUInt64EPb -__ZN7WebCore18charactersToUInt64EPKtmPb -_JSStringGetMaximumUTF8CStringSize -__ZN3JSC16JSCallbackObjectINS_8JSObjectEE3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE -__ZN7WebCore6String6numberEm -__ZN3JSC4Heap17globalObjectCountEv -__ZN3JSC4Heap20protectedObjectCountEv -__ZN3JSC4Heap25protectedObjectTypeCountsEv -__ZN3WTF9HashTableIPKcSt4pairIS2_jENS_18PairFirstExtractorIS4_EENS_7PtrHashIS2_EENS_14PairHashTraitsINS_10HashTraitsIS2_EENSA_I -__ZNK3JSC6JSCell17isAPIValueWrapperEv -__ZNK3JSC6JSCell22isPropertyNameIteratorEv -__ZN3JSC4Heap16objectTypeCountsEv -__ZNK3JSC22JSPropertyNameIterator22isPropertyNameIteratorEv -__ZN3WTF20fastMallocStatisticsEv -__ZNK3JSC4Heap10statisticsEv -__ZN3WTF27releaseFastMallocFreeMemoryEv -_JSStringIsEqualToUTF8CString -__ZN3JSC16JSCallbackObjectINS_8JSObjectEE14callbackGetterEPNS_9ExecStateENS_7JSValueERKNS_10IdentifierE -_JSObjectSetPrivate -__ZN3JSC8Debugger6attachEPNS_14JSGlobalObjectE -__ZN3WTF9HashTableIPN3JSC14JSGlobalObjectES3_NS_17IdentityExtractorIS3_EENS_7PtrHashIS3_EENS_10HashTraitsIS3_EES9_E6rehashEi -__ZN3WTF9HashTableIPN3JSC14SourceProviderESt4pairIS3_PNS1_9ExecStateEENS_18PairFirstExtractorIS7_EENS_7PtrHashIS3_EENS_14PairHa -__ZN3JSC7UString4fromEl -__ZN3JSC3JIT13emit_op_debugEPNS_11InstructionE -_cti_op_debug -__ZN3JSC11Interpreter5debugEPNS_9ExecStateENS_11DebugHookIDEii -__ZNK3JSC17DebuggerCallFrame4typeEv -__ZNK3JSC17DebuggerCallFrame22calculatedFunctionNameEv -__ZNK3JSC12JSActivation18isActivationObjectEv -__ZNK3JSC17DebuggerCallFrame10thisObjectEv -__ZN3WTF28setMainThreadCallbacksPausedEb -__ZNK3JSC17DebuggerCallFrame8evaluateERKNS_7UStringERNS_7JSValueE -__ZN3JSC8Debugger6detachEPNS_14JSGlobalObjectE -_JSValueIsObjectOfClass diff --git a/JavaScriptCore.pri b/JavaScriptCore.pri index de5505f..ed4cf2e 100644 --- a/JavaScriptCore.pri +++ b/JavaScriptCore.pri @@ -1,86 +1,84 @@ # JavaScriptCore - Qt4 build info + +include(../common.pri) + VPATH += $$PWD -CONFIG(debug, debug|release) { - # Output in JavaScriptCore/ - JAVASCRIPTCORE_DESTDIR = debug - # Use a config-specific target to prevent parallel builds file clashes on Mac - JAVASCRIPTCORE_TARGET = jscored -} else { - JAVASCRIPTCORE_DESTDIR = release - JAVASCRIPTCORE_TARGET = jscore -} + +# Use a config-specific target to prevent parallel builds file clashes on Mac +mac: CONFIG(debug, debug|release): JAVASCRIPTCORE_TARGET = jscored +else: JAVASCRIPTCORE_TARGET = jscore + +# Output in JavaScriptCore/ +CONFIG(debug, debug|release) : JAVASCRIPTCORE_DESTDIR = debug +else: JAVASCRIPTCORE_DESTDIR = release + CONFIG(standalone_package) { isEmpty(JSC_GENERATED_SOURCES_DIR):JSC_GENERATED_SOURCES_DIR = $$PWD/generated } else { - isEmpty(JSC_GENERATED_SOURCES_DIR):JSC_GENERATED_SOURCES_DIR = generated -} - -CONFIG(standalone_package): DEFINES *= NDEBUG - -symbian: { - # Need to guarantee this comes before system includes of /epoc32/include - MMP_RULES += "USERINCLUDE ../JavaScriptCore/profiler" - LIBS += -lhal - # For hal.h - INCLUDEPATH *= $$MW_LAYER_SYSTEMINCLUDE + isEmpty(JSC_GENERATED_SOURCES_DIR):JSC_GENERATED_SOURCES_DIR = $$OUTPUT_DIR/JavaScriptCore/generated } -INCLUDEPATH = \ +JAVASCRIPTCORE_INCLUDEPATH = \ $$PWD \ $$PWD/.. \ + $$PWD/../ThirdParty \ $$PWD/assembler \ $$PWD/bytecode \ $$PWD/bytecompiler \ + $$PWD/heap \ + $$PWD/dfg \ $$PWD/debugger \ $$PWD/interpreter \ $$PWD/jit \ $$PWD/parser \ - $$PWD/pcre \ $$PWD/profiler \ $$PWD/runtime \ $$PWD/wtf \ + $$PWD/wtf/gobject \ $$PWD/wtf/symbian \ $$PWD/wtf/unicode \ $$PWD/yarr \ $$PWD/API \ $$PWD/ForwardingHeaders \ - $$JSC_GENERATED_SOURCES_DIR \ - $$INCLUDEPATH + $$JSC_GENERATED_SOURCES_DIR + +symbian { + PREPEND_INCLUDEPATH = $$JAVASCRIPTCORE_INCLUDEPATH $$PREPEND_INCLUDEPATH +} else { + INCLUDEPATH = $$JAVASCRIPTCORE_INCLUDEPATH $$INCLUDEPATH +} + +symbian { + LIBS += -lhal + INCLUDEPATH *= $$MW_LAYER_SYSTEMINCLUDE +} win32-*: DEFINES += _HAS_TR1=0 -DEFINES += BUILDING_QT__ BUILDING_JavaScriptCore BUILDING_WTF +DEFINES += BUILDING_JavaScriptCore BUILDING_WTF -contains(JAVASCRIPTCORE_JIT,yes) { - DEFINES+=ENABLE_JIT=1 - DEFINES+=ENABLE_YARR_JIT=1 - DEFINES+=ENABLE_YARR=1 -} -contains(JAVASCRIPTCORE_JIT,no) { - DEFINES+=ENABLE_JIT=0 - DEFINES+=ENABLE_YARR_JIT=0 - DEFINES+=ENABLE_YARR=0 +# CONFIG += text_breaking_with_icu + +contains (CONFIG, text_breaking_with_icu) { + DEFINES += WTF_USE_QT_ICU_TEXT_BREAKING=1 } wince* { INCLUDEPATH += $$QT_SOURCE_TREE/src/3rdparty/ce-compat - DEFINES += WINCEBASIC - - INCLUDEPATH += $$PWD/../JavaScriptCore/os-wince INCLUDEPATH += $$PWD/../JavaScriptCore/os-win32 } -defineTest(addJavaScriptCoreLib) { +defineTest(prependJavaScriptCoreLib) { # Argument is the relative path to JavaScriptCore.pro's qmake output pathToJavaScriptCoreOutput = $$ARGS/$$JAVASCRIPTCORE_DESTDIR win32-msvc*|wince* { - LIBS += -L$$pathToJavaScriptCoreOutput - LIBS += -l$$JAVASCRIPTCORE_TARGET + LIBS = -l$$JAVASCRIPTCORE_TARGET $$LIBS + LIBS = -L$$pathToJavaScriptCoreOutput $$LIBS POST_TARGETDEPS += $${pathToJavaScriptCoreOutput}$${QMAKE_DIR_SEP}$${JAVASCRIPTCORE_TARGET}.lib } else:symbian { - LIBS += -l$${JAVASCRIPTCORE_TARGET}.lib + LIBS = -l$${JAVASCRIPTCORE_TARGET}.lib $$LIBS # The default symbian build system does not use library paths at all. However when building with # qmake's symbian makespec that uses Makefiles QMAKE_LIBDIR += $$pathToJavaScriptCoreOutput @@ -89,7 +87,7 @@ defineTest(addJavaScriptCoreLib) { # Make sure jscore will be early in the list of libraries to workaround a bug in MinGW # that can't resolve symbols from QtCore if libjscore comes after. QMAKE_LIBDIR = $$pathToJavaScriptCoreOutput $$QMAKE_LIBDIR - LIBS += -l$$JAVASCRIPTCORE_TARGET + LIBS = -l$$JAVASCRIPTCORE_TARGET $$LIBS POST_TARGETDEPS += $${pathToJavaScriptCoreOutput}$${QMAKE_DIR_SEP}lib$${JAVASCRIPTCORE_TARGET}.a } @@ -109,3 +107,4 @@ defineTest(addJavaScriptCoreLib) { return(true) } + diff --git a/JavaScriptCore.pro b/JavaScriptCore.pro index 8b0a0ef..3e0caf8 100644 --- a/JavaScriptCore.pro +++ b/JavaScriptCore.pro @@ -16,20 +16,6 @@ CONFIG += depend_includepath contains(QT_CONFIG, embedded):CONFIG += embedded -CONFIG(QTDIR_build) { - # Make sure we compile both debug and release on mac when inside Qt. - # This line was extracted from qbase.pri instead of including the whole file - win32|mac:!macx-xcode:CONFIG += debug_and_release -} else { - CONFIG(debug, debug|release) { - OBJECTS_DIR = obj/debug - } else { # Release - OBJECTS_DIR = obj/release - } - # Make sure that build_all follows the build_all config in WebCore - mac:contains(QT_CONFIG, qt_framework):!CONFIG(webkit_no_framework):!build_pass:CONFIG += build_all -} - # WebCore adds these config only when in a standalone build. # qbase.pri takes care of that when in a QTDIR_build # Here we add the config for both cases since we don't include qbase.pri @@ -42,14 +28,6 @@ CONFIG(QTDIR_build) { CONFIG += no_debug_info } -# Pick up 3rdparty libraries from INCLUDE/LIB just like with MSVC -win32-g++ { - TMPPATH = $$quote($$(INCLUDE)) - QMAKE_INCDIR_POST += $$split(TMPPATH,";") - TMPPATH = $$quote($$(LIB)) - QMAKE_LIBDIR_POST += $$split(TMPPATH,";") -} - *-g++*:QMAKE_CXXFLAGS_RELEASE -= -O2 *-g++*:QMAKE_CXXFLAGS_RELEASE += -O3 @@ -65,7 +43,10 @@ wince* { SOURCES += $$QT_SOURCE_TREE/src/3rdparty/ce-compat/ce_time.c } -include(pcre/pcre.pri) +include(yarr/yarr.pri) +include(wtf/wtf.pri) + +INSTALLDEPS += all SOURCES += \ API/JSBase.cpp \ @@ -79,7 +60,11 @@ SOURCES += \ API/JSValueRef.cpp \ API/OpaqueJSString.cpp \ assembler/ARMAssembler.cpp \ + assembler/ARMv7Assembler.cpp \ assembler/MacroAssemblerARM.cpp \ + assembler/MacroAssemblerSH4.h \ + assembler/MacroAssemblerSH4.cpp \ + assembler/SH4Assembler.h \ bytecode/CodeBlock.cpp \ bytecode/JumpTable.cpp \ bytecode/Opcode.cpp \ @@ -87,20 +72,36 @@ SOURCES += \ bytecode/StructureStubInfo.cpp \ bytecompiler/BytecodeGenerator.cpp \ bytecompiler/NodesCodegen.cpp \ + heap/ConservativeRoots.cpp \ + heap/HandleHeap.cpp \ + heap/HandleStack.cpp \ + heap/Heap.cpp \ + heap/MachineStackMarker.cpp \ + heap/MarkStack.cpp \ + heap/MarkStackPosix.cpp \ + heap/MarkStackSymbian.cpp \ + heap/MarkStackWin.cpp \ + heap/MarkedBlock.cpp \ + heap/MarkedSpace.cpp \ debugger/DebuggerActivation.cpp \ debugger/DebuggerCallFrame.cpp \ debugger/Debugger.cpp \ + dfg/DFGByteCodeParser.cpp \ + dfg/DFGGraph.cpp \ + dfg/DFGJITCodeGenerator.cpp \ + dfg/DFGJITCompiler.cpp \ + dfg/DFGNonSpeculativeJIT.cpp \ + dfg/DFGOperations.cpp \ + dfg/DFGSpeculativeJIT.cpp \ interpreter/CallFrame.cpp \ interpreter/Interpreter.cpp \ interpreter/RegisterFile.cpp \ jit/ExecutableAllocatorFixedVMPool.cpp \ - jit/ExecutableAllocatorPosix.cpp \ - jit/ExecutableAllocatorSymbian.cpp \ - jit/ExecutableAllocatorWin.cpp \ jit/ExecutableAllocator.cpp \ jit/JITArithmetic.cpp \ jit/JITArithmetic32_64.cpp \ jit/JITCall.cpp \ + jit/JITCall32_64.cpp \ jit/JIT.cpp \ jit/JITOpcodes.cpp \ jit/JITOpcodes32_64.cpp \ @@ -108,10 +109,12 @@ SOURCES += \ jit/JITPropertyAccess32_64.cpp \ jit/JITStubs.cpp \ jit/ThunkGenerators.cpp \ + parser/JSParser.cpp \ parser/Lexer.cpp \ parser/Nodes.cpp \ parser/ParserArena.cpp \ parser/Parser.cpp \ + parser/SourceProviderCache.cpp \ profiler/Profile.cpp \ profiler/ProfileGenerator.cpp \ profiler/ProfileNode.cpp \ @@ -124,7 +127,6 @@ SOURCES += \ runtime/BooleanObject.cpp \ runtime/BooleanPrototype.cpp \ runtime/CallData.cpp \ - runtime/Collector.cpp \ runtime/CommonIdentifiers.cpp \ runtime/Completion.cpp \ runtime/ConstructData.cpp \ @@ -140,8 +142,8 @@ SOURCES += \ runtime/Executable.cpp \ runtime/FunctionConstructor.cpp \ runtime/FunctionPrototype.cpp \ + runtime/GCActivityCallback.cpp \ runtime/GetterSetter.cpp \ - runtime/GlobalEvalFunction.cpp \ runtime/Identifier.cpp \ runtime/InitializeThreading.cpp \ runtime/InternalFunction.cpp \ @@ -154,11 +156,10 @@ SOURCES += \ runtime/JSGlobalData.cpp \ runtime/JSGlobalObject.cpp \ runtime/JSGlobalObjectFunctions.cpp \ - runtime/JSImmediate.cpp \ runtime/JSLock.cpp \ runtime/JSNotAnObject.cpp \ - runtime/JSNumberCell.cpp \ runtime/JSObject.cpp \ + runtime/JSObjectWithGlobalObject.cpp \ runtime/JSONObject.cpp \ runtime/JSPropertyNameIterator.cpp \ runtime/JSStaticScopeObject.cpp \ @@ -168,10 +169,6 @@ SOURCES += \ runtime/JSWrapperObject.cpp \ runtime/LiteralParser.cpp \ runtime/Lookup.cpp \ - runtime/MarkStackPosix.cpp \ - runtime/MarkStackSymbian.cpp \ - runtime/MarkStackWin.cpp \ - runtime/MarkStack.cpp \ runtime/MathObject.cpp \ runtime/NativeErrorConstructor.cpp \ runtime/NativeErrorPrototype.cpp \ @@ -184,7 +181,6 @@ SOURCES += \ runtime/PropertyDescriptor.cpp \ runtime/PropertyNameArray.cpp \ runtime/PropertySlot.cpp \ - runtime/PrototypeFunction.cpp \ runtime/RegExpConstructor.cpp \ runtime/RegExp.cpp \ runtime/RegExpObject.cpp \ @@ -193,51 +189,36 @@ SOURCES += \ runtime/RopeImpl.cpp \ runtime/ScopeChain.cpp \ runtime/SmallStrings.cpp \ + runtime/StrictEvalActivation.cpp \ runtime/StringConstructor.cpp \ runtime/StringObject.cpp \ runtime/StringPrototype.cpp \ + runtime/StringRecursionChecker.cpp \ runtime/StructureChain.cpp \ runtime/Structure.cpp \ runtime/TimeoutChecker.cpp \ runtime/UString.cpp \ - wtf/Assertions.cpp \ - wtf/ByteArray.cpp \ - wtf/CurrentTime.cpp \ - wtf/DateMath.cpp \ - wtf/dtoa.cpp \ - wtf/FastMalloc.cpp \ - wtf/HashTable.cpp \ - wtf/MD5.cpp \ - wtf/MainThread.cpp \ - wtf/qt/MainThreadQt.cpp \ - wtf/qt/StringQt.cpp \ - wtf/qt/ThreadingQt.cpp \ - wtf/RandomNumber.cpp \ - wtf/RefCountedLeakCounter.cpp \ - wtf/symbian/BlockAllocatorSymbian.cpp \ - wtf/ThreadingNone.cpp \ - wtf/Threading.cpp \ - wtf/TypeTraits.cpp \ - wtf/WTFThreadData.cpp \ - wtf/text/AtomicString.cpp \ - wtf/text/CString.cpp \ - wtf/text/StringImpl.cpp \ - wtf/text/StringStatics.cpp \ - wtf/text/WTFString.cpp \ - wtf/unicode/CollatorDefault.cpp \ - wtf/unicode/icu/CollatorICU.cpp \ - wtf/unicode/UTF8.cpp \ - yarr/RegexCompiler.cpp \ - yarr/RegexInterpreter.cpp \ - yarr/RegexJIT.cpp + yarr/YarrJIT.cpp \ + +*sh4* { + QMAKE_CXXFLAGS += -mieee -w + QMAKE_CFLAGS += -mieee -w +} # Generated files, simply list them for JavaScriptCore -SOURCES += \ - $${JSC_GENERATED_SOURCES_DIR}/Grammar.cpp -!contains(DEFINES, USE_SYSTEM_MALLOC) { - SOURCES += wtf/TCSystemAlloc.cpp +symbian: { + symbian-abld|symbian-sbsv2 { + MMP_RULES += ALWAYS_BUILD_AS_ARM + } else { + QMAKE_CFLAGS -= --thumb + QMAKE_CXXFLAGS -= --thumb + } + QMAKE_CXXFLAGS.ARMCC += -OTime -O3 +} + +lessThan(QT_GCC_MAJOR_VERSION, 5):lessThan(QT_GCC_MINOR_VERSION, 6) { + # Disable C++0x mode in JSC for those who enabled it in their Qt's mkspec. + *-g++*:QMAKE_CXXFLAGS -= -std=c++0x -std=gnu++0x } -# Disable C++0x mode in JSC for those who enabled it in their Qt's mkspec -*-g++*:QMAKE_CXXFLAGS -= -std=c++0x -std=gnu++0x diff --git a/JavaScriptCorePrefix.h b/JavaScriptCorePrefix.h index 13b21bb..21d6204 100644 --- a/JavaScriptCorePrefix.h +++ b/JavaScriptCorePrefix.h @@ -33,3 +33,4 @@ /* Work around bug with C++ library that screws up Objective-C++ when exception support is disabled. */ #undef try #undef catch + diff --git a/JavaScriptCoreSources.bkl b/JavaScriptCoreSources.bkl deleted file mode 100644 index e69de29..0000000 diff --git a/KeywordLookupGenerator.py b/KeywordLookupGenerator.py new file mode 100644 index 0000000..6ba7e34 --- /dev/null +++ b/KeywordLookupGenerator.py @@ -0,0 +1,230 @@ +# Copyright (C) 2010 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. + +import sys +import string +import operator + +keywordsText = open(sys.argv[1]).read() + +# Observed weights of the most common keywords, rounded to 2.s.d +keyWordWeights = { + "catch": 0.01, + "try": 0.01, + "while": 0.01, + "case": 0.01, + "break": 0.01, + "new": 0.01, + "in": 0.01, + "typeof": 0.02, + "true": 0.02, + "false": 0.02, + "for": 0.03, + "null": 0.03, + "else": 0.03, + "return": 0.13, + "var": 0.13, + "if": 0.16, + "function": 0.18, + "this": 0.18, +} + + +def allWhitespace(str): + for c in str: + if not(c in string.whitespace): + return False + return True + + +def parseKeywords(keywordsText): + lines = keywordsText.split("\n") + lines = [line.split("#")[0] for line in lines] + lines = [line for line in lines if (not allWhitespace(line))] + name = lines[0].split() + terminator = lines[-1] + if not name[0] == "@begin": + raise Exception("expected description beginning with @begin") + if not terminator == "@end": + raise Exception("expected description ending with @end") + + lines = lines[1:-1] # trim off the old heading + return [line.split() for line in lines] + + +def makePadding(size): + str = "" + for i in range(size): + str = str + " " + return str + + +class Trie: + def __init__(self, prefix): + self.prefix = prefix + self.keys = {} + self.value = None + + def insert(self, key, value): + if len(key) == 0: + self.value = value + return + if not (key[0] in self.keys): + self.keys[key[0]] = Trie(key[0]) + self.keys[key[0]].insert(key[1:], value) + + def coalesce(self): + keys = {} + for k, v in self.keys.items(): + t = v.coalesce() + keys[t.prefix] = t + self.keys = keys + if self.value != None: + return self + if len(self.keys) != 1: + return self + (prefix, suffix) = self.keys.items()[0] + res = Trie(self.prefix + prefix) + res.value = suffix.value + res.keys = suffix.keys + return res + + def fillOut(self, prefix=""): + self.fullPrefix = prefix + self.prefix + weight = 0 + if self.fullPrefix in keyWordWeights: + weight = weight + keyWordWeights[self.fullPrefix] + self.selfWeight = weight + for trie in self.keys.values(): + trie.fillOut(self.fullPrefix) + weight = weight + trie.weight + self.keys = [(trie.prefix, trie) for trie in sorted(self.keys.values(), key=operator.attrgetter('weight'), reverse=True)] + self.weight = weight + + def printSubTreeAsC(self, indent): + str = makePadding(indent) + + if self.value != None: + print(str + "if (!isIdentPart(code[%d])) {" % (len(self.fullPrefix))) + print(str + " internalShift<%d, DoNotBoundsCheck>();" % len(self.fullPrefix)) + print(str + " if (shouldCreateIdentifier)") + print(str + (" data->ident = &m_globalData->propertyNames->%sKeyword;" % self.fullPrefix)) + print(str + " return " + self.value + ";") + print(str + "}") + rootIndex = len(self.fullPrefix) + itemCount = 0 + for k, trie in self.keys: + baseIndex = rootIndex + if (baseIndex > 0) and (len(k) == 3): + baseIndex = baseIndex - 1 + k = trie.fullPrefix[baseIndex] + k + test = [("'%s'" % c) for c in k] + if len(test) == 1: + comparison = "code[%d] == %s" % (baseIndex, test[0]) + else: + base = "code" + if baseIndex > 0: + base = "code + %d" % baseIndex + comparison = ("COMPARE_CHARACTERS%d(%s, " % (len(test), base)) + ", ".join(test) + ")" + if itemCount == 0: + print(str + "if (" + comparison + ") {") + else: + print(str + "else if (" + comparison + ") {") + + trie.printSubTreeAsC(indent + 4) + itemCount = itemCount + 1 + print(str + "}") + + def maxLength(self): + max = len(self.fullPrefix) + for (_, trie) in self.keys: + l = trie.maxLength() + if l > max: + max = l + return max + + def printAsC(self): + print("namespace JSC {") + print("static ALWAYS_INLINE bool isIdentPart(int c);") + # max length + 1 so we don't need to do any bounds checking at all + print("static const int maxTokenLength = %d;" % (self.maxLength() + 1)) + print("template ALWAYS_INLINE JSTokenType Lexer::parseKeyword(JSTokenData* data) {") + print(" ASSERT(m_codeEnd - m_code >= maxTokenLength);") + print(" const UChar* code = m_code;") + self.printSubTreeAsC(4) + print(" return IDENT;") + print("}") + print("}") + +keywords = parseKeywords(keywordsText) +trie = Trie("") +for k, v in keywords: + trie.insert(k, v) +trie.coalesce() +trie.fillOut() +print("// This file was generated by KeywordLookupGenerator.py. Do not edit.") +print(""" + +#if CPU(NEEDS_ALIGNED_ACCESS) + +#define COMPARE_CHARACTERS2(address, char1, char2) \ + (((address)[0] == char1) && ((address)[1] == char2)) +#define COMPARE_CHARACTERS4(address, char1, char2, char3, char4) \ + (COMPARE_CHARACTERS2(address, char1, char2) && COMPARE_CHARACTERS2((address) + 2, char3, char4)) + +#else + +#if CPU(BIG_ENDIAN) +#define CHARPAIR_TOUINT32(a, b) ((((uint32_t)(a)) << 16) + (uint32_t)(b)) +#define CHARQUAD_TOUINT64(a, b, c, d) ((((uint64_t)(CHARPAIR_TOUINT32(a, b))) << 32) + CHARPAIR_TOUINT32(c, d)) +#else +#define CHARPAIR_TOUINT32(a, b) ((((uint32_t)(b)) << 16) + (uint32_t)(a)) +#define CHARQUAD_TOUINT64(a, b, c, d) ((((uint64_t)(CHARPAIR_TOUINT32(c, d))) << 32) + CHARPAIR_TOUINT32(a, b)) +#endif + +#define COMPARE_CHARACTERS2(address, char1, char2) \ + (((uint32_t*)(address))[0] == CHARPAIR_TOUINT32(char1, char2)) +#if CPU(X86_64) + +#define COMPARE_CHARACTERS4(address, char1, char2, char3, char4) \ + (((uint64_t*)(address))[0] == CHARQUAD_TOUINT64(char1, char2, char3, char4)) +#else +#define COMPARE_CHARACTERS4(address, char1, char2, char3, char4) \ + (COMPARE_CHARACTERS2(address, char1, char2) && COMPARE_CHARACTERS2((address) + 2, char3, char4)) +#endif + +#endif + +#define COMPARE_CHARACTERS3(address, char1, char2, char3) \ + (COMPARE_CHARACTERS2(address, char1, char2) && ((address)[2] == (char3))) +#define COMPARE_CHARACTERS5(address, char1, char2, char3, char4, char5) \ + (COMPARE_CHARACTERS4(address, char1, char2, char3, char4) && ((address)[4] == (char5))) +#define COMPARE_CHARACTERS6(address, char1, char2, char3, char4, char5, char6) \ + (COMPARE_CHARACTERS4(address, char1, char2, char3, char4) && COMPARE_CHARACTERS2(address + 4, char5, char6)) +#define COMPARE_CHARACTERS7(address, char1, char2, char3, char4, char5, char6, char7) \ + (COMPARE_CHARACTERS4(address, char1, char2, char3, char4) && COMPARE_CHARACTERS4(address + 3, char4, char5, char6, char7)) +#define COMPARE_CHARACTERS8(address, char1, char2, char3, char4, char5, char6, char7, char8) \ + (COMPARE_CHARACTERS4(address, char1, char2, char3, char4) && COMPARE_CHARACTERS4(address + 4, char5, char6, char7, char8)) +""") + +trie.printAsC() diff --git a/Makefile b/Makefile index b9e2a72..cb4c11a 100644 --- a/Makefile +++ b/Makefile @@ -1,2 +1 @@ -OTHER_OPTIONS = -target All include ../Makefile.shared diff --git a/assembler/ARMAssembler.cpp b/assembler/ARMAssembler.cpp index a181b7e..f86444d 100644 --- a/assembler/ARMAssembler.cpp +++ b/assembler/ARMAssembler.cpp @@ -272,8 +272,8 @@ void ARMAssembler::dataTransfer32(bool isLoad, RegisterID srcDst, RegisterID bas add_r(ARMRegisters::S0, base, OP2_IMM | (offset >> 12) | (10 << 8)); dtr_u(isLoad, srcDst, ARMRegisters::S0, (offset & 0xfff) | transferFlag); } else { - ARMWord reg = getImm(offset, ARMRegisters::S0); - dtr_ur(isLoad, srcDst, base, reg | transferFlag); + moveImm(offset, ARMRegisters::S0); + dtr_ur(isLoad, srcDst, base, ARMRegisters::S0 | transferFlag); } } else { offset = -offset; @@ -283,8 +283,8 @@ void ARMAssembler::dataTransfer32(bool isLoad, RegisterID srcDst, RegisterID bas sub_r(ARMRegisters::S0, base, OP2_IMM | (offset >> 12) | (10 << 8)); dtr_d(isLoad, srcDst, ARMRegisters::S0, (offset & 0xfff) | transferFlag); } else { - ARMWord reg = getImm(offset, ARMRegisters::S0); - dtr_dr(isLoad, srcDst, base, reg | transferFlag); + moveImm(offset, ARMRegisters::S0); + dtr_dr(isLoad, srcDst, base, ARMRegisters::S0 | transferFlag); } } } @@ -343,23 +343,23 @@ void ARMAssembler::doubleTransfer(bool isLoad, FPRegisterID srcDst, RegisterID b fdtr_u(isLoad, srcDst, ARMRegisters::S0, 0); } -void* ARMAssembler::executableCopy(ExecutablePool* allocator) +void* ARMAssembler::executableCopy(JSGlobalData& globalData, ExecutablePool* allocator) { // 64-bit alignment is required for next constant pool and JIT code as well m_buffer.flushWithoutBarrier(true); - if (m_buffer.uncheckedSize() & 0x7) + if (!m_buffer.isAligned(8)) bkpt(0); - char* data = reinterpret_cast(m_buffer.executableCopy(allocator)); + char* data = reinterpret_cast(m_buffer.executableCopy(globalData, allocator)); for (Jumps::Iterator iter = m_jumps.begin(); iter != m_jumps.end(); ++iter) { // The last bit is set if the constant must be placed on constant pool. - int pos = (*iter) & (~0x1); - ARMWord* ldrAddr = reinterpret_cast(data + pos); + int pos = (iter->m_offset) & (~0x1); + ARMWord* ldrAddr = reinterpret_cast_ptr(data + pos); ARMWord* addr = getLdrImmAddress(ldrAddr); if (*addr != InvalidBranchTarget) { - if (!(*iter & 1)) { - int diff = reinterpret_cast(data + *addr) - (ldrAddr + DefaultPrefetching); + if (!(iter->m_offset & 1)) { + int diff = reinterpret_cast_ptr(data + *addr) - (ldrAddr + DefaultPrefetching); if ((diff <= BOFFSET_MAX && diff >= BOFFSET_MIN)) { *ldrAddr = B | getConditionalField(*ldrAddr) | (diff & BRANCH_MASK); diff --git a/assembler/ARMAssembler.h b/assembler/ARMAssembler.h index 2ca0949..1a216fe 100644 --- a/assembler/ARMAssembler.h +++ b/assembler/ARMAssembler.h @@ -40,32 +40,54 @@ namespace JSC { r0 = 0, r1, r2, - r3, - S0 = r3, + r3, S0 = r3, r4, r5, r6, r7, - r8, - S1 = r8, + r8, S1 = r8, r9, r10, r11, r12, - r13, - sp = r13, - r14, - lr = r14, - r15, - pc = r15 + r13, sp = r13, + r14, lr = r14, + r15, pc = r15 } RegisterID; typedef enum { d0, d1, d2, - d3, - SD0 = d3 + d3, SD0 = d3, + d4, + d5, + d6, + d7, + d8, + d9, + d10, + d11, + d12, + d13, + d14, + d15, + d16, + d17, + d18, + d19, + d20, + d21, + d22, + d23, + d24, + d25, + d26, + d27, + d28, + d29, + d30, + d31 } FPRegisterID; } // namespace ARMRegisters @@ -75,7 +97,7 @@ namespace JSC { typedef ARMRegisters::RegisterID RegisterID; typedef ARMRegisters::FPRegisterID FPRegisterID; typedef AssemblerBufferWithConstantPool<2048, 4, 4, ARMAssembler> ARMBuffer; - typedef SegmentedVector Jumps; + typedef SegmentedVector Jumps; ARMAssembler() { } @@ -118,12 +140,12 @@ namespace JSC { MVN = (0xf << 21), MUL = 0x00000090, MULL = 0x00c00090, - FADDD = 0x0e300b00, - FDIVD = 0x0e800b00, - FSUBD = 0x0e300b40, - FMULD = 0x0e200b00, - FCMPD = 0x0eb40b40, - FSQRTD = 0x0eb10bc0, + VADD_F64 = 0x0e300b00, + VDIV_F64 = 0x0e800b00, + VSUB_F64 = 0x0e300b40, + VMUL_F64 = 0x0e200b00, + VCMP_F64 = 0x0eb40b40, + VSQRT_F64 = 0x0eb10bc0, DTR = 0x05000000, LDRH = 0x00100090, STRH = 0x00000090, @@ -135,15 +157,17 @@ namespace JSC { #if WTF_ARM_ARCH_AT_LEAST(5) || defined(__ARM_ARCH_4T__) BX = 0x012fff10, #endif - FMSR = 0x0e000a10, - FMRS = 0x0e100a10, - FSITOD = 0x0eb80bc0, - FTOSID = 0x0ebd0b40, - FMSTAT = 0x0ef1fa10, + VMOV_VFP = 0x0e000a10, + VMOV_ARM = 0x0e100a10, + VCVT_F64_S32 = 0x0eb80bc0, + VCVT_S32_F64 = 0x0ebd0b40, + VCVTR_S32_F64 = 0x0ebd0bc0, + VMRS_APSR = 0x0ef1fa10, #if WTF_ARM_ARCH_AT_LEAST(5) CLZ = 0x016f0f10, - BKPT = 0xe120070, + BKPT = 0xe1200070, BLX = 0x012fff30, + NOP_T2 = 0xf3af8000, #endif #if WTF_ARM_ARCH_AT_LEAST(7) MOVW = 0x03000000, @@ -183,61 +207,37 @@ namespace JSC { enum { padForAlign8 = 0x00, padForAlign16 = 0x0000, - padForAlign32 = 0xee120070, + padForAlign32 = 0xe12fff7f // 'bkpt 0xffff' instruction. }; static const ARMWord INVALID_IMM = 0xf0000000; static const ARMWord InvalidBranchTarget = 0xffffffff; static const int DefaultPrefetching = 2; - class JmpSrc { - friend class ARMAssembler; - public: - JmpSrc() - : m_offset(-1) - { - } - - private: - JmpSrc(int offset) - : m_offset(offset) - { - } - - int m_offset; - }; - - 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)) ); + ASSERT(((op2 & ~OP2_IMM) <= 0xfff) || (((op2 & ~OP2_IMMh) <= 0xfff))); m_buffer.putInt(op | RN(rn) | RD(rd) | op2); } + void emitDoublePrecisionInst(ARMWord op, int dd, int dn, int dm) + { + ASSERT((dd >= 0 && dd <= 31) && (dn >= 0 && dn <= 31) && (dm >= 0 && dm <= 31)); + m_buffer.putInt(op | ((dd & 0xf) << 12) | ((dd & 0x10) << (22 - 4)) + | ((dn & 0xf) << 16) | ((dn & 0x10) << (7 - 4)) + | (dm & 0xf) | ((dm & 0x10) << (5 - 4))); + } + + void emitSinglePrecisionInst(ARMWord op, int sd, int sn, int sm) + { + ASSERT((sd >= 0 && sd <= 31) && (sn >= 0 && sn <= 31) && (sm >= 0 && sm <= 31)); + m_buffer.putInt(op | ((sd >> 1) << 12) | ((sd & 0x1) << 22) + | ((sn >> 1) << 16) | ((sn & 0x1) << 7) + | (sm >> 1) | ((sm & 0x1) << 5)); + } + void and_r(int rd, int rn, ARMWord op2, Condition cc = AL) { emitInst(static_cast(cc) | AND, rd, rn, op2); @@ -333,6 +333,11 @@ namespace JSC { emitInst(static_cast(cc) | CMP | SET_CC, 0, rn, op2); } + void cmn_r(int rn, ARMWord op2, Condition cc = AL) + { + emitInst(static_cast(cc) | CMN | SET_CC, 0, rn, op2); + } + void orr_r(int rd, int rn, ARMWord op2, Condition cc = AL) { emitInst(static_cast(cc) | ORR, rd, rn, op2); @@ -402,34 +407,34 @@ namespace JSC { m_buffer.putInt(static_cast(cc) | MULL | RN(rdhi) | RD(rdlo) | RS(rn) | RM(rm)); } - void faddd_r(int dd, int dn, int dm, Condition cc = AL) + void vadd_f64_r(int dd, int dn, int dm, Condition cc = AL) { - emitInst(static_cast(cc) | FADDD, dd, dn, dm); + emitDoublePrecisionInst(static_cast(cc) | VADD_F64, dd, dn, dm); } - void fdivd_r(int dd, int dn, int dm, Condition cc = AL) + void vdiv_f64_r(int dd, int dn, int dm, Condition cc = AL) { - emitInst(static_cast(cc) | FDIVD, dd, dn, dm); + emitDoublePrecisionInst(static_cast(cc) | VDIV_F64, dd, dn, dm); } - void fsubd_r(int dd, int dn, int dm, Condition cc = AL) + void vsub_f64_r(int dd, int dn, int dm, Condition cc = AL) { - emitInst(static_cast(cc) | FSUBD, dd, dn, dm); + emitDoublePrecisionInst(static_cast(cc) | VSUB_F64, dd, dn, dm); } - void fmuld_r(int dd, int dn, int dm, Condition cc = AL) + void vmul_f64_r(int dd, int dn, int dm, Condition cc = AL) { - emitInst(static_cast(cc) | FMULD, dd, dn, dm); + emitDoublePrecisionInst(static_cast(cc) | VMUL_F64, dd, dn, dm); } - void fcmpd_r(int dd, int dm, Condition cc = AL) + void vcmp_f64_r(int dd, int dm, Condition cc = AL) { - emitInst(static_cast(cc) | FCMPD, dd, 0, dm); + emitDoublePrecisionInst(static_cast(cc) | VCMP_F64, dd, 0, dm); } - void fsqrtd_r(int dd, int dm, Condition cc = AL) + void vsqrt_f64_r(int dd, int dm, Condition cc = AL) { - emitInst(static_cast(cc) | FSQRTD, dd, 0, dm); + emitDoublePrecisionInst(static_cast(cc) | VSQRT_F64, dd, 0, dm); } void ldr_imm(int rd, ARMWord imm, Condition cc = AL) @@ -516,29 +521,39 @@ namespace JSC { dtr_u(true, reg, ARMRegisters::sp, 0, cc); } - void fmsr_r(int dd, int rn, Condition cc = AL) + void vmov_vfp_r(int sn, int rt, Condition cc = AL) + { + ASSERT(rt <= 15); + emitSinglePrecisionInst(static_cast(cc) | VMOV_VFP, rt << 1, sn, 0); + } + + void vmov_arm_r(int rt, int sn, Condition cc = AL) { - emitInst(static_cast(cc) | FMSR, rn, dd, 0); + ASSERT(rt <= 15); + emitSinglePrecisionInst(static_cast(cc) | VMOV_ARM, rt << 1, sn, 0); } - void fmrs_r(int rd, int dn, Condition cc = AL) + void vcvt_f64_s32_r(int dd, int sm, Condition cc = AL) { - emitInst(static_cast(cc) | FMRS, rd, dn, 0); + ASSERT(!(sm & 0x1)); // sm must be divisible by 2 + emitDoublePrecisionInst(static_cast(cc) | VCVT_F64_S32, dd, 0, (sm >> 1)); } - void fsitod_r(int dd, int dm, Condition cc = AL) + void vcvt_s32_f64_r(int sd, int dm, Condition cc = AL) { - emitInst(static_cast(cc) | FSITOD, dd, 0, dm); + ASSERT(!(sd & 0x1)); // sd must be divisible by 2 + emitDoublePrecisionInst(static_cast(cc) | VCVT_S32_F64, (sd >> 1), 0, dm); } - void ftosid_r(int fd, int dm, Condition cc = AL) + void vcvtr_s32_f64_r(int sd, int dm, Condition cc = AL) { - emitInst(static_cast(cc) | FTOSID, fd, 0, dm); + ASSERT(!(sd & 0x1)); // sd must be divisible by 2 + emitDoublePrecisionInst(static_cast(cc) | VCVTR_S32_F64, (sd >> 1), 0, dm); } - void fmstat(Condition cc = AL) + void vmrs_apsr(Condition cc = AL) { - m_buffer.putInt(static_cast(cc) | FMSTAT); + m_buffer.putInt(static_cast(cc) | VMRS_APSR); } #if WTF_ARM_ARCH_AT_LEAST(5) @@ -557,6 +572,11 @@ namespace JSC { dtr_dr(true, ARMRegisters::S0, ARMRegisters::S0, ARMRegisters::S0); #endif } + + void nop() + { + m_buffer.putInt(OP_NOP_T2); + } void bx(int rm, Condition cc = AL) { @@ -567,19 +587,17 @@ namespace JSC { #endif } - JmpSrc blx(int rm, Condition cc = AL) + AssemblerLabel blx(int rm, Condition cc = AL) { #if WTF_ARM_ARCH_AT_LEAST(5) - int s = m_buffer.uncheckedSize(); emitInst(static_cast(cc) | BLX, 0, 0, RM(rm)); #else ASSERT(rm != 14); ensureSpace(2 * sizeof(ARMWord), 0); mov_r(ARMRegisters::lr, ARMRegisters::pc, cc); - int s = m_buffer.uncheckedSize(); bx(rm, cc); #endif - return JmpSrc(s); + return m_buffer.label(); } static ARMWord lsl(int reg, ARMWord value) @@ -626,9 +644,9 @@ namespace JSC { // General helpers - int size() + size_t codeSize() const { - return m_buffer.size(); + return m_buffer.codeSize(); } void ensureSpace(int insnSpace, int constSpace) @@ -641,12 +659,13 @@ namespace JSC { return m_buffer.sizeOfConstantPool(); } - JmpDst label() + AssemblerLabel label() { - return JmpDst(m_buffer.size()); + m_buffer.ensureSpaceForAnyOneInstruction(); + return m_buffer.label(); } - JmpDst align(int alignment) + AssemblerLabel align(int alignment) { while (!m_buffer.isAligned(alignment)) mov_r(ARMRegisters::r0, ARMRegisters::r0); @@ -654,21 +673,24 @@ namespace JSC { return label(); } - JmpSrc loadBranchTarget(int rd, Condition cc = AL, int useConstantPool = 0) + AssemblerLabel loadBranchTarget(int rd, Condition cc = AL, int useConstantPool = 0) { ensureSpace(sizeof(ARMWord), sizeof(ARMWord)); - int s = m_buffer.uncheckedSize(); + m_jumps.append(m_buffer.codeSize() | (useConstantPool & 0x1)); ldr_un_imm(rd, InvalidBranchTarget, cc); - m_jumps.append(s | (useConstantPool & 0x1)); - return JmpSrc(s); + return m_buffer.label(); } - JmpSrc jmp(Condition cc = AL, int useConstantPool = 0) + AssemblerLabel jmp(Condition cc = AL, int useConstantPool = 0) { return loadBranchTarget(ARMRegisters::pc, cc, useConstantPool); } - void* executableCopy(ExecutablePool* allocator); + void* executableCopy(JSGlobalData&, ExecutablePool* allocator); + +#ifndef NDEBUG + unsigned debugOffset() { return m_buffer.debugOffset(); } +#endif // Patching helpers @@ -717,9 +739,17 @@ namespace JSC { static void patchConstantPoolLoad(void* loadAddr, void* constPoolAddr); + // Read pointers + static void* readPointer(void* from) + { + ARMWord* insn = reinterpret_cast(from); + void* addr = reinterpret_cast(getLdrImmAddress(insn)); + return *addr; + } + // Patch pointers - static void linkPointer(void* code, JmpDst from, void* to) + static void linkPointer(void* code, AssemblerLabel from, void* to) { patchPointerInternal(reinterpret_cast(code) + from.m_offset, to); } @@ -728,79 +758,67 @@ namespace JSC { { patchPointerInternal(reinterpret_cast(from), reinterpret_cast(to)); } + + static void repatchCompact(void* where, int32_t value) + { + repatchInt32(where, value); + } static void repatchPointer(void* from, void* to) { patchPointerInternal(reinterpret_cast(from), to); } - static void repatchLoadPtrToLEA(void* from) + // Linkers + static intptr_t getAbsoluteJumpAddress(void* base, int offset = 0) { - // 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(from); - ASSERT((*insn & 0x0ff00f00) == 0x05900000); - - *insn = (*insn & 0xf00ff0ff) | 0x02800000; - ExecutableAllocator::cacheFlush(insn, sizeof(ARMWord)); + return reinterpret_cast(base) + offset - sizeof(ARMWord); } - // Linkers - - void linkJump(JmpSrc from, JmpDst to) + void linkJump(AssemblerLabel from, AssemblerLabel to) { - ARMWord* insn = reinterpret_cast(m_buffer.data()) + (from.m_offset / sizeof(ARMWord)); + ARMWord* insn = reinterpret_cast(getAbsoluteJumpAddress(m_buffer.data(), from.m_offset)); ARMWord* addr = getLdrImmAddressOnPool(insn, m_buffer.poolAddress()); *addr = static_cast(to.m_offset); } - static void linkJump(void* code, JmpSrc from, void* to) + static void linkJump(void* code, AssemblerLabel from, void* to) { - patchPointerInternal(reinterpret_cast(code) + from.m_offset, to); + patchPointerInternal(getAbsoluteJumpAddress(code, from.m_offset), to); } static void relinkJump(void* from, void* to) { - patchPointerInternal(reinterpret_cast(from) - sizeof(ARMWord), to); + patchPointerInternal(getAbsoluteJumpAddress(from), to); } - static void linkCall(void* code, JmpSrc from, void* to) + static void linkCall(void* code, AssemblerLabel from, void* to) { - patchPointerInternal(reinterpret_cast(code) + from.m_offset, to); + patchPointerInternal(getAbsoluteJumpAddress(code, from.m_offset), to); } static void relinkCall(void* from, void* to) { - patchPointerInternal(reinterpret_cast(from) - sizeof(ARMWord), to); + patchPointerInternal(getAbsoluteJumpAddress(from), to); } // Address operations - static void* getRelocatedAddress(void* code, JmpSrc jump) - { - return reinterpret_cast(reinterpret_cast(code) + jump.m_offset / sizeof(ARMWord) + 1); - } - - static void* getRelocatedAddress(void* code, JmpDst label) + static void* getRelocatedAddress(void* code, AssemblerLabel label) { - return reinterpret_cast(reinterpret_cast(code) + label.m_offset / sizeof(ARMWord)); + return reinterpret_cast(reinterpret_cast(code) + label.m_offset); } // Address differences - static int getDifferenceBetweenLabels(JmpDst from, JmpSrc to) + static int getDifferenceBetweenLabels(AssemblerLabel a, AssemblerLabel b) { - return (to.m_offset + sizeof(ARMWord)) - from.m_offset; + return b.m_offset - a.m_offset; } - static int getDifferenceBetweenLabels(JmpDst from, JmpDst to) + static unsigned getCallReturnOffset(AssemblerLabel call) { - return to.m_offset - from.m_offset; - } - - static unsigned getCallReturnOffset(JmpSrc call) - { - return call.m_offset + sizeof(ARMWord); + return call.m_offset; } // Handle immediates @@ -825,6 +843,15 @@ namespace JSC { void moveImm(ARMWord imm, int dest); ARMWord encodeComplexImm(ARMWord imm, int dest); + ARMWord getOffsetForHalfwordDataTransfer(ARMWord imm, int tmpReg) + { + // Encode immediate data in the instruction if it is possible + if (imm <= 0xff) + return getOp2Byte(imm); + // Otherwise, store the data in a temporary register + return encodeComplexImm(imm, tmpReg); + } + // Memory load/store helpers void dataTransfer32(bool isLoad, RegisterID srcDst, RegisterID base, int32_t offset, bool bytes = false); diff --git a/assembler/ARMv7Assembler.cpp b/assembler/ARMv7Assembler.cpp index 7aa1f10..faca664 100644 --- a/assembler/ARMv7Assembler.cpp +++ b/assembler/ARMv7Assembler.cpp @@ -31,11 +31,6 @@ namespace JSC { -const int ARMv7Assembler::JumpSizes[] = { 0xffffffff, sizeof(uint16_t), sizeof(uint16_t), - 2 * sizeof(uint16_t), 2 * sizeof(uint16_t), 3 * sizeof(uint16_t), 5 * sizeof(uint16_t), 6 * sizeof(uint16_t) }; -const int ARMv7Assembler::JumpPaddingSizes[] = { 0, 5 * sizeof(uint16_t), 6 * sizeof(uint16_t), - 5 * sizeof(uint16_t), 6 * sizeof(uint16_t) }; - } #endif diff --git a/assembler/ARMv7Assembler.h b/assembler/ARMv7Assembler.h index 13ad3e0..f5101c7 100644 --- a/assembler/ARMv7Assembler.h +++ b/assembler/ARMv7Assembler.h @@ -340,6 +340,8 @@ public: return m_type != TypeInvalid; } + uint16_t asUInt16() const { return m_value.asInt; } + // These methods rely on the format of encoded byte values. bool isUInt3() { return !(m_value.asInt & 0xfff8); } bool isUInt4() { return !(m_value.asInt & 0xfff0); } @@ -357,8 +359,8 @@ public: uint8_t getUInt6() { ASSERT(isUInt6()); return m_value.asInt; } uint8_t getUInt7() { ASSERT(isUInt7()); return m_value.asInt; } uint8_t getUInt8() { ASSERT(isUInt8()); return m_value.asInt; } - uint8_t getUInt9() { ASSERT(isUInt9()); return m_value.asInt; } - uint8_t getUInt10() { ASSERT(isUInt10()); return m_value.asInt; } + uint16_t getUInt9() { ASSERT(isUInt9()); return m_value.asInt; } + uint16_t getUInt10() { ASSERT(isUInt10()); return m_value.asInt; } uint16_t getUInt12() { ASSERT(isUInt12()); return m_value.asInt; } uint16_t getUInt16() { ASSERT(isUInt16()); return m_value.asInt; } @@ -369,40 +371,6 @@ private: ThumbImmediateValue m_value; }; -class VFPImmediate { -public: - VFPImmediate(double d) - : m_value(-1) - { - union { - uint64_t i; - double d; - } u; - - u.d = d; - - int sign = static_cast(u.i >> 63); - int exponent = static_cast(u.i >> 52) & 0x7ff; - uint64_t mantissa = u.i & 0x000fffffffffffffull; - - if ((exponent >= 0x3fc) && (exponent <= 0x403) && !(mantissa & 0x0000ffffffffffffull)) - m_value = (sign << 7) | ((exponent & 7) << 4) | (int)(mantissa >> 48); - } - - bool isValid() - { - return m_value != -1; - } - - uint8_t value() - { - return (uint8_t)m_value; - } - -private: - int m_value; -}; - typedef enum { SRType_LSL, SRType_LSR, @@ -412,7 +380,6 @@ typedef enum { SRType_RRX = SRType_ROR } ARMShiftType; -class ARMv7Assembler; class ShiftTypeAndAmount { friend class ARMv7Assembler; @@ -462,8 +429,8 @@ public: typedef enum { ConditionEQ, ConditionNE, - ConditionHS, - ConditionLO, + ConditionHS, ConditionCS = ConditionHS, + ConditionLO, ConditionCC = ConditionLO, ConditionMI, ConditionPL, ConditionVS, @@ -475,16 +442,28 @@ public: ConditionGT, ConditionLE, ConditionAL, - - ConditionCS = ConditionHS, - ConditionCC = ConditionLO, + ConditionInvalid } Condition; - enum JumpType { JumpFixed, JumpNoCondition, JumpCondition, JumpNoConditionFixedSize, JumpConditionFixedSize, JumpTypeCount }; - enum JumpLinkType { LinkInvalid, LinkJumpT1, LinkJumpT2, LinkJumpT3, - LinkJumpT4, LinkConditionalJumpT4, LinkBX, LinkConditionalBX, JumpLinkTypeCount }; - static const int JumpSizes[JumpLinkTypeCount]; - static const int JumpPaddingSizes[JumpTypeCount]; +#define JUMP_ENUM_WITH_SIZE(index, value) (((value) << 3) | (index)) +#define JUMP_ENUM_SIZE(jump) ((jump) >> 3) + enum JumpType { JumpFixed = JUMP_ENUM_WITH_SIZE(0, 0), + JumpNoCondition = JUMP_ENUM_WITH_SIZE(1, 5 * sizeof(uint16_t)), + JumpCondition = JUMP_ENUM_WITH_SIZE(2, 6 * sizeof(uint16_t)), + JumpNoConditionFixedSize = JUMP_ENUM_WITH_SIZE(3, 5 * sizeof(uint16_t)), + JumpConditionFixedSize = JUMP_ENUM_WITH_SIZE(4, 6 * sizeof(uint16_t)) + }; + enum JumpLinkType { + LinkInvalid = JUMP_ENUM_WITH_SIZE(0, 0), + LinkJumpT1 = JUMP_ENUM_WITH_SIZE(1, sizeof(uint16_t)), + LinkJumpT2 = JUMP_ENUM_WITH_SIZE(2, sizeof(uint16_t)), + LinkJumpT3 = JUMP_ENUM_WITH_SIZE(3, 2 * sizeof(uint16_t)), + LinkJumpT4 = JUMP_ENUM_WITH_SIZE(4, 2 * sizeof(uint16_t)), + LinkConditionalJumpT4 = JUMP_ENUM_WITH_SIZE(5, 3 * sizeof(uint16_t)), + LinkBX = JUMP_ENUM_WITH_SIZE(6, 5 * sizeof(uint16_t)), + LinkConditionalBX = JUMP_ENUM_WITH_SIZE(7, 6 * sizeof(uint16_t)) + }; + class LinkRecord { public: LinkRecord(intptr_t from, intptr_t to, JumpType type, Condition condition) @@ -505,67 +484,9 @@ public: private: intptr_t m_from : 31; intptr_t m_to : 31; - JumpType m_type : 3; - JumpLinkType m_linkType : 4; - Condition m_condition : 16; - }; - - class JmpSrc { - friend class ARMv7Assembler; - friend class ARMInstructionFormatter; - friend class LinkBuffer; - public: - JmpSrc() - : m_offset(-1) - { - } - - private: - JmpSrc(int offset, JumpType type) - : m_offset(offset) - , m_condition(0xffff) - , m_type(type) - { - ASSERT(m_type == JumpFixed || m_type == JumpNoCondition || m_type == JumpNoConditionFixedSize); - } - - JmpSrc(int offset, JumpType type, Condition condition) - : m_offset(offset) - , m_condition(condition) - , m_type(type) - { - ASSERT(m_type == JumpFixed || m_type == JumpCondition || m_type == JumpConditionFixedSize); - } - - int m_offset; + JumpType m_type : 8; + JumpLinkType m_linkType : 8; Condition m_condition : 16; - JumpType m_type : 16; - - }; - - class JmpDst { - friend class ARMv7Assembler; - friend class ARMInstructionFormatter; - friend class LinkBuffer; - public: - JmpDst() - : m_offset(-1) - , m_used(false) - { - } - - bool isUsed() const { return m_used; } - void used() { m_used = true; } - private: - JmpDst(int offset) - : m_offset(offset) - , m_used(false) - { - ASSERT(m_offset == offset); - } - - int m_offset : 31; - int m_used : 1; }; private: @@ -696,6 +617,7 @@ private: OP_LSR_reg_T2 = 0xFA20, OP_ASR_reg_T2 = 0xFA40, OP_ROR_reg_T2 = 0xFA60, + OP_CLZ = 0xFAB0, OP_SMULL_T1 = 0xFB80, } OpcodeID1; @@ -787,10 +709,10 @@ public: if (rn == ARMRegisters::sp) { if (!(rd & 8) && imm.isUInt10()) { - m_formatter.oneWordOp5Reg3Imm8(OP_ADD_SP_imm_T1, rd, imm.getUInt10() >> 2); + m_formatter.oneWordOp5Reg3Imm8(OP_ADD_SP_imm_T1, rd, static_cast(imm.getUInt10() >> 2)); return; } else if ((rd == ARMRegisters::sp) && imm.isUInt9()) { - m_formatter.oneWordOp9Imm7(OP_ADD_SP_imm_T2, imm.getUInt9() >> 2); + m_formatter.oneWordOp9Imm7(OP_ADD_SP_imm_T2, static_cast(imm.getUInt9() >> 2)); return; } } else if (!((rd | rn) & 8)) { @@ -811,7 +733,7 @@ public: } } - void add(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) + ALWAYS_INLINE void add(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) { ASSERT((rd != ARMRegisters::sp) || (rn == ARMRegisters::sp)); ASSERT(rd != ARMRegisters::pc); @@ -821,7 +743,7 @@ public: } // NOTE: In an IT block, add doesn't modify the flags register. - void add(RegisterID rd, RegisterID rn, RegisterID rm) + ALWAYS_INLINE void add(RegisterID rd, RegisterID rn, RegisterID rm) { if (rd == rn) m_formatter.oneWordOp8RegReg143(OP_ADD_reg_T2, rm, rd); @@ -834,7 +756,7 @@ public: } // Not allowed in an IT (if then) block. - void add_S(RegisterID rd, RegisterID rn, ARMThumbImmediate imm) + ALWAYS_INLINE void add_S(RegisterID rd, RegisterID rn, ARMThumbImmediate imm) { // Rd can only be SP if Rn is also SP. ASSERT((rd != ARMRegisters::sp) || (rn == ARMRegisters::sp)); @@ -856,7 +778,7 @@ public: } // Not allowed in an IT (if then) block? - void add_S(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) + ALWAYS_INLINE void add_S(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) { ASSERT((rd != ARMRegisters::sp) || (rn == ARMRegisters::sp)); ASSERT(rd != ARMRegisters::pc); @@ -866,7 +788,7 @@ public: } // Not allowed in an IT (if then) block. - void add_S(RegisterID rd, RegisterID rn, RegisterID rm) + ALWAYS_INLINE void add_S(RegisterID rd, RegisterID rn, RegisterID rm) { if (!((rd | rn | rm) & 8)) m_formatter.oneWordOp7Reg3Reg3Reg3(OP_ADD_reg_T1, rm, rn, rd); @@ -874,7 +796,7 @@ public: add_S(rd, rn, rm, ShiftTypeAndAmount()); } - void ARM_and(RegisterID rd, RegisterID rn, ARMThumbImmediate imm) + ALWAYS_INLINE void ARM_and(RegisterID rd, RegisterID rn, ARMThumbImmediate imm) { ASSERT(!BadReg(rd)); ASSERT(!BadReg(rn)); @@ -882,7 +804,7 @@ public: m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_AND_imm_T1, rn, rd, imm); } - void ARM_and(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) + ALWAYS_INLINE void ARM_and(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) { ASSERT(!BadReg(rd)); ASSERT(!BadReg(rn)); @@ -890,7 +812,7 @@ public: m_formatter.twoWordOp12Reg4FourFours(OP_AND_reg_T2, rn, FourFours(shift.hi4(), rd, shift.lo4(), rm)); } - void ARM_and(RegisterID rd, RegisterID rn, RegisterID rm) + ALWAYS_INLINE void ARM_and(RegisterID rd, RegisterID rn, RegisterID rm) { if ((rd == rn) && !((rd | rm) & 8)) m_formatter.oneWordOp10Reg3Reg3(OP_AND_reg_T1, rm, rd); @@ -900,7 +822,7 @@ public: ARM_and(rd, rn, rm, ShiftTypeAndAmount()); } - void asr(RegisterID rd, RegisterID rm, int32_t shiftAmount) + ALWAYS_INLINE void asr(RegisterID rd, RegisterID rm, int32_t shiftAmount) { ASSERT(!BadReg(rd)); ASSERT(!BadReg(rm)); @@ -908,7 +830,7 @@ public: m_formatter.twoWordOp16FourFours(OP_ASR_imm_T1, FourFours(shift.hi4(), rd, shift.lo4(), rm)); } - void asr(RegisterID rd, RegisterID rn, RegisterID rm) + ALWAYS_INLINE void asr(RegisterID rd, RegisterID rn, RegisterID rm) { ASSERT(!BadReg(rd)); ASSERT(!BadReg(rn)); @@ -917,39 +839,40 @@ public: } // Only allowed in IT (if then) block if last instruction. - JmpSrc b(JumpType type) + ALWAYS_INLINE AssemblerLabel b() { m_formatter.twoWordOp16Op16(OP_B_T4a, OP_B_T4b); - return JmpSrc(m_formatter.size(), type); + return m_formatter.label(); } // Only allowed in IT (if then) block if last instruction. - JmpSrc blx(RegisterID rm, JumpType type) + ALWAYS_INLINE AssemblerLabel blx(RegisterID rm) { ASSERT(rm != ARMRegisters::pc); m_formatter.oneWordOp8RegReg143(OP_BLX, rm, (RegisterID)8); - return JmpSrc(m_formatter.size(), type); + return m_formatter.label(); } // Only allowed in IT (if then) block if last instruction. - JmpSrc bx(RegisterID rm, JumpType type, Condition condition) + ALWAYS_INLINE AssemblerLabel bx(RegisterID rm) { m_formatter.oneWordOp8RegReg143(OP_BX, rm, (RegisterID)0); - return JmpSrc(m_formatter.size(), type, condition); + return m_formatter.label(); } - JmpSrc bx(RegisterID rm, JumpType type) + void bkpt(uint8_t imm=0) { - m_formatter.oneWordOp8RegReg143(OP_BX, rm, (RegisterID)0); - return JmpSrc(m_formatter.size(), type); + m_formatter.oneWordOp8Imm8(OP_BKPT, imm); } - void bkpt(uint8_t imm=0) + ALWAYS_INLINE void clz(RegisterID rd, RegisterID rm) { - m_formatter.oneWordOp8Imm8(OP_BKPT, imm); + ASSERT(!BadReg(rd)); + ASSERT(!BadReg(rm)); + m_formatter.twoWordOp12Reg4FourFours(OP_CLZ, rm, FourFours(0xf, rd, 8, rm)); } - void cmn(RegisterID rn, ARMThumbImmediate imm) + ALWAYS_INLINE void cmn(RegisterID rn, ARMThumbImmediate imm) { ASSERT(rn != ARMRegisters::pc); ASSERT(imm.isEncodedImm()); @@ -957,7 +880,7 @@ public: m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_CMN_imm, rn, (RegisterID)0xf, imm); } - void cmp(RegisterID rn, ARMThumbImmediate imm) + ALWAYS_INLINE void cmp(RegisterID rn, ARMThumbImmediate imm) { ASSERT(rn != ARMRegisters::pc); ASSERT(imm.isEncodedImm()); @@ -968,14 +891,14 @@ public: m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_CMP_imm_T2, rn, (RegisterID)0xf, imm); } - void cmp(RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) + ALWAYS_INLINE void cmp(RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) { ASSERT(rn != ARMRegisters::pc); ASSERT(!BadReg(rm)); m_formatter.twoWordOp12Reg4FourFours(OP_CMP_reg_T2, rn, FourFours(shift.hi4(), 0xf, shift.lo4(), rm)); } - void cmp(RegisterID rn, RegisterID rm) + ALWAYS_INLINE void cmp(RegisterID rn, RegisterID rm) { if ((rn | rm) & 8) cmp(rn, rm, ShiftTypeAndAmount()); @@ -984,7 +907,7 @@ public: } // xor is not spelled with an 'e'. :-( - void eor(RegisterID rd, RegisterID rn, ARMThumbImmediate imm) + ALWAYS_INLINE void eor(RegisterID rd, RegisterID rn, ARMThumbImmediate imm) { ASSERT(!BadReg(rd)); ASSERT(!BadReg(rn)); @@ -993,7 +916,7 @@ public: } // xor is not spelled with an 'e'. :-( - void eor(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) + ALWAYS_INLINE void eor(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) { ASSERT(!BadReg(rd)); ASSERT(!BadReg(rn)); @@ -1012,28 +935,28 @@ public: eor(rd, rn, rm, ShiftTypeAndAmount()); } - void it(Condition cond) + ALWAYS_INLINE void it(Condition cond) { m_formatter.oneWordOp8Imm8(OP_IT, ifThenElse(cond)); } - void it(Condition cond, bool inst2if) + ALWAYS_INLINE void it(Condition cond, bool inst2if) { m_formatter.oneWordOp8Imm8(OP_IT, ifThenElse(cond, inst2if)); } - void it(Condition cond, bool inst2if, bool inst3if) + ALWAYS_INLINE void it(Condition cond, bool inst2if, bool inst3if) { m_formatter.oneWordOp8Imm8(OP_IT, ifThenElse(cond, inst2if, inst3if)); } - void it(Condition cond, bool inst2if, bool inst3if, bool inst4if) + ALWAYS_INLINE void it(Condition cond, bool inst2if, bool inst3if, bool inst4if) { m_formatter.oneWordOp8Imm8(OP_IT, ifThenElse(cond, inst2if, inst3if, inst4if)); } // rt == ARMRegisters::pc only allowed if last instruction in IT (if then) block. - void ldr(RegisterID rt, RegisterID rn, ARMThumbImmediate imm) + ALWAYS_INLINE void ldr(RegisterID rt, RegisterID rn, ARMThumbImmediate imm) { ASSERT(rn != ARMRegisters::pc); // LDR (literal) ASSERT(imm.isUInt12()); @@ -1041,11 +964,19 @@ public: if (!((rt | rn) & 8) && imm.isUInt7()) m_formatter.oneWordOp5Imm5Reg3Reg3(OP_LDR_imm_T1, imm.getUInt7() >> 2, rn, rt); else if ((rn == ARMRegisters::sp) && !(rt & 8) && imm.isUInt10()) - m_formatter.oneWordOp5Reg3Imm8(OP_LDR_imm_T2, rt, imm.getUInt10() >> 2); + m_formatter.oneWordOp5Reg3Imm8(OP_LDR_imm_T2, rt, static_cast(imm.getUInt10() >> 2)); else m_formatter.twoWordOp12Reg4Reg4Imm12(OP_LDR_imm_T3, rn, rt, imm.getUInt12()); } + ALWAYS_INLINE void ldrCompact(RegisterID rt, RegisterID rn, ARMThumbImmediate imm) + { + ASSERT(rn != ARMRegisters::pc); // LDR (literal) + ASSERT(imm.isUInt7()); + ASSERT(!((rt | rn) & 8)); + m_formatter.oneWordOp5Imm5Reg3Reg3(OP_LDR_imm_T1, imm.getUInt7() >> 2, rn, rt); + } + // If index is set, this is a regular offset or a pre-indexed load; // if index is not set then is is a post-index load. // @@ -1057,7 +988,7 @@ public: // _tmp = _reg + offset // MEM[index ? _tmp : _reg] = REG[rt] // if (wback) REG[rn] = _tmp - void ldr(RegisterID rt, RegisterID rn, int offset, bool index, bool wback) + ALWAYS_INLINE void ldr(RegisterID rt, RegisterID rn, int offset, bool index, bool wback) { ASSERT(rt != ARMRegisters::pc); ASSERT(rn != ARMRegisters::pc); @@ -1080,7 +1011,7 @@ public: } // rt == ARMRegisters::pc only allowed if last instruction in IT (if then) block. - void ldr(RegisterID rt, RegisterID rn, RegisterID rm, unsigned shift=0) + ALWAYS_INLINE void ldr(RegisterID rt, RegisterID rn, RegisterID rm, unsigned shift = 0) { ASSERT(rn != ARMRegisters::pc); // LDR (literal) ASSERT(!BadReg(rm)); @@ -1093,7 +1024,7 @@ public: } // rt == ARMRegisters::pc only allowed if last instruction in IT (if then) block. - void ldrh(RegisterID rt, RegisterID rn, ARMThumbImmediate imm) + ALWAYS_INLINE void ldrh(RegisterID rt, RegisterID rn, ARMThumbImmediate imm) { ASSERT(rn != ARMRegisters::pc); // LDR (literal) ASSERT(imm.isUInt12()); @@ -1115,7 +1046,7 @@ public: // _tmp = _reg + offset // MEM[index ? _tmp : _reg] = REG[rt] // if (wback) REG[rn] = _tmp - void ldrh(RegisterID rt, RegisterID rn, int offset, bool index, bool wback) + ALWAYS_INLINE void ldrh(RegisterID rt, RegisterID rn, int offset, bool index, bool wback) { ASSERT(rt != ARMRegisters::pc); ASSERT(rn != ARMRegisters::pc); @@ -1137,7 +1068,7 @@ public: m_formatter.twoWordOp12Reg4Reg4Imm12(OP_LDRH_imm_T3, rn, rt, offset); } - void ldrh(RegisterID rt, RegisterID rn, RegisterID rm, unsigned shift=0) + ALWAYS_INLINE void ldrh(RegisterID rt, RegisterID rn, RegisterID rm, unsigned shift = 0) { ASSERT(!BadReg(rt)); // Memory hint ASSERT(rn != ARMRegisters::pc); // LDRH (literal) @@ -1184,7 +1115,7 @@ public: m_formatter.twoWordOp12Reg4Reg4Imm12(OP_LDRB_imm_T3, rn, rt, offset); } - void ldrb(RegisterID rt, RegisterID rn, RegisterID rm, unsigned shift = 0) + ALWAYS_INLINE void ldrb(RegisterID rt, RegisterID rn, RegisterID rm, unsigned shift = 0) { ASSERT(rn != ARMRegisters::pc); // LDR (literal) ASSERT(!BadReg(rm)); @@ -1204,7 +1135,7 @@ public: m_formatter.twoWordOp16FourFours(OP_LSL_imm_T1, FourFours(shift.hi4(), rd, shift.lo4(), rm)); } - void lsl(RegisterID rd, RegisterID rn, RegisterID rm) + ALWAYS_INLINE void lsl(RegisterID rd, RegisterID rn, RegisterID rm) { ASSERT(!BadReg(rd)); ASSERT(!BadReg(rn)); @@ -1212,7 +1143,7 @@ public: m_formatter.twoWordOp12Reg4FourFours(OP_LSL_reg_T2, rn, FourFours(0xf, rd, 0, rm)); } - void lsr(RegisterID rd, RegisterID rm, int32_t shiftAmount) + ALWAYS_INLINE void lsr(RegisterID rd, RegisterID rm, int32_t shiftAmount) { ASSERT(!BadReg(rd)); ASSERT(!BadReg(rm)); @@ -1220,7 +1151,7 @@ public: m_formatter.twoWordOp16FourFours(OP_LSR_imm_T1, FourFours(shift.hi4(), rd, shift.lo4(), rm)); } - void lsr(RegisterID rd, RegisterID rn, RegisterID rm) + ALWAYS_INLINE void lsr(RegisterID rd, RegisterID rn, RegisterID rm) { ASSERT(!BadReg(rd)); ASSERT(!BadReg(rn)); @@ -1228,7 +1159,7 @@ public: m_formatter.twoWordOp12Reg4FourFours(OP_LSR_reg_T2, rn, FourFours(0xf, rd, 0, rm)); } - void movT3(RegisterID rd, ARMThumbImmediate imm) + ALWAYS_INLINE void movT3(RegisterID rd, ARMThumbImmediate imm) { ASSERT(imm.isValid()); ASSERT(!imm.isEncodedImm()); @@ -1237,7 +1168,7 @@ public: m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_MOV_imm_T3, imm.m_value.imm4, rd, imm); } - void mov(RegisterID rd, ARMThumbImmediate imm) + ALWAYS_INLINE void mov(RegisterID rd, ARMThumbImmediate imm) { ASSERT(imm.isValid()); ASSERT(!BadReg(rd)); @@ -1250,19 +1181,19 @@ public: movT3(rd, imm); } - void mov(RegisterID rd, RegisterID rm) + ALWAYS_INLINE void mov(RegisterID rd, RegisterID rm) { m_formatter.oneWordOp8RegReg143(OP_MOV_reg_T1, rm, rd); } - void movt(RegisterID rd, ARMThumbImmediate imm) + ALWAYS_INLINE void movt(RegisterID rd, ARMThumbImmediate imm) { ASSERT(imm.isUInt16()); ASSERT(!BadReg(rd)); m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_MOVT, imm.m_value.imm4, rd, imm); } - void mvn(RegisterID rd, ARMThumbImmediate imm) + ALWAYS_INLINE void mvn(RegisterID rd, ARMThumbImmediate imm) { ASSERT(imm.isEncodedImm()); ASSERT(!BadReg(rd)); @@ -1270,14 +1201,14 @@ public: m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_MVN_imm, 0xf, rd, imm); } - void mvn(RegisterID rd, RegisterID rm, ShiftTypeAndAmount shift) + ALWAYS_INLINE void mvn(RegisterID rd, RegisterID rm, ShiftTypeAndAmount shift) { ASSERT(!BadReg(rd)); ASSERT(!BadReg(rm)); m_formatter.twoWordOp16FourFours(OP_MVN_reg_T2, FourFours(shift.hi4(), rd, shift.lo4(), rm)); } - void mvn(RegisterID rd, RegisterID rm) + ALWAYS_INLINE void mvn(RegisterID rd, RegisterID rm) { if (!((rd | rm) & 8)) m_formatter.oneWordOp10Reg3Reg3(OP_MVN_reg_T1, rm, rd); @@ -1285,13 +1216,13 @@ public: mvn(rd, rm, ShiftTypeAndAmount()); } - void neg(RegisterID rd, RegisterID rm) + ALWAYS_INLINE void neg(RegisterID rd, RegisterID rm) { ARMThumbImmediate zero = ARMThumbImmediate::makeUInt12(0); sub(rd, zero, rm); } - void orr(RegisterID rd, RegisterID rn, ARMThumbImmediate imm) + ALWAYS_INLINE void orr(RegisterID rd, RegisterID rn, ARMThumbImmediate imm) { ASSERT(!BadReg(rd)); ASSERT(!BadReg(rn)); @@ -1299,7 +1230,7 @@ public: m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_ORR_imm_T1, rn, rd, imm); } - void orr(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) + ALWAYS_INLINE void orr(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) { ASSERT(!BadReg(rd)); ASSERT(!BadReg(rn)); @@ -1317,7 +1248,7 @@ public: orr(rd, rn, rm, ShiftTypeAndAmount()); } - void orr_S(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) + ALWAYS_INLINE void orr_S(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) { ASSERT(!BadReg(rd)); ASSERT(!BadReg(rn)); @@ -1335,7 +1266,7 @@ public: orr_S(rd, rn, rm, ShiftTypeAndAmount()); } - void ror(RegisterID rd, RegisterID rm, int32_t shiftAmount) + ALWAYS_INLINE void ror(RegisterID rd, RegisterID rm, int32_t shiftAmount) { ASSERT(!BadReg(rd)); ASSERT(!BadReg(rm)); @@ -1343,7 +1274,7 @@ public: m_formatter.twoWordOp16FourFours(OP_ROR_imm_T1, FourFours(shift.hi4(), rd, shift.lo4(), rm)); } - void ror(RegisterID rd, RegisterID rn, RegisterID rm) + ALWAYS_INLINE void ror(RegisterID rd, RegisterID rn, RegisterID rm) { ASSERT(!BadReg(rd)); ASSERT(!BadReg(rn)); @@ -1351,7 +1282,7 @@ public: m_formatter.twoWordOp12Reg4FourFours(OP_ROR_reg_T2, rn, FourFours(0xf, rd, 0, rm)); } - void smull(RegisterID rdLo, RegisterID rdHi, RegisterID rn, RegisterID rm) + ALWAYS_INLINE void smull(RegisterID rdLo, RegisterID rdHi, RegisterID rn, RegisterID rm) { ASSERT(!BadReg(rdLo)); ASSERT(!BadReg(rdHi)); @@ -1362,7 +1293,7 @@ public: } // rt == ARMRegisters::pc only allowed if last instruction in IT (if then) block. - void str(RegisterID rt, RegisterID rn, ARMThumbImmediate imm) + ALWAYS_INLINE void str(RegisterID rt, RegisterID rn, ARMThumbImmediate imm) { ASSERT(rt != ARMRegisters::pc); ASSERT(rn != ARMRegisters::pc); @@ -1371,7 +1302,7 @@ public: if (!((rt | rn) & 8) && imm.isUInt7()) m_formatter.oneWordOp5Imm5Reg3Reg3(OP_STR_imm_T1, imm.getUInt7() >> 2, rn, rt); else if ((rn == ARMRegisters::sp) && !(rt & 8) && imm.isUInt10()) - m_formatter.oneWordOp5Reg3Imm8(OP_STR_imm_T2, rt, imm.getUInt10() >> 2); + m_formatter.oneWordOp5Reg3Imm8(OP_STR_imm_T2, rt, static_cast(imm.getUInt10() >> 2)); else m_formatter.twoWordOp12Reg4Reg4Imm12(OP_STR_imm_T3, rn, rt, imm.getUInt12()); } @@ -1387,7 +1318,7 @@ public: // _tmp = _reg + offset // MEM[index ? _tmp : _reg] = REG[rt] // if (wback) REG[rn] = _tmp - void str(RegisterID rt, RegisterID rn, int offset, bool index, bool wback) + ALWAYS_INLINE void str(RegisterID rt, RegisterID rn, int offset, bool index, bool wback) { ASSERT(rt != ARMRegisters::pc); ASSERT(rn != ARMRegisters::pc); @@ -1410,7 +1341,7 @@ public: } // rt == ARMRegisters::pc only allowed if last instruction in IT (if then) block. - void str(RegisterID rt, RegisterID rn, RegisterID rm, unsigned shift=0) + ALWAYS_INLINE void str(RegisterID rt, RegisterID rn, RegisterID rm, unsigned shift = 0) { ASSERT(rn != ARMRegisters::pc); ASSERT(!BadReg(rm)); @@ -1422,7 +1353,7 @@ public: m_formatter.twoWordOp12Reg4FourFours(OP_STR_reg_T2, rn, FourFours(rt, 0, shift, rm)); } - void sub(RegisterID rd, RegisterID rn, ARMThumbImmediate imm) + ALWAYS_INLINE void sub(RegisterID rd, RegisterID rn, ARMThumbImmediate imm) { // Rd can only be SP if Rn is also SP. ASSERT((rd != ARMRegisters::sp) || (rn == ARMRegisters::sp)); @@ -1431,7 +1362,7 @@ public: ASSERT(imm.isValid()); if ((rn == ARMRegisters::sp) && (rd == ARMRegisters::sp) && imm.isUInt9()) { - m_formatter.oneWordOp9Imm7(OP_SUB_SP_imm_T1, imm.getUInt9() >> 2); + m_formatter.oneWordOp9Imm7(OP_SUB_SP_imm_T1, static_cast(imm.getUInt9() >> 2)); return; } else if (!((rd | rn) & 8)) { if (imm.isUInt3()) { @@ -1451,7 +1382,7 @@ public: } } - void sub(RegisterID rd, ARMThumbImmediate imm, RegisterID rn) + ALWAYS_INLINE void sub(RegisterID rd, ARMThumbImmediate imm, RegisterID rn) { ASSERT(rd != ARMRegisters::pc); ASSERT(rn != ARMRegisters::pc); @@ -1464,7 +1395,7 @@ public: m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_RSB_imm_T2, rn, rd, imm); } - void sub(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) + ALWAYS_INLINE void sub(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) { ASSERT((rd != ARMRegisters::sp) || (rn == ARMRegisters::sp)); ASSERT(rd != ARMRegisters::pc); @@ -1474,7 +1405,7 @@ public: } // NOTE: In an IT block, add doesn't modify the flags register. - void sub(RegisterID rd, RegisterID rn, RegisterID rm) + ALWAYS_INLINE void sub(RegisterID rd, RegisterID rn, RegisterID rm) { if (!((rd | rn | rm) & 8)) m_formatter.oneWordOp7Reg3Reg3Reg3(OP_SUB_reg_T1, rm, rn, rd); @@ -1492,7 +1423,7 @@ public: ASSERT(imm.isValid()); if ((rn == ARMRegisters::sp) && (rd == ARMRegisters::sp) && imm.isUInt9()) { - m_formatter.oneWordOp9Imm7(OP_SUB_SP_imm_T1, imm.getUInt9() >> 2); + m_formatter.oneWordOp9Imm7(OP_SUB_SP_imm_T1, static_cast(imm.getUInt9() >> 2)); return; } else if (!((rd | rn) & 8)) { if (imm.isUInt3()) { @@ -1508,7 +1439,7 @@ public: } // Not allowed in an IT (if then) block? - void sub_S(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) + ALWAYS_INLINE void sub_S(RegisterID rd, RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) { ASSERT((rd != ARMRegisters::sp) || (rn == ARMRegisters::sp)); ASSERT(rd != ARMRegisters::pc); @@ -1518,7 +1449,7 @@ public: } // Not allowed in an IT (if then) block. - void sub_S(RegisterID rd, RegisterID rn, RegisterID rm) + ALWAYS_INLINE void sub_S(RegisterID rd, RegisterID rn, RegisterID rm) { if (!((rd | rn | rm) & 8)) m_formatter.oneWordOp7Reg3Reg3Reg3(OP_SUB_reg_T1, rm, rn, rd); @@ -1526,7 +1457,7 @@ public: sub_S(rd, rn, rm, ShiftTypeAndAmount()); } - void tst(RegisterID rn, ARMThumbImmediate imm) + ALWAYS_INLINE void tst(RegisterID rn, ARMThumbImmediate imm) { ASSERT(!BadReg(rn)); ASSERT(imm.isEncodedImm()); @@ -1534,14 +1465,14 @@ public: m_formatter.twoWordOp5i6Imm4Reg4EncodedImm(OP_TST_imm, rn, (RegisterID)0xf, imm); } - void tst(RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) + ALWAYS_INLINE void tst(RegisterID rn, RegisterID rm, ShiftTypeAndAmount shift) { ASSERT(!BadReg(rn)); ASSERT(!BadReg(rm)); m_formatter.twoWordOp12Reg4FourFours(OP_TST_reg_T2, rn, FourFours(shift.hi4(), 0xf, shift.lo4(), rm)); } - void tst(RegisterID rn, RegisterID rm) + ALWAYS_INLINE void tst(RegisterID rn, RegisterID rm) { if ((rn | rm) & 8) tst(rn, rm, ShiftTypeAndAmount()); @@ -1619,46 +1550,33 @@ public: m_formatter.vfpOp(OP_VSUB_T2, OP_VSUB_T2b, true, rn, rd, rm); } - JmpDst label() + void nop() { - return JmpDst(m_formatter.size()); + m_formatter.oneWordOp8Imm8(OP_NOP_T1, 0); } - - JmpDst align(int alignment) - { - while (!m_formatter.isAligned(alignment)) - bkpt(); - return label(); - } - - static void* getRelocatedAddress(void* code, JmpSrc jump) + AssemblerLabel label() { - ASSERT(jump.m_offset != -1); - - return reinterpret_cast(reinterpret_cast(code) + jump.m_offset); + return m_formatter.label(); } - static void* getRelocatedAddress(void* code, JmpDst destination) + AssemblerLabel align(int alignment) { - ASSERT(destination.m_offset != -1); + while (!m_formatter.isAligned(alignment)) + bkpt(); - return reinterpret_cast(reinterpret_cast(code) + destination.m_offset); - } - - static int getDifferenceBetweenLabels(JmpDst src, JmpDst dst) - { - return dst.m_offset - src.m_offset; + return label(); } - static int getDifferenceBetweenLabels(JmpDst src, JmpSrc dst) + static void* getRelocatedAddress(void* code, AssemblerLabel label) { - return dst.m_offset - src.m_offset; + ASSERT(label.isSet()); + return reinterpret_cast(reinterpret_cast(code) + label.m_offset); } - static int getDifferenceBetweenLabels(JmpSrc src, JmpDst dst) + static int getDifferenceBetweenLabels(AssemblerLabel a, AssemblerLabel b) { - return dst.m_offset - src.m_offset; + return b.m_offset - a.m_offset; } int executableOffsetFor(int location) @@ -1668,16 +1586,11 @@ public: return static_cast(m_formatter.data())[location / sizeof(int32_t) - 1]; } - int jumpSizeDelta(JumpType jumpType, JumpLinkType jumpLinkType) { return JumpPaddingSizes[jumpType] - JumpSizes[jumpLinkType]; } + int jumpSizeDelta(JumpType jumpType, JumpLinkType jumpLinkType) { return JUMP_ENUM_SIZE(jumpType) - JUMP_ENUM_SIZE(jumpLinkType); } // Assembler admin methods: - size_t size() const - { - return m_formatter.size(); - } - - static bool linkRecordSourceComparator(const LinkRecord& a, const LinkRecord& b) + static ALWAYS_INLINE bool linkRecordSourceComparator(const LinkRecord& a, const LinkRecord& b) { return a.from() < b.from(); } @@ -1702,34 +1615,34 @@ public: if (jumpType == JumpConditionFixedSize) return LinkConditionalBX; - const int paddingSize = JumpPaddingSizes[jumpType]; + const int paddingSize = JUMP_ENUM_SIZE(jumpType); bool mayTriggerErrata = false; if (jumpType == JumpCondition) { // 2-byte conditional T1 - const uint16_t* jumpT1Location = reinterpret_cast(from - (paddingSize - JumpSizes[LinkJumpT1])); + const uint16_t* jumpT1Location = reinterpret_cast(from - (paddingSize - JUMP_ENUM_SIZE(LinkJumpT1))); if (canBeJumpT1(jumpT1Location, to)) return LinkJumpT1; // 4-byte conditional T3 - const uint16_t* jumpT3Location = reinterpret_cast(from - (paddingSize - JumpSizes[LinkJumpT3])); + const uint16_t* jumpT3Location = reinterpret_cast(from - (paddingSize - JUMP_ENUM_SIZE(LinkJumpT3))); if (canBeJumpT3(jumpT3Location, to, mayTriggerErrata)) { if (!mayTriggerErrata) return LinkJumpT3; } // 4-byte conditional T4 with IT const uint16_t* conditionalJumpT4Location = - reinterpret_cast(from - (paddingSize - JumpSizes[LinkConditionalJumpT4])); + reinterpret_cast(from - (paddingSize - JUMP_ENUM_SIZE(LinkConditionalJumpT4))); if (canBeJumpT4(conditionalJumpT4Location, to, mayTriggerErrata)) { if (!mayTriggerErrata) return LinkConditionalJumpT4; } } else { // 2-byte unconditional T2 - const uint16_t* jumpT2Location = reinterpret_cast(from - (paddingSize - JumpSizes[LinkJumpT2])); + const uint16_t* jumpT2Location = reinterpret_cast(from - (paddingSize - JUMP_ENUM_SIZE(LinkJumpT2))); if (canBeJumpT2(jumpT2Location, to)) return LinkJumpT2; // 4-byte unconditional T4 - const uint16_t* jumpT4Location = reinterpret_cast(from - (paddingSize - JumpSizes[LinkJumpT4])); + const uint16_t* jumpT4Location = reinterpret_cast(from - (paddingSize - JUMP_ENUM_SIZE(LinkJumpT4))); if (canBeJumpT4(jumpT4Location, to, mayTriggerErrata)) { if (!mayTriggerErrata) return LinkJumpT4; @@ -1764,7 +1677,7 @@ public: return m_jumpsToLink; } - void link(LinkRecord& record, uint8_t* from, uint8_t* to) + void ALWAYS_INLINE link(LinkRecord& record, uint8_t* from, uint8_t* to) { switch (record.linkType()) { case LinkJumpT1: @@ -1795,10 +1708,11 @@ public: } void* unlinkedCode() { return m_formatter.data(); } - - static unsigned getCallReturnOffset(JmpSrc call) + size_t codeSize() const { return m_formatter.codeSize(); } + + static unsigned getCallReturnOffset(AssemblerLabel call) { - ASSERT(call.m_offset >= 0); + ASSERT(call.isSet()); return call.m_offset; } @@ -1810,33 +1724,31 @@ public: // writable region of memory; to modify the code in an execute-only execuable // pool the 'repatch' and 'relink' methods should be used. - void linkJump(JmpSrc from, JmpDst to) + void linkJump(AssemblerLabel from, AssemblerLabel to, JumpType type, Condition condition) { - ASSERT(to.m_offset != -1); - ASSERT(from.m_offset != -1); - m_jumpsToLink.append(LinkRecord(from.m_offset, to.m_offset, from.m_type, from.m_condition)); + ASSERT(to.isSet()); + ASSERT(from.isSet()); + m_jumpsToLink.append(LinkRecord(from.m_offset, to.m_offset, type, condition)); } - static void linkJump(void* code, JmpSrc from, void* to) + static void linkJump(void* code, AssemblerLabel from, void* to) { - ASSERT(from.m_offset != -1); + ASSERT(from.isSet()); uint16_t* location = reinterpret_cast(reinterpret_cast(code) + from.m_offset); linkJumpAbsolute(location, to); } - // 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) + static void linkCall(void* code, AssemblerLabel from, void* to) { ASSERT(!(reinterpret_cast(code) & 1)); - ASSERT(from.m_offset != -1); + ASSERT(from.isSet()); ASSERT(reinterpret_cast(to) & 1); setPointer(reinterpret_cast(reinterpret_cast(code) + from.m_offset) - 1, to); } - static void linkPointer(void* code, JmpDst where, void* value) + static void linkPointer(void* code, AssemblerLabel where, void* value) { setPointer(reinterpret_cast(code) + where.m_offset, value); } @@ -1865,6 +1777,13 @@ public: setInt32(where, value); } + + static void repatchCompact(void* where, int32_t value) + { + ASSERT(value >= 0); + ASSERT(ARMThumbImmediate::makeUInt12(value).isUInt7()); + setUInt7ForLoad(where, ARMThumbImmediate::makeUInt12(value)); + } static void repatchPointer(void* where, void* value) { @@ -1873,20 +1792,9 @@ public: setPointer(where, value); } - static void repatchLoadPtrToLEA(void* where) + static void* readPointer(void* where) { - ASSERT(!(reinterpret_cast(where) & 1)); - uint16_t* loadOp = reinterpret_cast(where) + 4; - - ASSERT((loadOp[0] & 0xfff0) == OP_LDR_reg_T2); - ASSERT((loadOp[1] & 0x0ff0) == 0); - int rn = loadOp[0] & 0xf; - int rt = loadOp[1] >> 12; - int rm = loadOp[1] & 0xf; - - loadOp[0] = OP_ADD_reg_T3 | rn; - loadOp[1] = rt << 8 | rm; - ExecutableAllocator::cacheFlush(loadOp, sizeof(uint32_t)); + return reinterpret_cast(readInt32(where)); } private: @@ -1969,6 +1877,33 @@ private: ExecutableAllocator::cacheFlush(location - 4, 4 * sizeof(uint16_t)); } + + static int32_t readInt32(void* code) + { + uint16_t* location = reinterpret_cast(code); + ASSERT(isMOV_imm_T3(location - 4) && isMOVT(location - 2)); + + ARMThumbImmediate lo16; + ARMThumbImmediate hi16; + decodeTwoWordOp5i6Imm4Reg4EncodedImmFirst(lo16, location[-4]); + decodeTwoWordOp5i6Imm4Reg4EncodedImmSecond(lo16, location[-3]); + decodeTwoWordOp5i6Imm4Reg4EncodedImmFirst(hi16, location[-2]); + decodeTwoWordOp5i6Imm4Reg4EncodedImmSecond(hi16, location[-1]); + uint32_t result = hi16.asUInt16(); + result <<= 16; + result |= lo16.asUInt16(); + return static_cast(result); + } + + static void setUInt7ForLoad(void* code, ARMThumbImmediate imm) + { + // Requires us to have planted a LDR_imm_T1 + ASSERT(imm.isValid()); + ASSERT(imm.isUInt7()); + uint16_t* location = reinterpret_cast(code); + location[0] |= (imm.getUInt7() >> 2) << 6; + ExecutableAllocator::cacheFlush(location, sizeof(uint16_t)); + } static void setPointer(void* code, void* value) { @@ -2225,66 +2160,79 @@ private: return op | (imm.m_value.i << 10) | imm.m_value.imm4; } + static void decodeTwoWordOp5i6Imm4Reg4EncodedImmFirst(ARMThumbImmediate& result, uint16_t value) + { + result.m_value.i = (value >> 10) & 1; + result.m_value.imm4 = value & 15; + } + static uint16_t twoWordOp5i6Imm4Reg4EncodedImmSecond(uint16_t rd, ARMThumbImmediate imm) { return (imm.m_value.imm3 << 12) | (rd << 8) | imm.m_value.imm8; } + static void decodeTwoWordOp5i6Imm4Reg4EncodedImmSecond(ARMThumbImmediate& result, uint16_t value) + { + result.m_value.imm3 = (value >> 12) & 7; + result.m_value.imm8 = value & 255; + } + class ARMInstructionFormatter { public: - void oneWordOp5Reg3Imm8(OpcodeID op, RegisterID rd, uint8_t imm) + ALWAYS_INLINE void oneWordOp5Reg3Imm8(OpcodeID op, RegisterID rd, uint8_t imm) { m_buffer.putShort(op | (rd << 8) | imm); } - void oneWordOp5Imm5Reg3Reg3(OpcodeID op, uint8_t imm, RegisterID reg1, RegisterID reg2) + ALWAYS_INLINE void oneWordOp5Imm5Reg3Reg3(OpcodeID op, uint8_t imm, RegisterID reg1, RegisterID reg2) { m_buffer.putShort(op | (imm << 6) | (reg1 << 3) | reg2); } - void oneWordOp7Reg3Reg3Reg3(OpcodeID op, RegisterID reg1, RegisterID reg2, RegisterID reg3) + ALWAYS_INLINE void oneWordOp7Reg3Reg3Reg3(OpcodeID op, RegisterID reg1, RegisterID reg2, RegisterID reg3) { m_buffer.putShort(op | (reg1 << 6) | (reg2 << 3) | reg3); } - void oneWordOp8Imm8(OpcodeID op, uint8_t imm) + ALWAYS_INLINE void oneWordOp8Imm8(OpcodeID op, uint8_t imm) { m_buffer.putShort(op | imm); } - void oneWordOp8RegReg143(OpcodeID op, RegisterID reg1, RegisterID reg2) + ALWAYS_INLINE void oneWordOp8RegReg143(OpcodeID op, RegisterID reg1, RegisterID reg2) { m_buffer.putShort(op | ((reg2 & 8) << 4) | (reg1 << 3) | (reg2 & 7)); } - void oneWordOp9Imm7(OpcodeID op, uint8_t imm) + + ALWAYS_INLINE void oneWordOp9Imm7(OpcodeID op, uint8_t imm) { m_buffer.putShort(op | imm); } - void oneWordOp10Reg3Reg3(OpcodeID op, RegisterID reg1, RegisterID reg2) + ALWAYS_INLINE void oneWordOp10Reg3Reg3(OpcodeID op, RegisterID reg1, RegisterID reg2) { m_buffer.putShort(op | (reg1 << 3) | reg2); } - void twoWordOp12Reg4FourFours(OpcodeID1 op, RegisterID reg, FourFours ff) + ALWAYS_INLINE void twoWordOp12Reg4FourFours(OpcodeID1 op, RegisterID reg, FourFours ff) { m_buffer.putShort(op | reg); m_buffer.putShort(ff.m_u.value); } - void twoWordOp16FourFours(OpcodeID1 op, FourFours ff) + ALWAYS_INLINE void twoWordOp16FourFours(OpcodeID1 op, FourFours ff) { m_buffer.putShort(op); m_buffer.putShort(ff.m_u.value); } - void twoWordOp16Op16(OpcodeID1 op1, OpcodeID2 op2) + ALWAYS_INLINE void twoWordOp16Op16(OpcodeID1 op1, OpcodeID2 op2) { m_buffer.putShort(op1); m_buffer.putShort(op2); } - void twoWordOp5i6Imm4Reg4EncodedImm(OpcodeID1 op, int imm4, RegisterID rd, ARMThumbImmediate imm) + ALWAYS_INLINE void twoWordOp5i6Imm4Reg4EncodedImm(OpcodeID1 op, int imm4, RegisterID rd, ARMThumbImmediate imm) { ARMThumbImmediate newImm = imm; newImm.m_value.imm4 = imm4; @@ -2293,7 +2241,7 @@ private: m_buffer.putShort(ARMv7Assembler::twoWordOp5i6Imm4Reg4EncodedImmSecond(rd, newImm)); } - void twoWordOp12Reg4Reg4Imm12(OpcodeID1 op, RegisterID reg1, RegisterID reg2, uint16_t imm) + ALWAYS_INLINE void twoWordOp12Reg4Reg4Imm12(OpcodeID1 op, RegisterID reg1, RegisterID reg2, uint16_t imm) { m_buffer.putShort(op | reg1); m_buffer.putShort((reg2 << 12) | imm); @@ -2303,7 +2251,7 @@ private: // 111111111B11aaaa:bbbb222SA2C2cccc // Where 1s in the pattern come from op1, 2s in the pattern come from op2, S is the provided size bit. // Operands provide 5 bit values of the form Aaaaa, Bbbbb, Ccccc. - void vfpOp(OpcodeID1 op1, OpcodeID2 op2, bool size, VFPOperand a, VFPOperand b, VFPOperand c) + ALWAYS_INLINE void vfpOp(OpcodeID1 op1, OpcodeID2 op2, bool size, VFPOperand a, VFPOperand b, VFPOperand c) { ASSERT(!(op1 & 0x004f)); ASSERT(!(op2 & 0xf1af)); @@ -2313,7 +2261,7 @@ private: // Arm vfp addresses can be offset by a 9-bit ones-comp immediate, left shifted by 2. // (i.e. +/-(0..255) 32-bit words) - void vfpMemOp(OpcodeID1 op1, OpcodeID2 op2, bool size, RegisterID rn, VFPOperand rd, int32_t imm) + ALWAYS_INLINE void vfpMemOp(OpcodeID1 op1, OpcodeID2 op2, bool size, RegisterID rn, VFPOperand rd, int32_t imm) { bool up = true; if (imm < 0) { @@ -2331,10 +2279,14 @@ private: // Administrative methods: - size_t size() const { return m_buffer.size(); } + size_t codeSize() const { return m_buffer.codeSize(); } + AssemblerLabel label() const { return m_buffer.label(); } bool isAligned(int alignment) const { return m_buffer.isAligned(alignment); } void* data() const { return m_buffer.data(); } - void* executableCopy(ExecutablePool* allocator) { return m_buffer.executableCopy(allocator); } + +#ifndef NDEBUG + unsigned debugOffset() { return m_buffer.debugOffset(); } +#endif private: AssemblerBuffer m_buffer; diff --git a/assembler/AbstractMacroAssembler.h b/assembler/AbstractMacroAssembler.h index 5db2cb9..7d9d092 100644 --- a/assembler/AbstractMacroAssembler.h +++ b/assembler/AbstractMacroAssembler.h @@ -26,8 +26,8 @@ #ifndef AbstractMacroAssembler_h #define AbstractMacroAssembler_h -#include -#include +#include "CodeLocation.h" +#include "MacroAssemblerCodeRef.h" #include #include @@ -41,6 +41,7 @@ class RepatchBuffer; template class AbstractMacroAssembler { public: + friend class JITWriteBarrierBase; typedef AssemblerType AssemblerType_T; typedef MacroAssemblerCodePtr CodePtr; @@ -49,9 +50,6 @@ public: class Jump; typedef typename AssemblerType::RegisterID RegisterID; - typedef typename AssemblerType::JmpSrc JmpSrc; - typedef typename AssemblerType::JmpDst JmpDst; - // Section 1: MacroAssembler operand types // @@ -145,21 +143,21 @@ public: // Describes an memory operand given by a pointer. For regular load & store // operations an unwrapped void* will be used, rather than using this. struct AbsoluteAddress { - explicit AbsoluteAddress(void* ptr) + explicit AbsoluteAddress(const void* ptr) : m_ptr(ptr) { } - void* m_ptr; + const void* m_ptr; }; - // ImmPtr: + // TrustedImmPtr: // // A pointer sized immediate operand to an instruction - this is wrapped // in a class requiring explicit construction in order to differentiate // from pointers used as absolute addresses to memory operations - struct ImmPtr { - explicit ImmPtr(const void* value) + struct TrustedImmPtr { + explicit TrustedImmPtr(const void* value) : m_value(value) { } @@ -172,14 +170,21 @@ public: const void* m_value; }; - // Imm32: + struct ImmPtr : public TrustedImmPtr { + explicit ImmPtr(const void* value) + : TrustedImmPtr(value) + { + } + }; + + // TrustedImm32: // // A 32bit immediate operand to an instruction - this is wrapped in a // class requiring explicit construction in order to prevent RegisterIDs // (which are implemented as an enum) from accidentally being passed as // immediate values. - struct Imm32 { - explicit Imm32(int32_t value) + struct TrustedImm32 { + explicit TrustedImm32(int32_t value) : m_value(value) #if CPU(ARM) || CPU(MIPS) , m_isPointer(false) @@ -188,7 +193,7 @@ public: } #if !CPU(X86_64) - explicit Imm32(ImmPtr ptr) + explicit TrustedImm32(TrustedImmPtr ptr) : m_value(ptr.asIntptr()) #if CPU(ARM) || CPU(MIPS) , m_isPointer(true) @@ -211,6 +216,19 @@ public: }; + struct Imm32 : public TrustedImm32 { + explicit Imm32(int32_t value) + : TrustedImm32(value) + { + } +#if !CPU(X86_64) + explicit Imm32(TrustedImmPtr ptr) + : TrustedImm32(ptr) + { + } +#endif + }; + // Section 2: MacroAssembler code buffer handles // // The following types are used to reference items in the code buffer @@ -240,10 +258,9 @@ public: { } - bool isUsed() const { return m_label.isUsed(); } - void used() { m_label.used(); } + bool isSet() const { return m_label.isSet(); } private: - JmpDst m_label; + AssemblerLabel m_label; }; // DataLabelPtr: @@ -264,8 +281,10 @@ public: { } + bool isSet() const { return m_label.isSet(); } + private: - JmpDst m_label; + AssemblerLabel m_label; }; // DataLabel32: @@ -286,8 +305,37 @@ public: { } + AssemblerLabel label() const { return m_label; } + + private: + AssemblerLabel m_label; + }; + + // DataLabelCompact: + // + // A DataLabelCompact is used to refer to a location in the code containing a + // compact immediate to be patched after the code has been generated. + class DataLabelCompact { + template + friend class AbstractMacroAssembler; + friend class LinkBuffer; + public: + DataLabelCompact() + { + } + + DataLabelCompact(AbstractMacroAssembler* masm) + : m_label(masm->m_assembler.label()) + { + } + + DataLabelCompact(AssemblerLabel label) + : m_label(label) + { + } + private: - JmpDst m_label; + AssemblerLabel m_label; }; // Call: @@ -313,7 +361,7 @@ public: { } - Call(JmpSrc jmp, Flags flags) + Call(AssemblerLabel jmp, Flags flags) : m_jmp(jmp) , m_flags(flags) { @@ -329,7 +377,7 @@ public: return Call(jump.m_jmp, Linkable); } - JmpSrc m_jmp; + AssemblerLabel m_jmp; private: Flags m_flags; }; @@ -350,23 +398,47 @@ public: { } - Jump(JmpSrc jmp) +#if CPU(ARM_THUMB2) + // Fixme: this information should be stored in the instruction stream, not in the Jump object. + Jump(AssemblerLabel jmp, ARMv7Assembler::JumpType type, ARMv7Assembler::Condition condition = ARMv7Assembler::ConditionInvalid) : m_jmp(jmp) + , m_type(type) + , m_condition(condition) { } - - void link(AbstractMacroAssembler* masm) +#else + Jump(AssemblerLabel jmp) + : m_jmp(jmp) + { + } +#endif + + void link(AbstractMacroAssembler* masm) const { +#if CPU(ARM_THUMB2) + masm->m_assembler.linkJump(m_jmp, masm->m_assembler.label(), m_type, m_condition); +#else masm->m_assembler.linkJump(m_jmp, masm->m_assembler.label()); +#endif } - void linkTo(Label label, AbstractMacroAssembler* masm) + void linkTo(Label label, AbstractMacroAssembler* masm) const { +#if CPU(ARM_THUMB2) + masm->m_assembler.linkJump(m_jmp, label.m_label, m_type, m_condition); +#else masm->m_assembler.linkJump(m_jmp, label.m_label); +#endif } + bool isSet() const { return m_jmp.isSet(); } + private: - JmpSrc m_jmp; + AssemblerLabel m_jmp; +#if CPU(ARM_THUMB2) + ARMv7Assembler::JumpType m_type; + ARMv7Assembler::Condition m_condition; +#endif }; // JumpList: @@ -410,6 +482,11 @@ public: return !m_jumps.size(); } + void clear() + { + m_jumps.clear(); + } + const JumpVector& jumps() { return m_jumps; } private: @@ -418,11 +495,6 @@ public: // Section 3: Misc admin methods - size_t size() - { - return m_assembler.size(); - } - Label label() { return Label(this); @@ -458,6 +530,11 @@ public: { return AssemblerType::getDifferenceBetweenLabels(from.m_label, to.m_label); } + + ptrdiff_t differenceBetween(Label from, DataLabelCompact to) + { + return AssemblerType::getDifferenceBetweenLabels(from.m_label, to.m_label); + } ptrdiff_t differenceBetween(DataLabelPtr from, Jump to) { @@ -473,10 +550,19 @@ public: { return AssemblerType::getDifferenceBetweenLabels(from.m_label, to.m_jmp); } - + + // Temporary interface; likely to be removed, since may be hard to port to all architectures. +#if CPU(X86) || CPU(X86_64) + void rewindToLabel(Label rewindTo) { m_assembler.rewindToLabel(rewindTo.m_label); } +#endif + void beginUninterruptedSequence() { } void endUninterruptedSequence() { } +#ifndef NDEBUG + unsigned debugOffset() { return m_assembler.debugOffset(); } +#endif + protected: AssemblerType m_assembler; @@ -488,17 +574,12 @@ protected: AssemblerType::linkJump(code, jump.m_jmp, target.dataLocation()); } - static void linkPointer(void* code, typename AssemblerType::JmpDst label, void* value) + static void linkPointer(void* code, AssemblerLabel label, void* value) { AssemblerType::linkPointer(code, label, value); } - static void* getLinkerAddress(void* code, typename AssemblerType::JmpSrc label) - { - return AssemblerType::getRelocatedAddress(code, label); - } - - static void* getLinkerAddress(void* code, typename AssemblerType::JmpDst label) + static void* getLinkerAddress(void* code, AssemblerLabel label) { return AssemblerType::getRelocatedAddress(code, label); } @@ -518,6 +599,11 @@ protected: AssemblerType::relinkCall(nearCall.dataLocation(), destination.executableAddress()); } + static void repatchCompact(CodeLocationDataLabelCompact dataLabelCompact, int32_t value) + { + AssemblerType::repatchCompact(dataLabelCompact.dataLocation(), value); + } + static void repatchInt32(CodeLocationDataLabel32 dataLabel32, int32_t value) { AssemblerType::repatchInt32(dataLabel32.dataLocation(), value); @@ -527,10 +613,10 @@ protected: { AssemblerType::repatchPointer(dataLabelPtr.dataLocation(), value); } - - static void repatchLoadPtrToLEA(CodeLocationInstruction instruction) + + static void* readPointer(CodeLocationDataLabelPtr dataLabelPtr) { - AssemblerType::repatchLoadPtrToLEA(instruction.dataLocation()); + return AssemblerType::readPointer(dataLabelPtr.dataLocation()); } }; diff --git a/assembler/AssemblerBuffer.h b/assembler/AssemblerBuffer.h index e2fb8a1..b98503d 100644 --- a/assembler/AssemblerBuffer.h +++ b/assembler/AssemblerBuffer.h @@ -33,135 +33,148 @@ #include #include #include +#include namespace JSC { - class AssemblerBuffer { - static const int inlineCapacity = 256; - public: - AssemblerBuffer() - : m_buffer(m_inlineBuffer) - , m_capacity(inlineCapacity) - , m_size(0) + struct AssemblerLabel { + AssemblerLabel() + : m_offset(std::numeric_limits::max()) { } - ~AssemblerBuffer() + explicit AssemblerLabel(uint32_t offset) + : m_offset(offset) { - if (m_buffer != m_inlineBuffer) - fastFree(m_buffer); } - void ensureSpace(int space) - { - if (m_size > m_capacity - space) - grow(); - } + bool isSet() const { return (m_offset != std::numeric_limits::max()); } - bool isAligned(int alignment) const + AssemblerLabel labelAtOffset(int offset) const { - return !(m_size & (alignment - 1)); + return AssemblerLabel(m_offset + offset); } - void putByteUnchecked(int value) + uint32_t m_offset; + }; + + class AssemblerBuffer { + static const int inlineCapacity = 128; + public: + AssemblerBuffer() + : m_storage(inlineCapacity) + , m_buffer(m_storage.begin()) + , m_capacity(inlineCapacity) + , m_index(0) { - ASSERT(!(m_size > m_capacity - 4)); - m_buffer[m_size] = value; - m_size++; } - void putByte(int value) + ~AssemblerBuffer() { - if (m_size > m_capacity - 4) - grow(); - putByteUnchecked(value); } - void putShortUnchecked(int value) + bool isAvailable(int space) { - ASSERT(!(m_size > m_capacity - 4)); - *reinterpret_cast(&m_buffer[m_size]) = value; - m_size += 2; + return m_index + space <= m_capacity; } - void putShort(int value) + void ensureSpace(int space) { - if (m_size > m_capacity - 4) + if (!isAvailable(space)) grow(); - putShortUnchecked(value); } - void putIntUnchecked(int value) + bool isAligned(int alignment) const { - ASSERT(!(m_size > m_capacity - 4)); - *reinterpret_cast(&m_buffer[m_size]) = value; - m_size += 4; + return !(m_index & (alignment - 1)); } - void putInt64Unchecked(int64_t value) + template + void putIntegral(IntegralType value) { - ASSERT(!(m_size > m_capacity - 8)); - *reinterpret_cast(&m_buffer[m_size]) = value; - m_size += 8; + ensureSpace(sizeof(IntegralType)); + putIntegralUnchecked(value); } - void putInt(int value) + template + void putIntegralUnchecked(IntegralType value) { - if (m_size > m_capacity - 4) - grow(); - putIntUnchecked(value); + ASSERT(isAvailable(sizeof(IntegralType))); + *reinterpret_cast_ptr(m_buffer + m_index) = value; + m_index += sizeof(IntegralType); } + void putByteUnchecked(int8_t value) { putIntegralUnchecked(value); } + void putByte(int8_t value) { putIntegral(value); } + void putShortUnchecked(int16_t value) { putIntegralUnchecked(value); } + void putShort(int16_t value) { putIntegral(value); } + void putIntUnchecked(int32_t value) { putIntegralUnchecked(value); } + void putInt(int32_t value) { putIntegral(value); } + void putInt64Unchecked(int64_t value) { putIntegralUnchecked(value); } + void putInt64(int64_t value) { putIntegral(value); } + void* data() const { return m_buffer; } - int size() const + size_t codeSize() const { - return m_size; + return m_index; } - void* executableCopy(ExecutablePool* allocator) + AssemblerLabel label() const { - if (!m_size) + return AssemblerLabel(m_index); + } + + void* executableCopy(JSGlobalData& globalData, ExecutablePool* allocator) + { + if (!m_index) return 0; - void* result = allocator->alloc(m_size); + void* result = allocator->alloc(globalData, m_index); if (!result) return 0; - ExecutableAllocator::makeWritable(result, m_size); + ExecutableAllocator::makeWritable(result, m_index); - return memcpy(result, m_buffer, m_size); + return memcpy(result, m_buffer, m_index); } + void rewindToLabel(AssemblerLabel label) + { + m_index = label.m_offset; + } + +#ifndef NDEBUG + unsigned debugOffset() { return m_index; } +#endif + protected: void append(const char* data, int size) { - if (m_size > m_capacity - size) + if (!isAvailable(size)) grow(size); - memcpy(m_buffer + m_size, data, size); - m_size += size; + memcpy(m_buffer + m_index, data, size); + m_index += size; } void grow(int extraCapacity = 0) { m_capacity += m_capacity / 2 + extraCapacity; - if (m_buffer == m_inlineBuffer) { - char* newBuffer = static_cast(fastMalloc(m_capacity)); - m_buffer = static_cast(memcpy(newBuffer, m_buffer, m_size)); - } else - m_buffer = static_cast(fastRealloc(m_buffer, m_capacity)); + m_storage.grow(m_capacity); + m_buffer = m_storage.begin(); } - char m_inlineBuffer[inlineCapacity]; + private: + Vector m_storage; char* m_buffer; int m_capacity; - int m_size; + int m_index; }; } // namespace JSC diff --git a/assembler/AssemblerBufferWithConstantPool.h b/assembler/AssemblerBufferWithConstantPool.h index b1c537e..cd9ff9c 100644 --- a/assembler/AssemblerBufferWithConstantPool.h +++ b/assembler/AssemblerBufferWithConstantPool.h @@ -85,7 +85,14 @@ namespace JSC { template class AssemblerBufferWithConstantPool: public AssemblerBuffer { typedef SegmentedVector LoadOffsets; + using AssemblerBuffer::putIntegral; + using AssemblerBuffer::putIntegralUnchecked; public: + typedef struct { + short high; + short low; + } TwoShorts; + enum { UniqueConst, ReusableConst, @@ -120,6 +127,11 @@ public: AssemblerBuffer::ensureSpace(insnSpace); } + void ensureSpaceForAnyOneInstruction() + { + flushIfNoSpaceFor(maxInstructionSize, sizeof(uint64_t)); + } + bool isAligned(int alignment) { flushIfNoSpaceFor(alignment); @@ -171,44 +183,32 @@ public: correctDeltas(8); } - int size() + void putIntegral(TwoShorts value) { - flushIfNoSpaceFor(maxInstructionSize, sizeof(uint64_t)); - return AssemblerBuffer::size(); + putIntegral(value.high); + putIntegral(value.low); } - int uncheckedSize() + void putIntegralUnchecked(TwoShorts value) { - return AssemblerBuffer::size(); + putIntegralUnchecked(value.high); + putIntegralUnchecked(value.low); } - void* executableCopy(ExecutablePool* allocator) + void* executableCopy(JSGlobalData& globalData, ExecutablePool* allocator) { flushConstantPool(false); - return AssemblerBuffer::executableCopy(allocator); + return AssemblerBuffer::executableCopy(globalData, allocator); } - void putIntWithConstantInt(uint32_t insn, uint32_t constant, bool isReusable = false) + void putShortWithConstantInt(uint16_t insn, uint32_t constant, bool isReusable = false) { - flushIfNoSpaceFor(4, 4); - - m_loadOffsets.append(AssemblerBuffer::size()); - if (isReusable) - for (int i = 0; i < m_numConsts; ++i) { - if (m_mask[i] == ReusableConst && m_pool[i] == constant) { - AssemblerBuffer::putInt(AssemblerType::patchConstantPoolLoad(insn, i)); - correctDeltas(4); - return; - } - } - - m_pool[m_numConsts] = constant; - m_mask[m_numConsts] = static_cast(isReusable ? ReusableConst : UniqueConst); - - AssemblerBuffer::putInt(AssemblerType::patchConstantPoolLoad(insn, m_numConsts)); - ++m_numConsts; + putIntegralWithConstantInt(insn, constant, isReusable); + } - correctDeltas(4, 4); + void putIntWithConstantInt(uint32_t insn, uint32_t constant, bool isReusable = false) + { + putIntegralWithConstantInt(insn, constant, isReusable); } // This flushing mechanism can be called after any unconditional jumps. @@ -246,18 +246,45 @@ private: m_lastConstDelta = constSize; } + template + void putIntegralWithConstantInt(IntegralType insn, uint32_t constant, bool isReusable) + { + if (!m_numConsts) + m_maxDistance = maxPoolSize; + flushIfNoSpaceFor(sizeof(IntegralType), 4); + + m_loadOffsets.append(codeSize()); + if (isReusable) { + for (int i = 0; i < m_numConsts; ++i) { + if (m_mask[i] == ReusableConst && m_pool[i] == constant) { + putIntegral(static_cast(AssemblerType::patchConstantPoolLoad(insn, i))); + correctDeltas(sizeof(IntegralType)); + return; + } + } + } + + m_pool[m_numConsts] = constant; + m_mask[m_numConsts] = static_cast(isReusable ? ReusableConst : UniqueConst); + + putIntegral(static_cast(AssemblerType::patchConstantPoolLoad(insn, m_numConsts))); + ++m_numConsts; + + correctDeltas(sizeof(IntegralType), 4); + } + void flushConstantPool(bool useBarrier = true) { if (m_numConsts == 0) return; - int alignPool = (AssemblerBuffer::size() + (useBarrier ? barrierSize : 0)) & (sizeof(uint64_t) - 1); + int alignPool = (codeSize() + (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)); + putIntegral(AssemblerType::placeConstantPoolBarrier(m_numConsts * sizeof(uint32_t) + alignPool)); if (alignPool) { if (alignPool & 1) @@ -268,18 +295,17 @@ private: AssemblerBuffer::putInt(AssemblerType::padForAlign32); } - int constPoolOffset = AssemblerBuffer::size(); + int constPoolOffset = codeSize(); append(reinterpret_cast(m_pool), m_numConsts * sizeof(uint32_t)); // Patch each PC relative load for (LoadOffsets::Iterator iter = m_loadOffsets.begin(); iter != m_loadOffsets.end(); ++iter) { - void* loadAddr = reinterpret_cast(m_buffer + *iter); - AssemblerType::patchConstantPoolLoad(loadAddr, reinterpret_cast(m_buffer + constPoolOffset)); + void* loadAddr = reinterpret_cast(data()) + *iter; + AssemblerType::patchConstantPoolLoad(loadAddr, reinterpret_cast(data()) + constPoolOffset); } m_loadOffsets.clear(); m_numConsts = 0; - m_maxDistance = maxPoolSize; } void flushIfNoSpaceFor(int nextInsnSize) diff --git a/assembler/CodeLocation.h b/assembler/CodeLocation.h index cab28cd..9500b1e 100644 --- a/assembler/CodeLocation.h +++ b/assembler/CodeLocation.h @@ -26,8 +26,7 @@ #ifndef CodeLocation_h #define CodeLocation_h - -#include +#include "MacroAssemblerCodeRef.h" #if ENABLE(ASSEMBLER) @@ -38,6 +37,7 @@ class CodeLocationLabel; class CodeLocationJump; class CodeLocationCall; class CodeLocationNearCall; +class CodeLocationDataLabelCompact; class CodeLocationDataLabel32; class CodeLocationDataLabelPtr; @@ -61,6 +61,7 @@ public: CodeLocationNearCall nearCallAtOffset(int offset); CodeLocationDataLabelPtr dataLabelPtrAtOffset(int offset); CodeLocationDataLabel32 dataLabel32AtOffset(int offset); + CodeLocationDataLabelCompact dataLabelCompactAtOffset(int offset); protected: CodeLocationCommon() @@ -127,6 +128,15 @@ public: : CodeLocationCommon(MacroAssemblerCodePtr(location)) {} }; +class CodeLocationDataLabelCompact : public CodeLocationCommon { +public: + CodeLocationDataLabelCompact() { } + explicit CodeLocationDataLabelCompact(MacroAssemblerCodePtr location) + : CodeLocationCommon(location) { } + explicit CodeLocationDataLabelCompact(void* location) + : CodeLocationCommon(MacroAssemblerCodePtr(location)) { } +}; + class CodeLocationDataLabelPtr : public CodeLocationCommon { public: CodeLocationDataLabelPtr() {} @@ -178,6 +188,12 @@ inline CodeLocationDataLabel32 CodeLocationCommon::dataLabel32AtOffset(int offse return CodeLocationDataLabel32(reinterpret_cast(dataLocation()) + offset); } +inline CodeLocationDataLabelCompact CodeLocationCommon::dataLabelCompactAtOffset(int offset) +{ + ASSERT_VALID_CODE_OFFSET(offset); + return CodeLocationDataLabelCompact(reinterpret_cast(dataLocation()) + offset); +} + } // namespace JSC #endif // ENABLE(ASSEMBLER) diff --git a/assembler/LinkBuffer.h b/assembler/LinkBuffer.h index ae58946..59b5a1e 100644 --- a/assembler/LinkBuffer.h +++ b/assembler/LinkBuffer.h @@ -28,11 +28,16 @@ #if ENABLE(ASSEMBLER) +#define DUMP_LINK_STATISTICS 0 +#define DUMP_CODE 0 + #include #include namespace JSC { +class JSGlobalData; + // LinkBuffer: // // This class assists in linking code generated by the macro assembler, once code generation @@ -47,36 +52,47 @@ namespace JSC { // * 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 { +class LinkBuffer { + WTF_MAKE_NONCOPYABLE(LinkBuffer); typedef MacroAssemblerCodeRef CodeRef; typedef MacroAssemblerCodePtr CodePtr; typedef MacroAssembler::Label Label; typedef MacroAssembler::Jump Jump; typedef MacroAssembler::JumpList JumpList; typedef MacroAssembler::Call Call; + typedef MacroAssembler::DataLabelCompact DataLabelCompact; typedef MacroAssembler::DataLabel32 DataLabel32; typedef MacroAssembler::DataLabelPtr DataLabelPtr; - typedef MacroAssembler::JmpDst JmpDst; #if ENABLE(BRANCH_COMPACTION) typedef MacroAssembler::LinkRecord LinkRecord; typedef MacroAssembler::JumpLinkType JumpLinkType; #endif 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. - // The linkOffset parameter should only be non-null when recompiling for exception info - LinkBuffer(MacroAssembler* masm, PassRefPtr executablePool, void* linkOffset) + LinkBuffer(JSGlobalData& globalData, MacroAssembler* masm, PassRefPtr executablePool) : m_executablePool(executablePool) , m_size(0) , m_code(0) , m_assembler(masm) + , m_globalData(&globalData) +#ifndef NDEBUG + , m_completed(false) +#endif + { + linkCode(); + } + + LinkBuffer(JSGlobalData& globalData, MacroAssembler* masm, ExecutableAllocator& allocator) + : m_executablePool(allocator.poolForSize(globalData, masm->m_assembler.codeSize())) + , m_size(0) + , m_code(0) + , m_assembler(masm) + , m_globalData(&globalData) #ifndef NDEBUG , m_completed(false) #endif { - linkCode(linkOffset); + linkCode(); } ~LinkBuffer() @@ -107,13 +123,13 @@ public: void patch(DataLabelPtr label, void* value) { - JmpDst target = applyOffset(label.m_label); + AssemblerLabel target = applyOffset(label.m_label); MacroAssembler::linkPointer(code(), target, value); } void patch(DataLabelPtr label, CodeLocationLabel value) { - JmpDst target = applyOffset(label.m_label); + AssemblerLabel target = applyOffset(label.m_label); MacroAssembler::linkPointer(code(), target, value.executableAddress()); } @@ -147,6 +163,11 @@ public: { return CodeLocationDataLabel32(MacroAssembler::getLinkerAddress(code(), applyOffset(label.m_label))); } + + CodeLocationDataLabelCompact locationOf(DataLabelCompact label) + { + return CodeLocationDataLabelCompact(MacroAssembler::getLinkerAddress(code(), applyOffset(label.m_label))); + } // This method obtains the return address of the call, given as an offset from // the start of the code. @@ -179,6 +200,13 @@ public: return CodePtr(MacroAssembler::AssemblerType_T::getRelocatedAddress(code(), applyOffset(label.m_label))); } +#ifndef NDEBUG + void* debugAddress() + { + return m_code; + } +#endif + private: template T applyOffset(T src) { @@ -195,22 +223,21 @@ private: return m_code; } - void linkCode(void* linkOffset) + void linkCode() { - UNUSED_PARAM(linkOffset); ASSERT(!m_code); #if !ENABLE(BRANCH_COMPACTION) - m_code = m_assembler->m_assembler.executableCopy(m_executablePool.get()); - m_size = m_assembler->size(); + m_code = m_assembler->m_assembler.executableCopy(*m_globalData, m_executablePool.get()); + m_size = m_assembler->m_assembler.codeSize(); + ASSERT(m_code); #else - size_t initialSize = m_assembler->size(); - m_code = (uint8_t*)m_executablePool->alloc(initialSize); + size_t initialSize = m_assembler->m_assembler.codeSize(); + m_code = (uint8_t*)m_executablePool->alloc(*m_globalData, initialSize); if (!m_code) return; - ExecutableAllocator::makeWritable(m_code, m_assembler->size()); + ExecutableAllocator::makeWritable(m_code, initialSize); uint8_t* inData = (uint8_t*)m_assembler->unlinkedCode(); uint8_t* outData = reinterpret_cast(m_code); - const uint8_t* linkBase = linkOffset ? reinterpret_cast(linkOffset) : outData; int readPtr = 0; int writePtr = 0; Vector& jumpsToLink = m_assembler->jumpsToLink(); @@ -221,7 +248,14 @@ private: // Copy the instructions from the last jump to the current one. size_t regionSize = jumpsToLink[i].from() - readPtr; - memcpy(outData + writePtr, inData + readPtr, regionSize); + uint16_t* copySource = reinterpret_cast(inData + readPtr); + uint16_t* copyEnd = reinterpret_cast(inData + readPtr + regionSize); + uint16_t* copyDst = reinterpret_cast(outData + writePtr); + ASSERT(!(regionSize % 2)); + ASSERT(!(readPtr % 2)); + ASSERT(!(writePtr % 2)); + while (copySource != copyEnd) + *copyDst++ = *copySource++; m_assembler->recordLinkOffsets(readPtr, jumpsToLink[i].from(), offset); readPtr += regionSize; writePtr += regionSize; @@ -230,11 +264,11 @@ private: // branches we need to be precise, forward branches we are pessimistic const uint8_t* target; if (jumpsToLink[i].to() >= jumpsToLink[i].from()) - target = linkBase + jumpsToLink[i].to() - offset; // Compensate for what we have collapsed so far + target = outData + jumpsToLink[i].to() - offset; // Compensate for what we have collapsed so far else - target = linkBase + jumpsToLink[i].to() - m_assembler->executableOffsetFor(jumpsToLink[i].to()); + target = outData + jumpsToLink[i].to() - m_assembler->executableOffsetFor(jumpsToLink[i].to()); - JumpLinkType jumpLinkType = m_assembler->computeJumpType(jumpsToLink[i], linkBase + writePtr, target); + JumpLinkType jumpLinkType = m_assembler->computeJumpType(jumpsToLink[i], outData + writePtr, target); // Compact branch if we can... if (m_assembler->canCompact(jumpsToLink[i].type())) { // Step back in the write stream @@ -247,22 +281,25 @@ private: jumpsToLink[i].setFrom(writePtr); } // Copy everything after the last jump - memcpy(outData + writePtr, inData + readPtr, m_assembler->size() - readPtr); - m_assembler->recordLinkOffsets(readPtr, m_assembler->size(), readPtr - writePtr); + memcpy(outData + writePtr, inData + readPtr, initialSize - readPtr); + m_assembler->recordLinkOffsets(readPtr, initialSize, readPtr - writePtr); - // Actually link everything (don't link if we've be given a linkoffset as it's a - // waste of time: linkOffset is used for recompiling to get exception info) - if (!linkOffset) { - for (unsigned i = 0; i < jumpCount; ++i) { - uint8_t* location = outData + jumpsToLink[i].from(); - uint8_t* target = outData + jumpsToLink[i].to() - m_assembler->executableOffsetFor(jumpsToLink[i].to()); - m_assembler->link(jumpsToLink[i], location, target); - } + for (unsigned i = 0; i < jumpCount; ++i) { + uint8_t* location = outData + jumpsToLink[i].from(); + uint8_t* target = outData + jumpsToLink[i].to() - m_assembler->executableOffsetFor(jumpsToLink[i].to()); + m_assembler->link(jumpsToLink[i], location, target); } jumpsToLink.clear(); - m_size = writePtr + m_assembler->size() - readPtr; + m_size = writePtr + initialSize - readPtr; m_executablePool->tryShrink(m_code, initialSize, m_size); + +#if DUMP_LINK_STATISTICS + dumpLinkStatistics(m_code, initialSize, m_size); +#endif +#if DUMP_CODE + dumpCode(m_code, m_size); +#endif #endif } @@ -277,10 +314,58 @@ private: ExecutableAllocator::cacheFlush(code(), m_size); } +#if DUMP_LINK_STATISTICS + static void dumpLinkStatistics(void* code, size_t initialSize, size_t finalSize) + { + static unsigned linkCount = 0; + static unsigned totalInitialSize = 0; + static unsigned totalFinalSize = 0; + linkCount++; + totalInitialSize += initialSize; + totalFinalSize += finalSize; + printf("link %p: orig %u, compact %u (delta %u, %.2f%%)\n", + code, static_cast(initialSize), static_cast(finalSize), + static_cast(initialSize - finalSize), + 100.0 * (initialSize - finalSize) / initialSize); + printf("\ttotal %u: orig %u, compact %u (delta %u, %.2f%%)\n", + linkCount, totalInitialSize, totalFinalSize, totalInitialSize - totalFinalSize, + 100.0 * (totalInitialSize - totalFinalSize) / totalInitialSize); + } +#endif + +#if DUMP_CODE + static void dumpCode(void* code, size_t size) + { +#if CPU(ARM_THUMB2) + // Dump the generated code in an asm file format that can be assembled and then disassembled + // for debugging purposes. For example, save this output as jit.s: + // gcc -arch armv7 -c jit.s + // otool -tv jit.o + static unsigned codeCount = 0; + unsigned short* tcode = static_cast(code); + size_t tsize = size / sizeof(short); + char nameBuf[128]; + snprintf(nameBuf, sizeof(nameBuf), "_jsc_jit%u", codeCount++); + printf("\t.syntax unified\n" + "\t.section\t__TEXT,__text,regular,pure_instructions\n" + "\t.globl\t%s\n" + "\t.align 2\n" + "\t.code 16\n" + "\t.thumb_func\t%s\n" + "# %p\n" + "%s:\n", nameBuf, nameBuf, code, nameBuf); + + for (unsigned i = 0; i < tsize; i++) + printf("\t.short\t0x%x\n", tcode[i]); +#endif + } +#endif + RefPtr m_executablePool; size_t m_size; void* m_code; MacroAssembler* m_assembler; + JSGlobalData* m_globalData; #ifndef NDEBUG bool m_completed; #endif diff --git a/assembler/MIPSAssembler.h b/assembler/MIPSAssembler.h index ea35268..4164fa9 100644 --- a/assembler/MIPSAssembler.h +++ b/assembler/MIPSAssembler.h @@ -148,7 +148,7 @@ class MIPSAssembler { public: typedef MIPSRegisters::RegisterID RegisterID; typedef MIPSRegisters::FPRegisterID FPRegisterID; - typedef SegmentedVector Jumps; + typedef SegmentedVector Jumps; MIPSAssembler() { @@ -166,46 +166,6 @@ public: OP_SH_FT = 16 }; - class JmpSrc { - friend class MIPSAssembler; - public: - JmpSrc() - : m_offset(-1) - { - } - - private: - JmpSrc(int offset) - : m_offset(offset) - { - } - - int m_offset; - }; - - class JmpDst { - friend class MIPSAssembler; - 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; - }; - void emitInst(MIPSWord op) { void* oldBase = m_buffer.data(); @@ -287,6 +247,11 @@ public: emitInst(0x00000018 | (rs << OP_SH_RS) | (rt << OP_SH_RT)); } + void div(RegisterID rs, RegisterID rt) + { + emitInst(0x0000001a | (rs << OP_SH_RS) | (rt << OP_SH_RT)); + } + void mfhi(RegisterID rd) { emitInst(0x00000010 | (rd << OP_SH_RD)); @@ -392,6 +357,18 @@ public: | (rs << OP_SH_RS)); } + void srl(RegisterID rd, RegisterID rt, int shamt) + { + emitInst(0x00000002 | (rd << OP_SH_RD) | (rt << OP_SH_RT) + | ((shamt & 0x1f) << OP_SH_SHAMT)); + } + + void srlv(RegisterID rd, RegisterID rt, RegisterID rs) + { + emitInst(0x00000006 | (rd << OP_SH_RD) | (rt << OP_SH_RT) + | (rs << OP_SH_RS)); + } + void lbu(RegisterID rt, RegisterID rs, int offset) { emitInst(0x90000000 | (rt << OP_SH_RT) | (rs << OP_SH_RS) @@ -484,14 +461,9 @@ public: emitInst(0x45000000); } - JmpSrc newJmpSrc() - { - return JmpSrc(m_buffer.size()); - } - void appendJump() { - m_jumps.append(m_buffer.size()); + m_jumps.append(m_buffer.label()); } void addd(FPRegisterID fd, FPRegisterID fs, FPRegisterID ft) @@ -512,6 +484,12 @@ public: | (ft << OP_SH_FT)); } + void divd(FPRegisterID fd, FPRegisterID fs, FPRegisterID ft) + { + emitInst(0x46200003 | (fd << OP_SH_FD) | (fs << OP_SH_FS) + | (ft << OP_SH_FT)); + } + void lwc1(FPRegisterID ft, RegisterID rs, int offset) { emitInst(0xc4000000 | (ft << OP_SH_FT) | (rs << OP_SH_RS) @@ -543,12 +521,23 @@ public: copDelayNop(); } + void mthc1(RegisterID rt, FPRegisterID fs) + { + emitInst(0x44e00000 | (fs << OP_SH_FS) | (rt << OP_SH_RT)); + copDelayNop(); + } + void mfc1(RegisterID rt, FPRegisterID fs) { emitInst(0x44000000 | (fs << OP_SH_FS) | (rt << OP_SH_RT)); copDelayNop(); } + void sqrtd(FPRegisterID fd, FPRegisterID fs) + { + emitInst(0x46200004 | (fd << OP_SH_FD) | (fs << OP_SH_FS)); + } + void truncwd(FPRegisterID fd, FPRegisterID fs) { emitInst(0x4620000d | (fd << OP_SH_FD) | (fs << OP_SH_FS)); @@ -559,6 +548,11 @@ public: emitInst(0x46800021 | (fd << OP_SH_FD) | (fs << OP_SH_FS)); } + void cvtwd(FPRegisterID fd, FPRegisterID fs) + { + emitInst(0x46200024 | (fd << OP_SH_FD) | (fs << OP_SH_FS)); + } + void ceqd(FPRegisterID fs, FPRegisterID ft) { emitInst(0x46200032 | (fs << OP_SH_FS) | (ft << OP_SH_FT)); @@ -621,12 +615,12 @@ public: // General helpers - JmpDst label() + AssemblerLabel label() { - return JmpDst(m_buffer.size()); + return m_buffer.label(); } - JmpDst align(int alignment) + AssemblerLabel align(int alignment) { while (!m_buffer.isAligned(alignment)) bkpt(); @@ -634,44 +628,26 @@ public: return label(); } - static void* getRelocatedAddress(void* code, JmpSrc jump) + static void* getRelocatedAddress(void* code, AssemblerLabel label) { - ASSERT(jump.m_offset != -1); - void* b = reinterpret_cast((reinterpret_cast(code)) + jump.m_offset); - return b; + return reinterpret_cast(reinterpret_cast(code) + label.m_offset); } - static void* getRelocatedAddress(void* code, JmpDst label) + static int getDifferenceBetweenLabels(AssemblerLabel a, AssemblerLabel b) { - void* b = reinterpret_cast((reinterpret_cast(code)) + label.m_offset); - return b; - } - - static int getDifferenceBetweenLabels(JmpDst from, JmpDst to) - { - return to.m_offset - from.m_offset; - } - - static int getDifferenceBetweenLabels(JmpDst from, JmpSrc to) - { - return to.m_offset - from.m_offset; - } - - static int getDifferenceBetweenLabels(JmpSrc from, JmpDst to) - { - return to.m_offset - from.m_offset; + return b.m_offset - a.m_offset; } // Assembler admin methods: - size_t size() const + size_t codeSize() const { - return m_buffer.size(); + return m_buffer.codeSize(); } - void* executableCopy(ExecutablePool* allocator) + void* executableCopy(JSGlobalData& globalData, ExecutablePool* allocator) { - void *result = m_buffer.executableCopy(allocator); + void *result = m_buffer.executableCopy(globalData, allocator); if (!result) return 0; @@ -679,7 +655,11 @@ public: return result; } - static unsigned getCallReturnOffset(JmpSrc call) +#ifndef NDEBUG + unsigned debugOffset() { return m_buffer.debugOffset(); } +#endif + + static unsigned getCallReturnOffset(AssemblerLabel call) { // The return address is after a call and a delay slot instruction return call.m_offset; @@ -693,10 +673,10 @@ public: // writable region of memory; to modify the code in an execute-only execuable // pool the 'repatch' and 'relink' methods should be used. - void linkJump(JmpSrc from, JmpDst to) + void linkJump(AssemblerLabel from, AssemblerLabel to) { - ASSERT(to.m_offset != -1); - ASSERT(from.m_offset != -1); + ASSERT(to.isSet()); + ASSERT(from.isSet()); MIPSWord* insn = reinterpret_cast(reinterpret_cast(m_buffer.data()) + from.m_offset); MIPSWord* toPos = reinterpret_cast(reinterpret_cast(m_buffer.data()) + to.m_offset); @@ -705,9 +685,9 @@ public: linkWithOffset(insn, toPos); } - static void linkJump(void* code, JmpSrc from, void* to) + static void linkJump(void* code, AssemblerLabel from, void* to) { - ASSERT(from.m_offset != -1); + ASSERT(from.isSet()); MIPSWord* insn = reinterpret_cast(reinterpret_cast(code) + from.m_offset); ASSERT(!(*(insn - 1)) && !(*(insn - 2)) && !(*(insn - 3)) && !(*(insn - 5))); @@ -715,13 +695,13 @@ public: linkWithOffset(insn, to); } - static void linkCall(void* code, JmpSrc from, void* to) + static void linkCall(void* code, AssemblerLabel from, void* to) { MIPSWord* insn = reinterpret_cast(reinterpret_cast(code) + from.m_offset); linkCallInternal(insn, to); } - static void linkPointer(void* code, JmpDst from, void* to) + static void linkPointer(void* code, AssemblerLabel from, void* to) { MIPSWord* insn = reinterpret_cast(reinterpret_cast(code) + from.m_offset); ASSERT((*insn & 0xffe00000) == 0x3c000000); // lui @@ -766,34 +746,42 @@ public: ExecutableAllocator::cacheFlush(insn, 2 * sizeof(MIPSWord)); } + static int32_t readInt32(void* from) + { + MIPSWord* insn = reinterpret_cast(from); + ASSERT((*insn & 0xffe00000) == 0x3c000000); // lui + int32_t result = (*insn & 0x0000ffff) << 16; + insn++; + ASSERT((*insn & 0xfc000000) == 0x34000000); // ori + result |= *insn & 0x0000ffff + } + + static void repatchCompact(void* where, int32_t value) + { + repatchInt32(where, value); + } + static void repatchPointer(void* from, void* to) { repatchInt32(from, reinterpret_cast(to)); } - static void repatchLoadPtrToLEA(void* from) + static void* readPointer(void* from) { - MIPSWord* insn = reinterpret_cast(from); - insn = insn + 3; - ASSERT((*insn & 0xfc000000) == 0x8c000000); // lw - /* lw -> addiu */ - *insn = 0x24000000 | (*insn & 0x03ffffff); - - ExecutableAllocator::cacheFlush(insn, sizeof(MIPSWord)); + return static_cast(readInt32(from)); } private: - /* Update each jump in the buffer of newBase. */ void relocateJumps(void* oldBase, void* newBase) { // Check each jump for (Jumps::Iterator iter = m_jumps.begin(); iter != m_jumps.end(); ++iter) { - int pos = *iter; + int pos = iter->m_offset; MIPSWord* insn = reinterpret_cast(reinterpret_cast(newBase) + pos); insn = insn + 2; // Need to make sure we have 5 valid instructions after pos - if ((unsigned int)pos >= m_buffer.size() - 5 * sizeof(MIPSWord)) + if ((unsigned int)pos >= m_buffer.codeSize() - 5 * sizeof(MIPSWord)) continue; if ((*insn & 0xfc000000) == 0x08000000) { // j diff --git a/assembler/MacroAssembler.h b/assembler/MacroAssembler.h index ce1be78..c8506c7 100644 --- a/assembler/MacroAssembler.h +++ b/assembler/MacroAssembler.h @@ -50,6 +50,12 @@ namespace JSC { typedef MacroAssemblerX86 MacroAssemblerBase; }; #include "MacroAssemblerX86_64.h" namespace JSC { typedef MacroAssemblerX86_64 MacroAssemblerBase; }; +#elif CPU(SH4) +#include "MacroAssemblerSH4.h" +namespace JSC { +typedef MacroAssemblerSH4 MacroAssemblerBase; +}; + #else #error "The MacroAssembler is not supported on this platform." #endif @@ -74,7 +80,7 @@ public: // described in terms of other macro assembly methods. void pop() { - addPtr(Imm32(sizeof(void*)), stackPointerRegister); + addPtr(TrustedImm32(sizeof(void*)), stackPointerRegister); } void peek(RegisterID dest, int index = 0) @@ -87,44 +93,44 @@ public: storePtr(src, Address(stackPointerRegister, (index * sizeof(void*)))); } - void poke(Imm32 value, int index = 0) + void poke(TrustedImm32 value, int index = 0) { store32(value, Address(stackPointerRegister, (index * sizeof(void*)))); } - void poke(ImmPtr imm, int index = 0) + void poke(TrustedImmPtr imm, int index = 0) { storePtr(imm, Address(stackPointerRegister, (index * sizeof(void*)))); } // Backwards banches, these are currently all implemented using existing forwards branch mechanisms. - void branchPtr(Condition cond, RegisterID op1, ImmPtr imm, Label target) + void branchPtr(RelationalCondition cond, RegisterID op1, TrustedImmPtr imm, Label target) { branchPtr(cond, op1, imm).linkTo(target, this); } - void branch32(Condition cond, RegisterID op1, RegisterID op2, Label target) + void branch32(RelationalCondition cond, RegisterID op1, RegisterID op2, Label target) { branch32(cond, op1, op2).linkTo(target, this); } - void branch32(Condition cond, RegisterID op1, Imm32 imm, Label target) + void branch32(RelationalCondition cond, RegisterID op1, TrustedImm32 imm, Label target) { branch32(cond, op1, imm).linkTo(target, this); } - void branch32(Condition cond, RegisterID left, Address right, Label target) + void branch32(RelationalCondition cond, RegisterID left, Address right, Label target) { branch32(cond, left, right).linkTo(target, this); } - void branch16(Condition cond, BaseIndex left, RegisterID right, Label target) + void branch16(RelationalCondition cond, BaseIndex left, RegisterID right, Label target) { branch16(cond, left, right).linkTo(target, this); } - void branchTestPtr(Condition cond, RegisterID reg, Label target) + void branchTestPtr(ResultCondition cond, RegisterID reg, Label target) { branchTestPtr(cond, reg).linkTo(target, this); } @@ -144,17 +150,17 @@ public: add32(src, dest); } - void addPtr(Imm32 imm, RegisterID srcDest) + void addPtr(TrustedImm32 imm, RegisterID srcDest) { add32(imm, srcDest); } - void addPtr(ImmPtr imm, RegisterID dest) + void addPtr(TrustedImmPtr imm, RegisterID dest) { - add32(Imm32(imm), dest); + add32(TrustedImm32(imm), dest); } - void addPtr(Imm32 imm, RegisterID src, RegisterID dest) + void addPtr(TrustedImm32 imm, RegisterID src, RegisterID dest) { add32(imm, src, dest); } @@ -164,7 +170,7 @@ public: and32(src, dest); } - void andPtr(Imm32 imm, RegisterID srcDest) + void andPtr(TrustedImm32 imm, RegisterID srcDest) { and32(imm, srcDest); } @@ -174,12 +180,12 @@ public: or32(src, dest); } - void orPtr(ImmPtr imm, RegisterID dest) + void orPtr(TrustedImmPtr imm, RegisterID dest) { - or32(Imm32(imm), dest); + or32(TrustedImm32(imm), dest); } - void orPtr(Imm32 imm, RegisterID dest) + void orPtr(TrustedImm32 imm, RegisterID dest) { or32(imm, dest); } @@ -189,14 +195,14 @@ public: sub32(src, dest); } - void subPtr(Imm32 imm, RegisterID dest) + void subPtr(TrustedImm32 imm, RegisterID dest) { sub32(imm, dest); } - void subPtr(ImmPtr imm, RegisterID dest) + void subPtr(TrustedImmPtr imm, RegisterID dest) { - sub32(Imm32(imm), dest); + sub32(TrustedImm32(imm), dest); } void xorPtr(RegisterID src, RegisterID dest) @@ -204,7 +210,7 @@ public: xor32(src, dest); } - void xorPtr(Imm32 imm, RegisterID srcDest) + void xorPtr(TrustedImm32 imm, RegisterID srcDest) { xor32(imm, srcDest); } @@ -229,10 +235,15 @@ public: { return load32WithAddressOffsetPatch(address, dest); } + + DataLabelCompact loadPtrWithCompactAddressOffsetPatch(Address address, RegisterID dest) + { + return load32WithCompactAddressOffsetPatch(address, dest); + } - void setPtr(Condition cond, RegisterID left, Imm32 right, RegisterID dest) + void comparePtr(RelationalCondition cond, RegisterID left, TrustedImm32 right, RegisterID dest) { - set32(cond, left, right, dest); + compare32(cond, left, right, dest); } void storePtr(RegisterID src, ImplicitAddress address) @@ -250,14 +261,14 @@ public: store32(src, address); } - void storePtr(ImmPtr imm, ImplicitAddress address) + void storePtr(TrustedImmPtr imm, ImplicitAddress address) { - store32(Imm32(imm), address); + store32(TrustedImm32(imm), address); } - void storePtr(ImmPtr imm, void* address) + void storePtr(TrustedImmPtr imm, void* address) { - store32(Imm32(imm), address); + store32(TrustedImm32(imm), address); } DataLabel32 storePtrWithAddressOffsetPatch(RegisterID src, Address address) @@ -266,73 +277,73 @@ public: } - Jump branchPtr(Condition cond, RegisterID left, RegisterID right) + Jump branchPtr(RelationalCondition cond, RegisterID left, RegisterID right) { return branch32(cond, left, right); } - Jump branchPtr(Condition cond, RegisterID left, ImmPtr right) + Jump branchPtr(RelationalCondition cond, RegisterID left, TrustedImmPtr right) { - return branch32(cond, left, Imm32(right)); + return branch32(cond, left, TrustedImm32(right)); } - Jump branchPtr(Condition cond, RegisterID left, Address right) + Jump branchPtr(RelationalCondition cond, RegisterID left, Address right) { return branch32(cond, left, right); } - Jump branchPtr(Condition cond, Address left, RegisterID right) + Jump branchPtr(RelationalCondition cond, Address left, RegisterID right) { return branch32(cond, left, right); } - Jump branchPtr(Condition cond, AbsoluteAddress left, RegisterID right) + Jump branchPtr(RelationalCondition cond, AbsoluteAddress left, RegisterID right) { return branch32(cond, left, right); } - Jump branchPtr(Condition cond, Address left, ImmPtr right) + Jump branchPtr(RelationalCondition cond, Address left, TrustedImmPtr right) { - return branch32(cond, left, Imm32(right)); + return branch32(cond, left, TrustedImm32(right)); } - Jump branchPtr(Condition cond, AbsoluteAddress left, ImmPtr right) + Jump branchPtr(RelationalCondition cond, AbsoluteAddress left, TrustedImmPtr right) { - return branch32(cond, left, Imm32(right)); + return branch32(cond, left, TrustedImm32(right)); } - Jump branchTestPtr(Condition cond, RegisterID reg, RegisterID mask) + Jump branchTestPtr(ResultCondition cond, RegisterID reg, RegisterID mask) { return branchTest32(cond, reg, mask); } - Jump branchTestPtr(Condition cond, RegisterID reg, Imm32 mask = Imm32(-1)) + Jump branchTestPtr(ResultCondition cond, RegisterID reg, TrustedImm32 mask = TrustedImm32(-1)) { return branchTest32(cond, reg, mask); } - Jump branchTestPtr(Condition cond, Address address, Imm32 mask = Imm32(-1)) + Jump branchTestPtr(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1)) { return branchTest32(cond, address, mask); } - Jump branchTestPtr(Condition cond, BaseIndex address, Imm32 mask = Imm32(-1)) + Jump branchTestPtr(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1)) { return branchTest32(cond, address, mask); } - Jump branchAddPtr(Condition cond, RegisterID src, RegisterID dest) + Jump branchAddPtr(ResultCondition cond, RegisterID src, RegisterID dest) { return branchAdd32(cond, src, dest); } - Jump branchSubPtr(Condition cond, Imm32 imm, RegisterID dest) + Jump branchSubPtr(ResultCondition cond, TrustedImm32 imm, RegisterID dest) { return branchSub32(cond, imm, dest); } using MacroAssemblerBase::branchTest8; - Jump branchTest8(Condition cond, ExtendedAddress address, Imm32 mask = Imm32(-1)) + Jump branchTest8(ResultCondition cond, ExtendedAddress address, TrustedImm32 mask = TrustedImm32(-1)) { return MacroAssemblerBase::branchTest8(cond, Address(address.base, address.offset), mask); } diff --git a/assembler/MacroAssemblerARM.cpp b/assembler/MacroAssemblerARM.cpp index b5b20fa..2db5df1 100644 --- a/assembler/MacroAssemblerARM.cpp +++ b/assembler/MacroAssemblerARM.cpp @@ -57,7 +57,11 @@ static bool isVFPPresent() } #endif +#if (COMPILER(RVCT) && defined(__TARGET_FPU_VFP)) || (COMPILER(GCC) && defined(__VFP_FP__)) + return true; +#else return false; +#endif } const bool MacroAssemblerARM::s_isVFPPresent = isVFPPresent(); diff --git a/assembler/MacroAssemblerARM.h b/assembler/MacroAssemblerARM.h index 1bbb0cc..b365dce 100644 --- a/assembler/MacroAssemblerARM.h +++ b/assembler/MacroAssemblerARM.h @@ -41,8 +41,9 @@ class MacroAssemblerARM : public AbstractMacroAssembler { COMPILE_ASSERT(!(DoubleConditionBitSpecial & DoubleConditionMask), DoubleConditionBitSpecial_should_not_interfere_with_ARMAssembler_Condition_codes); public: typedef ARMRegisters::FPRegisterID FPRegisterID; + static const int MaximumCompactPtrAlignedAddressOffset = 0x7FFFFFFF; - enum Condition { + enum RelationalCondition { Equal = ARMAssembler::EQ, NotEqual = ARMAssembler::NE, Above = ARMAssembler::HI, @@ -52,7 +53,10 @@ public: GreaterThan = ARMAssembler::GT, GreaterThanOrEqual = ARMAssembler::GE, LessThan = ARMAssembler::LT, - LessThanOrEqual = ARMAssembler::LE, + LessThanOrEqual = ARMAssembler::LE + }; + + enum ResultCondition { Overflow = ARMAssembler::VS, Signed = ARMAssembler::MI, Zero = ARMAssembler::EQ, @@ -86,14 +90,14 @@ public: m_assembler.adds_r(dest, dest, src); } - void add32(Imm32 imm, Address address) + void add32(TrustedImm32 imm, Address address) { load32(address, ARMRegisters::S1); add32(imm, ARMRegisters::S1); store32(ARMRegisters::S1, address); } - void add32(Imm32 imm, RegisterID dest) + void add32(TrustedImm32 imm, RegisterID dest) { m_assembler.adds_r(dest, dest, m_assembler.getImm(imm.m_value, ARMRegisters::S0)); } @@ -109,7 +113,7 @@ public: m_assembler.ands_r(dest, dest, src); } - void and32(Imm32 imm, RegisterID dest) + void and32(TrustedImm32 imm, RegisterID dest) { ARMWord w = m_assembler.getImm(imm.m_value, ARMRegisters::S0, true); if (w & ARMAssembler::OP2_INV_IMM) @@ -127,7 +131,7 @@ public: m_assembler.movs_r(dest, m_assembler.lsl_r(dest, ARMRegisters::S0)); } - void lshift32(Imm32 imm, RegisterID dest) + void lshift32(TrustedImm32 imm, RegisterID dest) { m_assembler.movs_r(dest, m_assembler.lsl(dest, imm.m_value & 0x1f)); } @@ -141,7 +145,7 @@ public: m_assembler.muls_r(dest, dest, src); } - void mul32(Imm32 imm, RegisterID src, RegisterID dest) + void mul32(TrustedImm32 imm, RegisterID src, RegisterID dest) { move(imm, ARMRegisters::S0); m_assembler.muls_r(dest, src, ARMRegisters::S0); @@ -162,7 +166,7 @@ public: m_assembler.orrs_r(dest, dest, src); } - void or32(Imm32 imm, RegisterID dest) + void or32(TrustedImm32 imm, RegisterID dest) { m_assembler.orrs_r(dest, dest, m_assembler.getImm(imm.m_value, ARMRegisters::S0)); } @@ -176,7 +180,7 @@ public: m_assembler.movs_r(dest, m_assembler.asr_r(dest, ARMRegisters::S0)); } - void rshift32(Imm32 imm, RegisterID dest) + void rshift32(TrustedImm32 imm, RegisterID dest) { m_assembler.movs_r(dest, m_assembler.asr(dest, imm.m_value & 0x1f)); } @@ -190,7 +194,7 @@ public: m_assembler.movs_r(dest, m_assembler.lsr_r(dest, ARMRegisters::S0)); } - void urshift32(Imm32 imm, RegisterID dest) + void urshift32(TrustedImm32 imm, RegisterID dest) { m_assembler.movs_r(dest, m_assembler.lsr(dest, imm.m_value & 0x1f)); } @@ -200,12 +204,12 @@ public: m_assembler.subs_r(dest, dest, src); } - void sub32(Imm32 imm, RegisterID dest) + void sub32(TrustedImm32 imm, RegisterID dest) { m_assembler.subs_r(dest, dest, m_assembler.getImm(imm.m_value, ARMRegisters::S0)); } - void sub32(Imm32 imm, Address address) + void sub32(TrustedImm32 imm, Address address) { load32(address, ARMRegisters::S1); sub32(imm, ARMRegisters::S1); @@ -223,11 +227,22 @@ public: m_assembler.eors_r(dest, dest, src); } - void xor32(Imm32 imm, RegisterID dest) + void xor32(TrustedImm32 imm, RegisterID dest) { m_assembler.eors_r(dest, dest, m_assembler.getImm(imm.m_value, ARMRegisters::S0)); } + void countLeadingZeros32(RegisterID src, RegisterID dest) + { +#if WTF_ARM_ARCH_AT_LEAST(5) + m_assembler.clz_r(dest, src); +#else + UNUSED_PARAM(src); + UNUSED_PARAM(dest); + ASSERT_NOT_REACHED(); +#endif + } + void load8(ImplicitAddress address, RegisterID dest) { m_assembler.dataTransfer32(true, dest, address.base, address.offset, true); @@ -259,29 +274,26 @@ public: m_assembler.dtr_ur(true, dest, address.base, ARMRegisters::S0); return dataLabel; } - - Label loadPtrWithPatchToLEA(Address address, RegisterID dest) + + DataLabelCompact load32WithCompactAddressOffsetPatch(Address address, RegisterID dest) { - Label label(this); - load32(address, dest); - return label; + DataLabelCompact dataLabel(this); + load32WithAddressOffsetPatch(address, dest); + return dataLabel; } void load16(BaseIndex address, RegisterID dest) { - m_assembler.add_r(ARMRegisters::S0, address.base, m_assembler.lsl(address.index, address.scale)); - if (address.offset>=0) - m_assembler.ldrh_u(dest, ARMRegisters::S0, ARMAssembler::getOp2Byte(address.offset)); - else - m_assembler.ldrh_d(dest, ARMRegisters::S0, ARMAssembler::getOp2Byte(-address.offset)); + m_assembler.add_r(ARMRegisters::S1, address.base, m_assembler.lsl(address.index, address.scale)); + load16(Address(ARMRegisters::S1, address.offset), dest); } void load16(ImplicitAddress address, RegisterID dest) { if (address.offset >= 0) - m_assembler.ldrh_u(dest, address.base, ARMAssembler::getOp2Byte(address.offset)); + m_assembler.ldrh_u(dest, address.base, m_assembler.getOffsetForHalfwordDataTransfer(address.offset, ARMRegisters::S0)); else - m_assembler.ldrh_d(dest, address.base, ARMAssembler::getOp2Byte(-address.offset)); + m_assembler.ldrh_d(dest, address.base, m_assembler.getOffsetForHalfwordDataTransfer(-address.offset, ARMRegisters::S0)); } DataLabel32 store32WithAddressOffsetPatch(RegisterID src, Address address) @@ -302,7 +314,7 @@ public: m_assembler.baseIndexTransfer32(false, src, address.base, address.index, static_cast(address.scale), address.offset); } - void store32(Imm32 imm, ImplicitAddress address) + void store32(TrustedImm32 imm, ImplicitAddress address) { if (imm.m_isPointer) m_assembler.ldr_un_imm(ARMRegisters::S1, imm.m_value); @@ -317,7 +329,7 @@ public: m_assembler.dtr_u(false, src, ARMRegisters::S0, 0); } - void store32(Imm32 imm, void* address) + void store32(TrustedImm32 imm, void* address) { m_assembler.ldr_un_imm(ARMRegisters::S0, reinterpret_cast(address)); if (imm.m_isPointer) @@ -343,13 +355,13 @@ public: push(ARMRegisters::S1); } - void push(Imm32 imm) + void push(TrustedImm32 imm) { move(imm, ARMRegisters::S0); push(ARMRegisters::S0); } - void move(Imm32 imm, RegisterID dest) + void move(TrustedImm32 imm, RegisterID dest) { if (imm.m_isPointer) m_assembler.ldr_un_imm(dest, imm.m_value); @@ -362,9 +374,9 @@ public: m_assembler.mov_r(dest, src); } - void move(ImmPtr imm, RegisterID dest) + void move(TrustedImmPtr imm, RegisterID dest) { - move(Imm32(imm), dest); + move(TrustedImm32(imm), dest); } void swap(RegisterID reg1, RegisterID reg2) @@ -386,59 +398,64 @@ public: move(src, dest); } - Jump branch8(Condition cond, Address left, Imm32 right) + Jump branch8(RelationalCondition cond, Address left, TrustedImm32 right) { load8(left, ARMRegisters::S1); return branch32(cond, ARMRegisters::S1, right); } - Jump branch32(Condition cond, RegisterID left, RegisterID right, int useConstantPool = 0) + Jump branch32(RelationalCondition cond, RegisterID left, RegisterID right, int useConstantPool = 0) { m_assembler.cmp_r(left, right); return Jump(m_assembler.jmp(ARMCondition(cond), useConstantPool)); } - Jump branch32(Condition cond, RegisterID left, Imm32 right, int useConstantPool = 0) + Jump branch32(RelationalCondition cond, RegisterID left, TrustedImm32 right, int useConstantPool = 0) { if (right.m_isPointer) { m_assembler.ldr_un_imm(ARMRegisters::S0, right.m_value); m_assembler.cmp_r(left, ARMRegisters::S0); - } else - m_assembler.cmp_r(left, m_assembler.getImm(right.m_value, ARMRegisters::S0)); + } else { + ARMWord tmp = m_assembler.getOp2(-right.m_value); + if (tmp != ARMAssembler::INVALID_IMM) + m_assembler.cmn_r(left, tmp); + else + m_assembler.cmp_r(left, m_assembler.getImm(right.m_value, ARMRegisters::S0)); + } return Jump(m_assembler.jmp(ARMCondition(cond), useConstantPool)); } - Jump branch32(Condition cond, RegisterID left, Address right) + Jump branch32(RelationalCondition cond, RegisterID left, Address right) { load32(right, ARMRegisters::S1); return branch32(cond, left, ARMRegisters::S1); } - Jump branch32(Condition cond, Address left, RegisterID right) + Jump branch32(RelationalCondition cond, Address left, RegisterID right) { load32(left, ARMRegisters::S1); return branch32(cond, ARMRegisters::S1, right); } - Jump branch32(Condition cond, Address left, Imm32 right) + Jump branch32(RelationalCondition cond, Address left, TrustedImm32 right) { load32(left, ARMRegisters::S1); return branch32(cond, ARMRegisters::S1, right); } - Jump branch32(Condition cond, BaseIndex left, Imm32 right) + Jump branch32(RelationalCondition cond, BaseIndex left, TrustedImm32 right) { load32(left, ARMRegisters::S1); return branch32(cond, ARMRegisters::S1, right); } - Jump branch32WithUnalignedHalfWords(Condition cond, BaseIndex left, Imm32 right) + Jump branch32WithUnalignedHalfWords(RelationalCondition cond, BaseIndex left, TrustedImm32 right) { load32WithUnalignedHalfWords(left, ARMRegisters::S1); return branch32(cond, ARMRegisters::S1, right); } - Jump branch16(Condition cond, BaseIndex left, RegisterID right) + Jump branch16(RelationalCondition cond, BaseIndex left, RegisterID right) { UNUSED_PARAM(cond); UNUSED_PARAM(left); @@ -447,7 +464,7 @@ public: return jump(); } - Jump branch16(Condition cond, BaseIndex left, Imm32 right) + Jump branch16(RelationalCondition cond, BaseIndex left, TrustedImm32 right) { load16(left, ARMRegisters::S0); move(right, ARMRegisters::S1); @@ -455,20 +472,20 @@ public: return m_assembler.jmp(ARMCondition(cond)); } - Jump branchTest8(Condition cond, Address address, Imm32 mask = Imm32(-1)) + Jump branchTest8(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1)) { load8(address, ARMRegisters::S1); return branchTest32(cond, ARMRegisters::S1, mask); } - Jump branchTest32(Condition cond, RegisterID reg, RegisterID mask) + Jump branchTest32(ResultCondition 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)) + Jump branchTest32(ResultCondition cond, RegisterID reg, TrustedImm32 mask = TrustedImm32(-1)) { ASSERT((cond == Zero) || (cond == NonZero)); ARMWord w = m_assembler.getImm(mask.m_value, ARMRegisters::S0, true); @@ -479,13 +496,13 @@ public: return Jump(m_assembler.jmp(ARMCondition(cond))); } - Jump branchTest32(Condition cond, Address address, Imm32 mask = Imm32(-1)) + Jump branchTest32(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1)) { load32(address, ARMRegisters::S1); return branchTest32(cond, ARMRegisters::S1, mask); } - Jump branchTest32(Condition cond, BaseIndex address, Imm32 mask = Imm32(-1)) + Jump branchTest32(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1)) { load32(address, ARMRegisters::S1); return branchTest32(cond, ARMRegisters::S1, mask); @@ -506,14 +523,14 @@ public: load32(address, ARMRegisters::pc); } - Jump branchAdd32(Condition cond, RegisterID src, RegisterID dest) + Jump branchAdd32(ResultCondition 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) + Jump branchAdd32(ResultCondition cond, TrustedImm32 imm, RegisterID dest) { ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); add32(imm, dest); @@ -530,7 +547,7 @@ public: m_assembler.cmp_r(ARMRegisters::S1, m_assembler.asr(dest, 31)); } - Jump branchMul32(Condition cond, RegisterID src, RegisterID dest) + Jump branchMul32(ResultCondition cond, RegisterID src, RegisterID dest) { ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); if (cond == Overflow) { @@ -542,7 +559,7 @@ public: return Jump(m_assembler.jmp(ARMCondition(cond))); } - Jump branchMul32(Condition cond, Imm32 imm, RegisterID src, RegisterID dest) + Jump branchMul32(ResultCondition cond, TrustedImm32 imm, RegisterID src, RegisterID dest) { ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); if (cond == Overflow) { @@ -555,28 +572,28 @@ public: return Jump(m_assembler.jmp(ARMCondition(cond))); } - Jump branchSub32(Condition cond, RegisterID src, RegisterID dest) + Jump branchSub32(ResultCondition 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) + Jump branchSub32(ResultCondition cond, TrustedImm32 imm, RegisterID dest) { ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); sub32(imm, dest); return Jump(m_assembler.jmp(ARMCondition(cond))); } - Jump branchNeg32(Condition cond, RegisterID srcDest) + Jump branchNeg32(ResultCondition cond, RegisterID srcDest) { ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); neg32(srcDest); return Jump(m_assembler.jmp(ARMCondition(cond))); } - Jump branchOr32(Condition cond, RegisterID src, RegisterID dest) + Jump branchOr32(ResultCondition cond, RegisterID src, RegisterID dest) { ASSERT((cond == Signed) || (cond == Zero) || (cond == NonZero)); or32(src, dest); @@ -602,9 +619,7 @@ public: Call call(RegisterID target) { - m_assembler.blx(target); - JmpSrc jmpSrc; - return Call(jmpSrc, Call::None); + return Call(m_assembler.blx(target), Call::None); } void call(Address address) @@ -617,62 +632,48 @@ public: m_assembler.bx(linkRegister); } - void set32(Condition cond, RegisterID left, RegisterID right, RegisterID dest) + void compare32(RelationalCondition 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) + void compare32(RelationalCondition cond, RegisterID left, TrustedImm32 right, RegisterID dest) { m_assembler.cmp_r(left, m_assembler.getImm(right.m_value, ARMRegisters::S0)); m_assembler.mov_r(dest, ARMAssembler::getOp2(0)); m_assembler.mov_r(dest, ARMAssembler::getOp2(1), ARMCondition(cond)); } - void set8(Condition cond, RegisterID left, RegisterID right, RegisterID dest) - { - // ARM doesn't have byte registers - set32(cond, left, right, dest); - } - - void set8(Condition cond, Address left, RegisterID right, RegisterID dest) - { - // ARM doesn't have byte registers - load32(left, ARMRegisters::S1); - set32(cond, ARMRegisters::S1, right, dest); - } - - void set8(Condition cond, RegisterID left, Imm32 right, RegisterID dest) + void test32(ResultCondition cond, RegisterID reg, TrustedImm32 mask, RegisterID dest) { - // ARM doesn't have byte registers - set32(cond, left, right, dest); - } - - void setTest32(Condition cond, Address address, Imm32 mask, RegisterID dest) - { - load32(address, ARMRegisters::S1); if (mask.m_value == -1) - m_assembler.cmp_r(0, ARMRegisters::S1); + m_assembler.cmp_r(0, reg); else - m_assembler.tst_r(ARMRegisters::S1, m_assembler.getImm(mask.m_value, ARMRegisters::S0)); + m_assembler.tst_r(reg, m_assembler.getImm(mask.m_value, ARMRegisters::S0)); m_assembler.mov_r(dest, ARMAssembler::getOp2(0)); m_assembler.mov_r(dest, ARMAssembler::getOp2(1), ARMCondition(cond)); } - void setTest8(Condition cond, Address address, Imm32 mask, RegisterID dest) + void test32(ResultCondition cond, Address address, TrustedImm32 mask, RegisterID dest) + { + load32(address, ARMRegisters::S1); + test32(cond, ARMRegisters::S1, mask, dest); + } + + void test8(ResultCondition cond, Address address, TrustedImm32 mask, RegisterID dest) { - // ARM doesn't have byte registers - setTest32(cond, address, mask, dest); + load8(address, ARMRegisters::S1); + test32(cond, ARMRegisters::S1, mask, dest); } - void add32(Imm32 imm, RegisterID src, RegisterID dest) + void add32(TrustedImm32 imm, RegisterID src, RegisterID dest) { m_assembler.add_r(dest, src, m_assembler.getImm(imm.m_value, ARMRegisters::S0)); } - void add32(Imm32 imm, AbsoluteAddress address) + void add32(TrustedImm32 imm, AbsoluteAddress address) { m_assembler.ldr_un_imm(ARMRegisters::S1, reinterpret_cast(address.m_ptr)); m_assembler.dtr_u(true, ARMRegisters::S1, ARMRegisters::S1, 0); @@ -681,7 +682,7 @@ public: m_assembler.dtr_u(false, ARMRegisters::S1, ARMRegisters::S0, 0); } - void sub32(Imm32 imm, AbsoluteAddress address) + void sub32(TrustedImm32 imm, AbsoluteAddress address) { m_assembler.ldr_un_imm(ARMRegisters::S1, reinterpret_cast(address.m_ptr)); m_assembler.dtr_u(true, ARMRegisters::S1, ARMRegisters::S1, 0); @@ -690,24 +691,33 @@ public: m_assembler.dtr_u(false, ARMRegisters::S1, ARMRegisters::S0, 0); } - void load32(void* address, RegisterID dest) + void load32(const void* address, RegisterID dest) { m_assembler.ldr_un_imm(ARMRegisters::S0, reinterpret_cast(address)); m_assembler.dtr_u(true, dest, ARMRegisters::S0, 0); } - Jump branch32(Condition cond, AbsoluteAddress left, RegisterID right) + Jump branch32(RelationalCondition cond, AbsoluteAddress left, RegisterID right) { load32(left.m_ptr, ARMRegisters::S1); return branch32(cond, ARMRegisters::S1, right); } - Jump branch32(Condition cond, AbsoluteAddress left, Imm32 right) + Jump branch32(RelationalCondition cond, AbsoluteAddress left, TrustedImm32 right) { load32(left.m_ptr, ARMRegisters::S1); return branch32(cond, ARMRegisters::S1, right); } + void relativeTableJump(RegisterID index, int scale) + { + ASSERT(scale >= 0 && scale <= 31); + m_assembler.add_r(ARMRegisters::pc, ARMRegisters::pc, m_assembler.lsl(index, scale)); + + // NOP the default prefetching + m_assembler.mov_r(ARMRegisters::r0, ARMRegisters::r0); + } + Call call() { #if WTF_ARM_ARCH_AT_LEAST(5) @@ -730,21 +740,21 @@ public: return Call::fromTailJump(oldJump); } - DataLabelPtr moveWithPatch(ImmPtr initialValue, RegisterID dest) + DataLabelPtr moveWithPatch(TrustedImmPtr initialValue, RegisterID dest) { DataLabelPtr dataLabel(this); m_assembler.ldr_un_imm(dest, reinterpret_cast(initialValue.m_value)); return dataLabel; } - Jump branchPtrWithPatch(Condition cond, RegisterID left, DataLabelPtr& dataLabel, ImmPtr initialRightValue = ImmPtr(0)) + Jump branchPtrWithPatch(RelationalCondition cond, RegisterID left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0)) { dataLabel = moveWithPatch(initialRightValue, ARMRegisters::S1); Jump jump = branch32(cond, left, ARMRegisters::S1, true); return jump; } - Jump branchPtrWithPatch(Condition cond, Address left, DataLabelPtr& dataLabel, ImmPtr initialRightValue = ImmPtr(0)) + Jump branchPtrWithPatch(RelationalCondition cond, Address left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0)) { load32(left, ARMRegisters::S1); dataLabel = moveWithPatch(initialRightValue, ARMRegisters::S0); @@ -752,7 +762,7 @@ public: return jump; } - DataLabelPtr storePtrWithPatch(ImmPtr initialValue, ImplicitAddress address) + DataLabelPtr storePtrWithPatch(TrustedImmPtr initialValue, ImplicitAddress address) { DataLabelPtr dataLabel = moveWithPatch(initialValue, ARMRegisters::S1); store32(ARMRegisters::S1, address); @@ -761,7 +771,7 @@ public: DataLabelPtr storePtrWithPatch(ImplicitAddress address) { - return storePtrWithPatch(ImmPtr(0), address); + return storePtrWithPatch(TrustedImmPtr(0), address); } // Floating point operators @@ -772,7 +782,7 @@ public: bool supportsFloatingPointTruncate() const { - return false; + return s_isVFPPresent; } bool supportsFloatingPointSqrt() const @@ -798,7 +808,7 @@ public: void addDouble(FPRegisterID src, FPRegisterID dest) { - m_assembler.faddd_r(dest, dest, src); + m_assembler.vadd_f64_r(dest, dest, src); } void addDouble(Address src, FPRegisterID dest) @@ -809,7 +819,7 @@ public: void divDouble(FPRegisterID src, FPRegisterID dest) { - m_assembler.fdivd_r(dest, dest, src); + m_assembler.vdiv_f64_r(dest, dest, src); } void divDouble(Address src, FPRegisterID dest) @@ -821,7 +831,7 @@ public: void subDouble(FPRegisterID src, FPRegisterID dest) { - m_assembler.fsubd_r(dest, dest, src); + m_assembler.vsub_f64_r(dest, dest, src); } void subDouble(Address src, FPRegisterID dest) @@ -832,7 +842,7 @@ public: void mulDouble(FPRegisterID src, FPRegisterID dest) { - m_assembler.fmuld_r(dest, dest, src); + m_assembler.vmul_f64_r(dest, dest, src); } void mulDouble(Address src, FPRegisterID dest) @@ -843,13 +853,13 @@ public: void sqrtDouble(FPRegisterID src, FPRegisterID dest) { - m_assembler.fsqrtd_r(dest, src); + m_assembler.vsqrt_f64_r(dest, src); } void convertInt32ToDouble(RegisterID src, FPRegisterID dest) { - m_assembler.fmsr_r(dest, src); - m_assembler.fsitod_r(dest, dest); + m_assembler.vmov_vfp_r(dest << 1, src); + m_assembler.vcvt_f64_s32_r(dest, dest << 1); } void convertInt32ToDouble(Address src, FPRegisterID dest) @@ -871,8 +881,8 @@ public: Jump branchDouble(DoubleCondition cond, FPRegisterID left, FPRegisterID right) { - m_assembler.fcmpd_r(left, right); - m_assembler.fmstat(); + m_assembler.vcmp_f64_r(left, right); + m_assembler.vmrs_apsr(); if (cond & DoubleConditionBitSpecial) m_assembler.cmp_r(ARMRegisters::S0, ARMRegisters::S0, ARMAssembler::VS); return Jump(m_assembler.jmp(static_cast(cond & ~DoubleConditionMask))); @@ -881,13 +891,17 @@ public: // 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). + // (specifically, in this case, INT_MIN and INT_MAX). Jump branchTruncateDoubleToInt32(FPRegisterID src, RegisterID dest) { - UNUSED_PARAM(src); - UNUSED_PARAM(dest); - ASSERT_NOT_REACHED(); - return jump(); + m_assembler.vcvtr_s32_f64_r(ARMRegisters::SD0 << 1, src); + // If VCVTR.S32.F64 can't fit the result into a 32-bit + // integer, it saturates at INT_MAX or INT_MIN. Testing this is + // probably quicker than testing FPSCR for exception. + m_assembler.vmov_arm_r(dest, ARMRegisters::SD0 << 1); + m_assembler.sub_r(ARMRegisters::S0, dest, ARMAssembler::getOp2(0x80000000)); + m_assembler.cmn_r(ARMRegisters::S0, ARMAssembler::getOp2(1), ARMCondition(NotEqual)); + return Jump(m_assembler.jmp(ARMCondition(Equal))); } // Convert 'src' to an integer, and places the resulting 'dest'. @@ -896,11 +910,11 @@ public: // (specifically, in this case, 0). void branchConvertDoubleToInt32(FPRegisterID src, RegisterID dest, JumpList& failureCases, FPRegisterID fpTemp) { - m_assembler.ftosid_r(ARMRegisters::SD0, src); - m_assembler.fmrs_r(dest, ARMRegisters::SD0); + m_assembler.vcvt_s32_f64_r(ARMRegisters::SD0 << 1, src); + m_assembler.vmov_arm_r(dest, ARMRegisters::SD0 << 1); // Convert the integer result back to float & compare to the original value - if not equal or unordered (NaN) then jump. - m_assembler.fsitod_r(ARMRegisters::SD0, ARMRegisters::SD0); + m_assembler.vcvt_f64_s32_r(ARMRegisters::SD0, ARMRegisters::SD0 << 1); failureCases.append(branchDouble(DoubleNotEqualOrUnordered, src, ARMRegisters::SD0)); // If the result is zero, it might have been -0.0, and 0.0 equals to -0.0 @@ -921,8 +935,18 @@ public: return branchDouble(DoubleEqualOrUnordered, reg, scratch); } + void nop() + { + m_assembler.nop(); + } + protected: - ARMAssembler::Condition ARMCondition(Condition cond) + ARMAssembler::Condition ARMCondition(RelationalCondition cond) + { + return static_cast(cond); + } + + ARMAssembler::Condition ARMCondition(ResultCondition cond) { return static_cast(cond); } @@ -967,9 +991,9 @@ protected: prepareCall(); m_assembler.dtr_u(true, targetReg, tmpReg, offset & 0xfff); } else { - ARMWord reg = m_assembler.getImm(offset, tmpReg); + m_assembler.moveImm(offset, tmpReg); prepareCall(); - m_assembler.dtr_ur(true, targetReg, base, reg); + m_assembler.dtr_ur(true, targetReg, base, tmpReg); } } else { offset = -offset; @@ -981,9 +1005,9 @@ protected: prepareCall(); m_assembler.dtr_d(true, targetReg, tmpReg, offset & 0xfff); } else { - ARMWord reg = m_assembler.getImm(offset, tmpReg); + m_assembler.moveImm(offset, tmpReg); prepareCall(); - m_assembler.dtr_dr(true, targetReg, base, reg); + m_assembler.dtr_dr(true, targetReg, base, tmpReg); } } #if WTF_ARM_ARCH_AT_LEAST(5) diff --git a/assembler/MacroAssemblerARMv7.h b/assembler/MacroAssemblerARMv7.h index e3e928d..70b2552 100644 --- a/assembler/MacroAssemblerARMv7.h +++ b/assembler/MacroAssemblerARMv7.h @@ -48,6 +48,9 @@ public: typedef ARMv7Assembler::LinkRecord LinkRecord; typedef ARMv7Assembler::JumpType JumpType; typedef ARMv7Assembler::JumpLinkType JumpLinkType; + // Magic number is the biggest useful offset we can get on ARMv7 with + // a LDR_imm_T2 encoding + static const int MaximumCompactPtrAlignedAddressOffset = 124; MacroAssemblerARMv7() : m_inUninterruptedSequence(false) @@ -100,7 +103,7 @@ public: static const Scale ScalePtr = TimesFour; - enum Condition { + enum RelationalCondition { Equal = ARMv7Assembler::ConditionEQ, NotEqual = ARMv7Assembler::ConditionNE, Above = ARMv7Assembler::ConditionHI, @@ -110,12 +113,16 @@ public: GreaterThan = ARMv7Assembler::ConditionGT, GreaterThanOrEqual = ARMv7Assembler::ConditionGE, LessThan = ARMv7Assembler::ConditionLT, - LessThanOrEqual = ARMv7Assembler::ConditionLE, + LessThanOrEqual = ARMv7Assembler::ConditionLE + }; + + enum ResultCondition { Overflow = ARMv7Assembler::ConditionVS, Signed = ARMv7Assembler::ConditionMI, Zero = ARMv7Assembler::ConditionEQ, NonZero = ARMv7Assembler::ConditionNE }; + enum DoubleCondition { // These conditions will only evaluate to true if the comparison is ordered - i.e. neither operand is NaN. DoubleEqual = ARMv7Assembler::ConditionEQ, @@ -139,7 +146,7 @@ public: // Integer arithmetic operations: // // Operations are typically two operand - operation(source, srcDst) - // For many operations the source may be an Imm32, the srcDst operand + // For many operations the source may be an TrustedImm32, the srcDst operand // may often be a memory location (explictly described using an Address // object). @@ -148,12 +155,12 @@ public: m_assembler.add(dest, dest, src); } - void add32(Imm32 imm, RegisterID dest) + void add32(TrustedImm32 imm, RegisterID dest) { add32(imm, dest, dest); } - void add32(Imm32 imm, RegisterID src, RegisterID dest) + void add32(TrustedImm32 imm, RegisterID src, RegisterID dest) { ARMThumbImmediate armImm = ARMThumbImmediate::makeUInt12OrEncodedImm(imm.m_value); if (armImm.isValid()) @@ -164,7 +171,7 @@ public: } } - void add32(Imm32 imm, Address address) + void add32(TrustedImm32 imm, Address address) { load32(address, dataTempRegister); @@ -187,7 +194,7 @@ public: add32(dataTempRegister, dest); } - void add32(Imm32 imm, AbsoluteAddress address) + void add32(TrustedImm32 imm, AbsoluteAddress address) { load32(address.m_ptr, dataTempRegister); @@ -209,7 +216,7 @@ public: m_assembler.ARM_and(dest, dest, src); } - void and32(Imm32 imm, RegisterID dest) + void and32(TrustedImm32 imm, RegisterID dest) { ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(imm.m_value); if (armImm.isValid()) @@ -220,6 +227,11 @@ public: } } + void countLeadingZeros32(RegisterID src, RegisterID dest) + { + m_assembler.clz(dest, src); + } + void lshift32(RegisterID shift_amount, RegisterID dest) { // Clamp the shift to the range 0..31 @@ -230,7 +242,7 @@ public: m_assembler.lsl(dest, dest, dataTempRegister); } - void lshift32(Imm32 imm, RegisterID dest) + void lshift32(TrustedImm32 imm, RegisterID dest) { m_assembler.lsl(dest, dest, imm.m_value & 0x1f); } @@ -240,7 +252,7 @@ public: m_assembler.smull(dest, dataTempRegister, dest, src); } - void mul32(Imm32 imm, RegisterID src, RegisterID dest) + void mul32(TrustedImm32 imm, RegisterID src, RegisterID dest) { move(imm, dataTempRegister); m_assembler.smull(dest, dataTempRegister, src, dataTempRegister); @@ -261,7 +273,7 @@ public: m_assembler.orr(dest, dest, src); } - void or32(Imm32 imm, RegisterID dest) + void or32(TrustedImm32 imm, RegisterID dest) { ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(imm.m_value); if (armImm.isValid()) @@ -282,7 +294,7 @@ public: m_assembler.asr(dest, dest, dataTempRegister); } - void rshift32(Imm32 imm, RegisterID dest) + void rshift32(TrustedImm32 imm, RegisterID dest) { m_assembler.asr(dest, dest, imm.m_value & 0x1f); } @@ -297,7 +309,7 @@ public: m_assembler.lsr(dest, dest, dataTempRegister); } - void urshift32(Imm32 imm, RegisterID dest) + void urshift32(TrustedImm32 imm, RegisterID dest) { m_assembler.lsr(dest, dest, imm.m_value & 0x1f); } @@ -307,7 +319,7 @@ public: m_assembler.sub(dest, dest, src); } - void sub32(Imm32 imm, RegisterID dest) + void sub32(TrustedImm32 imm, RegisterID dest) { ARMThumbImmediate armImm = ARMThumbImmediate::makeUInt12OrEncodedImm(imm.m_value); if (armImm.isValid()) @@ -318,7 +330,7 @@ public: } } - void sub32(Imm32 imm, Address address) + void sub32(TrustedImm32 imm, Address address) { load32(address, dataTempRegister); @@ -341,7 +353,7 @@ public: sub32(dataTempRegister, dest); } - void sub32(Imm32 imm, AbsoluteAddress address) + void sub32(TrustedImm32 imm, AbsoluteAddress address) { load32(address.m_ptr, dataTempRegister); @@ -363,7 +375,7 @@ public: m_assembler.eor(dest, dest, src); } - void xor32(Imm32 imm, RegisterID dest) + void xor32(TrustedImm32 imm, RegisterID dest) { ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(imm.m_value); if (armImm.isValid()) @@ -378,7 +390,7 @@ public: // Memory access operations: // // Loads are of the form load(address, destination) and stores of the form - // store(source, address). The source for a store may be an Imm32. Address + // store(source, address). The source for a store may be an TrustedImm32. Address // operand objects to loads and store will be implicitly constructed if a // register is passed. @@ -455,9 +467,9 @@ public: load32(setupArmAddress(address), dest); } - void load32(void* address, RegisterID dest) + void load32(const void* address, RegisterID dest) { - move(ImmPtr(address), addressTempRegister); + move(TrustedImmPtr(address), addressTempRegister); m_assembler.ldr(dest, addressTempRegister, ARMThumbImmediate::makeUInt16(0)); } @@ -468,16 +480,18 @@ public: DataLabel32 load32WithAddressOffsetPatch(Address address, RegisterID dest) { - DataLabel32 label = moveWithPatch(Imm32(address.offset), dataTempRegister); + DataLabel32 label = moveWithPatch(TrustedImm32(address.offset), dataTempRegister); load32(ArmAddress(address.base, dataTempRegister), dest); return label; } - - Label loadPtrWithPatchToLEA(Address address, RegisterID dest) + + DataLabelCompact load32WithCompactAddressOffsetPatch(Address address, RegisterID dest) { - Label label(this); - moveFixedWidthEncoding(Imm32(address.offset), dataTempRegister); - load32(ArmAddress(address.base, dataTempRegister), dest); + DataLabelCompact label(this); + ASSERT(address.offset >= 0); + ASSERT(address.offset <= MaximumCompactPtrAlignedAddressOffset); + ASSERT(ARMThumbImmediate::makeUInt12(address.offset).isUInt7()); + m_assembler.ldrCompact(dest, address.base, ARMThumbImmediate::makeUInt12(address.offset)); return label; } @@ -492,14 +506,14 @@ public: if (armImm.isValid()) m_assembler.ldrh(dest, address.base, armImm); else { - move(Imm32(address.offset), dataTempRegister); + move(TrustedImm32(address.offset), dataTempRegister); m_assembler.ldrh(dest, address.base, dataTempRegister); } } DataLabel32 store32WithAddressOffsetPatch(RegisterID src, Address address) { - DataLabel32 label = moveWithPatch(Imm32(address.offset), dataTempRegister); + DataLabel32 label = moveWithPatch(TrustedImm32(address.offset), dataTempRegister); store32(src, ArmAddress(address.base, dataTempRegister)); return label; } @@ -514,19 +528,19 @@ public: store32(src, setupArmAddress(address)); } - void store32(Imm32 imm, ImplicitAddress address) + void store32(TrustedImm32 imm, ImplicitAddress address) { move(imm, dataTempRegister); store32(dataTempRegister, setupArmAddress(address)); } - void store32(RegisterID src, void* address) + void store32(RegisterID src, const void* address) { - move(ImmPtr(address), addressTempRegister); + move(TrustedImmPtr(address), addressTempRegister); m_assembler.str(src, addressTempRegister, ARMThumbImmediate::makeUInt16(0)); } - void store32(Imm32 imm, void* address) + void store32(TrustedImm32 imm, const void* address) { move(imm, dataTempRegister); store32(dataTempRegister, address); @@ -561,7 +575,7 @@ public: // Arm vfp addresses can be offset by a 9-bit ones-comp immediate, left shifted by 2. if ((offset & 3) || (offset > (255 * 4)) || (offset < -(255 * 4))) { - add32(Imm32(offset), base, addressTempRegister); + add32(TrustedImm32(offset), base, addressTempRegister); base = addressTempRegister; offset = 0; } @@ -571,7 +585,7 @@ public: void loadDouble(const void* address, FPRegisterID dest) { - move(ImmPtr(address), addressTempRegister); + move(TrustedImmPtr(address), addressTempRegister); m_assembler.vldr(dest, addressTempRegister, 0); } @@ -582,7 +596,7 @@ public: // Arm vfp addresses can be offset by a 9-bit ones-comp immediate, left shifted by 2. if ((offset & 3) || (offset > (255 * 4)) || (offset < -(255 * 4))) { - add32(Imm32(offset), base, addressTempRegister); + add32(TrustedImm32(offset), base, addressTempRegister); base = addressTempRegister; offset = 0; } @@ -672,7 +686,7 @@ public: Jump notEqual = makeBranch(ARMv7Assembler::ConditionNE); unordered.link(this); // We get here if either unordered or equal. - Jump result = makeJump(); + Jump result = jump(); notEqual.link(this); return result; } @@ -720,7 +734,7 @@ public: Jump notEqual = makeBranch(ARMv7Assembler::ConditionNE); unordered.link(this); // We get here if either unordered or equal. - Jump result = makeJump(); + Jump result = jump(); notEqual.link(this); return result; } @@ -751,7 +765,7 @@ public: push(dataTempRegister); } - void push(Imm32 imm) + void push(TrustedImm32 imm) { move(imm, dataTempRegister); push(dataTempRegister); @@ -761,7 +775,7 @@ public: // // Move values in registers. - void move(Imm32 imm, RegisterID dest) + void move(TrustedImm32 imm, RegisterID dest) { uint32_t value = imm.m_value; @@ -787,9 +801,9 @@ public: m_assembler.mov(dest, src); } - void move(ImmPtr imm, RegisterID dest) + void move(TrustedImmPtr imm, RegisterID dest) { - move(Imm32(imm), dest); + move(TrustedImm32(imm), dest); } void swap(RegisterID reg1, RegisterID reg2) @@ -811,6 +825,10 @@ public: move(src, dest); } + void nop() + { + m_assembler.nop(); + } // Forwards / external control flow operations: // @@ -824,7 +842,7 @@ public: // used (representing the names 'below' and 'above'). // // Operands to the comparision are provided in the expected order, e.g. - // jle32(reg1, Imm32(5)) will branch if the value held in reg1, when + // jle32(reg1, TrustedImm32(5)) will branch if the value held in reg1, when // treated as a signed 32bit value, is less than or equal to 5. // // jz and jnz test whether the first operand is equal to zero, and take @@ -832,7 +850,7 @@ public: private: // Should we be using TEQ for equal/not-equal? - void compare32(RegisterID left, Imm32 right) + void compare32(RegisterID left, TrustedImm32 right) { int32_t imm = right.m_value; if (!imm) @@ -844,13 +862,13 @@ private: else if ((armImm = ARMThumbImmediate::makeEncodedImm(-imm)).isValid()) m_assembler.cmn(left, armImm); else { - move(Imm32(imm), dataTempRegister); + move(TrustedImm32(imm), dataTempRegister); m_assembler.cmp(left, dataTempRegister); } } } - void test32(RegisterID reg, Imm32 mask) + void test32(RegisterID reg, TrustedImm32 mask) { int32_t imm = mask.m_value; @@ -868,65 +886,65 @@ private: } public: - Jump branch32(Condition cond, RegisterID left, RegisterID right) + Jump branch32(RelationalCondition cond, RegisterID left, RegisterID right) { m_assembler.cmp(left, right); return Jump(makeBranch(cond)); } - Jump branch32(Condition cond, RegisterID left, Imm32 right) + Jump branch32(RelationalCondition cond, RegisterID left, TrustedImm32 right) { compare32(left, right); return Jump(makeBranch(cond)); } - Jump branch32(Condition cond, RegisterID left, Address right) + Jump branch32(RelationalCondition cond, RegisterID left, Address right) { load32(right, dataTempRegister); return branch32(cond, left, dataTempRegister); } - Jump branch32(Condition cond, Address left, RegisterID right) + Jump branch32(RelationalCondition cond, Address left, RegisterID right) { load32(left, dataTempRegister); return branch32(cond, dataTempRegister, right); } - Jump branch32(Condition cond, Address left, Imm32 right) + Jump branch32(RelationalCondition cond, Address left, TrustedImm32 right) { // use addressTempRegister incase the branch32 we call uses dataTempRegister. :-/ load32(left, addressTempRegister); return branch32(cond, addressTempRegister, right); } - Jump branch32(Condition cond, BaseIndex left, Imm32 right) + Jump branch32(RelationalCondition cond, BaseIndex left, TrustedImm32 right) { // use addressTempRegister incase the branch32 we call uses dataTempRegister. :-/ load32(left, addressTempRegister); return branch32(cond, addressTempRegister, right); } - Jump branch32WithUnalignedHalfWords(Condition cond, BaseIndex left, Imm32 right) + Jump branch32WithUnalignedHalfWords(RelationalCondition cond, BaseIndex left, TrustedImm32 right) { // use addressTempRegister incase the branch32 we call uses dataTempRegister. :-/ load32WithUnalignedHalfWords(left, addressTempRegister); return branch32(cond, addressTempRegister, right); } - Jump branch32(Condition cond, AbsoluteAddress left, RegisterID right) + Jump branch32(RelationalCondition cond, AbsoluteAddress left, RegisterID right) { load32(left.m_ptr, dataTempRegister); return branch32(cond, dataTempRegister, right); } - Jump branch32(Condition cond, AbsoluteAddress left, Imm32 right) + Jump branch32(RelationalCondition cond, AbsoluteAddress left, TrustedImm32 right) { // use addressTempRegister incase the branch32 we call uses dataTempRegister. :-/ load32(left.m_ptr, addressTempRegister); return branch32(cond, addressTempRegister, right); } - Jump branch16(Condition cond, BaseIndex left, RegisterID right) + Jump branch16(RelationalCondition cond, BaseIndex left, RegisterID right) { load16(left, dataTempRegister); m_assembler.lsl(addressTempRegister, right, 16); @@ -934,87 +952,76 @@ public: return branch32(cond, dataTempRegister, addressTempRegister); } - Jump branch16(Condition cond, BaseIndex left, Imm32 right) + Jump branch16(RelationalCondition cond, BaseIndex left, TrustedImm32 right) { // use addressTempRegister incase the branch32 we call uses dataTempRegister. :-/ load16(left, addressTempRegister); m_assembler.lsl(addressTempRegister, addressTempRegister, 16); - return branch32(cond, addressTempRegister, Imm32(right.m_value << 16)); + return branch32(cond, addressTempRegister, TrustedImm32(right.m_value << 16)); } - Jump branch8(Condition cond, RegisterID left, Imm32 right) + Jump branch8(RelationalCondition cond, RegisterID left, TrustedImm32 right) { compare32(left, right); return Jump(makeBranch(cond)); } - Jump branch8(Condition cond, Address left, Imm32 right) + Jump branch8(RelationalCondition cond, Address left, TrustedImm32 right) { // use addressTempRegister incase the branch8 we call uses dataTempRegister. :-/ load8(left, addressTempRegister); return branch8(cond, addressTempRegister, right); } - Jump branchTest32(Condition cond, RegisterID reg, RegisterID mask) + Jump branchTest32(ResultCondition cond, RegisterID reg, RegisterID mask) { - ASSERT((cond == Zero) || (cond == NonZero)); m_assembler.tst(reg, mask); return Jump(makeBranch(cond)); } - Jump branchTest32(Condition cond, RegisterID reg, Imm32 mask = Imm32(-1)) + Jump branchTest32(ResultCondition cond, RegisterID reg, TrustedImm32 mask = TrustedImm32(-1)) { - ASSERT((cond == Zero) || (cond == NonZero)); test32(reg, mask); return Jump(makeBranch(cond)); } - Jump branchTest32(Condition cond, Address address, Imm32 mask = Imm32(-1)) + Jump branchTest32(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1)) { - ASSERT((cond == Zero) || (cond == NonZero)); // use addressTempRegister incase the branchTest32 we call uses dataTempRegister. :-/ load32(address, addressTempRegister); return branchTest32(cond, addressTempRegister, mask); } - Jump branchTest32(Condition cond, BaseIndex address, Imm32 mask = Imm32(-1)) + Jump branchTest32(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1)) { - ASSERT((cond == Zero) || (cond == NonZero)); // use addressTempRegister incase the branchTest32 we call uses dataTempRegister. :-/ load32(address, addressTempRegister); return branchTest32(cond, addressTempRegister, mask); } - Jump branchTest8(Condition cond, RegisterID reg, Imm32 mask = Imm32(-1)) + Jump branchTest8(ResultCondition cond, RegisterID reg, TrustedImm32 mask = TrustedImm32(-1)) { - ASSERT((cond == Zero) || (cond == NonZero)); test32(reg, mask); return Jump(makeBranch(cond)); } - Jump branchTest8(Condition cond, Address address, Imm32 mask = Imm32(-1)) + Jump branchTest8(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1)) { - ASSERT((cond == Zero) || (cond == NonZero)); // use addressTempRegister incase the branchTest8 we call uses dataTempRegister. :-/ load8(address, addressTempRegister); return branchTest8(cond, addressTempRegister, mask); } - Jump jump() - { - return Jump(makeJump()); - } - void jump(RegisterID target) { - m_assembler.bx(target, ARMv7Assembler::JumpFixed); + m_assembler.bx(target); } // Address is a memory location containing the address to jump to void jump(Address address) { load32(address, dataTempRegister); - m_assembler.bx(dataTempRegister, ARMv7Assembler::JumpFixed); + m_assembler.bx(dataTempRegister); } @@ -1028,16 +1035,14 @@ public: // * jo operations branch if the (signed) arithmetic // operation caused an overflow to occur. - Jump branchAdd32(Condition cond, RegisterID src, RegisterID dest) + Jump branchAdd32(ResultCondition cond, RegisterID src, RegisterID dest) { - ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); m_assembler.add_S(dest, dest, src); return Jump(makeBranch(cond)); } - Jump branchAdd32(Condition cond, Imm32 imm, RegisterID dest) + Jump branchAdd32(ResultCondition cond, TrustedImm32 imm, RegisterID dest) { - ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(imm.m_value); if (armImm.isValid()) m_assembler.add_S(dest, dest, armImm); @@ -1048,40 +1053,43 @@ public: return Jump(makeBranch(cond)); } - Jump branchMul32(Condition cond, RegisterID src, RegisterID dest) + Jump branchMul32(ResultCondition cond, RegisterID src1, RegisterID src2, RegisterID dest) { - ASSERT_UNUSED(cond, cond == Overflow); - m_assembler.smull(dest, dataTempRegister, dest, src); - m_assembler.asr(addressTempRegister, dest, 31); - return branch32(NotEqual, addressTempRegister, dataTempRegister); + m_assembler.smull(dest, dataTempRegister, src1, src2); + + if (cond == Overflow) { + m_assembler.asr(addressTempRegister, dest, 31); + return branch32(NotEqual, addressTempRegister, dataTempRegister); + } + + return branchTest32(cond, dest); } - Jump branchMul32(Condition cond, Imm32 imm, RegisterID src, RegisterID dest) + Jump branchMul32(ResultCondition cond, RegisterID src, RegisterID dest) + { + return branchMul32(cond, src, dest, dest); + } + + Jump branchMul32(ResultCondition cond, TrustedImm32 imm, RegisterID src, RegisterID dest) { - ASSERT_UNUSED(cond, cond == Overflow); move(imm, dataTempRegister); - m_assembler.smull(dest, dataTempRegister, src, dataTempRegister); - m_assembler.asr(addressTempRegister, dest, 31); - return branch32(NotEqual, addressTempRegister, dataTempRegister); + return branchMul32(cond, dataTempRegister, src, dest); } - Jump branchOr32(Condition cond, RegisterID src, RegisterID dest) + Jump branchOr32(ResultCondition cond, RegisterID src, RegisterID dest) { - ASSERT((cond == Signed) || (cond == Zero) || (cond == NonZero)); m_assembler.orr_S(dest, dest, src); return Jump(makeBranch(cond)); } - Jump branchSub32(Condition cond, RegisterID src, RegisterID dest) + Jump branchSub32(ResultCondition cond, RegisterID src, RegisterID dest) { - ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); m_assembler.sub_S(dest, dest, src); return Jump(makeBranch(cond)); } - Jump branchSub32(Condition cond, Imm32 imm, RegisterID dest) + Jump branchSub32(ResultCondition cond, TrustedImm32 imm, RegisterID dest) { - ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); ARMThumbImmediate armImm = ARMThumbImmediate::makeEncodedImm(imm.m_value); if (armImm.isValid()) m_assembler.sub_S(dest, dest, armImm); @@ -1092,6 +1100,18 @@ public: return Jump(makeBranch(cond)); } + void relativeTableJump(RegisterID index, int scale) + { + ASSERT(scale >= 0 && scale <= 31); + + // dataTempRegister will point after the jump if index register contains zero + move(ARMRegisters::pc, dataTempRegister); + m_assembler.add(dataTempRegister, dataTempRegister, ARMThumbImmediate::makeEncodedImm(9)); + + ShiftTypeAndAmount shift(SRType_LSL, scale); + m_assembler.add(dataTempRegister, dataTempRegister, index, shift); + jump(dataTempRegister); + } // Miscellaneous operations: @@ -1100,35 +1120,35 @@ public: m_assembler.bkpt(0); } - Call nearCall() + ALWAYS_INLINE Call nearCall() { - moveFixedWidthEncoding(Imm32(0), dataTempRegister); - return Call(m_assembler.blx(dataTempRegister, ARMv7Assembler::JumpFixed), Call::LinkableNear); + moveFixedWidthEncoding(TrustedImm32(0), dataTempRegister); + return Call(m_assembler.blx(dataTempRegister), Call::LinkableNear); } - Call call() + ALWAYS_INLINE Call call() { - moveFixedWidthEncoding(Imm32(0), dataTempRegister); - return Call(m_assembler.blx(dataTempRegister, ARMv7Assembler::JumpFixed), Call::Linkable); + moveFixedWidthEncoding(TrustedImm32(0), dataTempRegister); + return Call(m_assembler.blx(dataTempRegister), Call::Linkable); } - Call call(RegisterID target) + ALWAYS_INLINE Call call(RegisterID target) { - return Call(m_assembler.blx(target, ARMv7Assembler::JumpFixed), Call::None); + return Call(m_assembler.blx(target), Call::None); } - Call call(Address address) + ALWAYS_INLINE Call call(Address address) { load32(address, dataTempRegister); - return Call(m_assembler.blx(dataTempRegister, ARMv7Assembler::JumpFixed), Call::None); + return Call(m_assembler.blx(dataTempRegister), Call::None); } - void ret() + ALWAYS_INLINE void ret() { - m_assembler.bx(linkRegister, ARMv7Assembler::JumpFixed); + m_assembler.bx(linkRegister); } - void set32(Condition cond, RegisterID left, RegisterID right, RegisterID dest) + void compare32(RelationalCondition cond, RegisterID left, RegisterID right, RegisterID dest) { m_assembler.cmp(left, right); m_assembler.it(armV7Condition(cond), false); @@ -1136,13 +1156,13 @@ public: m_assembler.mov(dest, ARMThumbImmediate::makeUInt16(0)); } - void set32(Condition cond, Address left, RegisterID right, RegisterID dest) + void compare32(RelationalCondition cond, Address left, RegisterID right, RegisterID dest) { load32(left, dataTempRegister); - set32(cond, dataTempRegister, right, dest); + compare32(cond, dataTempRegister, right, dest); } - void set32(Condition cond, RegisterID left, Imm32 right, RegisterID dest) + void compare32(RelationalCondition cond, RegisterID left, TrustedImm32 right, RegisterID dest) { compare32(left, right); m_assembler.it(armV7Condition(cond), false); @@ -1150,26 +1170,11 @@ public: m_assembler.mov(dest, ARMThumbImmediate::makeUInt16(0)); } - void set8(Condition cond, RegisterID left, RegisterID right, RegisterID dest) - { - set32(cond, left, right, dest); - } - - void set8(Condition cond, Address left, RegisterID right, RegisterID dest) - { - set32(cond, left, right, dest); - } - - void set8(Condition cond, RegisterID left, Imm32 right, RegisterID dest) - { - set32(cond, left, right, dest); - } - // FIXME: // The mask should be optional... paerhaps the argument order should be // dest-src, operations always have a dest? ... possibly not true, considering // asm ops like test, or pseudo ops like pop(). - void setTest32(Condition cond, Address address, Imm32 mask, RegisterID dest) + void test32(ResultCondition cond, Address address, TrustedImm32 mask, RegisterID dest) { load32(address, dataTempRegister); test32(dataTempRegister, mask); @@ -1178,7 +1183,7 @@ public: m_assembler.mov(dest, ARMThumbImmediate::makeUInt16(0)); } - void setTest8(Condition cond, Address address, Imm32 mask, RegisterID dest) + void test8(ResultCondition cond, Address address, TrustedImm32 mask, RegisterID dest) { load8(address, dataTempRegister); test32(dataTempRegister, mask); @@ -1187,48 +1192,48 @@ public: m_assembler.mov(dest, ARMThumbImmediate::makeUInt16(0)); } - DataLabel32 moveWithPatch(Imm32 imm, RegisterID dst) + ALWAYS_INLINE DataLabel32 moveWithPatch(TrustedImm32 imm, RegisterID dst) { moveFixedWidthEncoding(imm, dst); return DataLabel32(this); } - DataLabelPtr moveWithPatch(ImmPtr imm, RegisterID dst) + ALWAYS_INLINE DataLabelPtr moveWithPatch(TrustedImmPtr imm, RegisterID dst) { - moveFixedWidthEncoding(Imm32(imm), dst); + moveFixedWidthEncoding(TrustedImm32(imm), dst); return DataLabelPtr(this); } - Jump branchPtrWithPatch(Condition cond, RegisterID left, DataLabelPtr& dataLabel, ImmPtr initialRightValue = ImmPtr(0)) + ALWAYS_INLINE Jump branchPtrWithPatch(RelationalCondition cond, RegisterID left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0)) { dataLabel = moveWithPatch(initialRightValue, dataTempRegister); return branch32(cond, left, dataTempRegister); } - Jump branchPtrWithPatch(Condition cond, Address left, DataLabelPtr& dataLabel, ImmPtr initialRightValue = ImmPtr(0)) + ALWAYS_INLINE Jump branchPtrWithPatch(RelationalCondition cond, Address left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0)) { load32(left, addressTempRegister); dataLabel = moveWithPatch(initialRightValue, dataTempRegister); return branch32(cond, addressTempRegister, dataTempRegister); } - DataLabelPtr storePtrWithPatch(ImmPtr initialValue, ImplicitAddress address) + ALWAYS_INLINE DataLabelPtr storePtrWithPatch(TrustedImmPtr initialValue, ImplicitAddress address) { DataLabelPtr label = moveWithPatch(initialValue, dataTempRegister); store32(dataTempRegister, address); return label; } - DataLabelPtr storePtrWithPatch(ImplicitAddress address) { return storePtrWithPatch(ImmPtr(0), address); } + ALWAYS_INLINE DataLabelPtr storePtrWithPatch(ImplicitAddress address) { return storePtrWithPatch(TrustedImmPtr(0), address); } - Call tailRecursiveCall() + ALWAYS_INLINE Call tailRecursiveCall() { // Like a normal call, but don't link. - moveFixedWidthEncoding(Imm32(0), dataTempRegister); - return Call(m_assembler.bx(dataTempRegister, ARMv7Assembler::JumpFixed), Call::Linkable); + moveFixedWidthEncoding(TrustedImm32(0), dataTempRegister); + return Call(m_assembler.bx(dataTempRegister), Call::Linkable); } - Call makeTailRecursiveCall(Jump oldJump) + ALWAYS_INLINE Call makeTailRecursiveCall(Jump oldJump) { oldJump.link(this); return tailRecursiveCall(); @@ -1246,20 +1251,21 @@ protected: return m_inUninterruptedSequence; } - ARMv7Assembler::JmpSrc makeJump() + ALWAYS_INLINE Jump jump() { - moveFixedWidthEncoding(Imm32(0), dataTempRegister); - return m_assembler.bx(dataTempRegister, inUninterruptedSequence() ? ARMv7Assembler::JumpNoConditionFixedSize : ARMv7Assembler::JumpNoCondition); + moveFixedWidthEncoding(TrustedImm32(0), dataTempRegister); + return Jump(m_assembler.bx(dataTempRegister), inUninterruptedSequence() ? ARMv7Assembler::JumpNoConditionFixedSize : ARMv7Assembler::JumpNoCondition); } - ARMv7Assembler::JmpSrc makeBranch(ARMv7Assembler::Condition cond) + ALWAYS_INLINE Jump makeBranch(ARMv7Assembler::Condition cond) { m_assembler.it(cond, true, true); - moveFixedWidthEncoding(Imm32(0), dataTempRegister); - return m_assembler.bx(dataTempRegister, inUninterruptedSequence() ? ARMv7Assembler::JumpConditionFixedSize : ARMv7Assembler::JumpCondition, cond); + moveFixedWidthEncoding(TrustedImm32(0), dataTempRegister); + return Jump(m_assembler.bx(dataTempRegister), inUninterruptedSequence() ? ARMv7Assembler::JumpConditionFixedSize : ARMv7Assembler::JumpCondition, cond); } - ARMv7Assembler::JmpSrc makeBranch(Condition cond) { return makeBranch(armV7Condition(cond)); } - ARMv7Assembler::JmpSrc makeBranch(DoubleCondition cond) { return makeBranch(armV7Condition(cond)); } + ALWAYS_INLINE Jump makeBranch(RelationalCondition cond) { return makeBranch(armV7Condition(cond)); } + ALWAYS_INLINE Jump makeBranch(ResultCondition cond) { return makeBranch(armV7Condition(cond)); } + ALWAYS_INLINE Jump makeBranch(DoubleCondition cond) { return makeBranch(armV7Condition(cond)); } ArmAddress setupArmAddress(BaseIndex address) { @@ -1268,7 +1274,7 @@ protected: if (imm.isValid()) m_assembler.add(addressTempRegister, address.base, imm); else { - move(Imm32(address.offset), addressTempRegister); + move(TrustedImm32(address.offset), addressTempRegister); m_assembler.add(addressTempRegister, addressTempRegister, address.base); } @@ -1282,7 +1288,7 @@ protected: if ((address.offset >= -0xff) && (address.offset <= 0xfff)) return ArmAddress(address.base, address.offset); - move(Imm32(address.offset), addressTempRegister); + move(TrustedImm32(address.offset), addressTempRegister); return ArmAddress(address.base, addressTempRegister); } @@ -1291,7 +1297,7 @@ protected: if ((address.offset >= -0xff) && (address.offset <= 0xfff)) return ArmAddress(address.base, address.offset); - move(Imm32(address.offset), addressTempRegister); + move(TrustedImm32(address.offset), addressTempRegister); return ArmAddress(address.base, addressTempRegister); } @@ -1304,21 +1310,26 @@ protected: if (imm.isValid()) m_assembler.add(addressTempRegister, address.base, imm); else { - move(Imm32(address.offset), addressTempRegister); + move(TrustedImm32(address.offset), addressTempRegister); m_assembler.add(addressTempRegister, addressTempRegister, address.base); } return addressTempRegister; } - void moveFixedWidthEncoding(Imm32 imm, RegisterID dst) + void moveFixedWidthEncoding(TrustedImm32 imm, RegisterID dst) { uint32_t value = imm.m_value; m_assembler.movT3(dst, ARMThumbImmediate::makeUInt16(value & 0xffff)); m_assembler.movt(dst, ARMThumbImmediate::makeUInt16(value >> 16)); } - ARMv7Assembler::Condition armV7Condition(Condition cond) + ARMv7Assembler::Condition armV7Condition(RelationalCondition cond) + { + return static_cast(cond); + } + + ARMv7Assembler::Condition armV7Condition(ResultCondition cond) { return static_cast(cond); } diff --git a/assembler/MacroAssemblerCodeRef.h b/assembler/MacroAssemblerCodeRef.h index 543b0fa..6d47cb9 100644 --- a/assembler/MacroAssemblerCodeRef.h +++ b/assembler/MacroAssemblerCodeRef.h @@ -65,15 +65,47 @@ public: { } + template + FunctionPtr(returnType(*value)()) + : m_value((void*)value) + { + ASSERT_VALID_CODE_POINTER(m_value); + } + + template + FunctionPtr(returnType(*value)(argType1)) + : m_value((void*)value) + { + ASSERT_VALID_CODE_POINTER(m_value); + } + + template + FunctionPtr(returnType(*value)(argType1, argType2)) + : m_value((void*)value) + { + ASSERT_VALID_CODE_POINTER(m_value); + } + + template + FunctionPtr(returnType(*value)(argType1, argType2, argType3)) + : m_value((void*)value) + { + ASSERT_VALID_CODE_POINTER(m_value); + } + + template + FunctionPtr(returnType(*value)(argType1, argType2, argType3, argType4)) + : m_value((void*)value) + { + ASSERT_VALID_CODE_POINTER(m_value); + } + template explicit FunctionPtr(FunctionType* value) -#if COMPILER(RVCT) - // RVTC compiler needs C-style cast as it fails with the following error - // Error: #694: reinterpret_cast cannot cast away const or other type qualifiers - : m_value((void*)(value)) -#else - : m_value(reinterpret_cast(value)) -#endif + // Using a C-ctyle cast here to avoid compiler error on RVTC: + // Error: #694: reinterpret_cast cannot cast away const or other type qualifiers + // (I guess on RVTC function pointers have a different constness to GCC/MSVC?) + : m_value((void*)value) { ASSERT_VALID_CODE_POINTER(m_value); } @@ -152,7 +184,7 @@ public: void* dataLocation() const { ASSERT_VALID_CODE_POINTER(m_value); return m_value; } #endif - bool operator!() + bool operator!() const { return !m_value; } diff --git a/assembler/MacroAssemblerMIPS.h b/assembler/MacroAssemblerMIPS.h index 9853c34..9cdfffc 100644 --- a/assembler/MacroAssemblerMIPS.h +++ b/assembler/MacroAssemblerMIPS.h @@ -29,13 +29,14 @@ #if ENABLE(ASSEMBLER) && CPU(MIPS) -#include "AbstractMacroAssembler.h" #include "MIPSAssembler.h" +#include "AbstractMacroAssembler.h" namespace JSC { class MacroAssemblerMIPS : public AbstractMacroAssembler { public: + typedef MIPSRegisters::FPRegisterID FPRegisterID; MacroAssemblerMIPS() : m_fixedWidth(false) @@ -56,7 +57,9 @@ public: // FP temp register static const FPRegisterID fpTempRegister = MIPSRegisters::f16; - enum Condition { + static const int MaximumCompactPtrAlignedAddressOffset = 0x7FFFFFFF; + + enum RelationalCondition { Equal, NotEqual, Above, @@ -66,7 +69,10 @@ public: GreaterThan, GreaterThanOrEqual, LessThan, - LessThanOrEqual, + LessThanOrEqual + }; + + enum ResultCondition { Overflow, Signed, Zero, @@ -94,7 +100,7 @@ public: // Integer arithmetic operations: // // Operations are typically two operand - operation(source, srcDst) - // For many operations the source may be an Imm32, the srcDst operand + // For many operations the source may be an TrustedImm32, the srcDst operand // may often be a memory location (explictly described using an Address // object). @@ -103,12 +109,12 @@ public: m_assembler.addu(dest, dest, src); } - void add32(Imm32 imm, RegisterID dest) + void add32(TrustedImm32 imm, RegisterID dest) { add32(imm, dest, dest); } - void add32(Imm32 imm, RegisterID src, RegisterID dest) + void add32(TrustedImm32 imm, RegisterID src, RegisterID dest) { if (!imm.m_isPointer && imm.m_value >= -32768 && imm.m_value <= 32767 && !m_fixedWidth) { @@ -126,7 +132,7 @@ public: } } - void add32(Imm32 imm, Address address) + void add32(TrustedImm32 imm, Address address) { if (address.offset >= -32768 && address.offset <= 32767 && !m_fixedWidth) { @@ -206,7 +212,7 @@ public: } } - void add32(Imm32 imm, AbsoluteAddress address) + void add32(TrustedImm32 imm, AbsoluteAddress address) { /* li addrTemp, address @@ -215,7 +221,7 @@ public: addu dataTemp, dataTemp, immTemp sw dataTemp, 0(addrTemp) */ - move(ImmPtr(address.m_ptr), addrTempRegister); + move(TrustedImmPtr(address.m_ptr), addrTempRegister); m_assembler.lw(dataTempRegister, addrTempRegister, 0); if (!imm.m_isPointer && imm.m_value >= -32768 && imm.m_value <= 32767 && !m_fixedWidth) @@ -232,7 +238,7 @@ public: m_assembler.andInsn(dest, dest, src); } - void and32(Imm32 imm, RegisterID dest) + void and32(TrustedImm32 imm, RegisterID dest) { if (!imm.m_isPointer && !imm.m_value && !m_fixedWidth) move(MIPSRegisters::zero, dest); @@ -249,7 +255,7 @@ public: } } - void lshift32(Imm32 imm, RegisterID dest) + void lshift32(TrustedImm32 imm, RegisterID dest) { m_assembler.sll(dest, dest, imm.m_value); } @@ -264,7 +270,7 @@ public: m_assembler.mul(dest, dest, src); } - void mul32(Imm32 imm, RegisterID src, RegisterID dest) + void mul32(TrustedImm32 imm, RegisterID src, RegisterID dest) { if (!imm.m_isPointer && !imm.m_value && !m_fixedWidth) move(MIPSRegisters::zero, dest); @@ -280,6 +286,11 @@ public: } } + void neg32(RegisterID srcDest) + { + m_assembler.subu(srcDest, MIPSRegisters::zero, srcDest); + } + void not32(RegisterID srcDest) { m_assembler.nor(srcDest, srcDest, MIPSRegisters::zero); @@ -290,7 +301,7 @@ public: m_assembler.orInsn(dest, dest, src); } - void or32(Imm32 imm, RegisterID dest) + void or32(TrustedImm32 imm, RegisterID dest) { if (!imm.m_isPointer && !imm.m_value && !m_fixedWidth) return; @@ -314,17 +325,27 @@ public: m_assembler.srav(dest, dest, shiftAmount); } - void rshift32(Imm32 imm, RegisterID dest) + void rshift32(TrustedImm32 imm, RegisterID dest) { m_assembler.sra(dest, dest, imm.m_value); } + void urshift32(RegisterID shiftAmount, RegisterID dest) + { + m_assembler.srlv(dest, dest, shiftAmount); + } + + void urshift32(TrustedImm32 imm, RegisterID dest) + { + m_assembler.srl(dest, dest, imm.m_value); + } + void sub32(RegisterID src, RegisterID dest) { m_assembler.subu(dest, dest, src); } - void sub32(Imm32 imm, RegisterID dest) + void sub32(TrustedImm32 imm, RegisterID dest) { if (!imm.m_isPointer && imm.m_value >= -32767 && imm.m_value <= 32768 && !m_fixedWidth) { @@ -342,7 +363,7 @@ public: } } - void sub32(Imm32 imm, Address address) + void sub32(TrustedImm32 imm, Address address) { if (address.offset >= -32768 && address.offset <= 32767 && !m_fixedWidth) { @@ -397,7 +418,7 @@ public: sub32(dataTempRegister, dest); } - void sub32(Imm32 imm, AbsoluteAddress address) + void sub32(TrustedImm32 imm, AbsoluteAddress address) { /* li addrTemp, address @@ -406,7 +427,7 @@ public: subu dataTemp, dataTemp, immTemp sw dataTemp, 0(addrTemp) */ - move(ImmPtr(address.m_ptr), addrTempRegister); + move(TrustedImmPtr(address.m_ptr), addrTempRegister); m_assembler.lw(dataTempRegister, addrTempRegister, 0); if (!imm.m_isPointer && imm.m_value >= -32767 && imm.m_value <= 32768 @@ -425,7 +446,7 @@ public: m_assembler.xorInsn(dest, dest, src); } - void xor32(Imm32 imm, RegisterID dest) + void xor32(TrustedImm32 imm, RegisterID dest) { /* li immTemp, imm @@ -435,10 +456,15 @@ public: m_assembler.xorInsn(dest, dest, immTempRegister); } + void sqrtDouble(FPRegisterID src, FPRegisterID dst) + { + m_assembler.sqrtd(dst, src); + } + // Memory access operations: // // Loads are of the form load(address, destination) and stores of the form - // store(source, address). The source for a store may be an Imm32. Address + // store(source, address). The source for a store may be an TrustedImm32. Address // operand objects to loads and store will be implicitly constructed if a // register is passed. @@ -560,13 +586,13 @@ public: } } - void load32(void* address, RegisterID dest) + void load32(const void* address, RegisterID dest) { /* li addrTemp, address lw dest, 0(addrTemp) */ - move(ImmPtr(address), addrTempRegister); + move(TrustedImmPtr(address), addrTempRegister); m_assembler.lw(dest, addrTempRegister, 0); } @@ -580,33 +606,36 @@ public: lw dest, 0(addrTemp) */ DataLabel32 dataLabel(this); - move(Imm32(address.offset), addrTempRegister); + move(TrustedImm32(address.offset), addrTempRegister); m_assembler.addu(addrTempRegister, addrTempRegister, address.base); m_assembler.lw(dest, addrTempRegister, 0); m_fixedWidth = false; return dataLabel; } - - Label loadPtrWithPatchToLEA(Address address, RegisterID dest) + + DataLabelCompact load32WithCompactAddressOffsetPatch(Address address, RegisterID dest) { - m_fixedWidth = true; - /* - lui addrTemp, address.offset >> 16 - ori addrTemp, addrTemp, address.offset & 0xffff - addu addrTemp, addrTemp, address.base - lw dest, 0(addrTemp) - */ - Label label(this); - move(Imm32(address.offset), addrTempRegister); - m_assembler.addu(addrTempRegister, addrTempRegister, address.base); - m_assembler.lw(dest, addrTempRegister, 0); - m_fixedWidth = false; - return label; + DataLabelCompact dataLabel(this); + load32WithAddressOffsetPatch(address, dest); + return dataLabel; } - Label loadPtrWithAddressOffsetPatch(Address address, RegisterID dest) + /* Need to use zero-extened load half-word for load16. */ + void load16(ImplicitAddress address, RegisterID dest) { - return loadPtrWithPatchToLEA(address, dest); + if (address.offset >= -32768 && address.offset <= 32767 + && !m_fixedWidth) + m_assembler.lhu(dest, address.base, address.offset); + else { + /* + lui addrTemp, (offset + 0x8000) >> 16 + addu addrTemp, addrTemp, base + lhu dest, (offset & 0xffff)(addrTemp) + */ + m_assembler.lui(addrTempRegister, (address.offset + 0x8000) >> 16); + m_assembler.addu(addrTempRegister, addrTempRegister, address.base); + m_assembler.lhu(dest, addrTempRegister, address.offset); + } } /* Need to use zero-extened load half-word for load16. */ @@ -649,7 +678,7 @@ public: sw src, 0(addrTemp) */ DataLabel32 dataLabel(this); - move(Imm32(address.offset), addrTempRegister); + move(TrustedImm32(address.offset), addrTempRegister); m_assembler.addu(addrTempRegister, addrTempRegister, address.base); m_assembler.sw(src, addrTempRegister, 0); m_fixedWidth = false; @@ -702,7 +731,7 @@ public: } } - void store32(Imm32 imm, ImplicitAddress address) + void store32(TrustedImm32 imm, ImplicitAddress address) { if (address.offset >= -32768 && address.offset <= 32767 && !m_fixedWidth) { @@ -732,17 +761,17 @@ public: } } - void store32(RegisterID src, void* address) + void store32(RegisterID src, const void* address) { /* li addrTemp, address sw src, 0(addrTemp) */ - move(ImmPtr(address), addrTempRegister); + move(TrustedImmPtr(address), addrTempRegister); m_assembler.sw(src, addrTempRegister, 0); } - void store32(Imm32 imm, void* address) + void store32(TrustedImm32 imm, const void* address) { /* li immTemp, imm @@ -750,11 +779,11 @@ public: sw src, 0(addrTemp) */ if (!imm.m_isPointer && !imm.m_value && !m_fixedWidth) { - move(ImmPtr(address), addrTempRegister); + move(TrustedImmPtr(address), addrTempRegister); m_assembler.sw(MIPSRegisters::zero, addrTempRegister, 0); } else { move(imm, immTempRegister); - move(ImmPtr(address), addrTempRegister); + move(TrustedImmPtr(address), addrTempRegister); m_assembler.sw(immTempRegister, addrTempRegister, 0); } } @@ -779,6 +808,15 @@ public: #endif } + bool supportsFloatingPointSqrt() const + { +#if WTF_MIPS_DOUBLE_FLOAT && WTF_MIPS_ISA_AT_LEAST(2) + return true; +#else + return false; +#endif + } + // Stack manipulation operations: // // The ABI is assumed to provide a stack abstraction to memory, @@ -805,7 +843,7 @@ public: push(dataTempRegister); } - void push(Imm32 imm) + void push(TrustedImm32 imm) { move(imm, immTempRegister); push(immTempRegister); @@ -815,7 +853,7 @@ public: // // Move values in registers. - void move(Imm32 imm, RegisterID dest) + void move(TrustedImm32 imm, RegisterID dest) { if (!imm.m_isPointer && !imm.m_value && !m_fixedWidth) move(MIPSRegisters::zero, dest); @@ -832,9 +870,9 @@ public: m_assembler.move(dest, src); } - void move(ImmPtr imm, RegisterID dest) + void move(TrustedImmPtr imm, RegisterID dest) { - move(Imm32(imm), dest); + move(TrustedImm32(imm), dest); } void swap(RegisterID reg1, RegisterID reg2) @@ -868,13 +906,13 @@ public: // used (representing the names 'below' and 'above'). // // Operands to the comparision are provided in the expected order, e.g. - // jle32(reg1, Imm32(5)) will branch if the value held in reg1, when + // jle32(reg1, TrustedImm32(5)) will branch if the value held in reg1, when // treated as a signed 32bit value, is less than or equal to 5. // // jz and jnz test whether the first operand is equal to zero, and take // an optional second operand of a mask under which to perform the test. - Jump branch8(Condition cond, Address left, Imm32 right) + Jump branch8(RelationalCondition cond, Address left, TrustedImm32 right) { // Make sure the immediate value is unsigned 8 bits. ASSERT(!(right.m_value & 0xFFFFFF00)); @@ -883,11 +921,11 @@ public: return branch32(cond, dataTempRegister, immTempRegister); } - Jump branch32(Condition cond, RegisterID left, RegisterID right) + Jump branch32(RelationalCondition cond, RegisterID left, RegisterID right) { - if (cond == Equal || cond == Zero) + if (cond == Equal) return branchEqual(left, right); - if (cond == NotEqual || cond == NonZero) + if (cond == NotEqual) return branchNotEqual(left, right); if (cond == Above) { m_assembler.sltu(cmpTempRegister, right, left); @@ -921,70 +959,37 @@ public: m_assembler.slt(cmpTempRegister, right, left); return branchEqual(cmpTempRegister, MIPSRegisters::zero); } - if (cond == Overflow) { - /* - xor cmpTemp, left, right - bgez No_overflow, cmpTemp # same sign bit -> no overflow - nop - subu cmpTemp, left, right - xor cmpTemp, cmpTemp, left - bgez No_overflow, cmpTemp # same sign bit -> no overflow - nop - b Overflow - nop - nop - nop - nop - nop - No_overflow: - */ - m_assembler.xorInsn(cmpTempRegister, left, right); - m_assembler.bgez(cmpTempRegister, 11); - m_assembler.nop(); - m_assembler.subu(cmpTempRegister, left, right); - m_assembler.xorInsn(cmpTempRegister, cmpTempRegister, left); - m_assembler.bgez(cmpTempRegister, 7); - m_assembler.nop(); - return jump(); - } - if (cond == Signed) { - m_assembler.subu(cmpTempRegister, left, right); - // Check if the result is negative. - m_assembler.slt(cmpTempRegister, cmpTempRegister, - MIPSRegisters::zero); - return branchNotEqual(cmpTempRegister, MIPSRegisters::zero); - } ASSERT(0); return Jump(); } - Jump branch32(Condition cond, RegisterID left, Imm32 right) + Jump branch32(RelationalCondition cond, RegisterID left, TrustedImm32 right) { move(right, immTempRegister); return branch32(cond, left, immTempRegister); } - Jump branch32(Condition cond, RegisterID left, Address right) + Jump branch32(RelationalCondition cond, RegisterID left, Address right) { load32(right, dataTempRegister); return branch32(cond, left, dataTempRegister); } - Jump branch32(Condition cond, Address left, RegisterID right) + Jump branch32(RelationalCondition cond, Address left, RegisterID right) { load32(left, dataTempRegister); return branch32(cond, dataTempRegister, right); } - Jump branch32(Condition cond, Address left, Imm32 right) + Jump branch32(RelationalCondition cond, Address left, TrustedImm32 right) { load32(left, dataTempRegister); move(right, immTempRegister); return branch32(cond, dataTempRegister, immTempRegister); } - Jump branch32(Condition cond, BaseIndex left, Imm32 right) + Jump branch32(RelationalCondition cond, BaseIndex left, TrustedImm32 right) { load32(left, dataTempRegister); // Be careful that the previous load32() uses immTempRegister. @@ -993,7 +998,7 @@ public: return branch32(cond, dataTempRegister, immTempRegister); } - Jump branch32WithUnalignedHalfWords(Condition cond, BaseIndex left, Imm32 right) + Jump branch32WithUnalignedHalfWords(RelationalCondition cond, BaseIndex left, TrustedImm32 right) { load32WithUnalignedHalfWords(left, dataTempRegister); // Be careful that the previous load32WithUnalignedHalfWords() @@ -1003,26 +1008,26 @@ public: return branch32(cond, dataTempRegister, immTempRegister); } - Jump branch32(Condition cond, AbsoluteAddress left, RegisterID right) + Jump branch32(RelationalCondition cond, AbsoluteAddress left, RegisterID right) { load32(left.m_ptr, dataTempRegister); return branch32(cond, dataTempRegister, right); } - Jump branch32(Condition cond, AbsoluteAddress left, Imm32 right) + Jump branch32(RelationalCondition cond, AbsoluteAddress left, TrustedImm32 right) { load32(left.m_ptr, dataTempRegister); move(right, immTempRegister); return branch32(cond, dataTempRegister, immTempRegister); } - Jump branch16(Condition cond, BaseIndex left, RegisterID right) + Jump branch16(RelationalCondition cond, BaseIndex left, RegisterID right) { load16(left, dataTempRegister); return branch32(cond, dataTempRegister, right); } - Jump branch16(Condition cond, BaseIndex left, Imm32 right) + Jump branch16(RelationalCondition cond, BaseIndex left, TrustedImm32 right) { ASSERT(!(right.m_value & 0xFFFF0000)); load16(left, dataTempRegister); @@ -1032,7 +1037,7 @@ public: return branch32(cond, dataTempRegister, immTempRegister); } - Jump branchTest32(Condition cond, RegisterID reg, RegisterID mask) + Jump branchTest32(ResultCondition cond, RegisterID reg, RegisterID mask) { ASSERT((cond == Zero) || (cond == NonZero)); m_assembler.andInsn(cmpTempRegister, reg, mask); @@ -1041,7 +1046,7 @@ public: return branchNotEqual(cmpTempRegister, MIPSRegisters::zero); } - Jump branchTest32(Condition cond, RegisterID reg, Imm32 mask = Imm32(-1)) + Jump branchTest32(ResultCondition cond, RegisterID reg, TrustedImm32 mask = TrustedImm32(-1)) { ASSERT((cond == Zero) || (cond == NonZero)); if (mask.m_value == -1 && !m_fixedWidth) { @@ -1053,19 +1058,19 @@ public: return branchTest32(cond, reg, immTempRegister); } - Jump branchTest32(Condition cond, Address address, Imm32 mask = Imm32(-1)) + Jump branchTest32(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1)) { load32(address, dataTempRegister); return branchTest32(cond, dataTempRegister, mask); } - Jump branchTest32(Condition cond, BaseIndex address, Imm32 mask = Imm32(-1)) + Jump branchTest32(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1)) { load32(address, dataTempRegister); return branchTest32(cond, dataTempRegister, mask); } - Jump branchTest8(Condition cond, Address address, Imm32 mask = Imm32(-1)) + Jump branchTest8(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1)) { load8(address, dataTempRegister); return branchTest32(cond, dataTempRegister, mask); @@ -1101,7 +1106,7 @@ public: // * jo operations branch if the (signed) arithmetic // operation caused an overflow to occur. - Jump branchAdd32(Condition cond, RegisterID src, RegisterID dest) + Jump branchAdd32(ResultCondition cond, RegisterID src, RegisterID dest) { ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); if (cond == Overflow) { @@ -1148,13 +1153,13 @@ public: return Jump(); } - Jump branchAdd32(Condition cond, Imm32 imm, RegisterID dest) + Jump branchAdd32(ResultCondition cond, TrustedImm32 imm, RegisterID dest) { move(imm, immTempRegister); return branchAdd32(cond, immTempRegister, dest); } - Jump branchMul32(Condition cond, RegisterID src, RegisterID dest) + Jump branchMul32(ResultCondition cond, RegisterID src, RegisterID dest) { ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); if (cond == Overflow) { @@ -1199,14 +1204,14 @@ public: return Jump(); } - Jump branchMul32(Condition cond, Imm32 imm, RegisterID src, RegisterID dest) + Jump branchMul32(ResultCondition cond, TrustedImm32 imm, RegisterID src, RegisterID dest) { move(imm, immTempRegister); move(src, dest); return branchMul32(cond, immTempRegister, dest); } - Jump branchSub32(Condition cond, RegisterID src, RegisterID dest) + Jump branchSub32(ResultCondition cond, RegisterID src, RegisterID dest) { ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); if (cond == Overflow) { @@ -1253,12 +1258,33 @@ public: return Jump(); } - Jump branchSub32(Condition cond, Imm32 imm, RegisterID dest) + Jump branchSub32(ResultCondition cond, TrustedImm32 imm, RegisterID dest) { move(imm, immTempRegister); return branchSub32(cond, immTempRegister, dest); } + Jump branchOr32(ResultCondition cond, RegisterID src, RegisterID dest) + { + ASSERT((cond == Signed) || (cond == Zero) || (cond == NonZero)); + if (cond == Signed) { + or32(src, dest); + // Check if dest is negative. + m_assembler.slt(cmpTempRegister, dest, MIPSRegisters::zero); + return branchNotEqual(cmpTempRegister, MIPSRegisters::zero); + } + if (cond == Zero) { + or32(src, dest); + return branchEqual(dest, MIPSRegisters::zero); + } + if (cond == NonZero) { + or32(src, dest); + return branchNotEqual(dest, MIPSRegisters::zero); + } + ASSERT(0); + return Jump(); + } + // Miscellaneous operations: void breakpoint() @@ -1273,7 +1299,7 @@ public: m_assembler.nop(); m_assembler.jal(); m_assembler.nop(); - return Call(m_assembler.newJmpSrc(), Call::LinkableNear); + return Call(m_assembler.label(), Call::LinkableNear); } Call call() @@ -1282,14 +1308,14 @@ public: m_assembler.ori(MIPSRegisters::t9, MIPSRegisters::t9, 0); m_assembler.jalr(MIPSRegisters::t9); m_assembler.nop(); - return Call(m_assembler.newJmpSrc(), Call::Linkable); + return Call(m_assembler.label(), Call::Linkable); } Call call(RegisterID target) { m_assembler.jalr(target); m_assembler.nop(); - return Call(m_assembler.newJmpSrc(), Call::None); + return Call(m_assembler.label(), Call::None); } Call call(Address address) @@ -1299,7 +1325,7 @@ public: m_assembler.jalr(MIPSRegisters::t9); m_assembler.nop(); m_fixedWidth = false; - return Call(m_assembler.newJmpSrc(), Call::None); + return Call(m_assembler.label(), Call::None); } void ret() @@ -1308,12 +1334,12 @@ public: m_assembler.nop(); } - void set32(Condition cond, RegisterID left, RegisterID right, RegisterID dest) + void compare32(RelationalCondition cond, RegisterID left, RegisterID right, RegisterID dest) { - if (cond == Equal || cond == Zero) { + if (cond == Equal) { m_assembler.xorInsn(dest, left, right); m_assembler.sltiu(dest, dest, 1); - } else if (cond == NotEqual || cond == NonZero) { + } else if (cond == NotEqual) { m_assembler.xorInsn(dest, left, right); m_assembler.sltu(dest, MIPSRegisters::zero, dest); } else if (cond == Above) @@ -1336,36 +1362,16 @@ public: else if (cond == LessThanOrEqual) { m_assembler.slt(dest, right, left); m_assembler.xori(dest, dest, 1); - } else if (cond == Overflow) { - /* - xor cmpTemp, left, right - bgez Done, cmpTemp # same sign bit -> no overflow - move dest, 0 - subu cmpTemp, left, right - xor cmpTemp, cmpTemp, left # diff sign bit -> overflow - slt dest, cmpTemp, 0 - Done: - */ - m_assembler.xorInsn(cmpTempRegister, left, right); - m_assembler.bgez(cmpTempRegister, 4); - m_assembler.move(dest, MIPSRegisters::zero); - m_assembler.subu(cmpTempRegister, left, right); - m_assembler.xorInsn(cmpTempRegister, cmpTempRegister, left); - m_assembler.slt(dest, cmpTempRegister, MIPSRegisters::zero); - } else if (cond == Signed) { - m_assembler.subu(dest, left, right); - // Check if the result is negative. - m_assembler.slt(dest, dest, MIPSRegisters::zero); } } - void set32(Condition cond, RegisterID left, Imm32 right, RegisterID dest) + void compare32(RelationalCondition cond, RegisterID left, TrustedImm32 right, RegisterID dest) { move(right, immTempRegister); - set32(cond, left, immTempRegister, dest); + compare32(cond, left, immTempRegister, dest); } - void setTest8(Condition cond, Address address, Imm32 mask, RegisterID dest) + void test8(ResultCondition cond, Address address, TrustedImm32 mask, RegisterID dest) { ASSERT((cond == Zero) || (cond == NonZero)); load8(address, dataTempRegister); @@ -1385,7 +1391,7 @@ public: } } - void setTest32(Condition cond, Address address, Imm32 mask, RegisterID dest) + void test32(ResultCondition cond, Address address, TrustedImm32 mask, RegisterID dest) { ASSERT((cond == Zero) || (cond == NonZero)); load32(address, dataTempRegister); @@ -1405,7 +1411,7 @@ public: } } - DataLabel32 moveWithPatch(Imm32 imm, RegisterID dest) + DataLabel32 moveWithPatch(TrustedImm32 imm, RegisterID dest) { m_fixedWidth = true; DataLabel32 label(this); @@ -1414,7 +1420,7 @@ public: return label; } - DataLabelPtr moveWithPatch(ImmPtr initialValue, RegisterID dest) + DataLabelPtr moveWithPatch(TrustedImmPtr initialValue, RegisterID dest) { m_fixedWidth = true; DataLabelPtr label(this); @@ -1423,7 +1429,7 @@ public: return label; } - Jump branchPtrWithPatch(Condition cond, RegisterID left, DataLabelPtr& dataLabel, ImmPtr initialRightValue = ImmPtr(0)) + Jump branchPtrWithPatch(RelationalCondition cond, RegisterID left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0)) { m_fixedWidth = true; dataLabel = moveWithPatch(initialRightValue, immTempRegister); @@ -1432,7 +1438,7 @@ public: return temp; } - Jump branchPtrWithPatch(Condition cond, Address left, DataLabelPtr& dataLabel, ImmPtr initialRightValue = ImmPtr(0)) + Jump branchPtrWithPatch(RelationalCondition cond, Address left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0)) { m_fixedWidth = true; load32(left, dataTempRegister); @@ -1442,7 +1448,7 @@ public: return temp; } - DataLabelPtr storePtrWithPatch(ImmPtr initialValue, ImplicitAddress address) + DataLabelPtr storePtrWithPatch(TrustedImmPtr initialValue, ImplicitAddress address) { m_fixedWidth = true; DataLabelPtr dataLabel = moveWithPatch(initialValue, dataTempRegister); @@ -1453,18 +1459,18 @@ public: DataLabelPtr storePtrWithPatch(ImplicitAddress address) { - return storePtrWithPatch(ImmPtr(0), address); + return storePtrWithPatch(TrustedImmPtr(0), address); } Call tailRecursiveCall() { // Like a normal call, but don't update the returned address register m_fixedWidth = true; - move(Imm32(0), MIPSRegisters::t9); + move(TrustedImm32(0), MIPSRegisters::t9); m_assembler.jr(MIPSRegisters::t9); m_assembler.nop(); m_fixedWidth = false; - return Call(m_assembler.newJmpSrc(), Call::Linkable); + return Call(m_assembler.label(), Call::Linkable); } Call makeTailRecursiveCall(Jump oldJump) @@ -1482,7 +1488,7 @@ public: lwc1 dest, 0(addrTemp) lwc1 dest+1, 4(addrTemp) */ - move(Imm32(address.offset), addrTempRegister); + move(TrustedImm32(address.offset), addrTempRegister); m_assembler.addu(addrTempRegister, addrTempRegister, address.base); m_assembler.lwc1(dest, addrTempRegister, 0); m_assembler.lwc1(FPRegisterID(dest + 1), addrTempRegister, 4); @@ -1503,6 +1509,28 @@ public: #endif } + void loadDouble(const void* address, FPRegisterID dest) + { +#if WTF_MIPS_ISA(1) + /* + li addrTemp, address + lwc1 dest, 0(addrTemp) + lwc1 dest+1, 4(addrTemp) + */ + move(TrustedImmPtr(address), addrTempRegister); + m_assembler.lwc1(dest, addrTempRegister, 0); + m_assembler.lwc1(FPRegisterID(dest + 1), addrTempRegister, 4); +#else + /* + li addrTemp, address + ldc1 dest, 0(addrTemp) + */ + move(TrustedImmPtr(address), addrTempRegister); + m_assembler.ldc1(dest, addrTempRegister, 0); +#endif + } + + void storeDouble(FPRegisterID src, ImplicitAddress address) { #if WTF_MIPS_ISA(1) @@ -1512,7 +1540,7 @@ public: swc1 dest, 0(addrTemp) swc1 dest+1, 4(addrTemp) */ - move(Imm32(address.offset), addrTempRegister); + move(TrustedImm32(address.offset), addrTempRegister); m_assembler.addu(addrTempRegister, addrTempRegister, address.base); m_assembler.swc1(src, addrTempRegister, 0); m_assembler.swc1(FPRegisterID(src + 1), addrTempRegister, 4); @@ -1566,12 +1594,31 @@ public: m_assembler.muld(dest, dest, fpTempRegister); } + void divDouble(FPRegisterID src, FPRegisterID dest) + { + m_assembler.divd(dest, dest, src); + } + void convertInt32ToDouble(RegisterID src, FPRegisterID dest) { m_assembler.mtc1(src, fpTempRegister); m_assembler.cvtdw(dest, fpTempRegister); } + void convertInt32ToDouble(Address src, FPRegisterID dest) + { + load32(src, dataTempRegister); + m_assembler.mtc1(dataTempRegister, fpTempRegister); + m_assembler.cvtdw(dest, fpTempRegister); + } + + void convertInt32ToDouble(AbsoluteAddress src, FPRegisterID dest) + { + load32(src.m_ptr, dataTempRegister); + m_assembler.mtc1(dataTempRegister, fpTempRegister); + m_assembler.cvtdw(dest, fpTempRegister); + } + void insertRelaxationWords() { /* We need four words for relaxation. */ @@ -1587,7 +1634,7 @@ public: m_assembler.bc1t(); m_assembler.nop(); insertRelaxationWords(); - return Jump(m_assembler.newJmpSrc()); + return Jump(m_assembler.label()); } Jump branchFalse() @@ -1596,7 +1643,7 @@ public: m_assembler.bc1f(); m_assembler.nop(); insertRelaxationWords(); - return Jump(m_assembler.newJmpSrc()); + return Jump(m_assembler.label()); } Jump branchEqual(RegisterID rs, RegisterID rt) @@ -1605,7 +1652,7 @@ public: m_assembler.beq(rs, rt, 0); m_assembler.nop(); insertRelaxationWords(); - return Jump(m_assembler.newJmpSrc()); + return Jump(m_assembler.label()); } Jump branchNotEqual(RegisterID rs, RegisterID rt) @@ -1614,7 +1661,7 @@ public: m_assembler.bne(rs, rt, 0); m_assembler.nop(); insertRelaxationWords(); - return Jump(m_assembler.newJmpSrc()); + return Jump(m_assembler.label()); } Jump branchDouble(DoubleCondition cond, FPRegisterID left, FPRegisterID right) @@ -1624,7 +1671,7 @@ public: return branchTrue(); } if (cond == DoubleNotEqual) { - m_assembler.ceqd(left, right); + m_assembler.cueqd(left, right); return branchFalse(); // false } if (cond == DoubleGreaterThan) { @@ -1632,7 +1679,7 @@ public: return branchFalse(); // false } if (cond == DoubleGreaterThanOrEqual) { - m_assembler.cnged(right, left); + m_assembler.cnged(left, right); return branchFalse(); // false } if (cond == DoubleLessThan) { @@ -1647,6 +1694,10 @@ public: m_assembler.cueqd(left, right); return branchTrue(); } + if (cond == DoubleNotEqualOrUnordered) { + m_assembler.ceqd(left, right); + return branchFalse(); // false + } if (cond == DoubleGreaterThanOrUnordered) { m_assembler.coled(left, right); return branchFalse(); // false @@ -1676,7 +1727,53 @@ public: { m_assembler.truncwd(fpTempRegister, src); m_assembler.mfc1(dest, fpTempRegister); - return branch32(Equal, dest, Imm32(0x7fffffff)); + return branch32(Equal, dest, TrustedImm32(0x7fffffff)); + } + + // Convert '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, 0). + void branchConvertDoubleToInt32(FPRegisterID src, RegisterID dest, JumpList& failureCases, FPRegisterID fpTemp) + { + m_assembler.cvtwd(fpTempRegister, src); + m_assembler.mfc1(dest, fpTempRegister); + + // If the result is zero, it might have been -0.0, and the double comparison won't catch this! + failureCases.append(branch32(Equal, dest, MIPSRegisters::zero)); + + // Convert the integer result back to float & compare to the original value - if not equal or unordered (NaN) then jump. + convertInt32ToDouble(dest, fpTemp); + failureCases.append(branchDouble(DoubleNotEqualOrUnordered, fpTemp, src)); + } + + Jump branchDoubleNonZero(FPRegisterID reg, FPRegisterID scratch) + { +#if WTF_MIPS_ISA_REV(2) && WTF_MIPS_FP64 + m_assembler.mtc1(MIPSRegisters::zero, scratch); + m_assembler.mthc1(MIPSRegisters::zero, scratch); +#else + m_assembler.mtc1(MIPSRegisters::zero, scratch); + m_assembler.mtc1(MIPSRegisters::zero, FPRegisterID(scratch + 1)); +#endif + return branchDouble(DoubleNotEqual, reg, scratch); + } + + Jump branchDoubleZeroOrNaN(FPRegisterID reg, FPRegisterID scratch) + { +#if WTF_MIPS_ISA_REV(2) && WTF_MIPS_FP64 + m_assembler.mtc1(MIPSRegisters::zero, scratch); + m_assembler.mthc1(MIPSRegisters::zero, scratch); +#else + m_assembler.mtc1(MIPSRegisters::zero, scratch); + m_assembler.mtc1(MIPSRegisters::zero, FPRegisterID(scratch + 1)); +#endif + return branchDouble(DoubleEqualOrUnordered, reg, scratch); + } + + void nop() + { + m_assembler.nop(); } private: diff --git a/assembler/MacroAssemblerSH4.cpp b/assembler/MacroAssemblerSH4.cpp new file mode 100644 index 0000000..ee11f55 --- /dev/null +++ b/assembler/MacroAssemblerSH4.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2011 STMicroelectronics. All rights reserved. + * Copyright (C) 2008 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "config.h" + +#if ENABLE(ASSEMBLER) && CPU(SH4) + +#include "MacroAssemblerSH4.h" + +namespace JSC { + +void MacroAssemblerSH4::linkCall(void* code, Call call, FunctionPtr function) +{ + SH4Assembler::linkCall(code, call.m_jmp, function.value()); +} + +void MacroAssemblerSH4::repatchCall(CodeLocationCall call, CodeLocationLabel destination) +{ + SH4Assembler::relinkCall(call.dataLocation(), destination.executableAddress()); +} + +void MacroAssemblerSH4::repatchCall(CodeLocationCall call, FunctionPtr destination) +{ + SH4Assembler::relinkCall(call.dataLocation(), destination.executableAddress()); +} + +} // namespace JSC + +#endif // ENABLE(ASSEMBLER) diff --git a/assembler/MacroAssemblerSH4.h b/assembler/MacroAssemblerSH4.h new file mode 100644 index 0000000..8bed14c --- /dev/null +++ b/assembler/MacroAssemblerSH4.h @@ -0,0 +1,1766 @@ +/* + * Copyright (C) 2009-2011 STMicroelectronics. All rights reserved. + * Copyright (C) 2008 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef MacroAssemblerSH4_h +#define MacroAssemblerSH4_h + +#if ENABLE(ASSEMBLER) && CPU(SH4) + +#include "AbstractMacroAssembler.h" +#include "SH4Assembler.h" +#include + +namespace JSC { + +class MacroAssemblerSH4 : public AbstractMacroAssembler { +public: + typedef SH4Assembler::FPRegisterID FPRegisterID; + + static const Scale ScalePtr = TimesFour; + static const FPRegisterID fscratch = SH4Registers::fr10; + static const RegisterID stackPointerRegister = SH4Registers::sp; + static const RegisterID linkRegister = SH4Registers::pr; + static const RegisterID scratchReg3 = SH4Registers::r13; + + static const int MaximumCompactPtrAlignedAddressOffset = 0x7FFFFFFF; + + enum RelationalCondition { + Equal = SH4Assembler::EQ, + NotEqual = SH4Assembler::NE, + Above = SH4Assembler::HI, + AboveOrEqual = SH4Assembler::HS, + Below = SH4Assembler::LI, + BelowOrEqual = SH4Assembler::LS, + GreaterThan = SH4Assembler::GT, + GreaterThanOrEqual = SH4Assembler::GE, + LessThan = SH4Assembler::LT, + LessThanOrEqual = SH4Assembler::LE + }; + + enum ResultCondition { + Overflow = SH4Assembler::OF, + Signed = SH4Assembler::SI, + Zero = SH4Assembler::EQ, + NonZero = SH4Assembler::NE + }; + + enum DoubleCondition { + // These conditions will only evaluate to true if the comparison is ordered - i.e. neither operand is NaN. + DoubleEqual = SH4Assembler::EQ, + DoubleNotEqual = SH4Assembler::NE, + DoubleGreaterThan = SH4Assembler::GT, + DoubleGreaterThanOrEqual = SH4Assembler::GE, + DoubleLessThan = SH4Assembler::LT, + DoubleLessThanOrEqual = SH4Assembler::LE, + // If either operand is NaN, these conditions always evaluate to true. + DoubleEqualOrUnordered = SH4Assembler::EQU, + DoubleNotEqualOrUnordered = SH4Assembler::NEU, + DoubleGreaterThanOrUnordered = SH4Assembler::GTU, + DoubleGreaterThanOrEqualOrUnordered = SH4Assembler::GEU, + DoubleLessThanOrUnordered = SH4Assembler::LTU, + DoubleLessThanOrEqualOrUnordered = SH4Assembler::LEU, + }; + + RegisterID claimScratch() + { + return m_assembler.claimScratch(); + } + + void releaseScratch(RegisterID reg) + { + m_assembler.releaseScratch(reg); + } + + // Integer arithmetic operations + + void add32(RegisterID src, RegisterID dest) + { + m_assembler.addlRegReg(src, dest); + } + + void add32(TrustedImm32 imm, RegisterID dest) + { + if (m_assembler.isImmediate(imm.m_value)) { + m_assembler.addlImm8r(imm.m_value, dest); + return; + } + + RegisterID scr = claimScratch(); + m_assembler.loadConstant(imm.m_value, scr); + m_assembler.addlRegReg(scr, dest); + releaseScratch(scr); + } + + void add32(TrustedImm32 imm, RegisterID src, RegisterID dest) + { + if (src != dest) + m_assembler.movlRegReg(src, dest); + add32(imm, dest); + } + + void add32(TrustedImm32 imm, Address address) + { + RegisterID scr = claimScratch(); + load32(address, scr); + add32(imm, scr); + store32(scr, address); + releaseScratch(scr); + } + + void add32(Address src, RegisterID dest) + { + RegisterID scr = claimScratch(); + load32(src, scr); + m_assembler.addlRegReg(scr, dest); + releaseScratch(scr); + } + + void and32(RegisterID src, RegisterID dest) + { + m_assembler.andlRegReg(src, dest); + } + + void and32(TrustedImm32 imm, RegisterID dest) + { + if ((imm.m_value <= 255) && (imm.m_value >= 0) && (dest == SH4Registers::r0)) { + m_assembler.andlImm8r(imm.m_value, dest); + return; + } + + RegisterID scr = claimScratch(); + m_assembler.loadConstant((imm.m_value), scr); + m_assembler.andlRegReg(scr, dest); + releaseScratch(scr); + } + + void lshift32(RegisterID shiftamount, RegisterID dest) + { + m_assembler.shllRegReg(dest, shiftamount); + } + + void rshift32(int imm, RegisterID dest) + { + RegisterID scr = claimScratch(); + m_assembler.loadConstant(-imm, scr); + m_assembler.shaRegReg(dest, scr); + releaseScratch(scr); + } + + void lshift32(TrustedImm32 imm, RegisterID dest) + { + if ((imm.m_value == 1) || (imm.m_value == 2) || (imm.m_value == 8) || (imm.m_value == 16)) { + m_assembler.shllImm8r(imm.m_value, dest); + return; + } + + RegisterID scr = claimScratch(); + m_assembler.loadConstant(imm.m_value, scr); + m_assembler.shllRegReg(dest, scr); + releaseScratch(scr); + } + + void mul32(RegisterID src, RegisterID dest) + { + m_assembler.imullRegReg(src, dest); + m_assembler.stsmacl(dest); + } + + void mul32(TrustedImm32 imm, RegisterID src, RegisterID dest) + { + RegisterID scr = claimScratch(); + move(imm, scr); + if (src != dest) + move(src, dest); + mul32(scr, dest); + releaseScratch(scr); + } + + void not32(RegisterID src, RegisterID dest) + { + m_assembler.notlReg(src, dest); + } + + void or32(RegisterID src, RegisterID dest) + { + m_assembler.orlRegReg(src, dest); + } + + void or32(TrustedImm32 imm, RegisterID dest) + { + if ((imm.m_value <= 255) && (imm.m_value >= 0) && (dest == SH4Registers::r0)) { + m_assembler.orlImm8r(imm.m_value, dest); + return; + } + + RegisterID scr = claimScratch(); + m_assembler.loadConstant(imm.m_value, scr); + m_assembler.orlRegReg(scr, dest); + releaseScratch(scr); + } + + void rshift32(RegisterID shiftamount, RegisterID dest) + { + compare32(32, shiftamount, Equal); + m_assembler.ensureSpace(m_assembler.maxInstructionSize + 4); + m_assembler.branch(BT_OPCODE, 1); + m_assembler.neg(shiftamount, shiftamount); + m_assembler.shaRegReg(dest, shiftamount); + } + + void rshift32(TrustedImm32 imm, RegisterID dest) + { + if (imm.m_value & 0x1f) + rshift32(imm.m_value & 0x1f, dest); + } + + void sub32(RegisterID src, RegisterID dest) + { + m_assembler.sublRegReg(src, dest); + } + + void sub32(TrustedImm32 imm, AbsoluteAddress address, RegisterID scratchReg) + { + RegisterID result = claimScratch(); + + m_assembler.loadConstant(reinterpret_cast(address.m_ptr), scratchReg); + m_assembler.movlMemReg(scratchReg, result); + + if (m_assembler.isImmediate(-imm.m_value)) + m_assembler.addlImm8r(-imm.m_value, result); + else { + m_assembler.loadConstant(imm.m_value, scratchReg3); + m_assembler.sublRegReg(scratchReg3, result); + } + + store32(result, scratchReg); + releaseScratch(result); + } + + void sub32(TrustedImm32 imm, AbsoluteAddress address) + { + RegisterID result = claimScratch(); + RegisterID scratchReg = claimScratch(); + + m_assembler.loadConstant(reinterpret_cast(address.m_ptr), scratchReg); + m_assembler.movlMemReg(scratchReg, result); + + if (m_assembler.isImmediate(-imm.m_value)) + m_assembler.addlImm8r(-imm.m_value, result); + else { + m_assembler.loadConstant(imm.m_value, scratchReg3); + m_assembler.sublRegReg(scratchReg3, result); + } + + store32(result, scratchReg); + releaseScratch(result); + releaseScratch(scratchReg); + } + + void add32(TrustedImm32 imm, AbsoluteAddress address, RegisterID scratchReg) + { + RegisterID result = claimScratch(); + + m_assembler.loadConstant(reinterpret_cast(address.m_ptr), scratchReg); + m_assembler.movlMemReg(scratchReg, result); + + if (m_assembler.isImmediate(imm.m_value)) + m_assembler.addlImm8r(imm.m_value, result); + else { + m_assembler.loadConstant(imm.m_value, scratchReg3); + m_assembler.addlRegReg(scratchReg3, result); + } + + store32(result, scratchReg); + releaseScratch(result); + } + + void add32(TrustedImm32 imm, AbsoluteAddress address) + { + RegisterID result = claimScratch(); + RegisterID scratchReg = claimScratch(); + + m_assembler.loadConstant(reinterpret_cast(address.m_ptr), scratchReg); + m_assembler.movlMemReg(scratchReg, result); + + if (m_assembler.isImmediate(imm.m_value)) + m_assembler.addlImm8r(imm.m_value, result); + else { + m_assembler.loadConstant(imm.m_value, scratchReg3); + m_assembler.addlRegReg(scratchReg3, result); + } + + store32(result, scratchReg); + releaseScratch(result); + releaseScratch(scratchReg); + } + + void sub32(TrustedImm32 imm, RegisterID dest) + { + if (m_assembler.isImmediate(-imm.m_value)) { + m_assembler.addlImm8r(-imm.m_value, dest); + return; + } + + RegisterID scr = claimScratch(); + m_assembler.loadConstant(imm.m_value, scr); + m_assembler.sublRegReg(scr, dest); + releaseScratch(scr); + } + + void sub32(Address src, RegisterID dest) + { + RegisterID scr = claimScratch(); + load32(src, scr); + m_assembler.sublRegReg(scr, dest); + releaseScratch(scr); + } + + void xor32(RegisterID src, RegisterID dest) + { + m_assembler.xorlRegReg(src, dest); + } + + void xor32(TrustedImm32 imm, RegisterID srcDest) + { + if ((srcDest != SH4Registers::r0) || (imm.m_value > 255) || (imm.m_value < 0)) { + RegisterID scr = claimScratch(); + m_assembler.loadConstant((imm.m_value), scr); + m_assembler.xorlRegReg(scr, srcDest); + releaseScratch(scr); + return; + } + + m_assembler.xorlImm8r(imm.m_value, srcDest); + } + + void compare32(int imm, RegisterID dst, RelationalCondition cond) + { + if (((cond == Equal) || (cond == NotEqual)) && (dst == SH4Registers::r0) && m_assembler.isImmediate(imm)) { + m_assembler.cmpEqImmR0(imm, dst); + return; + } + + RegisterID scr = claimScratch(); + m_assembler.loadConstant(imm, scr); + m_assembler.cmplRegReg(scr, dst, SH4Condition(cond)); + releaseScratch(scr); + } + + void compare32(int offset, RegisterID base, RegisterID left, RelationalCondition cond) + { + RegisterID scr = claimScratch(); + if (!offset) { + m_assembler.movlMemReg(base, scr); + m_assembler.cmplRegReg(scr, left, SH4Condition(cond)); + releaseScratch(scr); + return; + } + + if ((offset < 0) || (offset >= 64)) { + m_assembler.loadConstant(offset, scr); + m_assembler.addlRegReg(base, scr); + m_assembler.movlMemReg(scr, scr); + m_assembler.cmplRegReg(scr, left, SH4Condition(cond)); + releaseScratch(scr); + return; + } + + m_assembler.movlMemReg(offset >> 2, base, scr); + m_assembler.cmplRegReg(scr, left, SH4Condition(cond)); + releaseScratch(scr); + } + + void testImm(int imm, int offset, RegisterID base) + { + RegisterID scr = claimScratch(); + RegisterID scr1 = claimScratch(); + + if ((offset < 0) || (offset >= 64)) { + m_assembler.loadConstant(offset, scr); + m_assembler.addlRegReg(base, scr); + m_assembler.movlMemReg(scr, scr); + } else if (offset) + m_assembler.movlMemReg(offset >> 2, base, scr); + else + m_assembler.movlMemReg(base, scr); + if (m_assembler.isImmediate(imm)) + m_assembler.movImm8(imm, scr1); + else + m_assembler.loadConstant(imm, scr1); + + m_assembler.testlRegReg(scr, scr1); + releaseScratch(scr); + releaseScratch(scr1); + } + + void testlImm(int imm, RegisterID dst) + { + if ((dst == SH4Registers::r0) && (imm <= 255) && (imm >= 0)) { + m_assembler.testlImm8r(imm, dst); + return; + } + + RegisterID scr = claimScratch(); + m_assembler.loadConstant(imm, scr); + m_assembler.testlRegReg(scr, dst); + releaseScratch(scr); + } + + void compare32(RegisterID right, int offset, RegisterID base, RelationalCondition cond) + { + if (!offset) { + RegisterID scr = claimScratch(); + m_assembler.movlMemReg(base, scr); + m_assembler.cmplRegReg(right, scr, SH4Condition(cond)); + releaseScratch(scr); + return; + } + + if ((offset < 0) || (offset >= 64)) { + RegisterID scr = claimScratch(); + m_assembler.loadConstant(offset, scr); + m_assembler.addlRegReg(base, scr); + m_assembler.movlMemReg(scr, scr); + m_assembler.cmplRegReg(right, scr, SH4Condition(cond)); + releaseScratch(scr); + return; + } + + RegisterID scr = claimScratch(); + m_assembler.movlMemReg(offset >> 2, base, scr); + m_assembler.cmplRegReg(right, scr, SH4Condition(cond)); + releaseScratch(scr); + } + + void compare32(int imm, int offset, RegisterID base, RelationalCondition cond) + { + if (!offset) { + RegisterID scr = claimScratch(); + RegisterID scr1 = claimScratch(); + m_assembler.movlMemReg(base, scr); + m_assembler.loadConstant(imm, scr1); + m_assembler.cmplRegReg(scr1, scr, SH4Condition(cond)); + releaseScratch(scr1); + releaseScratch(scr); + return; + } + + if ((offset < 0) || (offset >= 64)) { + RegisterID scr = claimScratch(); + RegisterID scr1 = claimScratch(); + m_assembler.loadConstant(offset, scr); + m_assembler.addlRegReg(base, scr); + m_assembler.movlMemReg(scr, scr); + m_assembler.loadConstant(imm, scr1); + m_assembler.cmplRegReg(scr1, scr, SH4Condition(cond)); + releaseScratch(scr1); + releaseScratch(scr); + return; + } + + RegisterID scr = claimScratch(); + RegisterID scr1 = claimScratch(); + m_assembler.movlMemReg(offset >> 2, base, scr); + m_assembler.loadConstant(imm, scr1); + m_assembler.cmplRegReg(scr1, scr, SH4Condition(cond)); + releaseScratch(scr1); + releaseScratch(scr); + } + + // Memory access operation + + void load32(ImplicitAddress address, RegisterID dest) + { + load32(address.base, address.offset, dest); + } + + void load8(ImplicitAddress address, RegisterID dest) + { + load8(address.base, address.offset, dest); + } + + void load32(BaseIndex address, RegisterID dest) + { + RegisterID scr = claimScratch(); + move(address.index, scr); + lshift32(TrustedImm32(address.scale), scr); + add32(address.base, scr); + load32(scr, address.offset, dest); + releaseScratch(scr); + } + + void load32(void* address, RegisterID dest) + { + m_assembler.loadConstant(reinterpret_cast(address), dest); + m_assembler.movlMemReg(dest, dest); + } + + void load32(RegisterID base, int offset, RegisterID dest) + { + if (!offset) { + m_assembler.movlMemReg(base, dest); + return; + } + + if ((offset >= 0) && (offset < 64)) { + m_assembler.movlMemReg(offset >> 2, base, dest); + return; + } + + if ((dest == SH4Registers::r0) && (dest != base)) { + m_assembler.loadConstant((offset), dest); + m_assembler.movlR0mr(base, dest); + return; + } + + RegisterID scr; + if (dest == base) + scr = claimScratch(); + else + scr = dest; + m_assembler.loadConstant((offset), scr); + m_assembler.addlRegReg(base, scr); + m_assembler.movlMemReg(scr, dest); + + if (dest == base) + releaseScratch(scr); + } + + void load8(RegisterID base, int offset, RegisterID dest) + { + if (!offset) { + m_assembler.movbMemReg(base, dest); + return; + } + + if ((offset > 0) && (offset < 64) && (dest == SH4Registers::r0)) { + m_assembler.movbMemReg(offset, base, dest); + return; + } + + if (base != dest) { + m_assembler.loadConstant((offset), dest); + m_assembler.addlRegReg(base, dest); + m_assembler.movbMemReg(dest, dest); + return; + } + + RegisterID scr = claimScratch(); + m_assembler.loadConstant((offset), scr); + m_assembler.addlRegReg(base, scr); + m_assembler.movbMemReg(scr, dest); + releaseScratch(scr); + } + + void load32(RegisterID r0, RegisterID src, RegisterID dst) + { + ASSERT(r0 == SH4Registers::r0); + m_assembler.movlR0mr(src, dst); + } + + void load32(RegisterID src, RegisterID dst) + { + m_assembler.movlMemReg(src, dst); + } + + void load16(ImplicitAddress address, RegisterID dest) + { + if (!address.offset) { + m_assembler.movwMemReg(address.base, dest); + return; + } + + if ((address.offset > 0) && (address.offset < 64) && (dest == SH4Registers::r0)) { + m_assembler.movwMemReg(address.offset, address.base, dest); + return; + } + + if (address.base != dest) { + m_assembler.loadConstant((address.offset), dest); + m_assembler.addlRegReg(address.base, dest); + m_assembler.movwMemReg(dest, dest); + return; + } + + RegisterID scr = claimScratch(); + m_assembler.loadConstant((address.offset), scr); + m_assembler.addlRegReg(address.base, scr); + m_assembler.movwMemReg(scr, dest); + releaseScratch(scr); + } + + void load16(RegisterID src, RegisterID dest) + { + m_assembler.movwMemReg(src, dest); + } + + void load16(RegisterID r0, RegisterID src, RegisterID dest) + { + ASSERT(r0 == SH4Registers::r0); + m_assembler.movwR0mr(src, dest); + } + + void load16(BaseIndex address, RegisterID dest) + { + RegisterID scr = claimScratch(); + + move(address.index, scr); + lshift32(TrustedImm32(address.scale), scr); + + if (address.offset) + add32(TrustedImm32(address.offset), scr); + if (scr == SH4Registers::r0) + m_assembler.movwR0mr(address.base, scr); + else { + add32(address.base, scr); + load16(scr, scr); + } + + extuw(scr, dest); + releaseScratch(scr); + } + + void store32(RegisterID src, ImplicitAddress address) + { + RegisterID scr = claimScratch(); + store32(src, address.offset, address.base, scr); + releaseScratch(scr); + } + + void store32(RegisterID src, int offset, RegisterID base, RegisterID scr) + { + if (!offset) { + m_assembler.movlRegMem(src, base); + return; + } + + if ((offset >=0) && (offset < 64)) { + m_assembler.movlRegMem(src, offset >> 2, base); + return; + } + + m_assembler.loadConstant((offset), scr); + if (scr == SH4Registers::r0) { + m_assembler.movlRegMemr0(src, base); + return; + } + + m_assembler.addlRegReg(base, scr); + m_assembler.movlRegMem(src, scr); + } + + void store32(RegisterID src, RegisterID offset, RegisterID base) + { + ASSERT(offset == SH4Registers::r0); + m_assembler.movlRegMemr0(src, base); + } + + void store32(RegisterID src, RegisterID dst) + { + m_assembler.movlRegMem(src, dst); + } + + void store32(TrustedImm32 imm, ImplicitAddress address) + { + RegisterID scr = claimScratch(); + RegisterID scr1 = claimScratch(); + m_assembler.loadConstant((imm.m_value), scr); + store32(scr, address.offset, address.base, scr1); + releaseScratch(scr); + releaseScratch(scr1); + } + + void store32(RegisterID src, BaseIndex address) + { + RegisterID scr = claimScratch(); + + move(address.index, scr); + lshift32(TrustedImm32(address.scale), scr); + add32(address.base, scr); + store32(src, Address(scr, address.offset)); + + releaseScratch(scr); + } + + void store32(TrustedImm32 imm, void* address) + { + RegisterID scr = claimScratch(); + RegisterID scr1 = claimScratch(); + m_assembler.loadConstant((imm.m_value), scr); + m_assembler.loadConstant(reinterpret_cast(address), scr1); + m_assembler.movlMemReg(scr, scr1); + releaseScratch(scr); + releaseScratch(scr1); + } + + void store32(RegisterID src, void* address) + { + RegisterID scr = claimScratch(); + m_assembler.loadConstant(reinterpret_cast(address), scr); + m_assembler.movlMemReg(src, scr); + releaseScratch(scr); + } + + DataLabel32 load32WithAddressOffsetPatch(Address address, RegisterID dest) + { + RegisterID scr = claimScratch(); + DataLabel32 label(this); + m_assembler.loadConstantUnReusable(address.offset, scr); + m_assembler.addlRegReg(address.base, scr); + m_assembler.movlMemReg(scr, dest); + releaseScratch(scr); + return label; + } + + DataLabel32 load32WithAddressOffsetPatch(Address address, RegisterID dest) + { + RegisterID scr = claimScratch(); + DataLabelCompact label(this); + m_assembler.loadConstantUnReusable(address.offset, scr); + m_assembler.addlRegReg(address.base, scr); + m_assembler.movlMemReg(scr, dest); + releaseScratch(scr); + return label; + } + + DataLabel32 store32WithAddressOffsetPatch(RegisterID src, Address address) + { + RegisterID scr = claimScratch(); + DataLabel32 label(this); + m_assembler.loadConstantUnReusable(address.offset, scr); + m_assembler.addlRegReg(address.base, scr); + m_assembler.movlRegMem(src, scr); + releaseScratch(scr); + return label; + } + + // Floating-point operations + + bool supportsFloatingPoint() const { return true; } + bool supportsFloatingPointTruncate() const { return true; } + bool supportsFloatingPointSqrt() const { return true; } + + void loadDouble(ImplicitAddress address, FPRegisterID dest) + { + RegisterID scr = claimScratch(); + + m_assembler.loadConstant(address.offset, scr); + if (address.base == SH4Registers::r0) { + m_assembler.fmovsReadr0r(scr, (FPRegisterID)(dest + 1)); + m_assembler.addlImm8r(4, scr); + m_assembler.fmovsReadr0r(scr, dest); + releaseScratch(scr); + return; + } + + m_assembler.addlRegReg(address.base, scr); + m_assembler.fmovsReadrminc(scr, (FPRegisterID)(dest + 1)); + m_assembler.fmovsReadrm(scr, dest); + releaseScratch(scr); + } + + void loadDouble(const void* address, FPRegisterID dest) + { + RegisterID scr = claimScratch(); + m_assembler.loadConstant(reinterpret_cast(address), scr); + m_assembler.fmovsReadrminc(scr, (FPRegisterID)(dest + 1)); + m_assembler.fmovsReadrm(scr, dest); + releaseScratch(scr); + } + + void storeDouble(FPRegisterID src, ImplicitAddress address) + { + RegisterID scr = claimScratch(); + m_assembler.loadConstant(address.offset, scr); + m_assembler.addlRegReg(address.base, scr); + m_assembler.fmovsWriterm((FPRegisterID)(src + 1), scr); + m_assembler.addlImm8r(4, scr); + m_assembler.fmovsWriterm(src, scr); + releaseScratch(scr); + } + + void addDouble(FPRegisterID src, FPRegisterID dest) + { + m_assembler.daddRegReg(src, dest); + } + + void addDouble(Address address, FPRegisterID dest) + { + loadDouble(address, fscratch); + addDouble(fscratch, dest); + } + + void subDouble(FPRegisterID src, FPRegisterID dest) + { + m_assembler.dsubRegReg(src, dest); + } + + void subDouble(Address address, FPRegisterID dest) + { + loadDouble(address, fscratch); + subDouble(fscratch, dest); + } + + void mulDouble(FPRegisterID src, FPRegisterID dest) + { + m_assembler.dmulRegReg(src, dest); + } + + void mulDouble(Address address, FPRegisterID dest) + { + loadDouble(address, fscratch); + mulDouble(fscratch, dest); + } + + void divDouble(FPRegisterID src, FPRegisterID dest) + { + m_assembler.ddivRegReg(src, dest); + } + + void convertInt32ToDouble(RegisterID src, FPRegisterID dest) + { + m_assembler.ldsrmfpul(src); + m_assembler.floatfpulDreg(dest); + } + + void convertInt32ToDouble(AbsoluteAddress src, FPRegisterID dest) + { + RegisterID scr = claimScratch(); + m_assembler.loadConstant(reinterpret_cast(src.m_ptr), scr); + convertInt32ToDouble(scr, dest); + releaseScratch(scr); + } + + void convertInt32ToDouble(Address src, FPRegisterID dest) + { + RegisterID scr = claimScratch(); + load32(src, scr); + convertInt32ToDouble(scr, dest); + releaseScratch(scr); + } + + void load32WithUnalignedHalfWords(BaseIndex address, RegisterID dest) + { + RegisterID scr = claimScratch(); + + move(address.index, scr); + lshift32(TrustedImm32(address.scale), scr); + add32(address.base, scr); + + if (address.offset) + add32(TrustedImm32(address.offset), scr); + + RegisterID scr1 = claimScratch(); + load16(scr, scr1); + add32(TrustedImm32(2), scr); + load16(scr, dest); + move(TrustedImm32(16), scr); + m_assembler.shllRegReg(dest, scr); + or32(scr1, dest); + + releaseScratch(scr); + releaseScratch(scr1); + } + + Jump branch32WithUnalignedHalfWords(RelationalCondition cond, BaseIndex left, TrustedImm32 right) + { + RegisterID scr = scratchReg3; + load32WithUnalignedHalfWords(left, scr); + if (((cond == Equal) || (cond == NotEqual)) && !right.m_value) + m_assembler.testlRegReg(scr, scr); + else + compare32(right.m_value, scr, cond); + + if (cond == NotEqual) + return branchFalse(); + return branchTrue(); + } + + Jump branchDoubleNonZero(FPRegisterID reg, FPRegisterID scratch) + { + m_assembler.movImm8(0, scratchReg3); + convertInt32ToDouble(scratchReg3, scratch); + return branchDouble(DoubleNotEqual, reg, scratch); + } + + Jump branchDoubleZeroOrNaN(FPRegisterID reg, FPRegisterID scratch) + { + m_assembler.movImm8(0, scratchReg3); + convertInt32ToDouble(scratchReg3, scratch); + return branchDouble(DoubleEqualOrUnordered, reg, scratch); + } + + Jump branchDouble(DoubleCondition cond, FPRegisterID left, FPRegisterID right) + { + if (cond == DoubleEqual) { + m_assembler.dcmppeq(right, left); + return branchTrue(); + } + + if (cond == DoubleNotEqual) { + RegisterID scr = claimScratch(); + m_assembler.loadConstant(0x7fbfffff, scratchReg3); + m_assembler.dcnvds(right); + m_assembler.stsfpulReg(scr); + m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); + m_assembler.ensureSpace(m_assembler.maxInstructionSize + 22, sizeof(uint32_t)); + m_assembler.branch(BT_OPCODE, 8); + m_assembler.dcnvds(left); + m_assembler.stsfpulReg(scr); + m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); + m_assembler.branch(BT_OPCODE, 4); + m_assembler.dcmppeq(right, left); + releaseScratch(scr); + return branchFalse(); + } + + if (cond == DoubleGreaterThan) { + m_assembler.dcmppgt(right, left); + return branchTrue(); + } + + if (cond == DoubleGreaterThanOrEqual) { + m_assembler.dcmppgt(left, right); + return branchFalse(); + } + + if (cond == DoubleLessThan) { + m_assembler.dcmppgt(left, right); + return branchTrue(); + } + + if (cond == DoubleLessThanOrEqual) { + m_assembler.dcmppgt(right, left); + return branchFalse(); + } + + if (cond == DoubleEqualOrUnordered) { + RegisterID scr = claimScratch(); + m_assembler.loadConstant(0x7fbfffff, scratchReg3); + m_assembler.dcnvds(right); + m_assembler.stsfpulReg(scr); + m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); + m_assembler.ensureSpace(m_assembler.maxInstructionSize + 22, sizeof(uint32_t)); + m_assembler.branch(BT_OPCODE, 5); + m_assembler.dcnvds(left); + m_assembler.stsfpulReg(scr); + m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); + m_assembler.branch(BT_OPCODE, 1); + m_assembler.dcmppeq(left, right); + releaseScratch(scr); + return branchTrue(); + } + + if (cond == DoubleGreaterThanOrUnordered) { + RegisterID scr = claimScratch(); + m_assembler.loadConstant(0x7fbfffff, scratchReg3); + m_assembler.dcnvds(right); + m_assembler.stsfpulReg(scr); + m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); + m_assembler.ensureSpace(m_assembler.maxInstructionSize + 22, sizeof(uint32_t)); + m_assembler.branch(BT_OPCODE, 5); + m_assembler.dcnvds(left); + m_assembler.stsfpulReg(scr); + m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); + m_assembler.branch(BT_OPCODE, 1); + m_assembler.dcmppgt(right, left); + releaseScratch(scr); + return branchTrue(); + } + + if (cond == DoubleGreaterThanOrEqualOrUnordered) { + RegisterID scr = claimScratch(); + m_assembler.loadConstant(0x7fbfffff, scratchReg3); + m_assembler.dcnvds(right); + m_assembler.stsfpulReg(scr); + m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); + m_assembler.ensureSpace(m_assembler.maxInstructionSize + 22, sizeof(uint32_t)); + m_assembler.branch(BT_OPCODE, 5); + m_assembler.dcnvds(left); + m_assembler.stsfpulReg(scr); + m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); + m_assembler.branch(BT_OPCODE, 1); + m_assembler.dcmppgt(left, right); + releaseScratch(scr); + return branchFalse(); + } + + if (cond == DoubleLessThanOrUnordered) { + RegisterID scr = claimScratch(); + m_assembler.loadConstant(0x7fbfffff, scratchReg3); + m_assembler.dcnvds(right); + m_assembler.stsfpulReg(scr); + m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); + m_assembler.ensureSpace(m_assembler.maxInstructionSize + 22, sizeof(uint32_t)); + m_assembler.branch(BT_OPCODE, 5); + m_assembler.dcnvds(left); + m_assembler.stsfpulReg(scr); + m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); + m_assembler.branch(BT_OPCODE, 1); + m_assembler.dcmppgt(left, right); + releaseScratch(scr); + return branchTrue(); + } + + if (cond == DoubleLessThanOrEqualOrUnordered) { + RegisterID scr = claimScratch(); + m_assembler.loadConstant(0x7fbfffff, scratchReg3); + m_assembler.dcnvds(right); + m_assembler.stsfpulReg(scr); + m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); + m_assembler.ensureSpace(m_assembler.maxInstructionSize + 22, sizeof(uint32_t)); + m_assembler.branch(BT_OPCODE, 5); + m_assembler.dcnvds(left); + m_assembler.stsfpulReg(scr); + m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); + m_assembler.branch(BT_OPCODE, 1); + m_assembler.dcmppgt(right, left); + releaseScratch(scr); + return branchFalse(); + } + + ASSERT(cond == DoubleNotEqualOrUnordered); + RegisterID scr = claimScratch(); + m_assembler.loadConstant(0x7fbfffff, scratchReg3); + m_assembler.dcnvds(right); + m_assembler.stsfpulReg(scr); + m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); + m_assembler.ensureSpace(m_assembler.maxInstructionSize + 22, sizeof(uint32_t)); + m_assembler.branch(BT_OPCODE, 5); + m_assembler.dcnvds(left); + m_assembler.stsfpulReg(scr); + m_assembler.cmplRegReg(scratchReg3, scr, SH4Condition(Equal)); + m_assembler.branch(BT_OPCODE, 1); + m_assembler.dcmppeq(right, left); + releaseScratch(scr); + return branchFalse(); + } + + Jump branchTrue() + { + m_assembler.ensureSpace(m_assembler.maxInstructionSize + 6, sizeof(uint32_t)); + Jump m_jump = Jump(m_assembler.je()); + m_assembler.loadConstantUnReusable(0x0, scratchReg3); + m_assembler.nop(); + m_assembler.nop(); + return m_jump; + } + + Jump branchFalse() + { + m_assembler.ensureSpace(m_assembler.maxInstructionSize + 6, sizeof(uint32_t)); + Jump m_jump = Jump(m_assembler.jne()); + m_assembler.loadConstantUnReusable(0x0, scratchReg3); + m_assembler.nop(); + m_assembler.nop(); + return m_jump; + } + + Jump branch32(RelationalCondition cond, BaseIndex left, TrustedImm32 right) + { + RegisterID scr = claimScratch(); + move(left.index, scr); + lshift32(TrustedImm32(left.scale), scr); + add32(left.base, scr); + load32(scr, left.offset, scr); + compare32(right.m_value, scr, cond); + releaseScratch(scr); + + if (cond == NotEqual) + return branchFalse(); + return branchTrue(); + } + + void sqrtDouble(FPRegisterID src, FPRegisterID dest) + { + if (dest != src) + m_assembler.dmovRegReg(src, dest); + m_assembler.dsqrt(dest); + } + + Jump branchTest8(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1)) + { + RegisterID addressTempRegister = claimScratch(); + load8(address, addressTempRegister); + Jump jmp = branchTest32(cond, addressTempRegister, mask); + releaseScratch(addressTempRegister); + return jmp; + } + + void signExtend32ToPtr(RegisterID src, RegisterID dest) + { + if (src != dest) + move(src, dest); + } + + Jump branch8(RelationalCondition cond, Address left, TrustedImm32 right) + { + RegisterID addressTempRegister = claimScratch(); + load8(left, addressTempRegister); + Jump jmp = branch32(cond, addressTempRegister, right); + releaseScratch(addressTempRegister); + return jmp; + } + + Jump branchTruncateDoubleToInt32(FPRegisterID src, RegisterID dest) + { + m_assembler.ftrcdrmfpul(src); + m_assembler.stsfpulReg(dest); + m_assembler.loadConstant(0x7fffffff, scratchReg3); + m_assembler.cmplRegReg(dest, scratchReg3, SH4Condition(Equal)); + m_assembler.ensureSpace(m_assembler.maxInstructionSize + 14, sizeof(uint32_t)); + m_assembler.branch(BT_OPCODE, 2); + m_assembler.addlImm8r(1, scratchReg3); + m_assembler.cmplRegReg(dest, scratchReg3, SH4Condition(Equal)); + return branchTrue(); + } + + // Stack manipulation operations + + void pop(RegisterID dest) + { + m_assembler.popReg(dest); + } + + void push(RegisterID src) + { + m_assembler.pushReg(src); + } + + void push(Address address) + { + if (!address.offset) { + push(address.base); + return; + } + + if ((address.offset < 0) || (address.offset >= 64)) { + RegisterID scr = claimScratch(); + m_assembler.loadConstant(address.offset, scr); + m_assembler.addlRegReg(address.base, scr); + m_assembler.movlMemReg(scr, SH4Registers::sp); + m_assembler.addlImm8r(-4, SH4Registers::sp); + releaseScratch(scr); + return; + } + + m_assembler.movlMemReg(address.offset >> 2, address.base, SH4Registers::sp); + m_assembler.addlImm8r(-4, SH4Registers::sp); + } + + void push(TrustedImm32 imm) + { + RegisterID scr = claimScratch(); + m_assembler.loadConstant(imm.m_value, scr); + push(scr); + releaseScratch(scr); + } + + // Register move operations + + void move(TrustedImm32 imm, RegisterID dest) + { + m_assembler.loadConstant(imm.m_value, dest); + } + + DataLabelPtr moveWithPatch(TrustedImmPtr initialValue, RegisterID dest) + { + DataLabelPtr dataLabel(this); + m_assembler.loadConstantUnReusable(reinterpret_cast(initialValue.m_value), dest, true); + return dataLabel; + } + + void move(RegisterID src, RegisterID dest) + { + m_assembler.movlRegReg(src, dest); + } + + void move(TrustedImmPtr imm, RegisterID dest) + { + m_assembler.loadConstant(imm.asIntptr(), dest); + } + + void extuw(RegisterID src, RegisterID dst) + { + m_assembler.extuw(src, dst); + } + + void compare32(RelationalCondition cond, RegisterID left, RegisterID right, RegisterID dest) + { + m_assembler.cmplRegReg(right, left, SH4Condition(cond)); + if (cond != NotEqual) { + m_assembler.movt(dest); + return; + } + + m_assembler.ensureSpace(m_assembler.maxInstructionSize + 4); + m_assembler.movImm8(0, dest); + m_assembler.branch(BT_OPCODE, 0); + m_assembler.movImm8(1, dest); + } + + void compare32(RelationalCondition cond, RegisterID left, TrustedImm32 right, RegisterID dest) + { + if (left != dest) { + move(right, dest); + compare32(cond, left, dest, dest); + return; + } + + RegisterID scr = claimScratch(); + move(right, scr); + compare32(cond, left, scr, dest); + releaseScratch(scr); + } + + void test8(ResultCondition cond, Address address, TrustedImm32 mask, RegisterID dest) + { + ASSERT((cond == Zero) || (cond == NonZero)); + + load8(address, dest); + if (mask.m_value == -1) + compare32(0, dest, static_cast(cond)); + else + testlImm(mask.m_value, dest); + if (cond != NonZero) { + m_assembler.movt(dest); + return; + } + + m_assembler.ensureSpace(m_assembler.maxInstructionSize + 4); + m_assembler.movImm8(0, dest); + m_assembler.branch(BT_OPCODE, 0); + m_assembler.movImm8(1, dest); + } + + void loadPtrLinkReg(ImplicitAddress address) + { + RegisterID scr = claimScratch(); + load32(address, scr); + m_assembler.ldspr(scr); + releaseScratch(scr); + } + + Jump branch32(RelationalCondition cond, RegisterID left, RegisterID right) + { + m_assembler.cmplRegReg(right, left, SH4Condition(cond)); + /* BT label => BF off + nop LDR reg + nop braf @reg + nop nop + */ + if (cond == NotEqual) + return branchFalse(); + return branchTrue(); + } + + Jump branch32(RelationalCondition cond, RegisterID left, TrustedImm32 right) + { + if (((cond == Equal) || (cond == NotEqual)) && !right.m_value) + m_assembler.testlRegReg(left, left); + else + compare32(right.m_value, left, cond); + + if (cond == NotEqual) + return branchFalse(); + return branchTrue(); + } + + Jump branch32(RelationalCondition cond, RegisterID left, Address right) + { + compare32(right.offset, right.base, left, cond); + if (cond == NotEqual) + return branchFalse(); + return branchTrue(); + } + + Jump branch32(RelationalCondition cond, Address left, RegisterID right) + { + compare32(right, left.offset, left.base, cond); + if (cond == NotEqual) + return branchFalse(); + return branchTrue(); + } + + Jump branch32(RelationalCondition cond, Address left, TrustedImm32 right) + { + compare32(right.m_value, left.offset, left.base, cond); + if (cond == NotEqual) + return branchFalse(); + return branchTrue(); + } + + Jump branch32(RelationalCondition cond, AbsoluteAddress left, RegisterID right) + { + RegisterID scr = claimScratch(); + + move(TrustedImm32(reinterpret_cast(left.m_ptr)), scr); + m_assembler.cmplRegReg(right, scr, SH4Condition(cond)); + releaseScratch(scr); + + if (cond == NotEqual) + return branchFalse(); + return branchTrue(); + } + + Jump branch32(RelationalCondition cond, AbsoluteAddress left, TrustedImm32 right) + { + RegisterID addressTempRegister = claimScratch(); + + m_assembler.loadConstant(reinterpret_cast(left.m_ptr), addressTempRegister); + m_assembler.movlMemReg(addressTempRegister, addressTempRegister); + compare32(right.m_value, addressTempRegister, cond); + releaseScratch(addressTempRegister); + + if (cond == NotEqual) + return branchFalse(); + return branchTrue(); + } + + Jump branch16(RelationalCondition cond, BaseIndex left, RegisterID right) + { + RegisterID scr = claimScratch(); + + move(left.index, scr); + lshift32(TrustedImm32(left.scale), scr); + + if (left.offset) + add32(TrustedImm32(left.offset), scr); + add32(left.base, scr); + load16(scr, scr); + extuw(scr, scr); + releaseScratch(scr); + + return branch32(cond, scr, right); + } + + Jump branch16(RelationalCondition cond, BaseIndex left, TrustedImm32 right) + { + RegisterID scr = claimScratch(); + + move(left.index, scr); + lshift32(TrustedImm32(left.scale), scr); + + if (left.offset) + add32(TrustedImm32(left.offset), scr); + add32(left.base, scr); + load16(scr, scr); + extuw(scr, scr); + RegisterID scr1 = claimScratch(); + m_assembler.loadConstant(right.m_value, scr1); + releaseScratch(scr); + releaseScratch(scr1); + + return branch32(cond, scr, scr1); + } + + Jump branchTest32(ResultCondition cond, RegisterID reg, RegisterID mask) + { + ASSERT((cond == Zero) || (cond == NonZero)); + + m_assembler.testlRegReg(reg, mask); + + if (cond == NotEqual) + return branchFalse(); + return branchTrue(); + } + + Jump branchTest32(ResultCondition cond, RegisterID reg, TrustedImm32 mask = TrustedImm32(-1)) + { + ASSERT((cond == Zero) || (cond == NonZero)); + + if (mask.m_value == -1) + m_assembler.testlRegReg(reg, reg); + else + testlImm(mask.m_value, reg); + + if (cond == NotEqual) + return branchFalse(); + return branchTrue(); + } + + Jump branchTest32(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1)) + { + ASSERT((cond == Zero) || (cond == NonZero)); + + if (mask.m_value == -1) + compare32(0, address.offset, address.base, static_cast(cond)); + else + testImm(mask.m_value, address.offset, address.base); + + if (cond == NotEqual) + return branchFalse(); + return branchTrue(); + } + + Jump branchTest32(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1)) + { + RegisterID scr = claimScratch(); + + move(address.index, scr); + lshift32(TrustedImm32(address.scale), scr); + add32(address.base, scr); + load32(scr, address.offset, scr); + + if (mask.m_value == -1) + m_assembler.testlRegReg(scr, scr); + else + testlImm(mask.m_value, scr); + + releaseScratch(scr); + + if (cond == NotEqual) + return branchFalse(); + return branchTrue(); + } + + Jump jump() + { + return Jump(m_assembler.jmp()); + } + + void jump(RegisterID target) + { + m_assembler.jmpReg(target); + } + + void jump(Address address) + { + RegisterID scr = claimScratch(); + + if ((address.offset < 0) || (address.offset >= 64)) { + m_assembler.loadConstant(address.offset, scr); + m_assembler.addlRegReg(address.base, scr); + m_assembler.movlMemReg(scr, scr); + } else if (address.offset) + m_assembler.movlMemReg(address.offset >> 2, address.base, scr); + else + m_assembler.movlMemReg(address.base, scr); + m_assembler.jmpReg(scr); + + releaseScratch(scr); + } + + // Arithmetic control flow operations + + Jump branchAdd32(ResultCondition cond, RegisterID src, RegisterID dest) + { + ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); + + if (cond == Overflow) { + m_assembler.addvlRegReg(src, dest); + return branchTrue(); + } + + if (cond == Signed) { + m_assembler.addlRegReg(src, dest); + // Check if dest is negative + m_assembler.cmppz(dest); + return branchFalse(); + } + + m_assembler.addlRegReg(src, dest); + compare32(0, dest, Equal); + + if (cond == NotEqual) + return branchFalse(); + return branchTrue(); + } + + Jump branchAdd32(ResultCondition cond, TrustedImm32 imm, RegisterID dest) + { + ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); + + move(imm, scratchReg3); + return branchAdd32(cond, scratchReg3, dest); + } + + Jump branchMul32(ResultCondition cond, RegisterID src, RegisterID dest) + { + ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); + + if (cond == Overflow) { + RegisterID scr1 = claimScratch(); + RegisterID scr = claimScratch(); + m_assembler.dmullRegReg(src, dest); + m_assembler.stsmacl(dest); + m_assembler.movImm8(-31, scr); + m_assembler.movlRegReg(dest, scr1); + m_assembler.shaRegReg(scr1, scr); + m_assembler.stsmach(scr); + m_assembler.cmplRegReg(scr, scr1, SH4Condition(Equal)); + releaseScratch(scr1); + releaseScratch(scr); + return branchFalse(); + } + + m_assembler.imullRegReg(src, dest); + m_assembler.stsmacl(dest); + if (cond == Signed) { + // Check if dest is negative + m_assembler.cmppz(dest); + return branchFalse(); + } + + compare32(0, dest, static_cast(cond)); + + if (cond == NotEqual) + return branchFalse(); + return branchTrue(); + } + + Jump branchMul32(ResultCondition cond, TrustedImm32 imm, RegisterID src, RegisterID dest) + { + ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); + + move(imm, scratchReg3); + if (src != dest) + move(src, dest); + + return branchMul32(cond, scratchReg3, dest); + } + + Jump branchSub32(ResultCondition cond, RegisterID src, RegisterID dest) + { + ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); + + if (cond == Overflow) { + m_assembler.subvlRegReg(src, dest); + return branchTrue(); + } + + if (cond == Signed) { + // Check if dest is negative + m_assembler.sublRegReg(src, dest); + compare32(0, dest, LessThan); + return branchTrue(); + } + + sub32(src, dest); + compare32(0, dest, static_cast(cond)); + + if (cond == NotEqual) + return branchFalse(); + return branchTrue(); + } + + Jump branchSub32(ResultCondition cond, TrustedImm32 imm, RegisterID dest) + { + ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); + + move(imm, scratchReg3); + return branchSub32(cond, scratchReg3, dest); + } + + Jump branchOr32(ResultCondition cond, RegisterID src, RegisterID dest) + { + ASSERT((cond == Signed) || (cond == Zero) || (cond == NonZero)); + + if (cond == Signed) { + or32(src, dest); + compare32(0, dest, static_cast(LessThan)); + return branchTrue(); + } + + or32(src, dest); + compare32(0, dest, static_cast(cond)); + + if (cond == NotEqual) + return branchFalse(); + return branchTrue(); + } + + void branchConvertDoubleToInt32(FPRegisterID src, RegisterID dest, JumpList& failureCases, FPRegisterID fpTemp) + { + m_assembler.ftrcdrmfpul(src); + m_assembler.stsfpulReg(dest); + convertInt32ToDouble(dest, fscratch); + failureCases.append(branchDouble(DoubleNotEqualOrUnordered, fscratch, src)); + + if (dest == SH4Registers::r0) + m_assembler.cmpEqImmR0(0, dest); + else { + m_assembler.movImm8(0, scratchReg3); + m_assembler.cmplRegReg(scratchReg3, dest, SH4Condition(Equal)); + } + failureCases.append(branchTrue()); + } + + void neg32(RegisterID dst) + { + m_assembler.neg(dst, dst); + } + + void not32(RegisterID dst) + { + m_assembler.notlReg(dst, dst); + } + + void urshift32(RegisterID shiftamount, RegisterID dest) + { + compare32(32, shiftamount, Equal); + m_assembler.ensureSpace(m_assembler.maxInstructionSize + 4); + m_assembler.branch(BT_OPCODE, 1); + m_assembler.neg(shiftamount, shiftamount); + m_assembler.shllRegReg(dest, shiftamount); + } + + void urshift32(TrustedImm32 imm, RegisterID dest) + { + RegisterID scr = claimScratch(); + m_assembler.loadConstant(-(imm.m_value), scr); + m_assembler.shaRegReg(dest, scr); + releaseScratch(scr); + } + + Call call() + { + return Call(m_assembler.call(), Call::Linkable); + } + + Call nearCall() + { + return Call(m_assembler.call(), Call::LinkableNear); + } + + Call call(RegisterID target) + { + return Call(m_assembler.call(target), Call::None); + } + + void call(Address address, RegisterID target) + { + load32(address.base, address.offset, target); + m_assembler.ensureSpace(m_assembler.maxInstructionSize + 2); + m_assembler.branch(JSR_OPCODE, target); + m_assembler.nop(); + } + + void breakpoint() + { + m_assembler.bkpt(); + m_assembler.nop(); + } + + Jump branchPtrWithPatch(RelationalCondition cond, RegisterID left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0)) + { + RegisterID dataTempRegister = claimScratch(); + + dataLabel = moveWithPatch(initialRightValue, dataTempRegister); + m_assembler.cmplRegReg(dataTempRegister, left, SH4Condition(cond)); + releaseScratch(dataTempRegister); + + if (cond == NotEqual) + return branchFalse(); + return branchTrue(); + } + + Jump branchPtrWithPatch(RelationalCondition cond, Address left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0)) + { + RegisterID scr = claimScratch(); + + m_assembler.loadConstant(left.offset, scr); + m_assembler.addlRegReg(left.base, scr); + m_assembler.movlMemReg(scr, scr); + RegisterID scr1 = claimScratch(); + dataLabel = moveWithPatch(initialRightValue, scr1); + m_assembler.cmplRegReg(scr1, scr, SH4Condition(cond)); + releaseScratch(scr); + releaseScratch(scr1); + + if (cond == NotEqual) + return branchFalse(); + return branchTrue(); + } + + void ret() + { + m_assembler.ret(); + m_assembler.nop(); + } + + DataLabelPtr storePtrWithPatch(TrustedImmPtr initialValue, ImplicitAddress address) + { + RegisterID scr = claimScratch(); + DataLabelPtr label = moveWithPatch(initialValue, scr); + store32(scr, address); + releaseScratch(scr); + return label; + } + + DataLabelPtr storePtrWithPatch(ImplicitAddress address) { return storePtrWithPatch(TrustedImmPtr(0), address); } + + int sizeOfConstantPool() + { + return m_assembler.sizeOfConstantPool(); + } + + Call tailRecursiveCall() + { + RegisterID scr = claimScratch(); + + m_assembler.loadConstantUnReusable(0x0, scr, true); + Jump m_jump = Jump(m_assembler.jmp(scr)); + releaseScratch(scr); + + return Call::fromTailJump(m_jump); + } + + Call makeTailRecursiveCall(Jump oldJump) + { + oldJump.link(this); + return tailRecursiveCall(); + } + + void nop() + { + m_assembler.nop(); + } + +protected: + SH4Assembler::Condition SH4Condition(RelationalCondition cond) + { + return static_cast(cond); + } + + SH4Assembler::Condition SH4Condition(ResultCondition cond) + { + return static_cast(cond); + } +private: + friend class LinkBuffer; + friend class RepatchBuffer; + + static void linkCall(void*, Call, FunctionPtr); + static void repatchCall(CodeLocationCall, CodeLocationLabel); + static void repatchCall(CodeLocationCall, FunctionPtr); +}; + +} // namespace JSC + +#endif // ENABLE(ASSEMBLER) + +#endif // MacroAssemblerSH4_h diff --git a/assembler/MacroAssemblerX86.h b/assembler/MacroAssemblerX86.h index 0918996..a1657e6 100644 --- a/assembler/MacroAssemblerX86.h +++ b/assembler/MacroAssemblerX86.h @@ -52,32 +52,32 @@ public: using MacroAssemblerX86Common::loadDouble; using MacroAssemblerX86Common::convertInt32ToDouble; - void add32(Imm32 imm, RegisterID src, RegisterID dest) + void add32(TrustedImm32 imm, RegisterID src, RegisterID dest) { m_assembler.leal_mr(imm.m_value, src, dest); } - void add32(Imm32 imm, AbsoluteAddress address) + void add32(TrustedImm32 imm, AbsoluteAddress address) { m_assembler.addl_im(imm.m_value, address.m_ptr); } - void addWithCarry32(Imm32 imm, AbsoluteAddress address) + void addWithCarry32(TrustedImm32 imm, AbsoluteAddress address) { m_assembler.adcl_im(imm.m_value, address.m_ptr); } - void and32(Imm32 imm, AbsoluteAddress address) + void and32(TrustedImm32 imm, AbsoluteAddress address) { m_assembler.andl_im(imm.m_value, address.m_ptr); } - void or32(Imm32 imm, AbsoluteAddress address) + void or32(TrustedImm32 imm, AbsoluteAddress address) { m_assembler.orl_im(imm.m_value, address.m_ptr); } - void sub32(Imm32 imm, AbsoluteAddress address) + void sub32(TrustedImm32 imm, AbsoluteAddress address) { m_assembler.subl_im(imm.m_value, address.m_ptr); } @@ -98,7 +98,7 @@ public: m_assembler.cvtsi2sd_mr(src.m_ptr, dest); } - void store32(Imm32 imm, void* address) + void store32(TrustedImm32 imm, void* address) { m_assembler.movl_i32m(imm.m_value, address); } @@ -108,13 +108,13 @@ public: m_assembler.movl_rm(src, address); } - Jump branch32(Condition cond, AbsoluteAddress left, RegisterID right) + Jump branch32(RelationalCondition cond, AbsoluteAddress left, RegisterID right) { m_assembler.cmpl_rm(right, left.m_ptr); return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branch32(Condition cond, AbsoluteAddress left, Imm32 right) + Jump branch32(RelationalCondition cond, AbsoluteAddress left, TrustedImm32 right) { m_assembler.cmpl_im(right.m_value, left.m_ptr); return Jump(m_assembler.jCC(x86Condition(cond))); @@ -136,39 +136,32 @@ public: } - DataLabelPtr moveWithPatch(ImmPtr initialValue, RegisterID dest) + DataLabelPtr moveWithPatch(TrustedImmPtr initialValue, RegisterID dest) { m_assembler.movl_i32r(initialValue.asIntptr(), dest); return DataLabelPtr(this); } - Jump branchPtrWithPatch(Condition cond, RegisterID left, DataLabelPtr& dataLabel, ImmPtr initialRightValue = ImmPtr(0)) + Jump branchPtrWithPatch(RelationalCondition cond, RegisterID left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0)) { m_assembler.cmpl_ir_force32(initialRightValue.asIntptr(), left); dataLabel = DataLabelPtr(this); return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branchPtrWithPatch(Condition cond, Address left, DataLabelPtr& dataLabel, ImmPtr initialRightValue = ImmPtr(0)) + Jump branchPtrWithPatch(RelationalCondition cond, Address left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0)) { m_assembler.cmpl_im_force32(initialRightValue.asIntptr(), left.offset, left.base); dataLabel = DataLabelPtr(this); return Jump(m_assembler.jCC(x86Condition(cond))); } - DataLabelPtr storePtrWithPatch(ImmPtr initialValue, ImplicitAddress address) + DataLabelPtr storePtrWithPatch(TrustedImmPtr initialValue, ImplicitAddress address) { m_assembler.movl_i32m(initialValue.asIntptr(), address.offset, address.base); return DataLabelPtr(this); } - Label loadPtrWithPatchToLEA(Address address, RegisterID dest) - { - Label label(this); - load32(address, dest); - return label; - } - bool supportsFloatingPoint() const { return m_isSSE2Present; } // See comment on MacroAssemblerARMv7::supportsFloatingPointTruncate() bool supportsFloatingPointTruncate() const { return m_isSSE2Present; } diff --git a/assembler/MacroAssemblerX86Common.h b/assembler/MacroAssemblerX86Common.h index 0731065..933b36b 100644 --- a/assembler/MacroAssemblerX86Common.h +++ b/assembler/MacroAssemblerX86Common.h @@ -40,8 +40,10 @@ class MacroAssemblerX86Common : public AbstractMacroAssembler { public: typedef X86Assembler::FPRegisterID FPRegisterID; + + static const int MaximumCompactPtrAlignedAddressOffset = 127; - enum Condition { + enum RelationalCondition { Equal = X86Assembler::ConditionE, NotEqual = X86Assembler::ConditionNE, Above = X86Assembler::ConditionA, @@ -51,7 +53,10 @@ public: GreaterThan = X86Assembler::ConditionG, GreaterThanOrEqual = X86Assembler::ConditionGE, LessThan = X86Assembler::ConditionL, - LessThanOrEqual = X86Assembler::ConditionLE, + LessThanOrEqual = X86Assembler::ConditionLE + }; + + enum ResultCondition { Overflow = X86Assembler::ConditionO, Signed = X86Assembler::ConditionS, Zero = X86Assembler::ConditionE, @@ -83,7 +88,7 @@ public: // Integer arithmetic operations: // // Operations are typically two operand - operation(source, srcDst) - // For many operations the source may be an Imm32, the srcDst operand + // For many operations the source may be an TrustedImm32, the srcDst operand // may often be a memory location (explictly described using an Address // object). @@ -92,12 +97,12 @@ public: m_assembler.addl_rr(src, dest); } - void add32(Imm32 imm, Address address) + void add32(TrustedImm32 imm, Address address) { m_assembler.addl_im(imm.m_value, address.offset, address.base); } - void add32(Imm32 imm, RegisterID dest) + void add32(TrustedImm32 imm, RegisterID dest) { m_assembler.addl_ir(imm.m_value, dest); } @@ -117,7 +122,7 @@ public: m_assembler.andl_rr(src, dest); } - void and32(Imm32 imm, RegisterID dest) + void and32(TrustedImm32 imm, RegisterID dest) { m_assembler.andl_ir(imm.m_value, dest); } @@ -132,36 +137,64 @@ public: m_assembler.andl_mr(src.offset, src.base, dest); } - void and32(Imm32 imm, Address address) + void and32(TrustedImm32 imm, Address address) { m_assembler.andl_im(imm.m_value, address.offset, address.base); } - void lshift32(Imm32 imm, RegisterID dest) + void and32(RegisterID op1, RegisterID op2, RegisterID dest) { - m_assembler.shll_i8r(imm.m_value, dest); + if (op1 == op2) + zeroExtend32ToPtr(op1, dest); + else if (op1 == dest) + and32(op2, dest); + else { + move(op2, dest); + and32(op1, dest); + } } - + + void and32(TrustedImm32 imm, RegisterID src, RegisterID dest) + { + move(src, dest); + and32(imm, dest); + } + void lshift32(RegisterID shift_amount, RegisterID dest) { - // On x86 we can only shift by ecx; if asked to shift by another register we'll - // need rejig the shift amount into ecx first, and restore the registers afterwards. - if (shift_amount != X86Registers::ecx) { - swap(shift_amount, X86Registers::ecx); + ASSERT(shift_amount != dest); - // E.g. transform "shll %eax, %eax" -> "xchgl %eax, %ecx; shll %ecx, %ecx; xchgl %eax, %ecx" - if (dest == shift_amount) - m_assembler.shll_CLr(X86Registers::ecx); - // E.g. transform "shll %eax, %ecx" -> "xchgl %eax, %ecx; shll %ecx, %eax; xchgl %eax, %ecx" - else if (dest == X86Registers::ecx) - m_assembler.shll_CLr(shift_amount); - // E.g. transform "shll %eax, %ebx" -> "xchgl %eax, %ecx; shll %ecx, %ebx; xchgl %eax, %ecx" - else - m_assembler.shll_CLr(dest); - - swap(shift_amount, X86Registers::ecx); - } else + if (shift_amount == X86Registers::ecx) m_assembler.shll_CLr(dest); + else { + // On x86 we can only shift by ecx; if asked to shift by another register we'll + // need rejig the shift amount into ecx first, and restore the registers afterwards. + // If we dest is ecx, then shift the swapped register! + swap(shift_amount, X86Registers::ecx); + m_assembler.shll_CLr(dest == X86Registers::ecx ? shift_amount : dest); + swap(shift_amount, X86Registers::ecx); + } + } + + void lshift32(RegisterID src, RegisterID shift_amount, RegisterID dest) + { + ASSERT(shift_amount != dest); + + if (src != dest) + move(src, dest); + lshift32(shift_amount, dest); + } + + void lshift32(TrustedImm32 imm, RegisterID dest) + { + m_assembler.shll_i8r(imm.m_value, dest); + } + + void lshift32(RegisterID src, TrustedImm32 imm, RegisterID dest) + { + if (src != dest) + move(src, dest); + lshift32(imm, dest); } void mul32(RegisterID src, RegisterID dest) @@ -174,7 +207,7 @@ public: m_assembler.imull_mr(src.offset, src.base, dest); } - void mul32(Imm32 imm, RegisterID src, RegisterID dest) + void mul32(TrustedImm32 imm, RegisterID src, RegisterID dest) { m_assembler.imull_i32r(src, imm.m_value, dest); } @@ -204,7 +237,7 @@ public: m_assembler.orl_rr(src, dest); } - void or32(Imm32 imm, RegisterID dest) + void or32(TrustedImm32 imm, RegisterID dest) { m_assembler.orl_ir(imm.m_value, dest); } @@ -219,76 +252,114 @@ public: m_assembler.orl_mr(src.offset, src.base, dest); } - void or32(Imm32 imm, Address address) + void or32(TrustedImm32 imm, Address address) { m_assembler.orl_im(imm.m_value, address.offset, address.base); } + void or32(RegisterID op1, RegisterID op2, RegisterID dest) + { + if (op1 == op2) + zeroExtend32ToPtr(op1, dest); + else if (op1 == dest) + or32(op2, dest); + else { + move(op2, dest); + or32(op1, dest); + } + } + + void or32(TrustedImm32 imm, RegisterID src, RegisterID dest) + { + move(src, dest); + or32(imm, dest); + } + void rshift32(RegisterID shift_amount, RegisterID dest) { - // On x86 we can only shift by ecx; if asked to shift by another register we'll - // need rejig the shift amount into ecx first, and restore the registers afterwards. - if (shift_amount != X86Registers::ecx) { - swap(shift_amount, X86Registers::ecx); + ASSERT(shift_amount != dest); - // E.g. transform "shll %eax, %eax" -> "xchgl %eax, %ecx; shll %ecx, %ecx; xchgl %eax, %ecx" - if (dest == shift_amount) - m_assembler.sarl_CLr(X86Registers::ecx); - // E.g. transform "shll %eax, %ecx" -> "xchgl %eax, %ecx; shll %ecx, %eax; xchgl %eax, %ecx" - else if (dest == X86Registers::ecx) - m_assembler.sarl_CLr(shift_amount); - // E.g. transform "shll %eax, %ebx" -> "xchgl %eax, %ecx; shll %ecx, %ebx; xchgl %eax, %ecx" - else - m_assembler.sarl_CLr(dest); - - swap(shift_amount, X86Registers::ecx); - } else + if (shift_amount == X86Registers::ecx) m_assembler.sarl_CLr(dest); + else { + // On x86 we can only shift by ecx; if asked to shift by another register we'll + // need rejig the shift amount into ecx first, and restore the registers afterwards. + // If we dest is ecx, then shift the swapped register! + swap(shift_amount, X86Registers::ecx); + m_assembler.sarl_CLr(dest == X86Registers::ecx ? shift_amount : dest); + swap(shift_amount, X86Registers::ecx); + } } - void rshift32(Imm32 imm, RegisterID dest) + void rshift32(RegisterID src, RegisterID shift_amount, RegisterID dest) + { + ASSERT(shift_amount != dest); + + if (src != dest) + move(src, dest); + rshift32(shift_amount, dest); + } + + void rshift32(TrustedImm32 imm, RegisterID dest) { m_assembler.sarl_i8r(imm.m_value, dest); } + void rshift32(RegisterID src, TrustedImm32 imm, RegisterID dest) + { + if (src != dest) + move(src, dest); + rshift32(imm, dest); + } + void urshift32(RegisterID shift_amount, RegisterID dest) { - // On x86 we can only shift by ecx; if asked to shift by another register we'll - // need rejig the shift amount into ecx first, and restore the registers afterwards. - if (shift_amount != X86Registers::ecx) { + ASSERT(shift_amount != dest); + + if (shift_amount == X86Registers::ecx) + m_assembler.shrl_CLr(dest); + else { + // On x86 we can only shift by ecx; if asked to shift by another register we'll + // need rejig the shift amount into ecx first, and restore the registers afterwards. + // If we dest is ecx, then shift the swapped register! swap(shift_amount, X86Registers::ecx); - - // E.g. transform "shrl %eax, %eax" -> "xchgl %eax, %ecx; shrl %ecx, %ecx; xchgl %eax, %ecx" - if (dest == shift_amount) - m_assembler.shrl_CLr(X86Registers::ecx); - // E.g. transform "shrl %eax, %ecx" -> "xchgl %eax, %ecx; shrl %ecx, %eax; xchgl %eax, %ecx" - else if (dest == X86Registers::ecx) - m_assembler.shrl_CLr(shift_amount); - // E.g. transform "shrl %eax, %ebx" -> "xchgl %eax, %ecx; shrl %ecx, %ebx; xchgl %eax, %ecx" - else - m_assembler.shrl_CLr(dest); - + m_assembler.shrl_CLr(dest == X86Registers::ecx ? shift_amount : dest); swap(shift_amount, X86Registers::ecx); - } else - m_assembler.shrl_CLr(dest); + } } - - void urshift32(Imm32 imm, RegisterID dest) + + void urshift32(RegisterID src, RegisterID shift_amount, RegisterID dest) { - m_assembler.shrl_i8r(imm.m_value, dest); + ASSERT(shift_amount != dest); + + if (src != dest) + move(src, dest); + urshift32(shift_amount, dest); } + void urshift32(TrustedImm32 imm, RegisterID dest) + { + m_assembler.shrl_i8r(imm.m_value, dest); + } + + void urshift32(RegisterID src, TrustedImm32 imm, RegisterID dest) + { + if (src != dest) + move(src, dest); + urshift32(imm, dest); + } + void sub32(RegisterID src, RegisterID dest) { m_assembler.subl_rr(src, dest); } - void sub32(Imm32 imm, RegisterID dest) + void sub32(TrustedImm32 imm, RegisterID dest) { m_assembler.subl_ir(imm.m_value, dest); } - void sub32(Imm32 imm, Address address) + void sub32(TrustedImm32 imm, Address address) { m_assembler.subl_im(imm.m_value, address.offset, address.base); } @@ -309,12 +380,12 @@ public: m_assembler.xorl_rr(src, dest); } - void xor32(Imm32 imm, Address dest) + void xor32(TrustedImm32 imm, Address dest) { m_assembler.xorl_im(imm.m_value, dest.offset, dest.base); } - void xor32(Imm32 imm, RegisterID dest) + void xor32(TrustedImm32 imm, RegisterID dest) { m_assembler.xorl_ir(imm.m_value, dest); } @@ -329,6 +400,24 @@ public: m_assembler.xorl_mr(src.offset, src.base, dest); } + void xor32(RegisterID op1, RegisterID op2, RegisterID dest) + { + if (op1 == op2) + move(TrustedImm32(0), dest); + else if (op1 == dest) + xor32(op2, dest); + else { + move(op2, dest); + xor32(op1, dest); + } + } + + void xor32(TrustedImm32 imm, RegisterID src, RegisterID dest) + { + move(src, dest); + xor32(imm, dest); + } + void sqrtDouble(FPRegisterID src, FPRegisterID dst) { m_assembler.sqrtsd_rr(src, dst); @@ -337,7 +426,7 @@ public: // Memory access operations: // // Loads are of the form load(address, destination) and stores of the form - // store(source, address). The source for a store may be an Imm32. Address + // store(source, address). The source for a store may be an TrustedImm32. Address // operand objects to loads and store will be implicitly constructed if a // register is passed. @@ -361,6 +450,25 @@ public: m_assembler.movl_mr_disp32(address.offset, address.base, dest); return DataLabel32(this); } + + DataLabelCompact load32WithCompactAddressOffsetPatch(Address address, RegisterID dest) + { + m_assembler.movl_mr_disp8(address.offset, address.base, dest); + return DataLabelCompact(this); + } + + static void repatchCompact(CodeLocationDataLabelCompact dataLabelCompact, int32_t value) + { + ASSERT(value >= 0); + ASSERT(value < MaximumCompactPtrAlignedAddressOffset); + AssemblerType_T::repatchCompact(dataLabelCompact.dataLocation(), value); + } + + DataLabelCompact loadCompactWithAddressOffsetPatch(Address address, RegisterID dest) + { + m_assembler.movl_mr_disp8(address.offset, address.base, dest); + return DataLabelCompact(this); + } void load16(BaseIndex address, RegisterID dest) { @@ -388,7 +496,7 @@ public: m_assembler.movl_rm(src, address.offset, address.base, address.index, address.scale); } - void store32(Imm32 imm, ImplicitAddress address) + void store32(TrustedImm32 imm, ImplicitAddress address) { m_assembler.movl_i32m(imm.m_value, address.offset, address.base); } @@ -398,6 +506,13 @@ public: // // Presently only supports SSE, not x87 floating point. + void moveDouble(FPRegisterID src, FPRegisterID dest) + { + ASSERT(isSSE2Present()); + if (src != dest) + m_assembler.movsd_rr(src, dest); + } + void loadDouble(ImplicitAddress address, FPRegisterID dest) { ASSERT(isSSE2Present()); @@ -416,6 +531,17 @@ public: m_assembler.addsd_rr(src, dest); } + void addDouble(FPRegisterID op1, FPRegisterID op2, FPRegisterID dest) + { + ASSERT(isSSE2Present()); + if (op1 == dest) + addDouble(op2, dest); + else { + moveDouble(op2, dest); + addDouble(op1, dest); + } + } + void addDouble(Address src, FPRegisterID dest) { ASSERT(isSSE2Present()); @@ -428,6 +554,15 @@ public: m_assembler.divsd_rr(src, dest); } + void divDouble(FPRegisterID op1, FPRegisterID op2, FPRegisterID dest) + { + // B := A / B is invalid. + ASSERT(op1 == dest || op2 != dest); + + moveDouble(op1, dest); + divDouble(op2, dest); + } + void divDouble(Address src, FPRegisterID dest) { ASSERT(isSSE2Present()); @@ -440,6 +575,15 @@ public: m_assembler.subsd_rr(src, dest); } + void subDouble(FPRegisterID op1, FPRegisterID op2, FPRegisterID dest) + { + // B := A - B is invalid. + ASSERT(op1 == dest || op2 != dest); + + moveDouble(op1, dest); + subDouble(op2, dest); + } + void subDouble(Address src, FPRegisterID dest) { ASSERT(isSSE2Present()); @@ -452,6 +596,17 @@ public: m_assembler.mulsd_rr(src, dest); } + void mulDouble(FPRegisterID op1, FPRegisterID op2, FPRegisterID dest) + { + ASSERT(isSSE2Present()); + if (op1 == dest) + mulDouble(op2, dest); + else { + moveDouble(op2, dest); + mulDouble(op1, dest); + } + } + void mulDouble(Address src, FPRegisterID dest) { ASSERT(isSSE2Present()); @@ -501,11 +656,12 @@ public: // 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) + enum BranchTruncateType { BranchIfTruncateFailed, BranchIfTruncateSuccessful }; + Jump branchTruncateDoubleToInt32(FPRegisterID src, RegisterID dest, BranchTruncateType branchType = BranchIfTruncateFailed) { ASSERT(isSSE2Present()); m_assembler.cvttsd2si_rr(src, dest); - return branch32(Equal, dest, Imm32(0x80000000)); + return branch32(branchType ? NotEqual : Equal, dest, TrustedImm32(0x80000000)); } // Convert 'src' to an integer, and places the resulting 'dest'. @@ -564,7 +720,7 @@ public: m_assembler.push_m(address.offset, address.base); } - void push(Imm32 imm) + void push(TrustedImm32 imm) { m_assembler.push_i32(imm.m_value); } @@ -574,9 +730,9 @@ public: // // Move values in registers. - void move(Imm32 imm, RegisterID dest) + void move(TrustedImm32 imm, RegisterID dest) { - // Note: on 64-bit the Imm32 value is zero extended into the register, it + // Note: on 64-bit the TrustedImm32 value is zero extended into the register, it // may be useful to have a separate version that sign extends the value? if (!imm.m_value) m_assembler.xorl_rr(dest, dest); @@ -593,7 +749,7 @@ public: m_assembler.movq_rr(src, dest); } - void move(ImmPtr imm, RegisterID dest) + void move(TrustedImmPtr imm, RegisterID dest) { m_assembler.movq_i64r(imm.asIntptr(), dest); } @@ -620,7 +776,7 @@ public: m_assembler.movl_rr(src, dest); } - void move(ImmPtr imm, RegisterID dest) + void move(TrustedImmPtr imm, RegisterID dest) { m_assembler.movl_i32r(imm.asIntptr(), dest); } @@ -655,26 +811,26 @@ public: // used (representing the names 'below' and 'above'). // // Operands to the comparision are provided in the expected order, e.g. - // jle32(reg1, Imm32(5)) will branch if the value held in reg1, when + // jle32(reg1, TrustedImm32(5)) will branch if the value held in reg1, when // treated as a signed 32bit value, is less than or equal to 5. // // jz and jnz test whether the first operand is equal to zero, and take // an optional second operand of a mask under which to perform the test. public: - Jump branch8(Condition cond, Address left, Imm32 right) + Jump branch8(RelationalCondition cond, Address left, TrustedImm32 right) { m_assembler.cmpb_im(right.m_value, left.offset, left.base); return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branch32(Condition cond, RegisterID left, RegisterID right) + Jump branch32(RelationalCondition cond, RegisterID left, RegisterID right) { m_assembler.cmpl_rr(right, left); return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branch32(Condition cond, RegisterID left, Imm32 right) + Jump branch32(RelationalCondition cond, RegisterID left, TrustedImm32 right) { if (((cond == Equal) || (cond == NotEqual)) && !right.m_value) m_assembler.testl_rr(left, left); @@ -683,42 +839,51 @@ public: return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branch32(Condition cond, RegisterID left, Address right) + Jump branch32(RelationalCondition cond, TrustedImm32 left, RegisterID right) + { + if (((cond == Equal) || (cond == NotEqual)) && !left.m_value) + m_assembler.testl_rr(right, right); + else + m_assembler.cmpl_ir(left.m_value, right); + return Jump(m_assembler.jCC(x86Condition(commute(cond)))); + } + + Jump branch32(RelationalCondition cond, RegisterID left, Address right) { m_assembler.cmpl_mr(right.offset, right.base, left); return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branch32(Condition cond, Address left, RegisterID right) + Jump branch32(RelationalCondition cond, Address left, RegisterID right) { m_assembler.cmpl_rm(right, left.offset, left.base); return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branch32(Condition cond, Address left, Imm32 right) + Jump branch32(RelationalCondition cond, Address left, TrustedImm32 right) { m_assembler.cmpl_im(right.m_value, left.offset, left.base); return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branch32(Condition cond, BaseIndex left, Imm32 right) + Jump branch32(RelationalCondition cond, BaseIndex left, TrustedImm32 right) { m_assembler.cmpl_im(right.m_value, left.offset, left.base, left.index, left.scale); return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branch32WithUnalignedHalfWords(Condition cond, BaseIndex left, Imm32 right) + Jump branch32WithUnalignedHalfWords(RelationalCondition cond, BaseIndex left, TrustedImm32 right) { return branch32(cond, left, right); } - Jump branch16(Condition cond, BaseIndex left, RegisterID right) + Jump branch16(RelationalCondition cond, BaseIndex left, RegisterID right) { m_assembler.cmpw_rm(right, left.offset, left.base, left.index, left.scale); return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branch16(Condition cond, BaseIndex left, Imm32 right) + Jump branch16(RelationalCondition cond, BaseIndex left, TrustedImm32 right) { ASSERT(!(right.m_value & 0xFFFF0000)); @@ -726,16 +891,14 @@ public: return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branchTest32(Condition cond, RegisterID reg, RegisterID mask) + Jump branchTest32(ResultCondition cond, RegisterID reg, RegisterID mask) { - ASSERT((cond == Zero) || (cond == NonZero)); m_assembler.testl_rr(reg, mask); return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branchTest32(Condition cond, RegisterID reg, Imm32 mask = Imm32(-1)) + Jump branchTest32(ResultCondition cond, RegisterID reg, TrustedImm32 mask = TrustedImm32(-1)) { - ASSERT((cond == Zero) || (cond == NonZero)); // if we are only interested in the low seven bits, this can be tested with a testb if (mask.m_value == -1) m_assembler.testl_rr(reg, reg); @@ -746,9 +909,8 @@ public: return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branchTest32(Condition cond, Address address, Imm32 mask = Imm32(-1)) + Jump branchTest32(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1)) { - ASSERT((cond == Zero) || (cond == NonZero)); if (mask.m_value == -1) m_assembler.cmpl_im(0, address.offset, address.base); else @@ -756,9 +918,8 @@ public: return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branchTest32(Condition cond, BaseIndex address, Imm32 mask = Imm32(-1)) + Jump branchTest32(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1)) { - ASSERT((cond == Zero) || (cond == NonZero)); if (mask.m_value == -1) m_assembler.cmpl_im(0, address.offset, address.base, address.index, address.scale); else @@ -766,9 +927,21 @@ public: return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branchTest8(Condition cond, Address address, Imm32 mask = Imm32(-1)) + Jump branchTest8(ResultCondition cond, RegisterID reg, TrustedImm32 mask = TrustedImm32(-1)) { - ASSERT((cond == Zero) || (cond == NonZero)); + // Byte in TrustedImm32 is not well defined, so be a little permisive here, but don't accept nonsense values. + ASSERT(mask.m_value >= -128 && mask.m_value <= 255); + if (mask.m_value == -1) + m_assembler.testb_rr(reg, reg); + else + m_assembler.testb_i8r(mask.m_value, reg); + return Jump(m_assembler.jCC(x86Condition(cond))); + } + + Jump branchTest8(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1)) + { + // Byte in TrustedImm32 is not well defined, so be a little permisive here, but don't accept nonsense values. + ASSERT(mask.m_value >= -128 && mask.m_value <= 255); if (mask.m_value == -1) m_assembler.cmpb_im(0, address.offset, address.base); else @@ -776,9 +949,10 @@ public: return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branchTest8(Condition cond, BaseIndex address, Imm32 mask = Imm32(-1)) + Jump branchTest8(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1)) { - ASSERT((cond == Zero) || (cond == NonZero)); + // Byte in TrustedImm32 is not well defined, so be a little permisive here, but don't accept nonsense values. + ASSERT(mask.m_value >= -128 && mask.m_value <= 255); if (mask.m_value == -1) m_assembler.cmpb_im(0, address.offset, address.base, address.index, address.scale); else @@ -813,107 +987,135 @@ public: // * jo operations branch if the (signed) arithmetic // operation caused an overflow to occur. - Jump branchAdd32(Condition cond, RegisterID src, RegisterID dest) + Jump branchAdd32(ResultCondition cond, RegisterID src, RegisterID dest) { - ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); add32(src, dest); return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branchAdd32(Condition cond, Imm32 imm, RegisterID dest) + Jump branchAdd32(ResultCondition cond, TrustedImm32 imm, RegisterID dest) { - ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); add32(imm, dest); return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branchAdd32(Condition cond, Imm32 src, Address dest) + Jump branchAdd32(ResultCondition cond, TrustedImm32 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) + Jump branchAdd32(ResultCondition 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) + Jump branchAdd32(ResultCondition 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) + Jump branchAdd32(ResultCondition cond, RegisterID src1, RegisterID src2, RegisterID dest) + { + if (src1 == dest) + return branchAdd32(cond, src2, dest); + move(src2, dest); + return branchAdd32(cond, src1, dest); + } + + Jump branchAdd32(ResultCondition cond, RegisterID src, TrustedImm32 imm, RegisterID dest) + { + move(src, dest); + return branchAdd32(cond, imm, dest); + } + + Jump branchMul32(ResultCondition cond, RegisterID src, RegisterID dest) { - ASSERT(cond == Overflow); mul32(src, dest); + if (cond != Overflow) + m_assembler.testl_rr(dest, dest); return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branchMul32(Condition cond, Address src, RegisterID dest) + Jump branchMul32(ResultCondition cond, Address src, RegisterID dest) { - ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero)); mul32(src, dest); + if (cond != Overflow) + m_assembler.testl_rr(dest, dest); return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branchMul32(Condition cond, Imm32 imm, RegisterID src, RegisterID dest) + Jump branchMul32(ResultCondition cond, TrustedImm32 imm, RegisterID src, RegisterID dest) { - ASSERT(cond == Overflow); mul32(imm, src, dest); + if (cond != Overflow) + m_assembler.testl_rr(dest, dest); return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branchSub32(Condition cond, RegisterID src, RegisterID dest) + Jump branchMul32(ResultCondition cond, RegisterID src1, RegisterID src2, RegisterID dest) + { + if (src1 == dest) + return branchMul32(cond, src2, dest); + move(src2, dest); + return branchMul32(cond, src1, dest); + } + + Jump branchSub32(ResultCondition cond, RegisterID src, RegisterID dest) { - ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); sub32(src, dest); return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branchSub32(Condition cond, Imm32 imm, RegisterID dest) + Jump branchSub32(ResultCondition cond, TrustedImm32 imm, RegisterID dest) { - ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero)); sub32(imm, dest); return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branchSub32(Condition cond, Imm32 imm, Address dest) + Jump branchSub32(ResultCondition cond, TrustedImm32 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) + Jump branchSub32(ResultCondition 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) + Jump branchSub32(ResultCondition cond, Address src, RegisterID dest) { - ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero)); sub32(src, dest); return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branchNeg32(Condition cond, RegisterID srcDest) + Jump branchSub32(ResultCondition cond, RegisterID src1, RegisterID src2, RegisterID dest) + { + // B := A - B is invalid. + ASSERT(src1 == dest || src2 != dest); + + move(src1, dest); + return branchSub32(cond, src2, dest); + } + + Jump branchSub32(ResultCondition cond, RegisterID src1, TrustedImm32 src2, RegisterID dest) + { + move(src1, dest); + return branchSub32(cond, src2, dest); + } + + Jump branchNeg32(ResultCondition cond, RegisterID srcDest) { - ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero)); neg32(srcDest); return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branchOr32(Condition cond, RegisterID src, RegisterID dest) + Jump branchOr32(ResultCondition cond, RegisterID src, RegisterID dest) { - ASSERT((cond == Signed) || (cond == Zero) || (cond == NonZero)); or32(src, dest); return Jump(m_assembler.jCC(x86Condition(cond))); } @@ -946,35 +1148,14 @@ 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) + void compare32(RelationalCondition cond, RegisterID left, RegisterID right, RegisterID dest) { m_assembler.cmpl_rr(right, left); m_assembler.setCC_r(x86Condition(cond), dest); m_assembler.movzbl_rr(dest, dest); } - void set32(Condition cond, RegisterID left, Imm32 right, RegisterID dest) + void compare32(RelationalCondition cond, RegisterID left, TrustedImm32 right, RegisterID dest) { if (((cond == Equal) || (cond == NotEqual)) && !right.m_value) m_assembler.testl_rr(left, left); @@ -989,7 +1170,7 @@ public: // 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) + void test8(ResultCondition cond, Address address, TrustedImm32 mask, RegisterID dest) { if (mask.m_value == -1) m_assembler.cmpb_im(0, address.offset, address.base); @@ -999,7 +1180,7 @@ public: m_assembler.movzbl_rr(dest, dest); } - void setTest32(Condition cond, Address address, Imm32 mask, RegisterID dest) + void test32(ResultCondition cond, Address address, TrustedImm32 mask, RegisterID dest) { if (mask.m_value == -1) m_assembler.cmpl_im(0, address.offset, address.base); @@ -1009,8 +1190,43 @@ public: m_assembler.movzbl_rr(dest, dest); } + // Invert a relational condition, e.g. == becomes !=, < becomes >=, etc. + static RelationalCondition invert(RelationalCondition cond) + { + return static_cast(cond ^ 1); + } + + // Commute a relational condition, returns a new condition that will produce + // the same results given the same inputs but with their positions exchanged. + static RelationalCondition commute(RelationalCondition cond) + { + // Equality is commutative! + if (cond == Equal || cond == NotEqual) + return cond; + + // Based on the values of x86 condition codes, remap > with < and >= with <= + if (cond >= LessThan) { + ASSERT(cond == LessThan || cond == LessThanOrEqual || cond == GreaterThan || cond == GreaterThanOrEqual); + return static_cast(X86Assembler::ConditionL + X86Assembler::ConditionG - cond); + } + + // As above, for unsigned conditions. + ASSERT(cond == Below || cond == BelowOrEqual || cond == Above || cond == AboveOrEqual); + return static_cast(X86Assembler::ConditionB + X86Assembler::ConditionA - cond); + } + + void nop() + { + m_assembler.nop(); + } + protected: - X86Assembler::Condition x86Condition(Condition cond) + X86Assembler::Condition x86Condition(RelationalCondition cond) + { + return static_cast(cond); + } + + X86Assembler::Condition x86Condition(ResultCondition cond) { return static_cast(cond); } diff --git a/assembler/MacroAssemblerX86_64.h b/assembler/MacroAssemblerX86_64.h index 168c93f..b95bc2e 100644 --- a/assembler/MacroAssemblerX86_64.h +++ b/assembler/MacroAssemblerX86_64.h @@ -48,30 +48,31 @@ public: using MacroAssemblerX86Common::load32; using MacroAssemblerX86Common::store32; using MacroAssemblerX86Common::call; + using MacroAssemblerX86Common::addDouble; using MacroAssemblerX86Common::loadDouble; using MacroAssemblerX86Common::convertInt32ToDouble; - void add32(Imm32 imm, AbsoluteAddress address) + void add32(TrustedImm32 imm, AbsoluteAddress address) { - move(ImmPtr(address.m_ptr), scratchRegister); + move(TrustedImmPtr(address.m_ptr), scratchRegister); add32(imm, Address(scratchRegister)); } - void and32(Imm32 imm, AbsoluteAddress address) + void and32(TrustedImm32 imm, AbsoluteAddress address) { - move(ImmPtr(address.m_ptr), scratchRegister); + move(TrustedImmPtr(address.m_ptr), scratchRegister); and32(imm, Address(scratchRegister)); } - void or32(Imm32 imm, AbsoluteAddress address) + void or32(TrustedImm32 imm, AbsoluteAddress address) { - move(ImmPtr(address.m_ptr), scratchRegister); + move(TrustedImmPtr(address.m_ptr), scratchRegister); or32(imm, Address(scratchRegister)); } - void sub32(Imm32 imm, AbsoluteAddress address) + void sub32(TrustedImm32 imm, AbsoluteAddress address) { - move(ImmPtr(address.m_ptr), scratchRegister); + move(TrustedImmPtr(address.m_ptr), scratchRegister); sub32(imm, Address(scratchRegister)); } @@ -88,17 +89,23 @@ public: void loadDouble(const void* address, FPRegisterID dest) { - move(ImmPtr(address), scratchRegister); + move(TrustedImmPtr(address), scratchRegister); loadDouble(scratchRegister, dest); } - void convertInt32ToDouble(AbsoluteAddress src, FPRegisterID dest) + void addDouble(AbsoluteAddress address, FPRegisterID dest) { - move(Imm32(*static_cast(src.m_ptr)), scratchRegister); + move(TrustedImmPtr(address.m_ptr), scratchRegister); + m_assembler.addsd_mr(0, scratchRegister, dest); + } + + void convertInt32ToDouble(TrustedImm32 imm, FPRegisterID dest) + { + move(imm, scratchRegister); m_assembler.cvtsi2sd_rr(scratchRegister, dest); } - void store32(Imm32 imm, void* address) + void store32(TrustedImm32 imm, void* address) { move(X86Registers::eax, scratchRegister); move(imm, X86Registers::eax); @@ -108,26 +115,26 @@ public: Call call() { - DataLabelPtr label = moveWithPatch(ImmPtr(0), scratchRegister); + DataLabelPtr label = moveWithPatch(TrustedImmPtr(0), scratchRegister); Call result = Call(m_assembler.call(scratchRegister), Call::Linkable); - ASSERT(differenceBetween(label, result) == REPTACH_OFFSET_CALL_R11); + ASSERT_UNUSED(label, differenceBetween(label, result) == REPTACH_OFFSET_CALL_R11); return result; } Call tailRecursiveCall() { - DataLabelPtr label = moveWithPatch(ImmPtr(0), scratchRegister); + DataLabelPtr label = moveWithPatch(TrustedImmPtr(0), scratchRegister); Jump newJump = Jump(m_assembler.jmp_r(scratchRegister)); - ASSERT(differenceBetween(label, newJump) == REPTACH_OFFSET_CALL_R11); + ASSERT_UNUSED(label, differenceBetween(label, newJump) == REPTACH_OFFSET_CALL_R11); return Call::fromTailJump(newJump); } Call makeTailRecursiveCall(Jump oldJump) { oldJump.link(this); - DataLabelPtr label = moveWithPatch(ImmPtr(0), scratchRegister); + DataLabelPtr label = moveWithPatch(TrustedImmPtr(0), scratchRegister); Jump newJump = Jump(m_assembler.jmp_r(scratchRegister)); - ASSERT(differenceBetween(label, newJump) == REPTACH_OFFSET_CALL_R11); + ASSERT_UNUSED(label, differenceBetween(label, newJump) == REPTACH_OFFSET_CALL_R11); return Call::fromTailJump(newJump); } @@ -137,30 +144,30 @@ public: m_assembler.addq_rr(src, dest); } - void addPtr(Imm32 imm, RegisterID srcDest) + void addPtr(TrustedImm32 imm, RegisterID srcDest) { m_assembler.addq_ir(imm.m_value, srcDest); } - void addPtr(ImmPtr imm, RegisterID dest) + void addPtr(TrustedImmPtr imm, RegisterID dest) { move(imm, scratchRegister); m_assembler.addq_rr(scratchRegister, dest); } - void addPtr(Imm32 imm, RegisterID src, RegisterID dest) + void addPtr(TrustedImm32 imm, RegisterID src, RegisterID dest) { m_assembler.leaq_mr(imm.m_value, src, dest); } - void addPtr(Imm32 imm, Address address) + void addPtr(TrustedImm32 imm, Address address) { m_assembler.addq_im(imm.m_value, address.offset, address.base); } - void addPtr(Imm32 imm, AbsoluteAddress address) + void addPtr(TrustedImm32 imm, AbsoluteAddress address) { - move(ImmPtr(address.m_ptr), scratchRegister); + move(TrustedImmPtr(address.m_ptr), scratchRegister); addPtr(imm, Address(scratchRegister)); } @@ -169,7 +176,7 @@ public: m_assembler.andq_rr(src, dest); } - void andPtr(Imm32 imm, RegisterID srcDest) + void andPtr(TrustedImm32 imm, RegisterID srcDest) { m_assembler.andq_ir(imm.m_value, srcDest); } @@ -179,28 +186,46 @@ public: m_assembler.orq_rr(src, dest); } - void orPtr(ImmPtr imm, RegisterID dest) + void orPtr(TrustedImmPtr imm, RegisterID dest) { move(imm, scratchRegister); m_assembler.orq_rr(scratchRegister, dest); } - void orPtr(Imm32 imm, RegisterID dest) + void orPtr(TrustedImm32 imm, RegisterID dest) { m_assembler.orq_ir(imm.m_value, dest); } + void orPtr(RegisterID op1, RegisterID op2, RegisterID dest) + { + if (op1 == op2) + move(op1, dest); + else if (op1 == dest) + orPtr(op2, dest); + else { + move(op2, dest); + orPtr(op1, dest); + } + } + + void orPtr(TrustedImm32 imm, RegisterID src, RegisterID dest) + { + move(src, dest); + orPtr(imm, dest); + } + void subPtr(RegisterID src, RegisterID dest) { m_assembler.subq_rr(src, dest); } - void subPtr(Imm32 imm, RegisterID dest) + void subPtr(TrustedImm32 imm, RegisterID dest) { m_assembler.subq_ir(imm.m_value, dest); } - void subPtr(ImmPtr imm, RegisterID dest) + void subPtr(TrustedImmPtr imm, RegisterID dest) { move(imm, scratchRegister); m_assembler.subq_rr(scratchRegister, dest); @@ -211,7 +236,7 @@ public: m_assembler.xorq_rr(src, dest); } - void xorPtr(Imm32 imm, RegisterID srcDest) + void xorPtr(TrustedImm32 imm, RegisterID srcDest) { m_assembler.xorq_ir(imm.m_value, srcDest); } @@ -227,7 +252,7 @@ public: m_assembler.movq_mr(address.offset, address.base, address.index, address.scale, dest); } - void loadPtr(void* address, RegisterID dest) + void loadPtr(const void* address, RegisterID dest) { if (dest == X86Registers::eax) m_assembler.movq_mEAX(address); @@ -243,6 +268,12 @@ public: m_assembler.movq_mr_disp32(address.offset, address.base, dest); return DataLabel32(this); } + + DataLabelCompact loadPtrWithCompactAddressOffsetPatch(Address address, RegisterID dest) + { + m_assembler.movq_mr_disp8(address.offset, address.base, dest); + return DataLabelCompact(this); + } void storePtr(RegisterID src, ImplicitAddress address) { @@ -265,7 +296,7 @@ public: } } - void storePtr(ImmPtr imm, ImplicitAddress address) + void storePtr(TrustedImmPtr imm, ImplicitAddress address) { move(imm, scratchRegister); storePtr(scratchRegister, address); @@ -287,7 +318,7 @@ public: m_assembler.movq_rr(src, dest); } - void setPtr(Condition cond, RegisterID left, Imm32 right, RegisterID dest) + void comparePtr(RelationalCondition cond, RegisterID left, TrustedImm32 right, RegisterID dest) { if (((cond == Equal) || (cond == NotEqual)) && !right.m_value) m_assembler.testq_rr(left, left); @@ -297,49 +328,49 @@ public: m_assembler.movzbl_rr(dest, dest); } - Jump branchPtr(Condition cond, RegisterID left, RegisterID right) + Jump branchPtr(RelationalCondition cond, RegisterID left, RegisterID right) { m_assembler.cmpq_rr(right, left); return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branchPtr(Condition cond, RegisterID left, ImmPtr right) + Jump branchPtr(RelationalCondition cond, RegisterID left, TrustedImmPtr right) { move(right, scratchRegister); return branchPtr(cond, left, scratchRegister); } - Jump branchPtr(Condition cond, RegisterID left, Address right) + Jump branchPtr(RelationalCondition cond, RegisterID left, Address right) { m_assembler.cmpq_mr(right.offset, right.base, left); return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branchPtr(Condition cond, AbsoluteAddress left, RegisterID right) + Jump branchPtr(RelationalCondition cond, AbsoluteAddress left, RegisterID right) { - move(ImmPtr(left.m_ptr), scratchRegister); + move(TrustedImmPtr(left.m_ptr), scratchRegister); return branchPtr(cond, Address(scratchRegister), right); } - Jump branchPtr(Condition cond, Address left, RegisterID right) + Jump branchPtr(RelationalCondition cond, Address left, RegisterID right) { m_assembler.cmpq_rm(right, left.offset, left.base); return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branchPtr(Condition cond, Address left, ImmPtr right) + Jump branchPtr(RelationalCondition cond, Address left, TrustedImmPtr right) { move(right, scratchRegister); return branchPtr(cond, left, scratchRegister); } - Jump branchTestPtr(Condition cond, RegisterID reg, RegisterID mask) + Jump branchTestPtr(ResultCondition cond, RegisterID reg, RegisterID mask) { m_assembler.testq_rr(reg, mask); return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branchTestPtr(Condition cond, RegisterID reg, Imm32 mask = Imm32(-1)) + Jump branchTestPtr(ResultCondition cond, RegisterID reg, TrustedImm32 mask = TrustedImm32(-1)) { // if we are only interested in the low seven bits, this can be tested with a testb if (mask.m_value == -1) @@ -351,7 +382,13 @@ public: return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branchTestPtr(Condition cond, Address address, Imm32 mask = Imm32(-1)) + Jump branchTestPtr(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1)) + { + loadPtr(address.m_ptr, scratchRegister); + return branchTestPtr(cond, scratchRegister, mask); + } + + Jump branchTestPtr(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1)) { if (mask.m_value == -1) m_assembler.cmpq_im(0, address.offset, address.base); @@ -360,7 +397,7 @@ public: return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branchTestPtr(Condition cond, BaseIndex address, Imm32 mask = Imm32(-1)) + Jump branchTestPtr(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1)) { if (mask.m_value == -1) m_assembler.cmpq_im(0, address.offset, address.base, address.index, address.scale); @@ -370,39 +407,37 @@ public: } - Jump branchAddPtr(Condition cond, RegisterID src, RegisterID dest) + Jump branchAddPtr(ResultCondition cond, RegisterID src, RegisterID dest) { - ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero)); addPtr(src, dest); return Jump(m_assembler.jCC(x86Condition(cond))); } - Jump branchSubPtr(Condition cond, Imm32 imm, RegisterID dest) + Jump branchSubPtr(ResultCondition cond, TrustedImm32 imm, RegisterID dest) { - ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero)); subPtr(imm, dest); return Jump(m_assembler.jCC(x86Condition(cond))); } - DataLabelPtr moveWithPatch(ImmPtr initialValue, RegisterID dest) + DataLabelPtr moveWithPatch(TrustedImmPtr initialValue, RegisterID dest) { m_assembler.movq_i64r(initialValue.asIntptr(), dest); return DataLabelPtr(this); } - Jump branchPtrWithPatch(Condition cond, RegisterID left, DataLabelPtr& dataLabel, ImmPtr initialRightValue = ImmPtr(0)) + Jump branchPtrWithPatch(RelationalCondition cond, RegisterID left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0)) { dataLabel = moveWithPatch(initialRightValue, scratchRegister); return branchPtr(cond, left, scratchRegister); } - Jump branchPtrWithPatch(Condition cond, Address left, DataLabelPtr& dataLabel, ImmPtr initialRightValue = ImmPtr(0)) + Jump branchPtrWithPatch(RelationalCondition cond, Address left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0)) { dataLabel = moveWithPatch(initialRightValue, scratchRegister); return branchPtr(cond, left, scratchRegister); } - DataLabelPtr storePtrWithPatch(ImmPtr initialValue, ImplicitAddress address) + DataLabelPtr storePtrWithPatch(TrustedImmPtr initialValue, ImplicitAddress address) { DataLabelPtr label = moveWithPatch(initialValue, scratchRegister); storePtr(scratchRegister, address); @@ -410,20 +445,13 @@ public: } using MacroAssemblerX86Common::branchTest8; - Jump branchTest8(Condition cond, ExtendedAddress address, Imm32 mask = Imm32(-1)) + Jump branchTest8(ResultCondition cond, ExtendedAddress address, TrustedImm32 mask = TrustedImm32(-1)) { - ImmPtr addr(reinterpret_cast(address.offset)); + TrustedImmPtr addr(reinterpret_cast(address.offset)); MacroAssemblerX86Common::move(addr, scratchRegister); return MacroAssemblerX86Common::branchTest8(cond, BaseIndex(scratchRegister, address.base, TimesOne), mask); } - Label loadPtrWithPatchToLEA(Address address, RegisterID dest) - { - Label label(this); - loadPtr(address, dest); - return label; - } - bool supportsFloatingPoint() const { return true; } // See comment on MacroAssemblerARMv7::supportsFloatingPointTruncate() bool supportsFloatingPointTruncate() const { return true; } @@ -436,7 +464,7 @@ private: 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()); + X86Assembler::linkPointer(code, call.m_jmp.labelAtOffset(-REPTACH_OFFSET_CALL_R11), function.value()); else X86Assembler::linkCall(code, call.m_jmp, function.value()); } diff --git a/assembler/RepatchBuffer.h b/assembler/RepatchBuffer.h index 72cf6b2..6ea6d8d 100644 --- a/assembler/RepatchBuffer.h +++ b/assembler/RepatchBuffer.h @@ -87,14 +87,14 @@ public: MacroAssembler::repatchInt32(dataLabel32, value); } - void repatch(CodeLocationDataLabelPtr dataLabelPtr, void* value) + void repatch(CodeLocationDataLabelCompact dataLabelCompact, int32_t value) { - MacroAssembler::repatchPointer(dataLabelPtr, value); + MacroAssembler::repatchCompact(dataLabelCompact, value); } - void repatchLoadPtrToLEA(CodeLocationInstruction instruction) + void repatch(CodeLocationDataLabelPtr dataLabelPtr, void* value) { - MacroAssembler::repatchLoadPtrToLEA(instruction); + MacroAssembler::repatchPointer(dataLabelPtr, value); } void relinkCallerToTrampoline(ReturnAddressPtr returnAddress, CodeLocationLabel label) diff --git a/assembler/SH4Assembler.h b/assembler/SH4Assembler.h new file mode 100644 index 0000000..1d089e5 --- /dev/null +++ b/assembler/SH4Assembler.h @@ -0,0 +1,2026 @@ +/* + * Copyright (C) 2009-2011 STMicroelectronics. All rights reserved. + * Copyright (C) 2008 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SH4Assembler_h +#define SH4Assembler_h + +#if ENABLE(ASSEMBLER) && CPU(SH4) + +#include "AssemblerBuffer.h" +#include "AssemblerBufferWithConstantPool.h" +#include +#include +#include +#include + +#ifndef NDEBUG +#define SH4_ASSEMBLER_TRACING +#endif + +namespace JSC { +typedef uint16_t SH4Word; + +enum { + INVALID_OPCODE = 0xffff, + ADD_OPCODE = 0x300c, + ADDIMM_OPCODE = 0x7000, + ADDC_OPCODE = 0x300e, + ADDV_OPCODE = 0x300f, + AND_OPCODE = 0x2009, + ANDIMM_OPCODE = 0xc900, + DIV0_OPCODE = 0x2007, + DIV1_OPCODE = 0x3004, + BF_OPCODE = 0x8b00, + BFS_OPCODE = 0x8f00, + BRA_OPCODE = 0xa000, + BRAF_OPCODE = 0x0023, + NOP_OPCODE = 0x0009, + BSR_OPCODE = 0xb000, + RTS_OPCODE = 0x000b, + BT_OPCODE = 0x8900, + BTS_OPCODE = 0x8d00, + BSRF_OPCODE = 0x0003, + BRK_OPCODE = 0x003b, + FTRC_OPCODE = 0xf03d, + CMPEQ_OPCODE = 0x3000, + CMPEQIMM_OPCODE = 0x8800, + CMPGE_OPCODE = 0x3003, + CMPGT_OPCODE = 0x3007, + CMPHI_OPCODE = 0x3006, + CMPHS_OPCODE = 0x3002, + CMPPL_OPCODE = 0x4015, + CMPPZ_OPCODE = 0x4011, + CMPSTR_OPCODE = 0x200c, + DT_OPCODE = 0x4010, + FCMPEQ_OPCODE = 0xf004, + FCMPGT_OPCODE = 0xf005, + FMOV_OPCODE = 0xf00c, + FADD_OPCODE = 0xf000, + FMUL_OPCODE = 0xf002, + FSUB_OPCODE = 0xf001, + FDIV_OPCODE = 0xf003, + FNEG_OPCODE = 0xf04d, + JMP_OPCODE = 0x402b, + JSR_OPCODE = 0x400b, + LDSPR_OPCODE = 0x402a, + LDSLPR_OPCODE = 0x4026, + MOV_OPCODE = 0x6003, + MOVIMM_OPCODE = 0xe000, + MOVB_WRITE_RN_OPCODE = 0x2000, + MOVB_WRITE_RNDEC_OPCODE = 0x2004, + MOVB_WRITE_R0RN_OPCODE = 0x0004, + MOVB_WRITE_OFFGBR_OPCODE = 0xc000, + MOVB_WRITE_OFFRN_OPCODE = 0x8000, + MOVB_READ_RM_OPCODE = 0x6000, + MOVB_READ_RMINC_OPCODE = 0x6004, + MOVB_READ_R0RM_OPCODE = 0x000c, + MOVB_READ_OFFGBR_OPCODE = 0xc400, + MOVB_READ_OFFRM_OPCODE = 0x8400, + MOVL_WRITE_RN_OPCODE = 0x2002, + MOVL_WRITE_RNDEC_OPCODE = 0x2006, + MOVL_WRITE_R0RN_OPCODE = 0x0006, + MOVL_WRITE_OFFGBR_OPCODE = 0xc200, + MOVL_WRITE_OFFRN_OPCODE = 0x1000, + MOVL_READ_RM_OPCODE = 0x6002, + MOVL_READ_RMINC_OPCODE = 0x6006, + MOVL_READ_R0RM_OPCODE = 0x000e, + MOVL_READ_OFFGBR_OPCODE = 0xc600, + MOVL_READ_OFFPC_OPCODE = 0xd000, + MOVL_READ_OFFRM_OPCODE = 0x5000, + MOVW_WRITE_RN_OPCODE = 0x2001, + MOVW_READ_RM_OPCODE = 0x6001, + MOVW_READ_R0RM_OPCODE = 0x000d, + MOVW_READ_OFFRM_OPCODE = 0x8500, + MOVW_READ_OFFPC_OPCODE = 0x9000, + MOVA_READ_OFFPC_OPCODE = 0xc700, + MOVT_OPCODE = 0x0029, + MULL_OPCODE = 0x0007, + DMULL_L_OPCODE = 0x3005, + STSMACL_OPCODE = 0x001a, + STSMACH_OPCODE = 0x000a, + DMULSL_OPCODE = 0x300d, + NEG_OPCODE = 0x600b, + NEGC_OPCODE = 0x600a, + NOT_OPCODE = 0x6007, + OR_OPCODE = 0x200b, + ORIMM_OPCODE = 0xcb00, + ORBIMM_OPCODE = 0xcf00, + SETS_OPCODE = 0x0058, + SETT_OPCODE = 0x0018, + SHAD_OPCODE = 0x400c, + SHAL_OPCODE = 0x4020, + SHAR_OPCODE = 0x4021, + SHLD_OPCODE = 0x400d, + SHLL_OPCODE = 0x4000, + SHLL2_OPCODE = 0x4008, + SHLL8_OPCODE = 0x4018, + SHLL16_OPCODE = 0x4028, + SHLR_OPCODE = 0x4001, + SHLR2_OPCODE = 0x4009, + SHLR8_OPCODE = 0x4019, + SHLR16_OPCODE = 0x4029, + STSPR_OPCODE = 0x002a, + STSLPR_OPCODE = 0x4022, + FLOAT_OPCODE = 0xf02d, + SUB_OPCODE = 0x3008, + SUBC_OPCODE = 0x300a, + SUBV_OPCODE = 0x300b, + TST_OPCODE = 0x2008, + TSTIMM_OPCODE = 0xc800, + TSTB_OPCODE = 0xcc00, + EXTUW_OPCODE = 0x600d, + XOR_OPCODE = 0x200a, + XORIMM_OPCODE = 0xca00, + XORB_OPCODE = 0xce00, + FMOVS_READ_RM_INC_OPCODE = 0xf009, + FMOVS_READ_RM_OPCODE = 0xf008, + FMOVS_READ_R0RM_OPCODE = 0xf006, + FMOVS_WRITE_RN_OPCODE = 0xf00a, + FMOVS_WRITE_RN_DEC_OPCODE = 0xf00b, + FMOVS_WRITE_R0RN_OPCODE = 0xf007, + FCNVDS_DRM_FPUL_OPCODE = 0xf0bd, + LDS_RM_FPUL_OPCODE = 0x405a, + FLDS_FRM_FPUL_OPCODE = 0xf01d, + STS_FPUL_RN_OPCODE = 0x005a, + FSTS_FPUL_FRN_OPCODE = 0xF00d, + LDSFPSCR_OPCODE = 0x406a, + STSFPSCR_OPCODE = 0x006a, + LDSRMFPUL_OPCODE = 0x405a, + FSTSFPULFRN_OPCODE = 0xf00d, + FSQRT_OPCODE = 0xf06d, + FSCHG_OPCODE = 0xf3fd, + CLRT_OPCODE = 8, +}; + +namespace SH4Registers { +typedef enum { + r0, + r1, + r2, + r3, + r4, + r5, + r6, + r7, + r8, + r9, + r10, + r11, + r12, + r13, + r14, fp = r14, + r15, sp = r15, + pc, + pr, +} RegisterID; + +typedef enum { + fr0, dr0 = fr0, + fr1, + fr2, dr2 = fr2, + fr3, + fr4, dr4 = fr4, + fr5, + fr6, dr6 = fr6, + fr7, + fr8, dr8 = fr8, + fr9, + fr10, dr10 = fr10, + fr11, + fr12, dr12 = fr12, + fr13, + fr14, dr14 = fr14, + fr15, +} FPRegisterID; +} + +inline uint16_t getOpcodeGroup1(uint16_t opc, int rm, int rn) +{ + return (opc | ((rm & 0xf) << 8) | ((rn & 0xf) << 4)); +} + +inline uint16_t getOpcodeGroup2(uint16_t opc, int rm) +{ + return (opc | ((rm & 0xf) << 8)); +} + +inline uint16_t getOpcodeGroup3(uint16_t opc, int rm, int rn) +{ + return (opc | ((rm & 0xf) << 8) | (rn & 0xff)); +} + +inline uint16_t getOpcodeGroup4(uint16_t opc, int rm, int rn, int offset) +{ + return (opc | ((rm & 0xf) << 8) | ((rn & 0xf) << 4) | (offset & 0xf)); +} + +inline uint16_t getOpcodeGroup5(uint16_t opc, int rm) +{ + return (opc | (rm & 0xff)); +} + +inline uint16_t getOpcodeGroup6(uint16_t opc, int rm) +{ + return (opc | (rm & 0xfff)); +} + +inline uint16_t getOpcodeGroup7(uint16_t opc, int rm) +{ + return (opc | ((rm & 0x7) << 9)); +} + +inline uint16_t getOpcodeGroup8(uint16_t opc, int rm, int rn) +{ + return (opc | ((rm & 0x7) << 9) | ((rn & 0x7) << 5)); +} + +inline uint16_t getOpcodeGroup9(uint16_t opc, int rm, int rn) +{ + return (opc | ((rm & 0xf) << 8) | ((rn & 0x7) << 5)); +} + +inline uint16_t getOpcodeGroup10(uint16_t opc, int rm, int rn) +{ + return (opc | ((rm & 0x7) << 9) | ((rn & 0xf) << 4)); +} + +inline uint16_t getOpcodeGroup11(uint16_t opc, int rm, int rn) +{ + return (opc | ((rm & 0xf) << 4) | (rn & 0xf)); +} + +inline uint16_t getRn(uint16_t x) +{ + return ((x & 0xf00) >> 8); +} + +inline uint16_t getRm(uint16_t x) +{ + return ((x & 0xf0) >> 4); +} + +inline uint16_t getDisp(uint16_t x) +{ + return (x & 0xf); +} + +inline uint16_t getImm8(uint16_t x) +{ + return (x & 0xff); +} + +inline uint16_t getImm12(uint16_t x) +{ + return (x & 0xfff); +} + +inline uint16_t getDRn(uint16_t x) +{ + return ((x & 0xe00) >> 9); +} + +inline uint16_t getDRm(uint16_t x) +{ + return ((x & 0xe0) >> 5); +} + +class SH4Assembler { +public: + typedef SH4Registers::RegisterID RegisterID; + typedef SH4Registers::FPRegisterID FPRegisterID; + typedef AssemblerBufferWithConstantPool<512, 4, 2, SH4Assembler> SH4Buffer; + static const RegisterID scratchReg1 = SH4Registers::r3; + static const RegisterID scratchReg2 = SH4Registers::r11; + static const uint32_t maxInstructionSize = 16; + + enum { + padForAlign8 = 0x00, + padForAlign16 = 0x0009, + padForAlign32 = 0x00090009, + }; + + SH4Assembler() + { + m_claimscratchReg = 0x0; + } + + // SH4 condition codes + typedef enum { + EQ = 0x0, // Equal + NE = 0x1, // Not Equal + HS = 0x2, // Unsigend Greater Than equal + HI = 0x3, // Unsigend Greater Than + LS = 0x4, // Unsigend Lower or Same + LI = 0x5, // Unsigend Lower + GE = 0x6, // Greater or Equal + LT = 0x7, // Less Than + GT = 0x8, // Greater Than + LE = 0x9, // Less or Equal + OF = 0xa, // OverFlow + SI = 0xb, // Signed + EQU= 0xc, // Equal or unordered(NaN) + NEU= 0xd, + GTU= 0xe, + GEU= 0xf, + LTU= 0x10, + LEU= 0x11, + } Condition; + + // Opaque label types +public: + bool isImmediate(int constant) + { + return ((constant <= 127) && (constant >= -128)); + } + + RegisterID claimScratch() + { + ASSERT((m_claimscratchReg != 0x3)); + + if (!(m_claimscratchReg & 0x1)) { + m_claimscratchReg = (m_claimscratchReg | 0x1); + return scratchReg1; + } + + m_claimscratchReg = (m_claimscratchReg | 0x2); + return scratchReg2; + } + + void releaseScratch(RegisterID scratchR) + { + if (scratchR == scratchReg1) + m_claimscratchReg = (m_claimscratchReg & 0x2); + else + m_claimscratchReg = (m_claimscratchReg & 0x1); + } + + // Stack operations + + void pushReg(RegisterID reg) + { + if (reg == SH4Registers::pr) { + oneShortOp(getOpcodeGroup2(STSLPR_OPCODE, SH4Registers::sp)); + return; + } + + oneShortOp(getOpcodeGroup1(MOVL_WRITE_RNDEC_OPCODE, SH4Registers::sp, reg)); + } + + void popReg(RegisterID reg) + { + if (reg == SH4Registers::pr) { + oneShortOp(getOpcodeGroup2(LDSLPR_OPCODE, SH4Registers::sp)); + return; + } + + oneShortOp(getOpcodeGroup1(MOVL_READ_RMINC_OPCODE, reg, SH4Registers::sp)); + } + + void movt(RegisterID dst) + { + uint16_t opc = getOpcodeGroup2(MOVT_OPCODE, dst); + oneShortOp(opc); + } + + // Arithmetic operations + + void addlRegReg(RegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(ADD_OPCODE, dst, src); + oneShortOp(opc); + } + + void addclRegReg(RegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(ADDC_OPCODE, dst, src); + oneShortOp(opc); + } + + void addvlRegReg(RegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(ADDV_OPCODE, dst, src); + oneShortOp(opc); + } + + void addlImm8r(int imm8, RegisterID dst) + { + ASSERT((imm8 <= 127) && (imm8 >= -128)); + + uint16_t opc = getOpcodeGroup3(ADDIMM_OPCODE, dst, imm8); + oneShortOp(opc); + } + + void andlRegReg(RegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(AND_OPCODE, dst, src); + oneShortOp(opc); + } + + void andlImm8r(int imm8, RegisterID dst) + { + ASSERT((imm8 <= 255) && (imm8 >= 0)); + ASSERT(dst == SH4Registers::r0); + + uint16_t opc = getOpcodeGroup5(ANDIMM_OPCODE, imm8); + oneShortOp(opc); + } + + void div1lRegReg(RegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(DIV1_OPCODE, dst, src); + oneShortOp(opc); + } + + void div0lRegReg(RegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(DIV0_OPCODE, dst, src); + oneShortOp(opc); + } + + void notlReg(RegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(NOT_OPCODE, dst, src); + oneShortOp(opc); + } + + void orlRegReg(RegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(OR_OPCODE, dst, src); + oneShortOp(opc); + } + + void orlImm8r(int imm8, RegisterID dst) + { + ASSERT((imm8 <= 255) && (imm8 >= 0)); + ASSERT(dst == SH4Registers::r0); + + uint16_t opc = getOpcodeGroup5(ORIMM_OPCODE, imm8); + oneShortOp(opc); + } + + void sublRegReg(RegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(SUB_OPCODE, dst, src); + oneShortOp(opc); + } + + void subvlRegReg(RegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(SUBV_OPCODE, dst, src); + oneShortOp(opc); + } + + void xorlRegReg(RegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(XOR_OPCODE, dst, src); + oneShortOp(opc); + } + + void xorlImm8r(int imm8, RegisterID dst) + { + ASSERT((imm8 <= 255) && (imm8 >= 0)); + ASSERT(dst == SH4Registers::r0); + + uint16_t opc = getOpcodeGroup5(XORIMM_OPCODE, imm8); + oneShortOp(opc); + } + + void shllImm8r(int imm, RegisterID dst) + { + switch (imm) { + case 1: + oneShortOp(getOpcodeGroup2(SHLL_OPCODE, dst)); + break; + case 2: + oneShortOp(getOpcodeGroup2(SHLL2_OPCODE, dst)); + break; + case 8: + oneShortOp(getOpcodeGroup2(SHLL8_OPCODE, dst)); + break; + case 16: + oneShortOp(getOpcodeGroup2(SHLL16_OPCODE, dst)); + break; + default: + ASSERT_NOT_REACHED(); + } + } + + void neg(RegisterID dst, RegisterID src) + { + uint16_t opc = getOpcodeGroup1(NEG_OPCODE, dst, src); + oneShortOp(opc); + } + + void shllRegReg(RegisterID dst, RegisterID rShift) + { + uint16_t opc = getOpcodeGroup1(SHLD_OPCODE, dst, rShift); + oneShortOp(opc); + } + + void shlrRegReg(RegisterID dst, RegisterID rShift) + { + neg(rShift, rShift); + shllRegReg(dst, rShift); + } + + void sharRegReg(RegisterID dst, RegisterID rShift) + { + neg(rShift, rShift); + shaRegReg(dst, rShift); + } + + void shaRegReg(RegisterID dst, RegisterID rShift) + { + uint16_t opc = getOpcodeGroup1(SHAD_OPCODE, dst, rShift); + oneShortOp(opc); + } + + void shlrImm8r(int imm, RegisterID dst) + { + switch (imm) { + case 1: + oneShortOp(getOpcodeGroup2(SHLR_OPCODE, dst)); + break; + case 2: + oneShortOp(getOpcodeGroup2(SHLR2_OPCODE, dst)); + break; + case 8: + oneShortOp(getOpcodeGroup2(SHLR8_OPCODE, dst)); + break; + case 16: + oneShortOp(getOpcodeGroup2(SHLR16_OPCODE, dst)); + break; + default: + ASSERT_NOT_REACHED(); + } + } + + void imullRegReg(RegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(MULL_OPCODE, dst, src); + oneShortOp(opc); + } + + void dmullRegReg(RegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(DMULL_L_OPCODE, dst, src); + oneShortOp(opc); + } + + void dmulslRegReg(RegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(DMULSL_OPCODE, dst, src); + oneShortOp(opc); + } + + void stsmacl(RegisterID reg) + { + uint16_t opc = getOpcodeGroup2(STSMACL_OPCODE, reg); + oneShortOp(opc); + } + + void stsmach(RegisterID reg) + { + uint16_t opc = getOpcodeGroup2(STSMACH_OPCODE, reg); + oneShortOp(opc); + } + + // Comparisons + + void cmplRegReg(RegisterID left, RegisterID right, Condition cond) + { + switch (cond) { + case NE: + oneShortOp(getOpcodeGroup1(CMPEQ_OPCODE, right, left)); + break; + case GT: + oneShortOp(getOpcodeGroup1(CMPGT_OPCODE, right, left)); + break; + case EQ: + oneShortOp(getOpcodeGroup1(CMPEQ_OPCODE, right, left)); + break; + case GE: + oneShortOp(getOpcodeGroup1(CMPGE_OPCODE, right, left)); + break; + case HS: + oneShortOp(getOpcodeGroup1(CMPHS_OPCODE, right, left)); + break; + case HI: + oneShortOp(getOpcodeGroup1(CMPHI_OPCODE, right, left)); + break; + case LI: + oneShortOp(getOpcodeGroup1(CMPHI_OPCODE, left, right)); + break; + case LS: + oneShortOp(getOpcodeGroup1(CMPHS_OPCODE, left, right)); + break; + case LE: + oneShortOp(getOpcodeGroup1(CMPGE_OPCODE, left, right)); + break; + case LT: + oneShortOp(getOpcodeGroup1(CMPGT_OPCODE, left, right)); + break; + default: + ASSERT_NOT_REACHED(); + } + } + + void cmppl(RegisterID reg) + { + uint16_t opc = getOpcodeGroup2(CMPPL_OPCODE, reg); + oneShortOp(opc); + } + + void cmppz(RegisterID reg) + { + uint16_t opc = getOpcodeGroup2(CMPPZ_OPCODE, reg); + oneShortOp(opc); + } + + void cmpEqImmR0(int imm, RegisterID dst) + { + uint16_t opc = getOpcodeGroup5(CMPEQIMM_OPCODE, imm); + oneShortOp(opc); + } + + void testlRegReg(RegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(TST_OPCODE, dst, src); + oneShortOp(opc); + } + + void testlImm8r(int imm, RegisterID dst) + { + ASSERT((dst == SH4Registers::r0) && (imm <= 255) && (imm >= 0)); + + uint16_t opc = getOpcodeGroup5(TSTIMM_OPCODE, imm); + oneShortOp(opc); + } + + void nop() + { + oneShortOp(NOP_OPCODE, false); + } + + void sett() + { + oneShortOp(SETT_OPCODE); + } + + void clrt() + { + oneShortOp(CLRT_OPCODE); + } + + void fschg() + { + oneShortOp(FSCHG_OPCODE); + } + + void bkpt() + { + oneShortOp(BRK_OPCODE, false); + } + + void branch(uint16_t opc, int label) + { + switch (opc) { + case BT_OPCODE: + ASSERT((label <= 127) && (label >= -128)); + oneShortOp(getOpcodeGroup5(BT_OPCODE, label)); + break; + case BRA_OPCODE: + ASSERT((label <= 2047) && (label >= -2048)); + oneShortOp(getOpcodeGroup6(BRA_OPCODE, label)); + break; + case BF_OPCODE: + ASSERT((label <= 127) && (label >= -128)); + oneShortOp(getOpcodeGroup5(BF_OPCODE, label)); + break; + default: + ASSERT_NOT_REACHED(); + } + } + + void branch(uint16_t opc, RegisterID reg) + { + switch (opc) { + case BRAF_OPCODE: + oneShortOp(getOpcodeGroup2(BRAF_OPCODE, reg)); + break; + case JMP_OPCODE: + oneShortOp(getOpcodeGroup2(JMP_OPCODE, reg)); + break; + case JSR_OPCODE: + oneShortOp(getOpcodeGroup2(JSR_OPCODE, reg)); + break; + case BSRF_OPCODE: + oneShortOp(getOpcodeGroup2(BSRF_OPCODE, reg)); + break; + default: + ASSERT_NOT_REACHED(); + } + } + + void ldspr(RegisterID reg) + { + uint16_t opc = getOpcodeGroup2(LDSPR_OPCODE, reg); + oneShortOp(opc); + } + + void stspr(RegisterID reg) + { + uint16_t opc = getOpcodeGroup2(STSPR_OPCODE, reg); + oneShortOp(opc); + } + + void extuw(RegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(EXTUW_OPCODE, dst, src); + oneShortOp(opc); + } + + // float operations + + void ldsrmfpul(RegisterID src) + { + uint16_t opc = getOpcodeGroup2(LDS_RM_FPUL_OPCODE, src); + oneShortOp(opc); + } + + void fneg(FPRegisterID dst) + { + uint16_t opc = getOpcodeGroup2(FNEG_OPCODE, dst); + oneShortOp(opc, true, false); + } + + void fsqrt(FPRegisterID dst) + { + uint16_t opc = getOpcodeGroup2(FSQRT_OPCODE, dst); + oneShortOp(opc, true, false); + } + + void stsfpulReg(RegisterID src) + { + uint16_t opc = getOpcodeGroup2(STS_FPUL_RN_OPCODE, src); + oneShortOp(opc); + } + + void floatfpulfrn(RegisterID src) + { + uint16_t opc = getOpcodeGroup2(FLOAT_OPCODE, src); + oneShortOp(opc, true, false); + } + + void fmull(FPRegisterID src, FPRegisterID dst) + { + uint16_t opc = getOpcodeGroup1(FMUL_OPCODE, dst, src); + oneShortOp(opc, true, false); + } + + void fmovsReadrm(RegisterID src, FPRegisterID dst) + { + uint16_t opc = getOpcodeGroup1(FMOVS_READ_RM_OPCODE, dst, src); + oneShortOp(opc, true, false); + } + + void fmovsWriterm(FPRegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(FMOVS_WRITE_RN_OPCODE, dst, src); + oneShortOp(opc, true, false); + } + + void fmovsWriter0r(FPRegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(FMOVS_WRITE_R0RN_OPCODE, dst, src); + oneShortOp(opc, true, false); + } + + void fmovsReadr0r(RegisterID src, FPRegisterID dst) + { + uint16_t opc = getOpcodeGroup1(FMOVS_READ_R0RM_OPCODE, dst, src); + oneShortOp(opc, true, false); + } + + void fmovsReadrminc(RegisterID src, FPRegisterID dst) + { + uint16_t opc = getOpcodeGroup1(FMOVS_READ_RM_INC_OPCODE, dst, src); + oneShortOp(opc, true, false); + } + + void fmovsWriterndec(FPRegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(FMOVS_WRITE_RN_DEC_OPCODE, dst, src); + oneShortOp(opc, true, false); + } + + void ftrcRegfpul(FPRegisterID src) + { + uint16_t opc = getOpcodeGroup2(FTRC_OPCODE, src); + oneShortOp(opc, true, false); + } + + void fldsfpul(RegisterID src) + { + uint16_t opc = getOpcodeGroup2(FLDS_FRM_FPUL_OPCODE, src); + oneShortOp(opc); + } + + void fstsfpul(RegisterID src) + { + uint16_t opc = getOpcodeGroup2(FSTS_FPUL_FRN_OPCODE, src); + oneShortOp(opc); + } + + void ldsfpscr(RegisterID reg) + { + uint16_t opc = getOpcodeGroup2(LDSFPSCR_OPCODE, reg); + oneShortOp(opc); + } + + void stsfpscr(RegisterID reg) + { + uint16_t opc = getOpcodeGroup2(STSFPSCR_OPCODE, reg); + oneShortOp(opc); + } + + // double operations + + void dcnvds(FPRegisterID src) + { + uint16_t opc = getOpcodeGroup7(FCNVDS_DRM_FPUL_OPCODE, src >> 1); + oneShortOp(opc); + } + + void dcmppeq(FPRegisterID src, FPRegisterID dst) + { + uint16_t opc = getOpcodeGroup8(FCMPEQ_OPCODE, dst >> 1, src >> 1); + oneShortOp(opc); + } + + void dcmppgt(FPRegisterID src, FPRegisterID dst) + { + uint16_t opc = getOpcodeGroup8(FCMPGT_OPCODE, dst >> 1, src >> 1); + oneShortOp(opc); + } + + void dmulRegReg(FPRegisterID src, FPRegisterID dst) + { + uint16_t opc = getOpcodeGroup8(FMUL_OPCODE, dst >> 1, src >> 1); + oneShortOp(opc); + } + + void dsubRegReg(FPRegisterID src, FPRegisterID dst) + { + uint16_t opc = getOpcodeGroup8(FSUB_OPCODE, dst >> 1, src >> 1); + oneShortOp(opc); + } + + void daddRegReg(FPRegisterID src, FPRegisterID dst) + { + uint16_t opc = getOpcodeGroup8(FADD_OPCODE, dst >> 1, src >> 1); + oneShortOp(opc); + } + + void dmovRegReg(FPRegisterID src, FPRegisterID dst) + { + uint16_t opc = getOpcodeGroup8(FMOV_OPCODE, dst >> 1, src >> 1); + oneShortOp(opc); + } + + void ddivRegReg(FPRegisterID src, FPRegisterID dst) + { + uint16_t opc = getOpcodeGroup8(FDIV_OPCODE, dst >> 1, src >> 1); + oneShortOp(opc); + } + + void dsqrt(FPRegisterID dst) + { + uint16_t opc = getOpcodeGroup7(FSQRT_OPCODE, dst >> 1); + oneShortOp(opc); + } + + void dneg(FPRegisterID dst) + { + uint16_t opc = getOpcodeGroup7(FNEG_OPCODE, dst >> 1); + oneShortOp(opc); + } + + void fmovReadrm(RegisterID src, FPRegisterID dst) + { + uint16_t opc = getOpcodeGroup10(FMOVS_READ_RM_OPCODE, dst >> 1, src); + oneShortOp(opc); + } + + void fmovWriterm(FPRegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup9(FMOVS_WRITE_RN_OPCODE, dst, src >> 1); + oneShortOp(opc); + } + + void fmovWriter0r(FPRegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup9(FMOVS_WRITE_R0RN_OPCODE, dst, src >> 1); + oneShortOp(opc); + } + + void fmovReadr0r(RegisterID src, FPRegisterID dst) + { + uint16_t opc = getOpcodeGroup10(FMOVS_READ_R0RM_OPCODE, dst >> 1, src); + oneShortOp(opc); + } + + void fmovReadrminc(RegisterID src, FPRegisterID dst) + { + uint16_t opc = getOpcodeGroup10(FMOVS_READ_RM_INC_OPCODE, dst >> 1, src); + oneShortOp(opc); + } + + void fmovWriterndec(FPRegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup9(FMOVS_WRITE_RN_DEC_OPCODE, dst, src >> 1); + oneShortOp(opc); + } + + void floatfpulDreg(FPRegisterID src) + { + uint16_t opc = getOpcodeGroup7(FLOAT_OPCODE, src >> 1); + oneShortOp(opc); + } + + void ftrcdrmfpul(FPRegisterID src) + { + uint16_t opc = getOpcodeGroup7(FTRC_OPCODE, src >> 1); + oneShortOp(opc); + } + + // Various move ops + + void movImm8(int imm8, RegisterID dst) + { + ASSERT((imm8 <= 127) && (imm8 >= -128)); + + uint16_t opc = getOpcodeGroup3(MOVIMM_OPCODE, dst, imm8); + oneShortOp(opc); + } + + void movlRegReg(RegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(MOV_OPCODE, dst, src); + oneShortOp(opc); + } + + void movwRegMem(RegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(MOVW_WRITE_RN_OPCODE, dst, src); + oneShortOp(opc); + } + + void movwMemReg(RegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(MOVW_READ_RM_OPCODE, dst, src); + oneShortOp(opc); + } + + void movwPCReg(int offset, RegisterID base, RegisterID dst) + { + ASSERT(base == SH4Registers::pc); + ASSERT((offset <= 255) && (offset >= 0)); + + uint16_t opc = getOpcodeGroup3(MOVW_READ_OFFPC_OPCODE, dst, offset); + oneShortOp(opc); + } + + void movwMemReg(int offset, RegisterID base, RegisterID dst) + { + ASSERT(dst == SH4Registers::r0); + + uint16_t opc = getOpcodeGroup11(MOVW_READ_OFFRM_OPCODE, base, offset); + oneShortOp(opc); + } + + void movwR0mr(RegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(MOVW_READ_R0RM_OPCODE, dst, src); + oneShortOp(opc); + } + + void movlRegMem(RegisterID src, int offset, RegisterID base) + { + ASSERT((offset <= 15) && (offset >= 0)); + + if (!offset) { + oneShortOp(getOpcodeGroup1(MOVL_WRITE_RN_OPCODE, base, src)); + return; + } + + oneShortOp(getOpcodeGroup4(MOVL_WRITE_OFFRN_OPCODE, base, src, offset)); + } + + void movlRegMem(RegisterID src, RegisterID base) + { + uint16_t opc = getOpcodeGroup1(MOVL_WRITE_RN_OPCODE, base, src); + oneShortOp(opc); + } + + void movlMemReg(int offset, RegisterID base, RegisterID dst) + { + if (base == SH4Registers::pc) { + ASSERT((offset <= 255) && (offset >= 0)); + oneShortOp(getOpcodeGroup3(MOVL_READ_OFFPC_OPCODE, dst, offset)); + return; + } + + ASSERT((offset <= 15) && (offset >= 0)); + if (!offset) { + oneShortOp(getOpcodeGroup1(MOVL_READ_RM_OPCODE, dst, base)); + return; + } + + oneShortOp(getOpcodeGroup4(MOVL_READ_OFFRM_OPCODE, dst, base, offset)); + } + + void movbMemReg(int offset, RegisterID base, RegisterID dst) + { + ASSERT(dst == SH4Registers::r0); + + uint16_t opc = getOpcodeGroup11(MOVB_READ_OFFRM_OPCODE, base, offset); + oneShortOp(opc); + } + + void movbR0mr(RegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(MOVB_READ_R0RM_OPCODE, dst, src); + oneShortOp(opc); + } + + void movbMemReg(RegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(MOVB_READ_RM_OPCODE, dst, src); + oneShortOp(opc); + } + + void movlMemReg(RegisterID base, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(MOVL_READ_RM_OPCODE, dst, base); + oneShortOp(opc); + } + + void movlMemRegIn(RegisterID base, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(MOVL_READ_RMINC_OPCODE, dst, base); + oneShortOp(opc); + } + + void movlR0mr(RegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(MOVL_READ_R0RM_OPCODE, dst, src); + oneShortOp(opc); + } + + void movlRegMemr0(RegisterID src, RegisterID dst) + { + uint16_t opc = getOpcodeGroup1(MOVL_WRITE_R0RN_OPCODE, dst, src); + oneShortOp(opc); + } + + void movlImm8r(int imm8, RegisterID dst) + { + ASSERT((imm8 <= 127) && (imm8 >= -128)); + + uint16_t opc = getOpcodeGroup3(MOVIMM_OPCODE, dst, imm8); + oneShortOp(opc); + } + + void loadConstant(uint32_t constant, RegisterID dst) + { + if (((int)constant <= 0x7f) && ((int)constant >= -0x80)) { + movImm8(constant, dst); + return; + } + + uint16_t opc = getOpcodeGroup3(MOVIMM_OPCODE, dst, 0); + + m_buffer.ensureSpace(maxInstructionSize, sizeof(uint32_t)); + printInstr(getOpcodeGroup3(MOVIMM_OPCODE, dst, constant), m_buffer.codeSize()); + m_buffer.putShortWithConstantInt(opc, constant, true); + } + + void loadConstantUnReusable(uint32_t constant, RegisterID dst, bool ensureSpace = false) + { + uint16_t opc = getOpcodeGroup3(MOVIMM_OPCODE, dst, 0); + + if (ensureSpace) + m_buffer.ensureSpace(maxInstructionSize, sizeof(uint32_t)); + + printInstr(getOpcodeGroup3(MOVIMM_OPCODE, dst, constant), m_buffer.codeSize()); + m_buffer.putShortWithConstantInt(opc, constant); + } + + // Flow control + + AssemblerLabel call() + { + RegisterID scr = claimScratch(); + m_buffer.ensureSpace(maxInstructionSize + 4, sizeof(uint32_t)); + loadConstantUnReusable(0x0, scr); + branch(JSR_OPCODE, scr); + nop(); + releaseScratch(scr); + return m_buffer.label(); + } + + AssemblerLabel call(RegisterID dst) + { + m_buffer.ensureSpace(maxInstructionSize + 2); + branch(JSR_OPCODE, dst); + nop(); + return m_buffer.label(); + } + + AssemblerLabel jmp() + { + RegisterID scr = claimScratch(); + m_buffer.ensureSpace(maxInstructionSize + 4, sizeof(uint32_t)); + AssemblerLabel label = m_buffer.label(); + loadConstantUnReusable(0x0, scr); + branch(BRAF_OPCODE, scr); + nop(); + releaseScratch(scr); + return label; + } + + AssemblerLabel jmp(RegisterID dst) + { + jmpReg(dst); + return m_buffer.label(); + } + + void jmpReg(RegisterID dst) + { + m_buffer.ensureSpace(maxInstructionSize + 2); + branch(JMP_OPCODE, dst); + nop(); + } + + AssemblerLabel jne() + { + AssemblerLabel label = m_buffer.label(); + branch(BF_OPCODE, 0); + return label; + } + + AssemblerLabel je() + { + AssemblerLabel label = m_buffer.label(); + branch(BT_OPCODE, 0); + return label; + } + + void ret() + { + m_buffer.ensureSpace(maxInstructionSize + 2); + oneShortOp(RTS_OPCODE, false); + } + + AssemblerLabel label() + { + m_buffer.ensureSpaceForAnyOneInstruction(); + return m_buffer.label(); + } + + int sizeOfConstantPool() + { + return m_buffer.sizeOfConstantPool(); + } + + AssemblerLabel align(int alignment) + { + m_buffer.ensureSpace(maxInstructionSize + 2); + while (!m_buffer.isAligned(alignment)) { + nop(); + m_buffer.ensureSpace(maxInstructionSize + 2); + } + return label(); + } + + static void changePCrelativeAddress(int offset, uint16_t* instructionPtr, uint32_t newAddress) + { + uint32_t address = (offset << 2) + ((reinterpret_cast(instructionPtr) + 4) &(~0x3)); + *reinterpret_cast(address) = newAddress; + } + + static uint32_t readPCrelativeAddress(int offset, uint16_t* instructionPtr) + { + uint32_t address = (offset << 2) + ((reinterpret_cast(instructionPtr) + 4) &(~0x3)); + return *reinterpret_cast(address); + } + + static uint16_t* getInstructionPtr(void* code, int offset) + { + return reinterpret_cast (reinterpret_cast(code) + offset); + } + + static void linkJump(void* code, AssemblerLabel from, void* to) + { + ASSERT(from.isSet()); + + uint16_t* instructionPtr = getInstructionPtr(code, from.m_offset); + uint16_t instruction = *instructionPtr; + int offsetBits = (reinterpret_cast(to) - reinterpret_cast(code)) - from.m_offset; + + if (((instruction & 0xff00) == BT_OPCODE) || ((instruction & 0xff00) == BF_OPCODE)) { + /* BT label ==> BF 2 + nop LDR reg + nop braf @reg + nop nop + */ + offsetBits -= 8; + instruction ^= 0x0202; + *instructionPtr++ = instruction; + changePCrelativeAddress((*instructionPtr & 0xff), instructionPtr, offsetBits); + instruction = (BRAF_OPCODE | (*instructionPtr++ & 0xf00)); + *instructionPtr = instruction; + printBlockInstr(instructionPtr - 2, from.m_offset, 3); + return; + } + + /* MOV #imm, reg => LDR reg + braf @reg braf @reg + nop nop + */ + ASSERT((*(instructionPtr + 1) & BRAF_OPCODE) == BRAF_OPCODE); + + offsetBits -= 4; + if (offsetBits >= -4096 && offsetBits <= 4094) { + *instructionPtr = getOpcodeGroup6(BRA_OPCODE, offsetBits >> 1); + *(++instructionPtr) = NOP_OPCODE; + printBlockInstr(instructionPtr - 1, from.m_offset, 2); + return; + } + + changePCrelativeAddress((*instructionPtr & 0xff), instructionPtr, offsetBits - 2); + printInstr(*instructionPtr, from.m_offset + 2); + } + + static void linkCall(void* code, AssemblerLabel from, void* to) + { + uint16_t* instructionPtr = getInstructionPtr(code, from.m_offset); + instructionPtr -= 3; + changePCrelativeAddress((*instructionPtr & 0xff), instructionPtr, reinterpret_cast(to)); + } + + static void linkPointer(void* code, AssemblerLabel where, void* value) + { + uint16_t* instructionPtr = getInstructionPtr(code, where.m_offset); + changePCrelativeAddress((*instructionPtr & 0xff), instructionPtr, reinterpret_cast(value)); + } + + static unsigned getCallReturnOffset(AssemblerLabel call) + { + ASSERT(call.isSet()); + return call.m_offset; + } + + static uint32_t* getLdrImmAddressOnPool(SH4Word* insn, uint32_t* constPool) + { + return (constPool + (*insn & 0xff)); + } + + static SH4Word patchConstantPoolLoad(SH4Word load, int value) + { + return ((load & ~0xff) | value); + } + + static SH4Buffer::TwoShorts placeConstantPoolBarrier(int offset) + { + ASSERT(((offset >> 1) <=2047) && ((offset >> 1) >= -2048)); + + SH4Buffer::TwoShorts m_barrier; + m_barrier.high = (BRA_OPCODE | (offset >> 1)); + m_barrier.low = NOP_OPCODE; + printInstr(((BRA_OPCODE | (offset >> 1))), 0); + printInstr(NOP_OPCODE, 0); + return m_barrier; + } + + static void patchConstantPoolLoad(void* loadAddr, void* constPoolAddr) + { + SH4Word* instructionPtr = reinterpret_cast(loadAddr); + SH4Word instruction = *instructionPtr; + SH4Word index = instruction & 0xff; + + if ((instruction & 0xf000) != MOVIMM_OPCODE) + return; + + ASSERT((((reinterpret_cast(constPoolAddr) - reinterpret_cast(loadAddr)) + index * 4)) < 1024); + + int offset = reinterpret_cast(constPoolAddr) + (index * 4) - ((reinterpret_cast(instructionPtr) & ~0x03) + 4); + instruction &=0xf00; + instruction |= 0xd000; + offset &= 0x03ff; + instruction |= (offset >> 2); + *instructionPtr = instruction; + printInstr(instruction, reinterpret_cast(loadAddr)); + } + + static void repatchPointer(void* where, void* value) + { + patchPointer(where, value); + } + + static void* readPointer(void* code) + { + return static_cast(readInt32(code)); + } + + static void repatchInt32(void* where, int32_t value) + { + uint16_t* instructionPtr = reinterpret_cast(where); + changePCrelativeAddress((*instructionPtr & 0xff), instructionPtr, value); + } + + static void repatchCompact(void* where, int32_t value) + { + repatchInt32(where, value); + } + + static void relinkCall(void* from, void* to) + { + uint16_t* instructionPtr = reinterpret_cast(from); + instructionPtr -= 3; + changePCrelativeAddress((*instructionPtr & 0xff), instructionPtr, reinterpret_cast(to)); + } + + static void relinkJump(void* from, void* to) + { + uint16_t* instructionPtr = reinterpret_cast (from); + uint16_t instruction = *instructionPtr; + int32_t offsetBits = (reinterpret_cast(to) - reinterpret_cast(from)); + + if (((*instructionPtr & 0xff00) == BT_OPCODE) || ((*instructionPtr & 0xff00) == BF_OPCODE)) { + offsetBits -= 8; + instructionPtr++; + changePCrelativeAddress((*instructionPtr & 0xff), instructionPtr, offsetBits); + instruction = (BRAF_OPCODE | (*instructionPtr++ & 0xf00)); + *instructionPtr = instruction; + printBlockInstr(instructionPtr, reinterpret_cast(from) + 1, 3); + return; + } + + ASSERT((*(instructionPtr + 1) & BRAF_OPCODE) == BRAF_OPCODE); + offsetBits -= 4; + if (offsetBits >= -4096 && offsetBits <= 4094) { + *instructionPtr = getOpcodeGroup6(BRA_OPCODE, offsetBits >> 1); + *(++instructionPtr) = NOP_OPCODE; + printBlockInstr(instructionPtr - 2, reinterpret_cast(from), 2); + return; + } + + changePCrelativeAddress((*instructionPtr & 0xff), instructionPtr, offsetBits - 2); + printInstr(*instructionPtr, reinterpret_cast(from)); + } + + // Linking & patching + + void linkJump(AssemblerLabel from, AssemblerLabel to) + { + ASSERT(to.isSet()); + ASSERT(from.isSet()); + + uint16_t* instructionPtr = getInstructionPtr(data(), from.m_offset); + uint16_t instruction = *instructionPtr; + int offsetBits; + + if (((instruction & 0xff00) == BT_OPCODE) || ((instruction & 0xff00) == BF_OPCODE)) { + /* BT label => BF 2 + nop LDR reg + nop braf @reg + nop nop + */ + offsetBits = (to.m_offset - from.m_offset) - 8; + instruction ^= 0x0202; + *instructionPtr++ = instruction; + if ((*instructionPtr & 0xf000) == 0xe000) { + uint32_t* addr = getLdrImmAddressOnPool(instructionPtr, m_buffer.poolAddress()); + *addr = offsetBits; + } else + changePCrelativeAddress((*instructionPtr & 0xff), instructionPtr, offsetBits); + instruction = (BRAF_OPCODE | (*instructionPtr++ & 0xf00)); + *instructionPtr = instruction; + printBlockInstr(instructionPtr - 2, from.m_offset, 3); + return; + } + + /* MOV # imm, reg => LDR reg + braf @reg braf @reg + nop nop + */ + ASSERT((*(instructionPtr + 1) & BRAF_OPCODE) == BRAF_OPCODE); + offsetBits = (to.m_offset - from.m_offset) - 4; + if (offsetBits >= -4096 && offsetBits <= 4094) { + *instructionPtr = getOpcodeGroup6(BRA_OPCODE, offsetBits >> 1); + *(++instructionPtr) = NOP_OPCODE; + printBlockInstr(instructionPtr - 1, from.m_offset, 2); + return; + } + + instruction = *instructionPtr; + if ((instruction & 0xf000) == 0xe000) { + uint32_t* addr = getLdrImmAddressOnPool(instructionPtr, m_buffer.poolAddress()); + *addr = offsetBits - 2; + printInstr(*instructionPtr, from.m_offset + 2); + return; + } + + changePCrelativeAddress((*instructionPtr & 0xff), instructionPtr, offsetBits - 2); + printInstr(*instructionPtr, from.m_offset + 2); + } + + static void* getRelocatedAddress(void* code, AssemblerLabel label) + { + return reinterpret_cast(reinterpret_cast(code) + label.m_offset); + } + + static int getDifferenceBetweenLabels(AssemblerLabel a, AssemblerLabel b) + { + return b.m_offset - a.m_offset; + } + + static void patchPointer(void* code, AssemblerLabel where, void* value) + { + patchPointer(reinterpret_cast(code) + where.m_offset, value); + } + + static void patchPointer(void* code, void* value) + { + patchInt32(code, reinterpret_cast(value)); + } + + static void patchInt32(void* code, uint32_t value) + { + changePCrelativeAddress((*(reinterpret_cast(code)) & 0xff), reinterpret_cast(code), value); + } + + static uint32_t readInt32(void* code) + { + return readPCrelativeAddress((*(reinterpret_cast(code)) & 0xff), reinterpret_cast(code)); + } + + void* executableCopy(JSGlobalData& globalData, ExecutablePool* allocator) + { + return m_buffer.executableCopy(globalData, allocator); + } + + void prefix(uint16_t pre) + { + m_buffer.putByte(pre); + } + + void oneShortOp(uint16_t opcode, bool checksize = true, bool isDouble = true) + { + printInstr(opcode, m_buffer.codeSize(), isDouble); + if (checksize) + m_buffer.ensureSpace(maxInstructionSize); + m_buffer.putShortUnchecked(opcode); + } + + void ensureSpace(int space) + { + m_buffer.ensureSpace(space); + } + + void ensureSpace(int insnSpace, int constSpace) + { + m_buffer.ensureSpace(insnSpace, constSpace); + } + + // Administrative methods + + void* data() const { return m_buffer.data(); } + size_t codeSize() const { return m_buffer.codeSize(); } + +#ifdef SH4_ASSEMBLER_TRACING + static void printInstr(uint16_t opc, unsigned int size, bool isdoubleInst = true) + { + if (!getenv("JavaScriptCoreDumpJIT")) + return; + + const char *format = 0; + printfStdoutInstr("offset: 0x%8.8x\t", size); + switch (opc) { + case BRK_OPCODE: + format = " BRK\n"; + break; + case NOP_OPCODE: + format = " NOP\n"; + break; + case RTS_OPCODE: + format =" *RTS\n"; + break; + case SETS_OPCODE: + format = " SETS\n"; + break; + case SETT_OPCODE: + format = " SETT\n"; + break; + case CLRT_OPCODE: + format = " CLRT\n"; + break; + case FSCHG_OPCODE: + format = " FSCHG\n"; + break; + } + if (format) { + printfStdoutInstr(format); + return; + } + switch (opc & 0xf0ff) { + case BRAF_OPCODE: + format = " *BRAF R%d\n"; + break; + case DT_OPCODE: + format = " DT R%d\n"; + break; + case CMPPL_OPCODE: + format = " CMP/PL R%d\n"; + break; + case CMPPZ_OPCODE: + format = " CMP/PZ R%d\n"; + break; + case JMP_OPCODE: + format = " *JMP @R%d\n"; + break; + case JSR_OPCODE: + format = " *JSR @R%d\n"; + break; + case LDSPR_OPCODE: + format = " LDS R%d, PR\n"; + break; + case LDSLPR_OPCODE: + format = " LDS.L @R%d+, PR\n"; + break; + case MOVT_OPCODE: + format = " MOVT R%d\n"; + break; + case SHAL_OPCODE: + format = " SHAL R%d\n"; + break; + case SHAR_OPCODE: + format = " SHAR R%d\n"; + break; + case SHLL_OPCODE: + format = " SHLL R%d\n"; + break; + case SHLL2_OPCODE: + format = " SHLL2 R%d\n"; + break; + case SHLL8_OPCODE: + format = " SHLL8 R%d\n"; + break; + case SHLL16_OPCODE: + format = " SHLL16 R%d\n"; + break; + case SHLR_OPCODE: + format = " SHLR R%d\n"; + break; + case SHLR2_OPCODE: + format = " SHLR2 R%d\n"; + break; + case SHLR8_OPCODE: + format = " SHLR8 R%d\n"; + break; + case SHLR16_OPCODE: + format = " SHLR16 R%d\n"; + break; + case STSPR_OPCODE: + format = " STS PR, R%d\n"; + break; + case STSLPR_OPCODE: + format = " STS.L PR, @-R%d\n"; + break; + case LDS_RM_FPUL_OPCODE: + format = " LDS R%d, FPUL\n"; + break; + case STS_FPUL_RN_OPCODE: + format = " STS FPUL, R%d \n"; + break; + case FLDS_FRM_FPUL_OPCODE: + format = " FLDS FR%d, FPUL\n"; + break; + case FSTS_FPUL_FRN_OPCODE: + format = " FSTS FPUL, R%d \n"; + break; + case LDSFPSCR_OPCODE: + format = " LDS R%d, FPSCR \n"; + break; + case STSFPSCR_OPCODE: + format = " STS FPSCR, R%d \n"; + break; + case STSMACL_OPCODE: + format = " STS MACL, R%d \n"; + break; + case STSMACH_OPCODE: + format = " STS MACH, R%d \n"; + break; + case BSRF_OPCODE: + format = " *BSRF R%d"; + break; + case FTRC_OPCODE: + format = " FTRC FR%d, FPUL\n"; + break; + } + if (format) { + printfStdoutInstr(format, getRn(opc)); + return; + } + switch (opc & 0xf0ff) { + case FNEG_OPCODE: + format = " FNEG DR%d\n"; + break; + case FLOAT_OPCODE: + format = " FLOAT DR%d\n"; + break; + case FTRC_OPCODE: + format = " FTRC FR%d, FPUL\n"; + break; + case FSQRT_OPCODE: + format = " FSQRT FR%d\n"; + break; + case FCNVDS_DRM_FPUL_OPCODE: + format = " FCNVDS FR%d, FPUL\n"; + break; + } + if (format) { + if (isdoubleInst) + printfStdoutInstr(format, getDRn(opc) << 1); + else + printfStdoutInstr(format, getRn(opc)); + return; + } + switch (opc & 0xf00f) { + case ADD_OPCODE: + format = " ADD R%d, R%d\n"; + break; + case ADDC_OPCODE: + format = " ADDC R%d, R%d\n"; + break; + case ADDV_OPCODE: + format = " ADDV R%d, R%d\n"; + break; + case AND_OPCODE: + format = " AND R%d, R%d\n"; + break; + case DIV1_OPCODE: + format = " DIV1 R%d, R%d\n"; + break; + case CMPEQ_OPCODE: + format = " CMP/EQ R%d, R%d\n"; + break; + case CMPGE_OPCODE: + format = " CMP/GE R%d, R%d\n"; + break; + case CMPGT_OPCODE: + format = " CMP/GT R%d, R%d\n"; + break; + case CMPHI_OPCODE: + format = " CMP/HI R%d, R%d\n"; + break; + case CMPHS_OPCODE: + format = " CMP/HS R%d, R%d\n"; + break; + case MOV_OPCODE: + format = " MOV R%d, R%d\n"; + break; + case MOVB_WRITE_RN_OPCODE: + format = " MOV.B R%d, @R%d\n"; + break; + case MOVB_WRITE_RNDEC_OPCODE: + format = " MOV.B R%d, @-R%d\n"; + break; + case MOVB_WRITE_R0RN_OPCODE: + format = " MOV.B R%d, @(R0, R%d)\n"; + break; + case MOVB_READ_RM_OPCODE: + format = " MOV.B @R%d, R%d\n"; + break; + case MOVB_READ_RMINC_OPCODE: + format = " MOV.B @R%d+, R%d\n"; + break; + case MOVB_READ_R0RM_OPCODE: + format = " MOV.B @(R0, R%d), R%d\n"; + break; + case MOVL_WRITE_RN_OPCODE: + format = " MOV.L R%d, @R%d\n"; + break; + case MOVL_WRITE_RNDEC_OPCODE: + format = " MOV.L R%d, @-R%d\n"; + break; + case MOVL_WRITE_R0RN_OPCODE: + format = " MOV.L R%d, @(R0, R%d)\n"; + break; + case MOVL_READ_RM_OPCODE: + format = " MOV.L @R%d, R%d\n"; + break; + case MOVL_READ_RMINC_OPCODE: + format = " MOV.L @R%d+, R%d\n"; + break; + case MOVL_READ_R0RM_OPCODE: + format = " MOV.L @(R0, R%d), R%d\n"; + break; + case MULL_OPCODE: + format = " MUL.L R%d, R%d\n"; + break; + case DMULL_L_OPCODE: + format = " DMULU.L R%d, R%d\n"; + break; + case DMULSL_OPCODE: + format = " DMULS.L R%d, R%d\n"; + break; + case NEG_OPCODE: + format = " NEG R%d, R%d\n"; + break; + case NEGC_OPCODE: + format = " NEGC R%d, R%d\n"; + break; + case NOT_OPCODE: + format = " NOT R%d, R%d\n"; + break; + case OR_OPCODE: + format = " OR R%d, R%d\n"; + break; + case SHAD_OPCODE: + format = " SHAD R%d, R%d\n"; + break; + case SHLD_OPCODE: + format = " SHLD R%d, R%d\n"; + break; + case SUB_OPCODE: + format = " SUB R%d, R%d\n"; + break; + case SUBC_OPCODE: + format = " SUBC R%d, R%d\n"; + break; + case SUBV_OPCODE: + format = " SUBV R%d, R%d\n"; + break; + case TST_OPCODE: + format = " TST R%d, R%d\n"; + break; + case XOR_OPCODE: + format = " XOR R%d, R%d\n";break; + case MOVW_WRITE_RN_OPCODE: + format = " MOV.W R%d, @R%d\n"; + break; + case MOVW_READ_RM_OPCODE: + format = " MOV.W @R%d, R%d\n"; + break; + case MOVW_READ_R0RM_OPCODE: + format = " MOV.W @(R0, R%d), R%d\n"; + break; + case EXTUW_OPCODE: + format = " EXTU.W R%d, R%d\n"; + break; + } + if (format) { + printfStdoutInstr(format, getRm(opc), getRn(opc)); + return; + } + switch (opc & 0xf00f) { + case FSUB_OPCODE: + format = " FSUB FR%d, FR%d\n"; + break; + case FADD_OPCODE: + format = " FADD FR%d, FR%d\n"; + break; + case FDIV_OPCODE: + format = " FDIV FR%d, FR%d\n"; + break; + case FMUL_OPCODE: + format = " DMULL FR%d, FR%d\n"; + break; + case FMOV_OPCODE: + format = " FMOV FR%d, FR%d\n"; + break; + case FCMPEQ_OPCODE: + format = " FCMP/EQ FR%d, FR%d\n"; + break; + case FCMPGT_OPCODE: + format = " FCMP/GT FR%d, FR%d\n"; + break; + } + if (format) { + if (isdoubleInst) + printfStdoutInstr(format, getDRm(opc) << 1, getDRn(opc) << 1); + else + printfStdoutInstr(format, getRm(opc), getRn(opc)); + return; + } + switch (opc & 0xf00f) { + case FMOVS_WRITE_RN_DEC_OPCODE: + format = " %s FR%d, @-R%d\n"; + break; + case FMOVS_WRITE_RN_OPCODE: + format = " %s FR%d, @R%d\n"; + break; + case FMOVS_WRITE_R0RN_OPCODE: + format = " %s FR%d, @(R0, R%d)\n"; + break; + } + if (format) { + if (isdoubleInst) + printfStdoutInstr(format, "FMOV", getDRm(opc) << 1, getDRn(opc)); + else + printfStdoutInstr(format, "FMOV.S", getRm(opc), getRn(opc)); + return; + } + switch (opc & 0xf00f) { + case FMOVS_READ_RM_OPCODE: + format = " %s @R%d, FR%d\n"; + break; + case FMOVS_READ_RM_INC_OPCODE: + format = " %s @R%d+, FR%d\n"; + break; + case FMOVS_READ_R0RM_OPCODE: + format = " %s @(R0, R%d), FR%d\n"; + break; + } + if (format) { + if (isdoubleInst) + printfStdoutInstr(format, "FMOV", getDRm(opc), getDRn(opc) << 1); + else + printfStdoutInstr(format, "FMOV.S", getRm(opc), getRn(opc)); + return; + } + switch (opc & 0xff00) { + case BF_OPCODE: + format = " BF %d\n"; + break; + case BFS_OPCODE: + format = " *BF/S %d\n"; + break; + case ANDIMM_OPCODE: + format = " AND #%d, R0\n"; + break; + case BT_OPCODE: + format = " BT %d\n"; + break; + case BTS_OPCODE: + format = " *BT/S %d\n"; + break; + case CMPEQIMM_OPCODE: + format = " CMP/EQ #%d, R0\n"; + break; + case MOVB_WRITE_OFFGBR_OPCODE: + format = " MOV.B R0, @(%d, GBR)\n"; + break; + case MOVB_READ_OFFGBR_OPCODE: + format = " MOV.B @(%d, GBR), R0\n"; + break; + case MOVL_WRITE_OFFGBR_OPCODE: + format = " MOV.L R0, @(%d, GBR)\n"; + break; + case MOVL_READ_OFFGBR_OPCODE: + format = " MOV.L @(%d, GBR), R0\n"; + break; + case MOVA_READ_OFFPC_OPCODE: + format = " MOVA @(%d, PC), R0\n"; + break; + case ORIMM_OPCODE: + format = " OR #%d, R0\n"; + break; + case ORBIMM_OPCODE: + format = " OR.B #%d, @(R0, GBR)\n"; + break; + case TSTIMM_OPCODE: + format = " TST #%d, R0\n"; + break; + case TSTB_OPCODE: + format = " TST.B %d, @(R0, GBR)\n"; + break; + case XORIMM_OPCODE: + format = " XOR #%d, R0\n"; + break; + case XORB_OPCODE: + format = " XOR.B %d, @(R0, GBR)\n"; + break; + } + if (format) { + printfStdoutInstr(format, getImm8(opc)); + return; + } + switch (opc & 0xff00) { + case MOVB_WRITE_OFFRN_OPCODE: + format = " MOV.B R0, @(%d, R%d)\n"; + break; + case MOVB_READ_OFFRM_OPCODE: + format = " MOV.B @(%d, R%d), R0\n"; + break; + } + if (format) { + printfStdoutInstr(format, getDisp(opc), getRm(opc)); + return; + } + switch (opc & 0xf000) { + case BRA_OPCODE: + format = " *BRA %d\n"; + break; + case BSR_OPCODE: + format = " *BSR %d\n"; + break; + } + if (format) { + printfStdoutInstr(format, getImm12(opc)); + return; + } + switch (opc & 0xf000) { + case MOVL_READ_OFFPC_OPCODE: + format = " MOV.L @(%d, PC), R%d\n"; + break; + case ADDIMM_OPCODE: + format = " ADD #%d, R%d\n"; + break; + case MOVIMM_OPCODE: + format = " MOV #%d, R%d\n"; + break; + case MOVW_READ_OFFPC_OPCODE: + format = " MOV.W @(%d, PC), R%d\n"; + break; + } + if (format) { + printfStdoutInstr(format, getImm8(opc), getRn(opc)); + return; + } + switch (opc & 0xf000) { + case MOVL_WRITE_OFFRN_OPCODE: + format = " MOV.L R%d, @(%d, R%d)\n"; + printfStdoutInstr(format, getRm(opc), getDisp(opc), getRn(opc)); + break; + case MOVL_READ_OFFRM_OPCODE: + format = " MOV.L @(%d, R%d), R%d\n"; + printfStdoutInstr(format, getDisp(opc), getRm(opc), getRn(opc)); + break; + } + } + + static void printfStdoutInstr(const char* format, ...) + { + if (getenv("JavaScriptCoreDumpJIT")) { + va_list args; + va_start(args, format); + vprintfStdoutInstr(format, args); + va_end(args); + } + } + + static void vprintfStdoutInstr(const char* format, va_list args) + { + if (getenv("JavaScriptCoreDumpJIT")) + vfprintf(stdout, format, args); + } + + static void printBlockInstr(uint16_t* first, unsigned int offset, int nbInstr) + { + printfStdoutInstr(">> repatch instructions after link\n"); + for (int i = 0; i <= nbInstr; i++) + printInstr(*(first + i), offset + i); + printfStdoutInstr(">> end repatch\n"); + } +#else + static void printInstr(uint16_t opc, unsigned int size, bool isdoubleInst = true) {}; + static void printBlockInstr(uint16_t* first, unsigned int offset, int nbInstr) {}; +#endif + +private: + SH4Buffer m_buffer; + int m_claimscratchReg; +}; + +} // namespace JSC + +#endif // ENABLE(ASSEMBLER) && CPU(SH4) + +#endif // SH4Assembler_h diff --git a/assembler/X86Assembler.h b/assembler/X86Assembler.h index 20d72f5..41dd50f 100644 --- a/assembler/X86Assembler.h +++ b/assembler/X86Assembler.h @@ -131,12 +131,14 @@ private: OP_GROUP1_EbIb = 0x80, OP_GROUP1_EvIz = 0x81, OP_GROUP1_EvIb = 0x83, + OP_TEST_EbGb = 0x84, OP_TEST_EvGv = 0x85, OP_XCHG_EvGv = 0x87, OP_MOV_EvGv = 0x89, OP_MOV_GvEv = 0x8B, OP_LEA = 0x8D, OP_GROUP1A_Ev = 0x8F, + OP_NOP = 0x90, OP_CDQ = 0x99, OP_MOV_EAXOv = 0xA1, OP_MOV_OvEAX = 0xA3, @@ -219,54 +221,10 @@ private: class X86InstructionFormatter; public: - class JmpSrc { - friend class X86Assembler; - friend class X86InstructionFormatter; - public: - JmpSrc() - : m_offset(-1) - { - } - - private: - JmpSrc(int offset) - : m_offset(offset) - { - } - - int m_offset; - }; - - class JmpDst { - friend class X86Assembler; - friend class X86InstructionFormatter; - 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; - bool m_used : 1; - }; - X86Assembler() { } - size_t size() const { return m_formatter.size(); } - // Stack operations: void push_r(RegisterID reg) @@ -298,7 +256,7 @@ public: // Arithmetic operations: #if !CPU(X86_64) - void adcl_im(int imm, void* addr) + void adcl_im(int imm, const void* addr) { if (CAN_SIGN_EXTEND_8_32(imm)) { m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_ADC, addr); @@ -375,7 +333,7 @@ public: } } #else - void addl_im(int imm, void* addr) + void addl_im(int imm, const void* addr) { if (CAN_SIGN_EXTEND_8_32(imm)) { m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_ADD, addr); @@ -441,7 +399,7 @@ public: } } #else - void andl_im(int imm, void* addr) + void andl_im(int imm, const void* addr) { if (CAN_SIGN_EXTEND_8_32(imm)) { m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_AND, addr); @@ -527,7 +485,7 @@ public: } } #else - void orl_im(int imm, void* addr) + void orl_im(int imm, const void* addr) { if (CAN_SIGN_EXTEND_8_32(imm)) { m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_OR, addr); @@ -593,7 +551,7 @@ public: } } #else - void subl_im(int imm, void* addr) + void subl_im(int imm, const void* addr) { if (CAN_SIGN_EXTEND_8_32(imm)) { m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_SUB, addr); @@ -866,12 +824,12 @@ public: } } #else - void cmpl_rm(RegisterID reg, void* addr) + void cmpl_rm(RegisterID reg, const void* addr) { m_formatter.oneByteOp(OP_CMP_EvGv, reg, addr); } - void cmpl_im(int imm, void* addr) + void cmpl_im(int imm, const void* addr) { if (CAN_SIGN_EXTEND_8_32(imm)) { m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_CMP, addr); @@ -918,7 +876,12 @@ public: m_formatter.oneByteOp(OP_GROUP3_EvIz, GROUP3_OP_TEST, base, offset); m_formatter.immediate32(imm); } - + + void testb_rr(RegisterID src, RegisterID dst) + { + m_formatter.oneByteOp(OP_TEST_EbGb, src, dst); + } + void testb_im(int imm, int offset, RegisterID base) { m_formatter.oneByteOp(OP_GROUP3_EbIb, GROUP3_OP_TEST, base, offset); @@ -1038,7 +1001,7 @@ public: m_formatter.oneByteOp(OP_MOV_EvGv, src, base, index, scale, offset); } - void movl_mEAX(void* addr) + void movl_mEAX(const void* addr) { m_formatter.oneByteOp(OP_MOV_EAXOv); #if CPU(X86_64) @@ -1057,6 +1020,11 @@ public: { m_formatter.oneByteOp_disp32(OP_MOV_GvEv, dst, base, offset); } + + void movl_mr_disp8(int offset, RegisterID base, RegisterID dst) + { + m_formatter.oneByteOp_disp8(OP_MOV_GvEv, dst, base, offset); + } void movl_mr(int offset, RegisterID base, RegisterID index, int scale, RegisterID dst) { @@ -1075,7 +1043,7 @@ public: m_formatter.immediate32(imm); } - void movl_EAXm(void* addr) + void movl_EAXm(const void* addr) { m_formatter.oneByteOp(OP_MOV_OvEAX); #if CPU(X86_64) @@ -1106,13 +1074,13 @@ public: m_formatter.oneByteOp64(OP_MOV_EvGv, src, base, index, scale, offset); } - void movq_mEAX(void* addr) + void movq_mEAX(const void* addr) { m_formatter.oneByteOp64(OP_MOV_EAXOv); m_formatter.immediate64(reinterpret_cast(addr)); } - void movq_EAXm(void* addr) + void movq_EAXm(const void* addr) { m_formatter.oneByteOp64(OP_MOV_OvEAX); m_formatter.immediate64(reinterpret_cast(addr)); @@ -1128,6 +1096,11 @@ public: m_formatter.oneByteOp64_disp32(OP_MOV_GvEv, dst, base, offset); } + void movq_mr_disp8(int offset, RegisterID base, RegisterID dst) + { + m_formatter.oneByteOp64_disp8(OP_MOV_GvEv, dst, base, offset); + } + void movq_mr(int offset, RegisterID base, RegisterID index, int scale, RegisterID dst) { m_formatter.oneByteOp64(OP_MOV_GvEv, dst, base, index, scale, offset); @@ -1152,7 +1125,7 @@ public: #else - void movl_rm(RegisterID src, void* addr) + void movl_rm(RegisterID src, const void* addr) { if (src == X86Registers::eax) movl_EAXm(addr); @@ -1160,7 +1133,7 @@ public: m_formatter.oneByteOp(OP_MOV_EvGv, src, addr); } - void movl_mr(void* addr, RegisterID dst) + void movl_mr(const void* addr, RegisterID dst) { if (dst == X86Registers::eax) movl_mEAX(addr); @@ -1168,7 +1141,7 @@ public: m_formatter.oneByteOp(OP_MOV_GvEv, dst, addr); } - void movl_i32m(int imm, void* addr) + void movl_i32m(int imm, const void* addr) { m_formatter.oneByteOp(OP_GROUP11_EvIz, GROUP11_MOV, addr); m_formatter.immediate32(imm); @@ -1206,16 +1179,16 @@ public: // Flow control: - JmpSrc call() + AssemblerLabel call() { m_formatter.oneByteOp(OP_CALL_rel32); return m_formatter.immediateRel32(); } - JmpSrc call(RegisterID dst) + AssemblerLabel call(RegisterID dst) { m_formatter.oneByteOp(OP_GROUP5_Ev, GROUP5_OP_CALLN, dst); - return JmpSrc(m_formatter.size()); + return m_formatter.label(); } void call_m(int offset, RegisterID base) @@ -1223,19 +1196,19 @@ public: m_formatter.oneByteOp(OP_GROUP5_Ev, GROUP5_OP_CALLN, base, offset); } - JmpSrc jmp() + AssemblerLabel jmp() { m_formatter.oneByteOp(OP_JMP_rel32); return m_formatter.immediateRel32(); } - // Return a JmpSrc so we have a label to the jump, so we can use this + // Return a AssemblerLabel so we have a label to the jump, so we can use this // To make a tail recursive call on x86-64. The MacroAssembler // really shouldn't wrap this as a Jump, since it can't be linked. :-/ - JmpSrc jmp_r(RegisterID dst) + AssemblerLabel jmp_r(RegisterID dst) { m_formatter.oneByteOp(OP_GROUP5_Ev, GROUP5_OP_JMPN, dst); - return JmpSrc(m_formatter.size()); + return m_formatter.label(); } void jmp_m(int offset, RegisterID base) @@ -1243,95 +1216,95 @@ public: m_formatter.oneByteOp(OP_GROUP5_Ev, GROUP5_OP_JMPN, base, offset); } - JmpSrc jne() + AssemblerLabel jne() { m_formatter.twoByteOp(jccRel32(ConditionNE)); return m_formatter.immediateRel32(); } - JmpSrc jnz() + AssemblerLabel jnz() { return jne(); } - JmpSrc je() + AssemblerLabel je() { m_formatter.twoByteOp(jccRel32(ConditionE)); return m_formatter.immediateRel32(); } - JmpSrc jz() + AssemblerLabel jz() { return je(); } - JmpSrc jl() + AssemblerLabel jl() { m_formatter.twoByteOp(jccRel32(ConditionL)); return m_formatter.immediateRel32(); } - JmpSrc jb() + AssemblerLabel jb() { m_formatter.twoByteOp(jccRel32(ConditionB)); return m_formatter.immediateRel32(); } - JmpSrc jle() + AssemblerLabel jle() { m_formatter.twoByteOp(jccRel32(ConditionLE)); return m_formatter.immediateRel32(); } - JmpSrc jbe() + AssemblerLabel jbe() { m_formatter.twoByteOp(jccRel32(ConditionBE)); return m_formatter.immediateRel32(); } - JmpSrc jge() + AssemblerLabel jge() { m_formatter.twoByteOp(jccRel32(ConditionGE)); return m_formatter.immediateRel32(); } - JmpSrc jg() + AssemblerLabel jg() { m_formatter.twoByteOp(jccRel32(ConditionG)); return m_formatter.immediateRel32(); } - JmpSrc ja() + AssemblerLabel ja() { m_formatter.twoByteOp(jccRel32(ConditionA)); return m_formatter.immediateRel32(); } - JmpSrc jae() + AssemblerLabel jae() { m_formatter.twoByteOp(jccRel32(ConditionAE)); return m_formatter.immediateRel32(); } - JmpSrc jo() + AssemblerLabel jo() { m_formatter.twoByteOp(jccRel32(ConditionO)); return m_formatter.immediateRel32(); } - JmpSrc jp() + AssemblerLabel jp() { m_formatter.twoByteOp(jccRel32(ConditionP)); return m_formatter.immediateRel32(); } - JmpSrc js() + AssemblerLabel js() { m_formatter.twoByteOp(jccRel32(ConditionS)); return m_formatter.immediateRel32(); } - JmpSrc jCC(Condition cond) + AssemblerLabel jCC(Condition cond) { m_formatter.twoByteOp(jccRel32(cond)); return m_formatter.immediateRel32(); @@ -1364,7 +1337,7 @@ public: } #if !CPU(X86_64) - void cvtsi2sd_mr(void* address, XMMRegisterID dst) + void cvtsi2sd_mr(const void* address, XMMRegisterID dst) { m_formatter.prefix(PRE_SSE_F2); m_formatter.twoByteOp(OP2_CVTSI2SD_VsdEd, (RegisterID)dst, address); @@ -1397,6 +1370,12 @@ public: } #endif + void movsd_rr(XMMRegisterID src, XMMRegisterID dst) + { + m_formatter.prefix(PRE_SSE_F2); + m_formatter.twoByteOp(OP2_MOVSD_VsdWsd, (RegisterID)dst, (RegisterID)src); + } + void movsd_rm(XMMRegisterID src, int offset, RegisterID base) { m_formatter.prefix(PRE_SSE_F2); @@ -1503,17 +1482,17 @@ public: // Assembler admin methods: - JmpDst label() + size_t codeSize() const { - return JmpDst(m_formatter.size()); + return m_formatter.codeSize(); } - - static JmpDst labelFor(JmpSrc jump, intptr_t offset = 0) + + AssemblerLabel label() { - return JmpDst(jump.m_offset + offset); + return m_formatter.label(); } - - JmpDst align(int alignment) + + AssemblerLabel align(int alignment) { while (!m_formatter.isAligned(alignment)) m_formatter.oneByteOp(OP_HLT); @@ -1529,32 +1508,33 @@ public: // writable region of memory; to modify the code in an execute-only execuable // pool the 'repatch' and 'relink' methods should be used. - void linkJump(JmpSrc from, JmpDst to) + void linkJump(AssemblerLabel from, AssemblerLabel to) { - ASSERT(from.m_offset != -1); - ASSERT(to.m_offset != -1); + ASSERT(from.isSet()); + ASSERT(to.isSet()); char* code = reinterpret_cast(m_formatter.data()); + ASSERT(!reinterpret_cast(code + from.m_offset)[-1]); setRel32(code + from.m_offset, code + to.m_offset); } - static void linkJump(void* code, JmpSrc from, void* to) + static void linkJump(void* code, AssemblerLabel from, void* to) { - ASSERT(from.m_offset != -1); + ASSERT(from.isSet()); setRel32(reinterpret_cast(code) + from.m_offset, to); } - static void linkCall(void* code, JmpSrc from, void* to) + static void linkCall(void* code, AssemblerLabel from, void* to) { - ASSERT(from.m_offset != -1); + ASSERT(from.isSet()); setRel32(reinterpret_cast(code) + from.m_offset, to); } - static void linkPointer(void* code, JmpDst where, void* value) + static void linkPointer(void* code, AssemblerLabel where, void* value) { - ASSERT(where.m_offset != -1); + ASSERT(where.isSet()); setPointer(reinterpret_cast(code) + where.m_offset, value); } @@ -1568,6 +1548,13 @@ public: { setRel32(from, to); } + + static void repatchCompact(void* where, int32_t value) + { + ASSERT(value >= 0); + ASSERT(value <= std::numeric_limits::max()); + setInt8(where, value); + } static void repatchInt32(void* where, int32_t value) { @@ -1578,57 +1565,43 @@ public: { setPointer(where, value); } - - static void repatchLoadPtrToLEA(void* where) - { -#if CPU(X86_64) - // On x86-64 pointer memory accesses require a 64-bit operand, and as such a REX prefix. - // Skip over the prefix byte. - where = reinterpret_cast(where) + 1; -#endif - *reinterpret_cast(where) = static_cast(OP_LEA); - } - static unsigned getCallReturnOffset(JmpSrc call) + static void* readPointer(void* where) { - ASSERT(call.m_offset >= 0); - return call.m_offset; + return reinterpret_cast(where)[-1]; } - static void* getRelocatedAddress(void* code, JmpSrc jump) + static unsigned getCallReturnOffset(AssemblerLabel call) { - ASSERT(jump.m_offset != -1); - - return reinterpret_cast(reinterpret_cast(code) + jump.m_offset); + ASSERT(call.isSet()); + return call.m_offset; } - - static void* getRelocatedAddress(void* code, JmpDst destination) - { - ASSERT(destination.m_offset != -1); - return reinterpret_cast(reinterpret_cast(code) + destination.m_offset); - } - - static int getDifferenceBetweenLabels(JmpDst src, JmpDst dst) + static void* getRelocatedAddress(void* code, AssemblerLabel label) { - return dst.m_offset - src.m_offset; + ASSERT(label.isSet()); + return reinterpret_cast(reinterpret_cast(code) + label.m_offset); } - static int getDifferenceBetweenLabels(JmpDst src, JmpSrc dst) + static int getDifferenceBetweenLabels(AssemblerLabel a, AssemblerLabel b) { - return dst.m_offset - src.m_offset; + return b.m_offset - a.m_offset; } - static int getDifferenceBetweenLabels(JmpSrc src, JmpDst dst) + void* executableCopy(JSGlobalData& globalData, ExecutablePool* allocator) { - return dst.m_offset - src.m_offset; + return m_formatter.executableCopy(globalData, allocator); } - - void* executableCopy(ExecutablePool* allocator) + + void rewindToLabel(AssemblerLabel rewindTo) { m_formatter.rewindToLabel(rewindTo); } + +#ifndef NDEBUG + unsigned debugOffset() { return m_formatter.debugOffset(); } +#endif + + void nop() { - void* copy = m_formatter.executableCopy(allocator); - ASSERT(copy); - return copy; + m_formatter.oneByteOp(OP_NOP); } private: @@ -1642,6 +1615,11 @@ private: { reinterpret_cast(where)[-1] = value; } + + static void setInt8(void* where, int8_t value) + { + reinterpret_cast(where)[-1] = value; + } static void setRel32(void* from, void* to) { @@ -1716,6 +1694,14 @@ private: m_buffer.putByteUnchecked(opcode); memoryModRM_disp32(reg, base, offset); } + + void oneByteOp_disp8(OneByteOpcodeID opcode, int reg, RegisterID base, int offset) + { + m_buffer.ensureSpace(maxInstructionSize); + emitRexIfNeeded(reg, 0, base); + m_buffer.putByteUnchecked(opcode); + memoryModRM_disp8(reg, base, offset); + } void oneByteOp(OneByteOpcodeID opcode, int reg, RegisterID base, RegisterID index, int scale, int offset) { @@ -1726,7 +1712,7 @@ private: } #if !CPU(X86_64) - void oneByteOp(OneByteOpcodeID opcode, int reg, void* address) + void oneByteOp(OneByteOpcodeID opcode, int reg, const void* address) { m_buffer.ensureSpace(maxInstructionSize); m_buffer.putByteUnchecked(opcode); @@ -1822,6 +1808,14 @@ private: m_buffer.putByteUnchecked(opcode); memoryModRM_disp32(reg, base, offset); } + + void oneByteOp64_disp8(OneByteOpcodeID opcode, int reg, RegisterID base, int offset) + { + m_buffer.ensureSpace(maxInstructionSize); + emitRexW(reg, 0, base); + m_buffer.putByteUnchecked(opcode); + memoryModRM_disp8(reg, base, offset); + } void oneByteOp64(OneByteOpcodeID opcode, int reg, RegisterID base, RegisterID index, int scale, int offset) { @@ -1917,18 +1911,29 @@ private: m_buffer.putInt64Unchecked(imm); } - JmpSrc immediateRel32() + AssemblerLabel immediateRel32() { m_buffer.putIntUnchecked(0); - return JmpSrc(m_buffer.size()); + return label(); } // Administrative methods: - size_t size() const { return m_buffer.size(); } + size_t codeSize() const { return m_buffer.codeSize(); } + AssemblerLabel label() const { return m_buffer.label(); } bool isAligned(int alignment) const { return m_buffer.isAligned(alignment); } void* data() const { return m_buffer.data(); } - void* executableCopy(ExecutablePool* allocator) { return m_buffer.executableCopy(allocator); } + + void* executableCopy(JSGlobalData& globalData, ExecutablePool* allocator) + { + return m_buffer.executableCopy(globalData, allocator); + } + + void rewindToLabel(AssemblerLabel rewindTo) { m_buffer.rewindToLabel(rewindTo); } + +#ifndef NDEBUG + unsigned debugOffset() { return m_buffer.debugOffset(); } +#endif private: @@ -2043,7 +2048,24 @@ private: } } } - + + void memoryModRM_disp8(int reg, RegisterID base, int offset) + { + // A base of esp or r12 would be interpreted as a sib, so force a sib with no index & put the base in there. + ASSERT(CAN_SIGN_EXTEND_8_32(offset)); +#if CPU(X86_64) + if ((base == hasSib) || (base == hasSib2)) { +#else + if (base == hasSib) { +#endif + putModRmSib(ModRmMemoryDisp8, reg, base, noIndex, 0); + m_buffer.putByteUnchecked(offset); + } else { + putModRm(ModRmMemoryDisp8, reg, base); + m_buffer.putByteUnchecked(offset); + } + } + void memoryModRM_disp32(int reg, RegisterID base, int offset) { // A base of esp or r12 would be interpreted as a sib, so force a sib with no index & put the base in there. diff --git a/bytecode/CodeBlock.cpp b/bytecode/CodeBlock.cpp index 8cefb1b..fc99e90 100644 --- a/bytecode/CodeBlock.cpp +++ b/bytecode/CodeBlock.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008, 2009 Apple Inc. All rights reserved. + * Copyright (C) 2008, 2009, 2010 Apple Inc. All rights reserved. * Copyright (C) 2008 Cameron Zwarich * * Redistribution and use in source and binary forms, with or without @@ -30,13 +30,16 @@ #include "config.h" #include "CodeBlock.h" -#include "JIT.h" -#include "JSValue.h" +#include "BytecodeGenerator.h" +#include "Debugger.h" #include "Interpreter.h" +#include "JIT.h" +#include "JSActivation.h" #include "JSFunction.h" #include "JSStaticScopeObject.h" -#include "Debugger.h" -#include "BytecodeGenerator.h" +#include "JSValue.h" +#include "RepatchBuffer.h" +#include "UStringConcatenate.h" #include #include @@ -49,9 +52,9 @@ namespace JSC { static UString escapeQuotes(const UString& str) { UString result = str; - unsigned pos = 0; - while ((pos = result.find('\"', pos)) != UString::NotFound) { - result = makeString(result.substr(0, pos), "\"\\\"\"", result.substr(pos + 1)); + size_t pos = 0; + while ((pos = result.find('\"', pos)) != notFound) { + result = makeUString(result.substringSharingImpl(0, pos), "\"\\\"\"", result.substringSharingImpl(pos + 1)); pos += 4; } return result; @@ -63,19 +66,19 @@ static UString valueToSourceString(ExecState* exec, JSValue val) return "0"; if (val.isString()) - return makeString("\"", escapeQuotes(val.toString(exec)), "\""); + return makeUString("\"", escapeQuotes(val.toString(exec)), "\""); return val.toString(exec); } static CString constantName(ExecState* exec, int k, JSValue value) { - return makeString(valueToSourceString(exec, value), "(@k", UString::from(k - FirstConstantRegisterIndex), ")").UTF8String(); + return makeUString(valueToSourceString(exec, value), "(@k", UString::number(k - FirstConstantRegisterIndex), ")").utf8(); } static CString idName(int id0, const Identifier& ident) { - return makeString(ident.ustring(), "(@id", UString::from(id0), ")").UTF8String(); + return makeUString(ident.ustring(), "(@id", UString::number(id0), ")").utf8(); } CString CodeBlock::registerName(ExecState* exec, int r) const @@ -86,7 +89,7 @@ CString CodeBlock::registerName(ExecState* exec, int r) const if (isConstantRegisterIndex(r)) return constantName(exec, r, getConstant(r)); - return makeString("r", UString::from(r)).UTF8String(); + return makeUString("r", UString::number(r)).utf8(); } static UString regexpToSourceString(RegExp* regExp) @@ -100,12 +103,12 @@ static UString regexpToSourceString(RegExp* regExp) if (regExp->multiline()) postfix[index] = 'm'; - return makeString("/", regExp->pattern(), postfix); + return makeUString("/", regExp->pattern(), postfix); } static CString regexpName(int re, RegExp* regexp) { - return makeString(regexpToSourceString(regexp), "(@re", UString::from(re), ")").UTF8String(); + return makeUString(regexpToSourceString(regexp), "(@re", UString::number(re), ")").utf8(); } static UString pointerToSourceString(void* p) @@ -174,7 +177,7 @@ void CodeBlock::printPutByIdOp(ExecState* exec, int location, Vectoru.operand; int r1 = (++it)->u.operand; printf("[%4d] %s\t %s, %s, %s\n", location, op, registerName(exec, r0).data(), idName(id0, m_identifiers[id0]).data(), registerName(exec, r1).data()); - it += 4; + it += 5; } #if ENABLE(JIT) @@ -223,32 +226,32 @@ static unsigned instructionOffsetForNth(ExecState* exec, const VectorgetOpcode(op_get_by_id_proto)) { - printf(" [%4d] %s: %s, %s\n", instructionOffset, "get_by_id_proto", pointerToSourceString(vPC[4].u.structure).UTF8String().data(), pointerToSourceString(vPC[5].u.structure).UTF8String().data()); + printf(" [%4d] %s: %s, %s\n", instructionOffset, "get_by_id_proto", pointerToSourceString(vPC[4].u.structure).utf8().data(), pointerToSourceString(vPC[5].u.structure).utf8().data()); return; } if (vPC[0].u.opcode == interpreter->getOpcode(op_put_by_id_transition)) { - printf(" [%4d] %s: %s, %s, %s\n", instructionOffset, "put_by_id_transition", pointerToSourceString(vPC[4].u.structure).UTF8String().data(), pointerToSourceString(vPC[5].u.structure).UTF8String().data(), pointerToSourceString(vPC[6].u.structureChain).UTF8String().data()); + printf(" [%4d] %s: %s, %s, %s\n", instructionOffset, "put_by_id_transition", pointerToSourceString(vPC[4].u.structure).utf8().data(), pointerToSourceString(vPC[5].u.structure).utf8().data(), pointerToSourceString(vPC[6].u.structureChain).utf8().data()); return; } if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_chain)) { - printf(" [%4d] %s: %s, %s\n", instructionOffset, "get_by_id_chain", pointerToSourceString(vPC[4].u.structure).UTF8String().data(), pointerToSourceString(vPC[5].u.structureChain).UTF8String().data()); + printf(" [%4d] %s: %s, %s\n", instructionOffset, "get_by_id_chain", pointerToSourceString(vPC[4].u.structure).utf8().data(), pointerToSourceString(vPC[5].u.structureChain).utf8().data()); return; } if (vPC[0].u.opcode == interpreter->getOpcode(op_put_by_id)) { @@ -352,7 +355,7 @@ void CodeBlock::dump(ExecState* exec) const printf("\nIdentifiers:\n"); size_t i = 0; do { - printf(" id%u = %s\n", static_cast(i), m_identifiers[i].ascii()); + printf(" id%u = %s\n", static_cast(i), m_identifiers[i].ustring().utf8().data()); ++i; } while (i != m_identifiers.size()); } @@ -362,7 +365,7 @@ void CodeBlock::dump(ExecState* exec) const unsigned registerIndex = m_numVars; size_t i = 0; do { - printf(" k%u = %s\n", registerIndex, valueToSourceString(exec, m_constantRegisters[i].jsValue()).ascii()); + printf(" k%u = %s\n", registerIndex, valueToSourceString(exec, m_constantRegisters[i].get()).utf8().data()); ++i; ++registerIndex; } while (i < m_constantRegisters.size()); @@ -372,7 +375,7 @@ void CodeBlock::dump(ExecState* exec) const printf("\nm_regexps:\n"); size_t i = 0; do { - printf(" re%u = %s\n", static_cast(i), regexpToSourceString(m_rareData->m_regexps[i].get()).ascii()); + printf(" re%u = %s\n", static_cast(i), regexpToSourceString(m_rareData->m_regexps[i].get()).utf8().data()); ++i; } while (i < m_rareData->m_regexps.size()); } @@ -395,7 +398,8 @@ void CodeBlock::dump(ExecState* exec) const ++i; } while (i < m_structureStubInfos.size()); } -#else +#endif +#if ENABLE(INTERPRETER) if (!m_globalResolveInstructions.isEmpty() || !m_propertyAccessInstructions.isEmpty()) printf("\nStructures:\n"); @@ -453,7 +457,7 @@ void CodeBlock::dump(ExecState* exec) const continue; ASSERT(!((i + m_rareData->m_characterSwitchJumpTables[i].min) & ~0xFFFF)); UChar ch = static_cast(entry + m_rareData->m_characterSwitchJumpTables[i].min); - printf("\t\t\"%s\" => %04d\n", UString(&ch, 1).ascii(), *iter); + printf("\t\t\"%s\" => %04d\n", UString(&ch, 1).utf8().data(), *iter); } printf(" }\n"); ++i; @@ -467,7 +471,7 @@ void CodeBlock::dump(ExecState* exec) const printf(" %1d = {\n", i); StringJumpTable::StringOffsetTable::const_iterator end = m_rareData->m_stringSwitchJumpTables[i].offsetTable.end(); for (StringJumpTable::StringOffsetTable::const_iterator iter = m_rareData->m_stringSwitchJumpTables[i].offsetTable.begin(); iter != end; ++iter) - printf("\t\t\"%s\" => %04d\n", UString(iter->first).ascii(), iter->second.branchOffset); + printf("\t\t\"%s\" => %04d\n", UString(iter->first).utf8().data(), iter->second.branchOffset); printf(" }\n"); ++i; } while (i < m_rareData->m_stringSwitchJumpTables.size()); @@ -484,17 +488,30 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& printf("[%4d] enter\n", location); break; } - case op_enter_with_activation: { + case op_create_activation: { int r0 = (++it)->u.operand; - printf("[%4d] enter_with_activation %s\n", location, registerName(exec, r0).data()); + printf("[%4d] create_activation %s\n", location, registerName(exec, r0).data()); break; } case op_create_arguments: { - printf("[%4d] create_arguments\n", location); + int r0 = (++it)->u.operand; + printf("[%4d] create_arguments\t %s\n", location, registerName(exec, r0).data()); break; } - case op_init_arguments: { - printf("[%4d] init_arguments\n", location); + case op_init_lazy_reg: { + int r0 = (++it)->u.operand; + printf("[%4d] init_lazy_reg\t %s\n", location, registerName(exec, r0).data()); + break; + } + case op_get_callee: { + int r0 = (++it)->u.operand; + printf("[%4d] op_get_callee %s\n", location, registerName(exec, r0).data()); + break; + } + case op_create_this: { + int r0 = (++it)->u.operand; + int r1 = (++it)->u.operand; + printf("[%4d] create_this %s %s\n", location, registerName(exec, r0).data(), registerName(exec, r1).data()); break; } case op_convert_this: { @@ -502,6 +519,11 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& printf("[%4d] convert_this %s\n", location, registerName(exec, r0).data()); break; } + case op_convert_this_strict: { + int r0 = (++it)->u.operand; + printf("[%4d] convert_this_strict %s\n", location, registerName(exec, r0).data()); + break; + } case op_new_object: { int r0 = (++it)->u.operand; printf("[%4d] new_object\t %s\n", location, registerName(exec, r0).data()); @@ -514,6 +536,13 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& printf("[%4d] new_array\t %s, %s, %d\n", location, registerName(exec, dst).data(), registerName(exec, argv).data(), argc); break; } + case op_new_array_buffer: { + int dst = (++it)->u.operand; + int argv = (++it)->u.operand; + int argc = (++it)->u.operand; + printf("[%4d] new_array_buffer %s, %d, %d\n", location, registerName(exec, dst).data(), argv, argc); + break; + } case op_new_regexp: { int r0 = (++it)->u.operand; int re0 = (++it)->u.operand; @@ -643,6 +672,11 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& printUnaryOp(exec, location, it, "bitnot"); break; } + case op_check_has_instance: { + int base = (++it)->u.operand; + printf("[%4d] check_has_instance\t\t %s\n", location, registerName(exec, base).data()); + break; + } case op_instanceof: { int r0 = (++it)->u.operand; int r1 = (++it)->u.operand; @@ -698,19 +732,18 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& } case op_resolve_global: { int r0 = (++it)->u.operand; - JSValue scope = JSValue((++it)->u.jsCell); int id0 = (++it)->u.operand; - printf("[%4d] resolve_global\t %s, %s, %s\n", location, registerName(exec, r0).data(), valueToSourceString(exec, scope).ascii(), idName(id0, m_identifiers[id0]).data()); + printf("[%4d] resolve_global\t %s, %s\n", location, registerName(exec, r0).data(), idName(id0, m_identifiers[id0]).data()); it += 2; break; } case op_resolve_global_dynamic: { int r0 = (++it)->u.operand; - JSValue scope = JSValue((++it)->u.jsCell); int id0 = (++it)->u.operand; - int depth = it[2].u.operand; - printf("[%4d] resolve_global_dynamic\t %s, %s, %s, %d\n", location, registerName(exec, r0).data(), valueToSourceString(exec, scope).ascii(), idName(id0, m_identifiers[id0]).data(), depth); - it += 3; + JSValue scope = JSValue((++it)->u.jsCell.get()); + ++it; + int depth = (++it)->u.operand; + printf("[%4d] resolve_global_dynamic\t %s, %s, %s, %d\n", location, registerName(exec, r0).data(), valueToSourceString(exec, scope).utf8().data(), idName(id0, m_identifiers[id0]).data(), depth); break; } case op_get_scoped_var: { @@ -729,22 +762,27 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& } case op_get_global_var: { int r0 = (++it)->u.operand; - JSValue scope = JSValue((++it)->u.jsCell); int index = (++it)->u.operand; - printf("[%4d] get_global_var\t %s, %s, %d\n", location, registerName(exec, r0).data(), valueToSourceString(exec, scope).ascii(), index); + printf("[%4d] get_global_var\t %s, %d\n", location, registerName(exec, r0).data(), index); break; } case op_put_global_var: { - JSValue scope = JSValue((++it)->u.jsCell); int index = (++it)->u.operand; int r0 = (++it)->u.operand; - printf("[%4d] put_global_var\t %s, %d, %s\n", location, valueToSourceString(exec, scope).ascii(), index, registerName(exec, r0).data()); + printf("[%4d] put_global_var\t %d, %s\n", location, index, registerName(exec, r0).data()); break; } case op_resolve_base: { int r0 = (++it)->u.operand; int id0 = (++it)->u.operand; - printf("[%4d] resolve_base\t %s, %s\n", location, registerName(exec, r0).data(), idName(id0, m_identifiers[id0]).data()); + int isStrict = (++it)->u.operand; + printf("[%4d] resolve_base%s\t %s, %s\n", location, isStrict ? "_strict" : "", registerName(exec, r0).data(), idName(id0, m_identifiers[id0]).data()); + break; + } + case op_ensure_property_exists: { + int r0 = (++it)->u.operand; + int id0 = (++it)->u.operand; + printf("[%4d] ensure_property_exists\t %s, %s\n", location, registerName(exec, r0).data(), idName(id0, m_identifiers[id0]).data()); break; } case op_resolve_with_base: { @@ -830,6 +868,11 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& printGetByIdOp(exec, location, it, "get_string_length"); break; } + case op_get_arguments_length: { + printUnaryOp(exec, location, it, "get_arguments_length"); + it++; + break; + } case op_put_by_id: { printPutByIdOp(exec, location, it, "put_by_id"); break; @@ -878,6 +921,13 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& printf("[%4d] get_by_val\t %s, %s, %s\n", location, registerName(exec, r0).data(), registerName(exec, r1).data(), registerName(exec, r2).data()); break; } + case op_get_argument_by_val: { + int r0 = (++it)->u.operand; + int r1 = (++it)->u.operand; + int r2 = (++it)->u.operand; + printf("[%4d] get_argument_by_val\t %s, %s, %s\n", location, registerName(exec, r0).data(), registerName(exec, r1).data(), registerName(exec, r2).data()); + break; + } case op_get_by_pname: { int r0 = (++it)->u.operand; int r1 = (++it)->u.operand; @@ -1016,7 +1066,8 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& case op_new_func: { int r0 = (++it)->u.operand; int f0 = (++it)->u.operand; - printf("[%4d] new_func\t\t %s, f%d\n", location, registerName(exec, r0).data(), f0); + int shouldCheck = (++it)->u.operand; + printf("[%4d] new_func\t\t %s, f%d, %s\n", location, registerName(exec, r0).data(), f0, shouldCheck ? "" : ""); break; } case op_new_func_exp: { @@ -1026,27 +1077,24 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& break; } case op_call: { - int dst = (++it)->u.operand; int func = (++it)->u.operand; int argCount = (++it)->u.operand; int registerOffset = (++it)->u.operand; - printf("[%4d] call\t\t %s, %s, %d, %d\n", location, registerName(exec, dst).data(), registerName(exec, func).data(), argCount, registerOffset); + printf("[%4d] call\t\t %s, %d, %d\n", location, registerName(exec, func).data(), argCount, registerOffset); break; } case op_call_eval: { - int dst = (++it)->u.operand; int func = (++it)->u.operand; int argCount = (++it)->u.operand; int registerOffset = (++it)->u.operand; - printf("[%4d] call_eval\t %s, %s, %d, %d\n", location, registerName(exec, dst).data(), registerName(exec, func).data(), argCount, registerOffset); + printf("[%4d] call_eval\t %s, %d, %d\n", location, registerName(exec, func).data(), argCount, registerOffset); break; } case op_call_varargs: { - int dst = (++it)->u.operand; int func = (++it)->u.operand; int argCount = (++it)->u.operand; int registerOffset = (++it)->u.operand; - printf("[%4d] call_varargs\t %s, %s, %s, %d\n", location, registerName(exec, dst).data(), registerName(exec, func).data(), registerName(exec, argCount).data(), registerOffset); + printf("[%4d] call_varargs\t %s, %s, %d\n", location, registerName(exec, func).data(), registerName(exec, argCount).data(), registerOffset); break; } case op_load_varargs: { @@ -1055,11 +1103,13 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& } case op_tear_off_activation: { int r0 = (++it)->u.operand; - printf("[%4d] tear_off_activation\t %s\n", location, registerName(exec, r0).data()); + int r1 = (++it)->u.operand; + printf("[%4d] tear_off_activation\t %s, %s\n", location, registerName(exec, r0).data(), registerName(exec, r1).data()); break; } case op_tear_off_arguments: { - printf("[%4d] tear_off_arguments\n", location); + int r0 = (++it)->u.operand; + printf("[%4d] tear_off_arguments\t %s\n", location, registerName(exec, r0).data()); break; } case op_ret: { @@ -1067,20 +1117,22 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& printf("[%4d] ret\t\t %s\n", location, registerName(exec, r0).data()); break; } - case op_construct: { - int dst = (++it)->u.operand; - int func = (++it)->u.operand; - int argCount = (++it)->u.operand; - int registerOffset = (++it)->u.operand; - int proto = (++it)->u.operand; - int thisRegister = (++it)->u.operand; - printf("[%4d] construct\t %s, %s, %d, %d, %s, %s\n", location, registerName(exec, dst).data(), registerName(exec, func).data(), argCount, registerOffset, registerName(exec, proto).data(), registerName(exec, thisRegister).data()); + case op_call_put_result: { + int r0 = (++it)->u.operand; + printf("[%4d] op_call_put_result\t\t %s\n", location, registerName(exec, r0).data()); break; } - case op_construct_verify: { + case op_ret_object_or_this: { int r0 = (++it)->u.operand; int r1 = (++it)->u.operand; - printf("[%4d] construct_verify\t %s, %s\n", location, registerName(exec, r0).data(), registerName(exec, r1).data()); + printf("[%4d] constructor_ret\t\t %s %s\n", location, registerName(exec, r0).data(), registerName(exec, r1).data()); + break; + } + case op_construct: { + int func = (++it)->u.operand; + int argCount = (++it)->u.operand; + int registerOffset = (++it)->u.operand; + printf("[%4d] construct\t %s, %d, %d\n", location, registerName(exec, func).data(), argCount, registerOffset); break; } case op_strcat: { @@ -1108,9 +1160,12 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& } case op_next_pname: { int dest = it[1].u.operand; - int iter = it[4].u.operand; - int offset = it[5].u.operand; - printf("[%4d] next_pname\t %s, %s, %d(->%d)\n", location, registerName(exec, dest).data(), registerName(exec, iter).data(), offset, location + offset); + int base = it[2].u.operand; + int i = it[3].u.operand; + int size = it[4].u.operand; + int iter = it[5].u.operand; + int offset = it[6].u.operand; + printf("[%4d] next_pname\t %s, %s, %s, %s, %s, %d(->%d)\n", location, registerName(exec, dest).data(), registerName(exec, base).data(), registerName(exec, i).data(), registerName(exec, size).data(), registerName(exec, iter).data(), offset, location + offset); it += OPCODE_LENGTH(op_next_pname) - 1; break; } @@ -1146,11 +1201,9 @@ void CodeBlock::dump(ExecState* exec, const Vector::const_iterator& printf("[%4d] throw\t\t %s\n", location, registerName(exec, r0).data()); break; } - case op_new_error: { - int r0 = (++it)->u.operand; - int errorType = (++it)->u.operand; + case op_throw_reference_error: { int k0 = (++it)->u.operand; - printf("[%4d] new_error\t %s, %d, %s\n", location, registerName(exec, r0).data(), errorType, constantName(exec, k0, getConstant(k0)).data()); + printf("[%4d] throw_reference_error\t %s\n", location, constantName(exec, k0, getConstant(k0)).data()); break; } case op_jsr: { @@ -1212,13 +1265,10 @@ static HashSet liveCodeBlockSet; macro(immediateSwitchJumpTables) \ macro(characterSwitchJumpTables) \ macro(stringSwitchJumpTables) \ - macro(functionRegisterInfos) - -#define FOR_EACH_MEMBER_VECTOR_EXCEPTION_INFO(macro) \ + macro(evalCodeCache) \ macro(expressionInfo) \ macro(lineInfo) \ - macro(getByIdExceptionInfo) \ - macro(pcVector) + macro(callReturnIndexVector) template static size_t sizeInBytes(const Vector& vector) @@ -1232,7 +1282,6 @@ void CodeBlock::dumpStatistics() #define DEFINE_VARS(name) size_t name##IsNotEmpty = 0; size_t name##TotalSize = 0; FOR_EACH_MEMBER_VECTOR(DEFINE_VARS) FOR_EACH_MEMBER_VECTOR_RARE_DATA(DEFINE_VARS) - FOR_EACH_MEMBER_VECTOR_EXCEPTION_INFO(DEFINE_VARS) #undef DEFINE_VARS // Non-vector data members @@ -1241,7 +1290,6 @@ void CodeBlock::dumpStatistics() size_t symbolTableIsNotEmpty = 0; size_t symbolTableTotalSize = 0; - size_t hasExceptionInfo = 0; size_t hasRareData = 0; size_t isFunctionCode = 0; @@ -1261,13 +1309,6 @@ void CodeBlock::dumpStatistics() symbolTableTotalSize += (codeBlock->m_symbolTable.capacity() * (sizeof(SymbolTable::KeyType) + sizeof(SymbolTable::MappedType))); } - if (codeBlock->m_exceptionInfo) { - hasExceptionInfo++; - #define GET_STATS(name) if (!codeBlock->m_exceptionInfo->m_##name.isEmpty()) { name##IsNotEmpty++; name##TotalSize += sizeInBytes(codeBlock->m_exceptionInfo->m_##name); } - FOR_EACH_MEMBER_VECTOR_EXCEPTION_INFO(GET_STATS) - #undef GET_STATS - } - if (codeBlock->m_rareData) { hasRareData++; #define GET_STATS(name) if (!codeBlock->m_rareData->m_##name.isEmpty()) { name##IsNotEmpty++; name##TotalSize += sizeInBytes(codeBlock->m_rareData->m_##name); } @@ -1296,7 +1337,6 @@ void CodeBlock::dumpStatistics() #define GET_TOTAL_SIZE(name) totalSize += name##TotalSize; FOR_EACH_MEMBER_VECTOR(GET_TOTAL_SIZE) FOR_EACH_MEMBER_VECTOR_RARE_DATA(GET_TOTAL_SIZE) - FOR_EACH_MEMBER_VECTOR_EXCEPTION_INFO(GET_TOTAL_SIZE) #undef GET_TOTAL_SIZE totalSize += symbolTableTotalSize; @@ -1311,13 +1351,11 @@ void CodeBlock::dumpStatistics() printf("Number of GlobalCode CodeBlocks: %zu (%.3f%%)\n", isGlobalCode, static_cast(isGlobalCode) * 100.0 / liveCodeBlockSet.size()); printf("Number of EvalCode CodeBlocks: %zu (%.3f%%)\n", isEvalCode, static_cast(isEvalCode) * 100.0 / liveCodeBlockSet.size()); - printf("Number of CodeBlocks with exception info: %zu (%.3f%%)\n", hasExceptionInfo, static_cast(hasExceptionInfo) * 100.0 / liveCodeBlockSet.size()); printf("Number of CodeBlocks with rare data: %zu (%.3f%%)\n", hasRareData, static_cast(hasRareData) * 100.0 / liveCodeBlockSet.size()); #define PRINT_STATS(name) printf("Number of CodeBlocks with " #name ": %zu\n", name##IsNotEmpty); printf("Size of all " #name ": %zu\n", name##TotalSize); FOR_EACH_MEMBER_VECTOR(PRINT_STATS) FOR_EACH_MEMBER_VECTOR_RARE_DATA(PRINT_STATS) - FOR_EACH_MEMBER_VECTOR_EXCEPTION_INFO(PRINT_STATS) #undef PRINT_STATS printf("Number of CodeBlocks with evalCodeCache: %zu\n", evalCodeCacheIsNotEmpty); @@ -1330,24 +1368,27 @@ void CodeBlock::dumpStatistics() #endif } -CodeBlock::CodeBlock(ScriptExecutable* ownerExecutable, CodeType codeType, PassRefPtr sourceProvider, unsigned sourceOffset, SymbolTable* symTab) - : m_numCalleeRegisters(0) +CodeBlock::CodeBlock(ScriptExecutable* ownerExecutable, CodeType codeType, JSGlobalObject *globalObject, PassRefPtr sourceProvider, unsigned sourceOffset, SymbolTable* symTab, bool isConstructor) + : m_globalObject(globalObject->globalData(), ownerExecutable, globalObject) + , m_heap(&m_globalObject->globalData().heap) + , m_numCalleeRegisters(0) , m_numVars(0) , m_numParameters(0) - , m_ownerExecutable(ownerExecutable) + , m_isConstructor(isConstructor) + , m_ownerExecutable(globalObject->globalData(), ownerExecutable, ownerExecutable) , m_globalData(0) #ifndef NDEBUG , m_instructionCount(0) #endif + , m_argumentsRegister(-1) , m_needsFullScopeChain(ownerExecutable->needsActivation()) , m_usesEval(ownerExecutable->usesEval()) - , m_usesArguments(false) , m_isNumericCompareFunction(false) + , m_isStrictMode(ownerExecutable->isStrictMode()) , m_codeType(codeType) , m_source(sourceProvider) , m_sourceOffset(sourceOffset) , m_symbolTable(symTab) - , m_exceptionInfo(new ExceptionInfo) { ASSERT(m_source); @@ -1358,41 +1399,9 @@ CodeBlock::CodeBlock(ScriptExecutable* ownerExecutable, CodeType codeType, PassR CodeBlock::~CodeBlock() { -#if ENABLE(INTERPRETER) - for (size_t size = m_globalResolveInstructions.size(), i = 0; i < size; ++i) - derefStructures(&m_instructions[m_globalResolveInstructions[i]]); - - for (size_t size = m_propertyAccessInstructions.size(), i = 0; i < size; ++i) - derefStructures(&m_instructions[m_propertyAccessInstructions[i]]); -#endif #if ENABLE(JIT) - for (size_t size = m_globalResolveInfos.size(), i = 0; i < size; ++i) { - if (m_globalResolveInfos[i].structure) - m_globalResolveInfos[i].structure->deref(); - } - for (size_t size = m_structureStubInfos.size(), i = 0; i < size; ++i) m_structureStubInfos[i].deref(); - - for (size_t size = m_callLinkInfos.size(), i = 0; i < size; ++i) { - CallLinkInfo* callLinkInfo = &m_callLinkInfos[i]; - if (callLinkInfo->isLinked()) - callLinkInfo->callee->removeCaller(callLinkInfo); - } - - for (size_t size = m_methodCallLinkInfos.size(), i = 0; i < size; ++i) { - if (Structure* structure = m_methodCallLinkInfos[i].cachedStructure) { - structure->deref(); - // Both members must be filled at the same time - ASSERT(!!m_methodCallLinkInfos[i].cachedPrototypeStructure); - m_methodCallLinkInfos[i].cachedPrototypeStructure->deref(); - } - } - -#if ENABLE(JIT_OPTIMIZE_CALL) - unlinkCallers(); -#endif - #endif // ENABLE(JIT) #if DUMP_CODE_BLOCK_STATISTICS @@ -1400,50 +1409,46 @@ CodeBlock::~CodeBlock() #endif } -#if ENABLE(JIT_OPTIMIZE_CALL) -void CodeBlock::unlinkCallers() -{ - size_t size = m_linkedCallerList.size(); - for (size_t i = 0; i < size; ++i) { - CallLinkInfo* currentCaller = m_linkedCallerList[i]; - JIT::unlinkCall(currentCaller); - currentCaller->setUnlinked(); - } - m_linkedCallerList.clear(); -} -#endif - -void CodeBlock::derefStructures(Instruction* vPC) const +void CodeBlock::visitStructures(SlotVisitor& visitor, Instruction* vPC) const { Interpreter* interpreter = m_globalData->interpreter; + if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id) && vPC[4].u.structure) { + visitor.append(&vPC[4].u.structure); + return; + } + if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_self) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_getter_self) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_custom_self)) { - vPC[4].u.structure->deref(); + visitor.append(&vPC[4].u.structure); return; } if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_proto) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_getter_proto) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_custom_proto)) { - vPC[4].u.structure->deref(); - vPC[5].u.structure->deref(); + visitor.append(&vPC[4].u.structure); + visitor.append(&vPC[5].u.structure); return; } if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_chain) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_getter_chain) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_custom_chain)) { - vPC[4].u.structure->deref(); - vPC[5].u.structureChain->deref(); + visitor.append(&vPC[4].u.structure); + visitor.append(&vPC[5].u.structureChain); return; } if (vPC[0].u.opcode == interpreter->getOpcode(op_put_by_id_transition)) { - vPC[4].u.structure->deref(); - vPC[5].u.structure->deref(); - vPC[6].u.structureChain->deref(); + visitor.append(&vPC[4].u.structure); + visitor.append(&vPC[5].u.structure); + visitor.append(&vPC[6].u.structureChain); + return; + } + if (vPC[0].u.opcode == interpreter->getOpcode(op_put_by_id) && vPC[4].u.structure) { + visitor.append(&vPC[4].u.structure); return; } if (vPC[0].u.opcode == interpreter->getOpcode(op_put_by_id_replace)) { - vPC[4].u.structure->deref(); + visitor.append(&vPC[4].u.structure); return; } if (vPC[0].u.opcode == interpreter->getOpcode(op_resolve_global) || vPC[0].u.opcode == interpreter->getOpcode(op_resolve_global_dynamic)) { - if(vPC[4].u.structure) - vPC[4].u.structure->deref(); + if (vPC[3].u.structure) + visitor.append(&vPC[3].u.structure); return; } if ((vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_proto_list)) @@ -1453,7 +1458,7 @@ void CodeBlock::derefStructures(Instruction* vPC) const || (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_custom_proto_list)) || (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_custom_self_list))) { PolymorphicAccessStructureList* polymorphicStructures = vPC[4].u.polymorphicStructures; - polymorphicStructures->derefStructures(vPC[5].u.operand); + polymorphicStructures->visitAggregate(visitor, vPC[5].u.operand); delete polymorphicStructures; return; } @@ -1462,68 +1467,62 @@ void CodeBlock::derefStructures(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) || vPC[0].u.opcode == interpreter->getOpcode(op_get_array_length) || vPC[0].u.opcode == interpreter->getOpcode(op_get_string_length)); } -void CodeBlock::refStructures(Instruction* vPC) const +void EvalCodeCache::visitAggregate(SlotVisitor& visitor) { - Interpreter* interpreter = m_globalData->interpreter; - - if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_self) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_getter_self) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_custom_self)) { - vPC[4].u.structure->ref(); - return; - } - if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_proto) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_getter_proto) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_custom_proto)) { - vPC[4].u.structure->ref(); - vPC[5].u.structure->ref(); - return; - } - if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_chain) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_getter_chain) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_custom_chain)) { - vPC[4].u.structure->ref(); - vPC[5].u.structureChain->ref(); - return; - } - if (vPC[0].u.opcode == interpreter->getOpcode(op_put_by_id_transition)) { - vPC[4].u.structure->ref(); - vPC[5].u.structure->ref(); - vPC[6].u.structureChain->ref(); - return; - } - if (vPC[0].u.opcode == interpreter->getOpcode(op_put_by_id_replace)) { - vPC[4].u.structure->ref(); - return; - } - - // These instructions don't ref their Structures. - 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)); + EvalCacheMap::iterator end = m_cacheMap.end(); + for (EvalCacheMap::iterator ptr = m_cacheMap.begin(); ptr != end; ++ptr) + visitor.append(&ptr->second); } -void CodeBlock::markAggregate(MarkStack& markStack) +void CodeBlock::visitAggregate(SlotVisitor& visitor) { - for (size_t i = 0; i < m_constantRegisters.size(); ++i) - markStack.append(m_constantRegisters[i].jsValue()); + visitor.append(&m_globalObject); + visitor.append(&m_ownerExecutable); + if (m_rareData) { + m_rareData->m_evalCodeCache.visitAggregate(visitor); + size_t regExpCount = m_rareData->m_regexps.size(); + WriteBarrier* regexps = m_rareData->m_regexps.data(); + for (size_t i = 0; i < regExpCount; i++) + visitor.append(regexps + i); + } + visitor.appendValues(m_constantRegisters.data(), m_constantRegisters.size()); for (size_t i = 0; i < m_functionExprs.size(); ++i) - m_functionExprs[i]->markAggregate(markStack); + visitor.append(&m_functionExprs[i]); for (size_t i = 0; i < m_functionDecls.size(); ++i) - m_functionDecls[i]->markAggregate(markStack); -} + visitor.append(&m_functionDecls[i]); +#if ENABLE(JIT_OPTIMIZE_CALL) + if (visitor.shouldUnlinkCalls()) + unlinkCalls(); + for (unsigned i = 0; i < numberOfCallLinkInfos(); ++i) + if (callLinkInfo(i).isLinked()) + visitor.append(&callLinkInfo(i).callee); +#endif +#if ENABLE(INTERPRETER) + for (size_t size = m_propertyAccessInstructions.size(), i = 0; i < size; ++i) + visitStructures(visitor, &m_instructions[m_propertyAccessInstructions[i]]); + for (size_t size = m_globalResolveInstructions.size(), i = 0; i < size; ++i) + visitStructures(visitor, &m_instructions[m_globalResolveInstructions[i]]); +#endif +#if ENABLE(JIT) + for (size_t size = m_globalResolveInfos.size(), i = 0; i < size; ++i) { + if (m_globalResolveInfos[i].structure) + visitor.append(&m_globalResolveInfos[i].structure); + } -void CodeBlock::reparseForExceptionInfoIfNecessary(CallFrame* callFrame) -{ - if (m_exceptionInfo) - return; + for (size_t size = m_structureStubInfos.size(), i = 0; i < size; ++i) + m_structureStubInfos[i].visitAggregate(visitor); - ScopeChainNode* scopeChain = callFrame->scopeChain(); - if (m_needsFullScopeChain) { - ScopeChain sc(scopeChain); - int scopeDelta = sc.localDepth(); - if (m_codeType == EvalCode) - scopeDelta -= static_cast(this)->baseScopeDepth(); - else if (m_codeType == FunctionCode) - scopeDelta++; // Compilation of function code assumes activation is not on the scope chain yet. - ASSERT(scopeDelta >= 0); - while (scopeDelta--) - scopeChain = scopeChain->next; + for (size_t size = m_methodCallLinkInfos.size(), i = 0; i < size; ++i) { + if (m_methodCallLinkInfos[i].cachedStructure) { + // Both members must be filled at the same time + visitor.append(&m_methodCallLinkInfos[i].cachedStructure); + ASSERT(!!m_methodCallLinkInfos[i].cachedPrototypeStructure); + visitor.append(&m_methodCallLinkInfos[i].cachedPrototypeStructure); + visitor.append(&m_methodCallLinkInfos[i].cachedFunction); + visitor.append(&m_methodCallLinkInfos[i].cachedPrototype); + } } - - m_exceptionInfo.set(m_ownerExecutable->reparseExceptionInfo(m_globalData, scopeChain, this)); +#endif } HandlerInfo* CodeBlock::handlerForBytecodeOffset(unsigned bytecodeOffset) @@ -1544,122 +1543,66 @@ HandlerInfo* CodeBlock::handlerForBytecodeOffset(unsigned bytecodeOffset) return 0; } -int CodeBlock::lineNumberForBytecodeOffset(CallFrame* callFrame, unsigned bytecodeOffset) +int CodeBlock::lineNumberForBytecodeOffset(unsigned bytecodeOffset) { ASSERT(bytecodeOffset < m_instructionCount); - reparseForExceptionInfoIfNecessary(callFrame); - ASSERT(m_exceptionInfo); + if (!m_rareData) + return m_ownerExecutable->source().firstLine(); - if (!m_exceptionInfo->m_lineInfo.size()) - return m_ownerExecutable->source().firstLine(); // Empty function + Vector& lineInfo = m_rareData->m_lineInfo; int low = 0; - int high = m_exceptionInfo->m_lineInfo.size(); + int high = lineInfo.size(); while (low < high) { int mid = low + (high - low) / 2; - if (m_exceptionInfo->m_lineInfo[mid].instructionOffset <= bytecodeOffset) + if (lineInfo[mid].instructionOffset <= bytecodeOffset) low = mid + 1; else high = mid; } - + if (!low) return m_ownerExecutable->source().firstLine(); - return m_exceptionInfo->m_lineInfo[low - 1].lineNumber; + return lineInfo[low - 1].lineNumber; } -int CodeBlock::expressionRangeForBytecodeOffset(CallFrame* callFrame, unsigned bytecodeOffset, int& divot, int& startOffset, int& endOffset) +void CodeBlock::expressionRangeForBytecodeOffset(unsigned bytecodeOffset, int& divot, int& startOffset, int& endOffset) { ASSERT(bytecodeOffset < m_instructionCount); - reparseForExceptionInfoIfNecessary(callFrame); - ASSERT(m_exceptionInfo); - - if (!m_exceptionInfo->m_expressionInfo.size()) { - // We didn't think anything could throw. Apparently we were wrong. + if (!m_rareData) { startOffset = 0; endOffset = 0; divot = 0; - return lineNumberForBytecodeOffset(callFrame, bytecodeOffset); + return; } + Vector& expressionInfo = m_rareData->m_expressionInfo; + int low = 0; - int high = m_exceptionInfo->m_expressionInfo.size(); + int high = expressionInfo.size(); while (low < high) { int mid = low + (high - low) / 2; - if (m_exceptionInfo->m_expressionInfo[mid].instructionOffset <= bytecodeOffset) + if (expressionInfo[mid].instructionOffset <= bytecodeOffset) low = mid + 1; else high = mid; } - + ASSERT(low); if (!low) { startOffset = 0; endOffset = 0; divot = 0; - return lineNumberForBytecodeOffset(callFrame, bytecodeOffset); - } - - startOffset = m_exceptionInfo->m_expressionInfo[low - 1].startOffset; - endOffset = m_exceptionInfo->m_expressionInfo[low - 1].endOffset; - divot = m_exceptionInfo->m_expressionInfo[low - 1].divotPoint + m_sourceOffset; - return lineNumberForBytecodeOffset(callFrame, bytecodeOffset); -} - -bool CodeBlock::getByIdExceptionInfoForBytecodeOffset(CallFrame* callFrame, unsigned bytecodeOffset, OpcodeID& opcodeID) -{ - ASSERT(bytecodeOffset < m_instructionCount); - - reparseForExceptionInfoIfNecessary(callFrame); - ASSERT(m_exceptionInfo); - - if (!m_exceptionInfo->m_getByIdExceptionInfo.size()) - return false; - - int low = 0; - int high = m_exceptionInfo->m_getByIdExceptionInfo.size(); - while (low < high) { - int mid = low + (high - low) / 2; - if (m_exceptionInfo->m_getByIdExceptionInfo[mid].bytecodeOffset <= bytecodeOffset) - low = mid + 1; - else - high = mid; - } - - if (!low || m_exceptionInfo->m_getByIdExceptionInfo[low - 1].bytecodeOffset != bytecodeOffset) - return false; - - opcodeID = m_exceptionInfo->m_getByIdExceptionInfo[low - 1].isOpConstruct ? op_construct : op_instanceof; - return true; -} - -#if ENABLE(JIT) -bool CodeBlock::functionRegisterForBytecodeOffset(unsigned bytecodeOffset, int& functionRegisterIndex) -{ - ASSERT(bytecodeOffset < m_instructionCount); - - if (!m_rareData || !m_rareData->m_functionRegisterInfos.size()) - return false; - - int low = 0; - int high = m_rareData->m_functionRegisterInfos.size(); - while (low < high) { - int mid = low + (high - low) / 2; - if (m_rareData->m_functionRegisterInfos[mid].bytecodeOffset <= bytecodeOffset) - low = mid + 1; - else - high = mid; + return; } - if (!low || m_rareData->m_functionRegisterInfos[low - 1].bytecodeOffset != bytecodeOffset) - return false; - - functionRegisterIndex = m_rareData->m_functionRegisterInfos[low - 1].functionRegisterIndex; - return true; + startOffset = expressionInfo[low - 1].startOffset; + endOffset = expressionInfo[low - 1].endOffset; + divot = expressionInfo[low - 1].divotPoint + m_sourceOffset; + return; } -#endif #if ENABLE(INTERPRETER) bool CodeBlock::hasGlobalResolveInstructionAtBytecodeOffset(unsigned bytecodeOffset) @@ -1716,7 +1659,6 @@ void CodeBlock::shrinkToFit() m_structureStubInfos.shrinkToFit(); m_globalResolveInfos.shrinkToFit(); m_callLinkInfos.shrinkToFit(); - m_linkedCallerList.shrinkToFit(); #endif m_identifiers.shrinkToFit(); @@ -1724,22 +1666,49 @@ void CodeBlock::shrinkToFit() m_functionExprs.shrinkToFit(); m_constantRegisters.shrinkToFit(); - if (m_exceptionInfo) { - m_exceptionInfo->m_expressionInfo.shrinkToFit(); - m_exceptionInfo->m_lineInfo.shrinkToFit(); - m_exceptionInfo->m_getByIdExceptionInfo.shrinkToFit(); - } - if (m_rareData) { m_rareData->m_exceptionHandlers.shrinkToFit(); m_rareData->m_regexps.shrinkToFit(); m_rareData->m_immediateSwitchJumpTables.shrinkToFit(); m_rareData->m_characterSwitchJumpTables.shrinkToFit(); m_rareData->m_stringSwitchJumpTables.shrinkToFit(); + m_rareData->m_expressionInfo.shrinkToFit(); + m_rareData->m_lineInfo.shrinkToFit(); + } +} + +void CodeBlock::createActivation(CallFrame* callFrame) +{ + ASSERT(codeType() == FunctionCode); + ASSERT(needsFullScopeChain()); + ASSERT(!callFrame->uncheckedR(activationRegister()).jsValue()); + JSActivation* activation = new (callFrame) JSActivation(callFrame, static_cast(ownerExecutable())); + callFrame->uncheckedR(activationRegister()) = JSValue(activation); + callFrame->setScopeChain(callFrame->scopeChain()->push(activation)); +} + #if ENABLE(JIT) - m_rareData->m_functionRegisterInfos.shrinkToFit(); -#endif +void CodeBlock::unlinkCalls() +{ + if (!(m_callLinkInfos.size() || m_methodCallLinkInfos.size())) + return; + if (!m_globalData->canUseJIT()) + return; + RepatchBuffer repatchBuffer(this); + for (size_t i = 0; i < m_callLinkInfos.size(); i++) { + if (!m_callLinkInfos[i].isLinked()) + continue; + repatchBuffer.relink(m_callLinkInfos[i].callReturnLocation, m_callLinkInfos[i].isCall ? m_globalData->jitStubs->ctiVirtualCallLink() : m_globalData->jitStubs->ctiVirtualConstructLink()); + m_callLinkInfos[i].unlink(); } } +#endif + +void CodeBlock::clearEvalCache() +{ + if (!m_rareData) + return; + m_rareData->m_evalCodeCache.clear(); +} } // namespace JSC diff --git a/bytecode/CodeBlock.h b/bytecode/CodeBlock.h index 63d9b8a..7aa356e 100644 --- a/bytecode/CodeBlock.h +++ b/bytecode/CodeBlock.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008, 2009 Apple Inc. All rights reserved. + * Copyright (C) 2008, 2009, 2010 Apple Inc. All rights reserved. * Copyright (C) 2008 Cameron Zwarich * * Redistribution and use in source and binary forms, with or without @@ -33,12 +33,14 @@ #include "EvalCodeCache.h" #include "Instruction.h" #include "JITCode.h" +#include "JITWriteBarrier.h" #include "JSGlobalObject.h" #include "JumpTable.h" #include "Nodes.h" -#include "RegExp.h" +#include "RegExpObject.h" #include "UString.h" #include +#include #include #include @@ -46,8 +48,8 @@ #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. +// Register numbers used in bytecode operations have different meaning according to their ranges: +// 0x80000000-0xFFFFFFFF Negative indices 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; @@ -62,6 +64,8 @@ namespace JSC { enum CodeType { GlobalCode, EvalCode, FunctionCode }; + inline int unmodifiedArgumentsRegister(int argumentsRegister) { return argumentsRegister - 1; } + static ALWAYS_INLINE int missingThisObjectMarker() { return std::numeric_limits::max(); } struct HandlerInfo { @@ -90,34 +94,27 @@ namespace JSC { int32_t lineNumber; }; - // Both op_construct and op_instanceof require a use of op_get_by_id to get - // the prototype property from an object. The exception messages for exceptions - // thrown by these instances op_get_by_id need to reflect this. - struct GetByIdExceptionInfo { - unsigned bytecodeOffset : 31; - bool isOpConstruct : 1; - }; - #if ENABLE(JIT) struct CallLinkInfo { CallLinkInfo() - : callee(0) - , position(0) - , hasSeenShouldRepatch(0) + : hasSeenShouldRepatch(false) + , isCall(false) { } - unsigned bytecodeIndex; CodeLocationNearCall callReturnLocation; CodeLocationDataLabelPtr hotPathBegin; CodeLocationNearCall hotPathOther; - CodeBlock* ownerCodeBlock; - CodeBlock* callee; - unsigned position : 31; - unsigned hasSeenShouldRepatch : 1; - - void setUnlinked() { callee = 0; } + JITWriteBarrier callee; + bool hasSeenShouldRepatch : 1; + bool isCall : 1; + bool isLinked() { return callee; } + void unlink() + { + hasSeenShouldRepatch = false; + callee.clear(); + } bool seenOnce() { @@ -132,15 +129,13 @@ namespace JSC { struct MethodCallLinkInfo { MethodCallLinkInfo() - : cachedStructure(0) - , cachedPrototypeStructure(0) { } bool seenOnce() { ASSERT(!cachedStructure); - return cachedPrototypeStructure; + return cachedPrototypeStructure.isFlagged(); } void setSeen() @@ -152,35 +147,26 @@ namespace JSC { // - Once this transition has been taken once, cachedStructure is // null and cachedPrototypeStructure is set to a nun-null value. // - Once the call is linked both structures are set to non-null values. - cachedPrototypeStructure = (Structure*)1; + cachedPrototypeStructure.setFlagOnBarrier(); } CodeLocationCall callReturnLocation; - CodeLocationDataLabelPtr structureLabel; - Structure* cachedStructure; - Structure* cachedPrototypeStructure; - }; - - struct FunctionRegisterInfo { - FunctionRegisterInfo(unsigned bytecodeOffset, int functionRegisterIndex) - : bytecodeOffset(bytecodeOffset) - , functionRegisterIndex(functionRegisterIndex) - { - } - - unsigned bytecodeOffset; - int functionRegisterIndex; + JITWriteBarrier cachedStructure; + JITWriteBarrier cachedPrototypeStructure; + // We'd like this to actually be JSFunction, but InternalFunction and JSFunction + // don't have a common parent class and we allow specialisation on both + JITWriteBarrier cachedFunction; + JITWriteBarrier cachedPrototype; }; struct GlobalResolveInfo { GlobalResolveInfo(unsigned bytecodeOffset) - : structure(0) - , offset(0) + : offset(0) , bytecodeOffset(bytecodeOffset) { } - Structure* structure; + WriteBarrier structure; unsigned offset; unsigned bytecodeOffset; }; @@ -189,18 +175,18 @@ namespace JSC { // (given as an offset in bytes into the JIT code) back to // the bytecode index of the corresponding bytecode operation. // This is then used to look up the corresponding handler. - struct CallReturnOffsetToBytecodeIndex { - CallReturnOffsetToBytecodeIndex(unsigned callReturnOffset, unsigned bytecodeIndex) + struct CallReturnOffsetToBytecodeOffset { + CallReturnOffsetToBytecodeOffset(unsigned callReturnOffset, unsigned bytecodeOffset) : callReturnOffset(callReturnOffset) - , bytecodeIndex(bytecodeIndex) + , bytecodeOffset(bytecodeOffset) { } unsigned callReturnOffset; - unsigned bytecodeIndex; + unsigned bytecodeOffset; }; - // valueAtPosition helpers for the binaryChop algorithm below. + // valueAtPosition helpers for the binarySearch algorithm. inline void* getStructureStubInfoReturnLocation(StructureStubInfo* structureStubInfo) { @@ -217,71 +203,25 @@ namespace JSC { return methodCallLinkInfo->callReturnLocation.executableAddress(); } - inline unsigned getCallReturnOffset(CallReturnOffsetToBytecodeIndex* pc) + inline unsigned getCallReturnOffset(CallReturnOffsetToBytecodeOffset* pc) { return pc->callReturnOffset; } - - // Binary chop algorithm, calls valueAtPosition on pre-sorted elements in array, - // compares result with key (KeyTypes should be comparable with '--', '<', '>'). - // Optimized for cases where the array contains the key, checked by assertions. - template - inline ArrayType* binaryChop(ArrayType* array, size_t size, KeyType key) - { - // The array must contain at least one element (pre-condition, array does conatin key). - // If the array only contains one element, no need to do the comparison. - while (size > 1) { - // Pick an element to check, half way through the array, and read the value. - int pos = (size - 1) >> 1; - KeyType val = valueAtPosition(&array[pos]); - - // If the key matches, success! - if (val == key) - return &array[pos]; - // The item we are looking for is smaller than the item being check; reduce the value of 'size', - // chopping off the right hand half of the array. - else if (key < val) - size = pos; - // Discard all values in the left hand half of the array, up to and including the item at pos. - else { - size -= (pos + 1); - array += (pos + 1); - } - - // 'size' should never reach zero. - ASSERT(size); - } - - // If we reach this point we've chopped down to one element, no need to check it matches - ASSERT(size == 1); - ASSERT(key == valueAtPosition(&array[0])); - return &array[0]; - } -#endif - - struct ExceptionInfo : FastAllocBase { - Vector m_expressionInfo; - Vector m_lineInfo; - Vector m_getByIdExceptionInfo; - -#if ENABLE(JIT) - Vector m_callReturnIndexVector; #endif - }; - class CodeBlock : public FastAllocBase { + class CodeBlock { + WTF_MAKE_FAST_ALLOCATED; friend class JIT; protected: - CodeBlock(ScriptExecutable* ownerExecutable, CodeType, PassRefPtr, unsigned sourceOffset, SymbolTable* symbolTable); + CodeBlock(ScriptExecutable* ownerExecutable, CodeType, JSGlobalObject*, PassRefPtr, unsigned sourceOffset, SymbolTable* symbolTable, bool isConstructor); + + WriteBarrier m_globalObject; + Heap* m_heap; + public: virtual ~CodeBlock(); - void markAggregate(MarkStack&); - void refStructures(Instruction* vPC) const; - void derefStructures(Instruction* vPC) const; -#if ENABLE(JIT_OPTIMIZE_CALL) - void unlinkCallers(); -#endif + void visitAggregate(SlotVisitor&); static void dumpStatistics(); @@ -291,9 +231,11 @@ namespace JSC { void printStructure(const char* name, const Instruction*, int operand) const; #endif + bool isStrictMode() const { return m_isStrictMode; } + inline bool isKnownNotImmediate(int index) { - if (index == m_thisRegister) + if (index == m_thisRegister && !m_isStrictMode) return true; if (isConstantRegisterIndex(index)) @@ -308,55 +250,41 @@ namespace JSC { } HandlerInfo* handlerForBytecodeOffset(unsigned bytecodeOffset); - int lineNumberForBytecodeOffset(CallFrame*, unsigned bytecodeOffset); - int expressionRangeForBytecodeOffset(CallFrame*, unsigned bytecodeOffset, int& divot, int& startOffset, int& endOffset); - bool getByIdExceptionInfoForBytecodeOffset(CallFrame*, unsigned bytecodeOffset, OpcodeID&); + int lineNumberForBytecodeOffset(unsigned bytecodeOffset); + void expressionRangeForBytecodeOffset(unsigned bytecodeOffset, int& divot, int& startOffset, int& endOffset); #if ENABLE(JIT) - void addCaller(CallLinkInfo* caller) - { - caller->callee = this; - caller->position = m_linkedCallerList.size(); - m_linkedCallerList.append(caller); - } - - void removeCaller(CallLinkInfo* caller) - { - unsigned pos = caller->position; - unsigned lastPos = m_linkedCallerList.size() - 1; - - if (pos != lastPos) { - m_linkedCallerList[pos] = m_linkedCallerList[lastPos]; - m_linkedCallerList[pos]->position = pos; - } - m_linkedCallerList.shrink(lastPos); - } StructureStubInfo& getStubInfo(ReturnAddressPtr returnAddress) { - return *(binaryChop(m_structureStubInfos.begin(), m_structureStubInfos.size(), returnAddress.value())); + return *(binarySearch(m_structureStubInfos.begin(), m_structureStubInfos.size(), returnAddress.value())); } CallLinkInfo& getCallLinkInfo(ReturnAddressPtr returnAddress) { - return *(binaryChop(m_callLinkInfos.begin(), m_callLinkInfos.size(), returnAddress.value())); + return *(binarySearch(m_callLinkInfos.begin(), m_callLinkInfos.size(), returnAddress.value())); } MethodCallLinkInfo& getMethodCallLinkInfo(ReturnAddressPtr returnAddress) { - return *(binaryChop(m_methodCallLinkInfos.begin(), m_methodCallLinkInfos.size(), returnAddress.value())); + return *(binarySearch(m_methodCallLinkInfos.begin(), m_methodCallLinkInfos.size(), returnAddress.value())); } - unsigned getBytecodeIndex(CallFrame* callFrame, ReturnAddressPtr returnAddress) + unsigned bytecodeOffset(ReturnAddressPtr returnAddress) { - reparseForExceptionInfoIfNecessary(callFrame); - return binaryChop(callReturnIndexVector().begin(), callReturnIndexVector().size(), ownerExecutable()->generatedJITCode().offsetOf(returnAddress.value()))->bytecodeIndex; + if (!m_rareData) + return 1; + Vector& callIndices = m_rareData->m_callReturnIndexVector; + if (!callIndices.size()) + return 1; + return binarySearch(callIndices.begin(), callIndices.size(), getJITCode().offsetOf(returnAddress.value()))->bytecodeOffset; } - - bool functionRegisterForBytecodeOffset(unsigned bytecodeOffset, int& functionRegisterIndex); + + void unlinkCalls(); #endif + #if ENABLE(INTERPRETER) - unsigned bytecodeOffset(CallFrame*, Instruction* returnAddress) + unsigned bytecodeOffset(Instruction* returnAddress) { return static_cast(returnAddress) - instructions().begin(); } @@ -374,11 +302,11 @@ namespace JSC { #endif #if ENABLE(JIT) - JITCode& getJITCode() { return ownerExecutable()->generatedJITCode(); } - ExecutablePool* executablePool() { return ownerExecutable()->getExecutablePool(); } + JITCode& getJITCode() { return m_isConstructor ? ownerExecutable()->generatedJITCodeForConstruct() : ownerExecutable()->generatedJITCodeForCall(); } + ExecutablePool* executablePool() { return getJITCode().getExecutablePool(); } #endif - ScriptExecutable* ownerExecutable() const { return m_ownerExecutable; } + ScriptExecutable* ownerExecutable() const { return m_ownerExecutable.get(); } void setGlobalData(JSGlobalData* globalData) { m_globalData = globalData; } @@ -389,8 +317,28 @@ namespace JSC { bool needsFullScopeChain() const { return m_needsFullScopeChain; } void setUsesEval(bool usesEval) { m_usesEval = usesEval; } bool usesEval() const { return m_usesEval; } - void setUsesArguments(bool usesArguments) { m_usesArguments = usesArguments; } - bool usesArguments() const { return m_usesArguments; } + + void setArgumentsRegister(int argumentsRegister) + { + ASSERT(argumentsRegister != -1); + m_argumentsRegister = argumentsRegister; + ASSERT(usesArguments()); + } + int argumentsRegister() + { + ASSERT(usesArguments()); + return m_argumentsRegister; + } + void setActivationRegister(int activationRegister) + { + m_activationRegister = activationRegister; + } + int activationRegister() + { + ASSERT(needsFullScopeChain()); + return m_activationRegister; + } + bool usesArguments() const { return m_argumentsRegister != -1; } CodeType codeType() const { return m_codeType; } @@ -402,17 +350,37 @@ namespace JSC { unsigned jumpTarget(int index) const { return m_jumpTargets[index]; } unsigned lastJumpTarget() const { return m_jumpTargets.last(); } + void createActivation(CallFrame*); + + void clearEvalCache(); + #if ENABLE(INTERPRETER) - void addPropertyAccessInstruction(unsigned propertyAccessInstruction) { m_propertyAccessInstructions.append(propertyAccessInstruction); } - void addGlobalResolveInstruction(unsigned globalResolveInstruction) { m_globalResolveInstructions.append(globalResolveInstruction); } + void addPropertyAccessInstruction(unsigned propertyAccessInstruction) + { + if (!m_globalData->canUseJIT()) + m_propertyAccessInstructions.append(propertyAccessInstruction); + } + void addGlobalResolveInstruction(unsigned globalResolveInstruction) + { + if (!m_globalData->canUseJIT()) + m_globalResolveInstructions.append(globalResolveInstruction); + } bool hasGlobalResolveInstructionAtBytecodeOffset(unsigned bytecodeOffset); #endif #if ENABLE(JIT) size_t numberOfStructureStubInfos() const { return m_structureStubInfos.size(); } - void addStructureStubInfo(const StructureStubInfo& stubInfo) { m_structureStubInfos.append(stubInfo); } + void addStructureStubInfo(const StructureStubInfo& stubInfo) + { + if (m_globalData->canUseJIT()) + m_structureStubInfos.append(stubInfo); + } StructureStubInfo& structureStubInfo(int index) { return m_structureStubInfos[index]; } - void addGlobalResolveInfo(unsigned globalResolveInstruction) { m_globalResolveInfos.append(GlobalResolveInfo(globalResolveInstruction)); } + void addGlobalResolveInfo(unsigned globalResolveInstruction) + { + if (m_globalData->canUseJIT()) + m_globalResolveInfos.append(GlobalResolveInfo(globalResolveInstruction)); + } GlobalResolveInfo& globalResolveInfo(int index) { return m_globalResolveInfos[index]; } bool hasGlobalResolveInfoAtBytecodeOffset(unsigned bytecodeOffset); @@ -420,11 +388,17 @@ namespace JSC { void addCallLinkInfo() { m_callLinkInfos.append(CallLinkInfo()); } CallLinkInfo& callLinkInfo(int index) { return m_callLinkInfos[index]; } - void addMethodCallLinkInfos(unsigned n) { m_methodCallLinkInfos.grow(n); } + void addMethodCallLinkInfos(unsigned n) { ASSERT(m_globalData->canUseJIT()); m_methodCallLinkInfos.grow(n); } MethodCallLinkInfo& methodCallLinkInfo(int index) { return m_methodCallLinkInfos[index]; } - - void addFunctionRegisterInfo(unsigned bytecodeOffset, int functionIndex) { createRareDataIfNecessary(); m_rareData->m_functionRegisterInfos.append(FunctionRegisterInfo(bytecodeOffset, functionIndex)); } #endif + unsigned globalResolveInfoCount() const + { +#if ENABLE(JIT) + if (m_globalData->canUseJIT()) + return m_globalResolveInfos.size(); +#endif + return 0; + } // Exception handling support @@ -432,19 +406,38 @@ namespace JSC { void addExceptionHandler(const HandlerInfo& hanler) { createRareDataIfNecessary(); return m_rareData->m_exceptionHandlers.append(hanler); } HandlerInfo& exceptionHandler(int index) { ASSERT(m_rareData); return m_rareData->m_exceptionHandlers[index]; } - bool hasExceptionInfo() const { return m_exceptionInfo; } - void clearExceptionInfo() { m_exceptionInfo.clear(); } - ExceptionInfo* extractExceptionInfo() { ASSERT(m_exceptionInfo); return m_exceptionInfo.release(); } + void addExpressionInfo(const ExpressionRangeInfo& expressionInfo) + { + createRareDataIfNecessary(); + m_rareData->m_expressionInfo.append(expressionInfo); + } - void addExpressionInfo(const ExpressionRangeInfo& expressionInfo) { ASSERT(m_exceptionInfo); m_exceptionInfo->m_expressionInfo.append(expressionInfo); } - void addGetByIdExceptionInfo(const GetByIdExceptionInfo& info) { ASSERT(m_exceptionInfo); m_exceptionInfo->m_getByIdExceptionInfo.append(info); } + void addLineInfo(unsigned bytecodeOffset, int lineNo) + { + createRareDataIfNecessary(); + Vector& lineInfo = m_rareData->m_lineInfo; + if (!lineInfo.size() || lineInfo.last().lineNumber != lineNo) { + LineInfo info = { bytecodeOffset, lineNo }; + lineInfo.append(info); + } + } - size_t numberOfLineInfos() const { ASSERT(m_exceptionInfo); return m_exceptionInfo->m_lineInfo.size(); } - void addLineInfo(const LineInfo& lineInfo) { ASSERT(m_exceptionInfo); m_exceptionInfo->m_lineInfo.append(lineInfo); } - LineInfo& lastLineInfo() { ASSERT(m_exceptionInfo); return m_exceptionInfo->m_lineInfo.last(); } + bool hasExpressionInfo() { return m_rareData && m_rareData->m_expressionInfo.size(); } + bool hasLineInfo() { return m_rareData && m_rareData->m_lineInfo.size(); } + // We only generate exception handling info if the user is debugging + // (and may want line number info), or if the function contains exception handler. + bool needsCallReturnIndices() + { + return m_rareData && + (m_rareData->m_expressionInfo.size() || m_rareData->m_lineInfo.size() || m_rareData->m_exceptionHandlers.size()); + } #if ENABLE(JIT) - Vector& callReturnIndexVector() { ASSERT(m_exceptionInfo); return m_exceptionInfo->m_callReturnIndexVector; } + Vector& callReturnIndexVector() + { + createRareDataIfNecessary(); + return m_rareData->m_callReturnIndexVector; + } #endif // Constant Pool @@ -454,20 +447,57 @@ namespace JSC { Identifier& identifier(int index) { return m_identifiers[index]; } 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 - FirstConstantRegisterIndex]; } + void addConstant(JSValue v) + { + m_constantRegisters.append(WriteBarrier()); + m_constantRegisters.last().set(m_globalObject->globalData(), m_ownerExecutable.get(), v); + } + WriteBarrier& constantRegister(int index) { return m_constantRegisters[index - FirstConstantRegisterIndex]; } ALWAYS_INLINE bool isConstantRegisterIndex(int index) const { return index >= FirstConstantRegisterIndex; } - ALWAYS_INLINE JSValue getConstant(int index) const { return m_constantRegisters[index - FirstConstantRegisterIndex].jsValue(); } + ALWAYS_INLINE JSValue getConstant(int index) const { return m_constantRegisters[index - FirstConstantRegisterIndex].get(); } - unsigned addFunctionDecl(NonNullPassRefPtr n) { unsigned size = m_functionDecls.size(); m_functionDecls.append(n); return size; } + unsigned addFunctionDecl(FunctionExecutable* n) + { + unsigned size = m_functionDecls.size(); + m_functionDecls.append(WriteBarrier()); + m_functionDecls.last().set(m_globalObject->globalData(), m_ownerExecutable.get(), n); + return size; + } FunctionExecutable* functionDecl(int index) { return m_functionDecls[index].get(); } int numberOfFunctionDecls() { return m_functionDecls.size(); } - unsigned addFunctionExpr(NonNullPassRefPtr n) { unsigned size = m_functionExprs.size(); m_functionExprs.append(n); return size; } + unsigned addFunctionExpr(FunctionExecutable* n) + { + unsigned size = m_functionExprs.size(); + m_functionExprs.append(WriteBarrier()); + m_functionExprs.last().set(m_globalObject->globalData(), m_ownerExecutable.get(), n); + return size; + } FunctionExecutable* functionExpr(int index) { return m_functionExprs[index].get(); } - unsigned addRegExp(RegExp* r) { createRareDataIfNecessary(); unsigned size = m_rareData->m_regexps.size(); m_rareData->m_regexps.append(r); return size; } + unsigned addRegExp(RegExp* r) + { + createRareDataIfNecessary(); + unsigned size = m_rareData->m_regexps.size(); + m_rareData->m_regexps.append(WriteBarrier(*m_globalData, ownerExecutable(), r)); + return size; + } RegExp* regexp(int index) const { ASSERT(m_rareData); return m_rareData->m_regexps[index].get(); } + unsigned addConstantBuffer(unsigned length) + { + createRareDataIfNecessary(); + unsigned size = m_rareData->m_constantBuffers.size(); + m_rareData->m_constantBuffers.append(Vector(length)); + return size; + } + + JSValue* constantBuffer(unsigned index) + { + ASSERT(m_rareData); + return m_rareData->m_constantBuffers[index].data(); + } + + JSGlobalObject* globalObject() { return m_globalObject.get(); } // Jump Tables @@ -495,7 +525,9 @@ namespace JSC { int m_numCalleeRegisters; int m_numVars; + int m_numCapturedVars; int m_numParameters; + bool m_isConstructor; private: #if !defined(NDEBUG) || ENABLE(OPCODE_SAMPLING) @@ -508,16 +540,15 @@ namespace JSC { void printGetByIdOp(ExecState*, int location, Vector::const_iterator&, const char* op) const; void printPutByIdOp(ExecState*, int location, Vector::const_iterator&, const char* op) const; #endif - - void reparseForExceptionInfoIfNecessary(CallFrame*); + void visitStructures(SlotVisitor&, Instruction* vPC) const; void createRareDataIfNecessary() { if (!m_rareData) - m_rareData.set(new RareData); + m_rareData = adoptPtr(new RareData); } - ScriptExecutable* m_ownerExecutable; + WriteBarrier m_ownerExecutable; JSGlobalData* m_globalData; Vector m_instructions; @@ -526,11 +557,13 @@ namespace JSC { #endif int m_thisRegister; + int m_argumentsRegister; + int m_activationRegister; bool m_needsFullScopeChain; bool m_usesEval; - bool m_usesArguments; bool m_isNumericCompareFunction; + bool m_isStrictMode; CodeType m_codeType; @@ -546,27 +579,30 @@ namespace JSC { Vector m_globalResolveInfos; Vector m_callLinkInfos; Vector m_methodCallLinkInfos; - Vector m_linkedCallerList; #endif Vector m_jumpTargets; // Constant Pool Vector m_identifiers; - Vector m_constantRegisters; - Vector > m_functionDecls; - Vector > m_functionExprs; + COMPILE_ASSERT(sizeof(Register) == sizeof(WriteBarrier), Register_must_be_same_size_as_WriteBarrier_Unknown); + Vector > m_constantRegisters; + Vector > m_functionDecls; + Vector > m_functionExprs; SymbolTable* m_symbolTable; - OwnPtr m_exceptionInfo; - - struct RareData : FastAllocBase { + struct RareData { + WTF_MAKE_FAST_ALLOCATED; + public: Vector m_exceptionHandlers; // Rare Constants - Vector > m_regexps; + Vector > m_regexps; + // Buffers used for large array literals + Vector > m_constantBuffers; + // Jump Tables Vector m_immediateSwitchJumpTables; Vector m_characterSwitchJumpTables; @@ -574,10 +610,17 @@ namespace JSC { EvalCodeCache m_evalCodeCache; + // Expression info - present if debugging. + Vector m_expressionInfo; + // Line info - present if profiling or debugging. + Vector m_lineInfo; #if ENABLE(JIT) - Vector m_functionRegisterInfos; + Vector m_callReturnIndexVector; #endif }; +#if COMPILER(MSVC) + friend void WTF::deleteOwnedPtr(RareData*); +#endif OwnPtr m_rareData; }; @@ -586,30 +629,19 @@ namespace JSC { class GlobalCodeBlock : public CodeBlock { public: - GlobalCodeBlock(ScriptExecutable* ownerExecutable, CodeType codeType, PassRefPtr sourceProvider, unsigned sourceOffset, JSGlobalObject* globalObject) - : CodeBlock(ownerExecutable, codeType, sourceProvider, sourceOffset, &m_unsharedSymbolTable) - , m_globalObject(globalObject) - { - m_globalObject->codeBlocks().add(this); - } - - ~GlobalCodeBlock() + GlobalCodeBlock(ScriptExecutable* ownerExecutable, CodeType codeType, JSGlobalObject* globalObject, PassRefPtr sourceProvider, unsigned sourceOffset) + : CodeBlock(ownerExecutable, codeType, globalObject, sourceProvider, sourceOffset, &m_unsharedSymbolTable, false) { - if (m_globalObject) - m_globalObject->codeBlocks().remove(this); } - void clearGlobalObject() { m_globalObject = 0; } - private: - JSGlobalObject* m_globalObject; // For program and eval nodes, the global object that marks the constant pool. SymbolTable m_unsharedSymbolTable; }; class ProgramCodeBlock : public GlobalCodeBlock { public: ProgramCodeBlock(ProgramExecutable* ownerExecutable, CodeType codeType, JSGlobalObject* globalObject, PassRefPtr sourceProvider) - : GlobalCodeBlock(ownerExecutable, codeType, sourceProvider, 0, globalObject) + : GlobalCodeBlock(ownerExecutable, codeType, globalObject, sourceProvider, 0) { } }; @@ -617,7 +649,7 @@ namespace JSC { class EvalCodeBlock : public GlobalCodeBlock { public: EvalCodeBlock(EvalExecutable* ownerExecutable, JSGlobalObject* globalObject, PassRefPtr sourceProvider, int baseScopeDepth) - : GlobalCodeBlock(ownerExecutable, EvalCode, sourceProvider, 0, globalObject) + : GlobalCodeBlock(ownerExecutable, EvalCode, globalObject, sourceProvider, 0) , m_baseScopeDepth(baseScopeDepth) { } @@ -643,8 +675,8 @@ namespace JSC { // as we need to initialise the CodeBlock before we could initialise any RefPtr to hold the shared // symbol table, so we just pass as a raw pointer with a ref count of 1. We then manually deref // in the destructor. - FunctionCodeBlock(FunctionExecutable* ownerExecutable, CodeType codeType, PassRefPtr sourceProvider, unsigned sourceOffset) - : CodeBlock(ownerExecutable, codeType, sourceProvider, sourceOffset, new SharedSymbolTable) + FunctionCodeBlock(FunctionExecutable* ownerExecutable, CodeType codeType, JSGlobalObject* globalObject, PassRefPtr sourceProvider, unsigned sourceOffset, bool isConstructor) + : CodeBlock(ownerExecutable, codeType, globalObject, sourceProvider, sourceOffset, SharedSymbolTable::create().leakRef(), isConstructor) { } ~FunctionCodeBlock() @@ -657,10 +689,16 @@ namespace JSC { { CodeBlock* codeBlock = this->codeBlock(); if (codeBlock->isConstantRegisterIndex(index)) - return codeBlock->constantRegister(index); + return *reinterpret_cast(&codeBlock->constantRegister(index)); return this[index]; } + inline Register& ExecState::uncheckedR(int index) + { + ASSERT(index < FirstConstantRegisterIndex); + return this[index]; + } + } // namespace JSC #endif // CodeBlock_h diff --git a/bytecode/EvalCodeCache.h b/bytecode/EvalCodeCache.h index 27c479d..1e181b9 100644 --- a/bytecode/EvalCodeCache.h +++ b/bytecode/EvalCodeCache.h @@ -41,35 +41,45 @@ namespace JSC { + class MarkStack; + typedef MarkStack SlotVisitor; + class EvalCodeCache { public: - PassRefPtr get(ExecState* exec, const UString& evalSource, ScopeChainNode* scopeChain, JSValue& exceptionValue) + EvalExecutable* get(ExecState* exec, ScriptExecutable* owner, bool inStrictContext, const UString& evalSource, ScopeChainNode* scopeChain, JSValue& exceptionValue) { - RefPtr evalExecutable; + EvalExecutable* evalExecutable = 0; - if (evalSource.size() < maxCacheableSourceLength && (*scopeChain->begin())->isVariableObject()) - evalExecutable = m_cacheMap.get(evalSource.rep()); + if (!inStrictContext && evalSource.length() < maxCacheableSourceLength && (*scopeChain->begin())->isVariableObject()) + evalExecutable = m_cacheMap.get(evalSource.impl()).get(); if (!evalExecutable) { - evalExecutable = EvalExecutable::create(exec, makeSource(evalSource)); + evalExecutable = EvalExecutable::create(exec, makeSource(evalSource), inStrictContext); exceptionValue = evalExecutable->compile(exec, scopeChain); if (exceptionValue) return 0; - if (evalSource.size() < maxCacheableSourceLength && (*scopeChain->begin())->isVariableObject() && m_cacheMap.size() < maxCacheEntries) - m_cacheMap.set(evalSource.rep(), evalExecutable); + if (!inStrictContext && evalSource.length() < maxCacheableSourceLength && (*scopeChain->begin())->isVariableObject() && m_cacheMap.size() < maxCacheEntries) + m_cacheMap.set(evalSource.impl(), WriteBarrier(exec->globalData(), owner, evalExecutable)); } - return evalExecutable.release(); + return evalExecutable; } bool isEmpty() const { return m_cacheMap.isEmpty(); } + void visitAggregate(SlotVisitor&); + + void clear() + { + m_cacheMap.clear(); + } + private: static const unsigned maxCacheableSourceLength = 256; static const int maxCacheEntries = 64; - typedef HashMap, RefPtr > EvalCacheMap; + typedef HashMap, WriteBarrier > EvalCacheMap; EvalCacheMap m_cacheMap; }; diff --git a/bytecode/Instruction.h b/bytecode/Instruction.h index c6468a5..b3bb5b7 100644 --- a/bytecode/Instruction.h +++ b/bytecode/Instruction.h @@ -33,6 +33,7 @@ #include "Opcode.h" #include "PropertySlot.h" #include "Structure.h" +#include "StructureChain.h" #include #define POLYMORPHIC_LIST_CACHE_SIZE 8 @@ -54,70 +55,78 @@ 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 : FastAllocBase { + struct PolymorphicAccessStructureList { + WTF_MAKE_FAST_ALLOCATED; + public: struct PolymorphicStubInfo { bool isChain; PolymorphicAccessStructureListStubRoutineType stubRoutine; - Structure* base; + WriteBarrier base; union { - Structure* proto; - StructureChain* chain; + WriteBarrierBase proto; + WriteBarrierBase chain; } u; - void set(PolymorphicAccessStructureListStubRoutineType _stubRoutine, Structure* _base) + PolymorphicStubInfo() + { + u.proto.clear(); + } + + void set(JSGlobalData& globalData, JSCell* owner, PolymorphicAccessStructureListStubRoutineType _stubRoutine, Structure* _base) { stubRoutine = _stubRoutine; - base = _base; - u.proto = 0; + base.set(globalData, owner, _base); + u.proto.clear(); isChain = false; } - void set(PolymorphicAccessStructureListStubRoutineType _stubRoutine, Structure* _base, Structure* _proto) + void set(JSGlobalData& globalData, JSCell* owner, PolymorphicAccessStructureListStubRoutineType _stubRoutine, Structure* _base, Structure* _proto) { stubRoutine = _stubRoutine; - base = _base; - u.proto = _proto; + base.set(globalData, owner, _base); + u.proto.set(globalData, owner, _proto); isChain = false; } - void set(PolymorphicAccessStructureListStubRoutineType _stubRoutine, Structure* _base, StructureChain* _chain) + void set(JSGlobalData& globalData, JSCell* owner, PolymorphicAccessStructureListStubRoutineType _stubRoutine, Structure* _base, StructureChain* _chain) { stubRoutine = _stubRoutine; - base = _base; - u.chain = _chain; + base.set(globalData, owner, _base); + u.chain.set(globalData, owner, _chain); isChain = true; } } list[POLYMORPHIC_LIST_CACHE_SIZE]; - PolymorphicAccessStructureList(PolymorphicAccessStructureListStubRoutineType stubRoutine, Structure* firstBase) + PolymorphicAccessStructureList(JSGlobalData& globalData, JSCell* owner, PolymorphicAccessStructureListStubRoutineType stubRoutine, Structure* firstBase) { - list[0].set(stubRoutine, firstBase); + list[0].set(globalData, owner, stubRoutine, firstBase); } - PolymorphicAccessStructureList(PolymorphicAccessStructureListStubRoutineType stubRoutine, Structure* firstBase, Structure* firstProto) + PolymorphicAccessStructureList(JSGlobalData& globalData, JSCell* owner, PolymorphicAccessStructureListStubRoutineType stubRoutine, Structure* firstBase, Structure* firstProto) { - list[0].set(stubRoutine, firstBase, firstProto); + list[0].set(globalData, owner, stubRoutine, firstBase, firstProto); } - PolymorphicAccessStructureList(PolymorphicAccessStructureListStubRoutineType stubRoutine, Structure* firstBase, StructureChain* firstChain) + PolymorphicAccessStructureList(JSGlobalData& globalData, JSCell* owner, PolymorphicAccessStructureListStubRoutineType stubRoutine, Structure* firstBase, StructureChain* firstChain) { - list[0].set(stubRoutine, firstBase, firstChain); + list[0].set(globalData, owner, stubRoutine, firstBase, firstChain); } - void derefStructures(int count) + void visitAggregate(SlotVisitor& visitor, int count) { for (int i = 0; i < count; ++i) { PolymorphicStubInfo& info = list[i]; - - ASSERT(info.base); - info.base->deref(); - - if (info.u.proto) { - if (info.isChain) - info.u.chain->deref(); - else - info.u.proto->deref(); + if (!info.base) { + // We're being marked during initialisation of an entry + ASSERT(!info.u.proto); + continue; } + + visitor.append(&info.base); + if (info.u.proto && !info.isChain) + visitor.append(&info.u.proto); + if (info.u.chain && info.isChain) + visitor.append(&info.u.chain); } } }; @@ -128,7 +137,7 @@ namespace JSC { #if !ENABLE(COMPUTED_GOTO_INTERPRETER) // We have to initialize one of the pointer members to ensure that // the entire struct is initialized, when opcode is not a pointer. - u.jsCell = 0; + u.jsCell.clear(); #endif u.opcode = opcode; } @@ -137,25 +146,41 @@ namespace JSC { { // We have to initialize one of the pointer members to ensure that // the entire struct is initialized in 64-bit. - u.jsCell = 0; + u.jsCell.clear(); u.operand = operand; } - Instruction(Structure* structure) { u.structure = structure; } - Instruction(StructureChain* structureChain) { u.structureChain = structureChain; } - Instruction(JSCell* jsCell) { u.jsCell = jsCell; } + Instruction(JSGlobalData& globalData, JSCell* owner, Structure* structure) + { + u.structure.clear(); + u.structure.set(globalData, owner, structure); + } + Instruction(JSGlobalData& globalData, JSCell* owner, StructureChain* structureChain) + { + u.structureChain.clear(); + u.structureChain.set(globalData, owner, structureChain); + } + Instruction(JSGlobalData& globalData, JSCell* owner, JSCell* jsCell) + { + u.jsCell.clear(); + u.jsCell.set(globalData, owner, jsCell); + } Instruction(PolymorphicAccessStructureList* polymorphicStructures) { u.polymorphicStructures = polymorphicStructures; } Instruction(PropertySlot::GetValueFunc getterFunc) { u.getterFunc = getterFunc; } union { Opcode opcode; int operand; - Structure* structure; - StructureChain* structureChain; - JSCell* jsCell; + WriteBarrierBase structure; + WriteBarrierBase structureChain; + WriteBarrierBase jsCell; PolymorphicAccessStructureList* polymorphicStructures; PropertySlot::GetValueFunc getterFunc; } u; + + private: + Instruction(StructureChain*); + Instruction(Structure*); }; } // namespace JSC diff --git a/bytecode/JumpTable.h b/bytecode/JumpTable.h index b4f8e44..5bbe047 100644 --- a/bytecode/JumpTable.h +++ b/bytecode/JumpTable.h @@ -45,13 +45,13 @@ namespace JSC { }; struct StringJumpTable { - typedef HashMap, OffsetLocation> StringOffsetTable; + typedef HashMap, OffsetLocation> StringOffsetTable; StringOffsetTable offsetTable; #if ENABLE(JIT) CodeLocationLabel ctiDefault; // FIXME: it should not be necessary to store this. #endif - inline int32_t offsetForValue(UString::Rep* value, int32_t defaultOffset) + inline int32_t offsetForValue(StringImpl* value, int32_t defaultOffset) { StringOffsetTable::const_iterator end = offsetTable.end(); StringOffsetTable::const_iterator loc = offsetTable.find(value); @@ -61,7 +61,7 @@ namespace JSC { } #if ENABLE(JIT) - inline CodeLocationLabel ctiForValue(UString::Rep* value) + inline CodeLocationLabel ctiForValue(StringImpl* value) { StringOffsetTable::const_iterator end = offsetTable.end(); StringOffsetTable::const_iterator loc = offsetTable.find(value); diff --git a/bytecode/Opcode.cpp b/bytecode/Opcode.cpp index bb7696d..0bb714b 100644 --- a/bytecode/Opcode.cpp +++ b/bytecode/Opcode.cpp @@ -30,6 +30,11 @@ #include "config.h" #include "Opcode.h" +#if ENABLE(OPCODE_STATS) +#include +#include +#endif + using namespace std; namespace JSC { @@ -101,10 +106,10 @@ OpcodeStats::~OpcodeStats() for (int j = 0; j < numOpcodeIDs; ++j) totalInstructionPairs += opcodePairCounts[i][j]; - int sortedIndices[numOpcodeIDs]; + FixedArray sortedIndices; for (int i = 0; i < numOpcodeIDs; ++i) sortedIndices[i] = i; - qsort(sortedIndices, numOpcodeIDs, sizeof(int), compareOpcodeIndices); + qsort(sortedIndices.data(), numOpcodeIDs, sizeof(int), compareOpcodeIndices); pair sortedPairIndices[numOpcodeIDs * numOpcodeIDs]; pair* currentPairIndex = sortedPairIndices; diff --git a/bytecode/Opcode.h b/bytecode/Opcode.h index 67f5e70..18902eb 100644 --- a/bytecode/Opcode.h +++ b/bytecode/Opcode.h @@ -39,13 +39,17 @@ namespace JSC { #define FOR_EACH_OPCODE_ID(macro) \ macro(op_enter, 1) \ - macro(op_enter_with_activation, 2) \ - macro(op_init_arguments, 1) \ - macro(op_create_arguments, 1) \ + macro(op_create_activation, 2) \ + macro(op_init_lazy_reg, 2) \ + macro(op_create_arguments, 2) \ + macro(op_create_this, 3) \ + macro(op_get_callee, 2) \ macro(op_convert_this, 2) \ + macro(op_convert_this_strict, 2) \ \ macro(op_new_object, 2) \ macro(op_new_array, 4) \ + macro(op_new_array_buffer, 4) \ macro(op_new_regexp, 3) \ macro(op_mov, 3) \ \ @@ -79,6 +83,7 @@ namespace JSC { macro(op_bitor, 5) \ macro(op_bitnot, 3) \ \ + macro(op_check_has_instance, 2) \ macro(op_instanceof, 5) \ macro(op_typeof, 3) \ macro(op_is_undefined, 3) \ @@ -91,13 +96,14 @@ namespace JSC { \ macro(op_resolve, 3) \ macro(op_resolve_skip, 4) \ - macro(op_resolve_global, 6) \ - macro(op_resolve_global_dynamic, 7) \ + macro(op_resolve_global, 5) \ + macro(op_resolve_global_dynamic, 6) \ macro(op_get_scoped_var, 4) \ macro(op_put_scoped_var, 4) \ - macro(op_get_global_var, 4) \ - macro(op_put_global_var, 4) \ - macro(op_resolve_base, 3) \ + macro(op_get_global_var, 3) \ + macro(op_put_global_var, 3) \ + macro(op_resolve_base, 4) \ + macro(op_ensure_property_exists, 3) \ macro(op_resolve_with_base, 4) \ macro(op_get_by_id, 8) \ macro(op_get_by_id_self, 8) \ @@ -118,12 +124,14 @@ namespace JSC { macro(op_get_by_id_generic, 8) \ macro(op_get_array_length, 8) \ macro(op_get_string_length, 8) \ + macro(op_get_arguments_length, 4) \ macro(op_put_by_id, 9) \ macro(op_put_by_id_transition, 9) \ macro(op_put_by_id_replace, 9) \ macro(op_put_by_id_generic, 9) \ macro(op_del_by_id, 4) \ macro(op_get_by_val, 4) \ + macro(op_get_argument_by_val, 4) \ macro(op_get_by_pname, 7) \ macro(op_put_by_val, 4) \ macro(op_del_by_val, 4) \ @@ -151,19 +159,20 @@ namespace JSC { macro(op_switch_char, 4) \ macro(op_switch_string, 4) \ \ - macro(op_new_func, 3) \ + macro(op_new_func, 4) \ macro(op_new_func_exp, 3) \ - macro(op_call, 5) \ - macro(op_call_eval, 5) \ - macro(op_call_varargs, 5) \ - macro(op_load_varargs, 3) \ - macro(op_tear_off_activation, 2) \ - macro(op_tear_off_arguments, 1) \ + macro(op_call, 4) \ + macro(op_call_eval, 4) \ + macro(op_call_varargs, 4) \ + macro(op_load_varargs, 4) \ + macro(op_tear_off_activation, 3) \ + macro(op_tear_off_arguments, 2) \ macro(op_ret, 2) \ + macro(op_call_put_result, 2) \ + macro(op_ret_object_or_this, 3) \ macro(op_method_check, 1) \ \ - macro(op_construct, 7) \ - macro(op_construct_verify, 3) \ + macro(op_construct, 4) \ macro(op_strcat, 4) \ macro(op_to_primitive, 3) \ \ @@ -176,7 +185,7 @@ namespace JSC { \ macro(op_catch, 2) \ macro(op_throw, 2) \ - macro(op_new_error, 4) \ + macro(op_throw_reference_error, 2) \ \ macro(op_jsr, 3) \ macro(op_sret, 2) \ @@ -208,7 +217,7 @@ namespace JSC { #undef VERIFY_OPCODE_ID #if ENABLE(COMPUTED_GOTO_INTERPRETER) -#if COMPILER(RVCT) +#if COMPILER(RVCT) || COMPILER(INTEL) typedef void* Opcode; #else typedef const void* Opcode; @@ -251,6 +260,17 @@ namespace JSC { #endif + inline size_t opcodeLength(OpcodeID opcode) + { + switch (opcode) { +#define OPCODE_ID_LENGTHS(id, length) case id: return OPCODE_LENGTH(id); + FOR_EACH_OPCODE_ID(OPCODE_ID_LENGTHS) +#undef OPCODE_ID_LENGTHS + } + ASSERT_NOT_REACHED(); + return 0; + } + } // namespace JSC #endif // Opcode_h diff --git a/bytecode/SamplingTool.cpp b/bytecode/SamplingTool.cpp index 7191e38..f47e698 100644 --- a/bytecode/SamplingTool.cpp +++ b/bytecode/SamplingTool.cpp @@ -337,7 +337,7 @@ void SamplingTool::dump(ExecState* exec) if (blockPercent >= 1) { //Instruction* code = codeBlock->instructions().begin(); - printf("#%d: %s:%d: %d / %lld (%.3f%%)\n", i + 1, record->m_executable->sourceURL().ascii(), codeBlock->lineNumberForBytecodeOffset(exec, 0), record->m_sampleCount, m_sampleCount, blockPercent); + printf("#%d: %s:%d: %d / %lld (%.3f%%)\n", i + 1, record->m_executable->sourceURL().utf8().data(), codeBlock->lineNumberForBytecodeOffset(0), record->m_sampleCount, m_sampleCount, blockPercent); if (i < 10) { HashMap lineCounts; codeBlock->dump(exec); @@ -347,7 +347,7 @@ void SamplingTool::dump(ExecState* exec) int count = record->m_samples[op]; if (count) { printf(" [% 4d] has sample count: % 4d\n", op, count); - unsigned line = codeBlock->lineNumberForBytecodeOffset(exec, op); + unsigned line = codeBlock->lineNumberForBytecodeOffset(op); lineCounts.set(line, (lineCounts.contains(line) ? lineCounts.get(line) : 0) + count); } } diff --git a/bytecode/SamplingTool.h b/bytecode/SamplingTool.h index 8e3ed9e..1d77b31 100644 --- a/bytecode/SamplingTool.h +++ b/bytecode/SamplingTool.h @@ -29,19 +29,18 @@ #ifndef SamplingTool_h #define SamplingTool_h +#include "Strong.h" +#include "Nodes.h" +#include "Opcode.h" #include #include #include -#include "Nodes.h" -#include "Opcode.h" - namespace JSC { class ScriptExecutable; class SamplingFlags { - friend class JIT; public: static void start(); static void stop(); @@ -80,6 +79,11 @@ namespace JSC { int m_flag; }; + static const void* addressOfFlags() + { + return &s_flags; + } + #endif private: static uint32_t s_flags; @@ -95,8 +99,8 @@ namespace JSC { struct Instruction; struct ScriptSampleRecord { - ScriptSampleRecord(ScriptExecutable* executable) - : m_executable(executable) + ScriptSampleRecord(JSGlobalData& globalData, ScriptExecutable* executable) + : m_executable(globalData, executable) , m_codeBlock(0) , m_sampleCount(0) , m_opcodeSampleCount(0) @@ -113,7 +117,7 @@ namespace JSC { void sample(CodeBlock*, Instruction*); - RefPtr m_executable; + Strong m_executable; CodeBlock* m_codeBlock; int m_sampleCount; int m_opcodeSampleCount; @@ -142,7 +146,8 @@ namespace JSC { friend class HostCallRecord; #if ENABLE(OPCODE_SAMPLING) - class CallRecord : public Noncopyable { + class CallRecord { + WTF_MAKE_NONCOPYABLE(CallRecord); public: CallRecord(SamplingTool* samplingTool) : m_samplingTool(samplingTool) @@ -172,7 +177,8 @@ namespace JSC { } }; #else - class CallRecord : public Noncopyable { + class CallRecord { + WTF_MAKE_NONCOPYABLE(CallRecord); public: CallRecord(SamplingTool*) { @@ -278,7 +284,6 @@ namespace JSC { // Implements a named set of counters, printed on exit if ENABLE(SAMPLING_COUNTERS). // See subclasses below, SamplingCounter, GlobalSamplingCounter and DeletableSamplingCounter. class AbstractSamplingCounter { - friend class JIT; friend class DeletableSamplingCounter; public: void count(uint32_t count = 1) @@ -288,6 +293,8 @@ namespace JSC { static void dump(); + int64_t* addressOfCounter() { return &m_counter; } + protected: // Effectively the contructor, however called lazily in the case of GlobalSamplingCounter. void init(const char* name) diff --git a/bytecode/StructureStubInfo.cpp b/bytecode/StructureStubInfo.cpp index 018d832..9dd41a6 100644 --- a/bytecode/StructureStubInfo.cpp +++ b/bytecode/StructureStubInfo.cpp @@ -26,42 +26,74 @@ #include "config.h" #include "StructureStubInfo.h" +#include "JSObject.h" +#include "ScopeChain.h" + namespace JSC { #if ENABLE(JIT) void StructureStubInfo::deref() +{ + switch (accessType) { + case access_get_by_id_self_list: { + PolymorphicAccessStructureList* polymorphicStructures = u.getByIdSelfList.structureList; + delete polymorphicStructures; + return; + } + case access_get_by_id_proto_list: { + PolymorphicAccessStructureList* polymorphicStructures = u.getByIdProtoList.structureList; + delete polymorphicStructures; + return; + } + case access_get_by_id_self: + case access_get_by_id_proto: + case access_get_by_id_chain: + case access_put_by_id_transition: + case access_put_by_id_replace: + 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 have to release any allocated memory + return; + default: + ASSERT_NOT_REACHED(); + } +} + +void StructureStubInfo::visitAggregate(SlotVisitor& visitor) { switch (accessType) { case access_get_by_id_self: - u.getByIdSelf.baseObjectStructure->deref(); + visitor.append(&u.getByIdSelf.baseObjectStructure); return; case access_get_by_id_proto: - u.getByIdProto.baseObjectStructure->deref(); - u.getByIdProto.prototypeStructure->deref(); + visitor.append(&u.getByIdProto.baseObjectStructure); + visitor.append(&u.getByIdProto.prototypeStructure); return; case access_get_by_id_chain: - u.getByIdChain.baseObjectStructure->deref(); - u.getByIdChain.chain->deref(); + visitor.append(&u.getByIdChain.baseObjectStructure); + visitor.append(&u.getByIdChain.chain); return; case access_get_by_id_self_list: { PolymorphicAccessStructureList* polymorphicStructures = u.getByIdSelfList.structureList; - polymorphicStructures->derefStructures(u.getByIdSelfList.listSize); - delete polymorphicStructures; + polymorphicStructures->visitAggregate(visitor, u.getByIdSelfList.listSize); return; } case access_get_by_id_proto_list: { PolymorphicAccessStructureList* polymorphicStructures = u.getByIdProtoList.structureList; - polymorphicStructures->derefStructures(u.getByIdProtoList.listSize); - delete polymorphicStructures; + polymorphicStructures->visitAggregate(visitor, u.getByIdProtoList.listSize); return; } case access_put_by_id_transition: - u.putByIdTransition.previousStructure->deref(); - u.putByIdTransition.structure->deref(); - u.putByIdTransition.chain->deref(); + visitor.append(&u.putByIdTransition.previousStructure); + visitor.append(&u.putByIdTransition.structure); + visitor.append(&u.putByIdTransition.chain); return; case access_put_by_id_replace: - u.putByIdReplace.baseObjectStructure->deref(); + visitor.append(&u.putByIdReplace.baseObjectStructure); return; case access_get_by_id: case access_put_by_id: @@ -69,7 +101,7 @@ void StructureStubInfo::deref() case access_put_by_id_generic: case access_get_array_length: case access_get_string_length: - // These instructions don't ref their Structures. + // These instructions don't need to mark anything return; default: ASSERT_NOT_REACHED(); diff --git a/bytecode/StructureStubInfo.h b/bytecode/StructureStubInfo.h index 8e2c489..7f11edd 100644 --- a/bytecode/StructureStubInfo.h +++ b/bytecode/StructureStubInfo.h @@ -58,34 +58,27 @@ namespace JSC { { } - void initGetByIdSelf(Structure* baseObjectStructure) + void initGetByIdSelf(JSGlobalData& globalData, JSCell* owner, Structure* baseObjectStructure) { accessType = access_get_by_id_self; - u.getByIdSelf.baseObjectStructure = baseObjectStructure; - baseObjectStructure->ref(); + u.getByIdSelf.baseObjectStructure.set(globalData, owner, baseObjectStructure); } - void initGetByIdProto(Structure* baseObjectStructure, Structure* prototypeStructure) + void initGetByIdProto(JSGlobalData& globalData, JSCell* owner, Structure* baseObjectStructure, Structure* prototypeStructure) { accessType = access_get_by_id_proto; - u.getByIdProto.baseObjectStructure = baseObjectStructure; - baseObjectStructure->ref(); - - u.getByIdProto.prototypeStructure = prototypeStructure; - prototypeStructure->ref(); + u.getByIdProto.baseObjectStructure.set(globalData, owner, baseObjectStructure); + u.getByIdProto.prototypeStructure.set(globalData, owner, prototypeStructure); } - void initGetByIdChain(Structure* baseObjectStructure, StructureChain* chain) + void initGetByIdChain(JSGlobalData& globalData, JSCell* owner, Structure* baseObjectStructure, StructureChain* chain) { accessType = access_get_by_id_chain; - u.getByIdChain.baseObjectStructure = baseObjectStructure; - baseObjectStructure->ref(); - - u.getByIdChain.chain = chain; - chain->ref(); + u.getByIdChain.baseObjectStructure.set(globalData, owner, baseObjectStructure); + u.getByIdChain.chain.set(globalData, owner, chain); } void initGetByIdSelfList(PolymorphicAccessStructureList* structureList, int listSize) @@ -106,29 +99,24 @@ namespace JSC { // PutById* - void initPutByIdTransition(Structure* previousStructure, Structure* structure, StructureChain* chain) + void initPutByIdTransition(JSGlobalData& globalData, JSCell* owner, Structure* previousStructure, Structure* structure, StructureChain* chain) { accessType = access_put_by_id_transition; - u.putByIdTransition.previousStructure = previousStructure; - previousStructure->ref(); - - u.putByIdTransition.structure = structure; - structure->ref(); - - u.putByIdTransition.chain = chain; - chain->ref(); + u.putByIdTransition.previousStructure.set(globalData, owner, previousStructure); + u.putByIdTransition.structure.set(globalData, owner, structure); + u.putByIdTransition.chain.set(globalData, owner, chain); } - void initPutByIdReplace(Structure* baseObjectStructure) + void initPutByIdReplace(JSGlobalData& globalData, JSCell* owner, Structure* baseObjectStructure) { accessType = access_put_by_id_replace; - u.putByIdReplace.baseObjectStructure = baseObjectStructure; - baseObjectStructure->ref(); + u.putByIdReplace.baseObjectStructure.set(globalData, owner, baseObjectStructure); } void deref(); + void visitAggregate(SlotVisitor&); bool seenOnce() { @@ -145,15 +133,15 @@ namespace JSC { union { struct { - Structure* baseObjectStructure; + WriteBarrierBase baseObjectStructure; } getByIdSelf; struct { - Structure* baseObjectStructure; - Structure* prototypeStructure; + WriteBarrierBase baseObjectStructure; + WriteBarrierBase prototypeStructure; } getByIdProto; struct { - Structure* baseObjectStructure; - StructureChain* chain; + WriteBarrierBase baseObjectStructure; + WriteBarrierBase chain; } getByIdChain; struct { PolymorphicAccessStructureList* structureList; @@ -164,12 +152,12 @@ namespace JSC { int listSize; } getByIdProtoList; struct { - Structure* previousStructure; - Structure* structure; - StructureChain* chain; + WriteBarrierBase previousStructure; + WriteBarrierBase structure; + WriteBarrierBase chain; } putByIdTransition; struct { - Structure* baseObjectStructure; + WriteBarrierBase baseObjectStructure; } putByIdReplace; } u; diff --git a/bytecompiler/BytecodeGenerator.cpp b/bytecompiler/BytecodeGenerator.cpp index c4b3cab..c09a837 100644 --- a/bytecompiler/BytecodeGenerator.cpp +++ b/bytecompiler/BytecodeGenerator.cpp @@ -31,9 +31,9 @@ #include "BytecodeGenerator.h" #include "BatchedTransitionOptimizer.h" -#include "PrototypeFunction.h" #include "JSFunction.h" #include "Interpreter.h" +#include "ScopeChain.h" #include "UString.h" using namespace std; @@ -137,7 +137,7 @@ bool BytecodeGenerator::dumpsGeneratedCode() #endif } -void BytecodeGenerator::generate() +JSObject* BytecodeGenerator::generate() { m_codeBlock->setThisRegister(m_thisRegister.index()); @@ -147,35 +147,31 @@ void BytecodeGenerator::generate() m_codeBlock->setInstructionCount(m_codeBlock->instructions().size()); if (s_dumpsGeneratedCode) - m_codeBlock->dump(m_scopeChain->globalObject()->globalExec()); + m_codeBlock->dump(m_scopeChain->globalObject->globalExec()); #endif if ((m_codeType == FunctionCode && !m_codeBlock->needsFullScopeChain() && !m_codeBlock->usesArguments()) || m_codeType == EvalCode) symbolTable().clear(); - - m_codeBlock->setIsNumericCompareFunction(instructions() == m_globalData->numericCompareFunction(m_scopeChain->globalObject()->globalExec())); - -#if !ENABLE(OPCODE_SAMPLING) - if (!m_regeneratingForExceptionInfo && (m_codeType == FunctionCode || m_codeType == EvalCode)) - m_codeBlock->clearExceptionInfo(); -#endif m_codeBlock->shrinkToFit(); + + if (m_expressionTooDeep) + return createOutOfMemoryError(m_scopeChain->globalObject.get()); + return 0; } bool BytecodeGenerator::addVar(const Identifier& ident, bool isConstant, RegisterID*& r0) { int index = m_calleeRegisters.size(); SymbolTableEntry newEntry(index, isConstant ? ReadOnly : 0); - pair result = symbolTable().add(ident.ustring().rep(), newEntry); + pair result = symbolTable().add(ident.impl(), newEntry); if (!result.second) { r0 = ®isterFor(result.first->second.getIndex()); return false; } - ++m_codeBlock->m_numVars; - r0 = newRegister(); + r0 = addVar(); return true; } @@ -183,7 +179,7 @@ bool BytecodeGenerator::addGlobalVar(const Identifier& ident, bool isConstant, R { int index = m_nextGlobalIndex; SymbolTableEntry newEntry(index, isConstant ? ReadOnly : 0); - pair result = symbolTable().add(ident.ustring().rep(), newEntry); + pair result = symbolTable().add(ident.impl(), newEntry); if (!result.second) index = result.first->second.getIndex(); @@ -202,10 +198,11 @@ void BytecodeGenerator::preserveLastVar() m_lastVar = &m_calleeRegisters.last(); } -BytecodeGenerator::BytecodeGenerator(ProgramNode* programNode, const Debugger* debugger, const ScopeChain& scopeChain, SymbolTable* symbolTable, ProgramCodeBlock* codeBlock) - : m_shouldEmitDebugHooks(!!debugger) - , m_shouldEmitProfileHooks(scopeChain.globalObject()->supportsProfiling()) - , m_scopeChain(&scopeChain) +BytecodeGenerator::BytecodeGenerator(ProgramNode* programNode, ScopeChainNode* scopeChain, SymbolTable* symbolTable, ProgramCodeBlock* codeBlock) + : m_shouldEmitDebugHooks(scopeChain->globalObject->debugger()) + , m_shouldEmitProfileHooks(scopeChain->globalObject->supportsProfiling()) + , m_shouldEmitRichSourceInfo(scopeChain->globalObject->supportsRichSourceInfo()) + , m_scopeChain(*scopeChain->globalData, scopeChain) , m_symbolTable(symbolTable) , m_scopeNode(programNode) , m_codeBlock(codeBlock) @@ -217,11 +214,17 @@ BytecodeGenerator::BytecodeGenerator(ProgramNode* programNode, const Debugger* d , m_nextGlobalIndex(-1) , m_nextConstantOffset(0) , m_globalConstantIndex(0) - , m_globalData(&scopeChain.globalObject()->globalExec()->globalData()) + , m_hasCreatedActivation(true) + , m_firstLazyFunction(0) + , m_lastLazyFunction(0) + , m_globalData(scopeChain->globalData) , m_lastOpcodeID(op_end) - , m_emitNodeDepth(0) - , m_regeneratingForExceptionInfo(false) - , m_codeBlockBeingRegeneratedFrom(0) +#ifndef NDEBUG + , m_lastOpcodePosition(0) +#endif + , m_stack(m_globalData->stack()) + , m_usesExceptions(false) + , m_expressionTooDeep(false) { if (m_shouldEmitDebugHooks) m_codeBlock->setNeedsFullScopeChain(true); @@ -233,7 +236,7 @@ BytecodeGenerator::BytecodeGenerator(ProgramNode* programNode, const Debugger* d m_codeBlock->m_numParameters = 1; // Allocate space for "this" - JSGlobalObject* globalObject = scopeChain.globalObject(); + JSGlobalObject* globalObject = scopeChain->globalObject.get(); ExecState* exec = globalObject->globalExec(); RegisterFile* registerFile = &exec->globalData().interpreter->registerFile(); @@ -245,8 +248,8 @@ BytecodeGenerator::BytecodeGenerator(ProgramNode* programNode, const Debugger* d SymbolTable::iterator end = symbolTable->end(); for (SymbolTable::iterator it = symbolTable->begin(); it != end; ++it) registerFor(it->second.getIndex()).setIndex(it->second.getIndex() + m_globalVarStorageOffset); - - BatchedTransitionOptimizer optimizer(globalObject); + + BatchedTransitionOptimizer optimizer(*m_globalData, globalObject); const VarStack& varStack = programNode->varStack(); const FunctionStack& functionStack = programNode->functionStack(); @@ -255,28 +258,56 @@ BytecodeGenerator::BytecodeGenerator(ProgramNode* programNode, const Debugger* d // Shift new symbols so they get stored prior to existing symbols. m_nextGlobalIndex -= symbolTable->size(); + HashSet newGlobals; + Vector, 16> functionInfo(functionStack.size()); + for (size_t i = 0; i < functionStack.size(); ++i) { + FunctionBodyNode* function = functionStack[i]; + globalObject->removeDirect(*m_globalData, function->ident()); // Make sure our new function is not shadowed by an old property. + SymbolTableEntry entry = symbolTable->inlineGet(function->ident().impl()); + + if (entry.isNull()) + newGlobals.add(function->ident().impl()); + functionInfo[i] = make_pair(entry.getIndex(), entry.isReadOnly()); + } + + Vector shouldCreateVar(varStack.size()); + for (size_t i = 0; i < varStack.size(); ++i) { + if (newGlobals.contains(varStack[i].first->impl()) || globalObject->hasProperty(exec, *varStack[i].first)) { + shouldCreateVar[i] = false; + continue; + } + shouldCreateVar[i] = true; + newGlobals.add(varStack[i].first->impl()); + } + + int expectedSize = symbolTable->size() + newGlobals.size(); + globalObject->resizeRegisters(symbolTable->size(), expectedSize); + for (size_t i = 0; i < functionStack.size(); ++i) { FunctionBodyNode* function = functionStack[i]; - globalObject->removeDirect(function->ident()); // Make sure our new function is not shadowed by an old property. - emitNewFunction(addGlobalVar(function->ident(), false), function); + if (functionInfo[i].second) + continue; + RegisterID* dst = addGlobalVar(function->ident(), false); + JSValue value = new (exec) JSFunction(exec, makeFunction(exec, function), scopeChain); + globalObject->registerAt(dst->index() - m_globalVarStorageOffset).set(*m_globalData, globalObject, value); } - Vector newVars; - for (size_t i = 0; i < varStack.size(); ++i) - if (!globalObject->hasProperty(exec, *varStack[i].first)) - newVars.append(addGlobalVar(*varStack[i].first, varStack[i].second & DeclarationStacks::IsConstant)); + for (size_t i = 0; i < varStack.size(); ++i) { + if (!shouldCreateVar[i]) + continue; + addGlobalVar(*varStack[i].first, varStack[i].second & DeclarationStacks::IsConstant); + } + if (symbolTable->size() != expectedSize) + CRASH(); preserveLastVar(); - - for (size_t i = 0; i < newVars.size(); ++i) - emitLoad(newVars[i], jsUndefined()); } else { for (size_t i = 0; i < functionStack.size(); ++i) { FunctionBodyNode* function = functionStack[i]; - globalObject->putWithAttributes(exec, function->ident(), new (exec) JSFunction(exec, makeFunction(exec, function), scopeChain.node()), DontDelete); + globalObject->putWithAttributes(exec, function->ident(), new (exec) JSFunction(exec, makeFunction(exec, function), scopeChain), DontDelete); } for (size_t i = 0; i < varStack.size(); ++i) { - if (globalObject->hasProperty(exec, *varStack[i].first)) + if (globalObject->symbolTableHasProperty(*varStack[i].first) || globalObject->hasProperty(exec, *varStack[i].first)) continue; int attributes = DontDelete; if (varStack[i].second & DeclarationStacks::IsConstant) @@ -286,94 +317,178 @@ BytecodeGenerator::BytecodeGenerator(ProgramNode* programNode, const Debugger* d preserveLastVar(); } + codeBlock->m_numCapturedVars = codeBlock->m_numVars; } -BytecodeGenerator::BytecodeGenerator(FunctionBodyNode* functionBody, const Debugger* debugger, const ScopeChain& scopeChain, SymbolTable* symbolTable, CodeBlock* codeBlock) - : m_shouldEmitDebugHooks(!!debugger) - , m_shouldEmitProfileHooks(scopeChain.globalObject()->supportsProfiling()) - , m_scopeChain(&scopeChain) +BytecodeGenerator::BytecodeGenerator(FunctionBodyNode* functionBody, ScopeChainNode* scopeChain, SymbolTable* symbolTable, CodeBlock* codeBlock) + : m_shouldEmitDebugHooks(scopeChain->globalObject->debugger()) + , m_shouldEmitProfileHooks(scopeChain->globalObject->supportsProfiling()) + , m_shouldEmitRichSourceInfo(scopeChain->globalObject->supportsRichSourceInfo()) + , m_scopeChain(*scopeChain->globalData, scopeChain) , m_symbolTable(symbolTable) , m_scopeNode(functionBody) , m_codeBlock(codeBlock) + , m_activationRegister(0) , m_finallyDepth(0) , m_dynamicScopeDepth(0) , m_baseScopeDepth(0) , m_codeType(FunctionCode) , m_nextConstantOffset(0) , m_globalConstantIndex(0) - , m_globalData(&scopeChain.globalObject()->globalExec()->globalData()) + , m_hasCreatedActivation(false) + , m_firstLazyFunction(0) + , m_lastLazyFunction(0) + , m_globalData(scopeChain->globalData) , m_lastOpcodeID(op_end) - , m_emitNodeDepth(0) - , m_regeneratingForExceptionInfo(false) - , m_codeBlockBeingRegeneratedFrom(0) +#ifndef NDEBUG + , m_lastOpcodePosition(0) +#endif + , m_stack(m_globalData->stack()) + , m_usesExceptions(false) + , m_expressionTooDeep(false) { if (m_shouldEmitDebugHooks) m_codeBlock->setNeedsFullScopeChain(true); codeBlock->setGlobalData(m_globalData); - - bool usesArguments = functionBody->usesArguments(); - codeBlock->setUsesArguments(usesArguments); - if (usesArguments) { - m_argumentsRegister.setIndex(RegisterFile::OptionalCalleeArguments); - addVar(propertyNames().arguments, false); + + emitOpcode(op_enter); + if (m_codeBlock->needsFullScopeChain()) { + m_activationRegister = addVar(); + emitInitLazyRegister(m_activationRegister); + m_codeBlock->setActivationRegister(m_activationRegister->index()); } - if (m_codeBlock->needsFullScopeChain()) { - ++m_codeBlock->m_numVars; - m_activationRegisterIndex = newRegister()->index(); - emitOpcode(op_enter_with_activation); - instructions().append(m_activationRegisterIndex); - } else - emitOpcode(op_enter); + // Both op_tear_off_activation and op_tear_off_arguments tear off the 'arguments' + // object, if created. + if (m_codeBlock->needsFullScopeChain() || functionBody->usesArguments()) { + RegisterID* unmodifiedArgumentsRegister = addVar(); // Anonymous, so it can't be modified by user code. + RegisterID* argumentsRegister = addVar(propertyNames().arguments, false); // Can be changed by assigning to 'arguments'. + + // We can save a little space by hard-coding the knowledge that the two + // 'arguments' values are stored in consecutive registers, and storing + // only the index of the assignable one. + codeBlock->setArgumentsRegister(argumentsRegister->index()); + ASSERT_UNUSED(unmodifiedArgumentsRegister, unmodifiedArgumentsRegister->index() == JSC::unmodifiedArgumentsRegister(codeBlock->argumentsRegister())); - if (usesArguments) { - emitOpcode(op_init_arguments); + emitInitLazyRegister(argumentsRegister); + emitInitLazyRegister(unmodifiedArgumentsRegister); + + if (m_codeBlock->isStrictMode()) { + emitOpcode(op_create_arguments); + instructions().append(argumentsRegister->index()); + } // The debugger currently retrieves the arguments object from an activation rather than pulling // it from a call frame. In the long-term it should stop doing that (), // but for now we force eager creation of the arguments object when debugging. - if (m_shouldEmitDebugHooks) + if (m_shouldEmitDebugHooks) { emitOpcode(op_create_arguments); + instructions().append(argumentsRegister->index()); + } } const DeclarationStacks::FunctionStack& functionStack = functionBody->functionStack(); + const DeclarationStacks::VarStack& varStack = functionBody->varStack(); + + // Captured variables and functions go first so that activations don't have + // to step over the non-captured locals to mark them. + m_hasCreatedActivation = false; + if (functionBody->hasCapturedVariables()) { + for (size_t i = 0; i < functionStack.size(); ++i) { + FunctionBodyNode* function = functionStack[i]; + const Identifier& ident = function->ident(); + if (functionBody->captures(ident)) { + if (!m_hasCreatedActivation) { + m_hasCreatedActivation = true; + emitOpcode(op_create_activation); + instructions().append(m_activationRegister->index()); + } + m_functions.add(ident.impl()); + emitNewFunction(addVar(ident, false), function); + } + } + for (size_t i = 0; i < varStack.size(); ++i) { + const Identifier& ident = *varStack[i].first; + if (functionBody->captures(ident)) + addVar(ident, varStack[i].second & DeclarationStacks::IsConstant); + } + } + bool canLazilyCreateFunctions = !functionBody->needsActivationForMoreThanVariables() && !m_shouldEmitDebugHooks; + if (!canLazilyCreateFunctions && !m_hasCreatedActivation) { + m_hasCreatedActivation = true; + emitOpcode(op_create_activation); + instructions().append(m_activationRegister->index()); + } + + codeBlock->m_numCapturedVars = codeBlock->m_numVars; + m_firstLazyFunction = codeBlock->m_numVars; for (size_t i = 0; i < functionStack.size(); ++i) { FunctionBodyNode* function = functionStack[i]; const Identifier& ident = function->ident(); - m_functions.add(ident.ustring().rep()); - emitNewFunction(addVar(ident, false), function); + if (!functionBody->captures(ident)) { + m_functions.add(ident.impl()); + RefPtr reg = addVar(ident, false); + // Don't lazily create functions that override the name 'arguments' + // as this would complicate lazy instantiation of actual arguments. + if (!canLazilyCreateFunctions || ident == propertyNames().arguments) + emitNewFunction(reg.get(), function); + else { + emitInitLazyRegister(reg.get()); + m_lazyFunctions.set(reg->index(), function); + } + } } - - const DeclarationStacks::VarStack& varStack = functionBody->varStack(); - for (size_t i = 0; i < varStack.size(); ++i) - addVar(*varStack[i].first, varStack[i].second & DeclarationStacks::IsConstant); + m_lastLazyFunction = canLazilyCreateFunctions ? codeBlock->m_numVars : m_firstLazyFunction; + for (size_t i = 0; i < varStack.size(); ++i) { + const Identifier& ident = *varStack[i].first; + if (!functionBody->captures(ident)) + addVar(ident, varStack[i].second & DeclarationStacks::IsConstant); + } + + if (m_shouldEmitDebugHooks) + codeBlock->m_numCapturedVars = codeBlock->m_numVars; FunctionParameters& parameters = *functionBody->parameters(); size_t parameterCount = parameters.size(); - m_nextParameterIndex = -RegisterFile::CallFrameHeaderSize - parameterCount - 1; + int nextParameterIndex = -RegisterFile::CallFrameHeaderSize - parameterCount - 1; m_parameters.grow(1 + parameterCount); // reserve space for "this" // Add "this" as a parameter - m_thisRegister.setIndex(m_nextParameterIndex); - ++m_nextParameterIndex; + m_thisRegister.setIndex(nextParameterIndex); ++m_codeBlock->m_numParameters; - - if (functionBody->usesThis() || m_shouldEmitDebugHooks) { - emitOpcode(op_convert_this); - instructions().append(m_thisRegister.index()); - } for (size_t i = 0; i < parameterCount; ++i) - addParameter(parameters[i]); + addParameter(parameters[i], ++nextParameterIndex); preserveLastVar(); + + if (isConstructor()) { + RefPtr func = newTemporary(); + RefPtr funcProto = newTemporary(); + + emitOpcode(op_get_callee); + instructions().append(func->index()); + // Load prototype. + emitGetById(funcProto.get(), func.get(), globalData()->propertyNames->prototype); + + emitOpcode(op_create_this); + instructions().append(m_thisRegister.index()); + instructions().append(funcProto->index()); + } else if (functionBody->usesThis() || m_shouldEmitDebugHooks) { + if (codeBlock->isStrictMode()) + emitOpcode(op_convert_this_strict); + else + emitOpcode(op_convert_this); + instructions().append(m_thisRegister.index()); + } } -BytecodeGenerator::BytecodeGenerator(EvalNode* evalNode, const Debugger* debugger, const ScopeChain& scopeChain, SymbolTable* symbolTable, EvalCodeBlock* codeBlock) - : m_shouldEmitDebugHooks(!!debugger) - , m_shouldEmitProfileHooks(scopeChain.globalObject()->supportsProfiling()) - , m_scopeChain(&scopeChain) +BytecodeGenerator::BytecodeGenerator(EvalNode* evalNode, ScopeChainNode* scopeChain, SymbolTable* symbolTable, EvalCodeBlock* codeBlock) + : m_shouldEmitDebugHooks(scopeChain->globalObject->debugger()) + , m_shouldEmitProfileHooks(scopeChain->globalObject->supportsProfiling()) + , m_shouldEmitRichSourceInfo(scopeChain->globalObject->supportsRichSourceInfo()) + , m_scopeChain(*scopeChain->globalData, scopeChain) , m_symbolTable(symbolTable) , m_scopeNode(evalNode) , m_codeBlock(codeBlock) @@ -384,11 +499,17 @@ BytecodeGenerator::BytecodeGenerator(EvalNode* evalNode, const Debugger* debugge , m_codeType(EvalCode) , m_nextConstantOffset(0) , m_globalConstantIndex(0) - , m_globalData(&scopeChain.globalObject()->globalExec()->globalData()) + , m_hasCreatedActivation(true) + , m_firstLazyFunction(0) + , m_lastLazyFunction(0) + , m_globalData(scopeChain->globalData) , m_lastOpcodeID(op_end) - , m_emitNodeDepth(0) - , m_regeneratingForExceptionInfo(false) - , m_codeBlockBeingRegeneratedFrom(0) +#ifndef NDEBUG + , m_lastOpcodePosition(0) +#endif + , m_stack(m_globalData->stack()) + , m_usesExceptions(false) + , m_expressionTooDeep(false) { if (m_shouldEmitDebugHooks || m_baseScopeDepth) m_codeBlock->setNeedsFullScopeChain(true); @@ -408,27 +529,30 @@ BytecodeGenerator::BytecodeGenerator(EvalNode* evalNode, const Debugger* debugge for (size_t i = 0; i < numVariables; ++i) variables.append(*varStack[i].first); codeBlock->adoptVariables(variables); - + codeBlock->m_numCapturedVars = codeBlock->m_numVars; preserveLastVar(); } -RegisterID* BytecodeGenerator::addParameter(const Identifier& ident) +RegisterID* BytecodeGenerator::emitInitLazyRegister(RegisterID* reg) +{ + emitOpcode(op_init_lazy_reg); + instructions().append(reg->index()); + return reg; +} + +void BytecodeGenerator::addParameter(const Identifier& ident, int parameterIndex) { // Parameters overwrite var declarations, but not function declarations. - RegisterID* result = 0; - UString::Rep* rep = ident.ustring().rep(); + StringImpl* rep = ident.impl(); if (!m_functions.contains(rep)) { - symbolTable().set(rep, m_nextParameterIndex); - RegisterID& parameter = registerFor(m_nextParameterIndex); - parameter.setIndex(m_nextParameterIndex); - result = ¶meter; + symbolTable().set(rep, parameterIndex); + RegisterID& parameter = registerFor(parameterIndex); + parameter.setIndex(parameterIndex); } // To maintain the calling convention, we have to allocate unique space for // each parameter, even if the parameter doesn't make it into the symbol table. - ++m_nextParameterIndex; ++m_codeBlock->m_numParameters; - return result; } RegisterID* BytecodeGenerator::registerFor(const Identifier& ident) @@ -439,14 +563,14 @@ RegisterID* BytecodeGenerator::registerFor(const Identifier& ident) if (!shouldOptimizeLocals()) return 0; - SymbolTableEntry entry = symbolTable().get(ident.ustring().rep()); + SymbolTableEntry entry = symbolTable().get(ident.impl()); if (entry.isNull()) return 0; if (ident == propertyNames().arguments) createArgumentsIfNecessary(); - return ®isterFor(entry.getIndex()); + return createLazyRegisterIfNecessary(®isterFor(entry.getIndex())); } bool BytecodeGenerator::willResolveToArguments(const Identifier& ident) @@ -457,7 +581,7 @@ bool BytecodeGenerator::willResolveToArguments(const Identifier& ident) if (!shouldOptimizeLocals()) return false; - SymbolTableEntry entry = symbolTable().get(ident.ustring().rep()); + SymbolTableEntry entry = symbolTable().get(ident.impl()); if (entry.isNull()) return false; @@ -471,21 +595,29 @@ RegisterID* BytecodeGenerator::uncheckedRegisterForArguments() { ASSERT(willResolveToArguments(propertyNames().arguments)); - SymbolTableEntry entry = symbolTable().get(propertyNames().arguments.ustring().rep()); + SymbolTableEntry entry = symbolTable().get(propertyNames().arguments.impl()); ASSERT(!entry.isNull()); return ®isterFor(entry.getIndex()); } +RegisterID* BytecodeGenerator::createLazyRegisterIfNecessary(RegisterID* reg) +{ + if (m_lastLazyFunction <= reg->index() || reg->index() < m_firstLazyFunction) + return reg; + emitLazyNewFunction(reg, m_lazyFunctions.get(reg->index())); + return reg; +} + RegisterID* BytecodeGenerator::constRegisterFor(const Identifier& ident) { if (m_codeType == EvalCode) return 0; - SymbolTableEntry entry = symbolTable().get(ident.ustring().rep()); + SymbolTableEntry entry = symbolTable().get(ident.impl()); if (entry.isNull()) return 0; - return ®isterFor(entry.getIndex()); + return createLazyRegisterIfNecessary(®isterFor(entry.getIndex())); } bool BytecodeGenerator::isLocal(const Identifier& ident) @@ -493,12 +625,12 @@ bool BytecodeGenerator::isLocal(const Identifier& ident) if (ident == propertyNames().thisIdentifier) return true; - return shouldOptimizeLocals() && symbolTable().contains(ident.ustring().rep()); + return shouldOptimizeLocals() && symbolTable().contains(ident.impl()); } bool BytecodeGenerator::isLocalConstant(const Identifier& ident) { - return symbolTable().get(ident.ustring().rep()).isReadOnly(); + return symbolTable().get(ident.impl()).isReadOnly(); } RegisterID* BytecodeGenerator::newRegister() @@ -573,6 +705,11 @@ PassRefPtr