Bck2BrwsrMangling

From APIDesign

(Difference between revisions)
Jump to: navigation, search
(Like JNI)
(Static Method)
Line 36: Line 36:
var r = clazz.valueOf__Ljava_lang_String_2I(10);
var r = clazz.valueOf__Ljava_lang_String_2I(10);
</source>
</source>
 +
 +
=== Accessing a Field ===
 +
 +
To support subclasses defining the same field (like in case of [http://source.apidesign.org/hg/bck2brwsr/rev/5e13b1ac2886 InheritanceA and InheritanceB classes]) the [[Bck2Brwsr]] needed to create accessor method to access each field which prefixes the name of the field with "_". The proper way to access field ''value'' defined in String class would then be:
 +
 +
<source lang="javascript">
 +
var getValue = vm.java_lang_String(true)._value.call(this);
 +
var newValue = "...";
 +
vm.java_lang_String(true)._value.call(this, newValue);
 +
</source>
 +
 +
This can often be simplified to:
 +
 +
<source lang="javascript">
 +
var getValue = this._value();
 +
var newValue = "...";
 +
this._value(newValue);
 +
</source>
 +
 +
which does the same in most of case. Only when there is a subclass defining its own field ''value'', the result would not be correct. Thus this kind of usage is appropriate when one knows the class is final and can't be subclassed.

Revision as of 18:43, 26 January 2013

When translating the ByteCode to JavaScript the Bck2Brwsr project needs to face a common problem -- when translating a typed language (like Java) to untyped (like JavaScript) one needs to mange the names, so they continue to support method and field overloading.

Contents

Like JNI

There is a common mangling scheme specified by JNI for C and Bck2Brwsr mimics the specification as closely as possible. The mangling is based on underscore encoding substitution.

Fully Qualified Names

Fully qualified name uses '_' to separate package names and class name. The global virtual machine object vm has methods to obtain all classes. One can get reference to String as:

var clazz = vm.java_lang_String(false);

Methods

  • There is "__" after name of a method and before its arguments
  • return type is encoded first, parameters follow
  • If there is an '_' in the name or argument segment, it gets replaced by "_1"
  • array signatures start with '[' - such character is replaced by "_3"
  • object signatures end with ';' - that character is replaced by "_2"

As a result to call method String.substring(int, int) - e.g. a method that return string and takes two integers as arguments -it be written as:

var s = "...";
var r = s.substring__Ljava_lang_String_2II(0, 5);

Static Method

When calling a static method, one first needs to obtain the name of a class. The class is made available in a global object called "vm". As such calling String.valueOf(10) is translated to:

var clazz = vm.java_lang_String(false);
var r = clazz.valueOf__Ljava_lang_String_2I(10);

Accessing a Field

To support subclasses defining the same field (like in case of InheritanceA and InheritanceB classes) the Bck2Brwsr needed to create accessor method to access each field which prefixes the name of the field with "_". The proper way to access field value defined in String class would then be:

var getValue = vm.java_lang_String(true)._value.call(this);
var newValue = "...";
vm.java_lang_String(true)._value.call(this, newValue);

This can often be simplified to:

var getValue = this._value();
var newValue = "...";
this._value(newValue);

which does the same in most of case. Only when there is a subclass defining its own field value, the result would not be correct. Thus this kind of usage is appropriate when one knows the class is final and can't be subclassed.

Personal tools
buy