Check-in [c00ae75531]

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Process some more byte codes; add string representations.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1:c00ae755318c8b4cebcc3d8c424e55594a412b1b
User & Date: stephanie.gawroriski 2019-02-06 20:52:47
Context
2019-02-07
08:02
Backup developer notes. check-in: 3939ff0009 user: squirreljme tags: trunk
2019-02-06
20:52
Process some more byte codes; add string representations. check-in: c00ae75531 user: stephanie.gawroriski tags: trunk
08:02
Backup developer notes. check-in: 59063dccda user: squirreljme tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to runt/libs/tool-classfile-scrf-compiler/net/multiphasicapps/scrf/compiler/ProcessorUtils.java.

57
58
59
60
61
62
63























64
65
66
67

	 */
	public static final MemoryType memoryTypeOf(FieldDescriptor __f)
		throws NullPointerException
	{
		if (__f == null)
			throw new NullPointerException("NARG");
		























		throw new todo.TODO();
	}
}









>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
|
|
>
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
	 */
	public static final MemoryType memoryTypeOf(FieldDescriptor __f)
		throws NullPointerException
	{
		if (__f == null)
			throw new NullPointerException("NARG");
		
		// Pointer Types
		if (__f.isObject())
			return MemoryType.POINTER;
		
		// Primitives otherwise
		switch (__f.primitiveType())
		{
			case BYTE:
				return MemoryType.BYTE;
			
			case SHORT:
			case CHARACTER:
				return MemoryType.SHORT;
			
			case INTEGER:
			case FLOAT:
				return MemoryType.INTEGER;
			
			case LONG:
			case DOUBLE:
				return MemoryType.LONG;
			
			default:
				throw new todo.OOPS(__f.toString());
		}
	}
}

Changes to runt/libs/tool-classfile-scrf-compiler/net/multiphasicapps/scrf/compiler/RegisterCodeBuilder.java.

62
63
64
65
66
67
68





69
70
71
72
73
74
75
		if (__i == null)
			throw new NullPointerException("NARG");
		
		// The instruction index gets returned
		List<RegisterInstruction> insts = this._insts;
		int rv = insts.size();
		insts.add(__i);





		return rv;
	}
	
	/**
	 * Adds constant value.
	 *
	 * @param __t The type of memory to form a constant from.







>
>
>
>
>







62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
		if (__i == null)
			throw new NullPointerException("NARG");
		
		// The instruction index gets returned
		List<RegisterInstruction> insts = this._insts;
		int rv = insts.size();
		insts.add(__i);
		
		// Debug
		todo.DEBUG.note("I@%d: %s", rv, __i);
		
		// Return the index
		return rv;
	}
	
	/**
	 * Adds constant value.
	 *
	 * @param __t The type of memory to form a constant from.

Changes to runt/libs/tool-classfile-scrf-compiler/net/multiphasicapps/scrf/compiler/StringTableBuilder.java.

58
59
60
61
62
63
64
65


66


















			// Debug
			todo.DEBUG.note("S@%d = %s", id, __o);
			
			// Return the ID of this new entry
			return id;
		}
	}
}




























|
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
			// Debug
			todo.DEBUG.note("S@%d = %s", id, __o);
			
			// Return the ID of this new entry
			return id;
		}
	}
	
	/**
	 * Adds the string representation of the given object to the string table.
	 *
	 * @param <O> The type of object to register.
	 * @param __o The object to register.
	 * @return {@code __o}.
	 * @throws NullPointerException On null arguments.
	 * @since 2019/02/06
	 */
	public final <O> O register(O __o)
		throws NullPointerException
	{
		if (__o == null)
			throw new NullPointerException("NARG");
		
		// Add the string representation of this object
		this.add(__o.toString());
		return __o;
	}
}

Changes to runt/libs/tool-classfile-scrf-compiler/net/multiphasicapps/scrf/compiler/VTableBuilder.java.

6
7
8
9
10
11
12


13



14
15
16
17
18
19
20
..
98
99
100
101
102
103
104
105





106
107
108
// ---------------------------------------------------------------------------
// SquirrelJME is under the GNU General Public License v3+, or later.
// See license.mkd for licensing and copyright information.
// ---------------------------------------------------------------------------

