Usermode/libspiderscript - Cleaning code, made bytecode dump smaller
[tpg/acess2.git] / Usermode / Libraries / libspiderscript.so_src / exec_ast.c
index 46749ae..78e6740 100644 (file)
@@ -482,37 +482,49 @@ tSpiderValue *AST_ExecuteNode(tAST_BlockState *Block, tAST_Node *Node)
                        return ERRPTR;
                }
                
-               if( !op1 || op1->Type != SS_DATATYPE_ARRAY )
+               if( !op2 || op2->Type != SS_DATATYPE_INTEGER )
                {
-                       // TODO: Implement "operator []" on objects
-                       AST_RuntimeError(Node, "Indexing non-array");
-                       ret = ERRPTR;
-                       break;
+                       if( !Block->Script->Variant->bImplicitCasts ) {
+                               AST_RuntimeError(Node, "Array index is not an integer");
+                               ret = ERRPTR;
+                               break;
+                       }
+                       else {
+                               tmpobj = SpiderScript_CastValueTo(SS_DATATYPE_INTEGER, op2);
+                               SpiderScript_DereferenceValue(op2);
+                               op2 = tmpobj;
+                       }
                }
-               
-               if( (!op2 || op2->Type != SS_DATATYPE_INTEGER) && !Block->Script->Variant->bImplicitCasts ) {
-                       AST_RuntimeError(Node, "Array index is not an integer");
+       
+               if( !op1 )
+               {
+                       SpiderScript_DereferenceValue(op2);
+                       AST_RuntimeError(Node, "Indexing NULL value");
                        ret = ERRPTR;
                        break;
                }
-               
-               if( !op2 || op2->Type != SS_DATATYPE_INTEGER )
+
+               switch( op1->Type )
                {
-                       tmpobj = SpiderScript_CastValueTo(SS_DATATYPE_INTEGER, op2);
-                       SpiderScript_DereferenceValue(op2);
-                       op2 = tmpobj;
-               }
+               case SS_DATATYPE_ARRAY:
+                       if( op2->Integer >= op1->Array.Length ) {
+                               AST_RuntimeError(Node, "Array index out of bounds %i >= %i",
+                                       op2->Integer, op1->Array.Length);
+                               ret = ERRPTR;
+                               break;
+                       }
+                       
+                       ret = op1->Array.Items[ op2->Integer ];
+                       SpiderScript_ReferenceValue(ret);
+                       break;
                
-               if( op2->Integer >= op1->Array.Length ) {
-                       AST_RuntimeError(Node, "Array index out of bounds %i >= %i",
-                               op2->Integer, op1->Array.Length);
+               default:
+                       // TODO: Implement "operator []" on objects
+                       AST_RuntimeError(Node, "Indexing non-array");
                        ret = ERRPTR;
                        break;
                }
                
-               ret = op1->Array.Items[ op2->Integer ];
-               SpiderScript_ReferenceValue(ret);
-               
                SpiderScript_DereferenceValue(op1);
                SpiderScript_DereferenceValue(op2);
                break;

UCC git Repository :: git.ucc.asn.au