Home | History | Annotate | Download | only in runtime
      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/arguments-inl.h"
      8 #include "src/elements.h"
      9 #include "src/heap/factory.h"
     10 #include "src/isolate-inl.h"
     11 #include "src/objects-inl.h"
     12 
     13 namespace v8 {
     14 namespace internal {
     15 
     16 
     17 RUNTIME_FUNCTION(Runtime_IsJSProxy) {
     18   SealHandleScope shs(isolate);
     19   DCHECK_EQ(1, args.length());
     20   CONVERT_ARG_CHECKED(Object, obj, 0);
     21   return isolate->heap()->ToBoolean(obj->IsJSProxy());
     22 }
     23 
     24 
     25 RUNTIME_FUNCTION(Runtime_JSProxyGetHandler) {
     26   SealHandleScope shs(isolate);
     27   DCHECK_EQ(1, args.length());
     28   CONVERT_ARG_CHECKED(JSProxy, proxy, 0);
     29   return proxy->handler();
     30 }
     31 
     32 
     33 RUNTIME_FUNCTION(Runtime_JSProxyGetTarget) {
     34   SealHandleScope shs(isolate);
     35   DCHECK_EQ(1, args.length());
     36   CONVERT_ARG_CHECKED(JSProxy, proxy, 0);
     37   return proxy->target();
     38 }
     39 
     40 
     41 RUNTIME_FUNCTION(Runtime_GetPropertyWithReceiver) {
     42   HandleScope scope(isolate);
     43 
     44   DCHECK_EQ(4, args.length());
     45   CONVERT_ARG_HANDLE_CHECKED(JSReceiver, holder, 0);
     46   CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
     47   CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 2);
     48   CONVERT_ARG_HANDLE_CHECKED(Smi, on_non_existent, 3);
     49 
     50   bool success = false;
     51   LookupIterator it = LookupIterator::PropertyOrElement(isolate, receiver, key,
     52                                                         &success, holder);
     53   if (!success) {
     54     DCHECK(isolate->has_pending_exception());
     55     return ReadOnlyRoots(isolate).exception();
     56   }
     57 
     58   RETURN_RESULT_OR_FAILURE(
     59       isolate, Object::GetProperty(
     60                    &it, static_cast<OnNonExistent>(on_non_existent->value())));
     61 }
     62 
     63 RUNTIME_FUNCTION(Runtime_SetPropertyWithReceiver) {
     64   HandleScope scope(isolate);
     65 
     66   DCHECK_EQ(5, args.length());
     67   CONVERT_ARG_HANDLE_CHECKED(JSReceiver, holder, 0);
     68   CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
     69   CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
     70   CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 3);
     71   CONVERT_LANGUAGE_MODE_ARG_CHECKED(language_mode, 4);
     72 
     73   bool success = false;
     74   LookupIterator it = LookupIterator::PropertyOrElement(isolate, receiver, key,
     75                                                         &success, holder);
     76   if (!success) {
     77     DCHECK(isolate->has_pending_exception());
     78     return ReadOnlyRoots(isolate).exception();
     79   }
     80   Maybe<bool> result = Object::SetSuperProperty(
     81       &it, value, language_mode, Object::MAY_BE_STORE_FROM_KEYED);
     82   MAYBE_RETURN(result, ReadOnlyRoots(isolate).exception());
     83   return *isolate->factory()->ToBoolean(result.FromJust());
     84 }
     85 
     86 RUNTIME_FUNCTION(Runtime_CheckProxyGetSetTrapResult) {
     87   HandleScope scope(isolate);
     88 
     89   DCHECK_EQ(4, args.length());
     90   CONVERT_ARG_HANDLE_CHECKED(Name, name, 0);
     91   CONVERT_ARG_HANDLE_CHECKED(JSReceiver, target, 1);
     92   CONVERT_ARG_HANDLE_CHECKED(Object, trap_result, 2);
     93   CONVERT_NUMBER_CHECKED(int64_t, access_kind, Int64, args[3]);
     94 
     95   RETURN_RESULT_OR_FAILURE(isolate, JSProxy::CheckGetSetTrapResult(
     96                                         isolate, name, target, trap_result,
     97                                         JSProxy::AccessKind(access_kind)));
     98 }
     99 
    100 RUNTIME_FUNCTION(Runtime_CheckProxyHasTrap) {
    101   HandleScope scope(isolate);
    102 
    103   DCHECK_EQ(2, args.length());
    104   CONVERT_ARG_HANDLE_CHECKED(Name, name, 0);
    105   CONVERT_ARG_HANDLE_CHECKED(JSReceiver, target, 1);
    106 
    107   Maybe<bool> result = JSProxy::CheckHasTrap(isolate, name, target);
    108   if (!result.IsJust()) return ReadOnlyRoots(isolate).exception();
    109   return isolate->heap()->ToBoolean(result.FromJust());
    110 }
    111 
    112 }  // namespace internal
    113 }  // namespace v8
    114