Changeset 107498

Timestamp:
02/11/12 18:47:50 (3 years ago)
Author:
barraclough@apple.com
Message:

Move special proto property to Object.prototype
https://bugs.webkit.org/show_bug.cgi?id=78409

Reviewed by Oliver Hunt.

Re-implement this as a regular accessor property. This has three key benefits:
1) It makes it possible for objects to be given properties named proto.
2) Object.prototype.proto can be deleted, preventing object prototypes from being changed.
3) This largely removes the magic used the implement proto, it can just be made a regular accessor property.

Source/JavaScriptCore:

  • parser/Parser.cpp:

(JSC::::parseFunctionInfo):

  • No need to prohibit functions named proto.
  • runtime/JSGlobalObject.cpp:

(JSC::JSGlobalObject::reset):

  • Add proto accessor to Object.prototype.
  • runtime/JSGlobalObjectFunctions.cpp:

(JSC::globalFuncProtoGetter):
(JSC::globalFuncProtoSetter):

  • Definition of the proto accessor functions.
  • runtime/JSGlobalObjectFunctions.h:
    • Declaration of the proto accessor functions.
  • runtime/JSObject.cpp:

(JSC::JSObject::put):

  • Remove the special handling for proto, there is still a check to allow for a fast guard for accessors excluding proto.

(JSC::JSObject::putDirectAccessor):

  • Track on the structure whether an object contains accessors other than one for proto.

(JSC::JSObject::defineOwnProperty):

  • No need to prohibit definition of own properties named proto.
  • runtime/JSObject.h:

(JSC::JSObject::inlineGetOwnPropertySlot):

  • Remove the special handling for proto.

(JSC::JSValue::get):

  • Remove the special handling for proto.
  • runtime/JSString.cpp:

(JSC::JSString::getOwnPropertySlot):

  • Remove the special handling for proto.
  • runtime/JSValue.h:

(JSValue):

  • Made synthesizePrototype public (this may be needed by the proto getter).
  • runtime/ObjectConstructor.cpp:

(JSC::objectConstructorGetPrototypeOf):

  • Perform the security check & call prototype() directly.
  • runtime/Structure.cpp:

(JSC::Structure::Structure):

  • Added 'ExcludingProto' variant of the 'hasGetterSetterProperties' state.
  • runtime/Structure.h:

(JSC::Structure::hasGetterSetterPropertiesExcludingProto):
(JSC::Structure::setHasGetterSetterProperties):
(Structure):

  • Added 'ExcludingProto' variant of the 'hasGetterSetterProperties' state.

Source/WebCore:

  • bindings/js/JSDOMWindowBase.cpp:

(WebCore::JSDOMWindowBase::allowsAccessFrom):
(WebCore):

  • expose allowsAccessFrom check to JSC.
  • bindings/js/JSDOMWindowBase.h:

(JSDOMWindowBase):

  • expose allowsAccessFrom check to JSC.

LayoutTests:

  • fast/js/Object-getOwnPropertyNames-expected.txt:
  • fast/js/cyclic-prototypes-expected.txt:
  • fast/js/parser-syntax-check-expected.txt:
  • fast/js/preventExtensions-expected.txt:
  • fast/js/prototypes-expected.txt:
    • Update results
  • fast/js/script-tests/Object-getOwnPropertyNames.js:
    • proto is now a property of Object Prototype.
  • fast/js/script-tests/cyclic-prototypes.js:
    • setting an object's prototype to null removes proto setter, future usage won't set prototype.
  • fast/js/script-tests/parser-syntax-check.js:
    • Allow functions named proto
  • fast/js/script-tests/preventExtensions.js:
    • Setting proto should not throw.
  • fast/js/script-tests/prototypes.js:
    • Objects may contained own properties named proto, add new test cases.
Location:
trunk
Files:
29 edited

Note: See TracChangeset for help on using the changeset viewer.