1// Copyright 2015 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/** 6 * Implementation for v8-experimental.h. 7 */ 8 9#include "src/api-experimental.h" 10 11#include "include/v8-experimental.h" 12#include "include/v8.h" 13#include "src/api.h" 14#include "src/fast-accessor-assembler.h" 15#include "src/objects-inl.h" 16 17namespace { 18 19v8::internal::FastAccessorAssembler* FromApi( 20 v8::experimental::FastAccessorBuilder* builder) { 21 return reinterpret_cast<v8::internal::FastAccessorAssembler*>(builder); 22} 23 24v8::experimental::FastAccessorBuilder* FromInternal( 25 v8::internal::FastAccessorAssembler* fast_accessor_assembler) { 26 return reinterpret_cast<v8::experimental::FastAccessorBuilder*>( 27 fast_accessor_assembler); 28} 29 30} // namespace 31 32namespace v8 { 33namespace internal { 34namespace experimental { 35 36 37MaybeHandle<Code> BuildCodeFromFastAccessorBuilder( 38 v8::experimental::FastAccessorBuilder* fast_handler) { 39 i::MaybeHandle<i::Code> code; 40 if (fast_handler != nullptr) { 41 auto faa = FromApi(fast_handler); 42 code = faa->Build(); 43 CHECK(!code.is_null()); 44 delete faa; 45 } 46 return code; 47} 48 49} // namespace experimental 50} // namespace internal 51 52 53namespace experimental { 54 55 56FastAccessorBuilder* FastAccessorBuilder::New(Isolate* isolate) { 57 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 58 internal::FastAccessorAssembler* faa = 59 new internal::FastAccessorAssembler(i_isolate); 60 return FromInternal(faa); 61} 62 63 64FastAccessorBuilder::ValueId FastAccessorBuilder::IntegerConstant( 65 int const_value) { 66 return FromApi(this)->IntegerConstant(const_value); 67} 68 69 70FastAccessorBuilder::ValueId FastAccessorBuilder::GetReceiver() { 71 return FromApi(this)->GetReceiver(); 72} 73 74 75FastAccessorBuilder::ValueId FastAccessorBuilder::LoadInternalField( 76 ValueId value, int field_no) { 77 return FromApi(this)->LoadInternalField(value, field_no); 78} 79 80FastAccessorBuilder::ValueId FastAccessorBuilder::LoadInternalFieldUnchecked( 81 ValueId value, int field_no) { 82 return FromApi(this)->LoadInternalFieldUnchecked(value, field_no); 83} 84 85FastAccessorBuilder::ValueId FastAccessorBuilder::LoadValue(ValueId value_id, 86 int offset) { 87 return FromApi(this)->LoadValue(value_id, offset); 88} 89 90 91FastAccessorBuilder::ValueId FastAccessorBuilder::LoadObject(ValueId value_id, 92 int offset) { 93 return FromApi(this)->LoadObject(value_id, offset); 94} 95 96FastAccessorBuilder::ValueId FastAccessorBuilder::ToSmi(ValueId value_id) { 97 return FromApi(this)->ToSmi(value_id); 98} 99 100void FastAccessorBuilder::ReturnValue(ValueId value) { 101 FromApi(this)->ReturnValue(value); 102} 103 104 105void FastAccessorBuilder::CheckFlagSetOrReturnNull(ValueId value_id, int mask) { 106 FromApi(this)->CheckFlagSetOrReturnNull(value_id, mask); 107} 108 109 110void FastAccessorBuilder::CheckNotZeroOrReturnNull(ValueId value_id) { 111 FromApi(this)->CheckNotZeroOrReturnNull(value_id); 112} 113 114 115FastAccessorBuilder::LabelId FastAccessorBuilder::MakeLabel() { 116 return FromApi(this)->MakeLabel(); 117} 118 119 120void FastAccessorBuilder::SetLabel(LabelId label_id) { 121 FromApi(this)->SetLabel(label_id); 122} 123 124void FastAccessorBuilder::Goto(LabelId label_id) { 125 FromApi(this)->Goto(label_id); 126} 127 128void FastAccessorBuilder::CheckNotZeroOrJump(ValueId value_id, 129 LabelId label_id) { 130 FromApi(this)->CheckNotZeroOrJump(value_id, label_id); 131} 132 133FastAccessorBuilder::ValueId FastAccessorBuilder::Call( 134 v8::FunctionCallback callback, ValueId value_id) { 135 return FromApi(this)->Call(callback, value_id); 136} 137 138} // namespace experimental 139} // namespace v8 140