if(ret) return ret;
if( blockInfo.StackDepth != 0 ) {
AST_RuntimeError(node, "Stack not reset at end of node");
+ blockInfo.StackDepth = 0;
}
}
ret = AST_ConvertNode( Block, Node->Scope.Element, 1 );
if(ret) return ret;
+ // TODO: Support elements for non-objects
ret = _StackPop(Block, Node, SS_DATATYPE_OBJECT);
if(ret < 0) return -1;
Bytecode_AppendElement(Block->Handle, Node->Scope.Name);
+
+ // TODO: Somehow know this at compile time?
ret = _StackPush(Block, Node, SS_DATATYPE_UNDEF);
if(ret < 0) return -1;
CHECK_IF_NEEDED(1);
// > Type check
ret = _StackPop(Block, Node, SS_DATATYPE_UNDEF);
if(ret < 0) return -1;
- if(ret != SS_DATATYPE_ARRAY && (ret >> 16) == 0) {
+ if(ret != SS_DATATYPE_ARRAY && SS_GETARRAYDEPTH(ret) == 0) {
AST_RuntimeError(Node, "Type mismatch, Expected an array, got %i",
ret);
return -2;
// Update the array depth
if( i != SS_DATATYPE_ARRAY ) {
- i -= 0x10000; // Decrease the array level
+ i = SS_DOWNARRAY(i); // Decrease the array level
}
ret = _StackPush(Block, Node, i);
if(ret < 0) return -1;
int BC_SaveValue(tAST_BlockInfo *Block, tAST_Node *DestNode)
{
- int ret;
+ int ret, type;
switch(DestNode->Type)
{
// Variable, simple
case NODETYPE_VARIABLE:
ret = BC_Variable_SetValue( Block, DestNode );
+ if(ret) return ret;
break;
// Array index
case NODETYPE_INDEX:
if(ret) return ret;
ret = _StackPop(Block, DestNode->BinOp.Left, SS_DATATYPE_UNDEF);
if(ret < 0) return -1;
- if(ret != SS_DATATYPE_ARRAY && (ret >> 16) == 0) {
+ if(ret != SS_DATATYPE_ARRAY && SS_GETARRAYDEPTH(ret) == 0) {
AST_RuntimeError(DestNode, "Type mismatch, Expected an array, got %i",
ret);
return -2;
}
+ type = SS_DOWNARRAY(ret);
ret = AST_ConvertNode(Block, DestNode->BinOp.Right, 1); // Offset
if(ret) return ret;
if(ret < 0) return -1;
Bytecode_AppendSetIndex( Block->Handle );
+ _StackPop(Block, DestNode, type);
break;
// Object element
case NODETYPE_ELEMENT: