本文整理汇总了C++中JSValue::toNumber方法的典型用法代码示例。如果您正苦于以下问题:C++ JSValue::toNumber方法的具体用法?C++ JSValue::toNumber怎么用?C++ JSValue::toNumber使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类JSValue
的用法示例。
在下文中一共展示了JSValue::toNumber方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: extractSourceInformationFromException
static bool extractSourceInformationFromException(JSC::ExecState* exec, JSObject* exceptionObject, int* lineNumber, int* columnNumber, String* sourceURL)
{
VM& vm = exec->vm();
auto scope = DECLARE_CATCH_SCOPE(vm);
// FIXME: <http://webkit.org/b/115087> Web Inspector: Should not need to evaluate JavaScript handling exceptions
JSValue lineValue = exceptionObject->getDirect(vm, Identifier::fromString(exec, "line"));
JSValue columnValue = exceptionObject->getDirect(vm, Identifier::fromString(exec, "column"));
JSValue sourceURLValue = exceptionObject->getDirect(vm, Identifier::fromString(exec, "sourceURL"));
bool result = false;
if (lineValue && lineValue.isNumber()
&& sourceURLValue && sourceURLValue.isString()) {
*lineNumber = int(lineValue.toNumber(exec));
*columnNumber = columnValue && columnValue.isNumber() ? int(columnValue.toNumber(exec)) : 0;
*sourceURL = sourceURLValue.toWTFString(exec);
result = true;
} else if (ErrorInstance* error = jsDynamicCast<ErrorInstance*>(vm, exceptionObject)) {
unsigned unsignedLine;
unsigned unsignedColumn;
result = getLineColumnAndSource(error->stackTrace(), unsignedLine, unsignedColumn, *sourceURL);
*lineNumber = static_cast<int>(unsignedLine);
*columnNumber = static_cast<int>(unsignedColumn);
}
if (sourceURL->isEmpty())
*sourceURL = "undefined"_s;
scope.clearException();
return result;
}
示例2: create
PassRefPtr<ScriptCallStack> createScriptCallStackFromException(JSC::ExecState* exec, JSC::JSValue& exception, size_t maxStackSize)
{
Vector<ScriptCallFrame> frames;
RefCountedArray<StackFrame> stackTrace = exec->vm().exceptionStack();
for (size_t i = 0; i < stackTrace.size() && i < maxStackSize; i++) {
if (!stackTrace[i].callee && frames.size())
break;
unsigned line;
unsigned column;
stackTrace[i].computeLineAndColumn(line, column);
String functionName = stackTrace[i].friendlyFunctionName(exec);
frames.append(ScriptCallFrame(functionName, stackTrace[i].sourceURL, line, column));
}
// FIXME: <http://webkit.org/b/115087> Web Inspector: WebCore::reportException should not evaluate JavaScript handling exceptions
// Fallback to getting at least the line and sourceURL from the exception if it has values and the exceptionStack doesn't.
if (frames.size() > 0) {
const ScriptCallFrame& firstCallFrame = frames.first();
JSObject* exceptionObject = exception.toObject(exec);
if (exception.isObject() && firstCallFrame.sourceURL().isEmpty()) {
JSValue lineValue = exceptionObject->getDirect(exec->vm(), Identifier(exec, "line"));
int lineNumber = lineValue && lineValue.isNumber() ? int(lineValue.toNumber(exec)) : 0;
JSValue columnValue = exceptionObject->getDirect(exec->vm(), Identifier(exec, "column"));
int columnNumber = columnValue && columnValue.isNumber() ? int(columnValue.toNumber(exec)) : 0;
JSValue sourceURLValue = exceptionObject->getDirect(exec->vm(), Identifier(exec, "sourceURL"));
String exceptionSourceURL = sourceURLValue && sourceURLValue.isString() ? sourceURLValue.toString(exec)->value(exec) : ASCIILiteral("undefined");
frames[0] = ScriptCallFrame(firstCallFrame.functionName(), exceptionSourceURL, lineNumber, columnNumber);
}
}
return ScriptCallStack::create(frames);
}
示例3: createNumber
static RefPtr<IDBKey> createIDBKeyFromValue(ExecState& exec, JSValue value, Vector<JSArray*>& stack)
{
VM& vm = exec.vm();
if (value.isNumber() && !std::isnan(value.toNumber(&exec)))
return IDBKey::createNumber(value.toNumber(&exec));
if (value.isString())
return IDBKey::createString(asString(value)->value(&exec));
if (value.inherits<DateInstance>(vm)) {
auto dateValue = valueToDate(exec, value);
if (!std::isnan(dateValue))
return IDBKey::createDate(dateValue);
}
if (value.isObject()) {
JSObject* object = asObject(value);
if (auto* array = jsDynamicCast<JSArray*>(vm, object)) {
size_t length = array->length();
if (stack.contains(array))
return nullptr;
if (stack.size() >= maximumDepth)
return nullptr;
stack.append(array);
Vector<RefPtr<IDBKey>> subkeys;
for (size_t i = 0; i < length; i++) {
JSValue item = array->getIndex(&exec, i);
RefPtr<IDBKey> subkey = createIDBKeyFromValue(exec, item, stack);
if (!subkey)
subkeys.append(IDBKey::createInvalid());
else
subkeys.append(subkey);
}
stack.removeLast();
return IDBKey::createArray(subkeys);
}
if (auto* arrayBuffer = jsDynamicCast<JSArrayBuffer*>(vm, value))
return IDBKey::createBinary(*arrayBuffer);
if (auto* arrayBufferView = jsDynamicCast<JSArrayBufferView*>(vm, value))
return IDBKey::createBinary(*arrayBufferView);
}
return nullptr;
}
示例4: reportException
void reportException(ExecState* exec, JSValue exception, CachedScript* cachedScript)
{
if (isTerminatedExecutionException(exception))
return;
Interpreter::ErrorHandlingMode mode(exec);
RefPtr<ScriptCallStack> callStack(createScriptCallStackFromException(exec, exception, ScriptCallStack::maxCallStackSizeToCapture));
exec->clearException();
exec->clearSupplementaryExceptionInfo();
JSDOMGlobalObject* globalObject = jsCast<JSDOMGlobalObject*>(exec->lexicalGlobalObject());
if (JSDOMWindow* window = jsDynamicCast<JSDOMWindow*>(globalObject)) {
if (!window->impl()->isCurrentlyDisplayedInFrame())
return;
}
int lineNumber = 0;
int columnNumber = 0;
String exceptionSourceURL;
if (callStack->size()) {
const ScriptCallFrame& frame = callStack->at(0);
lineNumber = frame.lineNumber();
columnNumber = frame.columnNumber();
exceptionSourceURL = frame.sourceURL();
} else {
// There may not be an exceptionStack for a <script> SyntaxError. Fallback to getting at least the line and sourceURL from the exception.
JSObject* exceptionObject = exception.toObject(exec);
JSValue lineValue = exceptionObject->getDirect(exec->vm(), Identifier(exec, "line"));
lineNumber = lineValue && lineValue.isNumber() ? int(lineValue.toNumber(exec)) : 0;
JSValue columnValue = exceptionObject->getDirect(exec->vm(), Identifier(exec, "column"));
columnNumber = columnValue && columnValue.isNumber() ? int(columnValue.toNumber(exec)) : 0;
JSValue sourceURLValue = exceptionObject->getDirect(exec->vm(), Identifier(exec, "sourceURL"));
exceptionSourceURL = sourceURLValue && sourceURLValue.isString() ? sourceURLValue.toString(exec)->value(exec) : ASCIILiteral("undefined");
}
String errorMessage;
if (ExceptionBase* exceptionBase = toExceptionBase(exception))
errorMessage = exceptionBase->message() + ": " + exceptionBase->description();
else {
// FIXME: <http://webkit.org/b/115087> Web Inspector: WebCore::reportException should not evaluate JavaScript handling exceptions
// If this is a custon exception object, call toString on it to try and get a nice string representation for the exception.
errorMessage = exception.toString(exec)->value(exec);
exec->clearException();
exec->clearSupplementaryExceptionInfo();
}
ScriptExecutionContext* scriptExecutionContext = globalObject->scriptExecutionContext();
scriptExecutionContext->reportException(errorMessage, lineNumber, columnNumber, exceptionSourceURL, callStack->size() ? callStack : 0, cachedScript);
}
示例5: enforceRange
static inline T toSmallerUInt(ExecState* exec, JSValue value, IntegerConversionConfiguration configuration)
{
typedef IntTypeLimits<T> LimitsTrait;
// Fast path if the value is already a 32-bit unsigned integer in the right range.
if (value.isUInt32()) {
uint32_t d = value.asUInt32();
if (d <= LimitsTrait::maxValue)
return static_cast<T>(d);
if (configuration == EnforceRange) {
throwTypeError(exec);
return 0;
}
return static_cast<T>(d);
}
double x = value.toNumber(exec);
if (exec->hadException())
return 0;
if (configuration == EnforceRange)
return enforceRange(exec, x, 0, LimitsTrait::maxValue);
if (std::isnan(x) || std::isinf(x) || !x)
return 0;
x = x < 0 ? -floor(fabs(x)) : floor(fabs(x));
return static_cast<T>(fmod(x, LimitsTrait::numberOfValues));
}
示例6: enforceRange
// http://www.w3.org/TR/WebIDL/#es-byte
int8_t toInt8(ExecState* exec, JSValue value, IntegerConversionConfiguration configuration)
{
// Fast path if the value is already a 32-bit signed integer in the right range.
if (value.isInt32()) {
int32_t d = value.asInt32();
if (d >= kMinInt8 && d <= kMaxInt8)
return static_cast<int8_t>(d);
if (configuration == EnforceRange) {
throwTypeError(exec);
return 0;
}
d %= 256;
return static_cast<int8_t>(d > kMaxInt8 ? d - 256 : d);
}
double x = value.toNumber(exec);
if (exec->hadException())
return 0;
if (configuration == EnforceRange)
return enforceRange(exec, x, kMinInt8, kMaxInt8);
if (std::isnan(x) || std::isinf(x) || !x)
return 0;
x = x < 0 ? -floor(fabs(x)) : floor(fabs(x));
x = fmod(x, 256); // 2^8.
return static_cast<int8_t>(x > kMaxInt8 ? x - 256 : x);
}
示例7: encode
static EncodedJSValue JSC_HOST_CALL IntlDateTimeFormatFuncFormatDateTime(ExecState* state)
{
// 12.3.4 DateTime Format Functions (ECMA-402 2.0)
// 1. Let dtf be the this value.
// 2. Assert: Type(dtf) is Object and dtf has an [[initializedDateTimeFormat]] internal slot whose value is true.
IntlDateTimeFormat* format = jsCast<IntlDateTimeFormat*>(state->thisValue());
JSValue date = state->argument(0);
double value;
// 3. If date is not provided or is undefined, then
if (date.isUndefined()) {
// a. Let x be %Date_now%().
value = JSValue::decode(dateNow(state)).toNumber(state);
} else {
// 4. Else
// a. Let x be ToNumber(date).
value = date.toNumber(state);
// b. ReturnIfAbrupt(x).
if (state->hadException())
return JSValue::encode(jsUndefined());
}
// 5. Return FormatDateTime(dtf, x).
return JSValue::encode(format->format(*state, value));
}
示例8: normalizeHighWaterMark
static inline double normalizeHighWaterMark(ExecState& exec, JSObject& strategy)
{
JSValue jsHighWaterMark = getPropertyFromObject(exec, strategy, "highWaterMark");
if (exec.hadException())
return 0;
if (jsHighWaterMark.isUndefined())
return 1;
double highWaterMark = jsHighWaterMark.toNumber(&exec);
if (exec.hadException())
return 0;
if (std::isnan(highWaterMark)) {
throwVMError(&exec, createTypeError(&exec, ASCIILiteral("Value is NaN")));
return 0;
}
if (highWaterMark < 0) {
throwVMError(&exec, createRangeError(&exec, ASCIILiteral("Not a positive value")));
return 0;
}
return highWaterMark;
}
示例9: constructDate
// ECMA 15.9.3
JSObject* constructDate(ExecState* exec, JSGlobalObject* globalObject, JSValue newTarget, const ArgList& args)
{
VM& vm = exec->vm();
int numArgs = args.size();
double value;
if (numArgs == 0) // new Date() ECMA 15.9.3.3
value = NORMAL_OR_DETERMINISTIC_FUNCTION(jsCurrentTime(), deterministicCurrentTime(globalObject));
else if (numArgs == 1) {
if (args.at(0).inherits(DateInstance::info()))
value = asDateInstance(args.at(0))->internalNumber();
else {
JSValue primitive = args.at(0).toPrimitive(exec);
if (primitive.isString())
value = parseDate(vm, primitive.getString(exec));
else
value = primitive.toNumber(exec);
}
} else
value = millisecondsFromComponents(exec, args, WTF::LocalTime);
Structure* dateStructure = InternalFunction::createSubclassStructure(exec, newTarget, globalObject->dateStructure());
return DateInstance::create(vm, dateStructure, value);
}
示例10: toNumber
double JSObject::toNumber(ExecState *exec) const
{
JSValue *prim = toPrimitive(exec,NumberType);
if (exec->hadException()) // should be picked up soon in nodes.cpp
return 0.0;
return prim->toNumber(exec);
}
示例11: close
JSValue JSWebSocket::close(ExecState* exec)
{
// FIXME: We should implement [Clamp] for IDL binding code generator, and
// remove this custom method.
WebSocket* webSocket = static_cast<WebSocket*>(impl());
size_t argumentCount = exec->argumentCount();
int code = WebSocketChannel::CloseEventCodeNotSpecified;
String reason = "";
if (argumentCount >= 1) {
JSValue v = exec->argument(0);
double x = v.toNumber(exec);
double maxValue = static_cast<double>(std::numeric_limits<uint16_t>::max());
double minValue = static_cast<double>(std::numeric_limits<uint16_t>::min());
if (isnan(x))
x = 0.0;
else
x = clampTo(x, minValue, maxValue);
code = clampToInteger(x);
if (argumentCount >= 2) {
reason = ustringToString(exec->argument(1).toString(exec)->value(exec));
if (exec->hadException()) {
setDOMException(exec, SYNTAX_ERR);
return jsUndefined();
}
}
}
ExceptionCode ec = 0;
webSocket->close(code, reason, ec);
setDOMException(exec, ec);
return jsUndefined();
}
示例12: toNumber
double JSObject::toNumber(ExecState* exec) const
{
JSValue primitive = toPrimitive(exec, PreferNumber);
if (exec->hadException()) // should be picked up soon in Nodes.cpp
return 0.0;
return primitive.toNumber(exec);
}
示例13: setJSHTMLMeterElementOptimum
void setJSHTMLMeterElementOptimum(ExecState* exec, JSObject* thisObject, JSValue value)
{
JSHTMLMeterElement* castedThis = static_cast<JSHTMLMeterElement*>(thisObject);
HTMLMeterElement* imp = static_cast<HTMLMeterElement*>(castedThis->impl());
ExceptionCode ec = 0;
imp->setOptimum(value.toNumber(exec), ec);
setDOMException(exec, ec);
}
示例14: main
int main(int argc, char **argv)
{
// expecting a filename
if (argc < 2) {
fprintf(stderr, "You have to specify at least one filename\n");
return -1;
}
bool ret = true;
{
JSLock lock;
// create interpreter w/ global object
Global* global = new Global();
RefPtr<Interpreter> interp = new Interpreter(global);
ExecState *exec = interp->globalExec();
MyObject *myObject = (MyObject *)_NPN_CreateObject (NPP(0), myFunctionPtrs);
// FIXME
// global->put(exec, Identifier("myInterface"), Instance::createRuntimeObject(Instance::CLanguage, (void *)myObject));
for (int i = 1; i < argc; i++) {
const char *code = readJavaScriptFromFile(argv[i]);
if (code) {
// run
Completion comp(interp->evaluate("", 0, code));
if (comp.complType() == Throw) {
JSValue *exVal = comp.value();
char *msg = exVal->toString(exec).ascii();
int lineno = -1;
if (exVal->type() == ObjectType) {
JSValue *lineVal = exVal->getObject()->get(exec, Identifier("line"));
if (lineVal->type() == NumberType)
lineno = int(lineVal->toNumber(exec));
}
if (lineno != -1)
fprintf(stderr,"Exception, line %d: %s\n",lineno,msg);
else
fprintf(stderr,"Exception: %s\n",msg);
ret = false;
}
else if (comp.complType() == ReturnValue) {
char *msg = comp.value()->toString(interp->globalExec()).ascii();
fprintf(stderr,"Return value: %s\n",msg);
}
}
}
_NPN_ReleaseObject ((NPObject *)myObject);
} // end block, so that Interpreter and global get deleted
return ret ? 0 : 3;
}
示例15: constructDate
// ECMA 15.9.3
JSObject* constructDate(ExecState* exec, JSGlobalObject* globalObject, const ArgList& args)
{
VM& vm = exec->vm();
int numArgs = args.size();
double value;
if (numArgs == 0) // new Date() ECMA 15.9.3.3
value = jsCurrentTime();
else if (numArgs == 1) {
if (args.at(0).inherits(DateInstance::info()))
value = asDateInstance(args.at(0))->internalNumber();
else {
JSValue primitive = args.at(0).toPrimitive(exec);
if (primitive.isString())
value = parseDate(vm, primitive.getString(exec));
else
value = primitive.toNumber(exec);
}
} else {
double doubleArguments[7] = {
args.at(0).toNumber(exec),
args.at(1).toNumber(exec),
args.at(2).toNumber(exec),
args.at(3).toNumber(exec),
args.at(4).toNumber(exec),
args.at(5).toNumber(exec),
args.at(6).toNumber(exec)
};
if (!std::isfinite(doubleArguments[0])
|| !std::isfinite(doubleArguments[1])
|| (numArgs >= 3 && !std::isfinite(doubleArguments[2]))
|| (numArgs >= 4 && !std::isfinite(doubleArguments[3]))
|| (numArgs >= 5 && !std::isfinite(doubleArguments[4]))
|| (numArgs >= 6 && !std::isfinite(doubleArguments[5]))
|| (numArgs >= 7 && !std::isfinite(doubleArguments[6])))
value = QNaN;
else {
GregorianDateTime t;
int year = JSC::toInt32(doubleArguments[0]);
t.setYear((year >= 0 && year <= 99) ? (year + 1900) : year);
t.setMonth(JSC::toInt32(doubleArguments[1]));
t.setMonthDay((numArgs >= 3) ? JSC::toInt32(doubleArguments[2]) : 1);
t.setHour(JSC::toInt32(doubleArguments[3]));
t.setMinute(JSC::toInt32(doubleArguments[4]));
t.setSecond(JSC::toInt32(doubleArguments[5]));
t.setIsDST(-1);
double ms = (numArgs >= 7) ? doubleArguments[6] : 0;
value = gregorianDateTimeToMS(vm, t, ms, false);
}
}
return DateInstance::create(vm, globalObject->dateStructure(), value);
}