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 17 namespace { 18 19 v8::internal::FastAccessorAssembler* FromApi( 20 v8::experimental::FastAccessorBuilder* builder) { 21 return reinterpret_cast<v8::internal::FastAccessorAssembler*>(builder); 22 } 23 24 v8::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 32 namespace v8 { 33 namespace internal { 34 namespace experimental { 35 36 37 MaybeHandle<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 53 namespace experimental { 54 55 56 FastAccessorBuilder* 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 64 FastAccessorBuilder::ValueId FastAccessorBuilder::IntegerConstant( 65 int const_value) { 66 return FromApi(this)->IntegerConstant(const_value); 67 } 68 69 70 FastAccessorBuilder::ValueId FastAccessorBuilder::GetReceiver() { 71 return FromApi(this)->GetReceiver(); 72 } 73 74 75 FastAccessorBuilder::ValueId FastAccessorBuilder::LoadInternalField( 76 ValueId value, int field_no) { 77 return FromApi(this)->LoadInternalField(value, field_no); 78 } 79 80 FastAccessorBuilder::ValueId FastAccessorBuilder::LoadInternalFieldUnchecked( 81 ValueId value, int field_no) { 82 return FromApi(this)->LoadInternalFieldUnchecked(value, field_no); 83 } 84 85 FastAccessorBuilder::ValueId FastAccessorBuilder::LoadValue(ValueId value_id, 86 int offset) { 87 return FromApi(this)->LoadValue(value_id, offset); 88 } 89 90 91 FastAccessorBuilder::ValueId FastAccessorBuilder::LoadObject(ValueId value_id, 92 int offset) { 93 return FromApi(this)->LoadObject(value_id, offset); 94 } 95 96 FastAccessorBuilder::ValueId FastAccessorBuilder::ToSmi(ValueId value_id) { 97 return FromApi(this)->ToSmi(value_id); 98 } 99 100 void FastAccessorBuilder::ReturnValue(ValueId value) { 101 FromApi(this)->ReturnValue(value); 102 } 103 104 105 void FastAccessorBuilder::CheckFlagSetOrReturnNull(ValueId value_id, int mask) { 106 FromApi(this)->CheckFlagSetOrReturnNull(value_id, mask); 107 } 108 109 110 void FastAccessorBuilder::CheckNotZeroOrReturnNull(ValueId value_id) { 111 FromApi(this)->CheckNotZeroOrReturnNull(value_id); 112 } 113 114 115 FastAccessorBuilder::LabelId FastAccessorBuilder::MakeLabel() { 116 return FromApi(this)->MakeLabel(); 117 } 118 119 120 void FastAccessorBuilder::SetLabel(LabelId label_id) { 121 FromApi(this)->SetLabel(label_id); 122 } 123 124 void FastAccessorBuilder::Goto(LabelId label_id) { 125 FromApi(this)->Goto(label_id); 126 } 127 128 void FastAccessorBuilder::CheckNotZeroOrJump(ValueId value_id, 129 LabelId label_id) { 130 FromApi(this)->CheckNotZeroOrJump(value_id, label_id); 131 } 132 133 FastAccessorBuilder::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