Bck2BrwsrMangling

From APIDesign

(Difference between revisions)
Jump to: navigation, search
(Like JNI)
Line 3: Line 3:
== Like [[JNI]] ==
== Like [[JNI]] ==
-
There is a common [[wikipedia:Name_mangling|mangling scheme]] specified by [[JNI]] for [[C]] and [[Bck2Brwsr]] mimics the [http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/design.html specification] as closely as possible. The mangling is based on ''underscore encoding'' substitution:
+
There is a common [[wikipedia:Name_mangling|mangling scheme]] specified by [[JNI]] for [[C]] and [[Bck2Brwsr]] mimics the [http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/design.html 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:
 +
 
 +
<source lang="javascript">
 +
var clazz = vm.java_lang_String(false);
 +
</source>
 +
 
 +
=== Methods ===
-
* Fully qualified name uses '_' to separate package names and class name
 
* There is "__" after name of a method and before its arguments
* There is "__" after name of a method and before its arguments
* return type is encoded first, parameters follow
* return type is encoded first, parameters follow
-
* If there is an '_' in the name segment, it gets replaced by "_1"
+
* 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"
* array signatures start with '[' - such character is replaced by "_3"
* object signatures end with ';' - that character is replaced by "_2"
* object signatures end with ';' - that character is replaced by "_2"
-
As a result to call method String.substring(int, int) returning String would be written as:
+
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:
<source lang="javascript">
<source lang="javascript">
Line 18: Line 27:
var r = s.substring__Ljava_lang_String_2II(0, 5);
var r = s.substring__Ljava_lang_String_2II(0, 5);
</source>
</source>
 +
 +
=== 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:
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:

Revision as of 18:33, 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);
Personal tools
buy