|  | // Copyright 2013 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef GIN_ARGUMENTS_H_ | 
|  | #define GIN_ARGUMENTS_H_ | 
|  |  | 
|  | #include "gin/converter.h" | 
|  | #include "gin/gin_export.h" | 
|  |  | 
|  | namespace gin { | 
|  |  | 
|  | // Arguments is a wrapper around v8::FunctionCallbackInfo that integrates | 
|  | // with Converter to make it easier to marshall arguments and return values | 
|  | // between V8 and C++. | 
|  | class GIN_EXPORT Arguments { | 
|  | public: | 
|  | Arguments(); | 
|  | explicit Arguments(const v8::FunctionCallbackInfo<v8::Value>& info); | 
|  | ~Arguments(); | 
|  |  | 
|  | template<typename T> | 
|  | bool GetHolder(T* out) { | 
|  | return ConvertFromV8(isolate_, info_->Holder(), out); | 
|  | } | 
|  |  | 
|  | template<typename T> | 
|  | bool GetData(T* out) { | 
|  | return ConvertFromV8(isolate_, info_->Data(), out); | 
|  | } | 
|  |  | 
|  | template<typename T> | 
|  | bool GetNext(T* out) { | 
|  | if (next_ >= info_->Length()) { | 
|  | insufficient_arguments_ = true; | 
|  | return false; | 
|  | } | 
|  | v8::Local<v8::Value> val = (*info_)[next_++]; | 
|  | return ConvertFromV8(isolate_, val, out); | 
|  | } | 
|  |  | 
|  | template<typename T> | 
|  | bool GetRemaining(std::vector<T>* out) { | 
|  | if (next_ >= info_->Length()) { | 
|  | insufficient_arguments_ = true; | 
|  | return false; | 
|  | } | 
|  | int remaining = info_->Length() - next_; | 
|  | out->resize(remaining); | 
|  | for (int i = 0; i < remaining; ++i) { | 
|  | v8::Local<v8::Value> val = (*info_)[next_++]; | 
|  | if (!ConvertFromV8(isolate_, val, &out->at(i))) | 
|  | return false; | 
|  | } | 
|  | return true; | 
|  | } | 
|  |  | 
|  | bool Skip() { | 
|  | if (next_ >= info_->Length()) | 
|  | return false; | 
|  | next_++; | 
|  | return true; | 
|  | } | 
|  |  | 
|  | int Length() const { | 
|  | return info_->Length(); | 
|  | } | 
|  |  | 
|  | template<typename T> | 
|  | void Return(T val) { | 
|  | v8::Local<v8::Value> v8_value; | 
|  | if (!TryConvertToV8(isolate_, val, &v8_value)) | 
|  | return; | 
|  | info_->GetReturnValue().Set(v8_value); | 
|  | } | 
|  |  | 
|  | // Always check the return value whether the handle is empty before | 
|  | // dereferencing the handle. | 
|  | v8::Local<v8::Value> PeekNext() const; | 
|  |  | 
|  | void ThrowError() const; | 
|  | void ThrowTypeError(const std::string& message) const; | 
|  |  | 
|  | v8::Isolate* isolate() const { return isolate_; } | 
|  |  | 
|  | // Allows the function handler to distinguish between normal invocation | 
|  | // and object construction. | 
|  | bool IsConstructCall() const; | 
|  |  | 
|  | private: | 
|  | v8::Isolate* isolate_; | 
|  | const v8::FunctionCallbackInfo<v8::Value>* info_; | 
|  | int next_; | 
|  | bool insufficient_arguments_; | 
|  | }; | 
|  |  | 
|  | }  // namespace gin | 
|  |  | 
|  | #endif  // GIN_ARGUMENTS_H_ |