struct CYScope {
CYScope *parent_;
- CYIdentifierAddressFlagsMap internal_;
+ CYIdentifierAddressFlagsMap internal_;
CYIdentifierValueSet identifiers_;
CYScope() :
};
struct CYProgram :
- CYScope,
CYThing
{
CYStatement *statements_;
- CYIdentifierUsageVector rename_;
CYProgram(CYStatement *statements) :
statements_(statements)
apr_pool_t *pool_;
CYOptions &options_;
CYScope *scope_;
- CYProgram *program_;
+ CYIdentifierUsageVector rename_;
CYContext(apr_pool_t *pool, CYOptions &options) :
pool_(pool),
options_(options),
- scope_(this),
- program_(NULL)
+ scope_(this)
{
}
CYThing
{
CYStatement *statements_;
- CYScope *scope_;
- CYBlock(CYStatement *statements, CYScope *scope = NULL) :
- statements_(statements),
- scope_(scope)
+ CYBlock(CYStatement *statements) :
+ statements_(statements)
{
}
virtual void Output(CYOutput &out, CYFlags flags) const;
};
-struct CYFunction :
- CYScope
-{
+struct CYFunction {
CYIdentifier *name_;
CYFunctionParameter *parameters_;
CYBlock code_;
CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
name_(name),
parameters_(parameters),
- code_(statements, this)
+ code_(statements)
{
}
#include "Exception.hpp"
#include "Standard.hpp"
+#include <cstdlib>
+
_finline void *operator new(size_t size, apr_pool_t *pool) {
return apr_palloc(pool, size);
}
};
+template <typename Type_>
+struct CYPoolAllocator {
+ apr_pool_t *pool_;
+
+ typedef Type_ value_type;
+ typedef value_type *pointer;
+ typedef const value_type *const_pointer;
+ typedef value_type &reference;
+ typedef const value_type &const_reference;
+ typedef std::size_t size_type;
+ typedef std::ptrdiff_t difference_type;
+
+ CYPoolAllocator() :
+ pool_(NULL)
+ {
+ }
+
+ template <typename Right_>
+ CYPoolAllocator(const CYPoolAllocator<Right_> &rhs) :
+ pool_(rhs.pool_)
+ {
+ }
+
+ pointer allocate(size_type size, const void *hint = 0) {
+ return reinterpret_cast<pointer>(apr_palloc(pool_, size));
+ }
+
+ void deallocate(pointer data, size_type size) {
+ }
+
+ void construct(pointer address, const Type_ &rhs) {
+ new(address) Type_(rhs);
+ }
+
+ void destroy(pointer address) {
+ address->~Type_();
+ }
+
+ template <typename Right_>
+ inline bool operator==(const CYPoolAllocator<Right_> &rhs) {
+ return pool_ == rhs.pool_;
+ }
+
+ template <typename Right_>
+ inline bool operator!=(const CYPoolAllocator<Right_> &rhs) {
+ return !operator==(rhs);
+ }
+
+ template <typename Right_>
+ struct rebind {
+ typedef CYPoolAllocator<Right_> other;
+ };
+};
+
#endif/*CYPOOLING_HPP*/
if (outer)
Inject(context);
- parent_ = context.scope_;
- context.scope_ = this;
+ CYScope scope;
+ scope.parent_ = context.scope_;
+ context.scope_ = &scope;
if (!outer && name_ != NULL)
Inject(context);
parameters_->Replace(context);
code_.Replace(context);
- context.scope_ = parent_;
- Scope(context, code_.statements_);
+ context.scope_ = scope.parent_;
+ scope.Scope(context, code_.statements_);
}
CYExpression *CYFunctionExpression::Replace(CYContext &context) {
}
CYIdentifier *CYIdentifier::Replace(CYContext &context) {
- if (replace_ == NULL) {
- replace_ = context.scope_->Lookup(context, this);
- ++replace_->usage_;
- } else if (replace_ != this)
+ if (replace_ != NULL && replace_ != this)
return replace_->Replace(context);
+ replace_ = context.scope_->Lookup(context, this);
return replace_;
}
}
void CYProgram::Replace(CYContext &context) {
- parent_ = context.scope_;
- CYProgram *program(context.program_);
-
- context.scope_ = this;
- context.program_ = this;
+ CYScope scope;
+ scope.parent_ = context.scope_;
+ context.scope_ = &scope;
statements_ = statements_->ReplaceAll(context);
- context.scope_ = parent_;
- context.program_ = program;
- Scope(context, statements_);
+ context.scope_ = scope.parent_;
+
+ scope.Scope(context, statements_);
size_t offset(0);
CYCStringSet external;
- for (CYIdentifierValueSet::const_iterator i(identifiers_.begin()); i != identifiers_.end(); ++i)
+ for (CYIdentifierValueSet::const_iterator i(scope.identifiers_.begin()); i != scope.identifiers_.end(); ++i)
external.insert((*i)->Word());
IdentifierUsages usages;
- if (offset < rename_.size())
- for (CYIdentifier *i(rename_[offset].identifier_); i != NULL; i = i->next_)
- usages.insert(i);
+ if (offset < context.rename_.size())
+ for (CYIdentifier *i(context.rename_[offset].identifier_); i != NULL; i = i->next_)
+ usages.insert(i);
// XXX: totalling the probable occurrences and sorting by them would improve the result
- for (CYIdentifierUsageVector::const_iterator i(rename_.begin()); i != rename_.end(); ++i, ++offset) {
+ for (CYIdentifierUsageVector::const_iterator i(context.rename_.begin()); i != context.rename_.end(); ++i, ++offset) {
//std::cout << *i << ":" << (*i)->offset_ << std::endl;
const char *name;
if (lhs.flags_ != rhs.flags_)
return lhs.flags_ < rhs.flags_;
/*if (lhs.usage_ != rhs.usage_)
- return lhs.usage_ > rhs.usage_;*/
+ return lhs.usage_ < rhs.usage_;*/
return lhs.identifier_ < rhs.identifier_;
}
};
void CYScope::Scope(CYContext &context, CYStatement *&statements) {
CYDeclarations *last(NULL), *curr(NULL);
- CYProgram *program(context.program_);
IdentifierOffsets offsets;
for (CYIdentifierAddressFlagsMap::const_iterator i(internal_.begin()); i != internal_.end(); ++i)
- if (program != NULL && i->second != CYIdentifierMagic)
+ if (i->second != CYIdentifierMagic)
offsets.insert(IdentifierOffset(i->first, i->second));
size_t offset(0);
if (offset < i->offset_)
offset = i->offset_;
- if (program->rename_.size() <= offset)
- program->rename_.resize(offset + 1);
+ if (context.rename_.size() <= offset)
+ context.rename_.resize(offset + 1);
- CYIdentifierUsage &rename(program->rename_[offset++]);
+ CYIdentifierUsage &rename(context.rename_[offset++]);
i->identifier_->SetNext(rename.identifier_);
rename.identifier_ = i->identifier_;
rename.usage_ += i->identifier_->usage_ + 1;