]> git.saurik.com Git - cycript.git/commitdiff
Support Infinity (syntax highlighting and output).
authorJay Freeman (saurik) <saurik@saurik.com>
Sat, 12 Dec 2015 23:45:22 +0000 (15:45 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Sat, 12 Dec 2015 23:45:22 +0000 (15:45 -0800)
Library.cpp
Parser.ypp.in
Scanner.lpp.in

index 59decd8351cd0b4e4f463e2b1d1ea7c2238b55cb..720322564e1fb181f6ac78407f6116164ffb8c8e 100644 (file)
@@ -172,6 +172,13 @@ void CYStringify(std::ostringstream &str, const char *data, size_t size) {
 }
 
 void CYNumerify(std::ostringstream &str, double value) {
+    if (std::isinf(value)) {
+        if (value < 0)
+            str << '-';
+        str << "Infinity";
+        return;
+    }
+
     char string[32];
     // XXX: I want this to print 1e3 rather than 1000
     sprintf(string, "%.17g", value);
index e453814faffeb86e41ddbcefa28a77f203af68a7..d18903cc70d23cf5977ccd501d37afaaf1f4b4f3 100644 (file)
@@ -323,6 +323,7 @@ _finline int yylex(cy::parser::semantic_type *semantic, CYLocation *location, CY
 %token _import_ "import"
 %token _in_ "in"
 %token _in__ "!in"
+%token _Infinity_ "Infinity"
 %token _instanceof_ "instanceof"
 %token _new_ "new"
 %token _return_ "return"
@@ -703,6 +704,7 @@ IdentifierName
     : Word { $$ = $1; }
     | "for" { $$ = CYNew CYWord("for"); }
     | "in" { $$ = CYNew CYWord("in"); }
+    | "Infinity" { $$ = CYNew CYIdentifier("Infinity"); }
     | "instanceof" { $$ = CYNew CYWord("instanceof"); }
     ;
 
@@ -907,6 +909,7 @@ Literal
     : NullLiteral { $$ = $1; }
     | BooleanLiteral { $$ = $1; }
     | NumericLiteral { $$ = $1; }
+    | "Infinity" { $$ = CYNew CYNumber(std::numeric_limits<double>::infinity()); }
     | StringLiteral { $$ = $1; }
     ;
 /* }}} */
index 72011986e4b26010b69b1e62f74cba2b6d4ce192..e34f67519ee3b4f3c79ac3fd756e3f3762193884 100644 (file)
@@ -475,6 +475,7 @@ XMLName {XMLNameStart}{XMLNamePart}*
 "implements"      L /*FSS*/ F(tk::_implements_, hi::Meta);
 "import"          L /*FFK*/ F(tk::_import_, hi::Meta);
 "in"              L /*KKK*/ F(yyextra->in_.top() ? tk::_in__ : tk::_in_, hi::Operator);
+"Infinity"        L /*III*/ F(tk::_Infinity_, hi::Constant);
 "instanceof"      L /*KKK*/ F(tk::_instanceof_, hi::Operator);
 "int"             L /*FII*/ F(tk::_int_, hi::Type);
 "interface"       L /*FSS*/ F(tk::_interface_, hi::Meta);