~rdoering/ubuntu/intrepid/erlang/fix-535090

« back to all changes in this revision

Viewing changes to lib/compiler/src/sys_core_dsetel.erl

  • Committer: Bazaar Package Importer
  • Author(s): Soren Hansen
  • Date: 2007-05-01 16:57:10 UTC
  • mfrom: (1.1.9 upstream)
  • Revision ID: james.westby@ubuntu.com-20070501165710-2sapk0hp2gf3o0ip
Tags: 1:11.b.4-2ubuntu1
* Merge with Debian Unstable. Remaining changes:
  - Add -fno-stack-protector to fix broken crypto_drv.
* DebianMaintainerField update.

Show diffs side-by-side

added added

removed removed

Lines of Context:
216
216
%%       X1
217
217
 
218
218
rewrite(#c_let{vars=[#c_var{name=X}=V]=Vs,
219
 
               arg=#c_call{module=#c_atom{val='erlang'},
220
 
                           name=#c_atom{val='setelement'},
221
 
                           args=[#c_int{val=Index1}, _Tuple, _Val1]
 
219
               arg=#c_call{module=#c_literal{val='erlang'},
 
220
                           name=#c_literal{val='setelement'},
 
221
                           args=[#c_literal{val=Index1}, _Tuple, _Val1]
222
222
                          }=A,
223
 
               body=#c_call{anno=Banno,module=#c_atom{val='erlang'},
224
 
                            name=#c_atom{val='setelement'},
225
 
                            args=[#c_int{val=Index2},
 
223
               body=#c_call{anno=Banno,module=#c_literal{val='erlang'},
 
224
                            name=#c_literal{val='setelement'},
 
225
                            args=[#c_literal{val=Index2},
226
226
                                  #c_var{name=X},
227
227
                                  Val2]
228
228
                           }
229
229
              }=R,
230
230
        _BodyEnv, FinalEnv)
231
 
  when integer(Index1), integer(Index2), Index2 > 0, Index1 > Index2 ->
 
231
  when is_integer(Index1), is_integer(Index2), Index2 > 0, Index1 > Index2 ->
232
232
    case is_safe(Val2) of
233
233
        true ->
234
234
            {R#c_let{vars=Vs,
235
235
                     arg=A,
236
236
                     body=#c_seq{arg=#c_primop{
237
237
                                   anno=Banno,
238
 
                                   name=#c_atom{val='dsetelement'},
239
 
                                   args=[#c_int{val=Index2},
 
238
                                   name=#c_literal{val='dsetelement'},
 
239
                                   args=[#c_literal{val=Index2},
240
240
                                         V,
241
241
                                         Val2]},
242
242
                                 body=V}
256
256
%% if X1 is used exactly once.
257
257
 
258
258
rewrite(#c_let{vars=[#c_var{name=X1}],
259
 
               arg=#c_call{module=#c_atom{val='erlang'},
260
 
                           name=#c_atom{val='setelement'},
261
 
                           args=[#c_int{val=Index1}, _Tuple, _Val1]
 
259
               arg=#c_call{module=#c_literal{val='erlang'},
 
260
                           name=#c_literal{val='setelement'},
 
261
                           args=[#c_literal{val=Index1}, _Tuple, _Val1]
262
262
                          }=A,
263
263
               body=#c_let{vars=[#c_var{}=V]=Vs,
264
264
                           arg=#c_call{anno=Banno,
265
 
                                       module=#c_atom{val='erlang'},
266
 
                                       name=#c_atom{val='setelement'},
267
 
                                       args=[#c_int{val=Index2},
 
265
                                       module=#c_literal{val='erlang'},
 
266
                                       name=#c_literal{val='setelement'},
 
267
                                       args=[#c_literal{val=Index2},
268
268
                                             #c_var{name=X1},
269
269
                                             Val2]},
270
270
                           body=B}
277
277
                     arg=A,
278
278
                     body=#c_seq{arg=#c_primop{
279
279
                                   anno=Banno,
280
 
                                   name=#c_atom{val='dsetelement'},
281
 
                                   args=[#c_int{val=Index2},
 
280
                                   name=#c_literal{val='dsetelement'},
 
281
                                   args=[#c_literal{val=Index2},
282
282
                                         V,
283
283
                                         Val2]},
284
284
                                 body=B}
293
293
 
294
294
is_safe(#c_var{}) -> true;
295
295
is_safe(#c_fname{}) -> true;
296
 
is_safe(#c_int{}) -> true;
297
 
is_safe(#c_float{}) -> true;
298
 
is_safe(#c_atom{}) -> true;
299
 
is_safe(#c_char{}) -> true;
300
 
is_safe(#c_nil{}) -> true;
 
296
is_safe(#c_literal{val=[_|_]}) -> false;
 
297
is_safe(#c_literal{val=V}) -> not is_tuple(V);
301
298
is_safe(_) -> false.
302
299
 
303
300
is_single_use(V, Env) ->