RAPL

Diff
Login

Diff

Differences From Artifact [502982e663]:

To Artifact [47dd16e1d3]:


41
42
43
44
45
46
47

48
49
50
51
52
53
54
55
56
57




































































































































58
59
60
61
62
63
64
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197







+










+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+







  evalstmt.eval_expr_debug  = 0;
  evalstmt.code             = evalstmt.OK;
  evalstmt.file_name        = null;
  evalstmt.in_quoted_string = false;
  evalstmt.in_brace = false;
  evalstmt.cmd_name = "";
  evalstmt.last_token = 0;
  evalstmt.intv = null;

  R.Base.eval_statment_cnt++;
  evalstmt.cnt = R.Base.eval_statement_cnt;
  evalstmt.my_name = "RaplEvalStatement";

  R.log('constructor end', '2.life', 'EvalStatement', true);

}

R.extend(EvalStatement, R.Token, {
  /* ==================== substOneToken ===================================== */
  substOneToken: function (token, idx) {
    var stmt = this;
    var obj_ptr;

    switch (token.token) {
    case stmt.TOKEN_STR:
    case stmt.TOKEN_ESC:
    case stmt.TOKEN_QUOTE_ESC:
      obj_ptr = token.obj_ptr;
      break;
    case stmt.TOKEN_VAR:
      obj_ptr = stmt.interp.getVar(token.obj_ptr, null, stmt.LEAVE_ERRMSG);
      break;
    case stmt.TOKEN_ARRAY_NAME_VAR:
      obj_ptr = JimExpandDictSugar(interp, token.obj_ptr);
      break;
    case stmt._EXPRSUGAR:
      obj_ptr = JimExpandExprSugar(interp, token.obj_ptr);
      break;
    case stmt.TOKEN_CMD:
      switch (stmt.evalObj(interp, token.obj_ptr)) {
      case stmt.OK:
      case stmt.RETURN:
        obj_ptr = interp.result;
        break;
      case stmt.BREAK:
        /* Stop substituting */
        return stmt.BREAK;
      case stmt.CONTINUE:
        /* just skip this one */
        return stmt.CONTINUE;
      default:
        return stmt.ERROR;
      }
      break;
    default:
      stmt.panic(1, "default token type ("+token.token+") "+stmt.getTokenString(token.token)+"  reached in substOneToken().");
      obj_ptr = null;
      break;
    }
    if (obj_ptr) {
      stmt.intv[idx] = obj_ptr;
      return stmt.OK;
    }
    return stmt.ERROR;
  },


  /* ==================== interpolateTokens ===================================== */
  /* Interpolate the given tokens into a unique Jim_Obj returned by reference
   * via *objPtrPtr. This function is only called by Jim_EvalObj() and Jim_SubstObj()
   * The returned object has refcount = 0.
   */
  interpolateTokens: function (token, idx, word_tokens, flags) {
    var stmt = this;
    var total_len = 0;
    var i;
    var obj_ptr;
    var str;

    stmt.intv = new Array();
    /* Compute every token forming the argument
     * in the intv objects vector. */
    for (i = 0; i < word_tokens; i++) {
print("IDX!"+i+stmt.getTokenString(token[idx + i].token)+"!");
      switch (stmt.substOneToken(token[idx + i], i)) {
      case stmt.OK:
      case stmt.RETURN:
        break;
      case stmt.BREAK:
        if (flags & stmt.SUBST_FLAG) {
          /* Stop here */
          tokens = i;
          continue;
        }
        /* XXX: Should probably set an error about break outside loop */
        /* fall through to error */
      case stmt.CONTINUE:
        if (flags & stmt.SUBST_FLAG) {
          stmt.intv[i] = null;
          continue;
        }
        /* XXX: Ditto continue outside loop */
        /* fall through to error */
      default:
        while (i--) {
          stmt.interp.empty_obj.decrRefCount(stmt.intv[i]);
        }
        stmt.intv = null;
        return null;
      }
      stmt.interp.empty_obj.incrRefCount(stmt.intv[i]);
      stmt.interp.empty_obj.getString(stmt.intv[i]);
      total_len += stmt.intv[i].len;
    }

    /* Fast path return for a single token */
    if (word_tokens == 1 && stmt.intv[0]) {
      stmt.interp.empty_obj.decrRefCount(stmt.intv[0]);
      return stmt.intv[0];
    }

    /* Concatenate every token in an unique
     * object. */
    obj_ptr = stmt.empty_obj.newStringObjNoAlloc(NULL, 0);

    if (word_tokens == 4 && token[idx + 0].token == stmt.TOKEN_ESC && token[idx + 1].token == stmt.TOKEN_ESC
        && token[idx + 2].token == stmt.TOKEN_VAR) {
      /* May be able to do fast interpolated object -> dictSubst */
      obj_ptr.obj_type = obj_ptr.interpolatedObjType;
      obj_ptr.internalRep.twoPtrValue.ptr1(token);
      obj_ptr.internalRep.twoPtrValue.ptr2(stmt.intv[idx + 2]);
      obj_ptr.incrRefCount(stmt.intv[idx + 2]);
    }

    obj_ptr.bytes = "";
    s = obj_ptr.bytes;
    obj_ptr.length = total_len;
    for (i = 0; i < word_tokens; i++) {
      if (stmt.intv[i]) {
        s += s.substring(stmt.intv[i].bytes, 0, stmt.intv[i].len);
        obj_ptr.decrRefCount(stmt.intv[i]);
      }
    }
    obj_ptr.bytes.charAt(total_len) = '\0';
    /* Free the intv vector. */
    stmt.intv = null;
print("INTERPOL!"+obj_ptr.getString(obj_ptr)+"!");
    return obj_ptr;
  },

  /* ==================== evalObj ===================================== */
  evalObj: function (script_obj_ptr) {
    var stmt = this;
    var i;
    var script;
    var token;
    var retcode = stmt.OK;
87
88
89
90
91
92
93
94

95
96
97
98
99
100
101
220
221
222
223
224
225
226

227
228
229
230
231
232
233
234







-
+







     *   incr a
     */
    if (script.len == 0) {
      script_obj_ptr.decrRefCount(script_obj_ptr);
      return stmt.OK;
    }
    if (script.len == 3
        && script.script_obbject.tokens[1].obj_ptr.obj_type.name == "command"
        && script.script_object.tokens[1].obj_ptr.obj_type.name == "command"
        && script.script_object.tokens[1].obj_ptr.internalRep.cmd_value.cmd_ptr.isproc == 0
        && script.script_object.tokens[1].obj_ptr.internalRep.cmd_value.cmd_ptr.u.native.cmdProc == Jim_IncrCoreCommand
        && script.script_object.tokens[2].obj_ptr.obj_typ.name == "variable") {

      var obj_ptr = stmt.interp.getVariable(script.script_object.tokens[2].obj_ptr, stmt.TOKENNONE);

      if (obj_ptr && !obj_ptr.isShared(obj_ptr) && obj_ptrobj_type.name == "int") {
142
143
144
145
146
147
148
149
150



151
152
153
154
155
156
157
275
276
277
278
279
280
281


282
283
284
285
286
287
288
289
290
291







-
-
+
+
+







         */
        for (j = 0; j < argc; j++) {
          var word_tokens = 1;
          var expand = 0;
          var word_obj_ptr = null;

print("I2!"+i+"!"+script.getTokenString(token[i].token)+"!");
          if (token[i].type == stmt.TOKEN_WORD) {
            word_tokens = stmt.wideValue(token[i++].obj_ptr);
          if (token[i].token == stmt.TOKEN_WORD) {
            word_tokens = stmt.interp.empty_obj.wideValue(token[i++].obj_ptr);
print("I2a!"+i+"!"+word_tokens+"!");
            if (word_tokens < 0) {
              expand = 1;
              word_tokens = -word_tokens;
            }
          }

          if (word_tokens == 1) {
181
182
183
184
185
186
187
188

189
190
191
192
193
194
195
315
316
317
318
319
320
321

322
323
324
325
326
327
328
329







-
+







              break;
            default:
              stmt.panic(1, "default token type reached in evalObj(): "+stmt.getTokenString(token[i].token));
            }
          } else {
            /* For interpolation we call a helper
             * function to do the work for us. */
            word_obj_ptr = interpolateTokens(token + i, word_tokens, stmt.TOKEN_NONE);
            word_obj_ptr = stmt.interpolateTokens(token, i, word_tokens, stmt.TOKEN_NONE);
          }

          if (!word_obj_ptr) {
            if (retcode == stmt.OK) {
              retcode = stmt.ERROR;
            }
            break;