Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / May 2006

Tip: Looking for answers? Try searching our database.

code to large for machine-generated code

Thread view: 
Thomas Richter - 10 May 2006 12:58 GMT
Hi folks,

is there some way how to persuade the javac compiler to accept very long
methods? No, don't worry, I'm not writing this kind of mess. The code in
question is the result of a meta-compilation from another language, and
it turned out that this compiler generated a pretty long java code from
a seemingly simple source. Unfortunately, the compilation of the
generated java code then fails with the infamous "code too large" error.

Is there any kind of tweaking that can be done to make this code
acceptable (besides fixing the compiler that generated the java code
in first place, that is.)?

So long,
    Thomas
bugbear - 10 May 2006 14:59 GMT
> Hi folks,
>
[quoted text clipped - 8 lines]
> acceptable (besides fixing the compiler that generated the java code
> in first place, that is.)?

Turn off optional optimisations.

  BugBear
Chris Uppal - 10 May 2006 15:25 GMT
> is there some way how to persuade the javac compiler to accept very long
> methods?
> [...]
> Is there any kind of tweaking that can be done to make this code
> acceptable (besides fixing the compiler that generated the java code
> in first place, that is.)?

'fraid not.  The limit is built into the classfile format, and won't change
until that changes

There was some hope of that happening in 1.5, but it didn't materialise.  As
far as I can tell, despite the fact that the classfile format will change in
1.6, none of the changes will remove the limits on the lengths of compiled
methods (or related limits).

   -- chris
Roedy Green - 10 May 2006 18:32 GMT
On Wed, 10 May 2006 13:58:36 +0200, Thomas Richter
<thor@math.TU-Berlin.DE> wrote, quoted or indirectly quoted someone
who said :

> Unfortunately, the compilation of the
>generated java code then fails with the infamous "code too large" error.

If you code is too large, the problem is the JVM byte code addressing
can't span the method.  You need to do something to make the generated
code shorter or to split it up.  See what you could pull off with some
anonymous classes.  I would disassemble the code to see if you can see
any patterns you might encapsulate or code that is inlining
excessively long.

see http://mindprod.com/jgloss/disassembler.html

Signature

Canadian Mind Products, Roedy Green.
http://mindprod.com Java custom programming, consulting and coaching.

Luc The Perverse - 10 May 2006 21:17 GMT
> On Wed, 10 May 2006 13:58:36 +0200, Thomas Richter
> <thor@math.TU-Berlin.DE> wrote, quoted or indirectly quoted someone
[quoted text clipped - 11 lines]
>
> see http://mindprod.com/jgloss/disassembler.html

I don't know how long this method is, but I have a gut instinct that says
way too much functionality is being crammed into a function, which probably
should have its own class with different several different methods.

Times when I have had astronomically large functions, I have always been
doing something stupid.

--
LTP

:)
Thomas Richter - 11 May 2006 10:33 GMT
> I don't know how long this method is, but I have a gut instinct that says
> way too much functionality is being crammed into a function, which probably
> should have its own class with different several different methods.

