+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_
+ ->* 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, bool protect) {
+ CYIdentifier *unique(context.Unique());
+ builder.declarations_
+ ->* $L1($L(unique, CYSuperize(context, $ CYFunctionExpression(NULL, parameters_, code_))));
+ builder.statements_
+ ->* (!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, bool protect) {
+ CYIdentifier *unique(context.Unique());
+ builder.declarations_
+ ->* $L1($L(unique, CYSuperize(context, $ CYFunctionExpression(NULL, parameters_, code_))));
+ builder.statements_
+ ->* CYDefineProperty(self, name, true, !protect, $ CYPropertyValue($S("set"), $V(unique)));
+}
+
+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_));
+ builder.statements_
+ ->* $E($ CYAssign($M(self, name), $V(unique)));
+}
+
+void CYPropertyValue::Replace(CYContext &context) {
+ context.Replace(value_);
+}
+
+// XXX: this is evil evil black magic. don't ask, don't tell... don't believe!
+#define MappingSet "0etnirsoalfucdphmgyvbxTwSNECAFjDLkMOIBPqzRH$_WXUVGYKQJZ"
+//#define MappingSet "0abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_"
+
+namespace {
+ struct IdentifierUsageLess :
+ std::binary_function<CYIdentifier *, CYIdentifier *, bool>
+ {
+ _finline bool operator ()(CYIdentifier *lhs, CYIdentifier *rhs) const {
+ if (lhs->usage_ != rhs->usage_)
+ return lhs->usage_ > rhs->usage_;
+ return lhs < rhs;
+ }
+ };
+
+ typedef std::set<CYIdentifier *, IdentifierUsageLess> IdentifierUsages;
+}
+
+void CYScript::Replace(CYContext &context) {
+ CYScope scope(true, context);
+
+ context.nextlocal_ = $ CYNonLocal();
+ context.ReplaceAll(code_);
+ context.NonLocal(code_);
+
+ scope.Close(context, code_);