package net.multiphasicapps.scrf.compiler;



import net.multiphasicapps.classfile.FieldReference;



import net.multiphasicapps.scrf.VTableIndex;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * This is the builder for vtables which are used to contain some run-time
 * determined information about a class, it effectively allows the VM to
................................................................................
	public final VTableIndex addFieldReference(boolean __static,
		FieldReference __f)
		throws NullPointerException
	{
		if (__f == null)
			throw new NullPointerException("NARG");
		
		throw new todo.TODO();





	}
}








>
>

>
>
>







 







|
>
>
>
>
>



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
...
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// ---------------------------------------------------------------------------
// SquirrelJME is under the GNU General Public License v3+, or later.
// See license.mkd for licensing and copyright information.
// ---------------------------------------------------------------------------

package net.multiphasicapps.scrf.compiler;

import net.multiphasicapps.classfile.ClassName;
import net.multiphasicapps.classfile.FieldDescriptor;
import net.multiphasicapps.classfile.FieldReference;
import net.multiphasicapps.classfile.MemberDescriptor;
import net.multiphasicapps.classfile.MemberName;
import net.multiphasicapps.scrf.VTableFieldReference;
import net.multiphasicapps.scrf.VTableIndex;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * This is the builder for vtables which are used to contain some run-time
 * determined information about a class, it effectively allows the VM to
................................................................................
	public final VTableIndex addFieldReference(boolean __static,
		FieldReference __f)
		throws NullPointerException
	{
		if (__f == null)
			throw new NullPointerException("NARG");
		
		// Need to register the names and such for the reference
		StringTableBuilder strings = this.strings;
		return this.add(new VTableFieldReference(__static,
			strings.<ClassName>register(__f.className()),
			strings.<MemberName>register(__f.memberName()),
			strings.<FieldDescriptor>register(__f.memberType())));
	}
}

Changes to runt/libs/tool-scrf/META-INF/MANIFEST.MF.

4
5
6
7
8
9
10

11
12
X-SquirrelJME-Name: SummerCoat Register Format
X-SquirrelJME-Vendor: Stephanie Gawroriski
X-SquirrelJME-Version: 0.3.0
X-SquirrelJME-Description: This contains the code needed to run and 
 parse files which contains a register compiled format for the 
 SummerCoat virtual machine. Class files are stored in a format which 
 may be cached for later loading of the virtual machine.

Microedition-Configuration: CLDC-1.8-Compact








>


4
5
6
7
8
9
10
11
12
13
X-SquirrelJME-Name: SummerCoat Register Format
X-SquirrelJME-Vendor: Stephanie Gawroriski
X-SquirrelJME-Version: 0.3.0
X-SquirrelJME-Description: This contains the code needed to run and 
 parse files which contains a register compiled format for the 
 SummerCoat virtual machine. Class files are stored in a format which 
 may be cached for later loading of the virtual machine.
X-SquirrelJME-Depends: tool-classfile
Microedition-Configuration: CLDC-1.8-Compact

Changes to runt/libs/tool-scrf/net/multiphasicapps/scrf/RegisterIndex.java.

6
7
8
9
10
11
12



13
14
15
16
17
18
19
20
21
22
23



24
25
26
27
28
29
30
..
53
54
55
56
57
58
59
60






61











// ---------------------------------------------------------------------------
// SquirrelJME is under the GNU General Public License v3+, or later.
// See license.mkd for licensing and copyright information.
// ---------------------------------------------------------------------------

package net.multiphasicapps.scrf;




/**
 * This represents an index to a register.
 *
 * @since 2019/02/05
 */
public final class RegisterIndex
	implements Comparable<RegisterIndex>
{
	/** The register index. */
	protected final int index;
	



	/**
	 * Initializes the index.
	 *
	 * @param __i The index of the register.
	 * @since 2019/02/05
	 */
	public RegisterIndex(int __i)
................................................................................
			return true;
		
		if (!(__o instanceof RegisterIndex))
			return false;
		
		return this.index == ((RegisterIndex)__o).index;
	}
}

























>
>
>











>
>
>







 







|
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
..
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// ---------------------------------------------------------------------------
// SquirrelJME is under the GNU General Public License v3+, or later.
// See license.mkd for licensing and copyright information.
// ---------------------------------------------------------------------------