No, it's not. As said, *I* haven't written this code. The computer did.
(-; The source of all this is surprisingly small, around 20 lines.

> Times when I have had astronomically large functions, I have always been
> doing something stupid.

Unless you're not the one who's doing it right away in first place. (-;

So long,
    Thomas
Chris Uppal - 11 May 2006 12:42 GMT
> The source of all this is surprisingly small, around 20 lines.

It would be interesting to know what it is and why it expands so much.  Is that
something you are allowed to discus ?

   -- chris
jmcgill - 11 May 2006 17:37 GMT
> No, it's not. As said, *I* haven't written this code. The computer did.
> (-; The source of all this is surprisingly small, around 20 lines.

Really?  I wonder if just one or two statements are causing the problem.
 Sounds like a good thing to submit to the daily WTF?

What is the shortest valid java source that generates an invalid (due to
size constraints) byte code?

I was picturing an array initializer that sets up an audio or image
file, or else a series of conditionals or case statements or assignments
that ran long.

20 statements or so?  That *is* interesting.  Wish you would post it.
Luc The Perverse - 11 May 2006 18:50 GMT
>> No, it's not. As said, *I* haven't written this code. The computer did.
>> (-; The source of all this is surprisingly small, around 20 lines.
>
> Really?  I wonder if just one or two statements are causing the problem.
> Sounds like a good thing to submit to the daily WTF?

I wonder if he means the code which generates the [much longer] function is
only 20 lines long?

I did this once - I made a function which executed immediately calling
functions which appeared to execute functionality, but instead only
generated code, but it generated turn based iterative code which was thrown
into a gigantic switch statement.

--
LTP

:)
Oliver Wong - 11 May 2006 19:04 GMT
>> No, it's not. As said, *I* haven't written this code. The computer did.
>> (-; The source of all this is surprisingly small, around 20 lines.
[quoted text clipped - 10 lines]
>
> 20 statements or so?  That *is* interesting.  Wish you would post it.

   From the OP:

<quote>
The code in
question is the result of a meta-compilation from another language, and
it turned out that this compiler generated a pretty long java code from
a seemingly simple source.
</quote>

   I.e. the original code might be something like:

<someWeirdLanguage>
$B_halts = determines_if_program_halts "~/src/cpp/myComplex.cpp"
</someWeirdLanguage>

which turns into a Java program which solves the halting problem. In other
words, the source language isn't Java.

   - Oliver
jmcgill - 11 May 2006 19:24 GMT
> which turns into a Java program which solves the halting problem. In
> other words, the source language isn't Java.

I see what you're saying.  I don't care about the original source
language.  Are you using some tongue in cheek irony there, e.g. "solves
The Halting Problem" ?

Through all this discussion of several days, the OP has not
characterized the java code that ends up producing invalid byte code.

If the java code is of a reasonable size but produces bytecode that is
not, that's interesting.  But if the java code looks like:

public static void initializeBMP {
    // many megabytes of this...
    int[] bmpbytes = { 0x00, 0x00, ..., 0x2A };
}

well, that's not a reasonable thing to do.

I also stand by my first comment -- if a code generator outputs
something that's plainly invalid according to the target language spec,
it's broken.

But it's still not clear whether the problem is javac turning reasonable
java statements into invalid bytecode, or whether the problem is a code
translator that creates unreasonable (or invalid) java source.

The OP makes it sound like the java source looks okay.  And if that's
the case, I'd certainly like to see it.
Chris Uppal - 11 May 2006 20:13 GMT
> Through all this discussion of several days, the OP has not
> characterized the java code that ends up producing invalid byte code.

Well, he hadn't been asked until today.

> I also stand by my first comment -- if a code generator outputs
> something that's plainly invalid according to the target language spec,
> it's broken.

I may have forgotten something  but I don't remember a limit on method size in
the Java Language Specification.  (There are limits in classfiles, of course,
but that's a different issue.)

> But it's still not clear whether the problem is javac turning reasonable
> java statements into invalid bytecode, or whether the problem is a code
> translator that creates unreasonable (or invalid) java source.

On the basic of what's been said so far (but I'd like to know more) it sounds
as if the code generator produces perfectly valid Java code, but code which
javac is unable to translate into JVM bytecode.

   -- chris
jmcgill - 11 May 2006 20:32 GMT
> I may have forgotten something  but I don't remember a limit on method size in
> the Java Language Specification.  (There are limits in classfiles, of course,
> but that's a different issue.)

The classfile format is the only issue!

There are several 16-bit and one or two 8-bit constraints in the
classfile spec, and my understanding is the method size in this
discussion is one of those.

4.10 Limitations of the Java Virtual Machine
...
* The amount of code per non-native, non-abstract method is limited to
65536 bytes by the sizes of the indices in the exception_table of the
Code attribute (§4.7.3), in the LineNumberTable attribute (§4.7.8), and
in the LocalVariableTable attribute (§4.7.9).

> On the basic of what's been said so far (but I'd like to know more) it sounds
> as if the code generator produces perfectly valid Java code, but code which
> javac is unable to translate into JVM bytecode.

That's what makes it interesting, and I suspect, in the category of
"javac bug."

Of course it's difficult or impossible to determine from a source file
whether the compiler output from that source will be valid.   But it
would be very interesting to see some reasonable looking routine that
turns into some brokenly huge bytecode.

The compiler should know when it's writing an invalid classfile and
should abort with a fatal error.
Oliver Wong - 11 May 2006 22:23 GMT
> The compiler should know when it's writing an invalid classfile and should
> abort with a fatal error.

   The OP mentions that the compiler is throwing a "Code too large" error.

   - Oliver
jmcgill - 11 May 2006 22:36 GMT
>    The OP mentions that the compiler is throwing a "Code too large" error.

Ah, so the ball is in the translator's court.

I still want to know if the input to javac looks reasonable.  Somehow I
doubt it.
Dale King - 15 May 2006 07:39 GMT
>> I may have forgotten something  but I don't remember a limit on method
>> size in
[quoted text clipped - 3 lines]
>
> The classfile format is the only issue!

It is not necessarily the only issue. You have limitations on branch
statements as well being limited to 64k.
Signature

 Dale King

Mike Schilling - 15 May 2006 15:08 GMT
>>> I may have forgotten something  but I don't remember a limit on method
>>> size in
[quoted text clipped - 6 lines]
> It is not necessarily the only issue. You have limitations on branch
> statements as well being limited to 64k.

But this doesn't limit the size of the method, given that the goto_w
instruction uses a 32-bit offset.  Longer branches can be generated using
it, e.g.

  if (condition:)
   {
       more than 64K of code)
   }
   else
   {
   }

becomes

   if (!condition)
       goto_w else_block
   if_block.
   goto_w after_else_block
   else_block

Interestingly, I found a 1995 version of the JVM spec online at
http://sunsite.ee/java/vmspec/vmspec-1.html, and under limitations, it says:

   The amount of code per method is limited to 65535 bytes by the sizes
   of the indices in the code in the exception table, the line number
table,
   and the local variable table. This may be fixed for 1.0beta2.
Chris Uppal - 15 May 2006 16:25 GMT
> Interestingly, I found a 1995 version of the JVM spec online at
> http://sunsite.ee/java/vmspec/vmspec-1.html, and under limitations, it
[quoted text clipped - 3 lines]
>     of the indices in the code in the exception table, the line number
>     table, and the local variable table. This may be fixed for 1.0beta2.

<chuckle/>

   -- chris
Oliver Wong - 11 May 2006 22:23 GMT
>> I also stand by my first comment -- if a code generator outputs
>> something that's plainly invalid according to the target language spec,
>> it's broken.

   From my understanding, the OP has some compiler which takes source code
written into some language (call it language A), and produces code written
in another language (language B). It just so happens that language B is a
superset of Java. I.e., it is exactly like Java, but without various size
limitations.

   The OP is then taking this program, written in language B, and giving it
to javac, hoping to fool javac into believing that this is actually a
program written in Java. Usually this works, but the OP ran into this one
instance where it doesn't work.

   - Oliver
Mike Schilling - 12 May 2006 00:07 GMT
>>> I also stand by my first comment -- if a code generator outputs
>>> something that's plainly invalid according to the target language spec,
[quoted text clipped - 5 lines]
> superset of Java. I.e., it is exactly like Java, but without various size
> limitations.

The limitations on the amount of byte code in a method can't reasonably be
called part of the Java language, since the translation from source to byte
code isn't part of the language definition.  There are programs with methods
large enough to be near the limit that, one compiler, say javac, can
compile, while another, say jikes, can't, and quite possibly vice versa.

To put it another way, the program:

class Big
{
   int i;

   void meth()
   {
       i = 12; // 10922 of these
       ...
   }
}

compiles successfully under javac 1.4.2_08.  Make it 10923 copies of that
line, and it no longer compiles.   Nothing in the language specification
will allow you to determine that 10922 is the magic number.
jmcgill - 12 May 2006 00:18 GMT
> compiles successfully under javac 1.4.2_08.  Make it 10923 copies of that
> line, and it no longer compiles.   Nothing in the language specification
> will allow you to determine that 10922 is the magic number.

I have a feeling that's a version of the Halting Problem or something
related.  You can't know until you've actually gone through the
compilation process, and by then it's too late.

However, in my mind I cannot separate the JVM spec from the language spec.

On the other hand, if you showed me a method that was ten thousand lines
long, I wouldn't agree that it was reasonable, even if machine
generated.  I don't care if it won't compile, or won't run, because I
don't consider it reasonable to expect it to.

However, my participation in this thread is because I'm still curious
about what code situation led to the problem for the OP.  He claims a
quite simple routine has generated ab uncompilable java class.  So I'm
still hoping to see the 20 lines of C or Cobol or Befunge or whatever,
that creates 20,000 lines of java, or (even more interesting) the 20, or
400, lines of java that choke the compiler.

I'm tired of speculating and I really want to see the code that caused
the failure.
Mike Schilling - 12 May 2006 02:28 GMT
>> compiles successfully under javac 1.4.2_08.  Make it 10923 copies of that
>> line, and it no longer compiles.   Nothing in the language specification
[quoted text clipped - 3 lines]
> related.  You can't know until you've actually gone through the
> compilation process, and by then it's too late.

If you really wanted to, you could assign costs to various language
constructs, require compilers to generate bytecode sequences no longer than
the total of those costs, and define the maximum cost of a method.  This
would be silly, of course, but it's possible.

> and I cannot separate the JVM spec from the language spec.

That's a shame; you should.  One describes a language, one describe an
implementation of that language.  They are not the same thing.
jmcgill - 12 May 2006 03:00 GMT
> That's a shame; you should.  One describes a language, one describe an
> implementation of that language.  They are not the same thing.

In my narrow corner of the real world, there is only Sun.  I'm not
particularly proud of that :-)

The truth is I understand the distinction fully.
Mike Schilling - 12 May 2006 20:04 GMT
>> That's a shame; you should.  One describes a language, one describe an
>> implementation of that language.  They are not the same thing.
>
> In my narrow corner of the real world, there is only Sun.  I'm not
> particularly proud of that :-)

I'd go further than Sun vs. other JVMs, though.  My claim is that Java is a
language with its own definition, and that JVM-related restrictions are not
part of that language definition per se.

Thought experiment: consider a Java environment that isn't JVM-based;
rather, it compiles Java to .class files, and allows you to link those files
into a native executable.  If it can compile methods too large for javac,
would you consider this a violation of the language spec?  Does is matter if
they can theoretically be presented in 65K of bytecode?
jmcgill - 12 May 2006 20:26 GMT
>>> That's a shame; you should.  One describes a language, one describe an
>>> implementation of that language.  They are not the same thing.
[quoted text clipped - 10 lines]
> would you consider this a violation of the language spec?  Does is matter if
> they can theoretically be presented in 65K of bytecode?

Mike we're much closer to full agreement than you seem to think.

But I've got the mindset where, if something doesn't work in practice,
you miss the delivery of your iteration.  All the theory in the world
won't put words in the email to your project manager that spins it like
a positive thing ;-)

