// Copyright 2018 the V8 project authors. All rights reserved.
|
// Use of this source code is governed by a BSD-style license that can be
|
// found in the LICENSE file.
|
|
#ifndef V8_OBJECTS_JS_PROXY_H_
|
#define V8_OBJECTS_JS_PROXY_H_
|
|
#include "src/objects.h"
|
|
// Has to be the last include (doesn't have include guards):
|
#include "src/objects/object-macros.h"
|
|
namespace v8 {
|
namespace internal {
|
|
// The JSProxy describes EcmaScript Harmony proxies
|
class JSProxy : public JSReceiver {
|
public:
|
V8_WARN_UNUSED_RESULT static MaybeHandle<JSProxy> New(Isolate* isolate,
|
Handle<Object>,
|
Handle<Object>);
|
|
// [handler]: The handler property.
|
DECL_ACCESSORS(handler, Object)
|
// [target]: The target property.
|
DECL_ACCESSORS(target, Object)
|
|
static MaybeHandle<Context> GetFunctionRealm(Handle<JSProxy> proxy);
|
|
DECL_CAST(JSProxy)
|
|
V8_INLINE bool IsRevoked() const;
|
static void Revoke(Handle<JSProxy> proxy);
|
|
// ES6 9.5.1
|
static MaybeHandle<Object> GetPrototype(Handle<JSProxy> receiver);
|
|
// ES6 9.5.2
|
V8_WARN_UNUSED_RESULT static Maybe<bool> SetPrototype(
|
Handle<JSProxy> proxy, Handle<Object> value, bool from_javascript,
|
ShouldThrow should_throw);
|
// ES6 9.5.3
|
V8_WARN_UNUSED_RESULT static Maybe<bool> IsExtensible(Handle<JSProxy> proxy);
|
|
// ES6, #sec-isarray. NOT to be confused with %_IsArray.
|
V8_WARN_UNUSED_RESULT static Maybe<bool> IsArray(Handle<JSProxy> proxy);
|
|
// ES6 9.5.4 (when passed kDontThrow)
|
V8_WARN_UNUSED_RESULT static Maybe<bool> PreventExtensions(
|
Handle<JSProxy> proxy, ShouldThrow should_throw);
|
|
// ES6 9.5.5
|
V8_WARN_UNUSED_RESULT static Maybe<bool> GetOwnPropertyDescriptor(
|
Isolate* isolate, Handle<JSProxy> proxy, Handle<Name> name,
|
PropertyDescriptor* desc);
|
|
// ES6 9.5.6
|
V8_WARN_UNUSED_RESULT static Maybe<bool> DefineOwnProperty(
|
Isolate* isolate, Handle<JSProxy> object, Handle<Object> key,
|
PropertyDescriptor* desc, ShouldThrow should_throw);
|
|
// ES6 9.5.7
|
V8_WARN_UNUSED_RESULT static Maybe<bool> HasProperty(Isolate* isolate,
|
Handle<JSProxy> proxy,
|
Handle<Name> name);
|
|
// This function never returns false.
|
// It returns either true or throws.
|
V8_WARN_UNUSED_RESULT static Maybe<bool> CheckHasTrap(
|
Isolate* isolate, Handle<Name> name, Handle<JSReceiver> target);
|
|
// ES6 9.5.8
|
V8_WARN_UNUSED_RESULT static MaybeHandle<Object> GetProperty(
|
Isolate* isolate, Handle<JSProxy> proxy, Handle<Name> name,
|
Handle<Object> receiver, bool* was_found);
|
|
enum AccessKind { kGet, kSet };
|
|
static MaybeHandle<Object> CheckGetSetTrapResult(Isolate* isolate,
|
Handle<Name> name,
|
Handle<JSReceiver> target,
|
Handle<Object> trap_result,
|
AccessKind access_kind);
|
|
// ES6 9.5.9
|
V8_WARN_UNUSED_RESULT static Maybe<bool> SetProperty(
|
Handle<JSProxy> proxy, Handle<Name> name, Handle<Object> value,
|
Handle<Object> receiver, LanguageMode language_mode);
|
|
// ES6 9.5.10 (when passed LanguageMode::kSloppy)
|
V8_WARN_UNUSED_RESULT static Maybe<bool> DeletePropertyOrElement(
|
Handle<JSProxy> proxy, Handle<Name> name, LanguageMode language_mode);
|
|
// ES6 9.5.12
|
V8_WARN_UNUSED_RESULT static Maybe<bool> OwnPropertyKeys(
|
Isolate* isolate, Handle<JSReceiver> receiver, Handle<JSProxy> proxy,
|
PropertyFilter filter, KeyAccumulator* accumulator);
|
|
V8_WARN_UNUSED_RESULT static Maybe<PropertyAttributes> GetPropertyAttributes(
|
LookupIterator* it);
|
|
// Dispatched behavior.
|
DECL_PRINTER(JSProxy)
|
DECL_VERIFIER(JSProxy)
|
|
static const int kMaxIterationLimit = 100 * 1024;
|
|
// Layout description.
|
static const int kTargetOffset = JSReceiver::kHeaderSize;
|
static const int kHandlerOffset = kTargetOffset + kPointerSize;
|
static const int kSize = kHandlerOffset + kPointerSize;
|
|
// kTargetOffset aliases with the elements of JSObject. The fact that
|
// JSProxy::target is a Javascript value which cannot be confused with an
|
// elements backing store is exploited by loading from this offset from an
|
// unknown JSReceiver.
|
STATIC_ASSERT(JSObject::kElementsOffset == JSProxy::kTargetOffset);
|
|
typedef FixedBodyDescriptor<JSReceiver::kPropertiesOrHashOffset, kSize, kSize>
|
BodyDescriptor;
|
// No weak fields.
|
typedef BodyDescriptor BodyDescriptorWeak;
|
|
static Maybe<bool> SetPrivateSymbol(Isolate* isolate, Handle<JSProxy> proxy,
|
Handle<Symbol> private_name,
|
PropertyDescriptor* desc,
|
ShouldThrow should_throw);
|
|
private:
|
DISALLOW_IMPLICIT_CONSTRUCTORS(JSProxy);
|
};
|
|
// JSProxyRevocableResult is just a JSObject with a specific initial map.
|
// This initial map adds in-object properties for "proxy" and "revoke".
|
// See https://tc39.github.io/ecma262/#sec-proxy.revocable
|
class JSProxyRevocableResult : public JSObject {
|
public:
|
// Offsets of object fields.
|
static const int kProxyOffset = JSObject::kHeaderSize;
|
static const int kRevokeOffset = kProxyOffset + kPointerSize;
|
static const int kSize = kRevokeOffset + kPointerSize;
|
// Indices of in-object properties.
|
static const int kProxyIndex = 0;
|
static const int kRevokeIndex = 1;
|
|
private:
|
DISALLOW_IMPLICIT_CONSTRUCTORS(JSProxyRevocableResult);
|
};
|
|
} // namespace internal
|
} // namespace v8
|
|
#include "src/objects/object-macros-undef.h"
|
|
#endif // V8_OBJECTS_JS_PROXY_H_
|