1 // Copyright 2014 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 #include "src/runtime/runtime-utils.h"
6
7 #include "src/execution/arguments-inl.h"
8 #include "src/execution/isolate-inl.h"
9 #include "src/heap/factory.h"
10 #include "src/heap/heap-inl.h" // For ToBoolean. TODO(jkummerow): Drop.
11 #include "src/logging/counters.h"
12 #include "src/objects/elements.h"
13 #include "src/objects/objects-inl.h"
14
15 namespace v8 {
16 namespace internal {
17
RUNTIME_FUNCTION(Runtime_IsJSProxy)18 RUNTIME_FUNCTION(Runtime_IsJSProxy) {
19 SealHandleScope shs(isolate);
20 DCHECK_EQ(1, args.length());
21 Object obj = args[0];
22 return isolate->heap()->ToBoolean(obj.IsJSProxy());
23 }
24
RUNTIME_FUNCTION(Runtime_JSProxyGetHandler)25 RUNTIME_FUNCTION(Runtime_JSProxyGetHandler) {
26 SealHandleScope shs(isolate);
27 DCHECK_EQ(1, args.length());
28 auto proxy = JSProxy::cast(args[0]);
29 return proxy.handler();
30 }
31
RUNTIME_FUNCTION(Runtime_JSProxyGetTarget)32 RUNTIME_FUNCTION(Runtime_JSProxyGetTarget) {
33 SealHandleScope shs(isolate);
34 DCHECK_EQ(1, args.length());
35 auto proxy = JSProxy::cast(args[0]);
36 return proxy.target();
37 }
38
RUNTIME_FUNCTION(Runtime_GetPropertyWithReceiver)39 RUNTIME_FUNCTION(Runtime_GetPropertyWithReceiver) {
40 HandleScope scope(isolate);
41
42 DCHECK_EQ(4, args.length());
43 Handle<JSReceiver> holder = args.at<JSReceiver>(0);
44 Handle<Object> key = args.at(1);
45 Handle<Object> receiver = args.at(2);
46 // TODO(mythria): Remove the on_non_existent parameter to this function. This
47 // should only be called when getting named properties on receiver. This
48 // doesn't handle the global variable loads.
49 #ifdef DEBUG
50 int on_non_existent = args.smi_value_at(3);
51 DCHECK_NE(static_cast<OnNonExistent>(on_non_existent),
52 OnNonExistent::kThrowReferenceError);
53 #endif
54
55 bool success = false;
56 PropertyKey lookup_key(isolate, key, &success);
57 if (!success) {
58 DCHECK(isolate->has_pending_exception());
59 return ReadOnlyRoots(isolate).exception();
60 }
61 LookupIterator it(isolate, receiver, lookup_key, holder);
62
63 RETURN_RESULT_OR_FAILURE(isolate, Object::GetProperty(&it));
64 }
65
RUNTIME_FUNCTION(Runtime_SetPropertyWithReceiver)66 RUNTIME_FUNCTION(Runtime_SetPropertyWithReceiver) {
67 HandleScope scope(isolate);
68
69 DCHECK_EQ(4, args.length());
70 Handle<JSReceiver> holder = args.at<JSReceiver>(0);
71 Handle<Object> key = args.at(1);
72 Handle<Object> value = args.at(2);
73 Handle<Object> receiver = args.at(3);
74
75 bool success = false;
76 PropertyKey lookup_key(isolate, key, &success);
77 if (!success) {
78 DCHECK(isolate->has_pending_exception());
79 return ReadOnlyRoots(isolate).exception();
80 }
81 LookupIterator it(isolate, receiver, lookup_key, holder);
82 Maybe<bool> result =
83 Object::SetSuperProperty(&it, value, StoreOrigin::kMaybeKeyed);
84 MAYBE_RETURN(result, ReadOnlyRoots(isolate).exception());
85 return *isolate->factory()->ToBoolean(result.FromJust());
86 }
87
RUNTIME_FUNCTION(Runtime_CheckProxyGetSetTrapResult)88 RUNTIME_FUNCTION(Runtime_CheckProxyGetSetTrapResult) {
89 HandleScope scope(isolate);
90
91 DCHECK_EQ(4, args.length());
92 Handle<Name> name = args.at<Name>(0);
93 Handle<JSReceiver> target = args.at<JSReceiver>(1);
94 Handle<Object> trap_result = args.at(2);
95 int64_t access_kind = NumberToInt64(args[3]);
96
97 RETURN_RESULT_OR_FAILURE(isolate, JSProxy::CheckGetSetTrapResult(
98 isolate, name, target, trap_result,
99 JSProxy::AccessKind(access_kind)));
100 }
101
RUNTIME_FUNCTION(Runtime_CheckProxyHasTrapResult)102 RUNTIME_FUNCTION(Runtime_CheckProxyHasTrapResult) {
103 HandleScope scope(isolate);
104
105 DCHECK_EQ(2, args.length());
106 Handle<Name> name = args.at<Name>(0);
107 Handle<JSReceiver> target = args.at<JSReceiver>(1);
108
109 Maybe<bool> result = JSProxy::CheckHasTrap(isolate, name, target);
110 if (!result.IsJust()) return ReadOnlyRoots(isolate).exception();
111 return isolate->heap()->ToBoolean(result.FromJust());
112 }
113
RUNTIME_FUNCTION(Runtime_CheckProxyDeleteTrapResult)114 RUNTIME_FUNCTION(Runtime_CheckProxyDeleteTrapResult) {
115 HandleScope scope(isolate);
116
117 DCHECK_EQ(2, args.length());
118 Handle<Name> name = args.at<Name>(0);
119 Handle<JSReceiver> target = args.at<JSReceiver>(1);
120
121 Maybe<bool> result = JSProxy::CheckDeleteTrap(isolate, name, target);
122 if (!result.IsJust()) return ReadOnlyRoots(isolate).exception();
123 return isolate->heap()->ToBoolean(result.FromJust());
124 }
125
126 } // namespace internal
127 } // namespace v8
128