+ unsigned size = s.length();
+
+ if (size == 1) {
+ UChar c = s[0];
+ if (isASCIIDigit(c))
+ return c - '0';
+ return QNaN;
+ }
+
+ if (s.is8Bit()) {
+ const LChar* data = s.characters8();
+ const LChar* end = data + size;
+
+ // Skip leading white space.
+ for (; data < end; ++data) {
+ if (!isStrWhiteSpace(*data))
+ break;
+ }
+
+ // Empty string.
+ if (data == end)
+ return QNaN;
+
+ return jsStrDecimalLiteral(data, end);
+ }
+
+ const UChar* data = s.characters16();
+ const UChar* end = data + size;
+
+ // Skip leading white space.
+ for (; data < end; ++data) {
+ if (!isStrWhiteSpace(*data))
+ break;
+ }
+
+ // Empty string.
+ if (data == end)
+ return QNaN;
+
+ return jsStrDecimalLiteral(data, end);
+}
+
+EncodedJSValue JSC_HOST_CALL globalFuncEval(ExecState* exec)
+{
+ JSValue x = exec->argument(0);
+ if (!x.isString())
+ return JSValue::encode(x);
+
+ String s = x.toString(exec)->value(exec);
+
+ if (s.is8Bit()) {
+ LiteralParser<LChar> preparser(exec, s.characters8(), s.length(), NonStrictJSON);
+ if (JSValue parsedObject = preparser.tryLiteralParse())
+ return JSValue::encode(parsedObject);
+ } else {
+ LiteralParser<UChar> preparser(exec, s.characters16(), s.length(), NonStrictJSON);
+ if (JSValue parsedObject = preparser.tryLiteralParse())
+ return JSValue::encode(parsedObject);
+ }
+
+ JSGlobalObject* calleeGlobalObject = exec->callee()->globalObject();
+ EvalExecutable* eval = EvalExecutable::create(exec, exec->vm().codeCache(), makeSource(s), false);
+ JSObject* error = eval->compile(exec, calleeGlobalObject);
+ if (error)
+ return throwVMError(exec, error);
+
+ return JSValue::encode(exec->interpreter()->execute(eval, exec, calleeGlobalObject->globalThis(), calleeGlobalObject));