blob: 4d01c0e44d9bce5b818b830f3499ccf6f4a07f96 [file] [log] [blame]
[email protected]e87f3122013-11-12 00:41:271// 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/arguments.h"
6
[email protected]855ab432013-11-18 17:09:367#include "base/strings/stringprintf.h"
[email protected]e87f3122013-11-12 00:41:278#include "gin/converter.h"
9
10namespace gin {
11
[email protected]7618ebbb2013-11-27 03:38:2612Arguments::Arguments()
13 : isolate_(NULL),
14 info_(NULL),
15 next_(0),
16 insufficient_arguments_(false) {
17}
18
[email protected]e87f3122013-11-12 00:41:2719Arguments::Arguments(const v8::FunctionCallbackInfo<v8::Value>& info)
20 : isolate_(info.GetIsolate()),
[email protected]7618ebbb2013-11-27 03:38:2621 info_(&info),
[email protected]e87f3122013-11-12 00:41:2722 next_(0),
23 insufficient_arguments_(false) {
24}
25
26Arguments::~Arguments() {
27}
28
deepak.sfaaa1b62015-04-30 07:30:4829v8::Local<v8::Value> Arguments::PeekNext() const {
[email protected]7618ebbb2013-11-27 03:38:2630 if (next_ >= info_->Length())
deepak.sfaaa1b62015-04-30 07:30:4831 return v8::Local<v8::Value>();
[email protected]7618ebbb2013-11-27 03:38:2632 return (*info_)[next_];
[email protected]97f21ca2013-11-17 17:46:0733}
34
rdevlin.cronincd6754502017-04-19 16:14:1435std::vector<v8::Local<v8::Value>> Arguments::GetAll() const {
36 std::vector<v8::Local<v8::Value>> result;
37 int length = info_->Length();
38 if (length == 0)
39 return result;
40
41 result.reserve(length);
42 for (int i = 0; i < length; ++i)
43 result.push_back((*info_)[i]);
44
45 return result;
46}
47
rdevlin.cronind982fdf2017-03-23 22:17:4348v8::Local<v8::Context> Arguments::GetHolderCreationContext() {
49 return info_->Holder()->CreationContext();
50}
51
deepak.sfaaa1b62015-04-30 07:30:4852std::string V8TypeAsString(v8::Local<v8::Value> value) {
eseidel2584930f2014-12-15 22:06:4453 if (value.IsEmpty())
54 return "<empty handle>";
55 if (value->IsUndefined())
56 return "undefined";
57 if (value->IsNull())
58 return "null";
59 std::string result;
60 if (!ConvertFromV8(NULL, value, &result))
61 return std::string();
62 return result;
63}
64
[email protected]481d2492013-12-13 23:55:2565void Arguments::ThrowError() const {
[email protected]e87f3122013-11-12 00:41:2766 if (insufficient_arguments_)
67 return ThrowTypeError("Insufficient number of arguments.");
68
eseidel2584930f2014-12-15 22:06:4469 return ThrowTypeError(base::StringPrintf(
70 "Error processing argument at index %d, conversion failure from %s",
71 next_ - 1, V8TypeAsString((*info_)[next_ - 1]).c_str()));
[email protected]e87f3122013-11-12 00:41:2772}
73
[email protected]481d2492013-12-13 23:55:2574void Arguments::ThrowTypeError(const std::string& message) const {
[email protected]e87f3122013-11-12 00:41:2775 isolate_->ThrowException(v8::Exception::TypeError(
76 StringToV8(isolate_, message)));
77}
78
[email protected]744a4942014-07-18 16:46:1479bool Arguments::IsConstructCall() const {
80 return info_->IsConstructCall();
81}
82
[email protected]e87f3122013-11-12 00:41:2783} // namespace gin