Changeset 206846 in webkit for trunk/Source/JavaScriptCore/jsc.cpp
- Timestamp:
- Oct 5, 2016, 10:20:10 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/jsc.cpp
r206653 r206846 29 29 #include "CodeBlock.h" 30 30 #include "Completion.h" 31 #include "DOMJITGetterSetter.h" 32 #include "DOMJITPatchpoint.h" 33 #include "DOMJITPatchpointParams.h" 31 34 #include "Disassembler.h" 32 35 #include "Exception.h" … … 73 76 #include <wtf/CurrentTime.h> 74 77 #include <wtf/MainThread.h> 78 #include <wtf/NeverDestroyed.h> 75 79 #include <wtf/StringPrintStream.h> 76 80 #include <wtf/text/StringBuilder.h> … … 538 542 }; 539 543 544 class DOMJITNode : public JSNonFinalObject { 545 public: 546 DOMJITNode(VM& vm, Structure* structure) 547 : Base(vm, structure) 548 { 549 } 550 551 DECLARE_INFO; 552 typedef JSNonFinalObject Base; 553 static const unsigned StructureFlags = Base::StructureFlags; 554 555 static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) 556 { 557 return Structure::create(vm, globalObject, prototype, TypeInfo(JSC::JSType(LastJSCObjectType + 1), StructureFlags), info()); 558 } 559 560 static DOMJITNode* create(VM& vm, Structure* structure) 561 { 562 DOMJITNode* getter = new (NotNull, allocateCell<DOMJITNode>(vm.heap, sizeof(DOMJITNode))) DOMJITNode(vm, structure); 563 getter->finishCreation(vm); 564 return getter; 565 } 566 567 int32_t value() const 568 { 569 return m_value; 570 } 571 572 static ptrdiff_t offsetOfValue() { return OBJECT_OFFSETOF(DOMJITNode, m_value); } 573 574 private: 575 int32_t m_value { 42 }; 576 }; 577 578 class DOMJITGetter : public DOMJITNode { 579 public: 580 DOMJITGetter(VM& vm, Structure* structure) 581 : Base(vm, structure) 582 { 583 } 584 585 DECLARE_INFO; 586 typedef DOMJITNode Base; 587 static const unsigned StructureFlags = Base::StructureFlags; 588 589 static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) 590 { 591 return Structure::create(vm, globalObject, prototype, TypeInfo(JSC::JSType(LastJSCObjectType + 1), StructureFlags), info()); 592 } 593 594 static DOMJITGetter* create(VM& vm, Structure* structure) 595 { 596 DOMJITGetter* getter = new (NotNull, allocateCell<DOMJITGetter>(vm.heap, sizeof(DOMJITGetter))) DOMJITGetter(vm, structure); 597 getter->finishCreation(vm); 598 return getter; 599 } 600 601 class DOMJITNodeDOMJIT : public DOMJIT::GetterSetter { 602 public: 603 DOMJITNodeDOMJIT() 604 : DOMJIT::GetterSetter(DOMJITGetter::customGetter, nullptr, DOMJITNode::info()) 605 { 606 } 607 608 Ref<DOMJIT::Patchpoint> checkDOM() override 609 { 610 Ref<DOMJIT::Patchpoint> patchpoint = DOMJIT::Patchpoint::create(); 611 patchpoint->setGenerator([=](CCallHelpers& jit, const DOMJIT::PatchpointParams& params) { 612 CCallHelpers::JumpList failureCases; 613 failureCases.append(jit.branch8( 614 CCallHelpers::NotEqual, 615 CCallHelpers::Address(params[0].gpr(), JSCell::typeInfoTypeOffset()), 616 CCallHelpers::TrustedImm32(JSC::JSType(LastJSCObjectType + 1)))); 617 return failureCases; 618 }); 619 return patchpoint; 620 } 621 622 Ref<DOMJIT::Patchpoint> callDOM() override 623 { 624 Ref<DOMJIT::Patchpoint> patchpoint = DOMJIT::Patchpoint::create(); 625 patchpoint->setGenerator([=](CCallHelpers& jit, const DOMJIT::PatchpointParams& params) { 626 JSValueRegs results = params[0].jsValueRegs(); 627 GPRReg dom = params[2].gpr(); 628 629 jit.load32(CCallHelpers::Address(dom, DOMJITNode::offsetOfValue()), results.payloadGPR()); 630 jit.boxInt32(results.payloadGPR(), results); 631 return CCallHelpers::JumpList(); 632 }); 633 return patchpoint; 634 } 635 }; 636 637 static DOMJIT::GetterSetter* domJITNodeGetterSetter() 638 { 639 static NeverDestroyed<DOMJITNodeDOMJIT> graph; 640 return &graph.get(); 641 } 642 643 private: 644 void finishCreation(VM& vm) 645 { 646 Base::finishCreation(vm); 647 DOMJIT::GetterSetter* domJIT = domJITNodeGetterSetter(); 648 CustomGetterSetter* customGetterSetter = CustomGetterSetter::create(vm, domJIT->getter(), domJIT->setter(), domJIT); 649 putDirectCustomAccessor(vm, Identifier::fromString(&vm, "customGetter"), customGetterSetter, ReadOnly | CustomAccessor); 650 } 651 652 static EncodedJSValue customGetter(ExecState* exec, EncodedJSValue thisValue, PropertyName) 653 { 654 VM& vm = exec->vm(); 655 auto scope = DECLARE_THROW_SCOPE(vm); 656 657 DOMJITNode* thisObject = jsDynamicCast<DOMJITNode*>(JSValue::decode(thisValue)); 658 if (!thisObject) 659 return throwVMTypeError(exec, scope); 660 return JSValue::encode(jsNumber(thisObject->value())); 661 } 662 }; 540 663 541 664 const ClassInfo Element::s_info = { "Element", &Base::s_info, 0, CREATE_METHOD_TABLE(Element) }; … … 544 667 const ClassInfo ImpureGetter::s_info = { "ImpureGetter", &Base::s_info, 0, CREATE_METHOD_TABLE(ImpureGetter) }; 545 668 const ClassInfo CustomGetter::s_info = { "CustomGetter", &Base::s_info, 0, CREATE_METHOD_TABLE(CustomGetter) }; 669 const ClassInfo DOMJITNode::s_info = { "DOMJITNode", &Base::s_info, 0, CREATE_METHOD_TABLE(DOMJITNode) }; 670 const ClassInfo DOMJITGetter::s_info = { "DOMJITGetter", &Base::s_info, 0, CREATE_METHOD_TABLE(DOMJITGetter) }; 546 671 const ClassInfo RuntimeArray::s_info = { "RuntimeArray", &Base::s_info, 0, CREATE_METHOD_TABLE(RuntimeArray) }; 547 672 const ClassInfo SimpleObject::s_info = { "SimpleObject", &Base::s_info, 0, CREATE_METHOD_TABLE(SimpleObject) }; … … 572 697 static EncodedJSValue JSC_HOST_CALL functionCreateImpureGetter(ExecState*); 573 698 static EncodedJSValue JSC_HOST_CALL functionCreateCustomGetterObject(ExecState*); 699 static EncodedJSValue JSC_HOST_CALL functionCreateDOMJITNodeObject(ExecState*); 700 static EncodedJSValue JSC_HOST_CALL functionCreateDOMJITGetterObject(ExecState*); 574 701 static EncodedJSValue JSC_HOST_CALL functionCreateBuiltin(ExecState*); 575 702 static EncodedJSValue JSC_HOST_CALL functionCreateGlobalObject(ExecState*); … … 856 983 addFunction(vm, "createImpureGetter", functionCreateImpureGetter, 1); 857 984 addFunction(vm, "createCustomGetterObject", functionCreateCustomGetterObject, 0); 985 addFunction(vm, "createDOMJITNodeObject", functionCreateDOMJITNodeObject, 0); 986 addFunction(vm, "createDOMJITGetterObject", functionCreateDOMJITGetterObject, 0); 858 987 addFunction(vm, "createBuiltin", functionCreateBuiltin, 2); 859 988 addFunction(vm, "createGlobalObject", functionCreateGlobalObject, 0); … … 1360 1489 } 1361 1490 1491 EncodedJSValue JSC_HOST_CALL functionCreateDOMJITNodeObject(ExecState* exec) 1492 { 1493 JSLockHolder lock(exec); 1494 Structure* structure = DOMJITNode::createStructure(exec->vm(), exec->lexicalGlobalObject(), DOMJITGetter::create(exec->vm(), DOMJITGetter::createStructure(exec->vm(), exec->lexicalGlobalObject(), jsNull()))); 1495 DOMJITNode* result = DOMJITNode::create(exec->vm(), structure); 1496 return JSValue::encode(result); 1497 } 1498 1499 EncodedJSValue JSC_HOST_CALL functionCreateDOMJITGetterObject(ExecState* exec) 1500 { 1501 JSLockHolder lock(exec); 1502 Structure* structure = DOMJITGetter::createStructure(exec->vm(), exec->lexicalGlobalObject(), jsNull()); 1503 DOMJITGetter* result = DOMJITGetter::create(exec->vm(), structure); 1504 return JSValue::encode(result); 1505 } 1506 1362 1507 EncodedJSValue JSC_HOST_CALL functionSetImpureGetterDelegate(ExecState* exec) 1363 1508 {
Note:
See TracChangeset
for help on using the changeset viewer.