]> git.saurik.com Git - cycript.git/commitdiff
Use Object.defineProperty as ES6 class visibility.
authorJay Freeman (saurik) <saurik@saurik.com>
Mon, 7 Dec 2015 09:22:20 +0000 (01:22 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Mon, 7 Dec 2015 09:22:20 +0000 (01:22 -0800)
Replace.cpp
Syntax.hpp

index 4d1a2be5d2cf7c5611a0b51249bb1a38e85f28bc..ef481e6252d46757d85be9c81f35d1e1c3040818 100644 (file)
@@ -34,6 +34,13 @@ CYFunctionExpression *CYSuperize(CYContext &context, CYFunctionExpression *funct
     return function;
 }
 
+CYStatement *CYDefineProperty(CYExpression *object, CYExpression *name, bool configurable, bool enumerable, CYProperty *descriptor) {
+    return $E($C3($M($V("Object"), $S("defineProperty")), object, name, $ CYObject(CYList<CYProperty>()
+        ->* (configurable ? $ CYPropertyValue($S("configurable"), $ CYTrue()) : NULL)
+        ->* (enumerable ? $ CYPropertyValue($S("enumerable"), $ CYTrue()) : NULL)
+        ->* descriptor)));
+}
+
 static void CYImplicitReturn(CYStatement *&code) {
     if (CYStatement *&last = CYGetLast(code))
         last = last->Return();
@@ -178,10 +185,10 @@ CYExpression *CYClassExpression::Replace(CYContext &context) {
         ->* $ CYVar($L1($L(prototype, $ CYFunctionExpression(NULL, NULL, NULL))))
         ->* $E($ CYAssign($M($V(prototype), $S("prototype")), $M($V(super), $S("prototype"))))
         ->* $E($ CYAssign($V(prototype), $N($V(prototype))))
-        ->* $E($ CYAssign($M($V(prototype), $S("constructor")), $V(constructor)))
+        ->* CYDefineProperty($V(prototype), $S("constructor"), false, false, $ CYPropertyValue($S("value"), $V(constructor)))
         ->* $ CYVar(builder.declarations_)
         ->* builder.statements_
-        ->* $E($ CYAssign($M($V(constructor), $S("prototype")), $V(prototype)))
+        ->* CYDefineProperty($V(constructor), $S("prototype"), false, false, $ CYPropertyValue($S("value"), $V(prototype)))
         ->* $ CYReturn($V(constructor))
     ), tail_->extends_ ?: $V($I("Object")));
 }
@@ -710,60 +717,54 @@ CYExpression *CYPrefix::Replace(CYContext &context) {
 CYProperty *CYProperty::ReplaceAll(CYContext &context, CYBuilder &builder, CYExpression *self, bool update) {
     update |= name_->Computed();
     if (update)
-        Replace(context, builder, self, true);
+        Replace(context, builder, self, false);
     if (next_ != NULL)
         next_ = next_->ReplaceAll(context, builder, self, update);
     return update ? next_ : this;
 }
 
-void CYProperty::Replace(CYContext &context, CYBuilder &builder, CYExpression *self, bool computed) {
+void CYProperty::Replace(CYContext &context, CYBuilder &builder, CYExpression *self, bool protect) {
     CYExpression *name(name_->PropertyName(context));
-    if (computed) {
+    if (name_->Computed()) {
         CYIdentifier *unique(context.Unique());
         builder.declarations_->*$L1($L(unique, name));
         name = $V(unique);
     }
 
-    Replace(context, builder, self, name);
+    Replace(context, builder, self, name, protect);
 }
 
-void CYPropertyGetter::Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name) {
+void CYPropertyGetter::Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect) {
     CYIdentifier *unique(context.Unique());
     builder.declarations_
         ->* $L1($L(unique, CYSuperize(context, $ CYFunctionExpression(NULL, parameters_, code_))));
     builder.statements_
-        ->* $E($C3($M($V("Object"), $S("defineProperty")), self, name, $ CYObject(CYList<CYProperty>()
-            ->* $ CYPropertyValue($S("configurable"), $ CYTrue())
-            ->* $ CYPropertyValue($S("enumerable"), $ CYTrue())
-            ->* $ CYPropertyValue($S("get"), $V(unique))
-        )));
+        ->* CYDefineProperty(self, name, true, !protect, $ CYPropertyValue($S("get"), $V(unique)));
 }
 
 CYFunctionExpression *CYPropertyMethod::Constructor() {
     return name_->Constructor() ? $ CYFunctionExpression(NULL, parameters_, code_) : NULL;
 }
 
-void CYPropertyMethod::Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name) {
+void CYPropertyMethod::Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect) {
     CYIdentifier *unique(context.Unique());
     builder.declarations_
         ->* $L1($L(unique, CYSuperize(context, $ CYFunctionExpression(NULL, parameters_, code_))));
     builder.statements_
-        ->* $E($ CYAssign($M(self, name), $V(unique)));
+        ->* (!protect ? $E($ CYAssign($M(self, name), $V(unique))) :
+            CYDefineProperty(self, name, true, !protect, $ CYPropertyValue($S("value"), $V(unique), $ CYPropertyValue($S("writable"), $ CYTrue()))));
 }
 
-void CYPropertySetter::Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name) {
+void CYPropertySetter::Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect) {
     CYIdentifier *unique(context.Unique());
     builder.declarations_
         ->* $L1($L(unique, CYSuperize(context, $ CYFunctionExpression(NULL, parameters_, code_))));
     builder.statements_
-        ->* $E($C3($M($V("Object"), $S("defineProperty")), self, name, $ CYObject(CYList<CYProperty>()
-            ->* $ CYPropertyValue($S("configurable"), $ CYTrue())
-            ->* $ CYPropertyValue($S("enumerable"), $ CYTrue())
-            ->* $ CYPropertyValue($S("set"), $V(unique))
-        )));
+        ->* CYDefineProperty(self, name, true, !protect, $ CYPropertyValue($S("set"), $V(unique)));
 }
 
-void CYPropertyValue::Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name) {
+void CYPropertyValue::Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect) {
+    _assert(!protect);
     CYIdentifier *unique(context.Unique());
     builder.declarations_
         ->* $L1($L(unique, value_));
index e3999e3c63e2037e3a272edefd3a622fa7037390..d278729c38beb598bce6b3a93ea17a5a6c1e4395 100644 (file)
@@ -1231,9 +1231,9 @@ struct CYProperty :
     }
 
     CYProperty *ReplaceAll(CYContext &context, CYBuilder &builder, CYExpression *self, bool update);
-    void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, bool computed);
+    void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, bool protect);
 
-    virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name) = 0;
+    virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect) = 0;
 
     virtual void Replace(CYContext &context) = 0;
     virtual void Output(CYOutput &out) const;
@@ -1250,7 +1250,7 @@ struct CYPropertyValue :
     {
     }
 
-    virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name);
+    virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect);
     virtual void Replace(CYContext &context);
     virtual void Output(CYOutput &out) const;
 };
@@ -1626,7 +1626,7 @@ struct CYPropertyGetter :
     {
     }
 
-    virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name);
+    virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect);
     virtual void Output(CYOutput &out) const;
 };
 
@@ -1638,7 +1638,7 @@ struct CYPropertySetter :
     {
     }
 
-    virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name);
+    virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect);
     virtual void Output(CYOutput &out) const;
 };
 
@@ -1652,7 +1652,7 @@ struct CYPropertyMethod :
 
     virtual CYFunctionExpression *Constructor();
 
-    virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name);
+    virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect);
     virtual void Output(CYOutput &out) const;
 };