Переглянути джерело

Refactoring code of array.concat removing all stack manipulation.

mingodad 12 роки тому
батько
коміт
6e75a585d0
1 змінених файлів з 8 додано та 10 видалено
  1. 8 10
      SquiLu/squirrel/sqbaselib.cpp

+ 8 - 10
SquiLu/squirrel/sqbaselib.cpp

@@ -937,7 +937,9 @@ static SQRESULT array_slice(HSQUIRRELVM v)
 
 static SQRESULT array_concat0 (HSQUIRRELVM v, int allowAll) {
     SQ_FUNC_VARS(v);
-    SQInteger last = sq_getsize(v, 1);
+    SQObjectPtr &arobj = stack_get(v,1);
+    SQObjectPtrVec &aryvec = _array(arobj)->_values;
+    SQInteger last = aryvec.size();
     if(last == 0){
         sq_pushstring(v, "", 0);
         return 1;
@@ -951,20 +953,18 @@ static SQRESULT array_concat0 (HSQUIRRELVM v, int allowAll) {
   SQBlob blob(0, 8192);
 
   for (; i < last; ++i) {
-      sq_pushinteger(v, i);
-      sq_rawget(v, 1);
-      SQObjectPtr &o = stack_get(v,-1);
+      SQObjectPtr str, &o = aryvec[i];
       switch(type(o)){
           case OT_STRING:
               break;
           case OT_INTEGER:
           case OT_FLOAT:
           case OT_NULL:
-              sq_tostring(v, -1);
+              if(!v->ToString(o,str)) return SQ_ERROR;
               break;
           case OT_USERDATA:
             if(allowAll){
-              sq_tostring(v, -1);
+              if(!v->ToString(o,str)) return SQ_ERROR;
               break;
             }
           default:
@@ -979,13 +979,11 @@ static SQRESULT array_concat0 (HSQUIRRELVM v, int allowAll) {
       }
       else
       {
-		sq_getstring(v, -1, &value);
-		value_size = sq_getsize(v, -1);
-		if(value_size < 0) return SQ_ERROR;
+		value = _stringval(str);
+		value_size = _string(str)->_len;
       }
       blob.Write((void*)value, value_size);
       if(i != opt_last && sep_size) blob.Write((void*)sep, sep_size);
-      sq_settop(v, _top_);
   }
   sq_pushstring(v, (SQChar*)blob.GetBuf(), blob.Len());
   return 1;