I saw the OP's routine.  It's in some vector-based language that I think
I haven't ever seen.  It's obvious that, where the original language
declares things as sets, the translation to java has to implement
loops... and naturally, unrolls those loops.  8K iterations, some of them.

I have to admit that I don't understand the source language, that if I
did understand it, I  don't understand the physics or geometry behind
the original problem (Ising model/thermodynamic analysis; I got far
enough in physics to have heard of it, but not far enough to understand
what it's useful for.)

I'm still really curious though, because it's rare that I see a
programming language I don't recognize.

What language is this?

topology    =    torus in {bounded,torus};
width        =    512 in {64..4096}; #defines a default and a range.
height        =    512 in {64..4096};

or this:

bonds = ([0,1] << 0) + ([0,-1] << 1) + ([1,0] << 2) + ([-1,0] << 3);
Oliver Wong - 12 May 2006 20:51 GMT
> I saw the OP's routine.  It's in some vector-based language that I think I
> haven't ever seen.
[...]
> I  don't understand the physics or geometry behind the original problem
> (Ising model/thermodynamic analysis; I got far enough in physics to have
[quoted text clipped - 12 lines]
>
> bonds = ([0,1] << 0) + ([0,-1] << 1) + ([1,0] << 2) + ([-1,0] << 3);

   It's not unusual to invent a new domain specific language to facilitate
implementing the solution to domain specific problem. Many times, these
languages are unnamed. We've got a few unnamed languages here at my company.

   - Oliver
James McGill - 13 May 2006 17:26 GMT
>    It's not unusual to invent a new domain specific language to
> facilitate implementing the solution to domain specific problem. Many
> times, these languages are unnamed. We've got a few unnamed languages
> here at my company.

I'm sure it always seems like a good idea at the time....
Mike Schilling - 12 May 2006 21:27 GMT
>> Thought experiment: consider a Java environment that isn't JVM-based;
>> rather, it compiles Java to .class files, and allows you to link those
[quoted text clipped - 8 lines]
> won't put words in the email to your project manager that spins it like a
> positive thing ;-)

We don't diasgree there either.  My sugggestion (upthread, a bit) was to
write a postprocessor that splits the method into small enough pieces (that
is, private methods) that javac can deal with it.
EJP - 12 May 2006 02:02 GMT
> But it's still not clear whether the problem is javac turning reasonable
> java statements into invalid bytecode, or whether the problem is a code
> translator that creates unreasonable (or invalid) java source.

It's perfectly clear that it's a translator outputting lots of Java
source from a short sequence in the source language. Javac and invalid
byte code have nothing to do with it except that javac reports 'method
too long'.
jmcgill - 12 May 2006 02:09 GMT
> It's perfectly clear that it's a translator outputting lots of Java
> source from a short sequence in the source language.

If you say so.    I didn't find it all that clear.

>Javac and invalid
> byte code have nothing to do with it except that javac reports 'method
> too long'.

That's everything to do with it.  There's not a clear, well-defined
limit  for the length of a method, and I assume that's at least partly
because this boundary cannot be determined easily, if at all.

Are we arguing that the language allows arbitrarily large methods while
a given language implementation does not?

Like I said, I'm tired of speculating on this, and I just wish the OP
would post the original snippet, the resulting java, I could rub my
beard in curiosity and then move on :-)
EJP - 12 May 2006 06:55 GMT
>> It's perfectly clear that it's a translator outputting lots of Java
>> source from a short sequence in the source language.
>
> If you say so.    I didn't find it all that clear.