package net.multiphasicapps.scrf;

import java.lang.ref.Reference;
import java.lang.ref.WeakReference;

/**
 * This represents an index to a register.
 *
 * @since 2019/02/05
 */
public final class RegisterIndex
	implements Comparable<RegisterIndex>
{
	/** The register index. */
	protected final int index;
	
	/** The string representation. */
	private Reference<String> _string;
	
	/**
	 * Initializes the index.
	 *
	 * @param __i The index of the register.
	 * @since 2019/02/05
	 */
	public RegisterIndex(int __i)
................................................................................
			return true;
		
		if (!(__o instanceof RegisterIndex))
			return false;
		
		return this.index == ((RegisterIndex)__o).index;
	}
	
	/**
	 * {@inheritDoc}
	 * @since 2019/02/06
	 */
	@Override
	public final String toString()
	{
		Reference<String> ref = this._string;
		String rv;
		
		if (ref == null || null == (rv = ref.get()))
			this._string = new WeakReference<String>((rv = String.format(
			"I@%d", this.index)));
		
		return rv;
	}
}

Changes to runt/libs/tool-scrf/net/multiphasicapps/scrf/RegisterInstruction.java.

6
7
8
9
10
11
12




13
14
15
16
17
18
19
20
21
22
23
24
25



26
27
28
29
30
31
32
..
43
44
45
46
47
48
49
50






51












// ---------------------------------------------------------------------------
// SquirrelJME is under the GNU General Public License v3+, or later.
// See license.mkd for licensing and copyright information.
// ---------------------------------------------------------------------------

package net.multiphasicapps.scrf;





/**
 * This represents a single instruction within the compiled register format.
 *
 * @since 2019/01/23
 */
public final class RegisterInstruction
{
	/** The operation. */
	protected final int op;
	
	/** Arguments. */
	private final Object[] _args;
	



	/**
	 * Initializes the register instruction.
	 *
	 * @param __op The operation.
	 * @param __args Arguments to the operation.
	 * @throws IllegalArgumentException If the operation is not valid.
	 * @since 2019/01/23
................................................................................
			__args.clone()));
		
		// Check arguments for null
		for (Object a : __args)
			if (a == null)
				throw new NullPointerException("NARG");
	}
}


























>
>
>
>













>
>
>







 







|
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
..
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// ---------------------------------------------------------------------------
// SquirrelJME is under the GNU General Public License v3+, or later.
// See license.mkd for licensing and copyright information.
// ---------------------------------------------------------------------------

package net.multiphasicapps.scrf;

import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
import java.util.Arrays;

/**
 * This represents a single instruction within the compiled register format.
 *
 * @since 2019/01/23
 */
public final class RegisterInstruction
{
	/** The operation. */
	protected final int op;
	
	/** Arguments. */
	private final Object[] _args;
	
	/** String representation. */
	private Reference<String> _string;
	
	/**
	 * Initializes the register instruction.
	 *
	 * @param __op The operation.
	 * @param __args Arguments to the operation.
	 * @throws IllegalArgumentException If the operation is not valid.
	 * @since 2019/01/23
................................................................................
			__args.clone()));
		
		// Check arguments for null
		for (Object a : __args)
			if (a == null)
				throw new NullPointerException("NARG");
	}
	
	/**
	 * {@inheritDoc}
	 * @since 2019/02/06
	 */
	@Override
	public final String toString()
	{
		Reference<String> ref = this._string;
		String rv;
		
		if (ref == null || null == (rv = ref.get()))
			this._string = new WeakReference<>((rv = String.format(
				"%s=%s", RegisterInstructionMnemonic.of(this.op),
				Arrays.asList(this._args))));
		
		return rv;
	}
}

Added runt/libs/tool-scrf/net/multiphasicapps/scrf/RegisterInstructionMnemonic.java.





































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// -*- Mode: Java; indent-tabs-mode: t; tab-width: 4 -*-
// ---------------------------------------------------------------------------
// Multi-Phasic Applications: SquirrelJME
//     Copyright (C) Stephanie Gawroriski <xer@multiphasicapps.net>
//     Copyright (C) Multi-Phasic Applications <multiphasicapps.net>
// ---------------------------------------------------------------------------
// SquirrelJME is under the GNU General Public License v3+, or later.
// See license.mkd for licensing and copyright information.
// ---------------------------------------------------------------------------

package net.multiphasicapps.scrf;

/**
 * Mnemonics for instructions.
 *
 * @since 2019/02/06
 */
public class RegisterInstructionMnemonic
{
	/**
	 * Not used.
	 *
	 * @since 2019/02/06
	 */
	private RegisterInstructionMnemonic()
	{
	}
	
