rt-thread/components/external/espruino/src/jswrap_functions.c

103 lines
3.4 KiB
C

/*
* This file is part of Espruino, a JavaScript interpreter for Microcontrollers
*
* Copyright (C) 2013 Gordon Williams <gw@pur3.co.uk>
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* ----------------------------------------------------------------------------
* This file is designed to be parsed during the build process
*
* JavaScript methods and functions in the global namespace
* ----------------------------------------------------------------------------
*/
#include "jswrap_functions.h"
#include "jslex.h"
#include "jsparse.h"
#include "jsinteractive.h"
/*JSON{ "type":"variable", "name" : "arguments",
"description" : "A variable containing the arguments given to the function",
"generate" : "jswrap_arguments",
"return" : ["JsVar", "An array containing all the arguments given to the function"]
}*/
extern JsExecInfo execInfo;
JsVar *jswrap_arguments() {
JsVar *scope = 0;
if (execInfo.scopeCount>0)
scope = jsvLock(execInfo.scopes[execInfo.scopeCount-1]);
if (!jsvIsFunction(scope)) {
jsvUnLock(scope);
jsError("Can only use 'arguments' variable inside a function");
return 0;
}
JsVar *args = jsvNewWithFlags(JSV_ARRAY);
if (!args) return 0; // out of memory
JsObjectIterator it;
jsvObjectIteratorNew(&it, scope);
while (jsvObjectIteratorHasElement(&it)) {
JsVar *idx = jsvObjectIteratorGetKey(&it);
if (jsvIsFunctionParameter(idx)) {
JsVar *val = jsvSkipOneName(idx);
jsvArrayPushAndUnLock(args, val);
}
jsvUnLock(idx);
jsvObjectIteratorNext(&it);
}
jsvObjectIteratorFree(&it);
jsvUnLock(scope);
return args;
}
/*JSON{ "type":"function", "name" : "eval",
"description" : "Evaluate a string containing JavaScript code",
"generate" : "jswrap_eval",
"params" : [ [ "code", "JsVar", ""] ],
"return" : ["JsVar", "The result of evaluating the string"]
}*/
JsVar *jswrap_eval(JsVar *v) {
if (!v) return 0;
JsVar *s = jsvAsString(v, false); // get as a string
JsVar *result = jspEvaluateVar(jsiGetParser(), s, 0);
jsvUnLock(s);
return result;
}
/*JSON{ "type":"function", "name" : "parseInt",
"description" : "Convert a string representing a number into an integer",
"generate" : "jswrap_parseInt",
"params" : [ [ "string", "JsVar", ""],
[ "radix", "JsVar", "The Radix of the string (optional)"] ],
"return" : ["JsVar", "The integer value of the string (or NaN)"]
}*/
JsVar *jswrap_parseInt(JsVar *v, JsVar *radixVar) {
int radix = 0/*don't force radix*/;
if (jsvIsNumeric(radixVar))
radix = (int)jsvGetInteger(radixVar);
char buffer[JS_NUMBER_BUFFER_SIZE];
jsvGetString(v, buffer, JS_NUMBER_BUFFER_SIZE);
bool hasError;
JsVarInt i = stringToIntWithRadix(buffer, radix, &hasError);
if (hasError) return jsvNewFromFloat(NAN);
return jsvNewFromInteger(i);
}
/*JSON{ "type":"function", "name" : "parseFloat",
"description" : "Convert a string representing a number into an float",
"generate" : "jswrap_parseFloat",
"params" : [ [ "string", "JsVar", ""] ],
"return" : ["float", "The value of the string"]
}*/
JsVarFloat jswrap_parseFloat(JsVar *v) {
char buffer[JS_NUMBER_BUFFER_SIZE];
jsvGetString(v, buffer, JS_NUMBER_BUFFER_SIZE);
return stringToFloat(buffer);
}