I don't know why not. Nobody else talked about the compiler producing
invalid byte code, you made that up. It doesn't, it produces an error
message instead, which is what the OP is talking about.

> There's not a clear, well-defined
> limit  for the length of a method, and I assume that's at least partly
> because this boundary cannot be determined easily, if at all.

There is a clear well-defined limit for the length of a method of 65535
bytes specified in #4.10 of the Java Virtual Machine Specification.

The distinction between what the language permits and what the JVM
permits is meaningless. We are as always talking about a specific
compiler which has a specific target machine, in this case the JVM. The
same thing would happen with a C compiler targeting a 16-bit machine:
the code won't compile. It doesn't mean it's illegal C but it still
won't produce an object file. And the Java compilers which *dont'*
target the JVM and therefore encounter this limit form a rather small
and IMHO not very useful set.
jmcgill - 12 May 2006 07:05 GMT
>> If you say so.    I didn't find it all that clear.
>
> I don't know why not.

Because there were no code examples, or even enough specific information
about the code in question to get a reasonable picture of what is going
on.  I had to speculate that the code he's trying to compile is some
insanely long method.

> Nobody else talked about the compiler producing
> invalid byte code  you made that up.

You're splitting hairs; it gives a message because its only alternative
is to write an invalid class file.

> There is a clear well-defined limit for the length of a method of 65535
> bytes specified in #4.10 of the Java Virtual Machine Specification.