	/**
	 * Returns the name of the operation.
	 *
	 * @param __i The instruction type.
	 * @return The operation mnemonic.
	 * @since 2019/02/06
	 */
	public static final String of(int __i)
	{
		switch (__i)
		{
			case RegisterInstructionType.NOP:		return "NOP";
			case RegisterInstructionType.CONST:		return "CONST";
			case RegisterInstructionType.COPY:		return "COPY";
			case RegisterInstructionType.LOAD:		return "LOAD";
			case RegisterInstructionType.STORE:		return "STORE";
			default:
				return "UNKNOWN" + __i;
		}
	}
}

Added runt/libs/tool-scrf/net/multiphasicapps/scrf/VTableFieldReference.java.









































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// -*- Mode: Java; indent-tabs-mode: t; tab-width: 4 -*-
// ---------------------------------------------------------------------------
// Multi-Phasic Applications: SquirrelJME
//     Copyright (C) Stephanie Gawroriski <xer@multiphasicapps.net>
//     Copyright (C) Multi-Phasic Applications <multiphasicapps.net>
// ---------------------------------------------------------------------------
// SquirrelJME is under the GNU General Public License v3+, or later.
// See license.mkd for licensing and copyright information.
// ---------------------------------------------------------------------------

package net.multiphasicapps.scrf;

import net.multiphasicapps.classfile.ClassName;
import net.multiphasicapps.classfile.FieldDescriptor;
import net.multiphasicapps.classfile.MemberName;

/**
 * A VTable reference to a field.
 *
 * @since 2019/02/06
 */
public final class VTableFieldReference
	extends VTableMemberReference
{
	/**
	 * Initializes the reference.
	 *
	 * @param __s Is this static?
	 * @param __cl The class name.
	 * @param __mn The member name.
	 * @param __mt The member type.
	 * @throws NullPointerException On null arguments.
	 * @since 2019/02/06
	 */
	public VTableFieldReference(boolean __s, ClassName __cl, MemberName __mn,
		FieldDescriptor __mt)
		throws NullPointerException
	{
		super(__s, __cl, __mn, __mt);
	}
	
	/**
	 * {@inheritDoc}
	 * @since 2019/02/06
	 */
	@Override
	public boolean equals(Object __o)
	{
		return super.equals(__o) && (__o instanceof VTableFieldReference);
	}
}

Changes to runt/libs/tool-scrf/net/multiphasicapps/scrf/VTableIndex.java.

6
7
8
9
10
11
12



13
14
15
16
17
18
19
20
21
22
23



24
25
26
27
28
29
30
..
53
54
55
56
57
58
59
60






61











// ---------------------------------------------------------------------------
// SquirrelJME is under the GNU General Public License v3+, or later.
// See license.mkd for licensing and copyright information.
// ---------------------------------------------------------------------------

package net.multiphasicapps.scrf;




/**
 * This represents an index a VTable for the current class.
 *
 * @since 2019/02/05
 */
public class VTableIndex
	implements Comparable<VTableIndex>, MemorySource
{
	/** The vtable index. */
	protected final int index;
	



	/**
	 * Initializes the index.
	 *
	 * @param __i The index of the vtable entry.
	 * @since 2019/02/05
	 */
	public VTableIndex(int __i)
................................................................................
			return true;
		
		if (!(__o instanceof VTableIndex))
			return false;
		
		return this.index == ((VTableIndex)__o).index;
	}
}

























>
>
>











>
>
>







 







|
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
..
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// ---------------------------------------------------------------------------
// SquirrelJME is under the GNU General Public License v3+, or later.
// See license.mkd for licensing and copyright information.
// ---------------------------------------------------------------------------

package net.multiphasicapps.scrf;

import java.lang.ref.Reference;
import java.lang.ref.WeakReference;

