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