Yes I cited that myself a while back.

> The distinction between what the language permits and what the JVM
> permits is meaningless.

Matter of opinion, and I don't care about that.  I just want to see the
code that caused this mess, or at least hear a better description of it.
Chris Uppal - 11 May 2006 10:39 GMT
> I don't know how long this method is, but I have a gut instinct that says
> way too much functionality is being crammed into a function, which
> probably should have its own class with different several different
> methods.

I remind you of the context.  From the original post:

> No, don't worry, I'm not writing this kind of mess. The code in
> question is the result of a meta-compilation from another language, and
> it turned out that this compiler generated a pretty long java code from
> a seemingly simple source.

   -- chris
jmcgill - 10 May 2006 19:38 GMT
> Hi folks,
>
[quoted text clipped - 3 lines]
> it turned out that this compiler generated a pretty long java code from
> a seemingly simple source.

The fact is your code generator is violating a requirement of the target
language.

My suspicion is that the method-size limit exists in order to facilitate
one or a few of the runtime target platforms, but that's neither here
nor there.  It's a language spec and your code generator is violating
it, and the compiler is rejecting it as it would any other fatal error.

What are you doing?  Setting up a static array from a data structure
that represents an image, or something like that?

For the record, I think the 64K limitation is stupid, and it makes me
wonder if we're shackled with JVM support for 16-bit address registers
somewhere.

