package An official xmake package repository
https://xrepo.xmake.io/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
204 lines
12 KiB
204 lines
12 KiB
diff --git a/include/teascript/StackMachine.hpp b/include/teascript/StackMachine.hpp |
|
index 4a0af14..b714742 100644 |
|
--- a/include/teascript/StackMachine.hpp |
|
+++ b/include/teascript/StackMachine.hpp |
|
@@ -558,7 +558,7 @@ private: |
|
// TODO: Handle rContext.dialect.auto_define_unknown_identifiers on throw unknown_identifier |
|
// TODO: can this be merged with ASTNode_Assign ? |
|
try { |
|
- mStack[s - 2] = rContext.SetValue( id.GetValue<std::string>(), val, current_instr.payload.template GetValue<bool>() ); |
|
+ mStack[s - 2] = rContext.SetValue( id.template GetValue<std::string>(), val, current_instr.payload.template GetValue<bool>() ); |
|
} catch( ... ) { |
|
HandleException( std::current_exception() ); |
|
run = false; |
|
@@ -588,7 +588,7 @@ private: |
|
continue; |
|
} |
|
try { |
|
- mStack[s - 2] = rContext.AddValueObject( id.GetValue<std::string>(), val.MakeShared() ); |
|
+ mStack[s - 2] = rContext.AddValueObject( id.template GetValue<std::string>(), val.MakeShared() ); |
|
} catch( ... ) { |
|
HandleException( std::current_exception() ); |
|
run = false; |
|
@@ -611,7 +611,7 @@ private: |
|
val.Detach( true ); // make copy |
|
} |
|
try { |
|
- mStack[s - 2] = rContext.AddValueObject( id.GetValue<std::string>(), val.MakeShared().MakeConst() ); |
|
+ mStack[s - 2] = rContext.AddValueObject( id.template GetValue<std::string>(), val.MakeShared().MakeConst() ); |
|
} catch( ... ) { |
|
HandleException( std::current_exception() ); |
|
run = false; |
|
@@ -685,7 +685,7 @@ private: |
|
auto &val = mStack[s - 1]; |
|
auto const &id = mStack[s - 2]; |
|
auto &obj = mStack[s - 3]; |
|
- auto &tuple = obj.GetValue<Tuple>(); |
|
+ auto &tuple = obj.template GetValue<Tuple>(); |
|
bool const shared = current_instr.payload.template GetValue<bool>(); |
|
|
|
if( obj.IsConst() ) { |
|
@@ -718,7 +718,7 @@ private: |
|
} else { |
|
auto &lhs = mStack.back(); |
|
auto &rhs = current_instr.payload; |
|
- auto &tuple = lhs.GetValue<Tuple>(); |
|
+ auto &tuple = lhs.template GetValue<Tuple>(); |
|
|
|
std::size_t idx = static_cast<std::size_t>(-1); |
|
if( rhs.GetTypeInfo()->IsSame( TypeString ) ) { |
|
@@ -741,7 +741,7 @@ private: |
|
if( stack_error( 2 ) ) [[unlikely]] { |
|
continue; |
|
} else { |
|
- auto param_count = mStack.back().GetValue<U64>(); |
|
+ auto param_count = mStack.back().template GetValue<U64>(); |
|
if( stack_error( param_count + 1 + 1 ) ) [[unlikely]] { |
|
continue; |
|
} |
|
@@ -770,7 +770,7 @@ private: |
|
continue; |
|
} else { |
|
auto const s = mStack.size(); |
|
- auto param_count = mStack[s-2].GetValue<U64>(); |
|
+ auto param_count = mStack[s-2].template GetValue<U64>(); |
|
if( stack_error( param_count + 1 + 1 + 1 ) ) [[unlikely]] { |
|
continue; |
|
} |
|
@@ -882,7 +882,7 @@ private: |
|
run = false; |
|
continue; |
|
} |
|
- auto &tuple = lhs.GetValue<Tuple>(); |
|
+ auto &tuple = lhs.template GetValue<Tuple>(); |
|
std::size_t idx = static_cast<std::size_t>(-1); |
|
if( rhs.GetTypeInfo()->IsSame( TypeString ) ) { |
|
idx = tuple.IndexOfKey( rhs.template GetValue<String>() ); |
|
@@ -890,7 +890,7 @@ private: |
|
idx = static_cast<std::size_t>(rhs.GetAsInteger()); |
|
} |
|
if( idx == static_cast<std::size_t>(-1) ) { |
|
- HandleException( std::make_exception_ptr( exception::unknown_identifier( rhs.GetValue<String>() ) ) ); |
|
+ HandleException( std::make_exception_ptr( exception::unknown_identifier( rhs.template GetValue<String>() ) ) ); |
|
run = false; |
|
continue; |
|
} else if( not tuple.ContainsIdx( idx ) ) { |
|
@@ -953,21 +953,21 @@ private: |
|
|
|
// get the sequence |
|
auto &seq_val = mStack[s - 1]; |
|
- if( not seq_val.GetTypeInfo()->IsSame<IntegerSequence>() && not seq_val.GetTypeInfo()->IsSame<Tuple>() ) { |
|
+ if( not seq_val.GetTypeInfo()->template IsSame<IntegerSequence>() && not seq_val.GetTypeInfo()->template IsSame<Tuple>() ) { |
|
HandleException( std::make_exception_ptr( exception::eval_error( "Forall loop can actually only iterate over an IntegerSequence/Tuple!" ) ) ); |
|
run = false; |
|
continue; |
|
} |
|
|
|
//FIXME: if seq_val is a sequence already we should use a reference for in later versions it will be possible to manipulate it elsewhere in the loop. |
|
- auto seq = seq_val.GetTypeInfo()->IsSame<Tuple>() |
|
- ? IntegerSequence( 0LL, static_cast<Integer>(seq_val.GetValue<Tuple>().Size() - 1), 1LL ) |
|
- : seq_val.GetValue<IntegerSequence>(); |
|
+ auto seq = seq_val.GetTypeInfo()->template IsSame<Tuple>() |
|
+ ? IntegerSequence( 0LL, static_cast<Integer>(seq_val.template GetValue<Tuple>().Size() - 1), 1LL ) |
|
+ : seq_val.template GetValue<IntegerSequence>(); |
|
seq.Reset(); |
|
|
|
// create the index variable |
|
// TODO: add mDebugInfo SourceLocation! |
|
- mStack[s - 2] = rContext.AddValueObject( mStack[s - 2].GetValue<std::string>(), ValueObject( seq.Current(), ValueConfig(ValueShared, ValueMutable))); |
|
+ mStack[s - 2] = rContext.AddValueObject( mStack[s - 2].template GetValue<std::string>(), ValueObject( seq.Current(), ValueConfig(ValueShared, ValueMutable))); |
|
|
|
// store the seqeunce |
|
mStack[s - 1] = ValueObject( std::move(seq), ValueConfig(ValueShared, ValueMutable)); |
|
@@ -978,7 +978,7 @@ private: |
|
continue; |
|
} else { |
|
auto const s = mStack.size(); |
|
- auto &seq = mStack[s - 2].GetValue<IntegerSequence>(); |
|
+ auto &seq = mStack[s - 2].template GetValue<IntegerSequence>(); |
|
if( seq.Next() ) { |
|
mStack[s - 3].AssignValue( seq.Current() ); |
|
mStack.pop_back(); // clear previous result |
|
@@ -999,11 +999,11 @@ private: |
|
if( stack_error( 2 ) ) [[unlikely]] { |
|
continue; |
|
} else { |
|
- auto param_count = mStack.back().GetValue<U64>(); |
|
+ auto param_count = mStack.back().template GetValue<U64>(); |
|
if( stack_error( param_count + 1 + 1 ) ) [[unlikely]] { |
|
continue; |
|
} |
|
- auto func = mStack[ mStack.size() - (param_count + 1 + 1)].GetValue<FunctionPtr>(); // copy is intended!! |
|
+ auto func = mStack[ mStack.size() - (param_count + 1 + 1)].template GetValue<FunctionPtr>(); // copy is intended!! |
|
auto cfunc = std::dynamic_pointer_cast<CompiledFuncBase>(func); |
|
if( cfunc ) { |
|
mCallStack.emplace_back( current_instr.payload.template GetValue<std::string>(), mCurrent + 1, cfunc->GetProgram(), func ); |
|
@@ -1089,7 +1089,7 @@ private: |
|
continue; |
|
} else { |
|
// we need a working copy of the param count for decrement! |
|
- mStack.emplace_back( mStack.back().GetValue<U64>() ); |
|
+ mStack.emplace_back( mStack.back().template GetValue<U64>() ); |
|
} |
|
break; |
|
case eTSVM_Instr::ParamSpecClean: |
|
@@ -1097,7 +1097,7 @@ private: |
|
if( stack_error( 3 ) ) [[unlikely]] { |
|
continue; |
|
} else { |
|
- auto const left_params = mStack.back().GetValue<U64>(); |
|
+ auto const left_params = mStack.back().template GetValue<U64>(); |
|
if( left_params != 0 ) [[unlikely]] { |
|
//NOTE: we need SourceLoc of the caller! But the caller is different for each call. |
|
// Here we know that callstack is at least 2 (we and the caller). The ret address - 1 is the CallFunc instruction which might carry a source loc. |
|
@@ -1106,7 +1106,7 @@ private: |
|
run = false; |
|
continue; |
|
} else { |
|
- auto orig_params = mStack[mStack.size() - 2].GetValue<U64>(); |
|
+ auto orig_params = mStack[mStack.size() - 2].template GetValue<U64>(); |
|
mStack.pop_back(); // working param count |
|
mStack.pop_back(); // orig param count |
|
while( orig_params > 0 ) { // each param |
|
@@ -1123,7 +1123,7 @@ private: |
|
continue; |
|
} else { |
|
auto const pos = mStack.size() - 2; |
|
- auto param_count = mStack[pos].GetValue<U64>(); |
|
+ auto param_count = mStack[pos].template GetValue<U64>(); |
|
if( param_count < 1 ) [[unlikely]] { // huh? |
|
//NOTE: we need SourceLoc of the caller! But the caller is different for each call. |
|
// Here we know that callstack is at least 2 (we and the caller). The ret address - 1 is the CallFunc instruction which might carry a source loc. |
|
@@ -1148,7 +1148,7 @@ private: |
|
continue; |
|
} else { |
|
auto const pos = mStack.size() - 2; |
|
- auto param_count = mStack[pos].GetValue<U64>(); |
|
+ auto param_count = mStack[pos].template GetValue<U64>(); |
|
if( param_count > 0 ) { // there are still parameters given by the caller. |
|
// add current param to end (after the id) |
|
mStack.push_back( std::move( mStack[pos - (1 + param_count)] ) ); |
|
@@ -1261,12 +1261,12 @@ private: |
|
{ |
|
std::size_t idx = static_cast<std::size_t>(-1); |
|
if( rId.GetTypeInfo()->IsSame( TypeString ) ) { |
|
- idx = rTuple.IndexOfKey( rId.GetValue<std::string>() ); |
|
+ idx = rTuple.IndexOfKey( rId.template GetValue<std::string>() ); |
|
} else { |
|
idx = static_cast<std::size_t>(rId.GetAsInteger()); |
|
} |
|
if( idx == static_cast<std::size_t>(-1) ) { |
|
- HandleException( std::make_exception_ptr( exception::unknown_identifier( rId.GetValue<std::string>() ) ) ); |
|
+ HandleException( std::make_exception_ptr( exception::unknown_identifier( rId.template GetValue<std::string>() ) ) ); |
|
return idx; |
|
} else if( not rTuple.ContainsIdx( idx ) ) { |
|
HandleException( std::make_exception_ptr( exception::out_of_range() ) ); |
|
@@ -1301,7 +1301,7 @@ private: |
|
} |
|
} |
|
if( rId.GetTypeInfo()->IsSame( TypeString ) ) { |
|
- std::string const &identifier = rId.GetValue<std::string>(); |
|
+ std::string const &identifier = rId.template GetValue<std::string>(); |
|
if( not rTuple.AppendKeyValue( identifier, as_const ? val.MakeShared().MakeConst() : val.MakeShared() ) ) { |
|
HandleException( std::make_exception_ptr( exception::redefinition_of_variable( identifier ) ) ); |
|
return idx;
|
|
|