Jump to specific function scope when calling function
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
This commit is contained in:
parent
d385a9e3ee
commit
4d452b33e0
|
@ -80,6 +80,7 @@ BoundStatement *Binder::BindFunctionDeclarationStatement(ParsedStatement *statem
|
|||
auto parameterTypes = vector<shared_ptr<ScriptType>>(parameters.size());
|
||||
auto parameterKeys = vector<shared_ptr<BoundVariableKey>>(parameters.size());
|
||||
|
||||
auto scopeIndex = this->_scope->GetCurrentScope();
|
||||
this->_scope->GoInnerScope();
|
||||
for (int i = 0; i < parameters.size(); i++){
|
||||
auto var = parameters[i];
|
||||
|
@ -97,7 +98,7 @@ BoundStatement *Binder::BindFunctionDeclarationStatement(ParsedStatement *statem
|
|||
|
||||
auto identifier = functionStatement->GetIdentifier();
|
||||
auto returnType = make_shared<ScriptType>(TypeClass::Nil);
|
||||
auto type = make_shared<FunctionScriptType>(returnType, parameterTypes, parameterKeys);
|
||||
auto type = make_shared<FunctionScriptType>(returnType, parameterTypes, parameterKeys, scopeIndex);
|
||||
auto assignment = this->_scope->AssignVariable(identifier.GetHash(), type);
|
||||
if (assignment.GetResult() != VariableAssignmentResult::Ok){
|
||||
this -> _scriptData -> Diagnostics -> LogError(DiagnosticCode::CantAssignVariable, statement->GetStartPosition(), statement->GetLength());
|
||||
|
|
|
@ -8,7 +8,7 @@ EvaluationScope::EvaluationScope(unordered_map<int, shared_ptr<EvalValue>> *scri
|
|||
_currentScope = -1;
|
||||
}
|
||||
|
||||
void EvaluationScope::CreateVariable(int scope, int id, shared_ptr<EvalValue> value) {
|
||||
void EvaluationScope::CreateVariable(int scope, int id, const shared_ptr<EvalValue>& value) {
|
||||
if (scope == 0){
|
||||
_scriptScope->at(id) = value;
|
||||
} else{
|
||||
|
@ -16,7 +16,7 @@ void EvaluationScope::CreateVariable(int scope, int id, shared_ptr<EvalValue> va
|
|||
}
|
||||
}
|
||||
|
||||
void EvaluationScope::SetVariable(int scope, int id, shared_ptr<EvalValue> value) {
|
||||
void EvaluationScope::SetVariable(int scope, int id, const shared_ptr<EvalValue>& value) {
|
||||
if (scope == 0){
|
||||
_scriptScope->at(id) = value;
|
||||
} else{
|
||||
|
@ -31,6 +31,10 @@ shared_ptr<EvalValue> EvaluationScope::GetVariable(int scope, int id) {
|
|||
return _localScope[scope - 1][id];
|
||||
}
|
||||
|
||||
void EvaluationScope::JumpToScope(int index){
|
||||
_currentScope = index;
|
||||
}
|
||||
|
||||
void EvaluationScope::OuterScope() {
|
||||
_currentScope++;
|
||||
}
|
||||
|
|
|
@ -14,11 +14,17 @@ public:
|
|||
explicit EvaluationScope(unordered_map<int, shared_ptr<EvalValue>>* scriptVariables, int deepestScope);
|
||||
~EvaluationScope() = default;
|
||||
|
||||
void CreateVariable(int scope, int id, shared_ptr<EvalValue> value);
|
||||
void SetVariable(int scope, int id, shared_ptr<EvalValue> value);
|
||||
void CreateVariable(int scope, int id, const shared_ptr<EvalValue>& value);
|
||||
void SetVariable(int scope, int id, const shared_ptr<EvalValue>& value);
|
||||
void OuterScope();
|
||||
void InnerScope();
|
||||
shared_ptr<EvalValue> GetVariable(int scope, int id);
|
||||
|
||||
void JumpToScope(int index);
|
||||
|
||||
int GetCurrentScope(){
|
||||
return _currentScope;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -188,6 +188,10 @@ shared_ptr<EvalValue> Evaluator::EvaluateFunctionCallExpression(BoundExpression*
|
|||
auto type = std::dynamic_pointer_cast<FunctionScriptType>(function->GetType());
|
||||
auto parameterTypes = type->GetParameterTypes();
|
||||
auto parameterKeys = type->GetParameterKeys();
|
||||
auto scope = type -> GetScopeIndex();
|
||||
auto originalScope = this->_evaluationScope->GetCurrentScope();
|
||||
this->_evaluationScope->JumpToScope(scope);
|
||||
|
||||
for (int i = 0; i < parameterTypes.size() && i < parameterKeys.size() && i < parameters.size(); i++){
|
||||
auto parameter = parameters[i];
|
||||
auto requiredType = parameterTypes.at(i);
|
||||
|
@ -198,6 +202,7 @@ shared_ptr<EvalValue> Evaluator::EvaluateFunctionCallExpression(BoundExpression*
|
|||
this->_evaluationScope->CreateVariable(key->GetScopeId(), key->GetIdentifier(), parameter->Clone());
|
||||
}
|
||||
this->EvaluateBlockStatement(function->GetInnerBlock().get());
|
||||
this->_evaluationScope->JumpToScope(originalScope);
|
||||
this->_hasReturned = false;
|
||||
auto r = this -> _returnValue;
|
||||
this -> _returnValue = nullptr;
|
||||
|
|
|
@ -82,13 +82,15 @@ class FunctionScriptType : public ScriptType{
|
|||
shared_ptr<ScriptType> _returnType;
|
||||
vector<shared_ptr<ScriptType>> _parameterTypes;
|
||||
vector<shared_ptr<BoundVariableKey>> _parameterKeys;
|
||||
int _scopeIndex;
|
||||
public:
|
||||
FunctionScriptType(std::shared_ptr<ScriptType> returnType, vector<shared_ptr<ScriptType>> parameterTypes,
|
||||
vector<shared_ptr<BoundVariableKey>> parameterKeys)
|
||||
vector<shared_ptr<BoundVariableKey>> parameterKeys, int scopeIndex)
|
||||
: ScriptType(TypeClass::Function){
|
||||
_returnType = std::move(returnType);
|
||||
_parameterTypes = std::move(parameterTypes);
|
||||
_parameterKeys = std::move(parameterKeys);
|
||||
_scopeIndex = scopeIndex;
|
||||
}
|
||||
shared_ptr<ScriptType> GetReturnType(){
|
||||
return _returnType;
|
||||
|
@ -101,6 +103,10 @@ public:
|
|||
vector<shared_ptr<BoundVariableKey>> GetParameterKeys(){
|
||||
return _parameterKeys;
|
||||
}
|
||||
|
||||
int GetScopeIndex(){
|
||||
return _scopeIndex;
|
||||
}
|
||||
};
|
||||
|
||||
#endif //PORYGONLANG_SCRIPTTYPE_HPP
|
||||
|
|
Loading…
Reference in New Issue