]> git.saurik.com Git - cycript.git/commitdiff
Avoid naming functors without symbols as just "1".
authorJay Freeman (saurik) <saurik@saurik.com>
Thu, 7 Jan 2016 09:42:12 +0000 (01:42 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Thu, 7 Jan 2016 09:42:12 +0000 (01:42 -0800)
Execute.cpp
Parser.ypp.in
Replace.cpp
Syntax.hpp

index 229e238dcf7fd44a3601646d65ee3554c3f3545c..e4ed3d8197cd35daad63f11268014baad7c990d7 100644 (file)
@@ -1761,29 +1761,28 @@ static JSValueRef Functor_callAsFunction_valueOf(JSContextRef context, JSObjectR
 static JSValueRef Functor_callAsFunction_toCYON(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {
     cy::Functor *internal(reinterpret_cast<cy::Functor *>(JSObjectGetPrivate(_this)));
     uint8_t *value(reinterpret_cast<uint8_t *>(internal->value_));
+    _assert(value != NULL);
 
     CYLocalPool pool;
 
     sig::Function function(internal->variadic_);
     sig::Copy(pool, function.signature, internal->signature_);
 
-    CYString *name;
+    CYPropertyName *name;
 
     auto typed(CYDecodeType(pool, &function)); {
         std::ostringstream str;
         Dl_info info;
-        if (internal->value_ == NULL)
-            str << "NULL";
-        else if (dladdr(value, &info) == 0)
-            str << internal->value_;
-        else {
+        if (dladdr(value, &info) == 0) {
+            str << (void *) value;
+            name = new(pool) CYNumber(reinterpret_cast<uintptr_t>(value));
+        } else {
             str << info.dli_sname;
             off_t offset(value - reinterpret_cast<uint8_t *>(info.dli_saddr));
             if (offset != 0)
                 str << "+0x" << std::hex << offset;
+            name = new(pool) CYString(pool.strdup(str.str().c_str()));
         }
-
-        name = new(pool) CYString(pool.strdup(str.str().c_str()));
     }
 
     std::ostringstream str;
index 9db7666cefc607b5d28d98fcedc280d80e84c1fe..0d8e87d50109910107dd4d3b02bff9953f3e0516 100644 (file)
@@ -2031,6 +2031,7 @@ ExportSpecifier
 TypeSignifier
     : IdentifierType[name] { $$ = CYNew CYTypedName(@name, $name); }
     | StringLiteral[name] { $$ = CYNew CYTypedName(@name, $name); }
+    | NumericLiteral[name] { $$ = CYNew CYTypedName(@name, $name); }
     | "(" "*" TypeQualifierRightOpt[typed] ")" { $$ = $typed; $$->modifier_ = CYNew CYTypePointerTo($$->modifier_); }
     ;
 
index 46dd8bbc7d166afeade80830d96d0d81578f2bed..c2681822f5f6c71782f48e8e070446bb4ee101de 100644 (file)
@@ -394,7 +394,10 @@ CYStatement *CYExternalDefinition::Replace(CYContext &context) {
 }
 
 CYTarget *CYExternalExpression::Replace(CYContext &context) {
-    return $C1(type_->Replace(context), $C2($V("dlsym"), $V("RTLD_DEFAULT"), name_->PropertyName(context)));
+    CYExpression *expression(name_->Number(context));
+    if (expression == NULL)
+        expression = $C2($V("dlsym"), $V("RTLD_DEFAULT"), name_->PropertyName(context));
+    return $C1(type_->Replace(context), expression);
 }
 
 CYNumber *CYFalse::Number(CYContext &context) {
index 5f9d705998155ad8826e46bec14e708d605a78e3..ea55a3fba59908a67ce9ca38280d2cb8c1039b19 100644 (file)
@@ -121,6 +121,7 @@ struct CYOutput {
 struct CYExpression;
 struct CYAssignment;
 struct CYIdentifier;
+struct CYNumber;
 
 struct CYPropertyName {
     virtual bool Computed() const {
@@ -135,6 +136,10 @@ struct CYPropertyName {
         return NULL;
     }
 
+    virtual CYNumber *Number(CYContext &context) {
+        return NULL;
+    }
+
     virtual CYExpression *PropertyName(CYContext &context) = 0;
     virtual void PropertyName(CYOutput &out) const = 0;
 };