Skip to content

Commit

Permalink
fixing class bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
zhuzhenpeng committed Apr 6, 2016
1 parent 570dd13 commit 1715b64
Show file tree
Hide file tree
Showing 8 changed files with 137 additions and 41 deletions.
4 changes: 3 additions & 1 deletion src/ast_leaf.cc
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,9 @@ void IdTokenAST::complieAssign() {
}

void IdTokenAST::compileAsRawString() {
auto codes_ = FuncObject::getCurrCompilingFunc()->getCodes();
auto func = FuncObject::getCurrCompilingFunc();
index_ = func->getRuntimeIndex(getId());
auto codes_ = func->getCodes();
codes_->rawString(index_);
}

Expand Down
5 changes: 2 additions & 3 deletions src/ast_list.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1175,11 +1175,10 @@ ObjectPtr NewAST::eval(__attribute__((unused))EnvPtr env, ObjectPtr caller) {
}

void NewAST::compile() {
auto codes = FuncObject::getCurrCompilingFunc()->getCodes();
codes->newInstance();
ArgumentsPtr arguments = getArguments();
arguments->compile();
unsigned argumentsNum = arguments->size();
auto codes = FuncObject::getCurrCompilingFunc()->getCodes();
codes->newInstance(argumentsNum);
}

ArgumentsPtr NewAST::getArguments() const {
Expand Down
46 changes: 41 additions & 5 deletions src/env.cc
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ FuncObject::FuncObject(const std::string &functionName, size_t size,
Object(ObjKind::FUNCTION), funcName_(functionName), localVarSize_(size),
env_(env), params_(params), block_(block){
codes_ = std::make_shared<Code>();
outerNames_ = std::make_shared<std::vector<std::string>>();
}

std::shared_ptr<ParameterListAST> FuncObject::params() const {
Expand All @@ -30,20 +31,33 @@ std::shared_ptr<BlockStmntAST> FuncObject::block() const {
return block_;
}

void FuncObject::setOuterEnv(EnvPtr env) {
env_ = env;
}

EnvPtr FuncObject::runtimeEnv() {
return std::make_shared<ArrayEnv>(env_, shared_from_this(), localVarSize_);
}

ObjectPtr FuncObject::copy() {
FuncPtr copyFunc = std::make_shared<FuncObject>(funcName_, localVarSize_,
params_, block_, env_);
copyFunc->codes_ = codes_;
copyFunc->outerNames_ = outerNames_;
copyFunc->isCompile_ = isCompile_;
return copyFunc;
}

unsigned FuncObject::getRuntimeIndex(const std::string &name) {
for(size_t i = 0; i < outerNames_.size(); ++i) {
if (outerNames_[i] == name)
for(size_t i = 0; i < outerNames_->size(); ++i) {
if ((*outerNames_)[i] == name)
return i;
}
outerNames_.push_back(name);
return outerNames_.size() - 1;
outerNames_->push_back(name);
return outerNames_->size() - 1;
}

const std::vector<std::string> &FuncObject::getOuterNames() const {
std::shared_ptr<std::vector<std::string>> FuncObject::getOuterNames() {
return outerNames_;
}

Expand Down Expand Up @@ -106,6 +120,7 @@ void ClassInfo::compile() {
ClassBodyPtr body = definition_->body();
//初始化编译结果所放置的环境
compiledEnv_ = std::make_shared<MapEnv>(outerEnv_);

//函数定义的eval函数会自动编译
body->eval(compiledEnv_);
//实现super的语义
Expand Down Expand Up @@ -271,6 +286,23 @@ std::string MapEnv::info() {
return "MAP ENVIRONMENT";
}

ObjectPtr MapEnv::copy() {
//外部环境和符号表
MapEnvPtr copyEnv = std::make_shared<MapEnv>(outerEnv_);
copyEnv->setUnitSymbols(getUnitSymbols());

//对环境内的对象进行深复制
for (auto pair = values_.begin(); pair != values_.end(); ++pair) {
ObjectPtr obj = pair->second->copy();
if (obj->kind_ == ObjKind::FUNCTION) {
FuncPtr func = std::dynamic_pointer_cast<FuncObject>(obj);
func->setOuterEnv(copyEnv);
}
copyEnv->put(pair->first, pair->second);
}
return copyEnv;
}

//---------------------函数运行时局部环境

ArrayEnv::ArrayEnv(EnvPtr outer, FuncPtr function, size_t size):
Expand Down Expand Up @@ -341,3 +373,7 @@ void ArrayEnv::putCurr(const std::string &__attribute__((unused))name,
std::string ArrayEnv::info() {
return "ARRAY ENVIRONMENT";
}

ObjectPtr ArrayEnv::copy() {
throw EnvException("FATAL ERROR, Array is not replicable");
}
79 changes: 73 additions & 6 deletions src/env.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ class Object {
public:
Object(ObjKind kind): kind_(kind) {}
virtual std::string info() = 0;

//返回自己的一份拷贝,
virtual std::shared_ptr<Object> copy() = 0;

public:
ObjKind kind_;
};
Expand All @@ -49,19 +53,30 @@ using ObjectPtr = std::shared_ptr<Object>;
class NoneObject: public Object {
public:
NoneObject(): Object(ObjKind::NONE) {}

std::string info() override {
return "None";
}

ObjectPtr copy() override{
return std::make_shared<NoneObject>();
}
};
using NoneObjectPtr = std::shared_ptr<NoneObject>;

/******************************Int 类型 ********************************/
class IntObject: public Object {
public:
IntObject(int value): Object(ObjKind::INT), value_(value) {}

std::string info() override {
return "Int: " + std::to_string(value_);
}

ObjectPtr copy() override {
return std::make_shared<IntObject>(value_);
}

public:
int value_;
};
Expand All @@ -71,9 +86,14 @@ using IntObjectPtr = std::shared_ptr<IntObject>;
class FloatObject: public Object {
public:
FloatObject(double value): Object(ObjKind::FLOAT), value_(value) {}

std::string info() override {
return "Float: " + std::to_string(value_);
}

ObjectPtr copy() override {
return std::make_shared<FloatObject>(value_);
}
public:
double value_;
};
Expand All @@ -83,9 +103,14 @@ using FloatObjectPtr = std::shared_ptr<FloatObject>;
class StrObject: public Object {
public:
StrObject(const std::string &str): Object(ObjKind::STRING), str_(str) {}

std::string info() override {
return "Str: " + str_;
}

ObjectPtr copy() override {
return std::make_shared<StrObject>(str_);
}
public:
std::string str_;
};
Expand All @@ -95,10 +120,15 @@ using StrObjectPtr = std::shared_ptr<StrObject>;
class BoolObject: public Object {
public:
BoolObject(bool b): Object(ObjKind::BOOL), b_(b) {}

BoolObject(int num): Object(ObjKind::BOOL), b_(num != 0) {}
std::string info() override {
return "Bool: " + std::to_string(b_);
}

ObjectPtr copy() override {
return std::make_shared<BoolObject>(b_);
}
public:
bool b_;
};
Expand Down Expand Up @@ -132,13 +162,19 @@ class FuncObject: public Object, public std::enable_shared_from_this<FuncObject>
//获得函数块AST
std::shared_ptr<BlockStmntAST> block() const;

//设置上层环境
void setOuterEnv(EnvPtr env);

//获取运行时环境
EnvPtr runtimeEnv();

std::string info() override {
return "Func: " + funcName_;
}

//对代码块、外部名字不进行深度复制
ObjectPtr copy() override;

std::string funcName() const{
return funcName_;
}
Expand All @@ -150,7 +186,7 @@ class FuncObject: public Object, public std::enable_shared_from_this<FuncObject>
//对于函数运行时所需的非局部变量,记录下它的名字并分配一个下标
unsigned getRuntimeIndex(const std::string &name);

const std::vector<std::string> &getOuterNames() const;
std::shared_ptr<std::vector<std::string>> getOuterNames();

//函数是否已经已经编译
bool isCompile();
Expand Down Expand Up @@ -180,7 +216,7 @@ class FuncObject: public Object, public std::enable_shared_from_this<FuncObject>
CodePtr codes_;

//非局部变量名称
std::vector<std::string> outerNames_;
std::shared_ptr<std::vector<std::string>> outerNames_;

//是否已经编译(在虚拟机运行时)
//1.def的函数都是已编译的
Expand All @@ -193,7 +229,7 @@ class FuncObject: public Object, public std::enable_shared_from_this<FuncObject>

/****************************原生函数********************************/

class NativeFunction: public Object {
class NativeFunction: public Object, public std::enable_shared_from_this<NativeFunction> {
public:
NativeFunction(const std::string &name, size_t paramNum):
Object(ObjKind::NATIVE_FUNC), funcName_(name), paramNum_(paramNum) {}
Expand All @@ -210,6 +246,11 @@ class NativeFunction: public Object {
return "native function: " + funcName_;
}

//原生函数是没有副作用的,直接返回本身即可
ObjectPtr copy() override {
return shared_from_this();
}

//所有的原生函数子类通过实现该接口实现其功能
virtual ObjectPtr invoke(const std::vector<ObjectPtr> &params) = 0;

Expand All @@ -223,7 +264,7 @@ using NativeFuncPtr = std::shared_ptr<NativeFunction>;
class ClassInfo;
using ClassInfoPtr = std::shared_ptr<ClassInfo>;

class ClassInfo: public Object {
class ClassInfo: public Object, public std::enable_shared_from_this<ClassInfo> {
public:
ClassInfo(std::shared_ptr<ClassStmntAST> stmnt, EnvPtr env);

Expand All @@ -241,6 +282,11 @@ class ClassInfo: public Object {

std::string info() override;

//语言运行时一个类定义只产生一个类元信息,复制函数直接返回本身
ObjectPtr copy() override {
return shared_from_this();
}

//编译类中的每个函数
//生成一个包含已编译的函数对象、变量的环境
void compile();
Expand All @@ -260,7 +306,7 @@ class ClassInfo: public Object {

/*****************************对象***********************************/

class ClassInstance: public Object {
class ClassInstance: public Object, public std::enable_shared_from_this<ClassInstance> {
public:
ClassInstance(EnvPtr env);

Expand All @@ -270,6 +316,11 @@ class ClassInstance: public Object {

std::string info() override;

//对象复制的语义交给语言使用者实现,此处的复制返回自身
ObjectPtr copy() override {
return shared_from_this();
}

EnvPtr getEnvironment() {
return env_;
}
Expand All @@ -283,12 +334,20 @@ using InstancePtr = std::shared_ptr<ClassInstance>;

/*************************定长数组***********************************/

class Array: public Object {
class Array: public Object, public std::enable_shared_from_this<Array> {
public:
Array(size_t i);

void set(size_t i, ObjectPtr obj);

ObjectPtr get(size_t i);

std::string info() override;

//数组不能变更,直接返回自身
ObjectPtr copy() override {
return shared_from_this();
}
private:
std::vector<ObjectPtr> array_;
};
Expand Down Expand Up @@ -382,6 +441,10 @@ class MapEnv: public CommonEnv {

std::string info() override;

//该复制只用在类元实例化出对象
//需要对环境内的各各对象进行深度赋值,且函数的外部环境更改为结果环境
ObjectPtr copy() override;

private:
std::map<std::string, ObjectPtr> values_;
};
Expand All @@ -408,6 +471,10 @@ class ArrayEnv: public CommonEnv {
void putCurr(const std::string &name, ObjectPtr obj) override;

std::string info() override;

//该环境没有复制的意义,抛出异常
ObjectPtr copy() override;

private:
std::weak_ptr<FuncObject> function_;

Expand Down
5 changes: 2 additions & 3 deletions src/vm/code.cc
Original file line number Diff line number Diff line change
Expand Up @@ -144,9 +144,8 @@ unsigned Code::rawString(unsigned index) {
return push(index);
}

unsigned Code::newInstance(unsigned paramsNum) {
push(NEW_INSTANCE);
return push(paramsNum);
unsigned Code::newInstance() {
return push(NEW_INSTANCE);
}

unsigned Code::nil() {
Expand Down
2 changes: 1 addition & 1 deletion src/vm/code.h
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ class Code {

unsigned rawString(unsigned index);

unsigned newInstance(unsigned paramsNum);
unsigned newInstance();

unsigned nil();

Expand Down
Loading

0 comments on commit 1715b64

Please sign in to comment.