Title: [158717] trunk/Source/_javascript_Core
Revision
158717
Author
[email protected]
Date
2013-11-05 20:40:02 -0800 (Tue, 05 Nov 2013)

Log Message

FTL should support NewObject
https://bugs.webkit.org/show_bug.cgi?id=123849

Reviewed by Oliver Hunt.

* ftl/FTLAbstractHeapRepository.cpp:
(JSC::FTL::AbstractHeapRepository::AbstractHeapRepository):
* ftl/FTLAbstractHeapRepository.h:
* ftl/FTLCapabilities.cpp:
(JSC::FTL::canCompile):
* ftl/FTLIntrinsicRepository.h:
* ftl/FTLLowerDFGToLLVM.cpp:
(JSC::FTL::LowerDFGToLLVM::compileNode):
(JSC::FTL::LowerDFGToLLVM::compileNewObject):
(JSC::FTL::LowerDFGToLLVM::allocate):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (158716 => 158717)


--- trunk/Source/_javascript_Core/ChangeLog	2013-11-06 04:38:23 UTC (rev 158716)
+++ trunk/Source/_javascript_Core/ChangeLog	2013-11-06 04:40:02 UTC (rev 158717)
@@ -1,5 +1,23 @@
 2013-11-05  Filip Pizlo  <[email protected]>
 
+        FTL should support NewObject
+        https://bugs.webkit.org/show_bug.cgi?id=123849
+
+        Reviewed by Oliver Hunt.
+
+        * ftl/FTLAbstractHeapRepository.cpp:
+        (JSC::FTL::AbstractHeapRepository::AbstractHeapRepository):
+        * ftl/FTLAbstractHeapRepository.h:
+        * ftl/FTLCapabilities.cpp:
+        (JSC::FTL::canCompile):
+        * ftl/FTLIntrinsicRepository.h:
+        * ftl/FTLLowerDFGToLLVM.cpp:
+        (JSC::FTL::LowerDFGToLLVM::compileNode):
+        (JSC::FTL::LowerDFGToLLVM::compileNewObject):
+        (JSC::FTL::LowerDFGToLLVM::allocate):
+
+2013-11-05  Filip Pizlo  <[email protected]>
+
         FTL should support StringCharAt
         https://bugs.webkit.org/show_bug.cgi?id=123855
 

Modified: trunk/Source/_javascript_Core/ftl/FTLAbstractHeapRepository.cpp (158716 => 158717)


--- trunk/Source/_javascript_Core/ftl/FTLAbstractHeapRepository.cpp	2013-11-06 04:38:23 UTC (rev 158716)
+++ trunk/Source/_javascript_Core/ftl/FTLAbstractHeapRepository.cpp	2013-11-06 04:40:02 UTC (rev 158717)
@@ -45,6 +45,8 @@
     FOR_EACH_ABSTRACT_FIELD(ABSTRACT_FIELD_INITIALIZATION)
 #undef ABSTRACT_FIELD_INITIALIZATION
     
+    , JSCell_freeListNext(JSCell_structure)
+    
 #define INDEXED_ABSTRACT_HEAP_INITIALIZATION(name, size) , name(context, &root, #name, size)
     FOR_EACH_INDEXED_ABSTRACT_HEAP(INDEXED_ABSTRACT_HEAP_INITIALIZATION)
 #undef INDEXED_ABSTRACT_HEAP_INITIALIZATION
@@ -61,6 +63,8 @@
     
     RELEASE_ASSERT(m_tbaaKind);
     RELEASE_ASSERT(root.m_tbaaMetadata);
+    
+    RELEASE_ASSERT(!JSCell_freeListNext.offset());
 }
 
 AbstractHeapRepository::~AbstractHeapRepository()

Modified: trunk/Source/_javascript_Core/ftl/FTLAbstractHeapRepository.h (158716 => 158717)


--- trunk/Source/_javascript_Core/ftl/FTLAbstractHeapRepository.h	2013-11-06 04:38:23 UTC (rev 158716)
+++ trunk/Source/_javascript_Core/ftl/FTLAbstractHeapRepository.h	2013-11-06 04:40:02 UTC (rev 158717)
@@ -51,6 +51,7 @@
     macro(JSString_length, JSString::offsetOfLength()) \
     macro(JSString_value, JSString::offsetOfValue()) \
     macro(JSVariableObject_registers, JSVariableObject::offsetOfRegisters()) \
+    macro(MarkedAllocator_freeListHead, MarkedAllocator::offsetOfFreeListHead()) \
     macro(StringImpl_data, StringImpl::dataOffset()) \
     macro(StringImpl_hashAndFlags, StringImpl::flagsOffset()) \
     macro(Structure_classInfo, Structure::classInfoOffset()) \
@@ -90,6 +91,8 @@
     FOR_EACH_ABSTRACT_FIELD(ABSTRACT_FIELD_DECLARATION)
 #undef ABSTRACT_FIELD_DECLARATION
     
