Skip to content

Commit

Permalink
Report module id as string and as double, in case of invalid values a…
Browse files Browse the repository at this point in the history
…re passed to nativeRequire

Differential Revision: D6695769

fbshipit-source-id: b578b9d52ed711fb5a3e51717ac555fa8a232d7a
  • Loading branch information
fromcelticpark authored and facebook-github-bot committed Jan 11, 2018
1 parent 702b7e8 commit 8f358a2
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 15 deletions.
24 changes: 9 additions & 15 deletions ReactCommon/cxxreact/JSCUtils.cpp
Expand Up @@ -2,6 +2,8 @@

#include "JSCUtils.h"

#include <folly/Conv.h>

namespace facebook {
namespace react {

Expand All @@ -17,28 +19,20 @@ std::pair<uint32_t, uint32_t> parseNativeRequireParameters(
const JSGlobalContextRef& context,
const JSValueRef arguments[],
size_t argumentCount) {
double moduleId = 0, bundleId = 0;
uint32_t moduleId = 0, bundleId = 0;

// use "getNumber" & "folly::to" to throw explicitely in case of an overflow
// error during conversion
if (argumentCount == 1) {
moduleId = Value(context, arguments[0]).asNumber();
moduleId = folly::to<uint32_t>(Value(context, arguments[0]).getNumberOrThrow());
} else if (argumentCount == 2) {
moduleId = Value(context, arguments[0]).asNumber();
bundleId = Value(context, arguments[1]).asNumber();
moduleId = folly::to<uint32_t>(Value(context, arguments[0]).getNumberOrThrow());
bundleId = folly::to<uint32_t>(Value(context, arguments[1]).getNumberOrThrow());
} else {
throw std::invalid_argument("Got wrong number of args");
}

if (moduleId < 0) {
throw std::invalid_argument(folly::to<std::string>("Received invalid module ID: ",
Value(context, arguments[0]).toString().str()));
}

if (bundleId < 0) {
throw std::invalid_argument(folly::to<std::string>("Received invalid bundle ID: ",
Value(context, arguments[1]).toString().str()));
}

return std::make_pair(static_cast<uint32_t>(bundleId), static_cast<uint32_t>(moduleId));
return std::make_pair(bundleId, moduleId);
}

}
Expand Down
9 changes: 9 additions & 0 deletions ReactCommon/jschelpers/Value.cpp
Expand Up @@ -191,6 +191,15 @@ Value Value::makeError(JSContextRef ctx, const char *error, const char *stack)
}
}

void Value::throwTypeException(const std::string &expectedType) const {
std::string wat("TypeError: Expected ");
wat += expectedType;
wat += ", instead got '";
wat += toString().str();
wat += "'";
throw JSException(wat.c_str());
}

Object::operator Value() const {
return Value(m_context, m_obj);
}
Expand Down
9 changes: 9 additions & 0 deletions ReactCommon/jschelpers/Value.h
Expand Up @@ -302,6 +302,13 @@ class Value : public noncopyable {
}
}

double getNumberOrThrow() const {
if (!isNumber()) {
throwTypeException("Number");
}
return JSC_JSValueToNumber(context(), m_value, nullptr);
}

int32_t asInteger() const {
return static_cast<int32_t>(asNumber());
}
Expand Down Expand Up @@ -355,7 +362,9 @@ class Value : public noncopyable {
JSContextRef m_context;
JSValueRef m_value;

void throwTypeException(const std::string &expectedType) const;
static JSValueRef fromDynamicInner(JSContextRef ctx, const folly::dynamic& obj);

};

} }

0 comments on commit 8f358a2

Please sign in to comment.