• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Chromium 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 "gin/converter.h"
6 
7 #include "v8/include/v8.h"
8 
9 using v8::ArrayBuffer;
10 using v8::Boolean;
11 using v8::External;
12 using v8::Function;
13 using v8::Handle;
14 using v8::Integer;
15 using v8::Isolate;
16 using v8::Number;
17 using v8::Object;
18 using v8::String;
19 using v8::Value;
20 
21 namespace gin {
22 
ToV8(Isolate * isolate,bool val)23 Handle<Value> Converter<bool>::ToV8(Isolate* isolate, bool val) {
24   return Boolean::New(isolate, val).As<Value>();
25 }
26 
FromV8(Isolate * isolate,Handle<Value> val,bool * out)27 bool Converter<bool>::FromV8(Isolate* isolate, Handle<Value> val, bool* out) {
28   *out = val->BooleanValue();
29   return true;
30 }
31 
ToV8(Isolate * isolate,int32_t val)32 Handle<Value> Converter<int32_t>::ToV8(Isolate* isolate, int32_t val) {
33   return Integer::New(isolate, val).As<Value>();
34 }
35 
FromV8(Isolate * isolate,Handle<Value> val,int32_t * out)36 bool Converter<int32_t>::FromV8(Isolate* isolate, Handle<Value> val,
37                                 int32_t* out) {
38   if (!val->IsInt32())
39     return false;
40   *out = val->Int32Value();
41   return true;
42 }
43 
ToV8(Isolate * isolate,uint32_t val)44 Handle<Value> Converter<uint32_t>::ToV8(Isolate* isolate, uint32_t val) {
45   return Integer::NewFromUnsigned(isolate, val).As<Value>();
46 }
47 
FromV8(Isolate * isolate,Handle<Value> val,uint32_t * out)48 bool Converter<uint32_t>::FromV8(Isolate* isolate, Handle<Value> val,
49                                  uint32_t* out) {
50   if (!val->IsUint32())
51     return false;
52   *out = val->Uint32Value();
53   return true;
54 }
55 
ToV8(Isolate * isolate,int64_t val)56 Handle<Value> Converter<int64_t>::ToV8(Isolate* isolate, int64_t val) {
57   return Number::New(isolate, static_cast<double>(val)).As<Value>();
58 }
59 
FromV8(Isolate * isolate,Handle<Value> val,int64_t * out)60 bool Converter<int64_t>::FromV8(Isolate* isolate, Handle<Value> val,
61                                 int64_t* out) {
62   if (!val->IsNumber())
63     return false;
64   // Even though IntegerValue returns int64_t, JavaScript cannot represent
65   // the full precision of int64_t, which means some rounding might occur.
66   *out = val->IntegerValue();
67   return true;
68 }
69 
ToV8(Isolate * isolate,uint64_t val)70 Handle<Value> Converter<uint64_t>::ToV8(Isolate* isolate, uint64_t val) {
71   return Number::New(isolate, static_cast<double>(val)).As<Value>();
72 }
73 
FromV8(Isolate * isolate,Handle<Value> val,uint64_t * out)74 bool Converter<uint64_t>::FromV8(Isolate* isolate, Handle<Value> val,
75                                  uint64_t* out) {
76   if (!val->IsNumber())
77     return false;
78   *out = static_cast<uint64_t>(val->IntegerValue());
79   return true;
80 }
81 
ToV8(Isolate * isolate,double val)82 Handle<Value> Converter<double>::ToV8(Isolate* isolate, double val) {
83   return Number::New(isolate, val).As<Value>();
84 }
85 
FromV8(Isolate * isolate,Handle<Value> val,double * out)86 bool Converter<double>::FromV8(Isolate* isolate, Handle<Value> val,
87                                double* out) {
88   if (!val->IsNumber())
89     return false;
90   *out = val->NumberValue();
91   return true;
92 }
93 
ToV8(Isolate * isolate,const base::StringPiece & val)94 Handle<Value> Converter<base::StringPiece>::ToV8(
95     Isolate* isolate, const base::StringPiece& val) {
96   return String::NewFromUtf8(isolate, val.data(), String::kNormalString,
97                              static_cast<uint32_t>(val.length()));
98 }
99 
ToV8(Isolate * isolate,const std::string & val)100 Handle<Value> Converter<std::string>::ToV8(Isolate* isolate,
101                                            const std::string& val) {
102   return Converter<base::StringPiece>::ToV8(isolate, val);
103 }
104 
FromV8(Isolate * isolate,Handle<Value> val,std::string * out)105 bool Converter<std::string>::FromV8(Isolate* isolate, Handle<Value> val,
106                                     std::string* out) {
107   if (!val->IsString())
108     return false;
109   Handle<String> str = Handle<String>::Cast(val);
110   int length = str->Utf8Length();
111   out->resize(length);
112   str->WriteUtf8(&(*out)[0], length, NULL, String::NO_NULL_TERMINATION);
113   return true;
114 }
115 
FromV8(Isolate * isolate,Handle<Value> val,Handle<Function> * out)116 bool Converter<Handle<Function> >::FromV8(Isolate* isolate, Handle<Value> val,
117                                           Handle<Function>* out) {
118   if (!val->IsFunction())
119     return false;
120   *out = Handle<Function>::Cast(val);
121   return true;
122 }
123 
ToV8(Isolate * isolate,Handle<Object> val)124 Handle<Value> Converter<Handle<Object> >::ToV8(Isolate* isolate,
125                                                Handle<Object> val) {
126   return val.As<Value>();
127 }
128 
FromV8(Isolate * isolate,Handle<Value> val,Handle<Object> * out)129 bool Converter<Handle<Object> >::FromV8(Isolate* isolate, Handle<Value> val,
130                                         Handle<Object>* out) {
131   if (!val->IsObject())
132     return false;
133   *out = Handle<Object>::Cast(val);
134   return true;
135 }
136 
ToV8(Isolate * isolate,Handle<ArrayBuffer> val)137 Handle<Value> Converter<Handle<ArrayBuffer> >::ToV8(Isolate* isolate,
138                                                     Handle<ArrayBuffer> val) {
139   return val.As<Value>();
140 }
141 
FromV8(Isolate * isolate,Handle<Value> val,Handle<ArrayBuffer> * out)142 bool Converter<Handle<ArrayBuffer> >::FromV8(Isolate* isolate,
143                                              Handle<Value> val,
144                                              Handle<ArrayBuffer>* out) {
145   if (!val->IsArrayBuffer())
146     return false;
147   *out = Handle<ArrayBuffer>::Cast(val);
148   return true;
149 }
150 
ToV8(Isolate * isolate,Handle<External> val)151 Handle<Value> Converter<Handle<External> >::ToV8(Isolate* isolate,
152                                                  Handle<External> val) {
153   return val.As<Value>();
154 }
155 
FromV8(Isolate * isolate,v8::Handle<Value> val,Handle<External> * out)156 bool Converter<Handle<External> >::FromV8(Isolate* isolate,
157                                           v8::Handle<Value> val,
158                                           Handle<External>* out) {
159   if (!val->IsExternal())
160     return false;
161   *out = Handle<External>::Cast(val);
162   return true;
163 }
164 
ToV8(Isolate * isolate,Handle<Value> val)165 Handle<Value> Converter<Handle<Value> >::ToV8(Isolate* isolate,
166                                               Handle<Value> val) {
167   return val;
168 }
169 
FromV8(Isolate * isolate,Handle<Value> val,Handle<Value> * out)170 bool Converter<Handle<Value> >::FromV8(Isolate* isolate, Handle<Value> val,
171                                        Handle<Value>* out) {
172   *out = val;
173   return true;
174 }
175 
StringToSymbol(v8::Isolate * isolate,const base::StringPiece & val)176 v8::Handle<v8::String> StringToSymbol(v8::Isolate* isolate,
177                                       const base::StringPiece& val) {
178   return String::NewFromUtf8(isolate,
179                              val.data(),
180                              String::kInternalizedString,
181                              static_cast<uint32_t>(val.length()));
182 }
183 
V8ToString(v8::Handle<v8::Value> value)184 std::string V8ToString(v8::Handle<v8::Value> value) {
185   if (value.IsEmpty())
186     return std::string();
187   std::string result;
188   if (!ConvertFromV8(NULL, value, &result))
189     return std::string();
190   return result;
191 }
192 
193 }  // namespace gin
194