Hello,

i'm working with javassist for quite some time now and I must say it is really 
impressive what this thing can do, and with what ease!

Anyways, I'm confronted with one problem:
My tool inserts an arbitrary series of conditional branches and some code 
afterwards. This means I have to precalculate the number of bytes inserted for 
all following conditions and the code in respect to set the branch offset. All 
works well unless I load a string constant using addLdc(String). In this case I 
am unable to precalculate whether there are 3 bytes (ldc) or 4 bytes (ldc_w) 
inserted, since this depends on the ConstTables state at insertion time.

I've developed a workaround for my case by extending the Bytecode class and 
altering its behaviour with

  | private ArrayList<Integer> m_branches;
  | ...
  | 
  | public void addBranch(int code, int branchOffset) {
  |     // branch opcode is inserted at offset getSize()
  |     m_branches.add(getSize());
  |     addOpcode(code);
  |     add16bit(branchOffset);
  | }
  |     
  | private void adjustBranches(int end, int shift) {
  |     for (Integer pos : m_branches) {
  |             int branchOffset = read16bit(pos + 1);
  |             if ((pos + branchOffset) <= end) continue;
  |             write16bit(pos + 1, branchOffset + shift);
  |     }
  | }
  |     
  | @Override
  | public void addLdc(int i) {
  |     if (i > 0xFF) {
  |             adjustBranches(getSize(), 1);
  |             addOpcode(LDC_W);
  |             addIndex(i);
  |     } else {
  |             addOpcode(LDC);
  |             add(i);
  |         }
  | }
  | 

I think this is could be extended to a general solution, if it would be well 
defined how many bytes one should asume to be inserted.

Is there a way around this problem that I've overseen or is this really a "bug"?

---

By the way, is there any reason there is no

  | public void add16bit(int value) {
  |     value = value % 65536;
  |     add(value >> 8);
  |     add(value % 256);
  | }
  | 
defined in Bytecode? Since it is required for inserting branch offsets...

View the original post : 
http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4243340#4243340

Reply to the post : 
http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=4243340
_______________________________________________
jboss-user mailing list
jboss-user@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to