]> git.saurik.com Git - cycript.git/commitdiff
Add extern "C" expression, for Functor's toCYON().
authorJay Freeman (saurik) <saurik@saurik.com>
Sun, 3 Jan 2016 11:36:31 +0000 (03:36 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Sun, 3 Jan 2016 11:36:31 +0000 (03:36 -0800)
Execute.cpp
Output.cpp
Parser.ypp.in
Replace.cpp
Syntax.hpp

index 7d14b10df54bb75ae1673cc103f8da1352019a86..b8978dbb5c39e0d8f5f5ca7bdeb26b61f68e0c4a 100644 (file)
@@ -1632,7 +1632,7 @@ static JSValueRef Functor_callAsFunction_toCYON(JSContextRef context, JSObjectRe
     CYOptions options;
     CYOutput output(*str.rdbuf(), options);
     output.pretty_ = true;
-    (new(pool) CYExternal(new(pool) CYString("C"), typed))->Output(output, CYNoFlags);
+    (new(pool) CYExternalExpression(new(pool) CYString("C"), typed))->Output(output, CYNoFlags);
     return CYCastJSValue(context, CYJSString(str.str()));
 } CYCatch(NULL) }
 
@@ -1741,6 +1741,7 @@ static JSValueRef Type_callAsFunction_toCYON(JSContextRef context, JSObjectRef o
     std::stringbuf out;
     CYOptions options;
     CYOutput output(out, options);
+    output.pretty_ = true;
     (new(pool) CYTypeExpression(CYDecodeType(pool, internal->type_->Copy(pool, ""))))->Output(output, CYNoFlags);
     return CYCastJSValue(context, CYJSString(out.str().c_str()));
 } CYCatch(NULL) }
index 0bc11727f29c47ed99bc86ce772bc51c2357d1b7..06b60b22bbfa20eef73774a299a04e77f6379b9a 100644 (file)
@@ -457,11 +457,15 @@ void CYExtend::Output(CYOutput &out, CYFlags flags) const {
     out << ' ' << object_;
 }
 
-void CYExternal::Output(CYOutput &out, CYFlags flags) const {
+void CYExternalDefinition::Output(CYOutput &out, CYFlags flags) const {
     out << "extern" << ' ' << abi_ << ' ' << typed_;
     out.Terminate();
 }
 
+void CYExternalExpression::Output(CYOutput &out, CYFlags flags) const {
+    out << '(' << "extern" << ' ' << abi_ << ' ' << typed_ << ')';
+}
+
 void CYFatArrow::Output(CYOutput &out, CYFlags flags) const {
     out << '(' << parameters_ << ')' << ' ' << "=>" << ' ' << '{' << code_ << '}';
 }
index d969fdf0259a2a8307fb388b475d1a1dd7e2a8cd..11d8d298d8b63b779d08db133399c4b839329fe7 100644 (file)
@@ -2423,7 +2423,7 @@ IdentifierNoOf
     ;
 
 ExternCStatement
-    : TypedIdentifierField[typed] TerminatorHard { $$ = CYNew CYExternal(CYNew CYString("C"), $typed); }
+    : TypedIdentifierField[typed] TerminatorHard { $$ = CYNew CYExternalDefinition(CYNew CYString("C"), $typed); }
     | TypeDefinition[pass] { $$ = $pass; }
     ;
 
@@ -2437,8 +2437,16 @@ ExternC
     | ExternCStatement[pass] { $$ = $pass; }
     ;
 
+ABI
+    : StringLiteral[abi] { if (strcmp($abi->Value(), "C") != 0) CYERR(@abi, "unknown extern binding"); }
+    ;
+
 Statement__
-    : "extern" NewLineNot StringLiteral[abi] { if (strcmp($abi->Value(), "C") != 0) CYERR(@abi, "unknown extern binding"); } ExternC[pass] { $$ = $pass; }
+    : "extern" NewLineNot ABI[abi] ExternC[pass] { $$ = $pass; }
+    ;
+
+PrimaryExpression
+    : "(" LexOf "extern" NewLineOpt ABI[abi] TypedIdentifierField[typed] ")" { $$ = CYNew CYExternalExpression(CYNew CYString("C"), $typed); }
     ;
 /* }}} */
 @end
index 6f33f8f584dbe08ea0f2ba983805f3e257cdd8c4..de9489ea63e62b5f00aca3906ca2107e3406fe70 100644 (file)
@@ -388,8 +388,12 @@ CYTarget *CYExtend::Replace(CYContext &context) {
     return object_.Replace(context, lhs_);
 }
 
-CYStatement *CYExternal::Replace(CYContext &context) {
-    return $E($ CYAssign($V(typed_->identifier_), $C1(typed_->Replace(context), $C2($V("dlsym"), $V("RTLD_DEFAULT"), $S(typed_->identifier_->Word())))));
+CYStatement *CYExternalDefinition::Replace(CYContext &context) {
+    return $E($ CYAssign($V(typed_->identifier_), $ CYExternalExpression(abi_, typed_)));
+}
+
+CYTarget *CYExternalExpression::Replace(CYContext &context) {
+    return $C1(typed_->Replace(context), $C2($V("dlsym"), $V("RTLD_DEFAULT"), $S(typed_->identifier_->Word())));
 }
 
 CYNumber *CYFalse::Number(CYContext &context) {
index e67031fa907cea4ac7c439b6f31122b7100142cc..e3885cf4ba7f2ec93ac09358ea33e96ab415e000 100644 (file)
@@ -2405,13 +2405,31 @@ struct CYImportDeclaration :
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
 
-struct CYExternal :
+struct CYExternalExpression :
+    CYTarget
+{
+    CYString *abi_;
+    CYTypedIdentifier *typed_;
+
+    CYExternalExpression(CYString *abi, CYTypedIdentifier *typed) :
+        abi_(abi),
+        typed_(typed)
+    {
+    }
+
+    CYPrecedence(0)
+
+    virtual CYTarget *Replace(CYContext &context);
+    virtual void Output(CYOutput &out, CYFlags flags) const;
+};
+
+struct CYExternalDefinition :
     CYStatement
 {
     CYString *abi_;
     CYTypedIdentifier *typed_;
 
-    CYExternal(CYString *abi, CYTypedIdentifier *typed) :
+    CYExternalDefinition(CYString *abi, CYTypedIdentifier *typed) :
         abi_(abi),
         typed_(typed)
     {