1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#ifndef GIN_ARGUMENTS_H_ 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define GIN_ARGUMENTS_H_ 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/basictypes.h" 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "gin/converter.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "gin/gin_export.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace gin { 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Arguments is a wrapper around v8::FunctionCallbackInfo that integrates 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// with Converter to make it easier to marshall arguments and return values 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// between V8 and C++. 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class GIN_EXPORT Arguments { 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Arguments(); 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) explicit Arguments(const v8::FunctionCallbackInfo<v8::Value>& info); 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ~Arguments(); 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) template<typename T> 24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool GetHolder(T* out) { 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return ConvertFromV8(isolate_, info_->Holder(), out); 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) template<typename T> 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool GetData(T* out) { 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return ConvertFromV8(isolate_, info_->Data(), out); 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) template<typename T> 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool GetNext(T* out) { 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (next_ >= info_->Length()) { 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) insufficient_arguments_ = true; 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) v8::Handle<v8::Value> val = (*info_)[next_++]; 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return ConvertFromV8(isolate_, val, out); 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) template<typename T> 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool GetRemaining(std::vector<T>* out) { 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (next_ >= info_->Length()) { 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) insufficient_arguments_ = true; 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int remaining = info_->Length() - next_; 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) out->resize(remaining); 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (int i = 0; i < remaining; ++i) { 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) v8::Handle<v8::Value> val = (*info_)[next_++]; 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!ConvertFromV8(isolate_, val, &out->at(i))) 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool Skip() { 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (next_ >= info_->Length()) 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) next_++; 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int Length() const { 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return info_->Length(); 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) template<typename T> 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void Return(T val) { 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) info_->GetReturnValue().Set(ConvertToV8(isolate_, val)); 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) v8::Handle<v8::Value> PeekNext() const; 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ThrowError() const; 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ThrowTypeError(const std::string& message) const; 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) v8::Isolate* isolate() const { return isolate_; } 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Allows the function handler to distinguish between normal invocation 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // and object construction. 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool IsConstructCall() const; 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) v8::Isolate* isolate_; 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const v8::FunctionCallbackInfo<v8::Value>* info_; 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int next_; 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool insufficient_arguments_; 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace gin 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif // GIN_ARGUMENTS_H_ 96