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