LCOV - code coverage report
Current view: top level - src/objects - js-proxy.h (source / functions) Hit Total Coverage
Test: app.info Lines: 0 1 0.0 %
Date: 2019-02-19 Functions: 0 1 0.0 %

          Line data    Source code
       1             : // Copyright 2018 the V8 project authors. All rights reserved.
       2             : // Use of this source code is governed by a BSD-style license that can be
       3             : // found in the LICENSE file.
       4             : 
       5             : #ifndef V8_OBJECTS_JS_PROXY_H_
       6             : #define V8_OBJECTS_JS_PROXY_H_
       7             : 
       8             : #include "src/objects/js-objects.h"
       9             : 
      10             : // Has to be the last include (doesn't have include guards):
      11             : #include "src/objects/object-macros.h"
      12             : 
      13             : namespace v8 {
      14             : namespace internal {
      15             : 
      16             : // The JSProxy describes EcmaScript Harmony proxies
      17             : class JSProxy : public JSReceiver {
      18             :  public:
      19             :   V8_WARN_UNUSED_RESULT static MaybeHandle<JSProxy> New(Isolate* isolate,
      20             :                                                         Handle<Object>,
      21             :                                                         Handle<Object>);
      22             : 
      23             :   // [handler]: The handler property.
      24             :   DECL_ACCESSORS(handler, Object)
      25             :   // [target]: The target property.
      26             :   DECL_ACCESSORS(target, Object)
      27             : 
      28             :   static MaybeHandle<NativeContext> GetFunctionRealm(Handle<JSProxy> proxy);
      29             : 
      30             :   DECL_CAST(JSProxy)
      31             : 
      32             :   V8_INLINE bool IsRevoked() const;
      33             :   static void Revoke(Handle<JSProxy> proxy);
      34             : 
      35             :   // ES6 9.5.1
      36             :   static MaybeHandle<Object> GetPrototype(Handle<JSProxy> receiver);
      37             : 
      38             :   // ES6 9.5.2
      39             :   V8_WARN_UNUSED_RESULT static Maybe<bool> SetPrototype(
      40             :       Handle<JSProxy> proxy, Handle<Object> value, bool from_javascript,
      41             :       ShouldThrow should_throw);
      42             :   // ES6 9.5.3
      43             :   V8_WARN_UNUSED_RESULT static Maybe<bool> IsExtensible(Handle<JSProxy> proxy);
      44             : 
      45             :   // ES6, #sec-isarray.  NOT to be confused with %_IsArray.
      46             :   V8_WARN_UNUSED_RESULT static Maybe<bool> IsArray(Handle<JSProxy> proxy);
      47             : 
      48             :   // ES6 9.5.4 (when passed kDontThrow)
      49             :   V8_WARN_UNUSED_RESULT static Maybe<bool> PreventExtensions(
      50             :       Handle<JSProxy> proxy, ShouldThrow should_throw);
      51             : 
      52             :   // ES6 9.5.5
      53             :   V8_WARN_UNUSED_RESULT static Maybe<bool> GetOwnPropertyDescriptor(
      54             :       Isolate* isolate, Handle<JSProxy> proxy, Handle<Name> name,
      55             :       PropertyDescriptor* desc);
      56             : 
      57             :   // ES6 9.5.6
      58             :   V8_WARN_UNUSED_RESULT static Maybe<bool> DefineOwnProperty(
      59             :       Isolate* isolate, Handle<JSProxy> object, Handle<Object> key,
      60             :       PropertyDescriptor* desc, Maybe<ShouldThrow> should_throw);
      61             : 
      62             :   // ES6 9.5.7
      63             :   V8_WARN_UNUSED_RESULT static Maybe<bool> HasProperty(Isolate* isolate,
      64             :                                                        Handle<JSProxy> proxy,
      65             :                                                        Handle<Name> name);
      66             : 
      67             :   // This function never returns false.
      68             :   // It returns either true or throws.
      69             :   V8_WARN_UNUSED_RESULT static Maybe<bool> CheckHasTrap(
      70             :       Isolate* isolate, Handle<Name> name, Handle<JSReceiver> target);
      71             : 
      72             :   // ES6 9.5.8
      73             :   V8_WARN_UNUSED_RESULT static MaybeHandle<Object> GetProperty(
      74             :       Isolate* isolate, Handle<JSProxy> proxy, Handle<Name> name,
      75             :       Handle<Object> receiver, bool* was_found);
      76             : 
      77             :   enum AccessKind { kGet, kSet };
      78             : 
      79             :   static MaybeHandle<Object> CheckGetSetTrapResult(Isolate* isolate,
      80             :                                                    Handle<Name> name,
      81             :                                                    Handle<JSReceiver> target,
      82             :                                                    Handle<Object> trap_result,
      83             :                                                    AccessKind access_kind);
      84             : 
      85             :   // ES6 9.5.9
      86             :   V8_WARN_UNUSED_RESULT static Maybe<bool> SetProperty(
      87             :       Handle<JSProxy> proxy, Handle<Name> name, Handle<Object> value,
      88             :       Handle<Object> receiver, Maybe<ShouldThrow> should_throw);
      89             : 
      90             :   // ES6 9.5.10 (when passed LanguageMode::kSloppy)
      91             :   V8_WARN_UNUSED_RESULT static Maybe<bool> DeletePropertyOrElement(
      92             :       Handle<JSProxy> proxy, Handle<Name> name, LanguageMode language_mode);
      93             : 
      94             :   // ES6 9.5.12
      95             :   V8_WARN_UNUSED_RESULT static Maybe<bool> OwnPropertyKeys(
      96             :       Isolate* isolate, Handle<JSReceiver> receiver, Handle<JSProxy> proxy,
      97             :       PropertyFilter filter, KeyAccumulator* accumulator);
      98             : 
      99             :   V8_WARN_UNUSED_RESULT static Maybe<PropertyAttributes> GetPropertyAttributes(
     100             :       LookupIterator* it);
     101             : 
     102             :   // Dispatched behavior.
     103             :   DECL_PRINTER(JSProxy)
     104             :   DECL_VERIFIER(JSProxy)
     105             : 
     106             :   static const int kMaxIterationLimit = 100 * 1024;
     107             : 
     108             :   // Layout description.
     109             : #define JS_PROXY_FIELDS(V)       \
     110             :   V(kTargetOffset, kTaggedSize)  \
     111             :   V(kHandlerOffset, kTaggedSize) \
     112             :   /* Total size. */              \
     113             :   V(kSize, 0)
     114             : 
     115             :   DEFINE_FIELD_OFFSET_CONSTANTS(JSReceiver::kHeaderSize, JS_PROXY_FIELDS)
     116             : #undef JS_PROXY_FIELDS
     117             : 
     118             :   // kTargetOffset aliases with the elements of JSObject. The fact that
     119             :   // JSProxy::target is a Javascript value which cannot be confused with an
     120             :   // elements backing store is exploited by loading from this offset from an
     121             :   // unknown JSReceiver.
     122             :   STATIC_ASSERT(static_cast<int>(JSObject::kElementsOffset) ==
     123             :                 static_cast<int>(JSProxy::kTargetOffset));
     124             : 
     125             :   typedef FixedBodyDescriptor<JSReceiver::kPropertiesOrHashOffset, kSize, kSize>
     126             :       BodyDescriptor;
     127             : 
     128             :   static Maybe<bool> SetPrivateSymbol(Isolate* isolate, Handle<JSProxy> proxy,
     129             :                                       Handle<Symbol> private_name,
     130             :                                       PropertyDescriptor* desc,
     131             :                                       Maybe<ShouldThrow> should_throw);
     132             : 
     133           0 :   OBJECT_CONSTRUCTORS(JSProxy, JSReceiver);
     134             : };
     135             : 
     136             : // JSProxyRevocableResult is just a JSObject with a specific initial map.
     137             : // This initial map adds in-object properties for "proxy" and "revoke".
     138             : // See https://tc39.github.io/ecma262/#sec-proxy.revocable
     139             : class JSProxyRevocableResult : public JSObject {
     140             :  public:
     141             :   // Layout description.
     142             : #define JS_PROXY_REVOCATABLE_RESULT_FIELDS(V) \
     143             :   V(kProxyOffset, kTaggedSize)                \
     144             :   V(kRevokeOffset, kTaggedSize)               \
     145             :   /* Total size. */                           \
     146             :   V(kSize, 0)
     147             : 
     148             :   DEFINE_FIELD_OFFSET_CONSTANTS(JSObject::kHeaderSize,
     149             :                                 JS_PROXY_REVOCATABLE_RESULT_FIELDS)
     150             : #undef JS_PROXY_REVOCATABLE_RESULT_FIELDS
     151             : 
     152             :   // Indices of in-object properties.
     153             :   static const int kProxyIndex = 0;
     154             :   static const int kRevokeIndex = 1;
     155             : 
     156             :  private:
     157             :   DISALLOW_IMPLICIT_CONSTRUCTORS(JSProxyRevocableResult);
     158             : };
     159             : 
     160             : }  // namespace internal
     161             : }  // namespace v8
     162             : 
     163             : #include "src/objects/object-macros-undef.h"
     164             : 
     165             : #endif  // V8_OBJECTS_JS_PROXY_H_

Generated by: LCOV version 1.10