/**
 * This represents an index a VTable for the current class.
 *
 * @since 2019/02/05
 */
public class VTableIndex
	implements Comparable<VTableIndex>, MemorySource
{
	/** The vtable index. */
	protected final int index;
	
	/** The string representation. */
	private Reference<String> _string;
	
	/**
	 * Initializes the index.
	 *
	 * @param __i The index of the vtable entry.
	 * @since 2019/02/05
	 */
	public VTableIndex(int __i)
................................................................................
			return true;
		
		if (!(__o instanceof VTableIndex))
			return false;
		
		return this.index == ((VTableIndex)__o).index;
	}
	
	/**
	 * {@inheritDoc}
	 * @since 2019/02/06
	 */
	@Override
	public final String toString()
	{
		Reference<String> ref = this._string;
		String rv;
		
		if (ref == null || null == (rv = ref.get()))
			this._string = new WeakReference<String>((rv = String.format(
			"VT@%d", this.index)));
		
		return rv;
	}
}

Added runt/libs/tool-scrf/net/multiphasicapps/scrf/VTableMemberReference.java.







































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// -*- Mode: Java; indent-tabs-mode: t; tab-width: 4 -*-
// ---------------------------------------------------------------------------
// Multi-Phasic Applications: SquirrelJME
//     Copyright (C) Stephanie Gawroriski <xer@multiphasicapps.net>
//     Copyright (C) Multi-Phasic Applications <multiphasicapps.net>
// ---------------------------------------------------------------------------
// SquirrelJME is under the GNU General Public License v3+, or later.
// See license.mkd for licensing and copyright information.
// ---------------------------------------------------------------------------

package net.multiphasicapps.scrf;

import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
import net.multiphasicapps.classfile.ClassName;
import net.multiphasicapps.classfile.MemberDescriptor;
import net.multiphasicapps.classfile.MemberName;

/**
 * This represents a reference to a member.
 *
 * @since 2019/02/06
 */
public abstract class VTableMemberReference
{
	/** Is this static? */
	protected final boolean isstatic;
	
	/** The class this is in. */
	protected final ClassName inclass;
	
	/** The member name. */
	protected final MemberName membername;
	
	/** The member type. */
	protected final MemberDescriptor membertype;
	
	/** String representation. */
	private Reference<String> _string;
	
	/**
	 * Initializes the reference.
	 *
	 * @param __s Is this static?
	 * @param __cl The class name.
	 * @param __mn The member name.
	 * @param __mt The member type.
	 * @throws NullPointerException On null arguments.
	 * @since 2019/02/06
	 */
	public VTableMemberReference(boolean __s, ClassName __cl, MemberName __mn,
		MemberDescriptor __mt)
		throws NullPointerException
	{
		if (__cl == null || __mn == null || __mt == null)
			throw new NullPointerException("NARG");
		
		this.isstatic = __s;
		this.inclass = __cl;
		this.membername = __mn;
		this.membertype = __mt;
	}
	
	/**
	 * {@inheritDoc}
	 * @since 2019/02/06
	 */
	@Override
	public boolean equals(Object __o)
	{
		if (__o == this)
			return true;
		
		if (!(__o instanceof VTableMemberReference))
			return false;
		
		VTableMemberReference o = (VTableMemberReference)__o;
		return this.isstatic == o.isstatic &&
			this.inclass.equals(o.inclass) &&
			this.membername.equals(o.membername) &&
			this.membertype.equals(o.membertype);
	}
	
	/**
	 * {@inheritDoc}
	 * @since 2019/02/06
	 */
	@Override
	public int hashCode()
	{
		return (this.isstatic ? 1 : 0) ^
			this.inclass.hashCode() ^
			this.membername.hashCode() ^
			this.membertype.hashCode();
	}
	
	/**
	 * {@inheritDoc}
	 * @since 2019/02/06
	 */
	@Override
	public String toString()
	{
		Reference<String> ref = this._string;
		String rv;
		
		if (ref == null || null == (rv = ref.get()))
			this._string = new WeakReference<>((rv = String.format(
				"%s %s::%s:%s", (this.isstatic ? "static" : "instance"),
				this.inclass, this.membername, this.membertype)));
		
		return rv;
	}
}