+    AbstractField& JSCell_freeListNext;
+    
 #define INDEXED_ABSTRACT_HEAP_DECLARATION(name, size) IndexedAbstractHeap name;
     FOR_EACH_INDEXED_ABSTRACT_HEAP(INDEXED_ABSTRACT_HEAP_DECLARATION)
 #undef INDEXED_ABSTRACT_HEAP_DECLARATION

Modified: trunk/Source/_javascript_Core/ftl/FTLCapabilities.cpp (158716 => 158717)


--- trunk/Source/_javascript_Core/ftl/FTLCapabilities.cpp	2013-11-06 04:38:23 UTC (rev 158716)
+++ trunk/Source/_javascript_Core/ftl/FTLCapabilities.cpp	2013-11-06 04:40:02 UTC (rev 158717)
@@ -62,6 +62,7 @@
     case PutStructure:
     case PhantomPutStructure:
     case GetButterfly:
+    case NewObject:
     case GetByOffset:
     case PutByOffset:
     case GetGlobalVar:

Modified: trunk/Source/_javascript_Core/ftl/FTLIntrinsicRepository.h (158716 => 158717)


--- trunk/Source/_javascript_Core/ftl/FTLIntrinsicRepository.h	2013-11-06 04:38:23 UTC (rev 158716)
+++ trunk/Source/_javascript_Core/ftl/FTLIntrinsicRepository.h	2013-11-06 04:40:02 UTC (rev 158717)
@@ -50,6 +50,7 @@
     macro(trap, "llvm.trap", functionType(voidType))
 
 #define FOR_EACH_FUNCTION_TYPE(macro) \
+    macro(C_JITOperation_ESt, functionType(intPtr, intPtr, intPtr)) \
     macro(I_JITOperation_EJss, functionType(intPtr, intPtr, intPtr)) \
     macro(J_JITOperation_E, functionType(int64, intPtr)) \
     macro(J_JITOperation_EJssZ, functionType(int64, intPtr, intPtr, int32)) \

Modified: trunk/Source/_javascript_Core/ftl/FTLLowerDFGToLLVM.cpp (158716 => 158717)


--- trunk/Source/_javascript_Core/ftl/FTLLowerDFGToLLVM.cpp	2013-11-06 04:38:23 UTC (rev 158716)
+++ trunk/Source/_javascript_Core/ftl/FTLLowerDFGToLLVM.cpp	2013-11-06 04:40:02 UTC (rev 158717)
@@ -365,6 +365,9 @@
         case PutByValAlias:
             compilePutByVal();
             break;
+        case NewObject:
+            compileNewObject();
+            break;
         case StringCharAt:
             compileStringCharAt();
             break;
@@ -1722,6 +1725,32 @@
         }
     }
     
+    void compileNewObject()
+    {
+        Structure* structure = m_node->structure();
+        size_t allocationSize = JSFinalObject::allocationSize(structure->inlineCapacity());
+        MarkedAllocator* allocator = &vm().heap.allocatorForObjectWithoutDestructor(allocationSize);
+        
+        LBasicBlock slowPath = FTL_NEW_BLOCK(m_out, ("NewObject slow path"));
+        LBasicBlock continuation = FTL_NEW_BLOCK(m_out, ("NewObject continuation"));
+        
+        LBasicBlock lastNext = m_out.insertNewBlocksBefore(slowPath);
+        
+        ValueFromBlock fastResult = m_out.anchor(allocate(
+            m_out.constIntPtr(allocator), m_out.constIntPtr(structure), m_out.intPtrZero, slowPath));
+        
+        m_out.jump(continuation);
+        
+        m_out.appendTo(slowPath, continuation);
+        
+        ValueFromBlock slowResult = m_out.anchor(vmCall(
+            m_out.operation(operationNewObject), m_callFrame, m_out.constIntPtr(structure)));
+        m_out.jump(continuation);
+        
+        m_out.appendTo(continuation, lastNext);
+        setJSValue(m_out.phi(m_out.intPtr, fastResult, slowResult));
+    }
+    
     void compileStringCharAt()
     {
         LValue base = lowCell(m_node->child1());
@@ -2298,6 +2327,28 @@
         info.m_isInvalidationPoint = true;
     }
     
+    LValue allocate(
+        LValue allocator, LValue structure, LValue butterfly, LBasicBlock slowPath)
+    {
+        LBasicBlock success = FTL_NEW_BLOCK(m_out, ("allocation success"));
+        
+        LValue result = m_out.loadPtr(
+            allocator, m_heaps.MarkedAllocator_freeListHead);
+        
+        m_out.branch(m_out.notNull(result), success, slowPath);
+        
+        m_out.appendTo(success);
+        
+        m_out.storePtr(
+            m_out.loadPtr(result, m_heaps.JSCell_freeListNext),
+            allocator, m_heaps.MarkedAllocator_freeListHead);
+        
+        m_out.storePtr(structure, result, m_heaps.JSCell_structure);
+        m_out.storePtr(butterfly, result, m_heaps.JSObject_butterfly);
+        
+        return result;
+    }
+    
     LValue boolify(Edge edge)
     {
         switch (edge.useKind()) {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to