I'm told that you can have larger than 64K methods by eliminating try
and synchronized blocks, and compiling without line number information.

This is not the only 16-bit limitation in the classfile format; there
are actually quite a few.  But where nobody is likely to have 65536
local variable in scope, or to put 256 parameters on a method call stack
(or 128 longs!), or to name a field with more than 65535 characters, we
certainly have seen 65536+ byte methods, at least from data definition
blocks.

Do you actually have a procedural method that gets this limit?  Sounds
like your source material is pretty nasty itself.
Chris Uppal - 10 May 2006 20:37 GMT
> I'm told that you can have larger than 64K methods by eliminating try
> and synchronized blocks, and compiling without line number information.

I've tried it; the verifier rejects it even if it would otherwise be a
structurally valid classfile.

(That was probably tested on 1.5.0, but might have been 1.4.2 -- I forget)

   -- chris
Roedy Green - 10 May 2006 20:44 GMT
On Wed, 10 May 2006 11:38:48 -0700, jmcgill
<jmcgill@email.arizona.edu> wrote, quoted or indirectly quoted someone
who said :

>For the record, I think the 64K limitation is stupid, and it makes me
>wonder if we're shackled with JVM support for 16-bit address registers
>somewhere.

It is a side effect of the class file format. They wanted to make it
compact.
See http://mindprod.com/jgloss/javaclassfileformat.html
Signature

Canadian Mind Products, Roedy Green.
http://mindprod.com Java custom programming, consulting and coaching.

Mike Schilling - 10 May 2006 22:36 GMT
> On Wed, 10 May 2006 11:38:48 -0700, jmcgill
> <jmcgill@email.arizona.edu> wrote, quoted or indirectly quoted someone
[quoted text clipped - 7 lines]
> compact.
> See http://mindprod.com/jgloss/javaclassfileformat.html

That link doesn;t work for me, but this one does:

http://mindprod.com/jgloss/javaclassformat.html
Mike Schilling - 10 May 2006 19:45 GMT
> Hi folks,
>
[quoted text clipped - 8 lines]
> acceptable (besides fixing the compiler that generated the java code
> in first place, that is.)?

The problem is, I'm guessing, single methods generating  bytecode that's too
long.  If you look at the generated Java, you might find patterns that lend
themselves to a mechanical fix for this, so that you could post-process the
generated Java instead of changing the generator.  If you could recognize
long stretches that share a fairly small set of  local variables with the
rest of the code, it should be straightforward to move them to private
methods.

I've actually worked with a real-life example of this, a YACC compiler that
generated switches too large for the C++ compiler we were using.  In that
case, we had the YACC source and could modify it, but a post-processor would
have worked equally well.  The fix was to change

   switch (i)
   {
       case 1: ...
       case 2:...
       ...
       case 10000:...
   }

to

   if (i < 1000)
   {
       case 1:...
       ...
       case 999:...
   }
   else if (i < 2000)
   {
       ...
   }
   etc.


John Gagon - 12 May 2006 07:31 GMT
> Hi folks,
>
[quoted text clipped - 11 lines]
> So long,
>     Thomas

VerifyError yes.
Check with the copy and paste detector and see how much code that will
save you. Then see if you can't get the simple source and then the
other languages compilation to deal with it. Used to get these all the
time with Jasper (tomcat) and tags that were in the service method and
not in their own module/method.

John Gagon


Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.