mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-30 08:12:05 +00:00
Default implemetation of toSource now lives in ScriptRuntime to allow its
reuse in othr objects.
This commit is contained in:
parent
7d0180067b
commit
ec1dd303f9
@ -92,7 +92,9 @@ final class NativeObjectPrototype extends NativeObject
|
|||||||
case Id_toLocaleString: // For now just alias toString
|
case Id_toLocaleString: // For now just alias toString
|
||||||
case Id_toString: {
|
case Id_toString: {
|
||||||
if (cx.hasFeature(Context.FEATURE_TO_STRING_AS_SOURCE)) {
|
if (cx.hasFeature(Context.FEATURE_TO_STRING_AS_SOURCE)) {
|
||||||
String s = toSource(cx, scope, thisObj, args);
|
String s = ScriptRuntime.defaultObjectToSource(cx, scope,
|
||||||
|
thisObj,
|
||||||
|
args);
|
||||||
int L = s.length();
|
int L = s.length();
|
||||||
if (L != 0 && s.charAt(0) == '(' && s.charAt(L - 1) == ')')
|
if (L != 0 && s.charAt(0) == '(' && s.charAt(L - 1) == ')')
|
||||||
{
|
{
|
||||||
@ -145,75 +147,12 @@ final class NativeObjectPrototype extends NativeObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
case Id_toSource:
|
case Id_toSource:
|
||||||
return toSource(cx, scope, thisObj, args);
|
return ScriptRuntime.defaultObjectToSource(cx, scope, thisObj,
|
||||||
|
args);
|
||||||
}
|
}
|
||||||
return super.execMethod(f, cx, scope, thisObj, args);
|
return super.execMethod(f, cx, scope, thisObj, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String toSource(Context cx, Scriptable scope,
|
|
||||||
Scriptable thisObj, Object[] args)
|
|
||||||
throws JavaScriptException
|
|
||||||
{
|
|
||||||
boolean toplevel, iterating;
|
|
||||||
if (cx.iterating == null) {
|
|
||||||
toplevel = true;
|
|
||||||
iterating = false;
|
|
||||||
cx.iterating = new ObjToIntMap(31);
|
|
||||||
} else {
|
|
||||||
toplevel = false;
|
|
||||||
iterating = cx.iterating.has(thisObj);
|
|
||||||
}
|
|
||||||
|
|
||||||
StringBuffer result = new StringBuffer(128);
|
|
||||||
if (toplevel) {
|
|
||||||
result.append("(");
|
|
||||||
}
|
|
||||||
result.append('{');
|
|
||||||
|
|
||||||
// Make sure cx.iterating is set to null when done
|
|
||||||
// so we don't leak memory
|
|
||||||
try {
|
|
||||||
if (!iterating) {
|
|
||||||
cx.iterating.intern(thisObj); // stop recursion.
|
|
||||||
Object[] ids = thisObj.getIds();
|
|
||||||
for(int i=0; i < ids.length; i++) {
|
|
||||||
if (i > 0)
|
|
||||||
result.append(", ");
|
|
||||||
Object id = ids[i];
|
|
||||||
Object value;
|
|
||||||
if (id instanceof Integer) {
|
|
||||||
int intId = ((Integer)id).intValue();
|
|
||||||
value = thisObj.get(intId, thisObj);
|
|
||||||
result.append(intId);
|
|
||||||
} else {
|
|
||||||
String strId = (String)id;
|
|
||||||
value = thisObj.get(strId, thisObj);
|
|
||||||
if (ScriptRuntime.isValidIdentifierName(strId)) {
|
|
||||||
result.append(strId);
|
|
||||||
} else {
|
|
||||||
result.append('\'');
|
|
||||||
result.append(
|
|
||||||
ScriptRuntime.escapeString(strId, '\''));
|
|
||||||
result.append('\'');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.append(':');
|
|
||||||
result.append(ScriptRuntime.uneval(cx, scope, value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
if (toplevel) {
|
|
||||||
cx.iterating = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
result.append('}');
|
|
||||||
if (toplevel) {
|
|
||||||
result.append(')');
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String getIdName(int id)
|
protected String getIdName(int id)
|
||||||
{
|
{
|
||||||
switch (id) {
|
switch (id) {
|
||||||
|
@ -624,6 +624,69 @@ public class ScriptRuntime {
|
|||||||
throw Kit.badTypeJS(value);
|
throw Kit.badTypeJS(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static String defaultObjectToSource(Context cx, Scriptable scope,
|
||||||
|
Scriptable thisObj, Object[] args)
|
||||||
|
{
|
||||||
|
boolean toplevel, iterating;
|
||||||
|
if (cx.iterating == null) {
|
||||||
|
toplevel = true;
|
||||||
|
iterating = false;
|
||||||
|
cx.iterating = new ObjToIntMap(31);
|
||||||
|
} else {
|
||||||
|
toplevel = false;
|
||||||
|
iterating = cx.iterating.has(thisObj);
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuffer result = new StringBuffer(128);
|
||||||
|
if (toplevel) {
|
||||||
|
result.append("(");
|
||||||
|
}
|
||||||
|
result.append('{');
|
||||||
|
|
||||||
|
// Make sure cx.iterating is set to null when done
|
||||||
|
// so we don't leak memory
|
||||||
|
try {
|
||||||
|
if (!iterating) {
|
||||||
|
cx.iterating.intern(thisObj); // stop recursion.
|
||||||
|
Object[] ids = thisObj.getIds();
|
||||||
|
for(int i=0; i < ids.length; i++) {
|
||||||
|
if (i > 0)
|
||||||
|
result.append(", ");
|
||||||
|
Object id = ids[i];
|
||||||
|
Object value;
|
||||||
|
if (id instanceof Integer) {
|
||||||
|
int intId = ((Integer)id).intValue();
|
||||||
|
value = thisObj.get(intId, thisObj);
|
||||||
|
result.append(intId);
|
||||||
|
} else {
|
||||||
|
String strId = (String)id;
|
||||||
|
value = thisObj.get(strId, thisObj);
|
||||||
|
if (ScriptRuntime.isValidIdentifierName(strId)) {
|
||||||
|
result.append(strId);
|
||||||
|
} else {
|
||||||
|
result.append('\'');
|
||||||
|
result.append(
|
||||||
|
ScriptRuntime.escapeString(strId, '\''));
|
||||||
|
result.append('\'');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.append(':');
|
||||||
|
result.append(ScriptRuntime.uneval(cx, scope, value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (toplevel) {
|
||||||
|
cx.iterating = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result.append('}');
|
||||||
|
if (toplevel) {
|
||||||
|
result.append(')');
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
public static Scriptable toObject(Scriptable scope, Object val)
|
public static Scriptable toObject(Scriptable scope, Object val)
|
||||||
{
|
{
|
||||||
if (val instanceof Scriptable && val != Undefined.instance) {
|
if (val instanceof Scriptable && val != Undefined.instance) {
|
||||||
|
Loading…
Reference in New Issue
Block a user