Closed Bug 264637 Opened 20 years ago Closed 19 years ago

InterpretedFunction memory footprint could be lighter

Categories

(Rhino Graveyard :: Core, enhancement)

enhancement
Not set
normal

Tracking

(Not tracked)

RESOLVED FIXED

People

(Reporter: szegedia, Assigned: igor)

Details

(Keywords: memory-footprint)

Attachments

(3 files)

User-Agent:       Opera/7.54 (Windows NT 5.0; U)  [en]
Build Identifier: 

The boolean flag "evalScriptFlag" in the class InterpretedFunction could be 
moved to InterpretedData. This would make InterpretedFunction (of which one 
instance is created per declared function per script execution) lighter, on 
expense of InterpretedData (of which one instance is created per declared 
function per script parsing).

With support for continuations in 1.6, it is also important to be able to stub 
out as much of the objects representing an interpreted function as possible when 
serializing interim state, and reconnect to the already present shared instances 
upon deserialization. It is therefore important to push as much of the immutable 
state as possible to InterpreterData class - I will likely follow up with 
proposals for further reductions in InterpretedFunction's base class, 
NativeFunction. 

Reproducible: Always
Steps to Reproduce:
Keywords: footprint
Summary: InterpretedFunction memory footprint could be lighter → InterpretedFunction memory footprint could be lighter
I committed the patch: it is sufficiently simple not to cause any problems.
The patch replaces version|argNames|argCount fields in NativeFunction by
getLanguageVersion()|getParamCount()|getParamAndVarCount()|getParamOrVarName(int

index) abstract methods.

For the interpreted mode the methods are then trivially implemented in
InterpretedFunction using information stored in InterpreterData. 

For the class compilation mode patch adds code to generate methods'
implementations using data embedded in the generated class file. In this way
for the class compiler the patch not only removes 3 fields from each function
instance but also avoids the construction of argNames array replacing the
bytecode to initialize it by the bytecode to do the switch over var index. 

The patch also replaces extending from NativeFunction in
NativeScript|NativeRegExpCtor classes by the proper extending from BaseFunction

which was a oversight left from pre-1.5R5 reorganization of code generation.
(In reply to comment #3)
> Created an attachment (id=162381)
> Patch to remove NativeFunction.(version|argNames|argCount)
> 

Wow - this indeed sounds as a great improvement. 

A coworker who's intensively working on JavaScript apps will probably kick in 
later today to work with it, so any glaring bugs should become apparent rather 
quickly. I myself have been running some tests with it, and so far it looks 
okay.

Now, risking that I'll come across as becoming too greedy, I assume 
"functionName" in BaseFunction could also undergo a similar treatment of being 
replaced with an abstract getFunctionName() method, couldn't it? The function 
name is either calculable from other data (FieldAndMethods, overloaded case of 
NativeJavaMethod*, NativeJavaConstructor, InterpetedFunction) or fixed 
(NativeRegExpCtor) in lots of subclasses.

[*] Of course, it also has a constructor with explicit name, but that could 
really be handled by a separate subclass named "NamedNativeJavaMethod" or 
something similar - note the case of NativeJavaMethod that takes Method[] as 
argument (and by inference, all instances of FieldsAndMethods class) don't need 
the functionName field as they directly use the Java method name as their name.
The patch was committed some time ago.
Status: NEW → RESOLVED
Closed: 19 years ago
Resolution: --- → FIXED
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: