]> git.saurik.com Git - cycript.git/blobdiff - Replace.cpp
Allow the size of array typedefs to be a variable.
[cycript.git] / Replace.cpp
index de9489ea63e62b5f00aca3906ca2107e3406fe70..68beb4f47b3ad1127ba94aabb0338c714434b159 100644 (file)
@@ -182,6 +182,7 @@ CYTarget *CYClassExpression::Replace(CYContext &context) {
 
     if (tail_->constructor_ == NULL)
         tail_->constructor_ = $ CYFunctionExpression(NULL, NULL, NULL);
+    tail_->constructor_->name_ = name_;
     tail_->constructor_ = CYSuperize(context, tail_->constructor_);
 
     context.super_ = old;
@@ -389,11 +390,14 @@ CYTarget *CYExtend::Replace(CYContext &context) {
 }
 
 CYStatement *CYExternalDefinition::Replace(CYContext &context) {
-    return $E($ CYAssign($V(typed_->identifier_), $ CYExternalExpression(abi_, typed_)));
+    return $E($ CYAssign($V(name_), $ CYExternalExpression(abi_, type_, name_)));
 }
 
 CYTarget *CYExternalExpression::Replace(CYContext &context) {
-    return $C1(typed_->Replace(context), $C2($V("dlsym"), $V("RTLD_DEFAULT"), $S(typed_->identifier_->Word())));
+    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) {
@@ -966,7 +970,10 @@ CYIdentifierFlags *CYScope::Declare(CYContext &context, CYIdentifier *identifier
     else if (existing->kind_ == CYIdentifierGlobal || existing->kind_ == CYIdentifierMagic)
         existing->kind_ = kind;
     else if (existing->kind_ == CYIdentifierLexical || kind == CYIdentifierLexical)
-        _assert(false); // XXX: throw new SyntaxError()
+        _assert(false);
+    else if (transparent_ && existing->kind_ == CYIdentifierArgument && kind == CYIdentifierVariable)
+        _assert(false);
+    // XXX: throw new SyntaxError() instead of these asserts
 
     return existing;
 }
@@ -1004,10 +1011,6 @@ void CYScope::Close(CYContext &context) {
     CYForEach (i, internal_) {
         _assert(i->identifier_->next_ == i->identifier_);
     switch (i->kind_) {
-        case CYIdentifierArgument: {
-            _assert(!transparent_);
-        } break;
-
         case CYIdentifierLexical: {
             if (!damaged_) {
                 CYIdentifier *replace(context.Unique());
@@ -1098,6 +1101,12 @@ CYString *CYString::Concat(CYContext &context, CYString *rhs) const {
     return $S(value, size);
 }
 
+CYIdentifier *CYString::Identifier() const {
+    if (const char *word = Word())
+        return $ CYIdentifier(word);
+    return NULL;
+}
+
 CYNumber *CYString::Number(CYContext &context) {
     // XXX: there is a precise algorithm for this
     return NULL;
@@ -1123,14 +1132,13 @@ CYTarget *CYStructTail::Replace(CYContext &context) {
     CYList<CYElementValue> names;
 
     CYForEach (field, fields_) {
-        CYTypedIdentifier *typed(field->typed_);
-        types->*$ CYElementValue(typed->Replace(context));
+        types->*$ CYElementValue(field->type_->Replace(context));
 
         CYExpression *name;
-        if (typed->identifier_ == NULL)
+        if (field->name_ == NULL)
             name = NULL;
         else
-            name = $S(typed->identifier_->Word());
+            name = field->name_->PropertyName(context);
         names->*$ CYElementValue(name);
     }
 
@@ -1165,6 +1173,13 @@ CYTarget *CYTemplate::Replace(CYContext &context) {
     return $C2($M($M($M($V("String"), $S("prototype")), $S("concat")), $S("apply")), $S(""), $ CYArray($ CYElementValue(string_, spans_->Replace(context))));
 }
 
+CYString *CYTemplate::String(CYContext &context) {
+    // XXX: implement this over local concat
+    if (spans_ != NULL)
+        return NULL;
+    return string_;
+}
+
 CYTarget *CYThis::Replace(CYContext &context) {
     if (context.this_ != NULL)
         return $V(context.this_->Identifier(context));
@@ -1230,9 +1245,19 @@ CYTarget *CYTypeConstant::Replace_(CYContext &context, CYTarget *type) {
 }
 
 CYStatement *CYTypeDefinition::Replace(CYContext &context) {
-    CYIdentifier *identifier(typed_->identifier_);
-    typed_->identifier_ = NULL;
-    return $ CYLexical(false, $B1($B(identifier, $ CYTypeExpression(typed_))));
+    return $ CYLexical(false, $B1($B(name_, $ CYTypeExpression(type_))));
+}
+
+CYTarget *CYTypeEnum::Replace(CYContext &context) {
+    CYList<CYProperty> properties;
+    CYForEach (constant, constants_)
+        properties->*$ CYPropertyValue($S(constant->name_->Word()), constant->value_);
+    CYObject *constants($ CYObject(properties));
+
+    if (specifier_ == NULL)
+        return $N1($V("Type"), constants);
+    else
+        return $C1($M(specifier_->Replace(context), $S("enumFor")), constants);
 }
 
 CYTarget *CYTypeError::Replace(CYContext &context) {
@@ -1244,6 +1269,19 @@ CYTarget *CYTypeExpression::Replace(CYContext &context) {
     return typed_->Replace(context);
 }
 
+CYTarget *CYTypeFloating::Replace(CYContext &context) {
+    switch (length_) {
+        case 0: return $V("float");
+        case 1: return $V("double");
+        case 2: return $V("longdouble");
+        default: _assert(false);
+    }
+}
+
+CYTarget *CYTypeInt128::Replace(CYContext &context) {
+    return $V(signing_ == CYTypeUnsigned ? "uint128" : "int128");
+}
+
 CYTarget *CYTypeIntegral::Replace(CYContext &context) {
     bool u(signing_ == CYTypeUnsigned);
     switch (length_) {
@@ -1271,7 +1309,14 @@ CYTarget *CYTypePointerTo::Replace_(CYContext &context, CYTarget *type) {
 }
 
 CYTarget *CYTypeReference::Replace(CYContext &context) {
-    return $V($pool.strcat(name_->Word(), "$cy", NULL));
+    const char *prefix;
+    switch (kind_) {
+        case CYTypeReferenceStruct: prefix = "$cys"; break;
+        case CYTypeReferenceEnum: prefix = "$cye"; break;
+        default: _assert(false);
+    }
+
+    return $V($pool.strcat(prefix, name_->Word(), NULL));
 }
 
 CYTarget *CYTypeStruct::Replace(CYContext &context) {
@@ -1293,11 +1338,11 @@ CYTarget *CYTypeVolatile::Replace_(CYContext &context, CYTarget *type) {
     return next_->Replace(context, $ CYCall($ CYDirectMember(type, $ CYString("volatile"))));
 }
 
-CYTarget *CYTypedIdentifier::Replace(CYContext &context) {
+CYTarget *CYType::Replace(CYContext &context) {
     return modifier_->Replace(context, specifier_->Replace(context));
 }
 
-CYTypeFunctionWith *CYTypedIdentifier::Function() {
+CYTypeFunctionWith *CYType::Function() {
     CYTypeModifier *&modifier(CYGetLast(modifier_));
     if (modifier == NULL)
         return NULL;
@@ -1311,15 +1356,15 @@ CYTypeFunctionWith *CYTypedIdentifier::Function() {
 }
 
 CYArgument *CYTypedParameter::Argument(CYContext &context) { $T(NULL)
-    return $ CYArgument(typed_->Replace(context), next_->Argument(context));
+    return $ CYArgument(type_->Replace(context), next_->Argument(context));
 }
 
 CYFunctionParameter *CYTypedParameter::Parameters(CYContext &context) { $T(NULL)
-    return $ CYFunctionParameter($ CYBinding(typed_->identifier_ ?: context.Unique()), next_->Parameters(context));
+    return $ CYFunctionParameter($ CYBinding(name_ ?: context.Unique()), next_->Parameters(context));
 }
 
 CYExpression *CYTypedParameter::TypeSignature(CYContext &context, CYExpression *prefix) { $T(prefix)
-    return next_->TypeSignature(context, $ CYAdd(prefix, typed_->Replace(context)));
+    return next_->TypeSignature(context, $ CYAdd(prefix, type_->Replace(context)));
 }
 
 CYForInitializer *CYVar::Replace(CYContext &context) {