Compare commits
6 Commits
STLPORT_FU
...
jsmath_hen
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e50c7a6de8 | ||
|
|
0e59d9a6a0 | ||
|
|
ed2ac58da0 | ||
|
|
a9328119cb | ||
|
|
16be25fcbf | ||
|
|
b4d0709d23 |
@@ -1,44 +0,0 @@
|
||||
STLPORT = /usr/local/include/stlport
|
||||
|
||||
CC = gcc
|
||||
CFLAGS = -g -ggdb -DDEBUG -DXP_UNIX -Wall -W -Wpointer-arith \
|
||||
-Wbad-function-cast -Wstrict-prototypes -Wmissing-prototypes \
|
||||
-Wno-non-virtual-dtor -I$(STLPORT)
|
||||
|
||||
objs = hash.o \
|
||||
icodegenerator.o \
|
||||
interpreter.o \
|
||||
js2.o \
|
||||
jsmath.o \
|
||||
jstypes.o \
|
||||
numerics.o \
|
||||
parser.o \
|
||||
utilities.o \
|
||||
world.o \
|
||||
vmtypes.o \
|
||||
debugger.o
|
||||
|
||||
gc_path = ../../gc/boehm/
|
||||
|
||||
libs = gc.a -lstdc++ -lm
|
||||
|
||||
%.o : %.cpp
|
||||
$(CC) -c $(CFLAGS) $< -o $@
|
||||
|
||||
js2: $(objs) gc.a
|
||||
$(CC) -o $@ -ggdb $(objs) $(libs)
|
||||
|
||||
gc.a:
|
||||
(cd $(gc_path) ; ln -f -s Makefile.unix Makefile ; make gc.a)
|
||||
ln -f -s $(gc_path)gc.a ./gc.a
|
||||
|
||||
gctest: gc_allocator.o
|
||||
$(CC) -o $@ -ggdb $^ $(libs)
|
||||
|
||||
clean:
|
||||
rm -f $(objs)
|
||||
|
||||
depend:
|
||||
gcc -MM *.cpp > dependencies
|
||||
|
||||
include dependencies
|
||||
@@ -1,111 +0,0 @@
|
||||
# Microsoft Developer Studio Project File - Name="CPlusPlusTests" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Console Application" 0x0103
|
||||
|
||||
CFG=CPlusPlusTests - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "CPlusPlusTests.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "CPlusPlusTests.mak" CFG="CPlusPlusTests - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "CPlusPlusTests - Win32 Release" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE "CPlusPlusTests - Win32 Debug" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "CPlusPlusTests - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Release"
|
||||
# PROP BASE Intermediate_Dir "Release"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Release"
|
||||
# PROP Intermediate_Dir "Release"
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
||||
|
||||
!ELSEIF "$(CFG)" == "CPlusPlusTests - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "Debug"
|
||||
# PROP BASE Intermediate_Dir "Debug"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Debug"
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "CPlusPlusTests - Win32 Release"
|
||||
# Name "CPlusPlusTests - Win32 Debug"
|
||||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\cplusplustests.cpp
|
||||
|
||||
!IF "$(CFG)" == "CPlusPlusTests - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "CPlusPlusTests - Win32 Debug"
|
||||
|
||||
# ADD CPP /Ob1 /FR
|
||||
# SUBTRACT CPP /O<none> /YX
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# End Group
|
||||
# Begin Group "Resource Files"
|
||||
|
||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||
# End Group
|
||||
# End Target
|
||||
# End Project
|
||||
@@ -1,29 +0,0 @@
|
||||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "CPlusPlusTests"=.\CPlusPlusTests.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<3>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Binary file not shown.
@@ -1,129 +0,0 @@
|
||||
#include <cstddef>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <new>
|
||||
|
||||
using namespace std;
|
||||
|
||||
struct Arena {
|
||||
const char *name;
|
||||
|
||||
Arena(const char *name): name(name) {}
|
||||
};
|
||||
|
||||
|
||||
void *operator new(size_t size, Arena &arena);
|
||||
void operator delete(void *p);
|
||||
|
||||
void *operator new(size_t size, Arena &arena)
|
||||
{
|
||||
void *p = malloc(size);
|
||||
printf("Allocating %d bytes at %p using arena \"%s\"\n", size, p, arena.name);
|
||||
return p;
|
||||
}
|
||||
|
||||
#ifndef __MWERKS__
|
||||
void operator delete(void *p, Arena &arena)
|
||||
{
|
||||
printf("Deleting object at %p using arena \"%s\"\n", p, arena.name);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
void operator delete(void *p)
|
||||
{
|
||||
printf("Deleting object at %p\n", p);
|
||||
}
|
||||
|
||||
|
||||
struct C {
|
||||
int n;
|
||||
|
||||
C(int n, bool bad = false);
|
||||
~C();
|
||||
};
|
||||
|
||||
struct Exception {
|
||||
int num;
|
||||
|
||||
explicit Exception(int n): num(n) {}
|
||||
};
|
||||
|
||||
|
||||
C::C(int n, bool bad): n(n)
|
||||
{
|
||||
printf("Constructing C #%d at %p\n", n, this);
|
||||
if (bad) {
|
||||
printf("Throwing %d; constructor aborted\n", n);
|
||||
throw Exception(n);
|
||||
}
|
||||
}
|
||||
|
||||
C::~C()
|
||||
{
|
||||
printf("Destroying C #%d at %p\n", n, this);
|
||||
}
|
||||
|
||||
|
||||
static void constructorTest1(int n, bool bad)
|
||||
{
|
||||
try {
|
||||
printf("Calling C(%d,%d)\n", n, (int)bad);
|
||||
{
|
||||
C c(n, bad);
|
||||
printf("We have C #%d\n", c.n);
|
||||
}
|
||||
printf("C is out of scope\n");
|
||||
} catch (Exception &e) {
|
||||
printf("Caught exception %d\n", e.num);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
|
||||
static void constructorTest2(int n, bool bad)
|
||||
{
|
||||
try {
|
||||
printf("Calling new C(%d,%d)\n", n, (int)bad);
|
||||
{
|
||||
C *c = new C(n, bad);
|
||||
printf("We have C #%d\n", c->n);
|
||||
delete c;
|
||||
}
|
||||
printf("C is out of scope\n");
|
||||
} catch (Exception &e) {
|
||||
printf("Caught exception %d\n", e.num);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
|
||||
static void constructorTest3(int n, bool bad)
|
||||
{
|
||||
try {
|
||||
printf("Calling new(arena) C(%d,%d)\n", n, (int)bad);
|
||||
{
|
||||
Arena arena("My arena");
|
||||
C *c = new(arena) C(n, bad);
|
||||
printf("We have C #%d\n", c->n);
|
||||
}
|
||||
printf("C is out of scope\n");
|
||||
} catch (Exception &e) {
|
||||
printf("Caught exception %d\n", e.num);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
|
||||
int main()
|
||||
{
|
||||
printf("Beginning constructor tests\n\n");
|
||||
constructorTest1(1, false);
|
||||
constructorTest1(2, true);
|
||||
constructorTest2(3, false);
|
||||
constructorTest2(4, true);
|
||||
constructorTest3(5, false);
|
||||
constructorTest3(6, true);
|
||||
printf("Ending constructor tests\n");
|
||||
return 0;
|
||||
}
|
||||
@@ -1,191 +0,0 @@
|
||||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Mozilla Communicator client code, released
|
||||
* March 31, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
#ifndef cpucfg_h
|
||||
#define cpucfg_h
|
||||
|
||||
#define JS_HAVE_LONG_LONG
|
||||
|
||||
#ifdef XP_MAC
|
||||
#undef IS_LITTLE_ENDIAN
|
||||
#define IS_BIG_ENDIAN 1
|
||||
|
||||
#define JS_BYTES_PER_BYTE 1L
|
||||
#define JS_BYTES_PER_SHORT 2L
|
||||
#define JS_BYTES_PER_INT 4L
|
||||
#define JS_BYTES_PER_INT64 8L
|
||||
#define JS_BYTES_PER_LONG 4L
|
||||
#define JS_BYTES_PER_FLOAT 4L
|
||||
#define JS_BYTES_PER_DOUBLE 8L
|
||||
#define JS_BYTES_PER_WORD 4L
|
||||
#define JS_BYTES_PER_DWORD 8L
|
||||
|
||||
#define JS_BITS_PER_BYTE 8L
|
||||
#define JS_BITS_PER_SHORT 16L
|
||||
#define JS_BITS_PER_INT 32L
|
||||
#define JS_BITS_PER_INT64 64L
|
||||
#define JS_BITS_PER_LONG 32L
|
||||
#define JS_BITS_PER_FLOAT 32L
|
||||
#define JS_BITS_PER_DOUBLE 64L
|
||||
#define JS_BITS_PER_WORD 32L
|
||||
|
||||
#define JS_BITS_PER_BYTE_LOG2 3L
|
||||
#define JS_BITS_PER_SHORT_LOG2 4L
|
||||
#define JS_BITS_PER_INT_LOG2 5L
|
||||
#define JS_BITS_PER_INT64_LOG2 6L
|
||||
#define JS_BITS_PER_LONG_LOG2 5L
|
||||
#define JS_BITS_PER_FLOAT_LOG2 5L
|
||||
#define JS_BITS_PER_DOUBLE_LOG2 6L
|
||||
#define JS_BITS_PER_WORD_LOG2 5L
|
||||
|
||||
#define JS_ALIGN_OF_SHORT 2L
|
||||
#define JS_ALIGN_OF_INT 4L
|
||||
#define JS_ALIGN_OF_LONG 4L
|
||||
#define JS_ALIGN_OF_INT64 2L
|
||||
#define JS_ALIGN_OF_FLOAT 4L
|
||||
#define JS_ALIGN_OF_DOUBLE 4L
|
||||
#define JS_ALIGN_OF_POINTER 4L
|
||||
#define JS_ALIGN_OF_WORD 4L
|
||||
|
||||
#define JS_BYTES_PER_WORD_LOG2 2L
|
||||
#define JS_BYTES_PER_DWORD_LOG2 3L
|
||||
#define PR_WORDS_PER_DWORD_LOG2 1L
|
||||
|
||||
#elif defined(XP_PC)
|
||||
|
||||
#ifdef _WIN32
|
||||
#define IS_LITTLE_ENDIAN 1
|
||||
#undef IS_BIG_ENDIAN
|
||||
|
||||
#define JS_BYTES_PER_BYTE 1L
|
||||
#define JS_BYTES_PER_SHORT 2L
|
||||
#define JS_BYTES_PER_INT 4L
|
||||
#define JS_BYTES_PER_INT64 8L
|
||||
#define JS_BYTES_PER_LONG 4L
|
||||
#define JS_BYTES_PER_FLOAT 4L
|
||||
#define JS_BYTES_PER_DOUBLE 8L
|
||||
#define JS_BYTES_PER_WORD 4L
|
||||
#define JS_BYTES_PER_DWORD 8L
|
||||
|
||||
#define JS_BITS_PER_BYTE 8L
|
||||
#define JS_BITS_PER_SHORT 16L
|
||||
#define JS_BITS_PER_INT 32L
|
||||
#define JS_BITS_PER_INT64 64L
|
||||
#define JS_BITS_PER_LONG 32L
|
||||
#define JS_BITS_PER_FLOAT 32L
|
||||
#define JS_BITS_PER_DOUBLE 64L
|
||||
#define JS_BITS_PER_WORD 32L
|
||||
|
||||
#define JS_BITS_PER_BYTE_LOG2 3L
|
||||
#define JS_BITS_PER_SHORT_LOG2 4L
|
||||
#define JS_BITS_PER_INT_LOG2 5L
|
||||
#define JS_BITS_PER_INT64_LOG2 6L
|
||||
#define JS_BITS_PER_LONG_LOG2 5L
|
||||
#define JS_BITS_PER_FLOAT_LOG2 5L
|
||||
#define JS_BITS_PER_DOUBLE_LOG2 6L
|
||||
#define JS_BITS_PER_WORD_LOG2 5L
|
||||
|
||||
#define JS_ALIGN_OF_SHORT 2L
|
||||
#define JS_ALIGN_OF_INT 4L
|
||||
#define JS_ALIGN_OF_LONG 4L
|
||||
#define JS_ALIGN_OF_INT64 8L
|
||||
#define JS_ALIGN_OF_FLOAT 4L
|
||||
#define JS_ALIGN_OF_DOUBLE 4L
|
||||
#define JS_ALIGN_OF_POINTER 4L
|
||||
#define JS_ALIGN_OF_WORD 4L
|
||||
|
||||
#define JS_BYTES_PER_WORD_LOG2 2L
|
||||
#define JS_BYTES_PER_DWORD_LOG2 3L
|
||||
#define PR_WORDS_PER_DWORD_LOG2 1L
|
||||
#endif /* _WIN32 */
|
||||
|
||||
#if defined(_WINDOWS) && !defined(_WIN32) /* WIN16 */
|
||||
#define IS_LITTLE_ENDIAN 1
|
||||
#undef IS_BIG_ENDIAN
|
||||
|
||||
#define JS_BYTES_PER_BYTE 1L
|
||||
#define JS_BYTES_PER_SHORT 2L
|
||||
#define JS_BYTES_PER_INT 2L
|
||||
#define JS_BYTES_PER_INT64 8L
|
||||
#define JS_BYTES_PER_LONG 4L
|
||||
#define JS_BYTES_PER_FLOAT 4L
|
||||
#define JS_BYTES_PER_DOUBLE 8L
|
||||
#define JS_BYTES_PER_WORD 4L
|
||||
#define JS_BYTES_PER_DWORD 8L
|
||||
|
||||
#define JS_BITS_PER_BYTE 8L
|
||||
#define JS_BITS_PER_SHORT 16L
|
||||
#define JS_BITS_PER_INT 16L
|
||||
#define JS_BITS_PER_INT64 64L
|
||||
#define JS_BITS_PER_LONG 32L
|
||||
#define JS_BITS_PER_FLOAT 32L
|
||||
#define JS_BITS_PER_DOUBLE 64L
|
||||
#define JS_BITS_PER_WORD 32L
|
||||
|
||||
#define JS_BITS_PER_BYTE_LOG2 3L
|
||||
#define JS_BITS_PER_SHORT_LOG2 4L
|
||||
#define JS_BITS_PER_INT_LOG2 4L
|
||||
#define JS_BITS_PER_INT64_LOG2 6L
|
||||
#define JS_BITS_PER_LONG_LOG2 5L
|
||||
#define JS_BITS_PER_FLOAT_LOG2 5L
|
||||
#define JS_BITS_PER_DOUBLE_LOG2 6L
|
||||
#define JS_BITS_PER_WORD_LOG2 5L
|
||||
|
||||
#define JS_ALIGN_OF_SHORT 2L
|
||||
#define JS_ALIGN_OF_INT 2L
|
||||
#define JS_ALIGN_OF_LONG 2L
|
||||
#define JS_ALIGN_OF_INT64 2L
|
||||
#define JS_ALIGN_OF_FLOAT 2L
|
||||
#define JS_ALIGN_OF_DOUBLE 2L
|
||||
#define JS_ALIGN_OF_POINTER 2L
|
||||
#define JS_ALIGN_OF_WORD 2L
|
||||
|
||||
#define JS_BYTES_PER_WORD_LOG2 2L
|
||||
#define JS_BYTES_PER_DWORD_LOG2 3L
|
||||
#define PR_WORDS_PER_DWORD_LOG2 1L
|
||||
#endif /* defined(_WINDOWS) && !defined(_WIN32) */
|
||||
|
||||
#elif defined(XP_UNIX) || defined(XP_BEOS)
|
||||
|
||||
#error "This file is supposed to be auto-generated on UNIX platforms, but the"
|
||||
#error "static version for Mac and Windows platforms is being used."
|
||||
#error "Something's probably wrong with paths/headers/dependencies/Makefiles."
|
||||
|
||||
#else
|
||||
|
||||
#error "Must define one of XP_MAC, XP_PC, or XP_UNIX"
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -1,466 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the JavaScript 2 Prototype.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
#include "world.h"
|
||||
#include "debugger.h"
|
||||
|
||||
#include <string>
|
||||
#include <ctype.h>
|
||||
#include <assert.h>
|
||||
|
||||
namespace JavaScript {
|
||||
namespace Debugger {
|
||||
|
||||
using namespace Interpreter;
|
||||
|
||||
/* keep in sync with list in debugger.h */
|
||||
static const char *shell_cmds[][3] = {
|
||||
{"assemble", "", 0},
|
||||
{"ambiguous", "", "Test command for ambiguous command detection"},
|
||||
{"ambiguous2", "", "Test command for ambiguous command detection"},
|
||||
{"continue", "", "Continue execution until complete."},
|
||||
{"dissassemble", "[start_pc] [end_pc]", "Dissassemble entire module, or subset of module."},
|
||||
{"exit", "", 0},
|
||||
{"help", "", "Display this message."},
|
||||
{"istep", "", "Execute the current opcode and stop."},
|
||||
{"let", "", "Set a debugger environment variable."},
|
||||
{"print", "", 0},
|
||||
{"register", "", "(nyi) Show the value of a single register or all registers, or set the value of a single register."},
|
||||
{"step", "", "Execute the current JS statement and stop."},
|
||||
{0, 0} /* sentry */
|
||||
};
|
||||
|
||||
enum ShellVariable {
|
||||
TRACE_SOURCE,
|
||||
TRACE_ICODE,
|
||||
VARIABLE_COUNT
|
||||
};
|
||||
|
||||
static const char *shell_vars[][3] = {
|
||||
{"tracesource", "", "(bool) Show JS source while executing."},
|
||||
{"traceicode", " ", "(bool) Show opcodes while executing."},
|
||||
{0, 0} /* sentry */
|
||||
};
|
||||
|
||||
/* return true if str2 starts with/is str1
|
||||
* XXX ignore case */
|
||||
static bool
|
||||
startsWith (const String &str1, const String &str2)
|
||||
{
|
||||
uint n;
|
||||
size_t m = str1.size();
|
||||
|
||||
if (m > str2.size())
|
||||
return false;
|
||||
|
||||
for (n = 0; n < m; ++n)
|
||||
if (str1[n] != str2[n])
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* locate the best match for |partial| in the command list |list|.
|
||||
* if no matches are found, return |length|, if multiple matches are found,
|
||||
* return |length| plus the number of ambiguous matches
|
||||
*/
|
||||
static uint32
|
||||
matchElement (const String &partial, const char *list[][3], size_t length)
|
||||
{
|
||||
uint32 ambig_matches = 0;
|
||||
uint32 match = length;
|
||||
|
||||
for (uint32 i = 0; i < length ; ++i)
|
||||
{
|
||||
String possibleMatch (widenCString(list[i][0]));
|
||||
if (startsWith(partial, possibleMatch))
|
||||
{
|
||||
if (partial.size() == possibleMatch.size())
|
||||
{
|
||||
/* exact match */
|
||||
ambig_matches = 0;
|
||||
return i;
|
||||
}
|
||||
else if (match == COMMAND_COUNT) /* no match yet */
|
||||
match = i;
|
||||
else
|
||||
++ambig_matches; /* something already matched,
|
||||
* ambiguous command */
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (ambig_matches == 0)
|
||||
return match;
|
||||
else
|
||||
return length + ambig_matches;
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
showHelp(Formatter &out)
|
||||
{
|
||||
int i;
|
||||
|
||||
out << "JavaScript 2.0 Debugger Help...\n\n";
|
||||
|
||||
for (i = 0; shell_cmds[i][0] != 0; i++)
|
||||
{
|
||||
out << "Command : " << shell_cmds[i][0] << " " <<
|
||||
shell_cmds[i][1] << "\n";
|
||||
|
||||
if (shell_cmds[i][2])
|
||||
out << "Help : " << shell_cmds[i][2] << "\n";
|
||||
else
|
||||
out << "Help : (probably) Not Implemented.\n";
|
||||
}
|
||||
}
|
||||
|
||||
static uint32
|
||||
getClosestSourcePosForPC (Context *cx, InstructionIterator pc)
|
||||
{
|
||||
ICodeModule *iCode = cx->getICode();
|
||||
|
||||
if (iCode->mInstructionMap->begin() == iCode->mInstructionMap->end())
|
||||
return NotABanana;
|
||||
/*NOT_REACHED ("Instruction map is empty, waah.");*/
|
||||
|
||||
InstructionMap::iterator pos_iter =
|
||||
iCode->mInstructionMap->upper_bound (pc - iCode->its_iCode->begin());
|
||||
if (pos_iter != iCode->mInstructionMap->begin())
|
||||
--pos_iter;
|
||||
|
||||
return pos_iter->second;
|
||||
}
|
||||
|
||||
void
|
||||
Shell::showSourceAtPC (Context *cx, InstructionIterator pc)
|
||||
{
|
||||
if (!mResolveFileCallback)
|
||||
{
|
||||
mErr << "Source not available (Debugger was improperly initialized.)\n";
|
||||
return;
|
||||
}
|
||||
|
||||
ICodeModule *iCode = cx->getICode();
|
||||
|
||||
String fn = iCode->getFileName();
|
||||
const Reader *reader = mResolveFileCallback(fn);
|
||||
if (!reader)
|
||||
{
|
||||
mErr << "Source not available.\n";
|
||||
return;
|
||||
}
|
||||
|
||||
uint32 pos = getClosestSourcePosForPC(cx, pc);
|
||||
if (pos == NotABanana)
|
||||
{
|
||||
mErr << "Map is empty, cannot display source.\n";
|
||||
return;
|
||||
}
|
||||
|
||||
uint32 lineNum = reader->posToLineNum (pos);
|
||||
const char16 *lineBegin, *lineEnd;
|
||||
|
||||
uint32 lineStartPos = reader->getLine (lineNum, lineBegin, lineEnd);
|
||||
String sourceLine (lineBegin, lineEnd);
|
||||
|
||||
mOut << fn << ":" << lineNum << " " << sourceLine << "\n";
|
||||
|
||||
uint padding = fn.length() + (uint32)(lineNum / 10) + 3;
|
||||
uint i;
|
||||
|
||||
for (i = 0; i < padding; i++)
|
||||
mOut << " ";
|
||||
|
||||
padding = (pos - lineStartPos);
|
||||
for (i = 0; i < padding; i++)
|
||||
mOut << ".";
|
||||
|
||||
mOut << "^\n";
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
Shell::showOpAtPC(Context* cx, InstructionIterator pc)
|
||||
{
|
||||
ICodeModule *iCode = cx->getICode();
|
||||
|
||||
if ((pc < iCode->its_iCode->begin()) ||
|
||||
(pc >= iCode->its_iCode->end()))
|
||||
{
|
||||
mErr << "PC Out Of Range.";
|
||||
return;
|
||||
}
|
||||
|
||||
JSValues ®isters = cx->getRegisters();
|
||||
|
||||
printFormat(mOut, "trace [%02u:%04u]: ",
|
||||
iCode->mID, (pc - iCode->its_iCode->begin()));
|
||||
Instruction* i = *pc;
|
||||
stdOut << *i;
|
||||
if (i->op() != BRANCH && i->count() > 0) {
|
||||
mOut << " [";
|
||||
i->printOperands(stdOut, registers);
|
||||
mOut << "]\n";
|
||||
} else {
|
||||
mOut << '\n';
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Shell::listen(Context* cx, Context::Event event)
|
||||
{
|
||||
InstructionIterator pc = cx->getPC();
|
||||
|
||||
if (mTraceSource)
|
||||
showSourceAtPC (cx, pc);
|
||||
if (mTraceICode)
|
||||
showOpAtPC (cx, pc);
|
||||
|
||||
if (!(mStopMask & event))
|
||||
return;
|
||||
|
||||
if ((mLastCommand == STEP) && (mLastICodeID == cx->getICode()->mID) &&
|
||||
(mLastSourcePos == getClosestSourcePosForPC (cx, cx->getPC())))
|
||||
/* we're in source-step mode, and the source position hasn't
|
||||
* changed yet */
|
||||
return;
|
||||
|
||||
if (!mTraceSource && !mTraceICode)
|
||||
showSourceAtPC (cx, pc);
|
||||
|
||||
static String lastLine(widenCString("help\n"));
|
||||
String line;
|
||||
LineReader reader(mIn);
|
||||
|
||||
do {
|
||||
stdOut << "jsd";
|
||||
if (mLastCommand != COMMAND_COUNT)
|
||||
stdOut << " (" << shell_cmds[mLastCommand][0] << ") ";
|
||||
stdOut << "> ";
|
||||
|
||||
reader.readLine(line);
|
||||
|
||||
if (line[0] == uni::lf)
|
||||
line = lastLine;
|
||||
else
|
||||
lastLine = line;
|
||||
|
||||
} while (doCommand(cx, line));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* lex and execute the debugger command in |source|, return true if the
|
||||
* command does not require the script being debugged to continue (eg, ask
|
||||
* for more debugger input.)
|
||||
*/
|
||||
bool
|
||||
Shell::doCommand (Interpreter::Context *cx, const String &source)
|
||||
{
|
||||
Lexer lex (mWorld, source, widenCString("debugger console"), 0);
|
||||
const String *cmd;
|
||||
uint32 match;
|
||||
bool rv = true;
|
||||
|
||||
const Token &t = lex.get(true);
|
||||
|
||||
if (t.hasKind(Token::identifier))
|
||||
cmd = &(t.getIdentifier());
|
||||
else
|
||||
{
|
||||
mErr << "you idiot.\n";
|
||||
return true;
|
||||
}
|
||||
|
||||
match = matchElement (*cmd, shell_cmds, (size_t)COMMAND_COUNT);
|
||||
|
||||
if (match <= (uint32)COMMAND_COUNT)
|
||||
{
|
||||
switch ((ShellCommand)match)
|
||||
{
|
||||
case COMMAND_COUNT:
|
||||
mErr << "Unknown command '" << *cmd << "'.\n";
|
||||
break;
|
||||
|
||||
case AMBIGUOUS:
|
||||
case AMBIGUOUS2:
|
||||
mErr << "I pity the foogoo.\n";
|
||||
break;
|
||||
|
||||
case CONTINUE:
|
||||
mStopMask &= (Context::EV_ALL ^ Context::EV_STEP);
|
||||
rv = false;
|
||||
break;
|
||||
|
||||
case DISSASSEMBLE:
|
||||
mOut << *cx->getICode();
|
||||
break;
|
||||
|
||||
case HELP:
|
||||
showHelp (mOut);
|
||||
break;
|
||||
|
||||
case PRINT:
|
||||
doPrint (cx, lex);
|
||||
break;
|
||||
|
||||
case STEP:
|
||||
mStopMask |= Context::EV_STEP;
|
||||
rv = false;
|
||||
break;
|
||||
|
||||
case LET:
|
||||
doSetVariable (lex);
|
||||
break;
|
||||
|
||||
default:
|
||||
mErr << "Input '" << *cmd << "' matched unimplemented " <<
|
||||
"command '" << shell_cmds[match][0] << "'.\n";
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
mLastSourcePos = getClosestSourcePosForPC (cx, cx->getPC());
|
||||
mLastICodeID = cx->getICode()->mID;
|
||||
mLastCommand = (ShellCommand)match;
|
||||
|
||||
} else
|
||||
mErr << "Ambiguous command '" << *cmd << "', " <<
|
||||
(match - (uint32)COMMAND_COUNT + 1) << " similar commands.\n";
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void
|
||||
Shell::doSetVariable (Lexer &lex)
|
||||
{
|
||||
uint32 match;
|
||||
const String *varname;
|
||||
const Token *t = &(lex.get(true));
|
||||
|
||||
if (t->hasKind(Token::identifier))
|
||||
varname = &(t->getIdentifier());
|
||||
else
|
||||
{
|
||||
mErr << "invalid variable name.\n";
|
||||
return;
|
||||
}
|
||||
|
||||
match = matchElement (*varname, shell_vars, (size_t)VARIABLE_COUNT);
|
||||
|
||||
if (match <= (uint32)VARIABLE_COUNT)
|
||||
switch ((ShellVariable)match)
|
||||
{
|
||||
case VARIABLE_COUNT:
|
||||
mErr << "Unknown variable '" << *varname << "'.\n";
|
||||
break;
|
||||
|
||||
case TRACE_SOURCE:
|
||||
t = &(lex.get(true));
|
||||
if (t->hasKind(Token::assignment))
|
||||
t = &(lex.get(true)); /* optional = */
|
||||
|
||||
if (t->hasKind(Token::True))
|
||||
mTraceSource = true;
|
||||
else if (t->hasKind(Token::False))
|
||||
mTraceSource = false;
|
||||
else
|
||||
goto badval;
|
||||
break;
|
||||
|
||||
case TRACE_ICODE:
|
||||
t = &(lex.get(true));
|
||||
if (t->hasKind(Token::assignment))
|
||||
t = &(lex.get(true)); /* optional = */
|
||||
|
||||
if (t->hasKind(Token::True))
|
||||
mTraceICode = true;
|
||||
else if (t->hasKind(Token::False))
|
||||
mTraceICode = false;
|
||||
else
|
||||
goto badval;
|
||||
break;
|
||||
|
||||
default:
|
||||
mErr << "Variable '" << *varname <<
|
||||
"' matched unimplemented variable '" <<
|
||||
shell_vars[match][0] << "'.\n";
|
||||
}
|
||||
else
|
||||
mErr << "Ambiguous variable '" << *varname << "', " <<
|
||||
(match - (uint32)COMMAND_COUNT + 1) << " similar variables.\n";
|
||||
|
||||
return;
|
||||
|
||||
badval:
|
||||
mErr << "Invalid value for variable '" <<
|
||||
shell_vars[(ShellVariable)match][0] << "'\n";
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
Shell::doPrint (Context *, Lexer &lex)
|
||||
{
|
||||
const Token *t = &(lex.get(true));
|
||||
|
||||
if (!(t->hasKind(Token::identifier)))
|
||||
{
|
||||
mErr << "Invalid register name.\n";
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
const StringAtom *name = &(t->getIdentifier());
|
||||
|
||||
VariableMap::iterator i = ((cx->getICode())->itsVariables)->find(*name);
|
||||
// if (i)
|
||||
mOut << (*i).first << " = " << (*i).second << "\n";
|
||||
// else
|
||||
// mOut << "No " << *name << " defined.\n";
|
||||
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
} /* namespace Debugger */
|
||||
} /* namespace JavaScript */
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,163 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the JavaScript 2 Prototype.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
/* this is all vapor, don't take it to serious yet */
|
||||
|
||||
#ifndef debugger_h
|
||||
#define debugger_h
|
||||
|
||||
#include "utilities.h"
|
||||
#include "interpreter.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
namespace JavaScript {
|
||||
namespace Debugger {
|
||||
|
||||
using namespace Interpreter;
|
||||
|
||||
class Shell;
|
||||
|
||||
typedef const Reader *ResolveFileCallback (const String &fileName);
|
||||
typedef bool DebuggerCommandCallback (Shell &debugger, const Lexer &lex);
|
||||
|
||||
class Breakpoint {
|
||||
public:
|
||||
/* representation of a breakpoint */
|
||||
void set();
|
||||
void clear();
|
||||
bool getState();
|
||||
InstructionIterator getPC();
|
||||
};
|
||||
|
||||
struct DebuggerCommand
|
||||
{
|
||||
DebuggerCommand(String aName, String aParamDesc, String aShortHelp,
|
||||
String aLongHelp = widenCString("No more help available."),
|
||||
DebuggerCommandCallback *aCommandFunction = 0)
|
||||
: mName(aName), mParamDesc(aParamDesc), mShortHelp(aShortHelp),
|
||||
mLongHelp(aLongHelp), mCommandFunction(aCommandFunction) {}
|
||||
|
||||
String mName;
|
||||
String mParamDesc;
|
||||
String mShortHelp;
|
||||
String mLongHelp;
|
||||
DebuggerCommandCallback *mCommandFunction;
|
||||
};
|
||||
|
||||
/* keep in sync with list in debugger.cpp */
|
||||
enum ShellCommand {
|
||||
ASSEMBLE,
|
||||
AMBIGUOUS,
|
||||
AMBIGUOUS2,
|
||||
CONTINUE,
|
||||
DISSASSEMBLE,
|
||||
EXIT,
|
||||
HELP,
|
||||
ISTEP,
|
||||
LET,
|
||||
PRINT,
|
||||
REGISTER,
|
||||
STEP,
|
||||
COMMAND_COUNT
|
||||
};
|
||||
|
||||
class Shell : public Context::Listener {
|
||||
public:
|
||||
Shell (World &aWorld, FILE *aIn, Formatter &aOut, Formatter &aErr,
|
||||
ResolveFileCallback *aCallback = 0) :
|
||||
mWorld(aWorld), mIn(aIn), mOut(aOut), mErr(aErr),
|
||||
mResolveFileCallback(aCallback), mStopMask(Context::EV_DEBUG),
|
||||
mTraceSource(false), mTraceICode(false), mLastSourcePos(0),
|
||||
mLastICodeID(NotABanana), mLastCommand(COMMAND_COUNT)
|
||||
{
|
||||
}
|
||||
|
||||
~Shell ()
|
||||
{
|
||||
}
|
||||
|
||||
ResolveFileCallback
|
||||
*setResolveFileCallback (ResolveFileCallback *aCallback)
|
||||
{
|
||||
ResolveFileCallback *rv = mResolveFileCallback;
|
||||
mResolveFileCallback = aCallback;
|
||||
return rv;
|
||||
}
|
||||
|
||||
void listen(Context *context, Context::Event event);
|
||||
|
||||
/**
|
||||
* install on a context
|
||||
*/
|
||||
bool attachToContext (Context *aContext)
|
||||
{
|
||||
aContext->addListener (this);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* detach an icdebugger from a context
|
||||
*/
|
||||
bool detachFromContext (Context *aContext)
|
||||
{
|
||||
aContext->removeListener (this);
|
||||
return true;
|
||||
}
|
||||
|
||||
FILE *getIStream() { return mIn; }
|
||||
Formatter &getOStream() { return mOut; }
|
||||
Formatter &getEStream() { return mErr; }
|
||||
|
||||
private:
|
||||
bool doCommand (Context *cx, const String &aSource);
|
||||
void doSetVariable (Lexer &lex);
|
||||
void doPrint (Context *cx, Lexer &lex);
|
||||
|
||||
void showOpAtPC(Context* cx, InstructionIterator pc);
|
||||
void showSourceAtPC(Context* cx, InstructionIterator pc);
|
||||
|
||||
World &mWorld;
|
||||
FILE *mIn;
|
||||
Formatter &mOut, &mErr;
|
||||
ResolveFileCallback *mResolveFileCallback;
|
||||
uint32 mStopMask;
|
||||
bool mTraceSource, mTraceICode;
|
||||
uint32 mLastSourcePos, mLastICodeID;
|
||||
ShellCommand mLastCommand;
|
||||
};
|
||||
|
||||
} /* namespace Debugger */
|
||||
} /* namespace JavaScript */
|
||||
|
||||
#endif /* debugger_h */
|
||||
@@ -1,26 +0,0 @@
|
||||
debugger.o: debugger.cpp world.h utilities.h systemtypes.h hash.h \
|
||||
parser.h debugger.h interpreter.h jstypes.h gc_allocator.h vmtypes.h \
|
||||
numerics.h jsclasses.h icode.h icodegenerator.h
|
||||
gc_allocator.o: gc_allocator.cpp gc_allocator.h gc_container.h
|
||||
hash.o: hash.cpp hash.h utilities.h systemtypes.h
|
||||
icodegenerator.o: icodegenerator.cpp numerics.h utilities.h \
|
||||
systemtypes.h world.h hash.h parser.h vmtypes.h jstypes.h \
|
||||
gc_allocator.h jsclasses.h icode.h icodegenerator.h interpreter.h
|
||||
interpreter.o: interpreter.cpp interpreter.h utilities.h systemtypes.h \
|
||||
jstypes.h gc_allocator.h vmtypes.h numerics.h jsclasses.h world.h \
|
||||
hash.h parser.h icode.h icodegenerator.h jsmath.h
|
||||
js2.o: js2.cpp world.h utilities.h systemtypes.h hash.h parser.h \
|
||||
interpreter.h jstypes.h gc_allocator.h vmtypes.h numerics.h \
|
||||
jsclasses.h icode.h icodegenerator.h debugger.h
|
||||
jsmath.o: jsmath.cpp jsmath.h jstypes.h utilities.h systemtypes.h \
|
||||
gc_allocator.h
|
||||
jstypes.o: jstypes.cpp jstypes.h utilities.h systemtypes.h \
|
||||
gc_allocator.h jsclasses.h numerics.h icodegenerator.h parser.h \
|
||||
vmtypes.h world.h hash.h icode.h
|
||||
numerics.o: numerics.cpp numerics.h utilities.h systemtypes.h
|
||||
parser.o: parser.cpp numerics.h utilities.h systemtypes.h parser.h \
|
||||
world.h hash.h
|
||||
utilities.o: utilities.cpp utilities.h systemtypes.h
|
||||
vmtypes.o: vmtypes.cpp utilities.h systemtypes.h vmtypes.h numerics.h \
|
||||
jstypes.h gc_allocator.h jsclasses.h world.h hash.h parser.h icode.h
|
||||
world.o: world.cpp world.h utilities.h systemtypes.h hash.h parser.h
|
||||
@@ -1,150 +0,0 @@
|
||||
// -*- Mode: C++; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*-
|
||||
//
|
||||
// The contents of this file are subject to the Netscape Public
|
||||
// License Version 1.1 (the "License"); you may not use this file
|
||||
// except in compliance with the License. You may obtain a copy of
|
||||
// the License at http://www.mozilla.org/NPL/
|
||||
//
|
||||
// Software distributed under the License is distributed on an "AS
|
||||
// IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
||||
// implied. See the License for the specific language governing
|
||||
// rights and limitations under the License.
|
||||
//
|
||||
// The Original Code is the JavaScript 2 Prototype.
|
||||
//
|
||||
// The Initial Developer of the Original Code is Netscape
|
||||
// Communications Corporation. Portions created by Netscape are
|
||||
// Copyright (C) 2000 Netscape Communications Corporation. All
|
||||
// Rights Reserved.
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
|
||||
#include "gc_allocator.h"
|
||||
#include "gc_container.h"
|
||||
|
||||
/*
|
||||
namespace JavaScript {
|
||||
|
||||
template <class T>
|
||||
typename gc_allocator<T>::pointer
|
||||
gc_allocator<T>::allocate(gc_allocator<T>::size_type n, const void*)
|
||||
{
|
||||
return static_cast<pointer>(GC_malloc(n*sizeof(T)));
|
||||
}
|
||||
|
||||
template <class T>
|
||||
void gc_allocator<T>::deallocate(gc_allocator<T>::pointer ptr, gc_allocator<T>::size_type)
|
||||
{
|
||||
// this can really be a NO-OP with the GC.
|
||||
// ::GC_free(static_cast<void*>(ptr));
|
||||
}
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
// test driver for standalone GC development.
|
||||
|
||||
namespace JS = JavaScript;
|
||||
|
||||
template <class T>
|
||||
void* operator new(std::size_t, const JS::gc_allocator<T>& alloc)
|
||||
{
|
||||
return alloc.allocate(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Define a C++ class that is garbage collectable, and wants to have its destructor
|
||||
* called when it is finalized.
|
||||
*/
|
||||
class A {
|
||||
public:
|
||||
typedef JS::gc_traits_finalizable<A> traits;
|
||||
typedef JS::gc_allocator<A, traits> allocator;
|
||||
friend struct traits;
|
||||
|
||||
static int instances;
|
||||
|
||||
void* operator new(std::size_t)
|
||||
{
|
||||
return allocator::allocate(1);
|
||||
}
|
||||
|
||||
A()
|
||||
{
|
||||
++instances;
|
||||
std::cout << "A::A() here." << std::endl;
|
||||
}
|
||||
|
||||
protected:
|
||||
~A()
|
||||
{
|
||||
--instances;
|
||||
std::cout << "A::~A() here." << std::endl;
|
||||
}
|
||||
|
||||
private:
|
||||
// void operator delete(void*) {}
|
||||
};
|
||||
|
||||
int A::instances = 0;
|
||||
|
||||
int main(int /* argc */, char* /* argv[] */)
|
||||
{
|
||||
using namespace std;
|
||||
using namespace JS;
|
||||
|
||||
cout << "testing the GC allocator." << endl;
|
||||
|
||||
#ifdef XP_MAC
|
||||
// allocate a string, using the GC, and owned by an auto_ptr, that knows how to correctly destroy the string.
|
||||
typedef gc_container<char>::string char_string;
|
||||
typedef gc_allocator<char_string> char_string_alloc;
|
||||
auto_ptr<char_string, char_string_alloc> ptr(new(char_string_alloc()) char_string("This is a garbage collectable string."));
|
||||
const char_string& str = *ptr;
|
||||
cout << str << endl;
|
||||
#endif
|
||||
|
||||
// question, how can we partially evaluate a template?
|
||||
// can we say, typedef template <class T> vector<typename T>.
|
||||
// typedef vector<int, gc_allocator<int> > int_vector;
|
||||
typedef gc_container<int>::vector int_vector;
|
||||
|
||||
// generate 1000 random values.
|
||||
int_vector values;
|
||||
for (int i = 0; i < 1000; ++i) {
|
||||
int value = rand() % 32767;
|
||||
values.push_back(value);
|
||||
// allocate a random amount of garbage.
|
||||
if (!GC_malloc(static_cast<size_t>(value)))
|
||||
cerr << "GC_malloc failed." << endl;
|
||||
// allocate an object that has a finalizer to call its destructor.
|
||||
A* a = new A();
|
||||
}
|
||||
|
||||
// run a collection.
|
||||
// gc_allocator<void>::collect();
|
||||
GC_gcollect();
|
||||
|
||||
// print out instance count.
|
||||
cout << "A::instances = " << A::instances << endl;
|
||||
|
||||
// sort the values.
|
||||
sort(values.begin(), values.end());
|
||||
|
||||
// print the values.
|
||||
int_vector::iterator iter = values.begin(), last = values.end();
|
||||
cout << *iter++;
|
||||
while (iter < last)
|
||||
cout << ' ' << *iter++;
|
||||
cout << endl;
|
||||
|
||||
#ifdef XP_MAC
|
||||
// finally, print the string again.
|
||||
cout << str << endl;
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,178 +0,0 @@
|
||||
// -*- Mode: C++; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*-
|
||||
//
|
||||
// The contents of this file are subject to the Netscape Public
|
||||
// License Version 1.1 (the "License"); you may not use this file
|
||||
// except in compliance with the License. You may obtain a copy of
|
||||
// the License at http://www.mozilla.org/NPL/
|
||||
//
|
||||
// Software distributed under the License is distributed on an "AS
|
||||
// IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
||||
// implied. See the License for the specific language governing
|
||||
// rights and limitations under the License.
|
||||
//
|
||||
// The Original Code is the JavaScript 2 Prototype.
|
||||
//
|
||||
// The Initial Developer of the Original Code is Netscape
|
||||
// Communications Corporation. Portions created by Netscape are
|
||||
// Copyright (C) 2000 Netscape Communications Corporation. All
|
||||
// Rights Reserved.
|
||||
|
||||
#ifndef gc_allocator_h
|
||||
#define gc_allocator_h
|
||||
|
||||
#include <memory>
|
||||
|
||||
#ifndef _WIN32 // Microsoft VC6 bug: standard identifiers should be in std namespace
|
||||
using std::size_t;
|
||||
using std::ptrdiff_t;
|
||||
#endif
|
||||
|
||||
namespace JavaScript {
|
||||
extern "C" {
|
||||
void* GC_malloc(size_t bytes);
|
||||
void* GC_malloc_atomic(size_t bytes);
|
||||
void GC_free(void* ptr);
|
||||
void GC_gcollect(void);
|
||||
|
||||
typedef void (*GC_finalization_proc) (void* obj, void* client_data);
|
||||
void GC_register_finalizer(void* obj, GC_finalization_proc proc, void* client_data,
|
||||
GC_finalization_proc *old_proc, void* *old_client_data);
|
||||
}
|
||||
|
||||
#if 0 && !defined(XP_MAC)
|
||||
// for platforms where GC doesn't exist yet.
|
||||
inline void* GC_malloc(size_t bytes) { return ::operator new(bytes); }
|
||||
inline void* GC_malloc_atomic(size_t bytes) { return ::operator new(bytes); }
|
||||
inline void GC_free(void* ptr) { operator delete(ptr); }
|
||||
inline void GC_gcollect() {}
|
||||
inline void GC_register_finalizer(void* obj, GC_finalization_proc proc, void* client_data,
|
||||
GC_finalization_proc *old_proc, void* *old_client_data) {}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* General case: memory for type must be allocated as a conservatively
|
||||
* scanned block of memory.
|
||||
*/
|
||||
template <class T> struct gc_traits {
|
||||
static T* allocate(size_t n) { return static_cast<T*>(GC_malloc(n * sizeof(T))); }
|
||||
};
|
||||
|
||||
/**
|
||||
* Specializations for blocks of atomic types: the macro define_atomic_type(_type)
|
||||
* specializes gc_traits<T> for types that need not be scanned by the
|
||||
* GC. Implementors are free to define other types as atomic, if they are
|
||||
* guaranteed not to contain pointers.
|
||||
*/
|
||||
#define define_atomic_type(_type) \
|
||||
template <> struct gc_traits<_type> { \
|
||||
static _type* allocate(size_t n) \
|
||||
{ \
|
||||
return static_cast<_type*>(GC_malloc_atomic(n * sizeof(_type))); \
|
||||
} \
|
||||
};
|
||||
|
||||
define_atomic_type(char)
|
||||
define_atomic_type(unsigned char)
|
||||
define_atomic_type(short)
|
||||
define_atomic_type(unsigned short)
|
||||
define_atomic_type(int)
|
||||
define_atomic_type(unsigned int)
|
||||
define_atomic_type(long)
|
||||
define_atomic_type(unsigned long)
|
||||
define_atomic_type(float)
|
||||
define_atomic_type(double)
|
||||
|
||||
#undef define_atomic_type
|
||||
|
||||
/**
|
||||
* Traits for classes that need to have their destructor called
|
||||
* when reclaimed by the garbage collector.
|
||||
*/
|
||||
template <class T> struct gc_traits_finalizable {
|
||||
static void finalizer(void* obj, void* client_data)
|
||||
{
|
||||
T* t = static_cast<T*>(obj);
|
||||
size_t n = reinterpret_cast<size_t>(client_data);
|
||||
for (size_t i = 0; i < n; ++i)
|
||||
t[i].~T();
|
||||
}
|
||||
|
||||
static T* allocate(size_t n)
|
||||
{
|
||||
T* t = gc_traits<T>::allocate(n);
|
||||
GC_finalization_proc old_proc; void* old_client_data;
|
||||
GC_register_finalizer(t, &finalizer, reinterpret_cast<void*>(n), &old_proc, &old_client_data);
|
||||
return t;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* An allocator that can be used to allocate objects in the garbage collected heap.
|
||||
*/
|
||||
template <class T, class traits = gc_traits<T> > class gc_allocator {
|
||||
public:
|
||||
typedef T value_type;
|
||||
typedef size_t size_type;
|
||||
typedef ptrdiff_t difference_type;
|
||||
typedef T *pointer;
|
||||
typedef const T *const_pointer;
|
||||
typedef T &reference;
|
||||
typedef const T &const_reference;
|
||||
|
||||
gc_allocator() {}
|
||||
template<typename U, typename UTraits> gc_allocator(const gc_allocator<U, UTraits>&) {}
|
||||
// ~gc_allocator() {}
|
||||
|
||||
static pointer address(reference r) { return &r; }
|
||||
static const_pointer address(const_reference r) { return &r; }
|
||||
|
||||
static pointer allocate(size_type n, const void* /* hint */ = 0) { return traits::allocate(n); }
|
||||
static void deallocate(pointer, size_type) {}
|
||||
|
||||
static void construct(pointer p, const T &val) { new(p) T(val);}
|
||||
static void destroy(pointer p) { p->~T(); }
|
||||
|
||||
#if defined(__GNUC__) || defined(_WIN32)
|
||||
static size_type max_size() { return size_type(-1) / sizeof(T); }
|
||||
#else
|
||||
static size_type max_size() { return std::numeric_limits<size_type>::max() / sizeof(T); }
|
||||
#endif
|
||||
|
||||
template<class U> struct rebind { typedef gc_allocator<U> other; };
|
||||
|
||||
#ifdef _WIN32
|
||||
// raw byte allocator used on some platforms (grrr).
|
||||
typedef char _Char[1];
|
||||
static char* _Charalloc(size_type n) { return (char*) rebind<_Char>::other::allocate(n); }
|
||||
|
||||
// funky operator required for calling basic_string<T> constructor (grrr).
|
||||
template<typename U, typename UTraits> int operator==(const gc_allocator<U, UTraits>&) { return 0; }
|
||||
#endif
|
||||
|
||||
// void* deallocate used on some platforms (grrr).
|
||||
static void deallocate(void*, size_type) {}
|
||||
|
||||
static void collect() { GC_gcollect(); }
|
||||
};
|
||||
|
||||
/**
|
||||
* Generic base class for objects allocated using a gc_allocator. How they are allocated
|
||||
* can be controlled by specializing gc_traits for the specific class.
|
||||
*/
|
||||
template <typename T> class gc_object {
|
||||
public:
|
||||
void* operator new(size_t) { return gc_allocator<T>::allocate(1, 0); }
|
||||
void operator delete(void* /* ptr */) {}
|
||||
};
|
||||
|
||||
/**
|
||||
* Simpler base class for classes that have no need to specialize allocation behavior.
|
||||
*/
|
||||
class gc_base {
|
||||
public:
|
||||
void* operator new(size_t n) { return GC_malloc(n); }
|
||||
void operator delete(void*) {}
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* gc_allocator_h */
|
||||
@@ -1,71 +0,0 @@
|
||||
// -*- Mode: C++; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*-
|
||||
//
|
||||
// The contents of this file are subject to the Netscape Public
|
||||
// License Version 1.1 (the "License"); you may not use this file
|
||||
// except in compliance with the License. You may obtain a copy of
|
||||
// the License at http://www.mozilla.org/NPL/
|
||||
//
|
||||
// Software distributed under the License is distributed on an "AS
|
||||
// IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
||||
// implied. See the License for the specific language governing
|
||||
// rights and limitations under the License.
|
||||
//
|
||||
// The Original Code is the JavaScript 2 Prototype.
|
||||
//
|
||||
// The Initial Developer of the Original Code is Netscape
|
||||
// Communications Corporation. Portions created by Netscape are
|
||||
// Copyright (C) 2000 Netscape Communications Corporation. All
|
||||
// Rights Reserved.
|
||||
|
||||
#ifndef gc_container_h
|
||||
#define gc_container_h
|
||||
|
||||
#include "gc_allocator.h"
|
||||
|
||||
#include <list>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
#define LIST std::list
|
||||
#define VECTOR std::vector
|
||||
|
||||
#if defined(__GNUC__)
|
||||
// grr, what kind of standard is this?
|
||||
#define STRING basic_string
|
||||
#define CHAR_TRAITS string_char_traits
|
||||
#else
|
||||
#define STRING std::basic_string
|
||||
#define CHAR_TRAITS std::char_traits
|
||||
#endif
|
||||
|
||||
namespace JavaScript {
|
||||
/**
|
||||
* Rebind some of the basic container types to use a GC_allocator.
|
||||
* What I really want is something more general, something like:
|
||||
* template <typename Container, typename T> class gc_rebind {
|
||||
* typedef typename Container<T, gc_allocator<T> > other;
|
||||
* };
|
||||
* But I can't figure out how to do that with C++ templates.
|
||||
*/
|
||||
template <class T> struct gc_container {
|
||||
typedef typename LIST<T, gc_allocator<T> > list;
|
||||
typedef typename VECTOR<T, gc_allocator<T> > vector;
|
||||
typedef typename STRING<T, CHAR_TRAITS<T>, gc_allocator<T> > string;
|
||||
};
|
||||
|
||||
/**
|
||||
* But, it's pretty easy to do with macros:
|
||||
*/
|
||||
#define GC_CONTAINER(container, type) container<T, gc_allocator<T> >
|
||||
|
||||
/*
|
||||
// this gives an "unimplemented C++ feature" error using CWPro5.
|
||||
// maybe someday.
|
||||
template <template<class, class> typename Container, typename T>
|
||||
struct gc_rebind {
|
||||
typedef typename Container<T, gc_allocator<T> > container;
|
||||
};
|
||||
*/
|
||||
}
|
||||
|
||||
#endif /* gc_container_h */
|
||||
@@ -1,173 +0,0 @@
|
||||
// -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
//
|
||||
// The contents of this file are subject to the Netscape Public
|
||||
// License Version 1.1 (the "License"); you may not use this file
|
||||
// except in compliance with the License. You may obtain a copy of
|
||||
// the License at http://www.mozilla.org/NPL/
|
||||
//
|
||||
// Software distributed under the License is distributed on an "AS
|
||||
// IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
||||
// implied. See the License for the specific language governing
|
||||
// rights and limitations under the License.
|
||||
//
|
||||
// The Original Code is the JavaScript 2 Prototype.
|
||||
//
|
||||
// The Initial Developer of the Original Code is Netscape
|
||||
// Communications Corporation. Portions created by Netscape are
|
||||
// Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
// Rights Reserved.
|
||||
|
||||
#include "hash.h"
|
||||
#include <new>
|
||||
namespace JS = JavaScript;
|
||||
|
||||
|
||||
//
|
||||
// Hash Codes
|
||||
//
|
||||
|
||||
|
||||
// General-purpose null-terminated C string hash function
|
||||
JS::HashNumber JS::hashString(const char *s)
|
||||
{
|
||||
HashNumber h = 0;
|
||||
uchar ch;
|
||||
|
||||
while ((ch = (uchar)*s++) != 0)
|
||||
h = (h >> 28) ^ (h << 4) ^ ch;
|
||||
return h;
|
||||
}
|
||||
|
||||
|
||||
// General-purpose String hash function
|
||||
JS::HashNumber JS::hashString(const String &s)
|
||||
{
|
||||
HashNumber h = 0;
|
||||
String::const_iterator p = s.begin();
|
||||
String::size_type n = s.size();
|
||||
|
||||
if (n < 16)
|
||||
// Hash every character in a short string.
|
||||
while (n--)
|
||||
h = (h >> 28) ^ (h << 4) ^ *p++;
|
||||
else
|
||||
// Sample a la java.lang.String.hash().
|
||||
for (String::size_type m = n / 8; n >= m; p += m, n -= m)
|
||||
h = (h >> 28) ^ (h << 4) ^ *p;
|
||||
return h;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Hash Tables
|
||||
//
|
||||
|
||||
|
||||
const uint minLgNBuckets = 4;
|
||||
|
||||
|
||||
JS::GenericHashTableIterator::GenericHashTableIterator(GenericHashTable &ht):
|
||||
ht(ht), entry(0), nextBucket(ht.buckets)
|
||||
{
|
||||
DEBUG_ONLY(++ht.nReferences);
|
||||
operator++();
|
||||
}
|
||||
|
||||
|
||||
|
||||
JS::GenericHashTableIterator &
|
||||
JS::GenericHashTableIterator::operator++()
|
||||
{
|
||||
GenericHashEntry *e = entry;
|
||||
|
||||
if (e) {
|
||||
backpointer = &e->next;
|
||||
e = e->next;
|
||||
}
|
||||
if (!e) {
|
||||
GenericHashEntry **const bucketsEnd = ht.bucketsEnd;
|
||||
GenericHashEntry **bucket = nextBucket;
|
||||
|
||||
while (bucket != bucketsEnd) {
|
||||
e = *bucket++;
|
||||
if (e) {
|
||||
backpointer = bucket-1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
nextBucket = bucket;
|
||||
}
|
||||
entry = e;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
JS::GenericHashTable::GenericHashTable(uint32 nEntriesDefault):
|
||||
nEntries(0)
|
||||
{
|
||||
DEBUG_ONLY(nReferences = 0);
|
||||
|
||||
uint lgNBuckets = ceilingLog2(nEntriesDefault);
|
||||
if (lgNBuckets < minLgNBuckets)
|
||||
lgNBuckets = minLgNBuckets;
|
||||
defaultLgNBuckets = lgNBuckets;
|
||||
|
||||
recomputeMinMaxNEntries(lgNBuckets);
|
||||
uint32 nBuckets = JS_BIT(lgNBuckets);
|
||||
buckets = new GenericHashEntry*[nBuckets];
|
||||
// No exceptions after this point unless buckets is deleted.
|
||||
|
||||
bucketsEnd = buckets + nBuckets;
|
||||
zero(buckets, bucketsEnd);
|
||||
}
|
||||
|
||||
|
||||
// Initialize shift, minNEntries, and maxNEntries based on the lg2 of the
|
||||
// number of buckets.
|
||||
void JS::GenericHashTable::recomputeMinMaxNEntries(uint lgNBuckets)
|
||||
{
|
||||
uint32 nBuckets = JS_BIT(lgNBuckets);
|
||||
shift = 32 - lgNBuckets;
|
||||
maxNEntries = nBuckets; // Maximum ratio is 100%
|
||||
minNEntries = lgNBuckets <= defaultLgNBuckets ? 0 : 3*(nBuckets>>3); // Minimum ratio is 37.5%
|
||||
}
|
||||
|
||||
|
||||
// Rehash the table. This method cannot throw out-of-memory exceptions, so it is
|
||||
// safe to call from a destructor.
|
||||
void JS::GenericHashTable::rehash()
|
||||
{
|
||||
uint32 newLgNBuckets = ceilingLog2(nEntries);
|
||||
if (newLgNBuckets < defaultLgNBuckets)
|
||||
newLgNBuckets = defaultLgNBuckets;
|
||||
uint32 newNBuckets = JS_BIT(newLgNBuckets);
|
||||
try {
|
||||
GenericHashEntry **newBuckets = new GenericHashEntry*[newNBuckets];
|
||||
// No exceptions after this point.
|
||||
|
||||
GenericHashEntry **newBucketsEnd = newBuckets + newNBuckets;
|
||||
zero(newBuckets, newBucketsEnd);
|
||||
recomputeMinMaxNEntries(newLgNBuckets);
|
||||
GenericHashEntry **be = bucketsEnd;
|
||||
for (GenericHashEntry **b = buckets; b != be; b++) {
|
||||
GenericHashEntry *e = *b;
|
||||
while (e) {
|
||||
GenericHashEntry *next = e->next;
|
||||
// Place e in the new set of buckets.
|
||||
GenericHashEntry **nb = newBuckets + (e->keyHash*goldenRatio >> shift);
|
||||
e->next = *nb;
|
||||
*nb = e;
|
||||
e = next;
|
||||
}
|
||||
}
|
||||
delete[] buckets;
|
||||
buckets = newBuckets;
|
||||
bucketsEnd = newBucketsEnd;
|
||||
} catch (std::bad_alloc) {
|
||||
// Out of memory. Ignore the error and just relax the resizing boundaries.
|
||||
if (buckets + JS_BIT(newLgNBuckets) > bucketsEnd)
|
||||
maxNEntries >>= 1;
|
||||
else
|
||||
minNEntries <<= 1;
|
||||
}
|
||||
}
|
||||
@@ -1,373 +0,0 @@
|
||||
// -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
//
|
||||
// The contents of this file are subject to the Netscape Public
|
||||
// License Version 1.1 (the "License"); you may not use this file
|
||||
// except in compliance with the License. You may obtain a copy of
|
||||
// the License at http://www.mozilla.org/NPL/
|
||||
//
|
||||
// Software distributed under the License is distributed on an "AS
|
||||
// IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
||||
// implied. See the License for the specific language governing
|
||||
// rights and limitations under the License.
|
||||
//
|
||||
// The Original Code is the JavaScript 2 Prototype.
|
||||
//
|
||||
// The Initial Developer of the Original Code is Netscape
|
||||
// Communications Corporation. Portions created by Netscape are
|
||||
// Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
// Rights Reserved.
|
||||
|
||||
#ifndef hash_h
|
||||
#define hash_h
|
||||
|
||||
#include "utilities.h"
|
||||
|
||||
namespace JavaScript {
|
||||
|
||||
|
||||
//
|
||||
// Hash Codes
|
||||
//
|
||||
|
||||
typedef uint32 HashNumber;
|
||||
|
||||
HashNumber hashString(const char *s);
|
||||
HashNumber hashString(const String &s);
|
||||
|
||||
|
||||
template<class Key>
|
||||
struct Hash {
|
||||
HashNumber operator()(Key key) const;
|
||||
};
|
||||
|
||||
template<class Key>
|
||||
inline HashNumber Hash<Key>::operator()(Key key) const
|
||||
{
|
||||
return hashString(key);
|
||||
}
|
||||
|
||||
|
||||
const HashNumber goldenRatio = 0x9E3779B9U;
|
||||
|
||||
|
||||
//
|
||||
// Private
|
||||
//
|
||||
|
||||
// Base class for user-defined hash entries.
|
||||
// private
|
||||
class GenericHashEntry {
|
||||
public:
|
||||
GenericHashEntry *next; // Link to next entry in the same bucket
|
||||
const HashNumber keyHash; // This entry's hash value
|
||||
|
||||
protected:
|
||||
explicit GenericHashEntry(HashNumber keyHash): next(0), keyHash(keyHash) {}
|
||||
|
||||
friend class GenericHashTable;
|
||||
};
|
||||
|
||||
|
||||
// private
|
||||
class GenericHashTableIterator;
|
||||
class GenericHashTable {
|
||||
protected:
|
||||
GenericHashEntry **buckets; // Vector of hash buckets
|
||||
GenericHashEntry **bucketsEnd; // Pointer past end of vector of hash buckets
|
||||
uint defaultLgNBuckets; // lg2 of minimum number of buckets for which to size the table
|
||||
uint32 nEntries; // Number of entries in table
|
||||
uint32 minNEntries; // Minimum number of entries without rehashing
|
||||
uint32 maxNEntries; // Maximum number of entries without rehashing
|
||||
uint32 shift; // 32 - lg2(number of buckets)
|
||||
#ifdef DEBUG
|
||||
public:
|
||||
uint32 nReferences; // Number of iterators and references currently pointing to this hash table
|
||||
#endif
|
||||
|
||||
public:
|
||||
explicit GenericHashTable(uint32 nEntriesDefault);
|
||||
~GenericHashTable() {
|
||||
#ifndef _WIN32
|
||||
ASSERT(nReferences == 0);
|
||||
#endif
|
||||
delete[] buckets;
|
||||
}
|
||||
|
||||
void recomputeMinMaxNEntries(uint lgNBuckets);
|
||||
void rehash();
|
||||
void maybeGrow() {if (nEntries > maxNEntries) rehash();}
|
||||
void maybeShrink() {if (nEntries < minNEntries) rehash();}
|
||||
|
||||
friend class GenericHashTableIterator;
|
||||
|
||||
typedef GenericHashTableIterator Iterator;
|
||||
};
|
||||
|
||||
// This ought to be GenericHashTable::Iterator, but this doesn't work due to a
|
||||
// Microsoft VC6 bug.
|
||||
class GenericHashTableIterator {
|
||||
protected:
|
||||
GenericHashTable &ht; // Hash table being iterated
|
||||
GenericHashEntry *entry; // Current entry; nil if done
|
||||
GenericHashEntry **backpointer; // Pointer to pointer to current entry
|
||||
GenericHashEntry **nextBucket; // Next bucket; pointer past end of vector of hash buckets if done
|
||||
public:
|
||||
explicit GenericHashTableIterator(GenericHashTable &ht);
|
||||
~GenericHashTableIterator() {ht.maybeShrink(); DEBUG_ONLY(--ht.nReferences);}
|
||||
|
||||
operator bool() const {return entry != 0;} // Return true if there are entries left.
|
||||
GenericHashTableIterator &operator++();
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// Hash Tables
|
||||
//
|
||||
|
||||
template<class Data, class Key, class H = Hash<Key> >
|
||||
class HashTable: private GenericHashTable {
|
||||
H hasher; // Hash function
|
||||
|
||||
struct Entry: public GenericHashEntry {
|
||||
Data data;
|
||||
|
||||
Entry(HashNumber keyHash, Key key): GenericHashEntry(keyHash), data(key) {}
|
||||
template<class Value>
|
||||
Entry(HashNumber keyHash, Key key, Value value): GenericHashEntry(keyHash), data(key, value) {}
|
||||
};
|
||||
|
||||
public:
|
||||
class Reference {
|
||||
#ifdef _WIN32 // Microsoft VC6 bug: friend declarations to inner classes don't work
|
||||
public:
|
||||
#endif
|
||||
Entry *entry; // Current entry; nil if done
|
||||
GenericHashEntry **backpointer; // Pointer to pointer to current entry
|
||||
const HashNumber keyHash; // This entry's key's hash value
|
||||
#ifdef DEBUG
|
||||
GenericHashTable *ht; // Hash table to which this Reference points
|
||||
#endif
|
||||
|
||||
public:
|
||||
#ifndef _WIN32
|
||||
Reference(HashTable &ht, Key key); // Search for an entry with the given key.
|
||||
#else // Microsoft VC6 bug: VC6 doesn't allow this to be defined outside the class
|
||||
Reference(HashTable &ht, Key key): keyHash(ht.hasher(key)) {
|
||||
#ifdef DEBUG
|
||||
Reference::ht = &ht;
|
||||
++ht.nReferences;
|
||||
#endif
|
||||
HashNumber kh = keyHash;
|
||||
HashNumber h = kh*goldenRatio >> ht.shift;
|
||||
GenericHashEntry **bp = ht.buckets + h;
|
||||
Entry *e;
|
||||
|
||||
while ((e = static_cast<Entry *>(*bp)) != 0 && !(e->keyHash == kh && e->data == key))
|
||||
bp = &e->next;
|
||||
entry = e;
|
||||
backpointer = bp;
|
||||
}
|
||||
#endif
|
||||
private:
|
||||
Reference(const Reference&); // No copy constructor
|
||||
void operator=(const Reference&); // No assignment operator
|
||||
public:
|
||||
#if defined(DEBUG) && !defined(_WIN32)
|
||||
~Reference() {if (ht) --ht->nReferences;}
|
||||
#endif
|
||||
|
||||
operator bool() const {return entry != 0;} // Return true if an entry was found.
|
||||
Data &operator*() const {ASSERT(entry); return entry->data;} // Return the data of the entry that was found.
|
||||
|
||||
friend class HashTable;
|
||||
};
|
||||
|
||||
class Iterator: public GenericHashTableIterator {
|
||||
public:
|
||||
explicit Iterator(HashTable &ht): GenericHashTableIterator(ht) {}
|
||||
private:
|
||||
Iterator(const Iterator&); // No copy constructor
|
||||
void operator=(const Iterator&); // No assignment operator
|
||||
public:
|
||||
|
||||
// Go to next entry.
|
||||
Iterator &operator++() {return *static_cast<Iterator*>(&GenericHashTableIterator::operator++());}
|
||||
Data &operator*() const {ASSERT(entry); return static_cast<Entry *>(entry)->data;} // Return current entry's data.
|
||||
void erase();
|
||||
};
|
||||
|
||||
HashTable(uint32 nEntriesDefault = 0, const H &hasher = H()): GenericHashTable(nEntriesDefault), hasher(hasher) {}
|
||||
~HashTable();
|
||||
|
||||
template<class Value> Data &insert(Reference &r, Key key, Value value);
|
||||
Data &insert(Reference &r, Key key);
|
||||
Data &insert(Key key);
|
||||
void erase(Reference &r);
|
||||
void erase(Key key);
|
||||
Data *operator[](Key key);
|
||||
|
||||
friend class Reference;
|
||||
friend class Iterator;
|
||||
|
||||
#ifndef _WIN32
|
||||
template<class Value> Data &insert(Key key, Value value);
|
||||
#else // Microsoft VC6 bug: VC6 doesn't allow this to be defined outside the class
|
||||
template<class Value> Data &insert(Key key, Value value) {
|
||||
Reference r(*this, key);
|
||||
if (r)
|
||||
return *r = value;
|
||||
else
|
||||
return insert(r, key, value);
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// Implementation
|
||||
//
|
||||
|
||||
template<class Data, class Key, class H>
|
||||
HashTable<Data, Key, H>::~HashTable()
|
||||
{
|
||||
GenericHashEntry **be = bucketsEnd;
|
||||
for (GenericHashEntry **b = buckets; b != be; b++) {
|
||||
Entry *e = static_cast<Entry *>(*b);
|
||||
while (e) {
|
||||
Entry *next = static_cast<Entry *>(e->next);
|
||||
delete e;
|
||||
e = next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#ifndef _WIN32
|
||||
template<class Data, class Key, class H>
|
||||
HashTable<Data, Key, H>::Reference::Reference(HashTable &ht, Key key):
|
||||
keyHash(ht.hasher(key))
|
||||
{
|
||||
#ifdef DEBUG
|
||||
Reference::ht = &ht;
|
||||
++ht.nReferences;
|
||||
#endif
|
||||
HashNumber kh = keyHash;
|
||||
HashNumber h = kh*goldenRatio >> ht.shift;
|
||||
GenericHashEntry **bp = ht.buckets + h;
|
||||
Entry *e;
|
||||
|
||||
while ((e = static_cast<Entry *>(*bp)) != 0 && !(e->keyHash == kh && e->data == key))
|
||||
bp = &e->next;
|
||||
entry = e;
|
||||
backpointer = bp;
|
||||
}
|
||||
|
||||
|
||||
// Insert the given key/value pair into the hash table. Reference must
|
||||
// be the result of an unsuccessful search for that key in the table.
|
||||
// The reference is not valid after this method is called.
|
||||
// Return a reference to the new entry's value.
|
||||
template<class Data, class Key, class H> template<class Value>
|
||||
inline Data &HashTable<Data, Key, H>::insert(Reference &r, Key key, Value value)
|
||||
{
|
||||
ASSERT(r.ht == this && !r.entry);
|
||||
Entry *e = new Entry(r.keyHash, key, value);
|
||||
*r.backpointer = e;
|
||||
++nEntries;
|
||||
maybeGrow();
|
||||
#ifdef DEBUG
|
||||
--r.ht->nReferences;
|
||||
r.ht = 0;
|
||||
#endif
|
||||
return e->data;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Same as above but without a Value argument.
|
||||
template<class Data, class Key, class H>
|
||||
inline Data &HashTable<Data, Key, H>::insert(Reference &r, Key key)
|
||||
{
|
||||
ASSERT(r.ht == this && !r.entry);
|
||||
Entry *e = new Entry(r.keyHash, key);
|
||||
*r.backpointer = e;
|
||||
++nEntries;
|
||||
maybeGrow();
|
||||
#ifdef DEBUG
|
||||
--r.ht->nReferences;
|
||||
r.ht = 0;
|
||||
#endif
|
||||
return e->data;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Insert the given key/value pair into the hash table. If an entry with a
|
||||
// matching key already exists, replace that entry's value.
|
||||
// Return a reference to the new entry's value.
|
||||
#ifndef _WIN32 // Microsoft VC6 bug: VC6 doesn't allow this to be defined outside the class
|
||||
template<class Data, class Key, class H> template<class Value>
|
||||
Data &HashTable<Data, Key, H>::insert(Key key, Value value)
|
||||
{
|
||||
Reference r(*this, key);
|
||||
if (r)
|
||||
return *r = value;
|
||||
else
|
||||
return insert(r, key, value);
|
||||
}
|
||||
#endif
|
||||
|
||||
// Same as above but without a Value argument.
|
||||
template<class Data, class Key, class H>
|
||||
Data &HashTable<Data, Key, H>::insert(Key key)
|
||||
{
|
||||
Reference r(*this, key);
|
||||
if (r)
|
||||
return *r;
|
||||
else
|
||||
return insert(r, key);
|
||||
}
|
||||
|
||||
|
||||
// Reference r must point to an existing entry. Delete that entry.
|
||||
// The reference is not valid after this method is called.
|
||||
template<class Data, class Key, class H>
|
||||
inline void HashTable<Data, Key, H>::erase(Reference &r)
|
||||
{
|
||||
Entry *e = r.entry;
|
||||
ASSERT(r.ht == this && e);
|
||||
*r.backpointer = e->next;
|
||||
--nEntries;
|
||||
delete e;
|
||||
#ifdef DEBUG
|
||||
--r.ht->nReferences;
|
||||
r.ht = 0;
|
||||
#endif
|
||||
maybeShrink();
|
||||
}
|
||||
|
||||
|
||||
// Remove the hash table entry, if any, matching the given key.
|
||||
template<class Data, class Key, class H>
|
||||
void HashTable<Data, Key, H>::erase(Key key)
|
||||
{
|
||||
Reference r(*this, key);
|
||||
if (r)
|
||||
erase(r);
|
||||
}
|
||||
|
||||
|
||||
// Return a pointer to the value of the hash table entry matching the given key.
|
||||
// Return nil if no entry matches.
|
||||
template<class Data, class Key, class H>
|
||||
Data *HashTable<Data, Key, H>::operator[](Key key)
|
||||
{
|
||||
Reference r(*this, key);
|
||||
if (r)
|
||||
return &*r;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,306 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the JavaScript 2 Prototype.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
#ifndef icodegenerator_h
|
||||
#define icodegenerator_h
|
||||
|
||||
#include <vector>
|
||||
#include <stack>
|
||||
|
||||
#include "utilities.h"
|
||||
#include "parser.h"
|
||||
#include "vmtypes.h"
|
||||
#include "jsclasses.h"
|
||||
|
||||
|
||||
namespace JavaScript {
|
||||
namespace ICG {
|
||||
|
||||
using namespace VM;
|
||||
using namespace JSTypes;
|
||||
using namespace JSClasses;
|
||||
|
||||
typedef std::map<String, TypedRegister, std::less<String> > VariableList;
|
||||
typedef std::map<uint32, uint32, std::less<uint32> > InstructionMap;
|
||||
|
||||
|
||||
class ICodeModule {
|
||||
public:
|
||||
ICodeModule(InstructionStream *iCode, VariableList *variables,
|
||||
uint32 maxRegister, uint32 maxParameter,
|
||||
InstructionMap *instructionMap) :
|
||||
its_iCode(iCode), itsVariables(variables),
|
||||
itsParameterCount(maxParameter), itsMaxRegister(maxRegister),
|
||||
mID(++sMaxID), mInstructionMap(instructionMap) { }
|
||||
~ICodeModule()
|
||||
{
|
||||
delete its_iCode;
|
||||
delete itsVariables;
|
||||
delete mInstructionMap;
|
||||
}
|
||||
|
||||
Formatter& print(Formatter& f);
|
||||
void setFileName (String aFileName) { mFileName = aFileName; }
|
||||
String getFileName () { return mFileName; }
|
||||
|
||||
InstructionStream *its_iCode;
|
||||
VariableList *itsVariables;
|
||||
uint32 itsParameterCount;
|
||||
uint32 itsMaxRegister;
|
||||
uint32 mID;
|
||||
InstructionMap *mInstructionMap;
|
||||
String mFileName;
|
||||
|
||||
static uint32 sMaxID;
|
||||
|
||||
};
|
||||
|
||||
typedef std::vector<const StringAtom *> LabelSet;
|
||||
class LabelEntry {
|
||||
public:
|
||||
LabelEntry(LabelSet *labelSet, Label *breakLabel)
|
||||
: labelSet(labelSet), breakLabel(breakLabel), continueLabel(NULL) { }
|
||||
LabelEntry(LabelSet *labelSet, Label *breakLabel, Label *continueLabel)
|
||||
: labelSet(labelSet), breakLabel(breakLabel), continueLabel(continueLabel) { }
|
||||
|
||||
bool containsLabel(const StringAtom *label);
|
||||
|
||||
LabelSet *labelSet;
|
||||
Label *breakLabel;
|
||||
Label *continueLabel;
|
||||
};
|
||||
typedef std::vector<LabelEntry *> LabelStack;
|
||||
|
||||
Formatter& operator<<(Formatter &f, ICodeModule &i);
|
||||
|
||||
/****************************************************************/
|
||||
|
||||
// An ICodeGenerator provides the interface between the parser and the
|
||||
// interpreter. The parser constructs one of these for each
|
||||
// function/script, adds statements and expressions to it and then
|
||||
// converts it into an ICodeModule, ready for execution.
|
||||
|
||||
class ICodeGenerator {
|
||||
public:
|
||||
typedef enum { kNoFlags = 0, kIsTopLevel = 0x01, kIsStaticMethod = 0x02, kIsWithinWith = 0x04 } ICodeGeneratorFlags;
|
||||
private:
|
||||
InstructionStream *iCode;
|
||||
bool iCodeOwner;
|
||||
LabelList labels;
|
||||
|
||||
Register mTopRegister; // highest (currently) alloacated register
|
||||
uint32 mParameterCount; // number of parameters declared for the function
|
||||
// these must come before any variables declared.
|
||||
TypedRegister mExceptionRegister; // reserved to carry the exception object.
|
||||
VariableList *variableList; // name|register pair for each variable
|
||||
|
||||
World *mWorld; // used to register strings
|
||||
JSScope *mGlobal; // the scope for compiling within
|
||||
LabelStack mLabelStack; // stack of LabelEntry objects, one per nested looping construct
|
||||
// maps source position to instruction index
|
||||
InstructionMap *mInstructionMap;
|
||||
|
||||
JSClass *mClass; // enclosing class when generating code for methods
|
||||
ICodeGeneratorFlags mFlags; // assorted flags
|
||||
|
||||
std::vector<bool> mPermanentRegister;
|
||||
|
||||
Register getTempRegister()
|
||||
{
|
||||
while (mTopRegister < mPermanentRegister.size())
|
||||
if (!mPermanentRegister[mTopRegister])
|
||||
return mTopRegister++;
|
||||
else
|
||||
++mTopRegister;
|
||||
mPermanentRegister.resize(mTopRegister + 1);
|
||||
mPermanentRegister[mTopRegister] = false;
|
||||
return mTopRegister++;
|
||||
}
|
||||
|
||||
void resetTopRegister() { mTopRegister = mParameterCount; }
|
||||
void resetStatement() { resetTopRegister(); }
|
||||
|
||||
TypedRegister allocateRegister(const StringAtom& name, JSType *type);
|
||||
|
||||
void setRegisterForVariable(const StringAtom& name, TypedRegister r) { (*variableList)[name] = r; }
|
||||
|
||||
JSType *findType(const StringAtom& typeName);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void setLabel(Label *label);
|
||||
|
||||
void jsr(Label *label) { iCode->push_back(new Jsr(label)); }
|
||||
void rts() { iCode->push_back(new Rts()); }
|
||||
void branch(Label *label);
|
||||
GenericBranch *branchTrue(Label *label, TypedRegister condition);
|
||||
GenericBranch *branchFalse(Label *label, TypedRegister condition);
|
||||
|
||||
void beginTry(Label *catchLabel, Label *finallyLabel)
|
||||
{ iCode->push_back(new Tryin(catchLabel, finallyLabel)); }
|
||||
void endTry() { iCode->push_back(new Tryout()); }
|
||||
|
||||
void beginWith(TypedRegister obj) { iCode->push_back(new Within(obj)); }
|
||||
void endWith() { iCode->push_back(new Without()); }
|
||||
|
||||
|
||||
|
||||
void startStatement(uint32 pos) { (*mInstructionMap)[iCode->size()] = pos; }
|
||||
|
||||
ICodeOp mapExprNodeToICodeOp(ExprNode::Kind kind);
|
||||
|
||||
|
||||
bool isTopLevel() { return (mFlags & kIsTopLevel) != 0; }
|
||||
bool isWithinWith() { return (mFlags & kIsWithinWith) != 0; }
|
||||
bool isStaticMethod() { return (mFlags & kIsStaticMethod) != 0; }
|
||||
|
||||
void setFlag(uint32 flag, bool v) { mFlags = (ICodeGeneratorFlags)((v) ? mFlags | flag : mFlags & ~flag); }
|
||||
|
||||
|
||||
typedef enum {Var, Property, Slot, Static, Constructor, Name, Method} LValueKind;
|
||||
|
||||
LValueKind resolveIdentifier(const StringAtom &name, TypedRegister &v, uint32 &slotIndex);
|
||||
TypedRegister handleIdentifier(IdentifierExprNode *p, ExprNode::Kind use, ICodeOp xcrementOp, TypedRegister ret, RegisterList *args);
|
||||
TypedRegister handleDot(BinaryExprNode *b, ExprNode::Kind use, ICodeOp xcrementOp, TypedRegister ret, RegisterList *args);
|
||||
ICodeModule *genFunction(FunctionStmtNode *f, bool isConstructor, JSClass *superClass);
|
||||
|
||||
public:
|
||||
|
||||
ICodeGenerator(World *world, JSScope *global, JSClass *aClass = NULL, ICodeGeneratorFlags flags = kIsTopLevel);
|
||||
|
||||
~ICodeGenerator()
|
||||
{
|
||||
if (iCodeOwner) {
|
||||
delete iCode;
|
||||
delete mInstructionMap;
|
||||
}
|
||||
}
|
||||
|
||||
ICodeModule *complete();
|
||||
|
||||
TypedRegister genExpr(ExprNode *p,
|
||||
bool needBoolValueInBranch = false,
|
||||
Label *trueBranch = NULL,
|
||||
Label *falseBranch = NULL);
|
||||
TypedRegister genStmt(StmtNode *p, LabelSet *currentLabelSet = NULL);
|
||||
|
||||
void returnStmt(TypedRegister r);
|
||||
void returnStmt();
|
||||
void throwStmt(TypedRegister r) { iCode->push_back(new Throw(r)); }
|
||||
void debuggerStmt() { iCode->push_back(new Debugger()); }
|
||||
|
||||
TypedRegister allocateVariable(const StringAtom& name);
|
||||
TypedRegister allocateVariable(const StringAtom& name, const StringAtom& typeName);
|
||||
|
||||
TypedRegister findVariable(const StringAtom& name)
|
||||
{
|
||||
VariableList::iterator i = variableList->find(name);
|
||||
return (i == variableList->end()) ? TypedRegister(NotARegister, &None_Type) : (*i).second;
|
||||
}
|
||||
|
||||
TypedRegister allocateParameter(const StringAtom& name) { mParameterCount++; return allocateRegister(name, &Any_Type); }
|
||||
TypedRegister allocateParameter(const StringAtom& name, const StringAtom& typeName)
|
||||
{ mParameterCount++; return allocateRegister(name, findType(typeName)); }
|
||||
TypedRegister allocateParameter(const StringAtom& name, JSType *type)
|
||||
{ mParameterCount++; return allocateRegister(name, type); }
|
||||
|
||||
Formatter& print(Formatter& f);
|
||||
|
||||
TypedRegister op(ICodeOp op, TypedRegister source);
|
||||
TypedRegister op(ICodeOp op, TypedRegister source1, TypedRegister source2);
|
||||
TypedRegister binaryOp(ICodeOp op, TypedRegister source1, TypedRegister source2);
|
||||
TypedRegister call(TypedRegister base, TypedRegister target, RegisterList *args);
|
||||
TypedRegister getMethod(TypedRegister thisArg, uint32 slotIndex);
|
||||
|
||||
void move(TypedRegister destination, TypedRegister source);
|
||||
TypedRegister logicalNot(TypedRegister source);
|
||||
TypedRegister test(TypedRegister source);
|
||||
|
||||
TypedRegister loadBoolean(bool value);
|
||||
TypedRegister loadImmediate(double value);
|
||||
TypedRegister loadString(const String &value);
|
||||
TypedRegister loadString(const StringAtom &name);
|
||||
|
||||
TypedRegister newObject(TypedRegister constructor);
|
||||
TypedRegister newArray();
|
||||
TypedRegister newFunction(ICodeModule *icm);
|
||||
TypedRegister newClass(JSClass *clazz);
|
||||
|
||||
TypedRegister cast(TypedRegister arg, JSType *toType);
|
||||
|
||||
TypedRegister super();
|
||||
TypedRegister loadName(const StringAtom &name, JSType *t = &Any_Type);
|
||||
void saveName(const StringAtom &name, TypedRegister value);
|
||||
TypedRegister nameXcr(const StringAtom &name, ICodeOp op);
|
||||
|
||||
TypedRegister deleteProperty(TypedRegister base, const StringAtom &name);
|
||||
TypedRegister getProperty(TypedRegister base, const StringAtom &name);
|
||||
void setProperty(TypedRegister base, const StringAtom &name, TypedRegister value);
|
||||
TypedRegister propertyXcr(TypedRegister base, const StringAtom &name, ICodeOp op);
|
||||
|
||||
TypedRegister getStatic(JSClass *base, const String &name);
|
||||
void setStatic(JSClass *base, const StringAtom &name, TypedRegister value);
|
||||
TypedRegister staticXcr(JSClass *base, const StringAtom &name, ICodeOp op);
|
||||
|
||||
TypedRegister getElement(TypedRegister base, TypedRegister index);
|
||||
void setElement(TypedRegister base, TypedRegister index, TypedRegister value);
|
||||
TypedRegister elementXcr(TypedRegister base, TypedRegister index, ICodeOp op);
|
||||
|
||||
TypedRegister getSlot(TypedRegister base, uint32 slot);
|
||||
void setSlot(TypedRegister base, uint32 slot, TypedRegister value);
|
||||
TypedRegister slotXcr(TypedRegister base, uint32 slot, ICodeOp op);
|
||||
|
||||
TypedRegister varXcr(TypedRegister var, ICodeOp op);
|
||||
|
||||
InstructionStream *getICode() { return iCode; }
|
||||
|
||||
Label *getLabel();
|
||||
|
||||
};
|
||||
|
||||
Formatter& operator<<(Formatter &f, ICodeGenerator &i);
|
||||
Formatter& operator<<(Formatter &f, ICodeModule &i);
|
||||
/*
|
||||
std::ostream &operator<<(std::ostream &s, ICodeGenerator &i);
|
||||
std::ostream &operator<<(std::ostream &s, StringAtom &str);
|
||||
*/
|
||||
|
||||
|
||||
|
||||
} /* namespace IGC */
|
||||
} /* namespace JavaScript */
|
||||
|
||||
#endif /* icodegenerator_h */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,113 +0,0 @@
|
||||
// -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
//
|
||||
// The contents of this file are subject to the Netscape Public
|
||||
// License Version 1.1 (the "License"); you may not use this file
|
||||
// except in compliance with the License. You may obtain a copy of
|
||||
// the License at http://www.mozilla.org/NPL/
|
||||
//
|
||||
// Software distributed under the License is distributed on an "AS
|
||||
// IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
||||
// implied. See the License for the specific language governing
|
||||
// rights and limitations under the License.
|
||||
//
|
||||
// The Original Code is the JavaScript 2 Prototype.
|
||||
//
|
||||
// The Initial Developer of the Original Code is Netscape
|
||||
// Communications Corporation. Portions created by Netscape are
|
||||
// Copyright (C) 2000 Netscape Communications Corporation. All
|
||||
// Rights Reserved.
|
||||
|
||||
#ifndef interpreter_h
|
||||
#define interpreter_h
|
||||
|
||||
#include "utilities.h"
|
||||
#include "jstypes.h"
|
||||
#include "vmtypes.h"
|
||||
#include "icodegenerator.h"
|
||||
#include "gc_allocator.h"
|
||||
|
||||
namespace JavaScript {
|
||||
namespace Interpreter {
|
||||
|
||||
using namespace ICG;
|
||||
using namespace JSTypes;
|
||||
|
||||
struct Activation;
|
||||
|
||||
struct Linkage;
|
||||
|
||||
class Context : public gc_base {
|
||||
void initContext();
|
||||
public:
|
||||
explicit Context(World& world, JSScope* aGlobal)
|
||||
: mWorld(world), mGlobal(aGlobal), mLinkage(0), mActivation(0), mHasOperatorsPackageLoaded(false) { initContext(); }
|
||||
|
||||
World& getWorld() { return mWorld; }
|
||||
JSScope* getGlobalObject() { return mGlobal; }
|
||||
InstructionIterator getPC() { return mPC; }
|
||||
|
||||
JSValues& getRegisters();
|
||||
ICodeModule* getICode();
|
||||
|
||||
enum Event {
|
||||
EV_NONE = 0x0000,
|
||||
EV_STEP = 0x0001,
|
||||
EV_THROW = 0x0002,
|
||||
EV_DEBUG = 0x0004,
|
||||
EV_ALL = 0xffff
|
||||
};
|
||||
|
||||
class Listener {
|
||||
public:
|
||||
virtual void listen(Context *context, Event event) = 0;
|
||||
};
|
||||
|
||||
void addListener(Listener* listener);
|
||||
void removeListener(Listener* listener);
|
||||
|
||||
class Frame {
|
||||
public:
|
||||
virtual Frame* getNext() = 0;
|
||||
virtual void getState(InstructionIterator& pc, JSValues*& registers,
|
||||
ICodeModule*& iCode) = 0;
|
||||
};
|
||||
|
||||
Frame* getFrames();
|
||||
|
||||
JSValue interpret(ICodeModule* iCode, const JSValues& args);
|
||||
void doCall(JSFunction *target, Instruction *pc);
|
||||
|
||||
ICodeModule* compile(const String &source);
|
||||
ICodeModule* genCode(StmtNode *p, const String &fileName);
|
||||
JSValue readEvalFile(FILE* in, const String& fileName);
|
||||
|
||||
void addBinaryOperator(BinaryOperator::BinaryOp op, BinaryOperator *fn) { mBinaryOperators[op].push_back(fn); }
|
||||
const JSValue findBinaryOverride(JSValue &operand1, JSValue &operand2, BinaryOperator::BinaryOp op);
|
||||
|
||||
|
||||
bool hasOperatorsPackageLoaded() { return mHasOperatorsPackageLoaded; }
|
||||
|
||||
private:
|
||||
void broadcast(Event event);
|
||||
void initOperatorsPackage();
|
||||
|
||||
private:
|
||||
World& mWorld;
|
||||
JSScope* mGlobal;
|
||||
Linkage* mLinkage;
|
||||
typedef std::vector<Listener*, gc_allocator<Listener*> > ListenerList;
|
||||
typedef ListenerList::iterator ListenerIterator;
|
||||
ListenerList mListeners;
|
||||
Activation* mActivation;
|
||||
bool mHasOperatorsPackageLoaded;
|
||||
|
||||
InstructionIterator mPC;
|
||||
|
||||
BinaryOperatorList mBinaryOperators[BinaryOperator::BinaryOperatorCount];
|
||||
|
||||
}; /* class Context */
|
||||
|
||||
} /* namespace Interpreter */
|
||||
} /* namespace JavaScript */
|
||||
|
||||
#endif /* interpreter_h */
|
||||
@@ -1,33 +0,0 @@
|
||||
class ArithmeticNode extends BinaryNode {
|
||||
|
||||
ArithmeticNode(String aOp, ExpressionNode aLeft, ExpressionNode aRight)
|
||||
{
|
||||
super(aOp, aLeft, aRight);
|
||||
}
|
||||
|
||||
JSValue eval(Environment theEnv)
|
||||
{
|
||||
JSValue lV = left.eval(theEnv);
|
||||
JSValue rV = right.eval(theEnv);
|
||||
|
||||
if (op == "+")
|
||||
return lV.add(theEnv, rV);
|
||||
else
|
||||
if (op == "-")
|
||||
return lV.subtract(theEnv, rV);
|
||||
else
|
||||
if (op == "*")
|
||||
return lV.multiply(theEnv, rV);
|
||||
else
|
||||
if (op == "/")
|
||||
return lV.divide(theEnv, rV);
|
||||
else
|
||||
if (op == "%")
|
||||
return lV.remainder(theEnv, rV);
|
||||
else {
|
||||
System.out.println("missing arithmetic op " + op);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
class AssignmentNode extends BinaryNode {
|
||||
|
||||
AssignmentNode(String aOp, ExpressionNode aLeft, ExpressionNode aRight)
|
||||
{
|
||||
super(aOp, aLeft, aRight);
|
||||
}
|
||||
|
||||
JSValue eval(Environment theEnv)
|
||||
{
|
||||
JSReference lV = left.evalLHS(theEnv);
|
||||
JSValue rV = right.eval(theEnv);
|
||||
|
||||
return lV.base.putProp(theEnv, lV.id, rV);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,72 +0,0 @@
|
||||
class BinaryNode extends ExpressionNode {
|
||||
|
||||
BinaryNode(String aOp, ExpressionNode aLeft, ExpressionNode aRight)
|
||||
{
|
||||
left = aLeft;
|
||||
right = aRight;
|
||||
op = aOp;
|
||||
}
|
||||
|
||||
JSReference evalLHS(Environment theEnv)
|
||||
{
|
||||
if (op == ".") {
|
||||
JSValue lV = left.eval(theEnv);
|
||||
JSString id;
|
||||
if (right instanceof JSIdentifier)
|
||||
id = (JSString)right;
|
||||
else
|
||||
id = right.eval(theEnv).toJSString(theEnv);
|
||||
return new JSReference(lV, id);
|
||||
}
|
||||
else
|
||||
throw new RuntimeException("bad lValue operator " + op);
|
||||
}
|
||||
|
||||
JSValue eval(Environment theEnv)
|
||||
{
|
||||
JSValue lV = left.eval(theEnv);
|
||||
JSValue rV = right.eval(theEnv);
|
||||
|
||||
if (op == ".")
|
||||
return lV.getProp(theEnv, rV.toJSString(theEnv));
|
||||
else
|
||||
if (op == "()")
|
||||
return lV.call(theEnv, rV);
|
||||
else
|
||||
if (op == ",")
|
||||
return JSValueList.buildList(lV, rV);
|
||||
else {
|
||||
System.out.println("missing binary op " + op);
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
String print(String indent)
|
||||
{
|
||||
StringBuffer result = new StringBuffer(indent);
|
||||
result.append(getClass().toString());
|
||||
result.append(" ");
|
||||
result.append(op);
|
||||
result.append("\n");
|
||||
indent += " ";
|
||||
if (left == null) {
|
||||
result.append(indent);
|
||||
result.append("null\n");
|
||||
}
|
||||
else
|
||||
result.append(left.print(indent));
|
||||
if (right == null) {
|
||||
result.append(indent);
|
||||
result.append("null\n");
|
||||
}
|
||||
else
|
||||
result.append(right.print(indent));
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
protected ExpressionNode left;
|
||||
protected ExpressionNode right;
|
||||
protected String op;
|
||||
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
class BitwiseNode extends BinaryNode {
|
||||
|
||||
BitwiseNode(String aOp, ExpressionNode aLeft, ExpressionNode aRight)
|
||||
{
|
||||
super(aOp, aLeft, aRight);
|
||||
}
|
||||
|
||||
JSValue eval(Environment theEnv)
|
||||
{
|
||||
JSInteger lV = left.eval(theEnv).toJSInteger(theEnv);
|
||||
JSValue rV = right.eval(theEnv);
|
||||
|
||||
if (op == "&")
|
||||
return lV.and(theEnv, rV);
|
||||
else
|
||||
if (op == "|")
|
||||
return lV.or(theEnv, rV);
|
||||
else
|
||||
if (op == "^")
|
||||
return lV.xor(theEnv, rV);
|
||||
else
|
||||
if (op == "<<")
|
||||
return lV.shr(theEnv, rV);
|
||||
else
|
||||
if (op == ">>")
|
||||
return lV.shl(theEnv, rV);
|
||||
else
|
||||
if (op == ">>>")
|
||||
return lV.ushl(theEnv, rV);
|
||||
else {
|
||||
System.out.println("missing bitwise op " + op);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
import java.io.*;
|
||||
|
||||
class Brenda {
|
||||
|
||||
public static void main(String[] args) {
|
||||
try {
|
||||
JSLexer lexer = new JSLexer((args != null) ? new DataInputStream(new FileInputStream(args[0])) : new DataInputStream(System.in));
|
||||
JSParser parser = new JSParser(lexer);
|
||||
ControlNodeGroup tree = new ControlNodeGroup();
|
||||
parser.statements(0, tree);
|
||||
System.out.println(ControlNode.printAll());
|
||||
|
||||
Environment theEnv = new Environment();
|
||||
ControlNode c = tree.getHead();
|
||||
while (c != null) c = c.eval(theEnv);
|
||||
|
||||
System.out.println("After eval :\n" + theEnv.print());
|
||||
|
||||
} catch(Exception e) {
|
||||
System.err.println("exception: "+e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,59 +0,0 @@
|
||||
class ConditionalNode extends ControlNode {
|
||||
|
||||
ConditionalNode(ExpressionNode aCondition)
|
||||
{
|
||||
super(aCondition);
|
||||
}
|
||||
|
||||
ConditionalNode(ExpressionNode aCondition, ControlNode aTrueCode)
|
||||
{
|
||||
super(aCondition);
|
||||
trueCode = aTrueCode;
|
||||
}
|
||||
|
||||
ConditionalNode(ExpressionNode aCondition, ControlNode aTrueCode, ControlNode aFalseCode)
|
||||
{
|
||||
super(aCondition);
|
||||
trueCode = aTrueCode;
|
||||
setNext(aFalseCode);
|
||||
}
|
||||
|
||||
void moveNextToTrue()
|
||||
{
|
||||
trueCode = next;
|
||||
setNext(null);
|
||||
}
|
||||
|
||||
ControlNode eval(Environment theEnv)
|
||||
{
|
||||
JSBoolean b = expr.eval(theEnv).toJSBoolean(theEnv);
|
||||
if (b.isTrue())
|
||||
return trueCode;
|
||||
else
|
||||
return next;
|
||||
}
|
||||
|
||||
String print()
|
||||
{
|
||||
StringBuffer result = new StringBuffer("ConditionalNode ");
|
||||
result.append(index);
|
||||
result.append("\nexpr:\n");
|
||||
if (expr == null)
|
||||
result.append("expr = null\n");
|
||||
else
|
||||
result.append(expr.print(""));
|
||||
result.append("true branch:\n");
|
||||
if (trueCode == null)
|
||||
result.append("true branch = null\n");
|
||||
else
|
||||
result.append("true branch->" + trueCode.index + "\n");
|
||||
result.append("false branch:\n");
|
||||
if (next == null)
|
||||
result.append("false branch = null\n");
|
||||
else
|
||||
result.append("false branch->" + next.index + "\n");
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
protected ControlNode trueCode;
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
|
||||
import java.util.Vector;
|
||||
|
||||
class ControlNode {
|
||||
|
||||
private static Vector gList = new Vector();
|
||||
|
||||
static String printAll()
|
||||
{
|
||||
StringBuffer result = new StringBuffer();
|
||||
for (int i = 0; i < gList.size(); i++) {
|
||||
result.append(((ControlNode)(gList.elementAt(i))).print());
|
||||
}
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
ControlNode(ExpressionNode anExpr)
|
||||
{
|
||||
expr = anExpr;
|
||||
index = gList.size();
|
||||
gList.addElement(this);
|
||||
}
|
||||
|
||||
ExpressionNode getExpression()
|
||||
{
|
||||
return expr;
|
||||
}
|
||||
|
||||
void setNext(ControlNode aNext)
|
||||
{
|
||||
next = aNext;
|
||||
}
|
||||
|
||||
ControlNode eval(Environment theEnv)
|
||||
{
|
||||
if (expr != null) theEnv.resultValue = expr.eval(theEnv);
|
||||
return next;
|
||||
}
|
||||
|
||||
String print()
|
||||
{
|
||||
StringBuffer result = new StringBuffer(getClass().toString().substring(6));
|
||||
result.append(" #");
|
||||
result.append(index);
|
||||
result.append("\nexpr: \n");
|
||||
if (expr == null)
|
||||
result.append("expr = null\n");
|
||||
else
|
||||
result.append(expr.print(""));
|
||||
result.append("next: ");
|
||||
if (next == null)
|
||||
result.append("next = null\n");
|
||||
else
|
||||
result.append("next->" + next.index + "\n");
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
protected ExpressionNode expr;
|
||||
protected ControlNode next;
|
||||
protected int index;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,153 +0,0 @@
|
||||
|
||||
import java.util.Vector;
|
||||
|
||||
class ControlNodeGroup {
|
||||
|
||||
ControlNodeGroup()
|
||||
{
|
||||
}
|
||||
|
||||
ControlNodeGroup(ControlNode aHead)
|
||||
{
|
||||
head = aHead;
|
||||
}
|
||||
|
||||
void add(ControlNodeGroup aGroup)
|
||||
{
|
||||
if (head == null) {
|
||||
head = aGroup.head;
|
||||
}
|
||||
else {
|
||||
fixTails(aGroup.getHead());
|
||||
}
|
||||
addTails(aGroup);
|
||||
}
|
||||
|
||||
void add(ControlNode aNode)
|
||||
{
|
||||
fixTails(aNode);
|
||||
addTail(aNode);
|
||||
if (head == null) head = aNode;
|
||||
}
|
||||
|
||||
void addBreak(ControlNode aNode)
|
||||
{
|
||||
fixTails(aNode);
|
||||
addBreakTail(aNode);
|
||||
if (head == null) head = aNode;
|
||||
}
|
||||
|
||||
void addContinue(ControlNode aNode)
|
||||
{
|
||||
fixTails(aNode);
|
||||
addContinueTail(aNode);
|
||||
if (head == null) head = aNode;
|
||||
}
|
||||
|
||||
void fixTails(ControlNode butt)
|
||||
{
|
||||
int count = tails.size();
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
ControlNode aNode = (ControlNode)(tails.elementAt(i));
|
||||
aNode.setNext(butt);
|
||||
}
|
||||
tails.removeAllElements();
|
||||
}
|
||||
|
||||
void fixContinues(ControlNode butt, String label)
|
||||
{
|
||||
int count = continueTails.size();
|
||||
int i = 0;
|
||||
while (i < count) {
|
||||
ControlNode c = (ControlNode)(continueTails.elementAt(i));
|
||||
ExpressionNode e = c.getExpression();
|
||||
String tgt = (e == null) ? null : ((JSIdentifier)e).s;
|
||||
if ((tgt == null) || tgt.equals(label)) {
|
||||
c.setNext(butt);
|
||||
continueTails.removeElementAt(i);
|
||||
count--;
|
||||
}
|
||||
else
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
void setHead(ControlNode aHead)
|
||||
{
|
||||
head = aHead;
|
||||
}
|
||||
|
||||
ControlNode getHead()
|
||||
{
|
||||
return head;
|
||||
}
|
||||
|
||||
void addTail(ControlNode aTail)
|
||||
{
|
||||
tails.addElement(aTail);
|
||||
}
|
||||
|
||||
void addBreakTail(ControlNode aTail)
|
||||
{
|
||||
breakTails.addElement(aTail);
|
||||
}
|
||||
|
||||
void addContinueTail(ControlNode aTail)
|
||||
{
|
||||
continueTails.addElement(aTail);
|
||||
}
|
||||
|
||||
void removeTail(ControlNode aTail)
|
||||
{
|
||||
tails.removeElement(aTail);
|
||||
}
|
||||
|
||||
void addTails(ControlNodeGroup aGroup)
|
||||
{
|
||||
int count = aGroup.tails.size();
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
tails.addElement(aGroup.tails.elementAt(i));
|
||||
}
|
||||
aGroup.tails.removeAllElements();
|
||||
|
||||
count = aGroup.breakTails.size();
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
breakTails.addElement(aGroup.breakTails.elementAt(i));
|
||||
}
|
||||
aGroup.breakTails.removeAllElements();
|
||||
|
||||
count = aGroup.continueTails.size();
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
continueTails.addElement(aGroup.continueTails.elementAt(i));
|
||||
}
|
||||
aGroup.continueTails.removeAllElements();
|
||||
}
|
||||
|
||||
void shiftBreakTails(String label)
|
||||
{
|
||||
int count = breakTails.size();
|
||||
int i = 0;
|
||||
while (i < count) {
|
||||
ControlNode c = (ControlNode)(breakTails.elementAt(i));
|
||||
ExpressionNode e = c.getExpression();
|
||||
String tgt = (e == null) ? null : ((JSIdentifier)e).s;
|
||||
if ((tgt == null) || tgt.equals(label)) {
|
||||
tails.addElement(c);
|
||||
breakTails.removeElementAt(i);
|
||||
count--;
|
||||
}
|
||||
else
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
ControlNode head;
|
||||
Vector tails = new Vector();
|
||||
Vector breakTails = new Vector();
|
||||
Vector continueTails = new Vector();
|
||||
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
|
||||
import java.util.Hashtable;
|
||||
|
||||
class Environment {
|
||||
|
||||
JSScope scope = new JSScope("globals");
|
||||
JSScope globalScope = scope;
|
||||
|
||||
|
||||
void enterNewScope(JSScope newScope)
|
||||
{
|
||||
newScope.parent = scope;
|
||||
scope = newScope;
|
||||
}
|
||||
|
||||
void leaveScope()
|
||||
{
|
||||
scope = scope.parent;
|
||||
}
|
||||
|
||||
String print()
|
||||
{
|
||||
StringBuffer result = new StringBuffer("Globals contents :\n");
|
||||
result.append(scope.toString());
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
JSValue resultValue;
|
||||
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
class ExpressionNode {
|
||||
|
||||
ExpressionNode()
|
||||
{
|
||||
}
|
||||
|
||||
String print(String indent)
|
||||
{
|
||||
return indent + "ExpressionNode(" + getClass().toString() + ")\n";
|
||||
}
|
||||
|
||||
JSReference evalLHS(Environment theEnv)
|
||||
{
|
||||
System.out.println("Unimplemented evalLHS for " + print(""));
|
||||
return null;
|
||||
}
|
||||
|
||||
JSValue eval(Environment theEnv)
|
||||
{
|
||||
System.out.println("Unimplemented eval for " + print(""));
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
class FunctionNode extends ExpressionNode {
|
||||
|
||||
FunctionNode(JSIdentifier aName, ControlNodeGroup aBody, ExpressionNode parameterList)
|
||||
{
|
||||
fn = new NativeFunction(aBody.getHead());
|
||||
name = aName;
|
||||
if (parameterList != null) {
|
||||
if (parameterList instanceof BinaryNode)
|
||||
buildParameterVector((BinaryNode)parameterList);
|
||||
else
|
||||
fn.parameters.addElement(parameterList);
|
||||
}
|
||||
}
|
||||
|
||||
void buildParameterVector(BinaryNode x)
|
||||
{
|
||||
if (x.left instanceof BinaryNode) {
|
||||
buildParameterVector((BinaryNode)(x.left));
|
||||
fn.parameters.addElement(x.right);
|
||||
}
|
||||
else {
|
||||
fn.parameters.addElement(x.left);
|
||||
fn.parameters.addElement(x.right);
|
||||
}
|
||||
}
|
||||
|
||||
JSValue eval(Environment theEnv)
|
||||
{
|
||||
theEnv.scope.putProp(theEnv, name, fn);
|
||||
return fn;
|
||||
}
|
||||
|
||||
JSString name;
|
||||
NativeFunction fn;
|
||||
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
class JSBoolean extends JSValue {
|
||||
|
||||
static JSBoolean JSTrue = new JSBoolean(true);
|
||||
static JSBoolean JSFalse = new JSBoolean(false);
|
||||
|
||||
private JSBoolean(boolean p)
|
||||
{
|
||||
b = p;
|
||||
}
|
||||
|
||||
JSValue eval(Environment theEnv)
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
boolean isTrue()
|
||||
{
|
||||
return b;
|
||||
}
|
||||
|
||||
boolean isFalse()
|
||||
{
|
||||
return !b;
|
||||
}
|
||||
|
||||
JSValue bang(Environment theEnv) {
|
||||
return (b) ? JSFalse : JSTrue;
|
||||
}
|
||||
|
||||
JSValue typeof(Environment theEnv) {
|
||||
return new JSString("boolean");
|
||||
}
|
||||
|
||||
JSBoolean toJSBoolean(Environment theEnv) {
|
||||
return this;
|
||||
}
|
||||
|
||||
JSValue toPrimitive(Environment theEnv, String hint) {
|
||||
return this;
|
||||
}
|
||||
|
||||
JSString toJSString(Environment theEnv) {
|
||||
return (b) ? new JSString("true") : new JSString("false");
|
||||
}
|
||||
|
||||
JSDouble toJSDouble(Environment theEnv) {
|
||||
return (b) ? new JSDouble(1) : new JSDouble(0);
|
||||
}
|
||||
|
||||
boolean b;
|
||||
|
||||
}
|
||||
@@ -1,111 +0,0 @@
|
||||
class JSDouble extends JSNumber {
|
||||
|
||||
JSDouble(double p)
|
||||
{
|
||||
d = p;
|
||||
}
|
||||
|
||||
JSDouble(String s)
|
||||
{
|
||||
d = new Double(s).doubleValue();
|
||||
}
|
||||
|
||||
String print(String indent)
|
||||
{
|
||||
return indent + "JSDouble " + d + "\n";
|
||||
}
|
||||
|
||||
public String toString()
|
||||
{
|
||||
return Double.toString(d);
|
||||
}
|
||||
|
||||
JSValue eval(Environment theEnv)
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
JSValue plus(Environment theEnv) {
|
||||
return this;
|
||||
}
|
||||
|
||||
JSValue minus(Environment theEnv) {
|
||||
return new JSDouble(-d);
|
||||
}
|
||||
|
||||
JSValue add(Environment theEnv, JSValue rV) {
|
||||
if (rV instanceof JSString)
|
||||
return toJSString(theEnv).add(theEnv, rV);
|
||||
else
|
||||
return new JSDouble(d + rV.toJSDouble(theEnv).d);
|
||||
}
|
||||
|
||||
JSValue subtract(Environment theEnv, JSValue rV) {
|
||||
return new JSDouble(d - rV.toJSDouble(theEnv).d);
|
||||
}
|
||||
|
||||
JSValue multiply(Environment theEnv, JSValue rV) {
|
||||
return new JSDouble(d * rV.toJSDouble(theEnv).d);
|
||||
}
|
||||
|
||||
JSValue divide(Environment theEnv, JSValue rV) {
|
||||
return new JSDouble(d / rV.toJSDouble(theEnv).d);
|
||||
}
|
||||
|
||||
JSValue remainder(Environment theEnv, JSValue rV) {
|
||||
return new JSDouble(d % rV.toJSDouble(theEnv).d);
|
||||
}
|
||||
|
||||
JSValue gt(Environment theEnv, JSValue rV) {
|
||||
return (d > rV.toJSDouble(theEnv).d) ? JSBoolean.JSTrue : JSBoolean.JSFalse;
|
||||
}
|
||||
|
||||
JSValue ge(Environment theEnv, JSValue rV) {
|
||||
return (d >= rV.toJSDouble(theEnv).d) ? JSBoolean.JSTrue : JSBoolean.JSFalse;
|
||||
}
|
||||
|
||||
JSValue lt(Environment theEnv, JSValue rV) {
|
||||
return (d < rV.toJSDouble(theEnv).d) ? JSBoolean.JSTrue : JSBoolean.JSFalse;
|
||||
}
|
||||
|
||||
JSValue le(Environment theEnv, JSValue rV) {
|
||||
return (d <= rV.toJSDouble(theEnv).d) ? JSBoolean.JSTrue : JSBoolean.JSFalse;
|
||||
}
|
||||
|
||||
JSValue eq(Environment theEnv, JSValue rV) {
|
||||
return (d == rV.toJSDouble(theEnv).d) ? JSBoolean.JSTrue : JSBoolean.JSFalse;
|
||||
}
|
||||
|
||||
JSValue ne(Environment theEnv, JSValue rV) {
|
||||
return (d != rV.toJSDouble(theEnv).d) ? JSBoolean.JSTrue : JSBoolean.JSFalse;
|
||||
}
|
||||
|
||||
JSDouble toJSDouble(Environment theEnv) {
|
||||
return this;
|
||||
}
|
||||
|
||||
JSValue toPrimitive(Environment theEnv, String hint) {
|
||||
return this;
|
||||
}
|
||||
|
||||
JSInteger toJSInteger(Environment theEnv) {
|
||||
return new JSInteger((int)d);
|
||||
}
|
||||
|
||||
JSBoolean toJSBoolean(Environment theEnv) {
|
||||
return ((d == d) && (d != 0.0)) ? JSBoolean.JSTrue : JSBoolean.JSFalse;
|
||||
}
|
||||
|
||||
JSString toJSString(Environment theEnv) {
|
||||
return new JSString(Double.toString(d));
|
||||
}
|
||||
|
||||
JSObject toJSObject(Environment theEnv) {
|
||||
return new NativeNumber(d);
|
||||
}
|
||||
|
||||
|
||||
|
||||
double d;
|
||||
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
|
||||
|
||||
class JSException extends RuntimeException {
|
||||
|
||||
JSException(JSValue x)
|
||||
{
|
||||
value = x;
|
||||
}
|
||||
|
||||
JSValue getValue()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
public String toString()
|
||||
{
|
||||
return value.toJSString(null).s;
|
||||
}
|
||||
|
||||
JSValue value;
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,23 +0,0 @@
|
||||
class JSIdentifier extends JSString {
|
||||
|
||||
JSIdentifier(String s)
|
||||
{
|
||||
super(s);
|
||||
}
|
||||
|
||||
String print(String indent)
|
||||
{
|
||||
return indent + "JSIdentifier : " + s + "\n";
|
||||
}
|
||||
|
||||
JSValue eval(Environment theEnv)
|
||||
{
|
||||
return theEnv.scope.getProp(theEnv, this);
|
||||
}
|
||||
|
||||
JSReference evalLHS(Environment theEnv)
|
||||
{
|
||||
return new JSReference(theEnv.scope, this);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,68 +0,0 @@
|
||||
class JSInteger extends JSNumber {
|
||||
|
||||
JSInteger(String s)
|
||||
{
|
||||
i = new Integer(s).intValue();
|
||||
}
|
||||
|
||||
JSInteger(int p)
|
||||
{
|
||||
i = p;
|
||||
}
|
||||
|
||||
JSValue eval(Environment theEnv)
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
JSBoolean toJSBoolean(Environment theEnv) {
|
||||
return (i != 0) ? JSBoolean.JSTrue : JSBoolean.JSFalse;
|
||||
}
|
||||
|
||||
JSDouble toJSDouble(Environment theEnv) {
|
||||
return new JSDouble(i);
|
||||
}
|
||||
|
||||
JSInteger toJSInteger(Environment theEnv) {
|
||||
return this;
|
||||
}
|
||||
|
||||
JSValue toPrimitive(Environment theEnv, String hint) {
|
||||
return this;
|
||||
}
|
||||
|
||||
JSString toJSString(Environment theEnv) {
|
||||
return new JSString(Integer.toString(i));
|
||||
}
|
||||
|
||||
JSValue twiddle(Environment theEnv) {
|
||||
return new JSInteger(~i);
|
||||
}
|
||||
|
||||
JSValue and(Environment theEnv, JSValue rV) {
|
||||
return new JSInteger(i & rV.toJSInteger(theEnv).i);
|
||||
}
|
||||
|
||||
JSValue or(Environment theEnv, JSValue rV) {
|
||||
return new JSInteger(i | rV.toJSInteger(theEnv).i);
|
||||
}
|
||||
|
||||
JSValue xor(Environment theEnv, JSValue rV) {
|
||||
return new JSInteger(i ^ rV.toJSInteger(theEnv).i);
|
||||
}
|
||||
|
||||
JSValue shl(Environment theEnv, JSValue rV) {
|
||||
return new JSInteger(i >> rV.toJSInteger(theEnv).i);
|
||||
}
|
||||
|
||||
JSValue shr(Environment theEnv, JSValue rV) {
|
||||
return new JSInteger(i << rV.toJSInteger(theEnv).i);
|
||||
}
|
||||
|
||||
JSValue ushl(Environment theEnv, JSValue rV) {
|
||||
return new JSInteger(i >>> rV.toJSInteger(theEnv).i);
|
||||
}
|
||||
|
||||
int i;
|
||||
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
class JSName extends ExpressionNode {
|
||||
|
||||
JSName(JSIdentifier anID, int aScope)
|
||||
{
|
||||
id = anID;
|
||||
scope = aScope; // this is the scope that the name was used in
|
||||
}
|
||||
|
||||
String print(String indent)
|
||||
{
|
||||
return indent + "JSName : " + id.s + ", scope : " + scope + "\n";
|
||||
}
|
||||
|
||||
JSReference evalLHS(Environment theEnv)
|
||||
{
|
||||
JSScope scope = theEnv.scope;
|
||||
while (scope != null) {
|
||||
if (scope.hasProp(theEnv, id))
|
||||
return new JSReference(scope, id);
|
||||
else
|
||||
scope = scope.parent;
|
||||
}
|
||||
return new JSReference(theEnv.globalScope, id);
|
||||
}
|
||||
|
||||
JSValue eval(Environment theEnv)
|
||||
{
|
||||
JSScope scope = theEnv.scope;
|
||||
while (scope != null) {
|
||||
if (scope.hasProp(theEnv, id))
|
||||
return scope.getProp(theEnv, id);
|
||||
else
|
||||
scope = scope.parent;
|
||||
}
|
||||
throw new JSException(new JSString(id.s + " undefined"));
|
||||
}
|
||||
|
||||
JSIdentifier id;
|
||||
int scope;
|
||||
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
abstract class JSNumber extends JSValue {
|
||||
|
||||
JSValue typeof(Environment theEnv) {
|
||||
return new JSString("number");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,84 +0,0 @@
|
||||
|
||||
import java.util.Hashtable;
|
||||
|
||||
class JSObject extends JSValue {
|
||||
|
||||
static JSObject objectPrototype = new JSObject("Object");
|
||||
static JSObject JSUndefined = new JSObject("undefined");
|
||||
|
||||
JSObject(String aClass)
|
||||
{
|
||||
oClass = aClass;
|
||||
prototype = objectPrototype;
|
||||
}
|
||||
|
||||
void setPrototype(JSObject aPrototype)
|
||||
{
|
||||
prototype = aPrototype;
|
||||
}
|
||||
|
||||
String print(String indent)
|
||||
{
|
||||
return indent + "JSObject : " + oClass + "\n";
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return oClass + contents.toString();
|
||||
}
|
||||
|
||||
JSValue eval(Environment theEnv)
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
JSValue typeof(Environment theEnv) {
|
||||
if (this == JSUndefined)
|
||||
return new JSString("undefined");
|
||||
else
|
||||
return new JSString("object");
|
||||
}
|
||||
|
||||
JSBoolean toJSBoolean(Environment theEnv) {
|
||||
return JSBoolean.JSTrue;
|
||||
}
|
||||
|
||||
JSDouble toJSDouble(Environment theEnv) {
|
||||
return toPrimitive(theEnv, "Number").toJSDouble(theEnv);
|
||||
}
|
||||
|
||||
JSValue getProp(Environment theEnv, JSString id)
|
||||
{
|
||||
Object v = contents.get(id.s);
|
||||
if (v == null)
|
||||
if (prototype == null)
|
||||
return JSUndefined;
|
||||
else
|
||||
return prototype.getProp(theEnv, id);
|
||||
else
|
||||
return (JSValue)v;
|
||||
}
|
||||
|
||||
boolean hasProp(Environment theEnv, JSString id)
|
||||
{
|
||||
Object v = contents.get(id.s);
|
||||
if (v == null)
|
||||
if (prototype == null)
|
||||
return false;
|
||||
else
|
||||
return prototype.hasProp(theEnv, id);
|
||||
else
|
||||
return true;
|
||||
}
|
||||
|
||||
JSValue putProp(Environment theEnv, JSString id, JSValue rV) {
|
||||
contents.put(id.s, rV);
|
||||
return rV;
|
||||
}
|
||||
|
||||
|
||||
Hashtable contents = new Hashtable();
|
||||
|
||||
String oClass;
|
||||
|
||||
JSObject prototype;
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
class JSReference {
|
||||
|
||||
JSReference(JSValue aBase, JSString aID)
|
||||
{
|
||||
base = aBase;
|
||||
id = aID;
|
||||
}
|
||||
|
||||
JSValue base;
|
||||
JSString id;
|
||||
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
class JSScope extends JSObject {
|
||||
|
||||
JSScope(String s)
|
||||
{
|
||||
super(s);
|
||||
}
|
||||
|
||||
JSScope parent;
|
||||
|
||||
}
|
||||
@@ -1,83 +0,0 @@
|
||||
class JSString extends JSValue {
|
||||
|
||||
JSString(String p)
|
||||
{
|
||||
s = p;
|
||||
}
|
||||
|
||||
JSValue eval(Environment theEnv)
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
JSValue typeof(Environment theEnv) {
|
||||
return new JSString("string");
|
||||
}
|
||||
|
||||
JSValue add(Environment theEnv, JSValue rV)
|
||||
{
|
||||
return new JSString(s + rV.toJSString(theEnv).s);
|
||||
}
|
||||
|
||||
JSValue gt(Environment theEnv, JSValue rV) {
|
||||
if (rV instanceof JSString)
|
||||
return (s.compareTo(rV.toJSString(theEnv).s) == 1) ? JSBoolean.JSTrue : JSBoolean.JSFalse;
|
||||
else
|
||||
return toJSDouble(theEnv).gt(theEnv, rV);
|
||||
}
|
||||
|
||||
JSValue ge(Environment theEnv, JSValue rV) {
|
||||
if (rV instanceof JSString)
|
||||
return (s.compareTo(rV.toJSString(theEnv).s) != -1) ? JSBoolean.JSTrue : JSBoolean.JSFalse;
|
||||
else
|
||||
return toJSDouble(theEnv).ge(theEnv, rV);
|
||||
}
|
||||
|
||||
JSValue lt(Environment theEnv, JSValue rV) {
|
||||
if (rV instanceof JSString)
|
||||
return (s.compareTo(rV.toJSString(theEnv).s) == -1) ? JSBoolean.JSTrue : JSBoolean.JSFalse;
|
||||
else
|
||||
return toJSDouble(theEnv).lt(theEnv, rV);
|
||||
}
|
||||
|
||||
JSValue le(Environment theEnv, JSValue rV) {
|
||||
if (rV instanceof JSString)
|
||||
return (s.compareTo(rV.toJSString(theEnv).s) != 1) ? JSBoolean.JSTrue : JSBoolean.JSFalse;
|
||||
else
|
||||
return toJSDouble(theEnv).le(theEnv, rV);
|
||||
}
|
||||
|
||||
JSValue eq(Environment theEnv, JSValue rV) {
|
||||
if (rV instanceof JSString)
|
||||
return (s.compareTo(rV.toJSString(theEnv).s) == 0) ? JSBoolean.JSTrue : JSBoolean.JSFalse;
|
||||
else
|
||||
return toJSDouble(theEnv).eq(theEnv, rV);
|
||||
}
|
||||
|
||||
JSValue ne(Environment theEnv, JSValue rV) {
|
||||
if (rV instanceof JSString)
|
||||
return (s.compareTo(rV.toJSString(theEnv).s) != 0) ? JSBoolean.JSTrue : JSBoolean.JSFalse;
|
||||
else
|
||||
return toJSDouble(theEnv).ne(theEnv, rV);
|
||||
}
|
||||
|
||||
JSDouble toJSDouble(Environment theEnv) {
|
||||
return new JSDouble(s); // XXX Way More To Do, see Rhino ScriptRuntime.java
|
||||
}
|
||||
|
||||
JSString toJSString(Environment theEnv) {
|
||||
return this;
|
||||
}
|
||||
|
||||
JSValue toPrimitive(Environment theEnv, String hint) {
|
||||
return this;
|
||||
}
|
||||
|
||||
String print(String indent)
|
||||
{
|
||||
return indent + "JSString : " + s + "\n";
|
||||
}
|
||||
|
||||
protected String s;
|
||||
|
||||
}
|
||||
@@ -1,222 +0,0 @@
|
||||
class JSValue extends ExpressionNode {
|
||||
|
||||
String print(String indent)
|
||||
{
|
||||
return indent + "JSValue\n";
|
||||
}
|
||||
|
||||
JSReference evalLHS(Environment theEnv)
|
||||
{
|
||||
throw new RuntimeException("EvalLHS on non-lvalue");
|
||||
}
|
||||
|
||||
JSValue eval(Environment theEnv)
|
||||
{
|
||||
throw new RuntimeException("Eval on JSValue");
|
||||
}
|
||||
|
||||
JSValue unimplemented(String op)
|
||||
{
|
||||
throw new RuntimeException("unimplemented " + op + " called");
|
||||
}
|
||||
|
||||
JSValue gt(Environment theEnv, JSValue rV) {
|
||||
JSValue lV = toPrimitive(theEnv, "Number");
|
||||
rV = rV.toPrimitive(theEnv, "Number");
|
||||
if ((lV instanceof JSString) && (rV instanceof JSString))
|
||||
return lV.gt(theEnv, rV);
|
||||
else
|
||||
return lV.toJSDouble(theEnv).gt(theEnv, rV.toJSDouble(theEnv));
|
||||
}
|
||||
|
||||
JSValue ge(Environment theEnv, JSValue rV) {
|
||||
JSValue lV = toPrimitive(theEnv, "Number");
|
||||
rV = rV.toPrimitive(theEnv, "Number");
|
||||
if ((lV instanceof JSString) && (rV instanceof JSString))
|
||||
return lV.ge(theEnv, rV);
|
||||
else
|
||||
return lV.toJSDouble(theEnv).ge(theEnv, rV.toJSDouble(theEnv));
|
||||
}
|
||||
|
||||
JSValue lt(Environment theEnv, JSValue rV) {
|
||||
JSValue lV = toPrimitive(theEnv, "Number");
|
||||
rV = rV.toPrimitive(theEnv, "Number");
|
||||
if ((lV instanceof JSString) && (rV instanceof JSString))
|
||||
return lV.lt(theEnv, rV);
|
||||
else
|
||||
return lV.toJSDouble(theEnv).lt(theEnv, rV.toJSDouble(theEnv));
|
||||
}
|
||||
|
||||
JSValue le(Environment theEnv, JSValue rV) {
|
||||
JSValue lV = toPrimitive(theEnv, "Number");
|
||||
rV = rV.toPrimitive(theEnv, "Number");
|
||||
if ((lV instanceof JSString) && (rV instanceof JSString))
|
||||
return lV.le(theEnv, rV);
|
||||
else
|
||||
return lV.toJSDouble(theEnv).le(theEnv, rV.toJSDouble(theEnv));
|
||||
}
|
||||
|
||||
JSValue eq(Environment theEnv, JSValue rV) {
|
||||
JSValue lV = toPrimitive(theEnv, "Number");
|
||||
rV = rV.toPrimitive(theEnv, "Number");
|
||||
if ((lV instanceof JSString) && (rV instanceof JSString))
|
||||
return lV.eq(theEnv, rV);
|
||||
else
|
||||
return lV.toJSDouble(theEnv).eq(theEnv, rV.toJSDouble(theEnv));
|
||||
}
|
||||
|
||||
JSValue ne(Environment theEnv, JSValue rV) {
|
||||
JSValue lV = toPrimitive(theEnv, "Number");
|
||||
rV = rV.toPrimitive(theEnv, "Number");
|
||||
if ((lV instanceof JSString) && (rV instanceof JSString))
|
||||
return lV.ne(theEnv, rV);
|
||||
else
|
||||
return lV.toJSDouble(theEnv).ne(theEnv, rV.toJSDouble(theEnv));
|
||||
}
|
||||
|
||||
JSValue plus(Environment theEnv) {
|
||||
return toJSDouble(theEnv).plus(theEnv);
|
||||
}
|
||||
|
||||
JSValue minus(Environment theEnv) {
|
||||
return toJSDouble(theEnv).minus(theEnv);
|
||||
}
|
||||
|
||||
JSValue twiddle(Environment theEnv) {
|
||||
return toJSInteger(theEnv).twiddle(theEnv);
|
||||
}
|
||||
|
||||
JSValue bang(Environment theEnv) {
|
||||
return toJSBoolean(theEnv).bang(theEnv);
|
||||
}
|
||||
|
||||
JSValue typeof(Environment theEnv) {
|
||||
return unimplemented("typeof");
|
||||
}
|
||||
|
||||
JSValue add(Environment theEnv, JSValue rV) {
|
||||
JSValue lV = toPrimitive(theEnv, "");
|
||||
rV = rV.toPrimitive(theEnv, "");
|
||||
if ((lV instanceof JSString) || (rV instanceof JSString))
|
||||
return lV.add(theEnv, rV);
|
||||
else
|
||||
return lV.toJSDouble(theEnv).add(theEnv, rV);
|
||||
}
|
||||
|
||||
JSValue subtract(Environment theEnv, JSValue rV) {
|
||||
return toJSDouble(theEnv).subtract(theEnv, rV.toJSDouble(theEnv));
|
||||
}
|
||||
|
||||
JSValue multiply(Environment theEnv, JSValue rV) {
|
||||
return toJSDouble(theEnv).multiply(theEnv, rV.toJSDouble(theEnv));
|
||||
}
|
||||
|
||||
JSValue divide(Environment theEnv, JSValue rV) {
|
||||
return toJSDouble(theEnv).divide(theEnv, rV.toJSDouble(theEnv));
|
||||
}
|
||||
|
||||
JSValue remainder(Environment theEnv, JSValue rV) {
|
||||
return toJSDouble(theEnv).remainder(theEnv, rV.toJSDouble(theEnv));
|
||||
}
|
||||
|
||||
JSValue and(Environment theEnv, JSValue rV) {
|
||||
return toJSInteger(theEnv).and(theEnv, rV.toJSInteger(theEnv));
|
||||
}
|
||||
|
||||
JSValue or(Environment theEnv, JSValue rV) {
|
||||
return toJSInteger(theEnv).or(theEnv, rV.toJSInteger(theEnv));
|
||||
}
|
||||
|
||||
JSValue xor(Environment theEnv, JSValue rV) {
|
||||
return toJSInteger(theEnv).xor(theEnv, rV.toJSInteger(theEnv));
|
||||
}
|
||||
|
||||
JSValue shl(Environment theEnv, JSValue rV) {
|
||||
return toJSInteger(theEnv).shl(theEnv, rV.toJSInteger(theEnv));
|
||||
}
|
||||
|
||||
JSValue shr(Environment theEnv, JSValue rV) {
|
||||
return toJSInteger(theEnv).shr(theEnv, rV.toJSInteger(theEnv));
|
||||
}
|
||||
|
||||
JSValue ushl(Environment theEnv, JSValue rV) {
|
||||
return toJSInteger(theEnv).ushl(theEnv, rV.toJSInteger(theEnv));
|
||||
}
|
||||
|
||||
JSValue getProp(Environment theEnv, JSString id) {
|
||||
return toJSObject(theEnv).getProp(theEnv, id);
|
||||
}
|
||||
|
||||
boolean hasProp(Environment theEnv, JSString id) {
|
||||
return toJSObject(theEnv).hasProp(theEnv, id);
|
||||
}
|
||||
|
||||
JSValue putProp(Environment theEnv, JSString id, JSValue rV) {
|
||||
return toJSObject(theEnv).putProp(theEnv, id, rV);
|
||||
}
|
||||
|
||||
JSValue call(Environment theEnv, JSValue rV) {
|
||||
throw new JSException(new JSString("[[call]] not implemented"));
|
||||
}
|
||||
|
||||
JSValue defaultValue(Environment theEnv, String hint) {
|
||||
/*
|
||||
When the [[DefaultValue]] method of O is called with hint String, the following steps are taken:
|
||||
1. Call the [[Get]] method of object O with argument "toString".
|
||||
2. If Result(1) is not an object, go to step 5.
|
||||
3. Call the [[Call]] method of Result(1), with O as the this value and an empty argument list.
|
||||
4. If Result(3) is a primitive value, return Result(3).
|
||||
5. Call the [[Get]] method of object O with argument "valueOf".
|
||||
6. If Result(5) is not an object, go to step 9.
|
||||
7. Call the [[Call]] method of Result(5), with O as the this value and an empty argument list.
|
||||
8. If Result(7) is a primitive value, return Result(7).
|
||||
9. Generate a runtime error.
|
||||
*/
|
||||
JSValue v = null;
|
||||
if (hint.equals("String")) {
|
||||
v = getProp(theEnv, new JSString("toString"));
|
||||
if (v instanceof JSObject) {
|
||||
// invoke 'v.Call' with 'this' as the JS this
|
||||
}
|
||||
else {
|
||||
v = getProp(theEnv, new JSString("valueOf"));
|
||||
if (v instanceof JSObject) {
|
||||
}
|
||||
else
|
||||
throw new JSException(new JSString("No default value"));
|
||||
}
|
||||
}
|
||||
else { // hint.equals("Number")
|
||||
/*
|
||||
When the [[DefaultValue]] method of O is called with hint Number, the following steps are taken:
|
||||
1. Call the [[Get]] method of object O with argument "valueOf".
|
||||
2. If Result(1) is not an object, go to step 5.
|
||||
3. Call the [[Call]] method of Result(1), with O as the this value and an empty argument list.
|
||||
4. If Result(3) is a primitive value, return Result(3).
|
||||
5. Call the [[Get]] method of object O with argument "toString".
|
||||
6. If Result(5) is not an object, go to step 9.
|
||||
7. Call the [[Call]] method of Result(5), with O as the this value and an empty argument list.
|
||||
8. If Result(7) is a primitive value, return Result(7).
|
||||
9. Generate a runtime error.
|
||||
*/
|
||||
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
JSValue toPrimitive(Environment theEnv, String hint) {
|
||||
JSValue result = defaultValue(theEnv, hint);
|
||||
if (result instanceof JSObject)
|
||||
throw new JSException(new JSString("default value returned object"));
|
||||
else
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
JSObject toJSObject(Environment theEnv) { unimplemented("toJSObjet"); return null; }
|
||||
JSDouble toJSDouble(Environment theEnv) { unimplemented("toJSDouble"); return null; }
|
||||
JSInteger toJSInteger(Environment theEnv) { unimplemented("toJSInteger"); return null; }
|
||||
JSString toJSString(Environment theEnv) { unimplemented("toJSString"); return null; }
|
||||
JSBoolean toJSBoolean(Environment theEnv) { unimplemented("toJSBoolean"); return null; }
|
||||
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
|
||||
import java.util.Vector;
|
||||
|
||||
class JSValueList extends JSValue {
|
||||
|
||||
static JSValueList buildList(JSValue left, JSValue right)
|
||||
{
|
||||
JSValueList theList;
|
||||
if (left instanceof JSValueList) {
|
||||
theList = (JSValueList)left;
|
||||
theList.add(right);
|
||||
}
|
||||
else
|
||||
if (right instanceof JSValueList) {
|
||||
theList = (JSValueList)right;
|
||||
theList.add(left);
|
||||
}
|
||||
else {
|
||||
theList = new JSValueList();
|
||||
theList.add(left);
|
||||
theList.add(right);
|
||||
}
|
||||
|
||||
return theList;
|
||||
}
|
||||
|
||||
void add(JSValue v)
|
||||
{
|
||||
if (v instanceof JSValueList) {
|
||||
JSValueList vl = (JSValueList)v;
|
||||
for (int i = 0; i < vl.contents.size(); i++)
|
||||
contents.addElement((JSValue)(vl.contents.elementAt(i)));
|
||||
}
|
||||
else
|
||||
contents.addElement(v);
|
||||
}
|
||||
|
||||
Vector contents = new Vector();
|
||||
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
class LogicalNode extends BinaryNode {
|
||||
|
||||
LogicalNode(String aOp, ExpressionNode aLeft, ExpressionNode aRight)
|
||||
{
|
||||
super(aOp, aLeft, aRight);
|
||||
}
|
||||
|
||||
JSValue eval(Environment theEnv)
|
||||
{
|
||||
JSBoolean b = left.eval(theEnv).toJSBoolean(theEnv);
|
||||
if (op == "&&") {
|
||||
if (b.isFalse())
|
||||
return b;
|
||||
else {
|
||||
b = right.eval(theEnv).toJSBoolean(theEnv);
|
||||
if (b.isFalse())
|
||||
return b;
|
||||
else
|
||||
return JSBoolean.JSTrue;
|
||||
}
|
||||
}
|
||||
if (op == "||") {
|
||||
if (b.isTrue())
|
||||
return b;
|
||||
else {
|
||||
b = right.eval(theEnv).toJSBoolean(theEnv);
|
||||
if (b.isTrue())
|
||||
return b;
|
||||
else
|
||||
return JSBoolean.JSFalse;
|
||||
}
|
||||
}
|
||||
else {
|
||||
System.out.println("missing logical op " + op);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
|
||||
import java.util.Vector;
|
||||
|
||||
class NativeFunction extends JSObject {
|
||||
|
||||
NativeFunction(ControlNode aBody)
|
||||
{
|
||||
super("Function");
|
||||
body = aBody;
|
||||
}
|
||||
|
||||
JSValue call(Environment theEnv, JSValue rV)
|
||||
{
|
||||
|
||||
JSScope args = new JSScope("Arguments");
|
||||
theEnv.enterNewScope(args);
|
||||
|
||||
for (int i = 0; i < parameters.size(); i++) {
|
||||
if (rV instanceof JSValueList)
|
||||
args.putProp(theEnv, (JSString)(parameters.elementAt(i)), (JSValue) ( ((JSValueList)rV).contents.elementAt(i)) );
|
||||
else
|
||||
args.putProp(theEnv, (JSString)(parameters.elementAt(i)), rV );
|
||||
}
|
||||
|
||||
ControlNode c = body;
|
||||
while (c != null) c = c.eval(theEnv);
|
||||
|
||||
theEnv.leaveScope();
|
||||
return theEnv.resultValue;
|
||||
}
|
||||
|
||||
ControlNode body;
|
||||
Vector parameters = new Vector();
|
||||
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
class NativeNumber extends JSObject {
|
||||
|
||||
NativeNumber(double p) {
|
||||
super("Number");
|
||||
d = p;
|
||||
}
|
||||
|
||||
JSValue defaultValue(Environment theEnv, String hint) {
|
||||
if (hint.equals("String"))
|
||||
return new JSString(Double.toString(d));
|
||||
else
|
||||
return new JSDouble(d);
|
||||
}
|
||||
|
||||
double d;
|
||||
|
||||
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
class RelationalNode extends BinaryNode {
|
||||
|
||||
RelationalNode(String aOp, ExpressionNode aLeft, ExpressionNode aRight)
|
||||
{
|
||||
super(aOp, aLeft, aRight);
|
||||
}
|
||||
|
||||
JSValue eval(Environment theEnv)
|
||||
{
|
||||
JSValue lV = left.eval(theEnv);
|
||||
JSValue rV = right.eval(theEnv);
|
||||
|
||||
if (op == ">")
|
||||
return lV.gt(theEnv, rV);
|
||||
else
|
||||
if (op == ">=")
|
||||
return lV.ge(theEnv, rV);
|
||||
else
|
||||
if (op == "<")
|
||||
return lV.lt(theEnv, rV);
|
||||
else
|
||||
if (op == "<=")
|
||||
return lV.le(theEnv, rV);
|
||||
else
|
||||
if (op == "==")
|
||||
return lV.eq(theEnv, rV);
|
||||
else
|
||||
if (op == "!=")
|
||||
return lV.ne(theEnv, rV);
|
||||
else {
|
||||
System.out.println("missing relational op");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
|
||||
import java.util.Vector;
|
||||
|
||||
class SwitchNode extends ControlNode {
|
||||
|
||||
|
||||
SwitchNode(ExpressionNode e)
|
||||
{
|
||||
super(e);
|
||||
}
|
||||
|
||||
void addCase(ExpressionNode e, ControlNode c)
|
||||
{
|
||||
if (e == null)
|
||||
defaultCode = c;
|
||||
else {
|
||||
caseExpr.addElement(e);
|
||||
caseCode.addElement(c);
|
||||
}
|
||||
}
|
||||
|
||||
ControlNode eval(Environment theEnv)
|
||||
{
|
||||
JSValue v = expr.eval(theEnv);
|
||||
int count = caseExpr.size();
|
||||
for (int i = 0; i < count; i++) {
|
||||
ExpressionNode e = (ExpressionNode)(caseExpr.elementAt(i));
|
||||
JSBoolean b = v.eq(theEnv, e.eval(theEnv)).toJSBoolean(theEnv);
|
||||
if (b.isTrue())
|
||||
return (ControlNode)(caseCode.elementAt(i));
|
||||
}
|
||||
if (defaultCode != null)
|
||||
return defaultCode;
|
||||
else
|
||||
return next;
|
||||
}
|
||||
|
||||
Vector caseExpr = new Vector();
|
||||
Vector caseCode = new Vector();
|
||||
|
||||
ControlNode defaultCode;
|
||||
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
class ThrowNode extends ControlNode {
|
||||
|
||||
ThrowNode(ExpressionNode e)
|
||||
{
|
||||
super(e);
|
||||
}
|
||||
|
||||
ControlNode eval(Environment theEnv)
|
||||
{
|
||||
throw new JSException(expr.eval(theEnv));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
|
||||
import java.util.Vector;
|
||||
|
||||
class TryNode extends ControlNode {
|
||||
|
||||
TryNode(ControlNode tryCode)
|
||||
{
|
||||
super(null);
|
||||
tryBody = tryCode;
|
||||
}
|
||||
|
||||
void addFinally(ControlNode finallyCode)
|
||||
{
|
||||
finallyBody = finallyCode;
|
||||
}
|
||||
|
||||
void addCatchClause(ExpressionNode e, ControlNode c)
|
||||
{
|
||||
catchExpr.addElement(e);
|
||||
catchCode.addElement(c);
|
||||
}
|
||||
|
||||
ControlNode eval(Environment theEnv)
|
||||
{
|
||||
try {
|
||||
ControlNode c = tryBody;
|
||||
while (c != null) c = c.eval(theEnv);
|
||||
}
|
||||
catch (JSException x) {
|
||||
int count = catchExpr.size();
|
||||
for (int i = 0; i < count; i++) {
|
||||
ExpressionNode e = (ExpressionNode)(catchExpr.elementAt(i));
|
||||
String id = ((JSObject)e).oClass;
|
||||
theEnv.scope.contents.put(id, x.getValue()); // XXX YAARGH !!!
|
||||
return (ControlNode)(catchCode.elementAt(i));
|
||||
}
|
||||
}
|
||||
return next;
|
||||
}
|
||||
|
||||
Vector catchExpr = new Vector();
|
||||
Vector catchCode = new Vector();
|
||||
|
||||
ControlNode tryBody;
|
||||
ControlNode finallyBody;
|
||||
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
class UnaryNode extends ExpressionNode {
|
||||
|
||||
UnaryNode(String aOp, ExpressionNode aChild)
|
||||
{
|
||||
child = aChild;
|
||||
op = aOp;
|
||||
}
|
||||
|
||||
String print(String indent)
|
||||
{
|
||||
StringBuffer result = new StringBuffer(indent);
|
||||
result.append("UnaryNode ");
|
||||
result.append(op);
|
||||
result.append("\n");
|
||||
indent += " ";
|
||||
if (child == null) {
|
||||
result.append(indent);
|
||||
result.append("null\n");
|
||||
}
|
||||
else
|
||||
result.append(child.print(indent));
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
JSValue eval(Environment theEnv)
|
||||
{
|
||||
JSValue cV = child.eval(theEnv);
|
||||
|
||||
if (op == "+")
|
||||
return cV.plus(theEnv);
|
||||
else
|
||||
if (op == "-")
|
||||
return cV.minus(theEnv);
|
||||
else
|
||||
if (op == "~")
|
||||
return cV.twiddle(theEnv);
|
||||
else
|
||||
if (op == "!")
|
||||
return cV.bang(theEnv);
|
||||
else
|
||||
if (op == "typeof")
|
||||
return cV.typeof(theEnv);
|
||||
else {
|
||||
System.out.println("missing unary op " + op);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
String getOperator()
|
||||
{
|
||||
return op;
|
||||
}
|
||||
|
||||
ExpressionNode getChild()
|
||||
{
|
||||
return child;
|
||||
}
|
||||
|
||||
protected ExpressionNode child;
|
||||
protected String op;
|
||||
|
||||
}
|
||||
@@ -1,343 +0,0 @@
|
||||
// -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
//
|
||||
// The contents of this file are subject to the Netscape Public
|
||||
// License Version 1.1 (the "License"); you may not use this file
|
||||
// except in compliance with the License. You may obtain a copy of
|
||||
// the License at http://www.mozilla.org/NPL/
|
||||
//
|
||||
// Software distributed under the License is distributed on an "AS
|
||||
// IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
||||
// implied. See the License for the specific language governing
|
||||
// rights and limitations under the License.
|
||||
//
|
||||
// The Original Code is the JavaScript 2 Prototype.
|
||||
//
|
||||
// The Initial Developer of the Original Code is Netscape
|
||||
// Communications Corporation. Portions created by Netscape are
|
||||
// Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
// Rights Reserved.
|
||||
|
||||
|
||||
//
|
||||
// JS2 shell.
|
||||
//
|
||||
|
||||
#if 1
|
||||
#define DEBUGGER_FOO
|
||||
#define INTERPRET_INPUT
|
||||
#else
|
||||
#undef DEBUGGER_FOO
|
||||
#undef INTERPRET_INPUT
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include "world.h"
|
||||
#include "interpreter.h"
|
||||
#include "icodegenerator.h"
|
||||
|
||||
#ifdef DEBUGGER_FOO
|
||||
#include "debugger.h"
|
||||
#endif
|
||||
|
||||
#if defined(XP_MAC) && !defined(XP_MAC_MPW)
|
||||
#include <SIOUX.h>
|
||||
#include <MacTypes.h>
|
||||
|
||||
static char *mac_argv[] = {"js2", 0};
|
||||
|
||||
static void initConsole(StringPtr consoleName,
|
||||
const char* startupMessage,
|
||||
int &argc, char **&argv)
|
||||
{
|
||||
SIOUXSettings.autocloseonquit = false;
|
||||
SIOUXSettings.asktosaveonclose = false;
|
||||
SIOUXSetTitle(consoleName);
|
||||
|
||||
// Set up a buffer for stderr (otherwise it's a pig).
|
||||
static char buffer[BUFSIZ];
|
||||
setvbuf(stderr, buffer, _IOLBF, BUFSIZ);
|
||||
|
||||
JavaScript::stdOut << startupMessage;
|
||||
|
||||
argc = 1;
|
||||
argv = mac_argv;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
namespace JavaScript {
|
||||
namespace Shell {
|
||||
|
||||
using namespace ICG;
|
||||
using namespace JSTypes;
|
||||
using namespace Interpreter;
|
||||
|
||||
// Interactively read a line from the input stream in and put it into
|
||||
// s. Return false if reached the end of input before reading anything.
|
||||
static bool promptLine(LineReader &inReader, string &s, const char *prompt)
|
||||
{
|
||||
if (prompt) {
|
||||
stdOut << prompt;
|
||||
#ifdef XP_MAC_MPW
|
||||
// Print a CR after the prompt because MPW grabs the entire
|
||||
// line when entering an interactive command.
|
||||
stdOut << '\n';
|
||||
#endif
|
||||
}
|
||||
return inReader.readLine(s) != 0;
|
||||
}
|
||||
|
||||
World world;
|
||||
|
||||
/* "filename" of the console */
|
||||
const String ConsoleName = widenCString("<console>");
|
||||
const bool showTokens = false;
|
||||
|
||||
#ifdef DEBUGGER_FOO
|
||||
Reader *sourceReader; /* Reader for console file */
|
||||
|
||||
static
|
||||
const Reader *ResolveFile (const String& fileName)
|
||||
{
|
||||
if (fileName == ConsoleName)
|
||||
return sourceReader;
|
||||
else
|
||||
{
|
||||
stdErr << "Could not locate source for file '" << fileName << "'\n";
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
JavaScript::Debugger::Shell jsd(world, stdin, JavaScript::stdOut,
|
||||
JavaScript::stdOut, &ResolveFile);
|
||||
#endif
|
||||
|
||||
static JSValue print(Context *cx, const JSValues &argv)
|
||||
{
|
||||
size_t n = argv.size();
|
||||
if (n > 1) { // the 'this' parameter is un-interesting
|
||||
stdOut << argv[1];
|
||||
for (size_t i = 2; i < n; ++i)
|
||||
stdOut << ' ' << argv[i];
|
||||
}
|
||||
stdOut << "\n";
|
||||
return kUndefinedValue;
|
||||
}
|
||||
|
||||
static JSValue dump(Context *cx, const JSValues &argv)
|
||||
{
|
||||
size_t n = argv.size();
|
||||
if (n > 1) { // the 'this' parameter is un-interesting
|
||||
if (argv[1].isFunction()) {
|
||||
JSFunction *f = static_cast<JSFunction *>(argv[1].function);
|
||||
if (f->isNative())
|
||||
stdOut << "Native function";
|
||||
else
|
||||
stdOut << *f->getICode();
|
||||
}
|
||||
else
|
||||
stdOut << "Not a function";
|
||||
}
|
||||
stdOut << "\n";
|
||||
return kUndefinedValue;
|
||||
}
|
||||
|
||||
|
||||
inline char narrow(char16 ch) { return char(ch); }
|
||||
|
||||
static JSValue load(Context *cx, const JSValues &argv)
|
||||
{
|
||||
|
||||
JSValue result;
|
||||
size_t n = argv.size();
|
||||
if (n > 1) {
|
||||
for (size_t i = 1; i < n; ++i) {
|
||||
JSValue val = argv[i].toString();
|
||||
if (val.isString()) {
|
||||
String fileName(*val.string);
|
||||
std::string str(fileName.length(), char());
|
||||
std::transform(fileName.begin(), fileName.end(), str.begin(), narrow);
|
||||
FILE* f = fopen(str.c_str(), "r");
|
||||
if (f) {
|
||||
result = cx->readEvalFile(f, fileName);
|
||||
fclose(f);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
#if 0 // need a XP version of this, rip off from Monkey?
|
||||
#include <sys/timeb.h>
|
||||
static JSValue time(Context *cx, const JSValues &argv)
|
||||
{
|
||||
struct _timeb timebuffer;
|
||||
_ftime(&timebuffer);
|
||||
|
||||
return JSValue((double)timebuffer.time * 1000 + timebuffer.millitm);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void readEvalPrint(FILE *in, World &world)
|
||||
{
|
||||
JSScope global;
|
||||
Context cx(world, &global);
|
||||
#ifdef DEBUGGER_FOO
|
||||
jsd.attachToContext (&cx);
|
||||
#endif
|
||||
global.defineNativeFunction(world.identifiers["print"], print);
|
||||
global.defineNativeFunction(world.identifiers["dump"], dump);
|
||||
global.defineNativeFunction(world.identifiers["load"], load);
|
||||
// global.defineNativeFunction(world.identifiers["time"], time);
|
||||
|
||||
String buffer;
|
||||
string line;
|
||||
LineReader inReader(in);
|
||||
|
||||
while (promptLine(inReader, line, buffer.empty() ? "js> " : "> ")) {
|
||||
appendChars(buffer, line.data(), line.size());
|
||||
try {
|
||||
Arena a;
|
||||
Parser p(world, a, buffer, ConsoleName);
|
||||
|
||||
if (showTokens) {
|
||||
Lexer &l = p.lexer;
|
||||
while (true) {
|
||||
const Token &t = l.get(true);
|
||||
if (t.hasKind(Token::end))
|
||||
break;
|
||||
stdOut << ' ';
|
||||
t.print(stdOut, true);
|
||||
}
|
||||
stdOut << '\n';
|
||||
} else {
|
||||
StmtNode *parsedStatements = p.parseProgram();
|
||||
ASSERT(p.lexer.peek(true).hasKind(Token::end));
|
||||
{
|
||||
PrettyPrinter f(stdOut, 30);
|
||||
{
|
||||
PrettyPrinter::Block b(f, 2);
|
||||
f << "Program =";
|
||||
f.linearBreak(1);
|
||||
StmtNode::printStatements(f, parsedStatements);
|
||||
}
|
||||
f.end();
|
||||
}
|
||||
stdOut << '\n';
|
||||
#ifdef INTERPRET_INPUT
|
||||
#ifdef DEBUGGER_FOO
|
||||
sourceReader = &(p.lexer.reader);
|
||||
#endif
|
||||
// Generate code for parsedStatements, which is a linked
|
||||
// list of zero or more statements
|
||||
ICodeModule* icm = cx.genCode(parsedStatements, ConsoleName);
|
||||
if (icm) {
|
||||
stdOut << *icm;
|
||||
JSValue result = cx.interpret(icm, JSValues());
|
||||
stdOut << "result = " << result << "\n";
|
||||
delete icm;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
clear(buffer);
|
||||
} catch (Exception &e) {
|
||||
/* If we got a syntax error on the end of input,
|
||||
* then wait for a continuation
|
||||
* of input rather than printing the error message. */
|
||||
if (!(e.hasKind(Exception::syntaxError) &&
|
||||
e.lineNum && e.pos == buffer.size() &&
|
||||
e.sourceFile == ConsoleName)) {
|
||||
stdOut << '\n' << e.fullMessage();
|
||||
clear(buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
stdOut << '\n';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Poor man's instruction tracing facility.
|
||||
*/
|
||||
class Tracer : public Context::Listener {
|
||||
typedef InstructionStream::difference_type InstructionOffset;
|
||||
void listen(Context* context, Context::Event event)
|
||||
{
|
||||
if (event & Context::EV_STEP) {
|
||||
ICodeModule *iCode = context->getICode();
|
||||
JSValues ®isters = context->getRegisters();
|
||||
InstructionIterator pc = context->getPC();
|
||||
|
||||
|
||||
InstructionOffset offset = (pc - iCode->its_iCode->begin());
|
||||
printFormat(stdOut, "trace [%02u:%04u]: ",
|
||||
iCode->mID, offset);
|
||||
|
||||
Instruction* i = *pc;
|
||||
stdOut << *i;
|
||||
if (i->op() != BRANCH && i->count() > 0) {
|
||||
stdOut << " [";
|
||||
i->printOperands(stdOut, registers);
|
||||
stdOut << "]\n";
|
||||
} else {
|
||||
stdOut << '\n';
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
char * tests[] = {
|
||||
"function fact(n) { if (n > 1) return n * fact(n-1); else return 1; } print(fact(6), \" should be 720\"); return;" ,
|
||||
"a = { f1: 1, f2: 2}; print(a.f2++, \" should be 2\"); print(a.f2 <<= 1, \" should be 6\"); return;" ,
|
||||
"class A { static var b = 3; static function s() { return b++; }function x() { return \"Ax\"; } function y() { return \"Ay\"; } } var a:A = new A; print(a.s(), \" should be 3\"); print(A.b, \" should be 4\"); return;",
|
||||
"class B extends A { function x() { return \"Bx\"; } } var b:B = new B; print(b.x(), \" should be Bx\"); print(b.y(), \" should be Ay\"); return;"
|
||||
};
|
||||
|
||||
static void testCompile()
|
||||
{
|
||||
JSScope glob;
|
||||
Context cx(world, &glob);
|
||||
glob.defineNativeFunction(world.identifiers["print"], print);
|
||||
for (uint i = 0; i < sizeof(tests) / sizeof(char *); i++) {
|
||||
String testScript = widenCString(tests[i]);
|
||||
Arena a;
|
||||
Parser p(world, a, testScript, widenCString("testCompile"));
|
||||
StmtNode *parsedStatements = p.parseProgram();
|
||||
ICodeGenerator icg(&world, &glob);
|
||||
StmtNode *s = parsedStatements;
|
||||
while (s) {
|
||||
icg.genStmt(s);
|
||||
s = s->next;
|
||||
}
|
||||
cx.interpret(icg.complete(), JSValues());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} /* namespace Shell */
|
||||
} /* namespace JavaScript */
|
||||
|
||||
|
||||
#if defined(XP_MAC) && !defined(XP_MAC_MPW)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
initConsole("\pJavaScript Shell", "Welcome to the js2 shell.\n", argc, argv);
|
||||
#else
|
||||
int main(int , char **)
|
||||
{
|
||||
#endif
|
||||
|
||||
using namespace JavaScript;
|
||||
using namespace Shell;
|
||||
#if 1
|
||||
testCompile();
|
||||
#endif
|
||||
readEvalPrint(stdin, world);
|
||||
return 0;
|
||||
// return ProcessArgs(argv + 1, argc - 1);
|
||||
}
|
||||
@@ -1,316 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the JavaScript 2 Prototype.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
#ifndef jsclasses_h
|
||||
#define jsclasses_h
|
||||
|
||||
#include "jstypes.h"
|
||||
|
||||
namespace JavaScript {
|
||||
namespace JSClasses {
|
||||
|
||||
using JSTypes::JSValue;
|
||||
using JSTypes::JSObject;
|
||||
using JSTypes::JSType;
|
||||
using JSTypes::JSScope;
|
||||
using JSTypes::JSFunction;
|
||||
using ICG::ICodeModule;
|
||||
|
||||
|
||||
struct JSSlot {
|
||||
typedef enum { kNoFlag = 0, kIsConstructor = 0x01 } SlotFlags; // <-- readonly, enumerable etc
|
||||
|
||||
JSType* mType;
|
||||
uint32 mIndex;
|
||||
SlotFlags mFlags;
|
||||
|
||||
JSSlot() : mType(0), mFlags(kNoFlag)
|
||||
{
|
||||
}
|
||||
|
||||
bool isConstructor() const { return (mFlags & kIsConstructor) != 0; }
|
||||
};
|
||||
|
||||
#if defined(XP_MAC)
|
||||
// copied from default template parameters in map.
|
||||
typedef gc_allocator<std::pair<const String, JSSlot> > gc_slot_allocator;
|
||||
#elif defined(XP_UNIX)
|
||||
typedef JSTypes::gc_map_allocator gc_slot_allocator;
|
||||
#elif defined(_WIN32)
|
||||
typedef gc_allocator<JSSlot> gc_slot_allocator;
|
||||
#endif
|
||||
|
||||
typedef std::map<String, JSSlot, std::less<const String>, gc_slot_allocator> JSSlots;
|
||||
|
||||
|
||||
typedef std::pair<String, JSFunction*> MethodEntry;
|
||||
typedef std::vector<MethodEntry> JSMethods;
|
||||
|
||||
/**
|
||||
* Represents a class in the JavaScript 2 (ECMA 4) language.
|
||||
* Since a class defines a scope, and is defined in a scope,
|
||||
* a new scope is created whose parent scope is the scope of
|
||||
* class definition.
|
||||
*/
|
||||
class JSClass : public JSType {
|
||||
protected:
|
||||
JSScope* mScope;
|
||||
uint32 mSlotCount;
|
||||
JSSlots mSlots;
|
||||
uint32 mStaticCount;
|
||||
JSSlots mStaticSlots;
|
||||
JSValue* mStaticData;
|
||||
JSMethods mMethods;
|
||||
public:
|
||||
JSClass(JSScope* scope, const String& name, JSClass* superClass = 0)
|
||||
: JSType(name, superClass),
|
||||
mScope(new JSScope(scope)),
|
||||
mSlotCount(superClass ? superClass->mSlotCount : 0),
|
||||
mStaticCount(0),
|
||||
mStaticData(0)
|
||||
{
|
||||
if (superClass) {
|
||||
// inherit superclass methods
|
||||
JSMethods::iterator end = superClass->mMethods.end();
|
||||
for (JSMethods::iterator i = superClass->mMethods.begin(); i != end; i++)
|
||||
mMethods.push_back(*i);
|
||||
}
|
||||
}
|
||||
|
||||
JSClass* getSuperClass()
|
||||
{
|
||||
return static_cast<JSClass*>(mBaseType);
|
||||
}
|
||||
|
||||
JSScope* getScope()
|
||||
{
|
||||
return mScope;
|
||||
}
|
||||
|
||||
const JSSlot& defineSlot(const String& name, JSType* type)
|
||||
{
|
||||
JSSlot& slot = mSlots[name];
|
||||
ASSERT(slot.mType == 0);
|
||||
slot.mType = type;
|
||||
slot.mIndex = mSlotCount++; // starts at 0.
|
||||
return slot;
|
||||
}
|
||||
|
||||
const JSSlot& getSlot(const String& name)
|
||||
{
|
||||
return mSlots[name];
|
||||
}
|
||||
|
||||
bool hasSlot(const String& name)
|
||||
{
|
||||
return (mSlots.find(name) != mSlots.end());
|
||||
}
|
||||
|
||||
JSSlots& getSlots()
|
||||
{
|
||||
return mSlots;
|
||||
}
|
||||
|
||||
uint32 getSlotCount()
|
||||
{
|
||||
return mSlotCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Define a static/class variable.
|
||||
*/
|
||||
const JSSlot& defineStatic(const String& name, JSType* type)
|
||||
{
|
||||
JSSlot& slot = mStaticSlots[name];
|
||||
ASSERT(slot.mType == 0);
|
||||
slot.mType = type;
|
||||
slot.mIndex = mStaticCount++;
|
||||
return slot;
|
||||
}
|
||||
|
||||
const JSSlot& defineConstructor(const String& name)
|
||||
{
|
||||
JSSlot& slot = mStaticSlots[name];
|
||||
ASSERT(slot.mType == 0);
|
||||
slot.mType = &JSTypes::Function_Type;
|
||||
slot.mIndex = mStaticCount++;
|
||||
slot.mFlags = JSSlot::kIsConstructor;
|
||||
return slot;
|
||||
}
|
||||
|
||||
const JSSlot& getStatic(const String& name)
|
||||
{
|
||||
return mStaticSlots[name];
|
||||
}
|
||||
|
||||
bool hasStatic(const String& name, JSType*& type, bool &isConstructor)
|
||||
{
|
||||
JSSlots::const_iterator i = mStaticSlots.find(name);
|
||||
if (i != mStaticSlots.end()) {
|
||||
type = i->second.mType;
|
||||
isConstructor = i->second.isConstructor();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool hasStatic(const String& name)
|
||||
{
|
||||
return (mStaticSlots.find(name) != mStaticSlots.end());
|
||||
}
|
||||
|
||||
bool complete()
|
||||
{
|
||||
mStaticData = new JSValue[mStaticCount];
|
||||
return (mStaticData != 0);
|
||||
}
|
||||
|
||||
JSValue& operator[] (uint32 index)
|
||||
{
|
||||
return mStaticData[index];
|
||||
}
|
||||
|
||||
virtual void printProperties(Formatter& f)
|
||||
{
|
||||
f << "Properties:\n";
|
||||
JSObject::printProperties(f);
|
||||
f << "Statics:\n";
|
||||
printStatics(f);
|
||||
}
|
||||
|
||||
void printStatics(Formatter& f)
|
||||
{
|
||||
JSClass* superClass = getSuperClass();
|
||||
if (superClass) superClass->printStatics(f);
|
||||
for (JSSlots::iterator i = mStaticSlots.begin(), end = mStaticSlots.end(); i != end; ++i) {
|
||||
f << i->first << " : " << mStaticData[i->second.mIndex] << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
void defineMethod(const String& name, JSFunction *f)
|
||||
{
|
||||
uint32 slot;
|
||||
if (hasMethod(name, slot))
|
||||
mMethods[slot] = MethodEntry(name, f);
|
||||
else
|
||||
mMethods.push_back(MethodEntry(name, f));
|
||||
}
|
||||
|
||||
bool hasMethod(const String& name, uint32& index)
|
||||
{
|
||||
JSMethods::iterator end = mMethods.end();
|
||||
for (JSMethods::iterator i = mMethods.begin(); i != end; i++) {
|
||||
if (i->first == name) {
|
||||
index = i - mMethods.begin();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
JSFunction* getMethod(uint32 index)
|
||||
{
|
||||
return mMethods[index].second;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Represents an instance of a JSClass.
|
||||
*/
|
||||
class JSInstance : public JSObject {
|
||||
protected:
|
||||
JSValue mSlots[1];
|
||||
public:
|
||||
void* operator new(size_t n, JSClass* thisClass)
|
||||
{
|
||||
uint32 slotCount = thisClass->getSlotCount();
|
||||
if (slotCount > 0) n += sizeof(JSValue) * (slotCount - 1);
|
||||
return gc_base::operator new(n);
|
||||
}
|
||||
|
||||
#if !defined(XP_MAC)
|
||||
void operator delete(void* /*ptr*/, JSClass* /*thisClass*/) {}
|
||||
#endif
|
||||
|
||||
JSInstance(JSClass* thisClass)
|
||||
{
|
||||
mType = thisClass;
|
||||
// initialize extra slots with undefined.
|
||||
uint32 slotCount = thisClass->getSlotCount();
|
||||
if (slotCount > 0) {
|
||||
std::uninitialized_fill(&mSlots[1], &mSlots[1] + (slotCount - 1),
|
||||
JSTypes::kUndefinedValue);
|
||||
}
|
||||
// for grins, use the prototype link to access methods.
|
||||
setPrototype(thisClass->getScope());
|
||||
}
|
||||
|
||||
JSFunction* getMethod(uint32 index)
|
||||
{
|
||||
return getClass()->getMethod(index);
|
||||
}
|
||||
|
||||
JSClass* getClass()
|
||||
{
|
||||
return static_cast<JSClass*>(mType);
|
||||
}
|
||||
|
||||
JSValue& operator[] (uint32 index)
|
||||
{
|
||||
return mSlots[index];
|
||||
}
|
||||
|
||||
virtual void printProperties(Formatter& f)
|
||||
{
|
||||
f << "Properties:\n";
|
||||
JSObject::printProperties(f);
|
||||
f << "Slots:\n";
|
||||
printSlots(f, getClass());
|
||||
}
|
||||
|
||||
private:
|
||||
void printSlots(Formatter& f, JSClass* thisClass)
|
||||
{
|
||||
JSClass* superClass = thisClass->getSuperClass();
|
||||
if (superClass) printSlots(f, superClass);
|
||||
JSSlots& slots = thisClass->getSlots();
|
||||
for (JSSlots::iterator i = slots.begin(), end = slots.end(); i != end; ++i) {
|
||||
f << i->first << " : " << mSlots[i->second.mIndex] << "\n";
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
} /* namespace JSClasses */
|
||||
} /* namespace JavaScript */
|
||||
|
||||
#endif /* jsclasses_h */
|
||||
@@ -1,208 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the JavaScript 2 Prototype.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
#include "jsmath.h"
|
||||
|
||||
namespace JavaScript {
|
||||
namespace JSMathClass {
|
||||
|
||||
using namespace JSTypes;
|
||||
|
||||
#ifndef M_E
|
||||
#define M_E 2.7182818284590452354
|
||||
#endif
|
||||
#ifndef M_LOG2E
|
||||
#define M_LOG2E 1.4426950408889634074
|
||||
#endif
|
||||
#ifndef M_LOG10E
|
||||
#define M_LOG10E 0.43429448190325182765
|
||||
#endif
|
||||
#ifndef M_LN2
|
||||
#define M_LN2 0.69314718055994530942
|
||||
#endif
|
||||
#ifndef M_LN10
|
||||
#define M_LN10 2.30258509299404568402
|
||||
#endif
|
||||
#ifndef M_PI
|
||||
#define M_PI 3.14159265358979323846
|
||||
#endif
|
||||
#ifndef M_SQRT2
|
||||
#define M_SQRT2 1.41421356237309504880
|
||||
#endif
|
||||
#ifndef M_SQRT1_2
|
||||
#define M_SQRT1_2 0.70710678118654752440
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
Concept copied from SpiderMonkey -
|
||||
fd_XXX needs to be defined either as a call to the fdlibm routine
|
||||
or the native C library routine depending on the platform
|
||||
*/
|
||||
|
||||
#define JS_USE_FDLIBM_MATH 0
|
||||
|
||||
|
||||
#if !JS_USE_FDLIBM_MATH
|
||||
/*
|
||||
* Use system provided math routines.
|
||||
*/
|
||||
|
||||
|
||||
#define fd_acos acos
|
||||
#define fd_asin asin
|
||||
#define fd_atan atan
|
||||
#define fd_atan2 atan2
|
||||
#define fd_ceil ceil
|
||||
#define fd_copysign copysign
|
||||
#define fd_cos cos
|
||||
#define fd_exp exp
|
||||
#define fd_fabs fabs
|
||||
#define fd_floor floor
|
||||
#define fd_fmod fmod
|
||||
#define fd_log log
|
||||
#define fd_pow pow
|
||||
#define fd_sin sin
|
||||
#define fd_sqrt sqrt
|
||||
#define fd_tan tan
|
||||
|
||||
#endif
|
||||
|
||||
JSValue math_abs(Context *cx, const JSValues& argv)
|
||||
{
|
||||
if (argv.size() > 0) {
|
||||
JSValue num = argv[1].toNumber();
|
||||
if (num.isNaN()) return num;
|
||||
if (num.isNegativeZero()) return kPositiveZero;
|
||||
if (num.isNegativeInfinity()) return kPositiveInfinity;
|
||||
if (num.f64 < 0) return JSValue(-num.f64);
|
||||
return num;
|
||||
}
|
||||
return kUndefinedValue;
|
||||
}
|
||||
|
||||
JSValue math_acos(Context *cx, const JSValues& argv)
|
||||
{
|
||||
if (argv.size() > 0) {
|
||||
JSValue num = argv[1].toNumber();
|
||||
return JSValue(fd_acos(num.f64));
|
||||
}
|
||||
return kUndefinedValue;
|
||||
}
|
||||
|
||||
JSValue math_asin(Context *cx, const JSValues& argv)
|
||||
{
|
||||
if (argv.size() > 0) {
|
||||
JSValue num = argv[1].toNumber();
|
||||
return JSValue(fd_asin(num.f64));
|
||||
}
|
||||
return kUndefinedValue;
|
||||
}
|
||||
|
||||
JSValue math_atan(Context *cx, const JSValues& argv)
|
||||
{
|
||||
if (argv.size() > 0) {
|
||||
JSValue num = argv[1].toNumber();
|
||||
return JSValue(fd_atan(num.f64));
|
||||
}
|
||||
return kUndefinedValue;
|
||||
}
|
||||
|
||||
JSValue math_atan2(Context *cx, const JSValues& argv)
|
||||
{
|
||||
if (argv.size() > 1) {
|
||||
JSValue num1 = argv[1].toNumber();
|
||||
JSValue num2 = argv[1].toNumber();
|
||||
return JSValue(fd_atan2(num1.f64, num2.f64));
|
||||
}
|
||||
return kUndefinedValue;
|
||||
}
|
||||
|
||||
JSValue math_ceil(Context *cx, const JSValues& argv)
|
||||
{
|
||||
if (argv.size() > 0) {
|
||||
JSValue num = argv[1].toNumber();
|
||||
return JSValue(fd_ceil(num.f64));
|
||||
}
|
||||
return kUndefinedValue;
|
||||
}
|
||||
|
||||
struct MathFunctionEntry {
|
||||
char *name;
|
||||
JSNativeFunction::JSCode fn;
|
||||
} MathFunctions[] = {
|
||||
{ "abs", math_abs },
|
||||
{ "acos", math_acos },
|
||||
{ "asin", math_asin },
|
||||
{ "atan", math_atan },
|
||||
{ "atan2", math_atan2 },
|
||||
{ "ceil", math_acos },
|
||||
{ "acos", math_acos },
|
||||
{ "acos", math_acos }
|
||||
};
|
||||
|
||||
struct MathConstantEntry {
|
||||
char *name;
|
||||
double value;
|
||||
} MathConstants[] = {
|
||||
{ "E", M_E },
|
||||
{ "LOG2E", M_LOG2E },
|
||||
{ "LOG10E", M_LOG10E },
|
||||
{ "LN2", M_LN2 },
|
||||
{ "LN10", M_LN10 },
|
||||
{ "PI", M_PI },
|
||||
{ "SQRT2", M_SQRT2 },
|
||||
{ "SQRT1_2", M_SQRT1_2 }
|
||||
};
|
||||
|
||||
// There is no constructor for Math, we simply initialize
|
||||
// the properties of the Math object
|
||||
void JSMath::initMathObject(JSScope *g)
|
||||
{
|
||||
int i;
|
||||
JSMath *m = new JSMath();
|
||||
m->setClass(new JSString("Math"));
|
||||
|
||||
for (i = 0; i < sizeof(MathFunctions) / sizeof(MathFunctionEntry); i++)
|
||||
m->setProperty(widenCString(MathFunctions[i].name), JSValue(new JSNativeFunction(MathFunctions[i].fn) ) );
|
||||
|
||||
for (i = 0; i < sizeof(MathConstants) / sizeof(MathConstantEntry); i++)
|
||||
m->setProperty(widenCString(MathConstants[i].name), JSValue(MathConstants[i].value) );
|
||||
|
||||
g->setProperty(widenCString("Math"), JSValue(m));
|
||||
|
||||
}
|
||||
|
||||
} /* JSMathClass */
|
||||
} /* JavaScript */
|
||||
@@ -1,58 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the JavaScript 2 Prototype.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
#ifndef jsmath_h
|
||||
#define jsmath_h
|
||||
|
||||
#include "jstypes.h"
|
||||
|
||||
namespace JavaScript {
|
||||
namespace JSMathClass {
|
||||
|
||||
using JSTypes::JSObject;
|
||||
using JSTypes::JSString;
|
||||
using JSTypes::JSScope;
|
||||
|
||||
class JSMath : public JSObject {
|
||||
private:
|
||||
JSMath() { }
|
||||
public:
|
||||
static void initMathObject(JSScope *g);
|
||||
};
|
||||
|
||||
|
||||
} /* JSMathClass */
|
||||
} /* JavaScript */
|
||||
|
||||
|
||||
#endif jsmath_h
|
||||
@@ -1,775 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the JavaScript 2 Prototype.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
#include "jstypes.h"
|
||||
#include "jsclasses.h"
|
||||
#include "numerics.h"
|
||||
#include "icodegenerator.h"
|
||||
#include "interpreter.h"
|
||||
|
||||
namespace JavaScript {
|
||||
namespace JSTypes {
|
||||
|
||||
using namespace JSClasses;
|
||||
using namespace Interpreter;
|
||||
|
||||
/********** Object Object Stuff **************************/
|
||||
|
||||
JSValue object_toString(Context *cx, const JSValues& argv)
|
||||
{
|
||||
if (argv.size() > 0) {
|
||||
JSString *s = new JSString("[object ");
|
||||
JSValue theThis = argv[0];
|
||||
ASSERT(theThis.isObject());
|
||||
s->append(theThis.object->getClass());
|
||||
s->append("]");
|
||||
return JSValue(s);
|
||||
}
|
||||
return kUndefinedValue;
|
||||
}
|
||||
|
||||
JSValue objectConstructor(Context *cx, const JSValues& argv)
|
||||
{
|
||||
ASSERT(argv.size() > 0);
|
||||
JSValue theThis = argv[0];
|
||||
|
||||
// the prototype and class have been established already
|
||||
|
||||
return theThis;
|
||||
}
|
||||
|
||||
struct ObjectFunctionEntry {
|
||||
char *name;
|
||||
JSNativeFunction::JSCode fn;
|
||||
} ObjectFunctions[] = {
|
||||
{ "toString", object_toString },
|
||||
};
|
||||
|
||||
|
||||
JSObject *JSObject::objectPrototypeObject = JSObject::initJSObject();
|
||||
String JSObject::ObjectString = widenCString("Object");
|
||||
|
||||
// This establishes the ur-prototype, there's a timing issue
|
||||
// here - the JSObject static initializers have to run before
|
||||
// any other JSObject objects are constructed.
|
||||
JSObject *JSObject::initJSObject()
|
||||
{
|
||||
JSObject *result = new JSObject();
|
||||
|
||||
for (int i = 0; i < sizeof(ObjectFunctions) / sizeof(ObjectFunctionEntry); i++)
|
||||
result->setProperty(widenCString(ObjectFunctions[i].name), JSValue(new JSNativeFunction(ObjectFunctions[i].fn) ) );
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// Install the 'Object' constructor into the scope, mostly irrelevant since making
|
||||
// a new JSObject does all the work of setting the prototype and [[class]] values.
|
||||
void JSObject::initObjectObject(JSScope *g)
|
||||
{
|
||||
JSNativeFunction *objCon = new JSNativeFunction(objectConstructor);
|
||||
|
||||
objCon->setProperty(widenCString("prototype"), JSValue(objectPrototypeObject));
|
||||
|
||||
|
||||
|
||||
|
||||
g->setProperty(ObjectString, JSValue(objCon));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/********** Function Object Stuff **************************/
|
||||
|
||||
// An empty function that returns undefined
|
||||
JSValue functionPrototypeFunction(Context *cx, const JSValues& argv)
|
||||
{
|
||||
return kUndefinedValue;
|
||||
}
|
||||
|
||||
|
||||
JSValue function_constructor(Context *cx, const JSValues& argv)
|
||||
{
|
||||
// build a function from the arguments into the this.
|
||||
ASSERT(argv.size() > 0);
|
||||
JSValue theThis = argv[0];
|
||||
ASSERT(theThis.isObject());
|
||||
|
||||
if (argv.size() == 2) {
|
||||
JSValue s = JSValue::valueToString(argv[1]);
|
||||
theThis = new JSFunction(cx->compile((String)(*s.string)));
|
||||
}
|
||||
|
||||
return theThis;
|
||||
}
|
||||
|
||||
JSValue function_toString(Context *cx, const JSValues& argv)
|
||||
{
|
||||
return JSValue(new JSString("function XXX() { }" ));
|
||||
}
|
||||
JSValue function_apply(Context *cx, const JSValues& argv)
|
||||
{
|
||||
// XXX
|
||||
return kUndefinedValue;
|
||||
}
|
||||
JSValue function_call(Context *cx, const JSValues& argv)
|
||||
{
|
||||
// XXX
|
||||
return kUndefinedValue;
|
||||
}
|
||||
|
||||
|
||||
|
||||
String JSFunction::FunctionString = widenCString("Function");
|
||||
JSObject *JSFunction::functionPrototypeObject = NULL; // the 'original Function prototype object'
|
||||
|
||||
struct FunctionFunctionEntry {
|
||||
char *name;
|
||||
JSNativeFunction::JSCode fn;
|
||||
} FunctionFunctions[] = {
|
||||
{ "constructor", function_constructor },
|
||||
{ "toString", function_toString },
|
||||
{ "apply", function_apply },
|
||||
{ "call", function_call },
|
||||
};
|
||||
|
||||
void JSFunction::initFunctionObject(JSScope *g)
|
||||
{
|
||||
// first build the Function Prototype Object
|
||||
functionPrototypeObject = new JSNativeFunction(functionPrototypeFunction);
|
||||
for (int i = 0; i < sizeof(FunctionFunctions) / sizeof(FunctionFunctionEntry); i++)
|
||||
functionPrototypeObject->setProperty(widenCString(FunctionFunctions[i].name), JSValue(new JSNativeFunction(FunctionFunctions[i].fn) ) );
|
||||
|
||||
// now the Function Constructor Object
|
||||
JSNativeFunction *functionConstructorObject = new JSNativeFunction(function_constructor);
|
||||
functionConstructorObject->setPrototype(functionPrototypeObject);
|
||||
functionConstructorObject->setProperty(widenCString("length"), JSValue((int32)1));
|
||||
functionConstructorObject->setProperty(widenCString("prototype"), JSValue(functionPrototypeObject));
|
||||
|
||||
// This is interesting - had to use defineVariable here to specify a type because
|
||||
// when left as Any_Type (via setProperty), the Function predefined type interacted
|
||||
// badly with this value. (I think setProperty perhaps should have reset the entry
|
||||
// in mTypes) (?)
|
||||
g->defineVariable(FunctionString, &Function_Type, JSValue(functionConstructorObject));
|
||||
}
|
||||
|
||||
/**************************************************************************************/
|
||||
|
||||
JSType Any_Type = JSType(widenCString("any"), NULL);
|
||||
JSType Integer_Type = JSType(widenCString("Integer"), &Any_Type);
|
||||
JSType Number_Type = JSType(widenCString("Number"), &Integer_Type);
|
||||
JSType Character_Type = JSType(widenCString("Character"), &Any_Type);
|
||||
JSType String_Type = JSType(widenCString("String"), &Character_Type);
|
||||
JSType Function_Type = JSType(widenCString("Function"), &Any_Type);
|
||||
JSType Array_Type = JSType(widenCString("Array"), &Any_Type);
|
||||
JSType Type_Type = JSType(widenCString("Type"), &Any_Type);
|
||||
JSType Boolean_Type = JSType(widenCString("Boolean"), &Any_Type);
|
||||
JSType Null_Type = JSType(widenCString("Null"), &Any_Type);
|
||||
JSType Void_Type = JSType(widenCString("void"), &Any_Type);
|
||||
JSType None_Type = JSType(widenCString("none"), &Any_Type);
|
||||
|
||||
|
||||
#ifdef IS_LITTLE_ENDIAN
|
||||
#define JSDOUBLE_HI32(x) (((uint32 *)&(x))[1])
|
||||
#define JSDOUBLE_LO32(x) (((uint32 *)&(x))[0])
|
||||
#else
|
||||
#define JSDOUBLE_HI32(x) (((uint32 *)&(x))[0])
|
||||
#define JSDOUBLE_LO32(x) (((uint32 *)&(x))[1])
|
||||
#endif
|
||||
|
||||
#define JSDOUBLE_HI32_SIGNBIT 0x80000000
|
||||
#define JSDOUBLE_HI32_EXPMASK 0x7ff00000
|
||||
#define JSDOUBLE_HI32_MANTMASK 0x000fffff
|
||||
|
||||
#define JSDOUBLE_IS_NaN(x) \
|
||||
((JSDOUBLE_HI32(x) & JSDOUBLE_HI32_EXPMASK) == JSDOUBLE_HI32_EXPMASK && \
|
||||
(JSDOUBLE_LO32(x) || (JSDOUBLE_HI32(x) & JSDOUBLE_HI32_MANTMASK)))
|
||||
|
||||
#define JSDOUBLE_IS_INFINITE(x) \
|
||||
((JSDOUBLE_HI32(x) & ~JSDOUBLE_HI32_SIGNBIT) == JSDOUBLE_HI32_EXPMASK && \
|
||||
!JSDOUBLE_LO32(x))
|
||||
|
||||
#define JSDOUBLE_IS_FINITE(x) \
|
||||
((JSDOUBLE_HI32(x) & JSDOUBLE_HI32_EXPMASK) != JSDOUBLE_HI32_EXPMASK)
|
||||
|
||||
#define JSDOUBLE_IS_NEGZERO(d) (JSDOUBLE_HI32(d) == JSDOUBLE_HI32_SIGNBIT && \
|
||||
JSDOUBLE_LO32(d) == 0)
|
||||
|
||||
|
||||
// the canonical undefined value, etc.
|
||||
const JSValue kUndefinedValue;
|
||||
const JSValue kNaNValue = JSValue(nan);
|
||||
const JSValue kTrueValue = JSValue(true);
|
||||
const JSValue kFalseValue = JSValue(false);
|
||||
const JSValue kNullValue = JSValue((JSObject*)NULL);
|
||||
const JSValue kNegativeZero = JSValue(-0.0);
|
||||
const JSValue kPositiveZero = JSValue(0.0);
|
||||
const JSValue kNegativeInfinity = JSValue(negativeInfinity);
|
||||
const JSValue kPositiveInfinity = JSValue(positiveInfinity);
|
||||
|
||||
|
||||
const JSType *JSValue::getType() const
|
||||
{
|
||||
switch (tag) {
|
||||
case JSValue::i32_tag:
|
||||
return &Integer_Type;
|
||||
case JSValue::u32_tag:
|
||||
return &Integer_Type;
|
||||
case JSValue::integer_tag:
|
||||
return &Integer_Type;
|
||||
case JSValue::f64_tag:
|
||||
return &Number_Type;
|
||||
case JSValue::object_tag:
|
||||
{
|
||||
//
|
||||
// XXX why isn't there a class for Object? XXX
|
||||
//
|
||||
JSClass *clazz = dynamic_cast<JSClass *>(object->getType());
|
||||
if (clazz)
|
||||
return clazz;
|
||||
else
|
||||
return &Any_Type;
|
||||
}
|
||||
case JSValue::array_tag:
|
||||
return &Array_Type;
|
||||
case JSValue::function_tag:
|
||||
return &Function_Type;
|
||||
case JSValue::string_tag:
|
||||
return &String_Type;
|
||||
case JSValue::boolean_tag:
|
||||
return &Boolean_Type;
|
||||
case JSValue::undefined_tag:
|
||||
return &Void_Type;
|
||||
case JSValue::type_tag:
|
||||
return &Type_Type;
|
||||
default:
|
||||
NOT_REACHED("Bad tag");
|
||||
return &None_Type;
|
||||
}
|
||||
}
|
||||
|
||||
bool JSValue::isNaN() const
|
||||
{
|
||||
ASSERT(isNumber());
|
||||
switch (tag) {
|
||||
case i32_tag:
|
||||
case u32_tag:
|
||||
return false;
|
||||
case integer_tag:
|
||||
case f64_tag:
|
||||
return JSDOUBLE_IS_NaN(f64);
|
||||
default:
|
||||
NOT_REACHED("Broken compiler?");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool JSValue::isNegativeInfinity() const
|
||||
{
|
||||
ASSERT(isNumber());
|
||||
switch (tag) {
|
||||
case i32_tag:
|
||||
case u32_tag:
|
||||
return false;
|
||||
case integer_tag:
|
||||
case f64_tag:
|
||||
return (f64 < 0) && JSDOUBLE_IS_INFINITE(f64);
|
||||
default:
|
||||
NOT_REACHED("Broken compiler?");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool JSValue::isPositiveInfinity() const
|
||||
{
|
||||
ASSERT(isNumber());
|
||||
switch (tag) {
|
||||
case i32_tag:
|
||||
case u32_tag:
|
||||
return false;
|
||||
case integer_tag:
|
||||
case f64_tag:
|
||||
return (f64 > 0) && JSDOUBLE_IS_INFINITE(f64);
|
||||
default:
|
||||
NOT_REACHED("Broken compiler?");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool JSValue::isNegativeZero() const
|
||||
{
|
||||
ASSERT(isNumber());
|
||||
switch (tag) {
|
||||
case i32_tag:
|
||||
case u32_tag:
|
||||
return false;
|
||||
case integer_tag:
|
||||
case f64_tag:
|
||||
return JSDOUBLE_IS_NEGZERO(f64);
|
||||
default:
|
||||
NOT_REACHED("Broken compiler?");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool JSValue::isPositiveZero() const
|
||||
{
|
||||
ASSERT(isNumber());
|
||||
switch (tag) {
|
||||
case i32_tag:
|
||||
return (i32 == 0);
|
||||
case u32_tag:
|
||||
return (u32 == 0);
|
||||
case integer_tag:
|
||||
case f64_tag:
|
||||
return (f64 == 0.0) && !JSDOUBLE_IS_NEGZERO(f64);
|
||||
default:
|
||||
NOT_REACHED("Broken compiler?");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
int JSValue::operator==(const JSValue& value) const
|
||||
{
|
||||
if (this->tag == value.tag) {
|
||||
#define CASE(T) case T##_tag: return (this->T == value.T)
|
||||
switch (tag) {
|
||||
CASE(i8); CASE(u8);
|
||||
CASE(i16); CASE(u16);
|
||||
CASE(i32); CASE(u32); CASE(f32);
|
||||
CASE(i64); CASE(u64); CASE(f64);
|
||||
CASE(object); CASE(array); CASE(function); CASE(string);
|
||||
CASE(type); CASE(boolean);
|
||||
#undef CASE
|
||||
case integer_tag : return (this->f64 == value.f64);
|
||||
// question: are all undefined values equal to one another?
|
||||
case undefined_tag: return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Formatter& operator<<(Formatter& f, JSObject& obj)
|
||||
{
|
||||
obj.printProperties(f);
|
||||
return f;
|
||||
}
|
||||
|
||||
void JSObject::printProperties(Formatter& f)
|
||||
{
|
||||
for (JSProperties::const_iterator i = mProperties.begin(); i != mProperties.end(); i++) {
|
||||
f << (*i).first << " : " << (*i).second;
|
||||
f << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
Formatter& operator<<(Formatter& f, const JSValue& value)
|
||||
{
|
||||
switch (value.tag) {
|
||||
case JSValue::i32_tag:
|
||||
f << float64(value.i32);
|
||||
break;
|
||||
case JSValue::u32_tag:
|
||||
f << float64(value.u32);
|
||||
break;
|
||||
case JSValue::integer_tag:
|
||||
case JSValue::f64_tag:
|
||||
f << value.f64;
|
||||
break;
|
||||
case JSValue::object_tag:
|
||||
printFormat(f, "Object @ 0x%08X\n", value.object);
|
||||
f << *value.object;
|
||||
break;
|
||||
case JSValue::array_tag:
|
||||
printFormat(f, "Array @ 0x%08X", value.object);
|
||||
break;
|
||||
case JSValue::function_tag:
|
||||
printFormat(f, "Function @ 0x%08X", value.object);
|
||||
break;
|
||||
case JSValue::string_tag:
|
||||
f << *value.string;
|
||||
break;
|
||||
case JSValue::boolean_tag:
|
||||
f << ((value.boolean) ? "true" : "false");
|
||||
break;
|
||||
case JSValue::undefined_tag:
|
||||
f << "undefined";
|
||||
break;
|
||||
case JSValue::type_tag:
|
||||
printFormat(f, "Type @ 0x%08X\n", value.type);
|
||||
f << *value.type;
|
||||
break;
|
||||
default:
|
||||
NOT_REACHED("Bad tag");
|
||||
}
|
||||
return f;
|
||||
}
|
||||
|
||||
JSValue JSValue::toPrimitive(ECMA_type /*hint*/) const
|
||||
{
|
||||
JSObject *obj;
|
||||
switch (tag) {
|
||||
case i32_tag:
|
||||
case u32_tag:
|
||||
case integer_tag:
|
||||
case f64_tag:
|
||||
case string_tag:
|
||||
case boolean_tag:
|
||||
case undefined_tag:
|
||||
return *this;
|
||||
|
||||
case object_tag:
|
||||
obj = object;
|
||||
break;
|
||||
case array_tag:
|
||||
obj = array;
|
||||
break;
|
||||
case function_tag:
|
||||
obj = function;
|
||||
break;
|
||||
|
||||
default:
|
||||
NOT_REACHED("Bad tag");
|
||||
return kUndefinedValue;
|
||||
}
|
||||
|
||||
const JSValue &toString = obj->getProperty(widenCString("toString"));
|
||||
if (toString.isObject()) {
|
||||
if (toString.isFunction()) {
|
||||
}
|
||||
else // right? The spec doesn't say
|
||||
throw new JSException("Runtime error from toPrimitive"); // XXX
|
||||
}
|
||||
|
||||
const JSValue &valueOf = obj->getProperty(widenCString("valueOf"));
|
||||
if (!valueOf.isObject())
|
||||
throw new JSException("Runtime error from toPrimitive"); // XXX
|
||||
|
||||
return kUndefinedValue;
|
||||
|
||||
}
|
||||
|
||||
|
||||
JSValue JSValue::valueToString(const JSValue& value) // can assume value is not a string
|
||||
{
|
||||
const char* chrp;
|
||||
char buf[dtosStandardBufferSize];
|
||||
switch (value.tag) {
|
||||
case i32_tag:
|
||||
chrp = doubleToStr(buf, dtosStandardBufferSize, value.i32, dtosStandard, 0);
|
||||
break;
|
||||
case u32_tag:
|
||||
chrp = doubleToStr(buf, dtosStandardBufferSize, value.u32, dtosStandard, 0);
|
||||
break;
|
||||
case integer_tag:
|
||||
case f64_tag:
|
||||
chrp = doubleToStr(buf, dtosStandardBufferSize, value.f64, dtosStandard, 0);
|
||||
break;
|
||||
case object_tag:
|
||||
chrp = "object";
|
||||
break;
|
||||
case array_tag:
|
||||
chrp = "array";
|
||||
break;
|
||||
case function_tag:
|
||||
chrp = "function";
|
||||
break;
|
||||
case string_tag:
|
||||
return value;
|
||||
case boolean_tag:
|
||||
chrp = (value.boolean) ? "true" : "false";
|
||||
break;
|
||||
case undefined_tag:
|
||||
chrp = "undefined";
|
||||
break;
|
||||
default:
|
||||
NOT_REACHED("Bad tag");
|
||||
}
|
||||
return JSValue(new JSString(chrp));
|
||||
}
|
||||
|
||||
JSValue JSValue::valueToNumber(const JSValue& value) // can assume value is not a number
|
||||
{
|
||||
switch (value.tag) {
|
||||
case i32_tag:
|
||||
return JSValue((float64)value.i32);
|
||||
case u32_tag:
|
||||
return JSValue((float64)value.u32);
|
||||
case integer_tag:
|
||||
case f64_tag:
|
||||
return value;
|
||||
case string_tag:
|
||||
{
|
||||
JSString* str = value.string;
|
||||
const char16 *numEnd;
|
||||
double d = stringToDouble(str->begin(), str->end(), numEnd);
|
||||
return JSValue(d);
|
||||
}
|
||||
case object_tag:
|
||||
case array_tag:
|
||||
case function_tag:
|
||||
// XXX more needed :
|
||||
// toNumber(toPrimitive(hint Number))
|
||||
return kUndefinedValue;
|
||||
case boolean_tag:
|
||||
return JSValue((value.boolean) ? 1.0 : 0.0);
|
||||
case undefined_tag:
|
||||
return kNaNValue;
|
||||
default:
|
||||
NOT_REACHED("Bad tag");
|
||||
return kUndefinedValue;
|
||||
}
|
||||
}
|
||||
|
||||
JSValue JSValue::valueToInteger(const JSValue& value)
|
||||
{
|
||||
JSValue result = valueToNumber(value);
|
||||
ASSERT(result.tag == f64_tag);
|
||||
result.tag = i64_tag;
|
||||
bool neg = (result.f64 < 0);
|
||||
result.f64 = floor((neg) ? -result.f64 : result.f64);
|
||||
result.f64 = (neg) ? -result.f64 : result.f64;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
JSValue JSValue::valueToBoolean(const JSValue& value)
|
||||
{
|
||||
switch (value.tag) {
|
||||
case i32_tag:
|
||||
return JSValue(value.i32 != 0);
|
||||
case u32_tag:
|
||||
return JSValue(value.u32 != 0);
|
||||
case integer_tag:
|
||||
case f64_tag:
|
||||
return JSValue(!(value.f64 == 0.0) || JSDOUBLE_IS_NaN(value.f64));
|
||||
case string_tag:
|
||||
return JSValue(value.string->length() != 0);
|
||||
case boolean_tag:
|
||||
return value;
|
||||
case object_tag:
|
||||
case array_tag:
|
||||
case function_tag:
|
||||
return kTrueValue;
|
||||
case undefined_tag:
|
||||
return kFalseValue;
|
||||
default:
|
||||
NOT_REACHED("Bad tag");
|
||||
return kUndefinedValue;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static const double two32 = 4294967296.0;
|
||||
static const double two31 = 2147483648.0;
|
||||
|
||||
JSValue JSValue::valueToInt32(const JSValue& value)
|
||||
{
|
||||
double d;
|
||||
switch (value.tag) {
|
||||
case i32_tag:
|
||||
return value;
|
||||
case u32_tag:
|
||||
d = value.u32;
|
||||
break;
|
||||
case integer_tag:
|
||||
case f64_tag:
|
||||
d = value.f64;
|
||||
break;
|
||||
case string_tag:
|
||||
{
|
||||
JSString* str = value.string;
|
||||
const char16 *numEnd;
|
||||
d = stringToDouble(str->begin(), str->end(), numEnd);
|
||||
}
|
||||
break;
|
||||
case boolean_tag:
|
||||
return JSValue((int32)((value.boolean) ? 1 : 0));
|
||||
case object_tag:
|
||||
case array_tag:
|
||||
case undefined_tag:
|
||||
// toNumber(toPrimitive(hint Number))
|
||||
return kUndefinedValue;
|
||||
default:
|
||||
NOT_REACHED("Bad tag");
|
||||
return kUndefinedValue;
|
||||
}
|
||||
if ((d == 0.0) || !JSDOUBLE_IS_FINITE(d) )
|
||||
return JSValue((int32)0);
|
||||
d = fmod(d, two32);
|
||||
d = (d >= 0) ? d : d + two32;
|
||||
if (d >= two31)
|
||||
return JSValue((int32)(d - two32));
|
||||
else
|
||||
return JSValue((int32)d);
|
||||
|
||||
}
|
||||
|
||||
JSValue JSValue::valueToUInt32(const JSValue& value)
|
||||
{
|
||||
double d;
|
||||
switch (value.tag) {
|
||||
case i32_tag:
|
||||
return JSValue((uint32)value.i32);
|
||||
case u32_tag:
|
||||
return value;
|
||||
case f64_tag:
|
||||
d = value.f64;
|
||||
break;
|
||||
case string_tag:
|
||||
{
|
||||
JSString* str = value.string;
|
||||
const char16 *numEnd;
|
||||
d = stringToDouble(str->begin(), str->end(), numEnd);
|
||||
}
|
||||
break;
|
||||
case boolean_tag:
|
||||
return JSValue((uint32)((value.boolean) ? 1 : 0));
|
||||
case object_tag:
|
||||
case array_tag:
|
||||
case undefined_tag:
|
||||
// toNumber(toPrimitive(hint Number))
|
||||
return kUndefinedValue;
|
||||
default:
|
||||
NOT_REACHED("Bad tag");
|
||||
return kUndefinedValue;
|
||||
}
|
||||
if ((d == 0.0) || !JSDOUBLE_IS_FINITE(d))
|
||||
return JSValue((uint32)0);
|
||||
bool neg = (d < 0);
|
||||
d = floor(neg ? -d : d);
|
||||
d = neg ? -d : d;
|
||||
d = fmod(d, two32);
|
||||
d = (d >= 0) ? d : d + two32;
|
||||
return JSValue((uint32)d);
|
||||
}
|
||||
|
||||
|
||||
JSValue JSValue::convert(JSType *toType)
|
||||
{
|
||||
if (toType == &Any_Type) // yuck, something wrong with this
|
||||
// maybe the base types should be
|
||||
// a family of classes, not just instances
|
||||
// of JSType ???
|
||||
return *this;
|
||||
else if (toType == &Integer_Type)
|
||||
return valueToInteger(*this);
|
||||
else {
|
||||
JSClass *toClass = dynamic_cast<JSClass *>(toType);
|
||||
if (toClass) {
|
||||
if (tag == object_tag) {
|
||||
JSClass *fromClass = dynamic_cast<JSClass *>(object->getType());
|
||||
if (fromClass) {
|
||||
while (fromClass != toClass) {
|
||||
fromClass = fromClass->getSuperClass();
|
||||
if (fromClass == NULL)
|
||||
throw new JSException("Can't cast to unrelated class");
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
else
|
||||
throw new JSException("Can't cast a generic object to a class");
|
||||
}
|
||||
else
|
||||
throw new JSException("Can't cast a non-object to a class");
|
||||
}
|
||||
}
|
||||
return kUndefinedValue;
|
||||
}
|
||||
|
||||
|
||||
JSFunction::~JSFunction()
|
||||
{
|
||||
delete mICode;
|
||||
}
|
||||
|
||||
JSString::JSString(const String& str)
|
||||
{
|
||||
size_t n = str.size();
|
||||
resize(n);
|
||||
traits_type::copy(begin(), str.begin(), n);
|
||||
}
|
||||
|
||||
JSString::JSString(const String* str)
|
||||
{
|
||||
size_t n = str->size();
|
||||
resize(n);
|
||||
traits_type::copy(begin(), str->begin(), n);
|
||||
}
|
||||
|
||||
JSString::JSString(const char* str)
|
||||
{
|
||||
size_t n = ::strlen(str);
|
||||
resize(n);
|
||||
std::transform(str, str + n, begin(), JavaScript::widen);
|
||||
}
|
||||
|
||||
void JSString::append(const char* str)
|
||||
{
|
||||
size_t n = ::strlen(str);
|
||||
size_t oldSize = size();
|
||||
resize(oldSize + n);
|
||||
std::transform(str, str + n, begin() + oldSize, JavaScript::widen);
|
||||
}
|
||||
|
||||
void JSString::append(const JSStringBase* str)
|
||||
{
|
||||
size_t n = str->size();
|
||||
size_t oldSize = size();
|
||||
resize(oldSize + n);
|
||||
traits_type::copy(begin() + oldSize, str->begin(), n);
|
||||
}
|
||||
|
||||
JSString::operator String()
|
||||
{
|
||||
return String(begin(), size());
|
||||
}
|
||||
|
||||
|
||||
// # of sub-type relationship between this type and the other type
|
||||
// (== MAX_INT if other is not a base type)
|
||||
|
||||
int32 JSType::distance(const JSType *other) const
|
||||
{
|
||||
if (other == this)
|
||||
return 0;
|
||||
if (mBaseType == NULL)
|
||||
return NoRelation;
|
||||
int32 baseDistance = mBaseType->distance(other);
|
||||
if (baseDistance != NoRelation)
|
||||
++baseDistance;
|
||||
return baseDistance;
|
||||
}
|
||||
|
||||
|
||||
} /* namespace JSTypes */
|
||||
} /* namespace JavaScript */
|
||||
@@ -1,579 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the JavaScript 2 Prototype.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
#ifndef jstypes_h
|
||||
#define jstypes_h
|
||||
|
||||
#include "utilities.h"
|
||||
#include "gc_allocator.h"
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <stack>
|
||||
|
||||
|
||||
/* forward declare classes from JavaScript::ICG */
|
||||
namespace JavaScript {
|
||||
namespace ICG {
|
||||
class ICodeModule;
|
||||
} /* namespace ICG */
|
||||
namespace Interpreter {
|
||||
class Context;
|
||||
} /* namespace Interpreter */
|
||||
} /* namespace JavaScript */
|
||||
|
||||
namespace JavaScript {
|
||||
namespace JSTypes {
|
||||
|
||||
using ICG::ICodeModule;
|
||||
using Interpreter::Context;
|
||||
|
||||
class JSObject;
|
||||
class JSArray;
|
||||
class JSFunction;
|
||||
class JSScope;
|
||||
class JSString;
|
||||
class JSType;
|
||||
class Context;
|
||||
|
||||
/**
|
||||
* All JavaScript data types.
|
||||
*/
|
||||
struct JSValue {
|
||||
union {
|
||||
int8 i8;
|
||||
uint8 u8;
|
||||
int16 i16;
|
||||
uint16 u16;
|
||||
int32 i32;
|
||||
uint32 u32;
|
||||
int64 i64;
|
||||
uint64 u64;
|
||||
float32 f32;
|
||||
float64 f64;
|
||||
JSObject* object;
|
||||
JSArray* array;
|
||||
JSFunction *function;
|
||||
JSString *string;
|
||||
JSType *type;
|
||||
bool boolean;
|
||||
};
|
||||
|
||||
/* These are the ECMA types, for use in 'toPrimitive' calls */
|
||||
enum ECMA_type {
|
||||
Undefined, Null, Boolean, Number, Object, String,
|
||||
NoHint
|
||||
};
|
||||
|
||||
enum {
|
||||
i8_tag, u8_tag,
|
||||
i16_tag, u16_tag,
|
||||
i32_tag, u32_tag,
|
||||
i64_tag, u64_tag,
|
||||
f32_tag, f64_tag,
|
||||
integer_tag,
|
||||
object_tag, array_tag, function_tag, string_tag, boolean_tag, type_tag,
|
||||
undefined_tag
|
||||
} tag;
|
||||
|
||||
JSValue() : f64(0.0), tag(undefined_tag) {}
|
||||
explicit JSValue(int32 i32) : i32(i32), tag(i32_tag) {}
|
||||
explicit JSValue(uint32 u32) : u32(u32), tag(u32_tag) {}
|
||||
explicit JSValue(float64 f64) : f64(f64), tag(f64_tag) {}
|
||||
explicit JSValue(JSObject* object) : object(object), tag(object_tag) {}
|
||||
explicit JSValue(JSArray* array) : array(array), tag(array_tag) {}
|
||||
explicit JSValue(JSFunction* function) : function(function), tag(function_tag) {}
|
||||
explicit JSValue(JSString* string) : string(string), tag(string_tag) {}
|
||||
explicit JSValue(bool boolean) : boolean(boolean), tag(boolean_tag) {}
|
||||
explicit JSValue(JSType* type) : type(type), tag(type_tag) {}
|
||||
|
||||
int32& operator=(int32 i32) { return (tag = i32_tag, this->i32 = i32); }
|
||||
uint32& operator=(uint32 u32) { return (tag = u32_tag, this->u32 = u32); }
|
||||
float64& operator=(float64 f64) { return (tag = f64_tag, this->f64 = f64); }
|
||||
JSObject*& operator=(JSObject* object) { return (tag = object_tag, this->object = object); }
|
||||
JSArray*& operator=(JSArray* array) { return (tag = array_tag, this->array = array); }
|
||||
JSFunction*& operator=(JSFunction* function) { return (tag = function_tag, this->function = function); }
|
||||
JSString*& operator=(JSString* string) { return (tag = string_tag, this->string = string); }
|
||||
bool& operator=(bool boolean) { return (tag = boolean_tag, this->boolean = boolean); }
|
||||
JSType*& operator=(JSType* type) { return (tag = type_tag, this->type = type); }
|
||||
|
||||
bool isFunction() const { return (tag == function_tag); }
|
||||
bool isObject() const { return ((tag == object_tag) || (tag == function_tag) || (tag == array_tag) || (tag == type_tag)); }
|
||||
bool isString() const { return (tag == string_tag); }
|
||||
bool isBoolean() const { return (tag == boolean_tag); }
|
||||
bool isNumber() const { return (tag == f64_tag) || (tag == integer_tag); }
|
||||
|
||||
/* this is correct wrt ECMA, The i32 & u32 kinds
|
||||
will have to be converted (to doubles?) anyway because
|
||||
we can't have overflow happening in generic arithmetic */
|
||||
|
||||
bool isUndefined() const { return (tag == undefined_tag); }
|
||||
bool isNull() const { return ((tag == object_tag) && (this->object == NULL)); }
|
||||
bool isNaN() const;
|
||||
bool isNegativeInfinity() const;
|
||||
bool isPositiveInfinity() const;
|
||||
bool isNegativeZero() const;
|
||||
bool isPositiveZero() const;
|
||||
bool isType() const { return (tag == type_tag); }
|
||||
|
||||
JSValue toString() const { return (isString() ? *this : valueToString(*this)); }
|
||||
JSValue toNumber() const { return (isNumber() ? *this : valueToNumber(*this)); }
|
||||
JSValue toInt32() const { return ((tag == i32_tag) ? *this : valueToInt32(*this)); }
|
||||
JSValue toUInt32() const { return ((tag == u32_tag) ? *this : valueToUInt32(*this)); }
|
||||
JSValue toBoolean() const { return ((tag == boolean_tag) ? *this : valueToBoolean(*this)); }
|
||||
|
||||
JSValue toPrimitive(ECMA_type hint = NoHint) const;
|
||||
|
||||
JSValue convert(JSType *toType);
|
||||
|
||||
|
||||
static JSValue valueToString(const JSValue& value);
|
||||
static JSValue valueToNumber(const JSValue& value);
|
||||
static JSValue valueToInteger(const JSValue& value);
|
||||
static JSValue valueToInt32(const JSValue& value);
|
||||
static JSValue valueToUInt32(const JSValue& value);
|
||||
static JSValue valueToBoolean(const JSValue& value);
|
||||
|
||||
|
||||
const JSType *getType() const; // map from tag type to JS2 type
|
||||
|
||||
int operator==(const JSValue& value) const;
|
||||
};
|
||||
|
||||
Formatter& operator<<(Formatter& f, const JSValue& value);
|
||||
|
||||
#if defined(XP_MAC)
|
||||
// copied from default template parameters in map.
|
||||
typedef gc_allocator<std::pair<const String, JSValue> > gc_map_allocator;
|
||||
#elif defined(XP_UNIX)
|
||||
// FIXME: in libg++, they assume the map's allocator is a byte allocator,
|
||||
// which is wrapped in a simple_allocator. this is crap.
|
||||
typedef char _Char[1];
|
||||
typedef gc_allocator<_Char> gc_map_allocator;
|
||||
#elif defined(_WIN32)
|
||||
// FIXME: MSVC++'s notion. this is why we had to add _Charalloc().
|
||||
typedef gc_allocator<JSValue> gc_map_allocator;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* GC-scannable array of values.
|
||||
*/
|
||||
typedef std::vector<JSValue, gc_allocator<JSValue> > JSValues;
|
||||
|
||||
extern const JSValue kUndefinedValue;
|
||||
extern const JSValue kNaNValue;
|
||||
extern const JSValue kTrueValue;
|
||||
extern const JSValue kFalseValue;
|
||||
extern const JSValue kNullValue;
|
||||
extern const JSValue kNegativeZero;
|
||||
extern const JSValue kPositiveZero;
|
||||
extern const JSValue kNegativeInfinity;
|
||||
extern const JSValue kPositiveInfinity;
|
||||
|
||||
extern JSType Any_Type;
|
||||
extern JSType Integer_Type;
|
||||
extern JSType Number_Type;
|
||||
extern JSType Character_Type;
|
||||
extern JSType String_Type;
|
||||
extern JSType Function_Type;
|
||||
extern JSType Array_Type;
|
||||
extern JSType Type_Type;
|
||||
extern JSType Boolean_Type;
|
||||
extern JSType Null_Type;
|
||||
extern JSType Void_Type;
|
||||
extern JSType None_Type;
|
||||
|
||||
typedef std::map<String, JSValue, std::less<String>, gc_map_allocator> JSProperties;
|
||||
|
||||
/**
|
||||
* Basic behavior of all JS objects, mapping a name to a value,
|
||||
* with prototype-based inheritance.
|
||||
*/
|
||||
class JSObject : public gc_base {
|
||||
protected:
|
||||
JSProperties mProperties;
|
||||
JSObject* mPrototype;
|
||||
JSType* mType;
|
||||
JSString* mClass; // this is the internal [[Class]] property
|
||||
|
||||
static JSObject *initJSObject();
|
||||
static String ObjectString;
|
||||
static JSObject *objectPrototypeObject;
|
||||
|
||||
void init(JSObject* prototype);
|
||||
|
||||
public:
|
||||
JSObject() { init(objectPrototypeObject); }
|
||||
JSObject(JSValue &constructor) { init(constructor.object->getProperty(widenCString("prototype")).object); }
|
||||
JSObject(JSObject *prototype) { init(prototype); }
|
||||
|
||||
static void initObjectObject(JSScope *g);
|
||||
|
||||
bool hasProperty(const String& name)
|
||||
{
|
||||
return (mProperties.count(name) != 0);
|
||||
}
|
||||
|
||||
const JSValue& getProperty(const String& name)
|
||||
{
|
||||
JSProperties::const_iterator i = mProperties.find(name);
|
||||
if (i != mProperties.end())
|
||||
return i->second;
|
||||
if (mPrototype)
|
||||
return mPrototype->getProperty(name);
|
||||
return kUndefinedValue;
|
||||
}
|
||||
|
||||
// return the property AND the object it's found in
|
||||
// (would rather return references, but couldn't get that to work)
|
||||
const JSValue getReference(JSValue &prop, const String& name)
|
||||
{
|
||||
JSProperties::const_iterator i = mProperties.find(name);
|
||||
if (i != mProperties.end()) {
|
||||
prop = i->second;
|
||||
return JSValue(this);
|
||||
}
|
||||
if (mPrototype)
|
||||
return mPrototype->getReference(prop, name);
|
||||
return kUndefinedValue;
|
||||
}
|
||||
|
||||
JSValue& setProperty(const String& name, const JSValue& value)
|
||||
{
|
||||
return (mProperties[name] = value);
|
||||
}
|
||||
|
||||
const JSValue& deleteProperty(const String& name)
|
||||
{
|
||||
JSProperties::iterator i = mProperties.find(name);
|
||||
if (i != mProperties.end()) {
|
||||
mProperties.erase(i);
|
||||
return kTrueValue;
|
||||
}
|
||||
if (mPrototype)
|
||||
return mPrototype->deleteProperty(name);
|
||||
return kFalseValue;
|
||||
}
|
||||
|
||||
void setPrototype(JSObject* prototype)
|
||||
{
|
||||
mPrototype = prototype;
|
||||
}
|
||||
|
||||
JSObject* getPrototype()
|
||||
{
|
||||
return mPrototype;
|
||||
}
|
||||
|
||||
JSType* getType()
|
||||
{
|
||||
return mType;
|
||||
}
|
||||
|
||||
JSString* getClass()
|
||||
{
|
||||
return mClass;
|
||||
}
|
||||
|
||||
void setClass(JSString* s)
|
||||
{
|
||||
mClass = s;
|
||||
}
|
||||
|
||||
virtual void printProperties(Formatter& f);
|
||||
};
|
||||
|
||||
Formatter& operator<<(Formatter& f, JSObject& obj);
|
||||
|
||||
/**
|
||||
* Private representation of a JavaScript array.
|
||||
*/
|
||||
class JSArray : public JSObject {
|
||||
JSValues elements;
|
||||
public:
|
||||
JSArray() : elements(1) {}
|
||||
JSArray(uint32 size) : elements(size) {}
|
||||
JSArray(const JSValues &v) : elements(v) {}
|
||||
|
||||
uint32 length()
|
||||
{
|
||||
return elements.size();
|
||||
}
|
||||
|
||||
JSValue& operator[](const JSValue& index)
|
||||
{
|
||||
// for now, we can only handle f64 index values.
|
||||
uint32 n = (uint32)index.f64;
|
||||
// obviously, a sparse representation might be better.
|
||||
uint32 size = elements.size();
|
||||
if (n >= size) expand(n, size);
|
||||
return elements[n];
|
||||
}
|
||||
|
||||
JSValue& operator[](uint32 n)
|
||||
{
|
||||
// obviously, a sparse representation might be better.
|
||||
uint32 size = elements.size();
|
||||
if (n >= size) expand(n, size);
|
||||
return elements[n];
|
||||
}
|
||||
|
||||
void resize(uint32 size)
|
||||
{
|
||||
elements.resize(size);
|
||||
}
|
||||
|
||||
private:
|
||||
void expand(uint32 n, uint32 size)
|
||||
{
|
||||
do {
|
||||
size *= 2;
|
||||
} while (n >= size);
|
||||
elements.resize(size);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Private representation of a JS function. This simply
|
||||
* holds a reference to the iCode module that is the
|
||||
* compiled code of the function.
|
||||
*/
|
||||
class JSFunction : public JSObject {
|
||||
static String FunctionString;
|
||||
static JSObject *functionPrototypeObject;
|
||||
ICodeModule* mICode;
|
||||
protected:
|
||||
JSFunction() : mICode(0) {}
|
||||
|
||||
typedef JavaScript::gc_traits_finalizable<JSFunction> traits;
|
||||
typedef gc_allocator<JSFunction, traits> allocator;
|
||||
|
||||
public:
|
||||
static void JSFunction::initFunctionObject(JSScope *g);
|
||||
|
||||
JSFunction(ICodeModule* iCode);
|
||||
~JSFunction();
|
||||
|
||||
void* operator new(size_t) { return allocator::allocate(1); }
|
||||
|
||||
ICodeModule* getICode() { return mICode; }
|
||||
virtual bool isNative() { return false; }
|
||||
};
|
||||
|
||||
class JSNativeFunction : public JSFunction {
|
||||
public:
|
||||
typedef JSValue (*JSCode)(Context *cx, const JSValues& argv);
|
||||
JSCode mCode;
|
||||
JSNativeFunction(JSCode code) : mCode(code) {}
|
||||
virtual bool isNative() { return true; }
|
||||
};
|
||||
|
||||
class JSBinaryOperator : public JSFunction {
|
||||
public:
|
||||
typedef JSValue (*JSBinaryCode)(const JSValue& arg1, const JSValue& arg2);
|
||||
JSBinaryCode mCode;
|
||||
JSBinaryOperator(JSBinaryCode code) : mCode(code) {}
|
||||
virtual bool isNative() { return true; }
|
||||
};
|
||||
|
||||
#ifndef STLPORT
|
||||
# if defined(XP_UNIX)
|
||||
// bastring.cc defines a funky operator new that assumes a byte-allocator.
|
||||
typedef string_char_traits<char16> JSCharTraits;
|
||||
typedef gc_allocator<_Char> JSStringAllocator;
|
||||
# else
|
||||
typedef std::char_traits<char16> JSCharTraits;
|
||||
typedef gc_allocator<char16> JSStringAllocator;
|
||||
# endif
|
||||
#else
|
||||
typedef std::char_traits<char16> JSCharTraits;
|
||||
typedef gc_allocator<char16> JSStringAllocator;
|
||||
#endif
|
||||
|
||||
typedef std::basic_string<char16, JSCharTraits, JSStringAllocator> JSStringBase;
|
||||
|
||||
/**
|
||||
* Garbage collectable UNICODE string.
|
||||
*/
|
||||
class JSString : public JSStringBase, public gc_base {
|
||||
public:
|
||||
JSString() {}
|
||||
explicit JSString(const JSStringBase& str) : JSStringBase(str) {}
|
||||
explicit JSString(const JSStringBase* str) : JSStringBase(*str) {}
|
||||
explicit JSString(const String& str);
|
||||
explicit JSString(const String* str);
|
||||
explicit JSString(const char* str);
|
||||
|
||||
operator String();
|
||||
|
||||
void append(const char* str);
|
||||
void append(const JSStringBase* str);
|
||||
};
|
||||
|
||||
class JSException : public gc_base {
|
||||
public:
|
||||
JSException(char *mess) : value(JSValue(new JSString(mess))) { }
|
||||
JSException(JSValue v) : value(v) { }
|
||||
JSValue value;
|
||||
};
|
||||
|
||||
inline Formatter& operator<<(Formatter& f, const JSString& str)
|
||||
{
|
||||
printString(f, str.begin(), str.end());
|
||||
return f;
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides a set of nested scopes.
|
||||
*/
|
||||
class JSScope : public JSObject {
|
||||
protected:
|
||||
JSScope* mParent;
|
||||
JSProperties mTypes;
|
||||
public:
|
||||
JSScope(JSScope* parent = 0, JSObject* prototype = 0)
|
||||
: mParent(parent)
|
||||
{
|
||||
if (prototype)
|
||||
setPrototype(prototype);
|
||||
}
|
||||
|
||||
JSScope* getParent()
|
||||
{
|
||||
return mParent;
|
||||
}
|
||||
|
||||
bool isDefined(const String& name)
|
||||
{
|
||||
if (hasProperty(name))
|
||||
return true;
|
||||
if (mParent)
|
||||
return mParent->isDefined(name);
|
||||
return false;
|
||||
}
|
||||
|
||||
const JSValue& getVariable(const String& name)
|
||||
{
|
||||
const JSValue& ret = getProperty(name);
|
||||
if (ret.isUndefined() && mParent)
|
||||
return mParent->getVariable(name);
|
||||
return ret;
|
||||
}
|
||||
|
||||
JSValue& setVariable(const String& name, const JSValue& value)
|
||||
{
|
||||
return (mProperties[name] = value);
|
||||
}
|
||||
|
||||
JSValue& defineVariable(const String& name, JSType* type, const JSValue& value)
|
||||
{
|
||||
if (type != &Any_Type)
|
||||
mTypes[name] = type;
|
||||
return (mProperties[name] = value);
|
||||
}
|
||||
|
||||
JSValue& defineVariable(const String& name, JSType* type)
|
||||
{
|
||||
if (type != &Any_Type)
|
||||
mTypes[name] = type;
|
||||
return (mProperties[name] = kUndefinedValue);
|
||||
}
|
||||
|
||||
void setType(const String& name, JSType* type)
|
||||
{
|
||||
// only type variables that are defined in this scope.
|
||||
JSProperties::iterator i = mProperties.find(name);
|
||||
if (i != mProperties.end())
|
||||
mTypes[name] = type;
|
||||
else
|
||||
if (mParent)
|
||||
mParent->setType(name, type);
|
||||
}
|
||||
|
||||
JSType* getType(const String& name)
|
||||
{
|
||||
JSType* result = &Any_Type;
|
||||
// only consider types for variables defined in this scope.
|
||||
JSProperties::const_iterator i = mProperties.find(name);
|
||||
if (i != mProperties.end()) {
|
||||
i = mTypes.find(name);
|
||||
if (i != mTypes.end())
|
||||
result = i->second.type;
|
||||
} else {
|
||||
// see if variable is defined in parent scope.
|
||||
if (mParent)
|
||||
result = mParent->getType(name);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
JSValue& defineFunction(const String& name, ICodeModule* iCode)
|
||||
{
|
||||
JSValue value(new JSFunction(iCode));
|
||||
return defineVariable(name, &Function_Type, value);
|
||||
}
|
||||
|
||||
JSValue& defineNativeFunction(const String& name, JSNativeFunction::JSCode code)
|
||||
{
|
||||
JSValue value(new JSNativeFunction(code));
|
||||
return defineVariable(name, &Function_Type, value);
|
||||
}
|
||||
};
|
||||
|
||||
class JSType : public JSObject {
|
||||
protected:
|
||||
String mName;
|
||||
JSType *mBaseType;
|
||||
public:
|
||||
JSType(const String &name, JSType *baseType) : mName(name), mBaseType(baseType)
|
||||
{
|
||||
mType = &Type_Type;
|
||||
}
|
||||
|
||||
enum { NoRelation = 0x7FFFFFFF };
|
||||
|
||||
const String& getName() const { return mName; }
|
||||
|
||||
int32 distance(const JSType *other) const;
|
||||
};
|
||||
|
||||
|
||||
inline void JSObject::init(JSObject* prototype) { mPrototype = prototype; mType = &Any_Type; mClass = new JSString(ObjectString); }
|
||||
|
||||
inline JSFunction::JSFunction(ICodeModule* iCode) : mICode(iCode), JSObject(functionPrototypeObject) { setClass(new JSString(FunctionString)); }
|
||||
|
||||
|
||||
} /* namespace JSTypes */
|
||||
} /* namespace JavaScript */
|
||||
|
||||
|
||||
#endif /* jstypes_h */
|
||||
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -1,2 +0,0 @@
|
||||
#define XP_MAC 1
|
||||
#define DEBUG 1
|
||||
@@ -1,2 +0,0 @@
|
||||
#define XP_MAC 1
|
||||
#define XP_MAC_MPW 1
|
||||
@@ -1,3 +0,0 @@
|
||||
#define XP_MAC 1
|
||||
#define XP_MAC_MPW 1
|
||||
#define DEBUG 1
|
||||
Binary file not shown.
Binary file not shown.
@@ -1,91 +0,0 @@
|
||||
/*
|
||||
MacOS_config.h
|
||||
|
||||
Configuration flags for Macintosh development systems.
|
||||
|
||||
<Revision History>
|
||||
|
||||
11/16/95 pcb Updated compilation flags to reflect latest 4.6 Makefile.
|
||||
|
||||
by Patrick C. Beard.
|
||||
*/
|
||||
/* Boehm, November 17, 1995 12:10 pm PST */
|
||||
|
||||
#ifdef __MWERKS__
|
||||
|
||||
// for CodeWarrior Pro with Metrowerks Standard Library (MSL).
|
||||
// #define MSL_USE_PRECOMPILED_HEADERS 0
|
||||
#include <ansi_prefix.mac.h>
|
||||
#ifndef __STDC__
|
||||
#define __STDC__ 0
|
||||
#endif
|
||||
|
||||
#endif /* __MWERKS__ */
|
||||
|
||||
// these are defined again in gc_priv.h.
|
||||
#undef TRUE
|
||||
#undef FALSE
|
||||
|
||||
#define ALL_INTERIOR_POINTERS // follows interior pointers.
|
||||
#define SILENT // no collection messages.
|
||||
//#define DONT_ADD_BYTE_AT_END // no padding.
|
||||
//#define SMALL_CONFIG // whether to use a smaller heap.
|
||||
#define NO_SIGNALS // signals aren't real on the Macintosh.
|
||||
#define USE_TEMPORARY_MEMORY // use Macintosh temporary memory.
|
||||
//#define FIND_LEAK // use as a leak detector.
|
||||
//#define LARGE_CONFIG // try a big heap, for fun.
|
||||
|
||||
// CFLAGS= -O -DNO_SIGNALS -DSILENT -DALL_INTERIOR_POINTERS
|
||||
//
|
||||
//LIBGC_CFLAGS= -O -DNO_SIGNALS -DSILENT \
|
||||
// -DREDIRECT_MALLOC=GC_malloc_uncollectable \
|
||||
// -DDONT_ADD_BYTE_AT_END -DALL_INTERIOR_POINTERS
|
||||
// Flags for building libgc.a -- the last two are required.
|
||||
//
|
||||
// Setjmp_test may yield overly optimistic results when compiled
|
||||
// without optimization.
|
||||
// -DSILENT disables statistics printing, and improves performance.
|
||||
// -DCHECKSUMS reports on erroneously clear dirty bits, and unexpectedly
|
||||
// altered stubborn objects, at substantial performance cost.
|
||||
// Use only for incremental collector debugging.
|
||||
// -DFIND_LEAK causes the collector to assume that all inaccessible
|
||||
// objects should have been explicitly deallocated, and reports exceptions.
|
||||
// Finalization and the test program are not usable in this mode.
|
||||
// -DSOLARIS_THREADS enables support for Solaris (thr_) threads.
|
||||
// (Clients should also define SOLARIS_THREADS and then include
|
||||
// gc.h before performing thr_ or GC_ operations.)
|
||||
// This is broken on nonSPARC machines.
|
||||
// -DALL_INTERIOR_POINTERS allows all pointers to the interior
|
||||
// of objects to be recognized. (See gc_priv.h for consequences.)
|
||||
// -DSMALL_CONFIG tries to tune the collector for small heap sizes,
|
||||
// usually causing it to use less space in such situations.
|
||||
// Incremental collection no longer works in this case.
|
||||
// -DLARGE_CONFIG tunes the collector for unusually large heaps.
|
||||
// Necessary for heaps larger than about 500 MB on most machines.
|
||||
// Recommended for heaps larger than about 64 MB.
|
||||
// -DDONT_ADD_BYTE_AT_END is meaningful only with
|
||||
// -DALL_INTERIOR_POINTERS. Normally -DALL_INTERIOR_POINTERS
|
||||
// causes all objects to be padded so that pointers just past the end of
|
||||
// an object can be recognized. This can be expensive. (The padding
|
||||
// is normally more than one byte due to alignment constraints.)
|
||||
// -DDONT_ADD_BYTE_AT_END disables the padding.
|
||||
// -DNO_SIGNALS does not disable signals during critical parts of
|
||||
// the GC process. This is no less correct than many malloc
|
||||
// implementations, and it sometimes has a significant performance
|
||||
// impact. However, it is dangerous for many not-quite-ANSI C
|
||||
// programs that call things like printf in asynchronous signal handlers.
|
||||
// -DOPERATOR_NEW_ARRAY declares that the C++ compiler supports the
|
||||
// new syntax "operator new[]" for allocating and deleting arrays.
|
||||
// See gc_cpp.h for details. No effect on the C part of the collector.
|
||||
// This is defined implicitly in a few environments.
|
||||
// -DREDIRECT_MALLOC=X causes malloc, realloc, and free to be defined
|
||||
// as aliases for X, GC_realloc, and GC_free, respectively.
|
||||
// Calloc is redefined in terms of the new malloc. X should
|
||||
// be either GC_malloc or GC_malloc_uncollectable.
|
||||
// The former is occasionally useful for working around leaks in code
|
||||
// you don't want to (or can't) look at. It may not work for
|
||||
// existing code, but it often does. Neither works on all platforms,
|
||||
// since some ports use malloc or calloc to obtain system memory.
|
||||
// (Probably works for UNIX, and win32.)
|
||||
// -DNO_DEBUG removes GC_dump and the debugging routines it calls.
|
||||
// Reduces code size slightly at the expense of debuggability.
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,153 +0,0 @@
|
||||
// -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
//
|
||||
// The contents of this file are subject to the Netscape Public
|
||||
// License Version 1.1 (the "License"); you may not use this file
|
||||
// except in compliance with the License. You may obtain a copy of
|
||||
// the License at http://www.mozilla.org/NPL/
|
||||
//
|
||||
// Software distributed under the License is distributed on an "AS
|
||||
// IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
||||
// implied. See the License for the specific language governing
|
||||
// rights and limitations under the License.
|
||||
//
|
||||
// The Original Code is the JavaScript 2 Prototype.
|
||||
//
|
||||
// The Initial Developer of the Original Code is Netscape
|
||||
// Communications Corporation. Portions created by Netscape are
|
||||
// Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
// Rights Reserved.
|
||||
|
||||
#ifndef numerics_h
|
||||
#define numerics_h
|
||||
|
||||
#include "utilities.h"
|
||||
#include <cmath>
|
||||
|
||||
/* Use platform-defined floating-point routines.
|
||||
* On platforms with faulty floating-point code
|
||||
* ifdef these out and replace by custom implementations. */
|
||||
|
||||
#ifndef STLPORT
|
||||
# ifndef _WIN32
|
||||
using std::abs;
|
||||
using std::floor;
|
||||
using std::ceil;
|
||||
using std::fmod;
|
||||
using std::sqrt;
|
||||
using std::sin;
|
||||
using std::cos;
|
||||
using std::tan;
|
||||
using std::asin;
|
||||
using std::acos;
|
||||
using std::atan;
|
||||
# endif
|
||||
#endif
|
||||
|
||||
namespace JavaScript {
|
||||
|
||||
//
|
||||
// Double-precision constants
|
||||
//
|
||||
|
||||
extern double positiveInfinity;
|
||||
extern double negativeInfinity;
|
||||
extern double nan;
|
||||
|
||||
//
|
||||
// Portable double-precision floating point to string and back conversions
|
||||
//
|
||||
|
||||
double ulp(double x);
|
||||
int hi0bits(uint32 x);
|
||||
|
||||
class BigInt {
|
||||
enum {maxLgGrossSize = 15}; // Maximum value of lg2(grossSize)
|
||||
static uint32 *freeLists[maxLgGrossSize+1];
|
||||
|
||||
uint lgGrossSize; // lg2(grossSize)
|
||||
public:
|
||||
bool negative; // True if negative. Ignored by most BigInt routines!
|
||||
private:
|
||||
uint32 grossSize; // Number of words allocated for <words>
|
||||
uint32 size; // Actual number of words. If the number is nonzero, the most significant word must be nonzero.
|
||||
// If the number is zero, then size is also 0.
|
||||
uint32 *words; // <size> words of the number, in little endian order
|
||||
|
||||
void allocate(uint lgGrossSize);
|
||||
void recycle();
|
||||
void initCopy(const BigInt &b);
|
||||
void move(BigInt &b);
|
||||
public:
|
||||
BigInt(): words(0) {}
|
||||
explicit BigInt(uint lgGrossSize) {allocate(lgGrossSize);}
|
||||
BigInt(const BigInt &b) {initCopy(b);}
|
||||
void operator=(const BigInt &b) {ASSERT(!words); initCopy(b);}
|
||||
~BigInt() {if (words) recycle();}
|
||||
|
||||
void setLgGrossSize(uint lgGrossSize);
|
||||
void init(uint32 i);
|
||||
void init(double d, int32 &e, int32 &bits);
|
||||
void mulAdd(uint m, uint a);
|
||||
void operator*=(const BigInt &m);
|
||||
void pow2Mul(int32 k);
|
||||
void pow5Mul(int32 k);
|
||||
bool isZero() const {ASSERT(words); return !size;}
|
||||
int cmp(const BigInt &b) const;
|
||||
void initDiff(const BigInt &m, const BigInt &n);
|
||||
uint32 quoRem2(int32 k);
|
||||
int32 quoRem(const BigInt &S);
|
||||
uint32 divRem(uint32 divisor);
|
||||
double b2d(int32 &e) const;
|
||||
double ratio(const BigInt &denominator) const;
|
||||
void s2b(const char *s, int32 nd0, int32 nd, uint32 y9);
|
||||
|
||||
uint32 nWords() const {return size;}
|
||||
uint32 word(uint32 i) const {ASSERT(i < size); return words[i];}
|
||||
};
|
||||
|
||||
|
||||
// Modes for converting floating-point numbers to strings.
|
||||
//
|
||||
// Some of the modes can round-trip; this means that if the number is converted to
|
||||
// a string using one of these mode and then converted back to a number, the result
|
||||
// will be identical to the original number (except that, due to ECMA, -0 will get converted
|
||||
// to +0). These round-trip modes return the minimum number of significand digits that
|
||||
// permit the round trip.
|
||||
//
|
||||
// Some of the modes take an integer parameter <precision>.
|
||||
//
|
||||
// Keep this in sync with doubleToAsciiModes[].
|
||||
enum DToStrMode {
|
||||
dtosStandard, // Either fixed or exponential format; round-trip
|
||||
dtosStandardExponential, // Always exponential format; round-trip
|
||||
dtosFixed, // Round to <precision> digits after the decimal point; exponential if number is large
|
||||
dtosExponential, // Always exponential format; <precision> significant digits
|
||||
dtosPrecision // Either fixed or exponential format; <precision> significant digits
|
||||
};
|
||||
|
||||
|
||||
// Maximum number of characters (including trailing null) that a dtosStandard or dtosStandardExponential
|
||||
// conversion can produce. This maximum is reached for a number like -1.2345678901234567e+123.
|
||||
const int dtosStandardBufferSize = 25;
|
||||
|
||||
// Maximum number of characters (including trailing null) that one of the other conversions
|
||||
// can produce. This maximum is reached for TO_FIXED, which can generate up to 21 digits before the decimal point.
|
||||
#define dtosVariableBufferSize(precision) ((precision)+24 > dtosStandardBufferSize ? (precision)+24 : dtosStandardBufferSize)
|
||||
|
||||
// "-0.0000...(1073 zeros after decimal point)...0001\0" is the longest string that we could produce,
|
||||
// which occurs when printing -5e-324 in binary. We could compute a better estimate of the size of
|
||||
// the output string and malloc fewer bytes depending on d and base, but why bother?
|
||||
const int dtobasesBufferSize = 1078;
|
||||
|
||||
double strToDouble(const char *str, const char *&numEnd);
|
||||
double stringToDouble(const char16 *str, const char16 *strEnd, const char16 *&numEnd);
|
||||
double stringToInteger(const char16 *str, const char16 *strEnd, const char16 *&numEnd, uint base);
|
||||
|
||||
char *doubleToStr(char *buffer, size_t bufferSize, double value, DToStrMode mode, int precision);
|
||||
size_t doubleToBaseStr(char *buffer, double value, uint base);
|
||||
void appendDouble(String &dst, double value, DToStrMode mode = dtosStandard, int precision = 0);
|
||||
inline String &operator+=(String &s, double value) {appendDouble(s, value); return s;}
|
||||
void printDouble(Formatter &f, double value, DToStrMode mode = dtosStandard, int precision = 0);
|
||||
inline Formatter &operator<<(Formatter &f, double value) {printDouble(f, value); return f;}
|
||||
}
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,93 +0,0 @@
|
||||
// -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
//
|
||||
// The contents of this file are subject to the Netscape Public
|
||||
// License Version 1.1 (the "License"); you may not use this file
|
||||
// except in compliance with the License. You may obtain a copy of
|
||||
// the License at http://www.mozilla.org/NPL/
|
||||
//
|
||||
// Software distributed under the License is distributed on an "AS
|
||||
// IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
||||
// implied. See the License for the specific language governing
|
||||
// rights and limitations under the License.
|
||||
//
|
||||
// The Original Code is the JavaScript 2 Prototype.
|
||||
//
|
||||
// The Initial Developer of the Original Code is Netscape
|
||||
// Communications Corporation. Portions created by Netscape are
|
||||
// Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
// Rights Reserved.
|
||||
|
||||
#ifndef systemtypes_h
|
||||
#define systemtypes_h
|
||||
|
||||
#include <cstddef>
|
||||
|
||||
#ifdef _WIN32
|
||||
// Turn off warnings about identifiers too long in browser information
|
||||
#pragma warning(disable: 4786)
|
||||
#endif
|
||||
|
||||
// Define int8, int16, int32, int64, uint8, uint16, uint32, uint64, and uint.
|
||||
typedef unsigned int uint;
|
||||
typedef unsigned char uchar;
|
||||
|
||||
typedef signed char int8;
|
||||
typedef unsigned char uint8;
|
||||
typedef short int16;
|
||||
typedef unsigned short uint16;
|
||||
#if !defined(XP_MAC) && !defined(_WIN32)
|
||||
typedef int int32;
|
||||
typedef unsigned int uint32;
|
||||
#else
|
||||
typedef long int32;
|
||||
typedef unsigned long uint32;
|
||||
#endif
|
||||
#ifdef _WIN32
|
||||
typedef __int64 int64;
|
||||
typedef unsigned __int64 uint64;
|
||||
#else
|
||||
typedef long long int64;
|
||||
typedef unsigned long long uint64;
|
||||
#endif
|
||||
|
||||
// Define this if the machine natively supports 64-bit integers
|
||||
#define NATIVE_INT64
|
||||
|
||||
// Define float32 and float64.
|
||||
typedef double float64;
|
||||
typedef float float32;
|
||||
|
||||
// A UTF-16 character
|
||||
// Use wchar_t on platforms on which wchar_t has 16 bits; otherwise use int16.
|
||||
// Note that in C++ wchar_t is a distinct type rather than a typedef for some integral type.
|
||||
// Like char, a char16 can be either signed or unsigned at the implementation's discretion.
|
||||
#ifdef __GNUC__
|
||||
// GCC's wchar_t is 32 bits, so we can't use it.
|
||||
typedef uint16 char16;
|
||||
typedef uint16 uchar16;
|
||||
#else
|
||||
typedef wchar_t char16;
|
||||
#ifndef _WIN32 // Microsoft VC6 bug: wchar_t should be a built-in type, not a typedef
|
||||
typedef unsigned wchar_t uchar16;
|
||||
#else
|
||||
typedef wchar_t uchar16;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
#define IS_LITTLE_ENDIAN
|
||||
#endif
|
||||
#ifdef __i386__
|
||||
#define IS_LITTLE_ENDIAN
|
||||
#endif
|
||||
|
||||
|
||||
// basicAlignment is the maximum alignment required by any native type. An object aligned to
|
||||
// a multiple of basicAlignment can hold any native type. malloc should return a pointer whose
|
||||
// lgBasicAlignment least significant bits are clear.
|
||||
// Currently basicAlignment is set to 8 to allow doubles and int64s to have their natural alignment;
|
||||
// may be customized for individual platforms.
|
||||
const uint lgBasicAlignment = 3;
|
||||
const uint basicAlignment = 1u<<lgBasicAlignment;
|
||||
|
||||
#endif /* systemtypes_h */
|
||||
@@ -1,28 +0,0 @@
|
||||
class A {
|
||||
static var x = 0;
|
||||
|
||||
static function f()
|
||||
{
|
||||
return A.x++;
|
||||
}
|
||||
}
|
||||
|
||||
class Point3D {
|
||||
var x = 0, y = 0, z = 0;
|
||||
|
||||
function set(x, y, z) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
return this;
|
||||
}
|
||||
|
||||
function setX(x) { this.x = x; }
|
||||
function getX() { return this.x; }
|
||||
|
||||
function setY(y) { this.y = y; }
|
||||
function getY() { return this.y; }
|
||||
|
||||
function setZ(z) { this.z = z; }
|
||||
function getZ() { return this.z; }
|
||||
}
|
||||
@@ -1,596 +0,0 @@
|
||||
#!perl
|
||||
|
||||
use strict;
|
||||
|
||||
my $tab = " ";
|
||||
my $init_tab = $tab;
|
||||
my $enum_decs = "";
|
||||
my $class_decs = "";
|
||||
my @name_array;
|
||||
my $opcode_maxlen = 0;
|
||||
|
||||
#
|
||||
# fields are:
|
||||
#
|
||||
# * super: Class to inherit from, if super is Instruction_(1|2|3), the script
|
||||
# will automatically append the correct template info based on |params|
|
||||
# * super_has_print: Set to 1 if you want to inherit the print() and print_args()
|
||||
# methods from the superclass, set to 0 (or just don't set)
|
||||
# to generate print methods.
|
||||
# * rem: Remark you want to show up after the enum def, and inside the class.
|
||||
# * params: The parameter list expected by the constructor, you can specify a
|
||||
# default value, using the syntax, [ ("Type = default") ].
|
||||
#
|
||||
# class names will be generated based on the opcode mnemonic. See the
|
||||
# subroutine get_classname for the implementation. Basically underscores will
|
||||
# be removes and the class name will be WordCapped, using the positions where the
|
||||
# underscores were as word boundries. The only exception occurs when a word is
|
||||
# two characters, in which case both characters will be capped,
|
||||
# as in BRANCH_GT -> BranchGT.
|
||||
#
|
||||
|
||||
#
|
||||
# template definitions for compare, arithmetic, and conditional branch ops
|
||||
#
|
||||
my $binary_op =
|
||||
{
|
||||
super => "Instruction_3",
|
||||
super_has_print => 1,
|
||||
rem => "dest, source1, source2",
|
||||
params => [ ("TypedRegister", "TypedRegister", "TypedRegister") ]
|
||||
};
|
||||
|
||||
my $math_op =
|
||||
{
|
||||
super => "Arithmetic",
|
||||
super_has_print => 1,
|
||||
rem => "dest, source1, source2",
|
||||
params => [ ("TypedRegister", "TypedRegister", "TypedRegister") ]
|
||||
};
|
||||
|
||||
my $cbranch_op =
|
||||
{
|
||||
super => "GenericBranch",
|
||||
super_has_print => 1,
|
||||
rem => "target label, condition",
|
||||
params => [ ("Label*", "TypedRegister") ]
|
||||
};
|
||||
|
||||
my $unary_op =
|
||||
{
|
||||
super => "Instruction_2",
|
||||
rem => "dest, source",
|
||||
params => [ ("TypedRegister", "TypedRegister") ]
|
||||
};
|
||||
|
||||
|
||||
#
|
||||
# op defititions
|
||||
#
|
||||
my %ops;
|
||||
$ops{"NOP"} =
|
||||
{
|
||||
super => "Instruction",
|
||||
rem => "do nothing and like it",
|
||||
};
|
||||
$ops{"DEBUGGER"} =
|
||||
{
|
||||
super => "Instruction",
|
||||
rem => "drop to the debugger",
|
||||
};
|
||||
$ops{"GENERIC_BINARY_OP"} =
|
||||
{
|
||||
super => "Instruction_4",
|
||||
rem => "dest, op, source1, source2",
|
||||
params => [ ("TypedRegister", "BinaryOperator::BinaryOp", "TypedRegister", "TypedRegister") ]
|
||||
};
|
||||
$ops{"MOVE"} =
|
||||
{
|
||||
super => "Instruction_2",
|
||||
rem => "dest, source",
|
||||
params => [ ("TypedRegister", "TypedRegister") ]
|
||||
};
|
||||
$ops{"LOAD_IMMEDIATE"} =
|
||||
{
|
||||
super => "Instruction_2",
|
||||
rem => "dest, immediate value (double)",
|
||||
params => [ ("TypedRegister", "double" ) ]
|
||||
};
|
||||
$ops{"LOAD_BOOLEAN"} =
|
||||
{
|
||||
super => "Instruction_2",
|
||||
rem => "dest, immediate value (boolean)",
|
||||
params => [ ("TypedRegister", "bool" ) ]
|
||||
};
|
||||
$ops{"LOAD_STRING"} =
|
||||
{
|
||||
super => "Instruction_2",
|
||||
rem => "dest, immediate value (string)",
|
||||
params => [ ("TypedRegister", "JSString*" ) ]
|
||||
};
|
||||
$ops{"LOAD_NAME"} =
|
||||
{
|
||||
super => "Instruction_2",
|
||||
rem => "dest, name",
|
||||
params => [ ("TypedRegister", "const StringAtom*" ) ]
|
||||
};
|
||||
$ops{"SUPER"} =
|
||||
{
|
||||
super => "Instruction_1",
|
||||
rem => "dest",
|
||||
params => [ ("TypedRegister" ) ]
|
||||
};
|
||||
$ops{"SAVE_NAME"} =
|
||||
{
|
||||
super => "Instruction_2",
|
||||
rem => "name, source",
|
||||
params => [ ("const StringAtom*", "TypedRegister") ]
|
||||
};
|
||||
$ops{"NEW_OBJECT"} =
|
||||
{
|
||||
super => "Instruction_2",
|
||||
rem => "dest, constructor",
|
||||
params => [ ("TypedRegister", "TypedRegister") ]
|
||||
};
|
||||
$ops{"NEW_CLASS"} =
|
||||
{
|
||||
super => "Instruction_2",
|
||||
rem => "dest, class",
|
||||
params => [ ("TypedRegister", "JSClass*") ]
|
||||
};
|
||||
$ops{"NEW_FUNCTION"} =
|
||||
{
|
||||
super => "Instruction_2",
|
||||
rem => "dest, ICodeModule",
|
||||
params => [ ("TypedRegister", "ICodeModule*") ]
|
||||
};
|
||||
$ops{"NEW_ARRAY"} =
|
||||
{
|
||||
super => "Instruction_1",
|
||||
rem => "dest",
|
||||
params => [ ("TypedRegister") ]
|
||||
};
|
||||
$ops{"DELETE_PROP"} =
|
||||
{
|
||||
super => "Instruction_3",
|
||||
rem => "dest, object, prop name",
|
||||
params => [ ("TypedRegister", "TypedRegister", "const StringAtom*") ]
|
||||
};
|
||||
$ops{"GET_PROP"} =
|
||||
{
|
||||
super => "Instruction_3",
|
||||
rem => "dest, object, prop name",
|
||||
params => [ ("TypedRegister", "TypedRegister", "const StringAtom*") ]
|
||||
};
|
||||
$ops{"SET_PROP"} =
|
||||
{
|
||||
super => "Instruction_3",
|
||||
rem => "object, name, source",
|
||||
params => [ ("TypedRegister", "const StringAtom*", "TypedRegister") ]
|
||||
};
|
||||
$ops{"GET_SLOT"} =
|
||||
{
|
||||
super => "Instruction_3",
|
||||
rem => "dest, object, slot number",
|
||||
params => [ ("TypedRegister", "TypedRegister", "uint32") ]
|
||||
};
|
||||
$ops{"SET_SLOT"} =
|
||||
{
|
||||
super => "Instruction_3",
|
||||
rem => "object, slot number, source",
|
||||
params => [ ("TypedRegister", "uint32", "TypedRegister") ]
|
||||
};
|
||||
$ops{"GET_STATIC"} =
|
||||
{
|
||||
super => "Instruction_3",
|
||||
rem => "dest, class, index",
|
||||
params => [ ("TypedRegister", "JSClass*", "uint32") ]
|
||||
};
|
||||
$ops{"SET_STATIC"} =
|
||||
{
|
||||
super => "Instruction_3",
|
||||
rem => "class, index, source",
|
||||
params => [ ("JSClass*", "uint32", "TypedRegister") ]
|
||||
};
|
||||
$ops{"STATIC_XCR"} =
|
||||
{
|
||||
super => "Instruction_4",
|
||||
rem => "dest, class, index, value",
|
||||
params => [ ("TypedRegister", "JSClass*", "uint32", "double") ]
|
||||
};
|
||||
$ops{"SLOT_XCR"} =
|
||||
{
|
||||
super => "Instruction_4",
|
||||
rem => "dest, source, slot number, value",
|
||||
params => [ ("TypedRegister", "TypedRegister", "uint32", "double") ]
|
||||
};
|
||||
$ops{"PROP_XCR"} =
|
||||
{
|
||||
super => "Instruction_4",
|
||||
rem => "dest, source, name, value",
|
||||
params => [ ("TypedRegister", "TypedRegister", "const StringAtom*", "double") ]
|
||||
};
|
||||
$ops{"ELEM_XCR"} =
|
||||
{
|
||||
super => "Instruction_4",
|
||||
rem => "dest, base, index, value",
|
||||
params => [ ("TypedRegister", "TypedRegister", "TypedRegister", "double") ]
|
||||
};
|
||||
$ops{"NAME_XCR"} =
|
||||
{
|
||||
super => "Instruction_3",
|
||||
rem => "dest, name, value",
|
||||
params => [ ("TypedRegister", "const StringAtom*", "double") ]
|
||||
};
|
||||
$ops{"VAR_XCR"} =
|
||||
{
|
||||
super => "Instruction_3",
|
||||
rem => "dest, source, value",
|
||||
params => [ ("TypedRegister", "TypedRegister", "double") ]
|
||||
};
|
||||
$ops{"GET_ELEMENT"} =
|
||||
{
|
||||
super => "Instruction_3",
|
||||
rem => "dest, base, index",
|
||||
params => [ ("TypedRegister", "TypedRegister", "TypedRegister") ]
|
||||
};
|
||||
$ops{"SET_ELEMENT"} =
|
||||
{
|
||||
super => "Instruction_3",
|
||||
rem => "base, index, value",
|
||||
params => [ ("TypedRegister", "TypedRegister", "TypedRegister") ]
|
||||
};
|
||||
$ops{"ADD"} = $math_op;
|
||||
$ops{"SUBTRACT"} = $math_op;
|
||||
$ops{"MULTIPLY"} = $math_op;
|
||||
$ops{"DIVIDE"} = $math_op;
|
||||
$ops{"REMAINDER"} = $math_op;
|
||||
$ops{"SHIFTLEFT"} = $math_op;
|
||||
$ops{"SHIFTRIGHT"} = $math_op;
|
||||
$ops{"USHIFTRIGHT"}= $math_op;
|
||||
$ops{"AND"} = $math_op;
|
||||
$ops{"OR"} = $math_op;
|
||||
$ops{"XOR"} = $math_op;
|
||||
$ops{"COMPARE_LT"} = $binary_op;
|
||||
$ops{"COMPARE_LE"} = $binary_op;
|
||||
$ops{"COMPARE_EQ"} = $binary_op;
|
||||
$ops{"COMPARE_NE"} = $binary_op;
|
||||
$ops{"COMPARE_GE"} = $binary_op;
|
||||
$ops{"COMPARE_GT"} = $binary_op;
|
||||
$ops{"COMPARE_IN"} = $binary_op;
|
||||
$ops{"STRICT_EQ"} = $binary_op;
|
||||
$ops{"STRICT_NE"} = $binary_op;
|
||||
$ops{"INSTANCEOF"} = $binary_op;
|
||||
$ops{"BITNOT"} = $unary_op;
|
||||
$ops{"NOT"} = $unary_op;
|
||||
$ops{"TEST"} = $unary_op;
|
||||
$ops{"NEGATE"} = $unary_op;
|
||||
$ops{"POSATE"} = $unary_op;
|
||||
$ops{"BRANCH"} =
|
||||
{
|
||||
super => "GenericBranch",
|
||||
rem => "target label",
|
||||
params => [ ("Label*") ]
|
||||
};
|
||||
$ops{"BRANCH_TRUE"} = $cbranch_op;
|
||||
$ops{"BRANCH_FALSE"} = $cbranch_op;
|
||||
$ops{"RETURN"} =
|
||||
{
|
||||
super => "Instruction_1",
|
||||
rem => "return value",
|
||||
params => [ ("TypedRegister") ]
|
||||
};
|
||||
$ops{"RETURN_VOID"} =
|
||||
{
|
||||
super => "Instruction",
|
||||
rem => "Return without a value"
|
||||
};
|
||||
$ops{"CALL"} =
|
||||
{
|
||||
super => "Instruction_4",
|
||||
rem => "result, base, target, args",
|
||||
params => [ ("TypedRegister", "TypedRegister", "TypedRegister", "RegisterList") ]
|
||||
};
|
||||
$ops{"GET_METHOD"} =
|
||||
{
|
||||
super => "Instruction_3",
|
||||
rem => "result, target base, index",
|
||||
params => [ ("TypedRegister", "TypedRegister", "uint32") ]
|
||||
};
|
||||
$ops{"THROW"} =
|
||||
{
|
||||
super => "Instruction_1",
|
||||
rem => "exception value",
|
||||
params => [ ("TypedRegister") ]
|
||||
};
|
||||
$ops{"TRYIN"} =
|
||||
{
|
||||
super => "Instruction_2",
|
||||
rem => "catch target, finally target",
|
||||
params => [ ("Label*", "Label*") ]
|
||||
};
|
||||
$ops{"TRYOUT"} =
|
||||
{
|
||||
super => "Instruction",
|
||||
rem => "mmm, there is no try, only do",
|
||||
};
|
||||
$ops{"JSR"} =
|
||||
{
|
||||
super => "GenericBranch",
|
||||
rem => "target",
|
||||
params => [ ("Label*") ]
|
||||
};
|
||||
$ops{"RTS"} =
|
||||
{
|
||||
super => "Instruction",
|
||||
rem => "Return to sender",
|
||||
};
|
||||
$ops{"WITHIN"} =
|
||||
{
|
||||
super => "Instruction_1",
|
||||
rem => "within this object",
|
||||
params => [ ("TypedRegister") ]
|
||||
};
|
||||
$ops{"WITHOUT"} =
|
||||
{
|
||||
super => "Instruction",
|
||||
rem => "without this object",
|
||||
};
|
||||
$ops{"CAST"} =
|
||||
{
|
||||
super => "Instruction_3",
|
||||
rem => "dest, rvalue, toType",
|
||||
params => [ ("TypedRegister", "TypedRegister", "JSType*") ]
|
||||
};
|
||||
|
||||
#
|
||||
# nasty perl code, you probably don't need to muck around below this line
|
||||
#
|
||||
|
||||
my $k;
|
||||
|
||||
if (!$ARGV[0]) {
|
||||
# no args, collect all opcodes
|
||||
for $k (sort(keys(%ops))) {
|
||||
&collect($k);
|
||||
}
|
||||
} else {
|
||||
# collect defs for only the opcodes specified on the command line
|
||||
while ($k = pop(@ARGV)) {
|
||||
&collect (uc($k));
|
||||
}
|
||||
}
|
||||
|
||||
&spew;
|
||||
|
||||
sub collect {
|
||||
# grab the info from the $k record in $ops, and append it to
|
||||
# $enum_decs, @name_array, and $class_decs.
|
||||
my ($k) = @_;
|
||||
|
||||
if (length($k) > $opcode_maxlen) {
|
||||
$opcode_maxlen = length($k);
|
||||
}
|
||||
|
||||
my $c = $ops{$k};
|
||||
if (!$c) {
|
||||
die ("Unknown opcode, $k\n");
|
||||
}
|
||||
|
||||
my $opname = $k;
|
||||
my $cname = get_classname ($k);
|
||||
my $super = $c->{"super"};
|
||||
my $constructor = $super;
|
||||
my @params;
|
||||
|
||||
if ($c->{"params"}) {
|
||||
@params = @{$c->{"params"}};
|
||||
} else {
|
||||
@params = ();
|
||||
}
|
||||
|
||||
my $rem = $c->{"rem"};
|
||||
my ($dec_list, $call_list, $template_list) =
|
||||
&get_paramlists(@params);
|
||||
my @types = split (", ", $template_list);
|
||||
|
||||
my $constr_params = $call_list ? $opname . ", " . $call_list : $opname;
|
||||
|
||||
if ($super =~ /Instruction_\d/) {
|
||||
$super .= "<" . $template_list . ">";
|
||||
}
|
||||
|
||||
push (@name_array, $opname);
|
||||
$enum_decs .= "$init_tab$tab$opname, /* $rem */\n";
|
||||
if ($super) {
|
||||
$class_decs .= ($init_tab . "class $cname : public $super {\n" .
|
||||
$init_tab . "public:\n" .
|
||||
$init_tab . $tab . "/* $rem */\n" .
|
||||
$init_tab . $tab . "$cname ($dec_list) :\n" .
|
||||
$init_tab . $tab . $tab . "$super\n" .
|
||||
"$init_tab$tab$tab($constr_params) " .
|
||||
"{};\n");
|
||||
|
||||
if (!$c->{"super_has_print"}) {
|
||||
$class_decs .= ($init_tab . $tab .
|
||||
"virtual Formatter& print(Formatter& f) {\n" .
|
||||
$init_tab . $tab . $tab . "f << opcodeNames[$opname]" .
|
||||
&get_print_body(@types) . ";\n" .
|
||||
$init_tab . $tab . $tab . "return f;\n" .
|
||||
$init_tab . $tab . "}\n");
|
||||
|
||||
my $printops_body = &get_printops_body(@types);
|
||||
my $printops_decl = "virtual Formatter& printOperands(Formatter& f, ";
|
||||
|
||||
$printops_decl .= ($dec_list =~ /RegisterList/) ?
|
||||
"const JSValues& registers" :
|
||||
"const JSValues& /*registers*/";
|
||||
$printops_decl .= ") {\n";
|
||||
|
||||
$class_decs .= ($init_tab . $tab .
|
||||
$printops_decl .
|
||||
$printops_body .
|
||||
$init_tab . $tab . $tab . "return f;\n" .
|
||||
$init_tab . $tab . "}\n");
|
||||
|
||||
} else {
|
||||
$class_decs .= $init_tab . $tab .
|
||||
"/* print() and printOperands() inherited from $super */\n";
|
||||
}
|
||||
|
||||
$class_decs .= $init_tab . "};\n\n";
|
||||
}
|
||||
}
|
||||
|
||||
sub spew {
|
||||
# print the info in $enum_decs, @name_aray, and $class_decs to stdout.
|
||||
my $opname;
|
||||
|
||||
print "// THIS FILE IS MACHINE GENERATED! DO NOT EDIT BY HAND!\n\n";
|
||||
|
||||
print "#if !defined(OPCODE_NAMES)\n\n";
|
||||
|
||||
print $tab . "enum {\n$enum_decs$tab};\n\n";
|
||||
|
||||
print $class_decs;
|
||||
|
||||
print "#else\n\n";
|
||||
|
||||
print $tab . "char *opcodeNames[] = {\n";
|
||||
|
||||
for $opname (@name_array) {
|
||||
print "$tab$tab\"$opname";
|
||||
for (0 .. $opcode_maxlen - length($opname) - 1) {
|
||||
print " ";
|
||||
}
|
||||
print "\",\n"
|
||||
}
|
||||
print "$tab};\n\n";
|
||||
|
||||
print "#endif\n\n"
|
||||
}
|
||||
|
||||
sub get_classname {
|
||||
# munge an OPCODE_MNEMONIC into a ClassName
|
||||
my ($enum_name) = @_;
|
||||
my @words = split ("_", $enum_name);
|
||||
my $cname = "";
|
||||
my $i = 0;
|
||||
my $word;
|
||||
|
||||
for $word (@words) {
|
||||
if ((length($word) == 2) && ($i != 0)) {
|
||||
$cname .= uc($word);
|
||||
} else {
|
||||
$cname .= uc(substr($word, 0, 1)) . lc(substr($word, 1));
|
||||
}
|
||||
$i++;
|
||||
}
|
||||
|
||||
return $cname;
|
||||
}
|
||||
|
||||
sub get_paramlists {
|
||||
# parse the params entry (passed into @types) into various parameter lists
|
||||
# used in the class declaration
|
||||
my @types = @_;
|
||||
my @dec;
|
||||
my @call;
|
||||
my @tostr;
|
||||
my @template;
|
||||
my $op = 1;
|
||||
my $type;
|
||||
|
||||
for $type (@types) {
|
||||
my $pfx;
|
||||
my $deref;
|
||||
my $member;
|
||||
my $default;
|
||||
|
||||
($type, $default) = split (" = ", $type);
|
||||
if ($default ne "") {
|
||||
$default = " = " . $default;
|
||||
}
|
||||
|
||||
$pfx = $deref = "";
|
||||
$member = "mOp$op";
|
||||
|
||||
push (@dec, "$type aOp$op" . "$default");
|
||||
push (@call, "aOp$op");
|
||||
push (@template, $type);
|
||||
$op++;
|
||||
}
|
||||
|
||||
return (join (", ", @dec), join (", ", @call), join (", ", @template));
|
||||
}
|
||||
|
||||
sub get_print_body {
|
||||
# generate the body of the print() function
|
||||
my (@types) = @_;
|
||||
my $type;
|
||||
my @oplist;
|
||||
my $op = 1;
|
||||
my $in = $init_tab . $tab . $tab;
|
||||
|
||||
for $type (@types) {
|
||||
|
||||
if ($type eq "TypedRegister") {
|
||||
|
||||
push (@oplist, "mOp$op" );
|
||||
|
||||
# push (@oplist, "\"R\" << ((mOp$op.first == NotARegister) ? -1 : mOp$op.first)");
|
||||
|
||||
} elsif ($type eq "Label*") {
|
||||
push (@oplist, "\"Offset \" << ((mOp$op) ? mOp$op->mOffset : NotAnOffset)")
|
||||
} elsif ($type =~ /String/) {
|
||||
push (@oplist, "\"'\" << *mOp$op << \"'\"");
|
||||
} elsif ($type =~ /JSType\*/) {
|
||||
push (@oplist, "\"'\" << mOp$op->getName() << \"'\"");
|
||||
} elsif ($type =~ /bool/) {
|
||||
push (@oplist, "\"'\" << ((mOp$op) ? \"true\" : \"false\") << \"'\"");
|
||||
} elsif ($type =~ /ICodeModule/) {
|
||||
push (@oplist, "\"ICodeModule\"");
|
||||
} elsif ($type =~ /JSClass\*/) {
|
||||
push (@oplist, "mOp$op->getName()");
|
||||
} else {
|
||||
push (@oplist, "mOp$op");
|
||||
}
|
||||
|
||||
$op++;
|
||||
}
|
||||
|
||||
my $rv = join (" << \", \" << ", @oplist);
|
||||
if ($rv ne "") {
|
||||
$rv = " << \"\\t\" << " . $rv;
|
||||
}
|
||||
|
||||
return $rv;
|
||||
}
|
||||
|
||||
sub get_printops_body {
|
||||
# generate the body of the printOperands() function
|
||||
my (@types) = @_;
|
||||
my $type;
|
||||
my @oplist;
|
||||
my $op = 1;
|
||||
my $in = $init_tab . $tab . $tab;
|
||||
|
||||
for $type (@types) {
|
||||
|
||||
if ($type eq "TypedRegister") {
|
||||
push (@oplist, "mOp$op.first");
|
||||
# push (@oplist, "\"R\" << mOp$op.first << '=' << registers[mOp$op.first]");
|
||||
} elsif ($type eq "RegisterList") {
|
||||
push (@oplist, "ArgList(mOp$op, registers)");
|
||||
}
|
||||
|
||||
$op++;
|
||||
}
|
||||
|
||||
my $rv = join (" << \", \" << ", @oplist);
|
||||
if ($rv ne "") {
|
||||
$rv = $init_tab . $tab . $tab . "f << " . $rv . ";\n";
|
||||
}
|
||||
|
||||
return $rv;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,178 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the JavaScript 2 Prototype.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
#include "utilities.h"
|
||||
#include "vmtypes.h"
|
||||
|
||||
namespace JavaScript {
|
||||
namespace VM {
|
||||
|
||||
using namespace JSTypes;
|
||||
|
||||
#define OPCODE_NAMES
|
||||
#include "icode.h"
|
||||
|
||||
Formatter& operator<< (Formatter& f, Instruction& i)
|
||||
{
|
||||
return i.print(f);
|
||||
}
|
||||
|
||||
Formatter& operator<< (Formatter& f, RegisterList& rl)
|
||||
{
|
||||
TypedRegister* e = rl.end();
|
||||
|
||||
f << "(";
|
||||
for (RegisterList::iterator r = rl.begin(); r != e; r++) {
|
||||
f << "R" << r->first;
|
||||
if ((r + 1) != e)
|
||||
f << ", ";
|
||||
}
|
||||
f << ")";
|
||||
|
||||
return f;
|
||||
}
|
||||
|
||||
Formatter& operator<< (Formatter& f, const ArgList& al)
|
||||
{
|
||||
const RegisterList& rl = al.mList;
|
||||
const JSValues& registers = al.mRegisters;
|
||||
f << "(";
|
||||
RegisterList::const_iterator i = rl.begin(), e = rl.end();
|
||||
if (i != e) {
|
||||
TypedRegister r = *i++;
|
||||
f << "R" << r.first << '=' << registers[r.first];
|
||||
while (i != e) {
|
||||
r = *i++;
|
||||
f << ", R" << r.first << '=' << registers[r.first];
|
||||
}
|
||||
}
|
||||
f << ")";
|
||||
|
||||
return f;
|
||||
}
|
||||
|
||||
Formatter& operator<< (Formatter& f, TypedRegister& r)
|
||||
{
|
||||
if (r.first == NotARegister)
|
||||
f << "<NaR>";
|
||||
else
|
||||
f << "R" << r.first;
|
||||
return f;
|
||||
}
|
||||
|
||||
Formatter& operator<< (Formatter &f, InstructionStream &is)
|
||||
{
|
||||
|
||||
for (InstructionIterator i = is.begin();
|
||||
i != is.end(); i++) {
|
||||
/*
|
||||
bool isLabel = false;
|
||||
|
||||
for (LabelList::iterator k = labels.begin();
|
||||
k != labels.end(); k++)
|
||||
if ((ptrdiff_t)(*k)->mOffset == (i - is.begin())) {
|
||||
f << "#" << (uint32)(i - is.begin()) << "\t";
|
||||
isLabel = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!isLabel)
|
||||
f << "\t";
|
||||
|
||||
f << **i << "\n";
|
||||
*/
|
||||
|
||||
printFormat(stdOut, "%04u", (uint32)(i - is.begin()));
|
||||
f << ": " << **i << "\n";
|
||||
|
||||
}
|
||||
|
||||
return f;
|
||||
}
|
||||
|
||||
BinaryOperator::BinaryOp BinaryOperator::mapICodeOp(ICodeOp op) {
|
||||
// a table later... or maybe we need a grand opcode re-unification
|
||||
switch (op) {
|
||||
case ADD : return Add;
|
||||
case SUBTRACT : return Subtract;
|
||||
case MULTIPLY : return Multiply;
|
||||
case DIVIDE : return Divide;
|
||||
case REMAINDER : return Remainder;
|
||||
case SHIFTLEFT : return LeftShift;
|
||||
case SHIFTRIGHT : return RightShift;
|
||||
case USHIFTRIGHT: return LogicalRightShift;
|
||||
|
||||
case AND : return BitwiseAnd;
|
||||
case OR : return BitwiseOr;
|
||||
case XOR : return BitwiseXor;
|
||||
|
||||
case COMPARE_LT : return Less;
|
||||
case COMPARE_LE : return LessOrEqual;
|
||||
case COMPARE_EQ : return Equal;
|
||||
case STRICT_EQ : return Identical;
|
||||
default :
|
||||
NOT_REACHED("Unsupported binary op");
|
||||
return (BinaryOp)-1;
|
||||
}
|
||||
}
|
||||
|
||||
Formatter& operator<< (Formatter &f, BinaryOperator::BinaryOp &b)
|
||||
{
|
||||
switch (b) {
|
||||
case BinaryOperator::Add: return f << "Add";
|
||||
case BinaryOperator::Subtract: return f << "Subtract";
|
||||
case BinaryOperator::Multiply: return f << "Multiply";
|
||||
case BinaryOperator::Divide: return f << "Divide";
|
||||
case BinaryOperator::Remainder: return f << "Remainder";
|
||||
case BinaryOperator::LeftShift: return f << "LeftShift";
|
||||
case BinaryOperator::RightShift: return f << "RightShift";
|
||||
case BinaryOperator::LogicalRightShift: return f << "LogicalRightShift";
|
||||
|
||||
case BinaryOperator::BitwiseAnd: return f << "BitwiseAnd";
|
||||
case BinaryOperator::BitwiseOr: return f << "BitwiseOr";
|
||||
case BinaryOperator::BitwiseXor: return f << "BitwiseXor";
|
||||
|
||||
case BinaryOperator::Less: return f << "Less";
|
||||
case BinaryOperator::LessOrEqual: return f << "LessOrEqual";
|
||||
case BinaryOperator::Equal: return f << "Equal";
|
||||
case BinaryOperator::Identical: return f << "Identical";
|
||||
default :
|
||||
NOT_REACHED("inner peace, either");
|
||||
return f;
|
||||
}
|
||||
}
|
||||
|
||||
} /* namespace VM */
|
||||
} /* namespace JavaScript */
|
||||
|
||||
|
||||
@@ -1,304 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the JavaScript 2 Prototype.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
#ifndef vmtypes_h
|
||||
#define vmtypes_h
|
||||
|
||||
#include "numerics.h" /* needed for formatter << double */
|
||||
#include "jstypes.h"
|
||||
#include "jsclasses.h"
|
||||
#include "world.h"
|
||||
#include <vector>
|
||||
|
||||
/* forward declare classes from JavaScript::ICG */
|
||||
namespace JavaScript {
|
||||
namespace ICG {
|
||||
class ICodeModule;
|
||||
} /* namespace ICG */
|
||||
} /* namespace JavaScript */
|
||||
|
||||
namespace JavaScript {
|
||||
namespace VM {
|
||||
|
||||
using namespace JSTypes;
|
||||
using namespace JSClasses;
|
||||
|
||||
/********************************************************************/
|
||||
|
||||
typedef uint32 ICodeOp;
|
||||
extern char *opcodeNames[];
|
||||
|
||||
/* super-class for all instructions */
|
||||
class Instruction
|
||||
{
|
||||
public:
|
||||
Instruction(ICodeOp aOpcode) : mOpcode(aOpcode) {}
|
||||
|
||||
virtual Formatter& print(Formatter& f) = 0;
|
||||
virtual Formatter& printOperands(Formatter& f, const JSValues& /*registers*/) = 0;
|
||||
|
||||
ICodeOp op() { return mOpcode; }
|
||||
|
||||
virtual int32 count() { return 0; }
|
||||
|
||||
protected:
|
||||
ICodeOp mOpcode;
|
||||
|
||||
};
|
||||
|
||||
/********************************************************************/
|
||||
|
||||
enum { NotARegister = 0xFFFFFFFF };
|
||||
enum { NotALabel = 0xFFFFFFFF };
|
||||
enum { NotAnOffset = 0xFFFFFFFF };
|
||||
enum { NotABanana = 0xFFFFFFFF };
|
||||
|
||||
/********************************************************************/
|
||||
|
||||
typedef uint32 Register;
|
||||
typedef std::pair<Register, JSType*> TypedRegister;
|
||||
typedef std::vector<TypedRegister> RegisterList;
|
||||
typedef std::vector<Instruction *> InstructionStream;
|
||||
typedef InstructionStream::iterator InstructionIterator;
|
||||
typedef std::map<String, TypedRegister, std::less<String> > VariableMap;
|
||||
|
||||
|
||||
/**
|
||||
* Helper to print Call operands.
|
||||
*/
|
||||
struct ArgList {
|
||||
const RegisterList& mList;
|
||||
const JSValues& mRegisters;
|
||||
ArgList(const RegisterList& rl, const JSValues& registers)
|
||||
: mList(rl), mRegisters(registers) {}
|
||||
};
|
||||
|
||||
/********************************************************************/
|
||||
|
||||
Formatter& operator<< (Formatter& f, Instruction& i);
|
||||
Formatter& operator<< (Formatter& f, RegisterList& rl);
|
||||
Formatter& operator<< (Formatter& f, const ArgList& al);
|
||||
Formatter& operator<< (Formatter& f, InstructionStream& is);
|
||||
Formatter& operator<< (Formatter& f, TypedRegister& r);
|
||||
|
||||
/********************************************************************/
|
||||
|
||||
class Label {
|
||||
public:
|
||||
Label(InstructionStream* aBase) :
|
||||
mBase(aBase), mOffset(NotALabel) {}
|
||||
|
||||
InstructionStream *mBase;
|
||||
uint32 mOffset;
|
||||
};
|
||||
|
||||
typedef std::vector<Label *> LabelList;
|
||||
typedef LabelList::iterator LabelIterator;
|
||||
|
||||
/********************************************************************/
|
||||
|
||||
/* 1, 2 and 3 operand opcode templates */
|
||||
|
||||
template <typename Operand1>
|
||||
class Instruction_1 : public Instruction {
|
||||
public:
|
||||
Instruction_1(ICodeOp aOpcode, Operand1 aOp1) :
|
||||
Instruction(aOpcode), mOp1(aOp1) { }
|
||||
Operand1& o1() { return mOp1; }
|
||||
|
||||
virtual int32 count() { return 1; }
|
||||
|
||||
protected:
|
||||
Operand1 mOp1;
|
||||
};
|
||||
|
||||
template <typename Operand1, typename Operand2>
|
||||
class Instruction_2 : public Instruction {
|
||||
public:
|
||||
Instruction_2(ICodeOp aOpcode, Operand1 aOp1, Operand2 aOp2) :
|
||||
Instruction(aOpcode), mOp1(aOp1), mOp2(aOp2) {}
|
||||
Operand1& o1() { return mOp1; }
|
||||
Operand2& o2() { return mOp2; }
|
||||
|
||||
virtual int32 count() { return 2; }
|
||||
|
||||
protected:
|
||||
Operand1 mOp1;
|
||||
Operand2 mOp2;
|
||||
};
|
||||
|
||||
template <typename Operand1, typename Operand2, typename Operand3>
|
||||
class Instruction_3 : public Instruction {
|
||||
public:
|
||||
Instruction_3(ICodeOp aOpcode, Operand1 aOp1, Operand2 aOp2,
|
||||
Operand3 aOp3) :
|
||||
Instruction(aOpcode), mOp1(aOp1), mOp2(aOp2), mOp3(aOp3) { }
|
||||
Operand1& o1() { return mOp1; }
|
||||
Operand2& o2() { return mOp2; }
|
||||
Operand3& o3() { return mOp3; }
|
||||
|
||||
virtual int32 count() { return 3; }
|
||||
|
||||
protected:
|
||||
Operand1 mOp1;
|
||||
Operand2 mOp2;
|
||||
Operand3 mOp3;
|
||||
};
|
||||
|
||||
template <typename Operand1, typename Operand2, typename Operand3, typename Operand4>
|
||||
class Instruction_4 : public Instruction {
|
||||
public:
|
||||
Instruction_4(ICodeOp aOpcode, Operand1 aOp1, Operand2 aOp2,
|
||||
Operand3 aOp3, Operand4 aOp4) :
|
||||
Instruction(aOpcode), mOp1(aOp1), mOp2(aOp2), mOp3(aOp3), mOp4(aOp4) { }
|
||||
Operand1& o1() { return mOp1; }
|
||||
Operand2& o2() { return mOp2; }
|
||||
Operand3& o3() { return mOp3; }
|
||||
Operand4& o4() { return mOp4; }
|
||||
|
||||
virtual int32 count() { return 4; }
|
||||
|
||||
protected:
|
||||
Operand1 mOp1;
|
||||
Operand2 mOp2;
|
||||
Operand3 mOp3;
|
||||
Operand4 mOp4;
|
||||
};
|
||||
|
||||
/********************************************************************/
|
||||
|
||||
/* Instruction groups */
|
||||
|
||||
class Arithmetic : public Instruction_3<TypedRegister, TypedRegister, TypedRegister> {
|
||||
public:
|
||||
Arithmetic (ICodeOp aOpcode, TypedRegister aDest, TypedRegister aSrc1,
|
||||
TypedRegister aSrc2) :
|
||||
Instruction_3<TypedRegister, TypedRegister, TypedRegister>(aOpcode, aDest, aSrc1, aSrc2) {}
|
||||
|
||||
virtual Formatter& print(Formatter& f)
|
||||
{
|
||||
f << opcodeNames[mOpcode] << "\tR" << mOp1.first << ", R" << mOp2.first << ", R" << mOp3.first;
|
||||
return f;
|
||||
}
|
||||
|
||||
virtual Formatter& printOperands(Formatter& f, const JSValues& registers)
|
||||
{
|
||||
f << "R" << mOp1.first << '=' << registers[mOp1.first] << ", " << "R" << mOp2.first << '=' << registers[mOp2.first] << ", " << "R" << mOp3.first << '=' << registers[mOp3.first];
|
||||
return f;
|
||||
}
|
||||
};
|
||||
|
||||
class Unary : public Instruction_2<TypedRegister, TypedRegister> {
|
||||
public:
|
||||
Unary(ICodeOp aOpcode, TypedRegister aDest, TypedRegister aSrc) :
|
||||
Instruction_2<TypedRegister, TypedRegister>(aOpcode, aDest, aSrc) {}
|
||||
virtual Formatter& print (Formatter& f) {
|
||||
f << opcodeNames[mOpcode] << "\tR" << mOp1.first << ", R" << mOp2.first;
|
||||
return f;
|
||||
}
|
||||
|
||||
virtual Formatter& printOperands(Formatter& f, const JSValues& registers)
|
||||
{
|
||||
f << "R" << mOp1.first << '=' << registers[mOp1.first] << ", " << "R" << mOp2.first << '=' << registers[mOp2.first];
|
||||
return f;
|
||||
}
|
||||
};
|
||||
|
||||
class GenericBranch : public Instruction_2<Label*, TypedRegister> {
|
||||
public:
|
||||
GenericBranch (ICodeOp aOpcode, Label* aLabel,
|
||||
TypedRegister aR = TypedRegister(NotARegister, &Any_Type) ) :
|
||||
Instruction_2<Label*, TypedRegister>(aOpcode, aLabel, aR) {}
|
||||
virtual Formatter& print (Formatter& f) {
|
||||
f << opcodeNames[mOpcode] << "\tOffset " << mOp1->mOffset;
|
||||
if (mOp2.first == NotARegister) {
|
||||
f << ", R~";
|
||||
} else {
|
||||
f << ", R" << mOp2.first;
|
||||
}
|
||||
return f;
|
||||
}
|
||||
|
||||
virtual Formatter& printOperands(Formatter& f, const JSValues& registers)
|
||||
{
|
||||
if (mOp2.first != NotARegister)
|
||||
f << "R" << mOp2.first << '=' << registers[mOp2.first];
|
||||
return f;
|
||||
}
|
||||
|
||||
void resolveTo (uint32 aOffset) { mOp1->mOffset = aOffset; }
|
||||
uint32 getOffset() { return mOp1->mOffset; }
|
||||
void setTarget(Label *label) { mOp1 = label; }
|
||||
};
|
||||
|
||||
/********************************************************************/
|
||||
|
||||
class BinaryOperator {
|
||||
public:
|
||||
|
||||
// Wah, here's a third enumeration of opcodes - ExprNode, ICodeOp and now here, this can't be right??
|
||||
typedef enum {
|
||||
BinaryOperatorFirst,
|
||||
Add = BinaryOperatorFirst, Subtract, Multiply, Divide,
|
||||
Remainder, LeftShift, RightShift, LogicalRightShift,
|
||||
BitwiseOr, BitwiseXor, BitwiseAnd, Less, LessOrEqual,
|
||||
Equal, Identical, BinaryOperatorCount
|
||||
} BinaryOp;
|
||||
|
||||
BinaryOperator(const JSType *t1, const JSType *t2, JSBinaryOperator *function) :
|
||||
t1(t1), t2(t2), function(function) { }
|
||||
|
||||
BinaryOperator(const JSType *t1, const JSType *t2, JSFunction *function) :
|
||||
t1(t1), t2(t2), function(function) { }
|
||||
|
||||
static BinaryOp mapICodeOp(ICodeOp op);
|
||||
|
||||
const JSType *t1;
|
||||
const JSType *t2;
|
||||
JSFunction *function;
|
||||
|
||||
};
|
||||
|
||||
typedef std::vector<BinaryOperator *> BinaryOperatorList;
|
||||
|
||||
Formatter& operator<<(Formatter &f, BinaryOperator::BinaryOp &b);
|
||||
|
||||
/********************************************************************/
|
||||
|
||||
#include "icode.h"
|
||||
|
||||
} /* namespace VM */
|
||||
|
||||
} /* namespace JavaScript */
|
||||
|
||||
#endif /* vmtypes_h */
|
||||
@@ -1,5 +0,0 @@
|
||||
cd ..\..\..\..
|
||||
cvs co mozilla/gc/boehm
|
||||
cd mozilla\gc\boehm
|
||||
nmake -f NT_MAKEFILE gc.lib
|
||||
cd ..\..\js\js2\winbuild
|
||||
@@ -1,234 +0,0 @@
|
||||
# Microsoft Developer Studio Project File - Name="js2" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Console Application" 0x0103
|
||||
|
||||
CFG=js2 - Win32 Partial Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "js2.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "js2.mak" CFG="js2 - Win32 Partial Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "js2 - Win32 Release" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE "js2 - Win32 Debug" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE "js2 - Win32 Partial Debug" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "js2 - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Release"
|
||||
# PROP BASE Intermediate_Dir "Release"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Release"
|
||||
# PROP Intermediate_Dir "Release"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib gc.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\..\gc\boehm"
|
||||
# SUBTRACT LINK32 /pdb:none
|
||||
|
||||
!ELSEIF "$(CFG)" == "js2 - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "Debug"
|
||||
# PROP BASE Intermediate_Dir "Debug"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Debug"
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /W3 /Gm /GR /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "DEBUG" /FR /YX /FD /GZ /c
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG" /d "DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# SUBTRACT BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib gc.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\gc\boehm"
|
||||
|
||||
!ELSEIF "$(CFG)" == "js2 - Win32 Partial Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "js2___Win32_Partial_Debug"
|
||||
# PROP BASE Intermediate_Dir "js2___Win32_Partial_Debug"
|
||||
# PROP BASE Ignore_Export_Lib 0
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "js2___Win32_Partial_Debug"
|
||||
# PROP Intermediate_Dir "js2___Win32_Partial_Debug"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "DEBUG" /FR /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /GZ /c
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG" /d "DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG" /d "DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# SUBTRACT BASE BSC32 /nologo
|
||||
# SUBTRACT BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib gc.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\gc\boehm"
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib gc.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\gc\boehm"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "js2 - Win32 Release"
|
||||
# Name "js2 - Win32 Debug"
|
||||
# Name "js2 - Win32 Partial Debug"
|
||||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\debugger.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\hash.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\icodegenerator.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\interpreter.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\js2.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\jsmath.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\jstypes.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\numerics.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\parser.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\utilities.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\vmtypes.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\world.cpp
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\cpucfg.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\gc_allocator.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\hash.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\icode.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\icodegenerator.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\interpreter.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\jsclasses.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\jsmath.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\jstypes.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\numerics.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\parser.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\systemtypes.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\utilities.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\vmtypes.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\world.h
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Resource Files"
|
||||
|
||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||
# End Group
|
||||
# End Target
|
||||
# End Project
|
||||
@@ -1,29 +0,0 @@
|
||||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "js2"=.\js2.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<3>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
// -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
//
|
||||
// The contents of this file are subject to the Netscape Public
|
||||
// License Version 1.1 (the "License"); you may not use this file
|
||||
// except in compliance with the License. You may obtain a copy of
|
||||
// the License at http://www.mozilla.org/NPL/
|
||||
//
|
||||
// Software distributed under the License is distributed on an "AS
|
||||
// IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
||||
// implied. See the License for the specific language governing
|
||||
// rights and limitations under the License.
|
||||
//
|
||||
// The Original Code is the JavaScript 2 Prototype.
|
||||
//
|
||||
// The Initial Developer of the Original Code is Netscape
|
||||
// Communications Corporation. Portions created by Netscape are
|
||||
// Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
// Rights Reserved.
|
||||
|
||||
#include "world.h"
|
||||
namespace JS = JavaScript;
|
||||
|
||||
|
||||
// Return an existing StringAtom corresponding to the String s if there is
|
||||
// one; if not, create a new StringAtom with String s and return that StringAtom.
|
||||
JS::StringAtom &JS::StringAtomTable::operator[](const String &s)
|
||||
{
|
||||
HT::Reference r(ht, s);
|
||||
if (r)
|
||||
return *r;
|
||||
else
|
||||
return ht.insert(r, s);
|
||||
}
|
||||
|
||||
|
||||
JS::World::World()
|
||||
{
|
||||
Token::initKeywords(*this);
|
||||
}
|
||||
@@ -1,73 +0,0 @@
|
||||
// -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
//
|
||||
// The contents of this file are subject to the Netscape Public
|
||||
// License Version 1.1 (the "License"); you may not use this file
|
||||
// except in compliance with the License. You may obtain a copy of
|
||||
// the License at http://www.mozilla.org/NPL/
|
||||
//
|
||||
// Software distributed under the License is distributed on an "AS
|
||||
// IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
||||
// implied. See the License for the specific language governing
|
||||
// rights and limitations under the License.
|
||||
//
|
||||
// The Original Code is the JavaScript 2 Prototype.
|
||||
//
|
||||
// The Initial Developer of the Original Code is Netscape
|
||||
// Communications Corporation. Portions created by Netscape are
|
||||
// Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
// Rights Reserved.
|
||||
|
||||
#ifndef world_h
|
||||
#define world_h
|
||||
|
||||
#include "utilities.h"
|
||||
#include "hash.h"
|
||||
#include "parser.h"
|
||||
|
||||
namespace JavaScript {
|
||||
|
||||
//
|
||||
// String atom management
|
||||
//
|
||||
|
||||
// A StringAtom is a String for which the following guarantee applies:
|
||||
// StringAtoms A and B have the same character sequences if and only if A and B are the
|
||||
// same StringAtom.
|
||||
|
||||
class StringAtom: public String {
|
||||
public:
|
||||
Token::Kind tokenKind; // Token::Kind if this is a keyword; Token::identifier if not
|
||||
|
||||
explicit StringAtom(const String &s): String(s), tokenKind(Token::identifier) {}
|
||||
private:
|
||||
StringAtom(const StringAtom&); // No copy constructor
|
||||
void operator=(const StringAtom&); // No assignment operator
|
||||
};
|
||||
|
||||
inline bool operator==(const StringAtom &s1, const StringAtom &s2) {return &s1 == &s2;}
|
||||
inline bool operator!=(const StringAtom &s1, const StringAtom &s2) {return &s1 != &s2;}
|
||||
|
||||
|
||||
class StringAtomTable {
|
||||
typedef HashTable<StringAtom, const String&> HT;
|
||||
HT ht;
|
||||
|
||||
public:
|
||||
StringAtom &operator[](const String &s);
|
||||
|
||||
StringAtom &operator[](const char *s)
|
||||
{
|
||||
return operator[](widenCString(s));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class World {
|
||||
public:
|
||||
StringAtomTable identifiers;
|
||||
|
||||
World();
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
||||
452
mozilla/js/ref/ChangeLog
Normal file
452
mozilla/js/ref/ChangeLog
Normal file
@@ -0,0 +1,452 @@
|
||||
Tag JSREF_RELEASE_19980414 (4/14/98):
|
||||
|
||||
- RegExp unicode fix.
|
||||
|
||||
- Added new iterator-style JSObjectOps enumeration API for host objects.
|
||||
See jspubtd.h for details.
|
||||
|
||||
Tag JSREF_RELEASE_19980413 (4/13/98):
|
||||
|
||||
- Date fixes:
|
||||
- ECMAv1 fix: fixed function length for Date setters.
|
||||
- Bug workaround: avoid MSVC optimizer bug in Date.
|
||||
- Y2K fix: Use the verbose '%#c' date formatter for toLocaleString
|
||||
on windows, to get a 4 digit date.
|
||||
|
||||
- New thread safety fixes from bjorn:
|
||||
|
||||
- Added more asserts to catch cases where the thread
|
||||
identifier stored in the context is out of synch with the current
|
||||
thread. JS_ATOMIC_ADDREF now calls a function instead of a
|
||||
macro, so that when compare-and-swap is implemented using busy-wait
|
||||
(e.g. SPARC v8), we avoid being confused by the busy value. For the same
|
||||
reason, we now call AtomicRead at certain places in jslock.c. Finally, the
|
||||
environment variable JS_NO_THIN_LOCKS, when set, effectively turns off
|
||||
the thin locks so that all locking is done using NSPR only.
|
||||
|
||||
- ECMAv1 numeric fixes: print preceding 0 when formatting 0.4, ignore supplied
|
||||
radix to Number.prototype.toString when printing non-finite numbers.
|
||||
|
||||
Tag JSREF_RELEASE_19980403 (4/3/98):
|
||||
|
||||
- API renaming: JS_NewRuntime for JS_Init, JS_DestroyRuntime for JS_Finish
|
||||
(the old names are maintained for backward binary compatibility; the new
|
||||
names are macros).
|
||||
|
||||
- Improved JS_THREADSAFE locking, with compare-and-swap based optimization of
|
||||
the uncontested lock and unlock cases to avoid DLL-crossing and worse native
|
||||
OS locking overhead.
|
||||
|
||||
The Request/GC interlock enforced by JS_BeginRequest, JS_EndRequest, JS_GC,
|
||||
and JS_MaybeGC allows requests on the same cx to nest (JS_BeginRequest may
|
||||
be called more than once before JS_EndRequest, so long as the number of End
|
||||
calls matches the number of Begin calls).
|
||||
|
||||
Thread-safety for prarena.c and prdtoa.c, based on jslock.h/JS_THREADSAFE.
|
||||
|
||||
- Experimental JS exception implementation, subject to change. Any value may
|
||||
be thrown. The catch expression must be of the form (v) or (var v). Catch
|
||||
code must re-throw as there is no way yet for the compiler to decide that no
|
||||
catch clause matched (and more than one catch clause makes no sense, yet --
|
||||
no finally yet, either).
|
||||
|
||||
- JS_ConvertArguments API addition, for converting an argc/argv pair according
|
||||
to a simplified scanf-like format string.
|
||||
|
||||
- JS_GetPropertyAttributes and JS_SetPropertyAttributes API additions, which
|
||||
take C-string property names (Unicode string and indexed elements TBD).
|
||||
|
||||
- JS_CloneFunctionObject, for server-like environments where code (functions)
|
||||
should be shared in a prototype object, but data (global variables) must be
|
||||
per request in a set of objects, one per concurrent request. You load the
|
||||
functions in the prototype, then "fault them in" on demand via the request
|
||||
object's resolve hook, using JS_CloneFunctionObject to make a lightweight
|
||||
copy that has the right scope (__parent__) link.
|
||||
|
||||
- Whacked js.c (more whacking needed) so it uses fewer secret js_* calls and
|
||||
more JS PUBLIC/FRIEND API entry points.
|
||||
|
||||
- Simplified Windows MSDEV build regime to use js.mak/mdp only, which builds
|
||||
the DLL as a sub-project, then compiles js.c and links the JS shell.
|
||||
|
||||
- Fix a lying comment about JS_AddRoot in README (which is being turned into a
|
||||
real "JS API tutorial" document, due soon).
|
||||
|
||||
- Better error reporting for an operand that does not convert to function, and
|
||||
spiffed up the decompiler (jsopcode.c) to remove hardwired opcode lengths.
|
||||
|
||||
- Atom indexing does not abuse the atom's next link and a flags bit, which had
|
||||
been done in haste long ago (and not fixed till now), but which required that
|
||||
compilation be single-threaded throughout a runtime.
|
||||
|
||||
- ECMAv2 change: undefined is a top-level property with undefined value (it may
|
||||
be overwritten or deleted by a script).
|
||||
|
||||
- ECMAv1 fix: arguments is implemented as a separate object from Call, but with
|
||||
Netscape extensions (callee, caller).
|
||||
|
||||
- ECMAv1 fix: array length and indexes are uint32.
|
||||
|
||||
- ECMAv1 fixes enabled by major overhaul of the compiler to generate a tree of
|
||||
parse-node structures and generate code from it. The bugs had to do with the
|
||||
order of evaluation and conversion in for/in loop and assignment expressions.
|
||||
This change also moved the "quickening" for name-to-arg/var-slot bytecodes
|
||||
from the interpreter to the compiler.
|
||||
|
||||
- Proposed ECMAv2 toSource method, which produces compilable object and array
|
||||
initializers and new expressions to reconstruct a given graph.
|
||||
|
||||
- Proposed ECMAv2 instanceof operator, based on hasInstance JSObjectOp and
|
||||
(for maximum code-sharing among native object classes, with one exception)
|
||||
JSClass methods. There is also js_IsDelegate, for checking whether a given
|
||||
object is a prototype of another.
|
||||
|
||||
- To-be-proposed ECMAv2 in operator, inspired by for/in loop syntax: ('p' in o)
|
||||
for o = {p:1} is true; (1 in o) for o[1] defined (even with value undefined)
|
||||
is true. Note distinction between typeof o.p == "undefined" and ('p' in o).
|
||||
|
||||
- XDR (eXternal Data Representation) code to support Script.prototype.freeze
|
||||
and Script.thaw/Script.prototype.thaw. You can store a persistent, portable
|
||||
encoding of a script (including its top-level functions and all their kids)
|
||||
and load it later.
|
||||
|
||||
Exception "try-notes" are not currently XDR'd; this will be fixed next time.
|
||||
|
||||
- Recent GC bugs mentioned in snews://secnews.netscape.com/netscape.dev.jsref
|
||||
have been fixed. The patches were posted already; this tarball rolls them
|
||||
up along with other fixes and improvements. We've had help from Netscape's
|
||||
Application Products Division in stress-testing this release; we are pretty
|
||||
confident that JS_THREADSAFE GC and request execution work well.
|
||||
|
||||
One new fix: finalizers are run without the GC lock held, to allow them to
|
||||
call JS_RemoveRoot and otherwise to avoid AB-BA deadlocks.
|
||||
|
||||
- Call and construct are now optional methods in JSObjectOps and JSClass. The
|
||||
hack of converting a regexp to a function is no longer necessary, and script
|
||||
callability (shorthand for script.exec) uses the JSClass call hook likewise.
|
||||
|
||||
- Fixed standard class bootstrapping bug that left an extra Object instance
|
||||
in the middle of the prototype chain for Date, RegExp, etc. (all but Object
|
||||
and Function) instances.
|
||||
|
||||
- String.prototype.split ECMAv1 conformance restoration (split-by-empty-string
|
||||
was stupidly broken last time).
|
||||
|
||||
Tag JSREF_RELEASE_19980219 (2/16/98):
|
||||
|
||||
- Fixed very recent i++ (for undefined i) crash-bug (also prior, longstanding
|
||||
bug where i++ for undefined i resulted in NaN).
|
||||
|
||||
- ECMA conformance for [[DefaultValue]] (8.6.2.6), ToBoolean (9.2), and null
|
||||
(default) this-parameter handling (10.2.3).
|
||||
|
||||
- New bytecodes paving the way for ECMA-conformant for/in loops and unqualified
|
||||
name assignment.
|
||||
|
||||
- JS1.2 String.prototype.replace did not emulate Perl4's expansion of $` to be
|
||||
the global left context (not from last local match). Essentially the same
|
||||
bug bit replace for the empty-string global match case, which "bumps along"
|
||||
by one character, but failed to include that character in local left context
|
||||
(so "abc".replace(/ */g, 'X') produced "XXXX" instead of "XaXbXcX").
|
||||
|
||||
- Fix recent regression that clamped String.prototype.split's limit argument at
|
||||
the subject string's length.
|
||||
|
||||
- Fixed type mismatch problems in #if !JS_HAS_REGEXPS code.
|
||||
|
||||
Tag JSREF_RELEASE_19980216 (2/16/98):
|
||||
|
||||
- Fixed stuck GC lock by adding JS_UNLOCK_GC at the bottom of js_GC.
|
||||
|
||||
Tag JSREF_RELEASE_19980213 (2/13/98):
|
||||
|
||||
- Add JS_ShutDown API, which must be called after all JSRuntimes have been
|
||||
destroyed by JS_Finish calls, and from a single thread, when shutting down
|
||||
or restarting the program in which JSRef is embedded. This is needed to
|
||||
avoid leaking the deflated_string_cache and (JS_THREADSAFE only) lock.
|
||||
|
||||
Tag JSREF_RELEASE_19980212 (2/12/98):
|
||||
|
||||
- Finer-grained locking. Instead of one big, reentrant lock around the entire
|
||||
runtime, there are distinct locks:
|
||||
- The non-reentrant runtime lock, a binary semaphore to protect the runtime's
|
||||
contextList and other members.
|
||||
- An atom state lock used only in jsatom.c for a thread-safe internal atom
|
||||
table API. This lock is never held while calling out from jsatom.c to
|
||||
other modules that may acquire locks, and no caller into jsatom.c's lock-
|
||||
acquiring entry points does so while holding a lock of its own (the GC
|
||||
calls non-locking entry points only).
|
||||
- A lock and pair of condition variables for interlocking GC execution with
|
||||
script execution. The GC may run only when no script requests are running,
|
||||
or when at most one is running and it has invoked the GC from its branch
|
||||
callback. The new JS_SetGCCallback API may be used to supply a function to
|
||||
be called at the beginning and end of GC -- if called at the beginning, a
|
||||
false return value will cancel the GC run.
|
||||
- A reentrant lock per native object map (scope) to protect the JSScope and
|
||||
its parts (JSProperty, JSSymbol, and PRHashTable structures) as well as the
|
||||
slots vectors of all instances sharing the scope (the prototype object and
|
||||
any unmutated clones of it).
|
||||
|
||||
The model jslock.c and jslock.h provided include four new header files that
|
||||
are not yet supplied with JSRef:
|
||||
- pratomic.h for PR_COMPARE_AND_SWAP_WORDS and PR_COMPARE_AND_SWAP_INT32
|
||||
macros that take an address, an old value, and a new value, and return true
|
||||
if the old value is at the address, in which case the new value is atomicly
|
||||
stored there; and return false without changing memory otherwise.
|
||||
- prcvar.h for the PRCondVar condition variable type and its operations (New,
|
||||
Destroy, Wait, Notify, and NotifyAll).
|
||||
- prlock.h for the PRLock binary semaphore type and its operations (New,
|
||||
Destroy, Lock, and Unlock).
|
||||
|
||||
More lock overhead and lock-free synchronization optimizations are coming in
|
||||
a future JSRef release. In anticipation of these changes, the JS_THREADSAFE
|
||||
version of JS_GetClass now requires an initial JSContext *cx argument along
|
||||
with JSObject *obj.
|
||||
|
||||
- New String.prototype.replace feature: a function expression may be passed
|
||||
as the second argument, in which case it will be invoked with the match and
|
||||
parenthesized submatch strings as arguments, followed by input and index
|
||||
(these are come from the extended array returned by RegExp.prototype.exec and
|
||||
String.prototype.match).
|
||||
|
||||
This "lambda replacement" approximates Perl's s///e flag; the idea came from
|
||||
Mike Shaver (shaver@netscape.com). Here's a example function that replaces
|
||||
any number with an F after it (for Fahrenheit) with its Celsius conversion:
|
||||
|
||||
// f2c("32F, 212F, or 0F") => "0C, 100C, or -17.77777777777778C"
|
||||
function f2c(x) {
|
||||
var s = String(x)
|
||||
return s.replace(/(\d+(\.\d*)?)F\b/g,
|
||||
function ($0,$1,$2) { return (($1-32) * 5/9) + "C" })
|
||||
}
|
||||
|
||||
- First-character discrimination optimization for regular expressions, plus a
|
||||
fix to anchor-search for \b and \B.
|
||||
|
||||
- A first-class Script object to decompose eval into its compile and exec parts
|
||||
(so you can compile outside a long loop, then exec in the loop body to avoid
|
||||
recompiling invariant source). See jsscript.c.
|
||||
|
||||
- More ECMA fixes:
|
||||
- bitwise logical and shift operators use the correct ECMA type conversions,
|
||||
intermediate types, and boundary behavior.
|
||||
- Array.prototype.push emulates Perl5 for JS versions other than 1.2; there
|
||||
it emulated Perl4, except when no arguments were passed (it would return
|
||||
the array object bound to this in that case; fixed to return undefined).
|
||||
- All generic Array methods now update a length property, in case no such
|
||||
property existed in the object that delegates to Array.prototype, or that
|
||||
refers to the particular method.
|
||||
- Except for JS1.2, Array.prototype.splice always returns an array, even when
|
||||
given no arguments or a zero-length slice. JS1.2 compatibility continues.
|
||||
- NaN Date fixes.
|
||||
- JSFunctionSpec's nargs member now species the "best arity" of the function,
|
||||
which ECMA specifies as the value of the function's length property. So to
|
||||
allocate local GC roots, use the new extra member of JSFunctionSpec and let
|
||||
nargs count only the minimum or optimum number of desired arguments.
|
||||
- Relational and equality operator fixes too gnarly and subtle to describe
|
||||
here, affecting mainly the hint argument (or lack of it) to valueOf.
|
||||
- A new JS_IsConstructing API and underlying support, so ECMA [[Call]] and
|
||||
[[Construct]] can be distinguished.
|
||||
- A JS_InitClass extension to tolerate NULL for the constructor native C
|
||||
function argument -- this causes a class like Math to be created, where
|
||||
the class object is not callable or constructable.
|
||||
- Fixes to handle non-finite indexes in several string and array methods.
|
||||
|
||||
- A high-level object operation dispatch table has been added. See JSObjectOps
|
||||
in jsapi.h, and the new flags and function pointers in JSClass. To provide a
|
||||
table of object operations, your class should set the JSCLASS_HAS_OBJECTOPS
|
||||
flag and implement the getObjectOps class method, returning the address of a
|
||||
static or otherwise appropriate-lifetime JSObjectOps structure. The methods
|
||||
in this struct will be specified in a forthcoming version of the JS API doc.
|
||||
|
||||
The JSCLASS_NEW_ENUMERATE flag can be used without adding getObjectOps to
|
||||
your class, to say that its enumerate method returns a JSIdArray containing
|
||||
all lazy and eager property ids for an object, instead of having to define
|
||||
all lazily-bound properties in the object, to minimize locking and reduce
|
||||
the space cost of old-style enumerate.
|
||||
|
||||
- Atoms are now garbage-collected. To clarify the fact that symbol table ids
|
||||
are either tagged jsval-like integers, or else JSAtom pointers, a new typedef
|
||||
called jsid (equivalent to jsval in C) has been introduced.
|
||||
|
||||
- Major changes to remove JSProperty's object member, in order to optimize for
|
||||
space. These mostly entail an extra &obj2 or &pobj result parameter being
|
||||
passed to js_FindProperty, js_LookupProperty, etc., to capture the prototype
|
||||
or original object in which the property was found.
|
||||
|
||||
- Updated Windows MSDEV makefiles to support MSDEV5.0 as well as 4.2:
|
||||
- js32.mak, an NMAKE makefile, builds js32.dll
|
||||
- jsshell.mak, an NMAKE makefile, now recursively invokes js32.mak to build
|
||||
js32.dll
|
||||
- jsshelld.mak and jsshelld.mdp, collectively a 4.2 IDE project, build
|
||||
jsshell.exe and have a subproject that builds js32.dll. These two project
|
||||
files are not derived from the other .mak files, nor are the other .mak
|
||||
files derived from them.
|
||||
|
||||
- JS_PUBLIC_API etc. macros in jspubtd.h, used by jsapi.h and a few other .h
|
||||
files, to optimize linkage within the Windows DLL.
|
||||
|
||||
Tag JSREF_RELEASE_19971128 (11/28/97):
|
||||
|
||||
- Major Unicode changes. JSString has a jschar *chars member now, not
|
||||
char *bytes; it points to a counted array of uint16 (jschar) elements.
|
||||
The scanner handles \uXXXX escapes; so does the regular expression parser.
|
||||
|
||||
JS_GetStringBytes(str) now returns the ISO-Latin-1 counterpart of str's
|
||||
Unicode sequence by decimating into separate memory whose lifetime matches
|
||||
that of str->chars. The API entry points taking char *name or char *base
|
||||
arguments now have UC counterparts (except for the JS_*Property entries)
|
||||
that take jschar *name, size_t length or similar argument-pairs. There is
|
||||
a new JS_ValueToUint16 API entry for converting from a jsval to a Unicode
|
||||
code point.
|
||||
|
||||
- The beginnings of JavaScript 1.3 version support, including === and !== for
|
||||
equality by type and value identity, and sharp variables (see below).
|
||||
|
||||
- Linux support from Mike Shaver (shaver@ingenia.ca, shaver@netscape.com) in
|
||||
config/Linux_All.mk. OS/2 ifdefs from IBM (initials DSR?), via Dan Libby
|
||||
(danda@netscape.com).
|
||||
|
||||
- A new gc command in the js shell for testing, useful in conjunction with
|
||||
the GC_MARK_DEBUG ifdef'd code in jsgc.c and js.c to plug leaks and find
|
||||
stuck references. Use the new API entry point JS_AddNamedRoot in preference
|
||||
to JS_AddRoot, which still exists but provides no debugging name for the GC
|
||||
thing graph root that it establishes. See also JS_DumpNamedRoots.
|
||||
|
||||
- JSCLASS_NEW_RESOLVE flag and JSNewResolveOp function pointer typedef, for
|
||||
more efficient unbound name resolution.
|
||||
|
||||
- Sharp variables (based on Common Lisp's dispatching macros of the same form)
|
||||
for expressing cycles and join-points in object graphs created by object and
|
||||
array initializers. For example,
|
||||
|
||||
#1={p:#2={q:42}, r:{cycle:#1#, joinPoint:#2#}}
|
||||
|
||||
creates an object, call it o, where o.p and o.r.joinPoint both reach the same
|
||||
object, which has a property named q with value 42; and o.r.cycle is o.
|
||||
|
||||
In a future release, the final JS1.3 version will return object and array
|
||||
initializer strings from {Object,Array}.prototype.toSource methods, rather
|
||||
than toString, for ECMA and backward compatibility.
|
||||
|
||||
- More ECMA conformance fixes, apart from Unicode:
|
||||
- New ECMA-conformant jsdate.c by Mike McCabe (mccabe@netscape.com).
|
||||
- Improved equality and relational operator implementations.
|
||||
- Correct division operator result sign.
|
||||
- The unary-plus operator.
|
||||
- NaN and Infinity top-level properties.
|
||||
- Setting a read-only property fails silently, rather than stopping the
|
||||
script with an error report.
|
||||
- Deleting a permanent property fails with a false return from the delete
|
||||
operator. If the property is not in the object addressed in the delete
|
||||
expression, or it is successfully deleted, the expression results in true.
|
||||
|
||||
- The beginnings of finer-grained, non-nesting/low-level locking in jslock.h,
|
||||
used in jsstr.c for the deflated_string_cache_lock. For this version, you
|
||||
need to provide a PRLock typedef and PR_NewLock, PR_DestroyLock, PR_Lock,
|
||||
and PR_Unlock functions that implement a binary semaphore.
|
||||
|
||||
- Performance improvements based on aggressive, coherent use of the property
|
||||
cache (part of the JSRuntime structure). This required a fix to restore a
|
||||
watchpoint associated with a deleted property when a new property with the
|
||||
same identifier is created in the same object.
|
||||
|
||||
- Regular expression bugfixes and Unicode extensions in jsregexp.c and jsstr.c.
|
||||
- Fixed Perl bug where \xZ or similar was translated to "\0Z".
|
||||
- Fixed another Perl bug where [x-\d] matched {'x', '-', '0', ... '9'} but
|
||||
[\d-x] matched only the digits. The second is now equivalent to the first.
|
||||
- Fixed JS bug where only $1 through $9 could be used in the replacement
|
||||
string passed to String.prototype.replace. Also allow literal $ in the
|
||||
replacement string if it is preceded by \ (as a JS literal: "\\$").
|
||||
- Fixed non-JS1.2 versions to return left context from start of global match
|
||||
instead of from end of last local match (Perl4 had a similar bug which 1.2
|
||||
emulated too much). This alters "$`" expansion in replacement strings.
|
||||
|
||||
Tag JSREF_1_14_RELEASE (around 7/22/97):
|
||||
|
||||
- JSTaskState and related API entry point names have been renamed to use the
|
||||
trendier "Runtime" rather than "TaskState", ditto rt or runtime for task.
|
||||
|
||||
- JS_GetScriptPrincipals is no longer in jsapi.h, it moved to jsdbgapi.h and
|
||||
has a new interface that takes the JSScript * being queried. It therefore
|
||||
requires JS_FrameIterator and JS_GetFrameScript.
|
||||
|
||||
- JS_LockGCThing/JS_UnlockGCThing and their macro wrappers JSVAL_LOCK/UNLOCK
|
||||
are deprecated as of now. Use JS_AddRoot to register a pointer to the thing
|
||||
you would lock, and clear the pointer and/or JS_RemoveRoot its address later
|
||||
to unlock the thing. I would like to remove GC thing-locking in a future
|
||||
release; it precludes too many alternative GC implementations.
|
||||
|
||||
- ECMA conformant Date API, including get/setFullYear and the UTC variants
|
||||
to all the get/set methods.
|
||||
|
||||
- ECMA conformant Number.MIN_VALUE, which is the smallest denorm now, not
|
||||
the smallest normal as in all past JS versions.
|
||||
|
||||
- ECMA comformant isFinite() function.
|
||||
|
||||
- ECMA signed 0 and NaN number to string conversions.
|
||||
|
||||
- Watcom (__WATCOMC__) support for PC builds.
|
||||
|
||||
Quick update (4/27/97):
|
||||
- Prototypes are no longer constructed in JS_InitClass. If you want a class
|
||||
prototype to be constructed by the native 'constructor' function passed to
|
||||
JS_InitClass, you can save JS_InitClass's return value and do it yourself:
|
||||
|
||||
proto = JS_InitClass(...);
|
||||
ok = JS_CallFunctionName(cx, proto, "constructor", argc, argc, &rval);
|
||||
|
||||
- Object, array, and function literals are supported on input for JS_VERSION
|
||||
1.2 at compile-time. Only for JS_SetVersion(cx, JSVERSION_1_2) at runtime:
|
||||
object.toString() returns an object literal, likewise for array.toString,
|
||||
and function.toString returns an anonymous function literall (rather than
|
||||
the definition of a function named "anonymous") for functions created using
|
||||
new Function(...).
|
||||
|
||||
- Final RegExp API: regexp.exec and string.match always return null on mismatch
|
||||
(not -1), and always return a match array on match (whether parens matched or
|
||||
not). The match array's 0'th element is the matching string, and any paren
|
||||
submatches are in elements 1..N. The index and input properties can be used
|
||||
to find left and right context without resort to the RegExp.leftContext and
|
||||
RegExp.rightContext statics:
|
||||
|
||||
leftContext = match.input.substring(0, match.input.index)
|
||||
rightContext = match.input.substring(match.input.index + match[0].length)
|
||||
|
||||
- A JS_MaybeGC entry point in the API, safe to use from branch callbacks (well
|
||||
tested) and arbitrary preemption points (not so well tested) when garbage may
|
||||
be piling up, but a forced GC (JS_GC) is not desirable.
|
||||
|
||||
- Various bugfixes and improvements.
|
||||
|
||||
Newer news (3/18/97):
|
||||
- Regular expressions a la Perl are supported.
|
||||
- Perl array methods push, pop, shift, unshift, and splice are supported.
|
||||
- Perl substr, with its righteous interpretation of negative offset, is also
|
||||
now supported.
|
||||
- Lexical closures a la Scheme are supported. See ycomb.js.
|
||||
- Property caching and other performance improvements have been added.
|
||||
- Mac CodeWarrior JSRef.prj and MacPrefix.h files are now bundled.
|
||||
- Windows MSDEV4.2 .mak and .mdp files bundled.
|
||||
- The 32-bit Windows version of prcpucfg.h is shipped; on Unix platforms, you
|
||||
should remove this file or set it aside and let gmake generate the right one
|
||||
for your host architecture.
|
||||
- Classes whose objects have private data (JS_SetPrivate/JS_GetPrivate) must
|
||||
flag that fact with the JSCLASS_HAS_PRIVATE flag in their JSClass structs.
|
||||
- There are also two new property ops in JSClass, addProperty and delProperty.
|
||||
|
||||
News flashes (12/31/96):
|
||||
|
||||
- Define JS_THREADSAFE and write code in jslock.c for multi-threaded JS.
|
||||
- NOTE: JS_EvaluateScript and JS_ExecuteScript no longer return a JSVAL_LOCKed
|
||||
result in *rval -- this was never safe in a multithreaded environment, when
|
||||
*rval referred to an object tree of depth > 1, because a preempting GC run
|
||||
could reclaim the unrooted, descendent objects. Instead, callers of these
|
||||
API entry points must use JS_AddRoot and JS_RemoveRoot to maintain the rval
|
||||
pointer argument in the GC's root set. See JS_AddRoot comments below.
|
||||
- Labeled statements and break and continue to label a la Java are supported.
|
||||
- The switch statement is now supported. You can switch on any primitive type
|
||||
value (number, string, boolean).
|
||||
- Numerous performance enhancements, notably the quick ops at the bottom of
|
||||
jsopcode.def, have been made.
|
||||
BIN
mozilla/js/ref/JSRef.prj
Normal file
BIN
mozilla/js/ref/JSRef.prj
Normal file
Binary file not shown.
397
mozilla/js/ref/JSRef.prj.hqx
Normal file
397
mozilla/js/ref/JSRef.prj.hqx
Normal file
@@ -0,0 +1,397 @@
|
||||
(This file must be converted with BinHex 4.0)
|
||||
:#8T68Q9Q,R"bDJ"069"53eG*43#3"$b`!!!l48dqBfp[E!#3!`%!N!-F!!!m4!!
|
||||
!2'!!N!03!*!$"!#3!fJ!!J!`!!)!+!j"6P0*)%aTBR*KFQPPFcTSrrG!!!8!N!F
|
||||
'!*!+!J)!-!#3!bJ06@&M)%aTBR*KFQPPF`"SD2rh3!!'!*!("`#3#`)!N!8S$8e
|
||||
KBb"-D@*bBA*TCA-!D'Mrpd!!"J#3"`F!N!3XV!!!$FN!N!FS$8eKBb"-D@*bBA*
|
||||
TCA-!D'Mrpd!!"J#3"`F!N"%S$8eKBb"-D@*bBA*TCA-!D'Mrpd!!"J#3"`F!N!i
|
||||
#23)rIrm!k`!$!!!NX!!P!%J$j`!"!!%!N!J#!3#3""""6P0*)%-V+bj38%-Z6'P
|
||||
L!*!B!3#3"J'H!D!!N!-X!!%!N!F"3J%!N!3(DR0KF'NZB`#3)3F!N!G!Vb#b"`!
|
||||
"!#@[),)(!!%!,+mJXJF!!3!eVb#b"`!"!#L[),)(!!%!+DmJXJF!!3!RVb#b"`!
|
||||
"!#D[),)'!!%!-+p+,rN!!3!bVc#$h!!"!$1[3"rA!!%!0kmS[-3!!3!jVd!Ie`!
|
||||
"!$L[0VlQ!!%!3DmS[-X!!3"#Vc#c(!!"!%@[-J9C!!%!2+m`Jq!!!3!pVdS[q`!
|
||||
"!%D[3"rC!!%!4kmS[0d!!3")Vd!IfJ!"!%Q[1G9+!!%!4+p-rSS!!3"$Vd5Pi!!
|
||||
"!%U[+,cT!!%!0Up8QVX!!3!aVc#$i`!"!$k[9*Um!!%!5kp%TH)!!3"-Vc#$j!!
|
||||
"!%f[4+AM!!%!2kp+,rm!!3"IVdd&eJ!"!#f[-)2Q!!%!,UmS[33!!3![VbLp"3!
|
||||
"!#U[+,d'!!%!0+mS[3d!!3!kVbLp%3!"!'#[+,d6!!%!1kmS[43!!3!VVbLp(J!
|
||||
"!9i"B!#3!b3!!3#3"`&#!3#3"!PUFf&bFQ&j,Q-!N"m)!*!(3+mJXJF!!3!PVb#
|
||||
b"`!"!#b[),)(!!%!0DmJXJF!!3!SVb#b"`!"!#Q[),)(!!%!*kmJXJF!!3!QVb#
|
||||
b"J!"!$#[5Lrj!!%!-Um`Jp`!!3!cVd!Ie`!"!$Q[3"rA!!%!1+mf[ZB!!3"&Vc)
|
||||
&@3!"!$b[-)2J!!%!2Dp+,rX!!3"'Vd!If3!"!%L[3"rD!!%!5Dmje8S!!3!fVe5
|
||||
DZ`!"!$'[-)2M!!%!2Up8QV`!!3"-Vc#$j!!"!$q[5Lrr!!%!Akp0"GB!!3!YVc#
|
||||
$jJ!"!#k[+,d%!!%!,kmS[38!!3!UVbLp"J!"!$5[+,d0!!%!1UmS[4%!!3"JVbL
|
||||
p%`!"!$Z[+,d8!!%!6UmS[4J!!3!VVbLp(J!"!6B"1!#3!am!!3#3"`%b!3#3"!K
|
||||
UFf&dEfdZB`#3)!N!N!G!Vb#b"`!"!#b[),)(!!%!0DmJXJF!!3!SVb#b"`!"!#Q
|
||||
[),)(!!%!*kmJXJF!!3!`VdS[q3!"!$1[3"rA!!%!1Dp!(pF!!3!iVcDqjJ!"!$b
|
||||
[-)2J!!%!2Dp+,rX!!3"'Vd!If3!"!%L[3"rD!!%!4+p-rSS!!3"$Vd5Pi!!"!$D
|
||||
[9*Ul!!%!-Dm`Jq-!!3!qVe5D[!!"!$q[5Lrr!!%!Akp0"GB!!3!YVc#$jJ!"!#k
|
||||
[+,d%!!%!,kmS[38!!3!UVbLp"J!"!$5[+,d0!!%!1UmS[4%!!3"JVbLp%`!"!$Z
|
||||
[+,d8!!%!+kmS[4i!!3%Q!5J!N!-G!!%!N!F"3J%!N!3)DR0LEfpX,Q-!N#!+!*!
|
||||
(3+mJXJF!!3!XVb#b"`!"!$@[),)(!!%!++mJXJF!!3!TVb#b"`!"!#H[),)(!!%
|
||||
!-+p+,rN!!3!cVd!Ie`!"!$H[+,c%!!%!1Dp!(pF!!3!mVc#$i!!"!$f[5Lrl!!%
|
||||
!4Up!(pN!!3")Vd!IfJ!"!%Q[1G9+!!%!0Up8QVX!!3!aVc#$i`!"!$k[9*Um!!%
|
||||
!2kp+,rm!!3"IVdd&eJ!"!#f[-)2Q!!%!,kmS[38!!3!UVbLp"J!"!$5[+,d0!!%
|
||||
!1UmS[4%!!3"JVbLp%`!"!$Z[+,d8!!%!+kmS[4i!!3&1!9!!N!-L!!%!N!F"3J%
|
||||
!N!3*DR0MER4iG#jM!*!I#`#3"d#[),)(!!%!*DmJXJF!!3!XVb#b"`!"!$@[),)
|
||||
(!!%!++mJXJF!!3!TVb#b"`!"!#H[),)(!!%!*UmJXJB!!3!`VdS[q3!"!$1[3"r
|
||||
A!!%!1Dp!(pF!!3!mVc#$i!!"!$f[5Lrl!!%!5Dmje8S!!3"%VdcqLJ!"!%1[4+A
|
||||
J!!%!0Up8QVX!!3!aVc#$i`!"!$k[9*Um!!%!5kp%TH)!!3"0Vd5Pi`!"!$q[5Lr
|
||||
r!!%!Akp0"GB!!3!YVc#$jJ!"!#k[+,d%!!%!,kmS[38!!3!UVbLp"J!"!$5[+,d
|
||||
0!!%!1UmS[4%!!3"JVbLp%`!"!$Z[+,d8!!%!6UmS[4J!!3!VVbLp(J!"!8B"5!#
|
||||
3!b%!!3#3"`%b!3#3"!KUFf4KG'8ZB`#3)!`!N!G!Vb#b"`!"!#@[),)(!!%!,+m
|
||||
JXJF!!3!eVb#b"`!"!#L[),)(!!%!+DmJXJF!!3"3Vb#b"`!"!#H[),)(!!%!*Um
|
||||
JXJB!!3!`VdS[q3!"!$1[3"rA!!%!1Dp!(pF!!3""VbLmb`!"!$b[-)2J!!%!2Dp
|
||||
+,rX!!3")Vd!IfJ!"!%Q[1G9+!!%!0Up8QVX!!3!aVc#$i`!"!$k[9*Um!!%!2kp
|
||||
+,rm!!3"IVdd&eJ!"!#f[-)2Q!!%!,kmS[38!!3!UVbLp"J!"!$5[+,d0!!%!1Um
|
||||
S[4%!!3"JVbLp%`!"!$Z[+,d8!!%!6UmS[4J!!3"2Vdd&6`!"!#Z[+,dH!!%"KJ'
|
||||
)!*!$+3!"!*!(!6)"!*!%"'Tc,Q-!N#4V!*!(3+mJXJF!!3"AVb#b"`!"!#@[),)
|
||||
(!!%!,+mJXJF!!3!eVb#b"`!"!#L[),)(!!%!+DmJXJF!!3!RVb#b"`!"!#D[),)
|
||||
'!!%!-+p+,rN!!3!cVd!Ie`!"!$Q[3"rA!!%!8Dmf[ZF!!3"#Vc#c(!!"!%@[-J9
|
||||
C!!%!2+m`Jq!!!3!pVdS[q`!"!%D[3"rC!!%!5Dmje8S!!3"%VdcqLJ!"!%1[4+A
|
||||
J!!%!5UmS[1N!!3!fVe5DZ`!"!$'[-)2M!!%!2Up8QV`!!3",Vd5PiJ!"!%b[-)2
|
||||
N!!%!6Dp%TH-!!3!rVdS[r`!"!&q[63A@!!%!,Dm`JqB!!3!ZVbLp"!!"!#q[+,d
|
||||
&!!%!+UmS[3B!!3!dVbLp$3!"!$U[+,d4!!%!B+mS[4-!!3!lVbLp&!!"!%k[+,d
|
||||
B!!%!+kmS[4i!!3$f!2J!N!-A!!%!N!F"3J%!N!3+DR0NBQGKF'NZB`#3(Jd!N!G
|
||||
!Vb#b"`!"!#b[),)(!!%!0DmJXJF!!3!TVb#b"`!"!#H[),)(!!%!-+p+,rN!!3!
|
||||
cVd!Ie`!"!&'[0VlR!!%!2+m`Jq!!!3"*VcR95J!"!%5[62k+!!%!3kp%TH!!!3!
|
||||
fVe5DZ`!"!$'[-)2M!!%!6+m`Jq3!!3"0Vd5Pi`!"!$q[5Lrr!!%!Akp0"GB!!3!
|
||||
[VbLp"3!"!#U[+,d'!!%!0+mS[3d!!3!VVbLp(J!"!8B"5!#3!b%!!3#3"`&#!3#
|
||||
3"!KUFf9YDA3ZB`#3)!i!N!G8Vb#b"`!"!%#[),)(!!%!8UmJXJF!!3"9Vb#b"`!
|
||||
"!#b[),)(!!%!0DmJXJF!!3!SVb#b"`!"!#Q[),)(!!%!8kmJXJF!!3!RVb#b"`!
|
||||
"!$#[5Lrj!!%!-kp!(pF!!3!jVd!Ie`!"!%+[-,-F!!%!2+m`Jq!!!3!pVdS[q`!
|
||||
"!%5[62k+!!%!3kp%TH!!!3!fVe5DZ`!"!$'[-)2M!!%!2Up8QV`!!3!rVdS[r`!
|
||||
"!&q[63A@!!%!,Dm`JqB!!3!ZVbLp"!!"!#q[+,d&!!%!+UmS[3B!!3!dVbLp$3!
|
||||
"!$U[+,d4!!%!B+mS[4-!!3!lVbLp&!!"!#Z[+,dH!!%"EJ&`!*!$*J!"!*!(!8)
|
||||
"!*!%"fTcCR9Z,Q-!N#%2!*!(3+mJXJF!!3!XVb#b"`!"!$@[),)(!!%!++mJXJF
|
||||
!!3!TVb#b"`!"!#H[),)(!!%!-+p+,rN!!3!bVc#$h!!"!$1[3"rA!!%!1Dp!(pF
|
||||
!!3!iVcDqjJ!"!%@[-J9C!!%!2+m`Jq!!!3!pVdS[q`!"!%D[3"rC!!%!5+p!(pS
|
||||
!!3"*VcR95J!"!%5[62k+!!%!3kp%TH!!!3"+VbLmk3!"!$D[9*Ul!!%!-Dm`Jq-
|
||||
!!3!qVe5D[!!"!%Z[4+AL!!%!6+m`Jq3!!3"0Vd5Pi`!"!$q[5Lrr!!%!Akp0"GB
|
||||
!!3!YVc#$jJ!"!#k[+,d%!!%!,kmS[38!!3!UVbLp"J!"!$5[+,d0!!%!1UmS[4%
|
||||
!!3"JVbLp%`!"!$Z[+,d8!!%!+kmS[4i!!3%Z!6!!N!-H!!%!N!F"3J%!N!3'DR0
|
||||
RBbjM!*!L%!#3"d#[),)(!!%!,+mJXJF!!3!eVb#b"`!"!#L[),)(!!%!+DmJXJF
|
||||
!!3!RVb#b"`!"!$#[5Lrj!!%!-kp!(pF!!3!jVd!Ie`!"!$b[-)2J!!%!2Dp+,rX
|
||||
!!3"'Vd!If3!"!%L[3"rD!!%!5Dmje8S!!3!fVe5DZ`!"!$'[-)2M!!%!2Up8QV`
|
||||
!!3"-Vc#$j!!"!$q[5Lrr!!%!Akp0"GB!!3!YVc#$jJ!"!#k[+,d%!!%!,kmS[38
|
||||
!!3!UVbLp"J!"!$5[+,d0!!%!1UmS[4%!!3"JVbLp%`!"!$Z[+,d8!!%!+kmS[4i
|
||||
!!3&Z!A!!N!-Q!!%!N!F"3J%!N!3+DR0TER4PFR!ZB`#3(K%!N!G!Vb#b"`!"!&D
|
||||
[),)(!!%!,+mJXJF!!3!eVb#b"`!"!#L[),)(!!%!+DmJXJF!!3!RVb#b"`!"!$#
|
||||
[5Lrj!!%!-kp!(pF!!3!hVbLma!!"!$Q[3"rA!!%!1+mf[ZB!!3"4VcDqj`!"!%@
|
||||
[-J9C!!%!2+m`Jq!!!3!pVdS[q`!"!%D[3"rC!!%!5+p!(pS!!3"*VcR95J!"!%5
|
||||
[62k+!!%!3kp%TH!!!3!fVe5DZ`!"!$'[-)2M!!%!2Up8QV`!!3"-Vc#$j!!"!%f
|
||||
[4+AM!!%!2kp+,rm!!3"IVdd&eJ!"!#f[-)2Q!!%!,UmS[33!!3![VbLp"3!"!#U
|
||||
[+,d'!!%!0+mS[3d!!3!kVbLp%3!"!'#[+,d6!!%!1kmS[43!!3!VVbLp(J!"!&B
|
||||
!@!#3!`-!!3#3"`&#!3#3"!KUFfa[BfXZB`#3)")!N!G'Vd!If3!"!&q[63A@!!%
|
||||
"0J%i!*!$(`!"!*!(!6)"!*!%#'TcE@&dD#jM!*!J%`#3"d#[),)(!!%!9UmJXJF
|
||||
!!3!XVb#b"`!"!$@[),)(!!%!++mJXJF!!3!TVb#b"`!"!&#[),)(!!%!*kmJXJF
|
||||
!!3!`VdS[q3!"!$1[3"rA!!%!1Dp!(pF!!3!mVc#$i!!"!$f[5Lrl!!%!4kmS[0d
|
||||
!!3")Vd!IfJ!"!%Q[1G9+!!%!0Up8QVX!!3!aVc#$i`!"!$k[9*Um!!%!2kp+,rm
|
||||
!!3"IVdd&eJ!"!#f[-)2Q!!%!,kmS[38!!3!UVbLp"J!"!$5[+,d0!!%!1UmS[4%
|
||||
!!3"JVbLp%`!"!$Z[+,d8!!%!6kp0"8m!!3!VVbLp(J!"!@i"F!#3!bB!!3#3"`%
|
||||
b!3#3"!GUFfjeE5jM!*!K&!#3"d#[),)(!!%!9kmJXJF!!3"BVb#b"`!"!&D[),)
|
||||
(!!%!*DmJXJF!!3!XVb#b"`!"!$@[),)(!!%!++mJXJF!!3!TVb#b"`!"!#H[),)
|
||||
(!!%!*UmJXJB!!3!`VdS[q3!"!$1[3"rA!!%!1Dp!(pF!!3!iVcDqjJ!"!$b[-)2
|
||||
J!!%!2Dp+,rX!!3"'Vd!If3!"!%L[3"rD!!%!5Dmje8S!!3"%VdcqLJ!"!%1[4+A
|
||||
J!!%!0Up8QVX!!3!aVc#$i`!"!$k[9*Um!!%!2kp+,rm!!3"IVdd&eJ!"!#f[-)2
|
||||
Q!!%!,kmS[38!!3!UVbLp"J!"!&Q[+,d+!!%!0+mS[3d!!3!kVbLp%3!"!'#[+,d
|
||||
6!!%!1kmS[43!!3"1VbLp'!!"!#Z[+,dH!!%"GJ&i!*!$*`!"!*!(!8)"!*!%"fT
|
||||
cEf*U,Q-!N#%9!*!(3+mJXJF!!3!PVb#b"`!"!#b[),)(!!%!0DmJXJF!!3!SVb#
|
||||
b"`!"!#Q[),)(!!%!*kmJXJF!!3!QVb#b"J!"!$#[5Lrj!!%!-kp!(pF!!3!hVbL
|
||||
ma!!"!$Q[3"rA!!%!1+mf[ZB!!3"&Vc)&@3!"!$b[-)2J!!%!2Dp+,rX!!3"'Vd!
|
||||
If3!"!%L[3"rD!!%!5Dmje8S!!3"%VdcqLJ!"!%1[4+AJ!!%!0Up8QVX!!3!aVc#
|
||||
$i`!"!$k[9*Um!!%!6+m`Jq3!!3"0Vd5Pi`!"!$q[5Lrr!!%!Akp0"GB!!3!YVc#
|
||||
$jJ!"!#k[+,d%!!%!,kmS[38!!3!UVbLp"J!"!$5[+,d0!!%!1UmS[4%!!3"JVbL
|
||||
p%`!"!$Z[+,d8!!%!6UmS[4J!!3!VVbLp(J!"!CB"Q!#3!bX!!3#3"`&#!3#3"!T
|
||||
UFfp`BfpNC5jM!*!H&J#3"e5[),)(!!%!3+mJXJF!!3"5Vb#b"`!"!&@[),)(!!%
|
||||
!*DmJXJF!!3!XVb#b"`!"!$@[),)(!!%!++mJXJF!!3!TVb#b"`!"!&1[),)(!!%
|
||||
!*kmJXJF!!3!QVb#b"J!"!$#[5Lrj!!%!-kp!(pF!!3!jVd!Ie`!"!$L[0VlQ!!%
|
||||
!8Dmf[ZF!!3"#Vc#c(!!"!%@[-J9C!!%!2+m`Jq!!!3!pVdS[q`!"!%Q[1G9+!!%
|
||||
!4+p-rSS!!3"$Vd5Pi!!"!$D[9*Ul!!%!-Dm`Jq-!!3!qVe5D[!!"!%b[-)2N!!%
|
||||
!6Dp%TH-!!3!rVdS[r`!"!&q[63A@!!%!,Dm`JqB!!3!ZVbLp"!!"!#q[+,d&!!%
|
||||
!+UmS[3B!!3"CVbLp#J!"!$5[+,d0!!%!1UmS[4%!!3"JVbLp%`!"!$Z[+,d8!!%
|
||||
!6UmS[4J!!3!VVbLp(J!"!Ai"J!#3!bJ!!3#3"`&#!3#3"!PUFh"KFR0P,Q-!N"m
|
||||
A!*!(3+mJXJF!!3!PVb#b"`!"!#b[),)(!!%!0DmJXJF!!3!SVb#b"`!"!#Q[),)
|
||||
(!!%!*kmJXJF!!3!QVb#b"J!"!$#[5Lrj!!%!-kp!(pF!!3!jVd!Ie`!"!$L[0Vl
|
||||
Q!!%!3Um`Xa`!!3"&Vc)&@3!"!$b[-)2J!!%!2Dp+,rX!!3"'Vd!If3!"!%Q[1G9
|
||||
+!!%!4+p-rSS!!3"$Vd5Pi!!"!%U[+,cT!!%!0Up8QVX!!3!aVc#$i`!"!$k[9*U
|
||||
m!!%!5kp%TH)!!3"-Vc#$j!!"!%f[4+AM!!%!2kp+,rm!!3"IVdd&eJ!"!#f[-)2
|
||||
Q!!%!,UmS[33!!3![VbLp"3!"!#U[+,d'!!%!0+mS[3d!!3!kVbLp%3!"!'#[+,d
|
||||
6!!%!1kmS[43!!3"1VbLp'!!"!#Z[+,dH!!%"4J&)!*!$)3!"!*!(!6)"!*!%#QT
|
||||
cFQ9RCAK`,Q-!N"iB!*!(3+mJXJF!!3!XVb#b"`!"!$@[),)(!!%!++mJXJF!!3!
|
||||
TVb#b"`!"!#H[),)(!!%!-+p+,rN!!3!bVc#$h!!"!$1[3"rA!!%!1Dp!(pF!!3!
|
||||
iVcDqjJ!"!%@[-J9C!!%!2+m`Jq!!!3!pVdS[q`!"!%D[3"rC!!%!5Dmje8S!!3"
|
||||
%VdcqLJ!"!%1[4+AJ!!%!0Up8QVX!!3!aVc#$i`!"!$k[9*Um!!%!2kp+,rm!!3"
|
||||
IVdd&eJ!"!#f[-)2Q!!%!,UmS[33!!3![VbLp"3!"!#U[+,d'!!%!0+mS[3d!!3!
|
||||
kVbLp%3!"!'#[+,d6!!%!1kmS[43!!3!VVbLp(J!"!Bi"N!!!N!-U!!%!N!F"-J%
|
||||
!N!3)DR0cBf&Z,Q-!N#!C!*!(9+mJXJF!!3"!Vb#b"`!"!&H[),)(!!%!@+mJXJF
|
||||
!!3"@Vb#b"`!"!&+[),)(!!%!9DmJXJF!!3!PVb#b"`!"!#b[),)(!!%!0DmJXJF
|
||||
!!3!SVb#b"`!"!#Q[),)(!!%!8kmJXJF!!3!RVb#b"`!"!#D[),)'!!%!-+p+,rN
|
||||
!!3!cVd!Ie`!"!$Q[3"rA!!%!1+mf[ZB!!3"#Vc#c(!!"!$b[-)2J!!%!2Dp+,rX
|
||||
!!3"%VdcqLJ!"!%1[4+AJ!!%!0Up8QVX!!3!aVc#$i`!"!$k[9*Um!!%!5kp%TH)
|
||||
!!3!rVdS[r`!"!&q[63A@!!%!,Dm`JqB!!3!ZVbLp"!!"!#q[+,d&!!%!+UmS[3B
|
||||
!!3"CVbLp#J!"!$5[+,d0!!%!1UmS[4%!!3"JVbLp%`!"!$Z[+,d8!!%!6UmS[4J
|
||||
!!3!VVbLp(J!"!5i"-!#3!ai!!3#3"`&#!3#3"!PUFh0MEh"P,Q-!N"mD!*!(3+m
|
||||
JXJF!!3!XVb#b"`!"!$@[),)(!!%!++mJXJF!!3!TVb#b"`!"!#H[),)(!!%!-+p
|
||||
+,rN!!3!cVd!Ie`!"!$Q[3"rA!!%!2+m`Jq!!!3!pVdS[q`!"!%D[3"rC!!%!5+p
|
||||
!(pS!!3"*VcR95J!"!$D[9*Ul!!%!-Dm`Jq-!!3!qVe5D[!!"!%b[-)2N!!%!2kp
|
||||
+,rm!!3"IVdd&eJ!"!#f[-)2Q!!%!,UmS[33!!3![VbLp"3!"!#U[+,d'!!%!0+m
|
||||
S[3d!!3!kVbLp%3!"!'#[+,d6!!%!1kmS[43!!3!VVbLp(J!"!-i!d!#3!a)!!3#
|
||||
3"`&#!3#3"!TUFh0MFQP`G#jM!*!H'`#3"bb[),)(!!%!0DmJXJF!!3!TVb#b"`!
|
||||
"!#H[),)(!!%!-+p+,rN!!3!cVd!Ie`!"!&'[0VlR!!%!3Um`Xa`!!3"%VdcqLJ!
|
||||
"!%1[4+AJ!!%!0Up8QVX!!3!aVc#$i`!"!%f[4+AM!!%!Akp0"GB!!3!UVbLp"J!
|
||||
"!$5[+,d0!!%!+kmS[4i!!3&@!9J!N!-M!!%!N!F"3J%!N!3(DR0cG()ZB`#3)4`
|
||||
!N!G!Vb#b"`!"!#@[),)(!!%!,+mJXJF!!3!eVb#b"`!"!#L[),)(!!%!+DmJXJF
|
||||
!!3!RVb#b"`!"!#D[),)'!!%!-+p+,rN!!3!bVc#$h!!"!$1[3"rA!!%!0kmS[-3
|
||||
!!3!jVd!Ie`!"!$L[0VlQ!!%!2+m`Jq!!!3!pVdS[q`!"!%D[3"rC!!%!5+p!(pS
|
||||
!!3"*VcR95J!"!$D[9*Ul!!%!-Dm`Jq-!!3!qVe5D[!!"!$q[5Lrr!!%!Akp0"GB
|
||||
!!3!YVc#$jJ!"!#k[+,d%!!%!,kmS[38!!3!UVbLp"J!"!$5[+,d0!!%!1UmS[4%
|
||||
!!3"JVbLp%`!"!$Z[+,d8!!%!6UmS[4J!!3!VVbLp(J!"!)i!N!!!N!-+!!%!N!F
|
||||
"-J%!N!3*F(*KFQ9ZB5jM!*!I(3#3"bb[),)(!!%!++mJXJF!!3!TVb#b"`!"!#H
|
||||
[),)(!!%!Akp0"GB!!3!YVc#$jJ!"!#k[+,d%!!%!+UmS[3B!!3!VVbLp(J!"!)B
|
||||
!L!#3!`N!!3#3"`&#!3#3"!T`FQ&cFf9bG#jM!*!H(J#3"bb[),)(!!%!0DmJXJF
|
||||
!!3!SVb#b"`!"!#H[),)(!!%!Akp0"GB!!3!ZVbLp"!!"!#U[+,d'!!%!+kmS[4i
|
||||
!!3#f!,J!N!-2!!%!N!F"3J%!N!3)F(*NG'pK,Q-!N#!I!*!(*DmJXJF!!3!XVb#
|
||||
b"`!"!#H[),)(!!%!*UmJXJB!!3"FVb#b"`!"!&f[),)(!!%!Akp0"GB!!3"HVb#
|
||||
b"`!"!#U[+,d'!!%!@DmS[3S!!3"1VbLp'!!"!#Z[+,dH!!%!@UmJXJF!!3"EVb#
|
||||
b"`!"!*B!Q!#3!`X!!3#3"`&#!3#3"!K`FQKKFfJZB`#3)#!!N!FXVb#b"`!"!$@
|
||||
[),)(!!%!++mJXJF!!3!TVb#b"`!"!#H[),)(!!%!Akp0"GB!!3!ZVbLp"!!"!#U
|
||||
[+,d'!!%!0+mS[3d!!3!VVbLp(J!"!'i!F!#3!`B!!3#3"`&#!3#3"!K`FQa[Cc)
|
||||
ZB`#3)#%!N!FXVb#b"`!"!#H[),)(!!%!Akp0"GB!!3!UVbLp"J!"!#Z[+,dH!!%
|
||||
!TJ#S!*!$$3!"!*!(!8)"!*!%#("bE'pZCbjM!*!J)J#3"b@[),)(!!%!,+mJXJF
|
||||
!!3!eVb#b"`!"!#H[),)(!!%!*UmJXJB!!3"IVdd&eJ!"!#U[+,d'!!%!1UmS[4%
|
||||
!!3"JVbLp%`!"!$Z[+,d8!!%!6UmS[4J!!3!VVbLp(J!"!,i!`!#3!a!!!3#3"`&
|
||||
#!3#3"!T`FR"bD@jdCLjM!*!H)`#3"b@[),)(!!%!,+mJXJF!!3!eVb#b"`!"!#L
|
||||
[),)(!!%!+DmJXJF!!3!RVb#b"`!"!#D[),)'!!%!Akp0"GB!!3!ZVbLp"!!"!#U
|
||||
[+,d'!!%!1UmS[4%!!3"JVbLp%`!"!$Z[+,d8!!%!6UmS[4J!!3!VVbLp(J!"!5B
|
||||
"+!#3!ad!!3#3"`%b!3#3"!K`FR4TE@8ZB`#3)#3!N!G8Vb#b"`!"!'H[),)(!!%
|
||||
!DDmJXJF!!3"QVb#b"`!"!&+[),)(!!%!9DmJXJF!!3"KVb#b"`!"!'5[),)(!!%
|
||||
!CDmJXJF!!3"SVb#b"`!"!'1[),)(!!%!*DmJXJF!!3!XVb#b"`!"!#Q[),)(!!%
|
||||
!BUmJXJF!!3"3Vb#b"`!"!'U[),)(!!%!8kmJXJF!!3!RVb#b"`!"!#D[),)'!!%
|
||||
!Akp0"GB!!3!UVbLp"J!"!$U[+,d4!!%!B+mS[4-!!3!lVbLp&!!"!%k[+,dB!!%
|
||||
!6kp0"8m!!3!VVbLp(J!"!%B!5!2R!!%!!3#3#!)"!*!%$N&18dNJ3bj38%-Z6'P
|
||||
L!*!D!J#3"dB!5!2R!!%!!3#3#!)"!*!%$90*6e9B,P"33bj-D@)!N"X'!*!(4J"
|
||||
)!qF!!3!#!*!)!J%!N!3-5@jdCA*QB@0P6'PL!*!F!`#3"dB!5!2R!!%!!J#3#!)
|
||||
"!*!%"deKG'K-D@)!N#%%!*!(4J")!qF!!3!#!*!)!J%!N!3169G$8R9ZG'PYC5j
|
||||
-D@)!N"S&!*!,!8!%!!%cE4""6P0*)%-V+bj38%-Z6'PL!*!2Vb#b#!'!69"-4Um
|
||||
JXJJ!!N!%!!%cE3j"6P0*)%-Z8&"$,NaTBJ#3%DmJXJJ"J%e36%D[),))!!0!"!!
|
||||
"-p!-5@jdCA*QB@0P6'PL!*!6Vb#b#!'!Fh4eBUmJXJJ!"%!%!!%ciJG0BA4S6'P
|
||||
L!*!BVb#b#!'!FfKXBUmJXJJ!"8!%!!%dP!j09d05G@jdD@eP,NaTBJ#3%DmJXJJ
|
||||
"J%e36%D[),))!!C!"!!"0,N08dP299JZ8&"$,NaTBJ#3%UmJXJJ"J%e36%D[),)
|
||||
)!!F!!J!"0JN(DR0KF'NZB`#3'+p,$'3"J&4&@&5[5`aN!!J!!J!"0JN*DR0KFR*
|
||||
KH5jM!*!@VdcqL3'!9%9B9+p-rSN!#3!#!!%f#3KUFf&dEfdZB`#3&kp0!pJ"J&4
|
||||
&@&5[632B!!S!!J!"0JN)DR0LEfpX,Q-!N"H[1G9'!B"849K8VcR94J!,!!)!!6B
|
||||
*#@TcBfjdH(3ZB`#3&Up,$'8"J&4&@&5[5`aP!!`!!J!"0JN)DR0NBA4P,Q-!N"H
|
||||
[63VP!B"849K8Vdd+j3!0!!)!!6B*#QTcC'*RBA"T,Q-!N"@[0VlQ!B"849K8VcD
|
||||
qjJ!1!!)!!6B*#'TcC@eTG#jM!*!AVcR94`'!9%9B9+mje8F!$`!#!!%f#3GUFfC
|
||||
eELjM!*!BVe5DZJ'!9%9B9+p8QVS!%!!#!!%f#3CUFfGM,Q-!N"Q[9*Uk!B"849K
|
||||
8Ve5DZJ!4!!)!!6B*#QTcD@jdCA*`,Q-!N"@[9*Ul!B"849K8Ve5DZ`!5!!)!!6B
|
||||
*#'TcE'pMDbjM!*!AVbLmfJ'!9%9B9+mS[0S!%`!#!!%f#3KUFfeKG'JZB`#3&kp
|
||||
0"&-"J&4&@&5[6346!"3!!J!"0JN(DR0ZG@dZB`#3'+p0"'B"J&4&@&5[634Q!"8
|
||||
!!J!"0JN(DR0[BQSZB`#3'+p,$'B"J&4&@&5[5`aQ!"B!!J!"0JN+DR0[F'0[C'8
|
||||
ZB`#3&Dp-rSS"J&4&@&5[62k+!"F!!J!"0JN*DR0`BA*cC5jM!*!@VdcqLJ'!9%9
|
||||
B9+p-rSS!'!!#!!%f#3TUFh*PCf9iF#jM!*!9Ve5E(`'!9%9B9+p8Qam!'3!#!!%
|
||||
f#3KUFh0MB@iZB`#3&kp0%h)"J&4&@&5[640b!"S!!J!"0JN*DR0cBfp`C5jM!*!
|
||||
@Ve5D[3'!9%9B9+p8QVd!'`!#!!%f#3TUFh0MFQP`G#jM!*!9VdS[rJ'!9%9B9+p
|
||||
+,ri!(!!#!!%f#3GUFh0dFLjM!*!BVe5D[J'!9%9B9+p8QVi!(3!#!!%f#3P`FQ&
|
||||
bC@jK,Q-!N"D[6356!B"849K8Vdd%N`!H!!)!!6B*#R"bBA0cCA*d,Q-!N"@[+,d
|
||||
"!B"849K8VbLp!3!I!!)!!6B*#("bC(4[B5jM!*!AVbLp#3'!9%9B9+mS[3N!)!!
|
||||
#!!%f#3K`FQKKFfJZB`#3&kmje8`"J&4&@&5[1G9-!#%!!J!"0JN)F(*XEfFb,Q-
|
||||
!N"H[+,d2!B"849K8VbLp$`!L!!)!!6B*#("bE'pZCbjM!*!AVbLp%!'!9%9B9+m
|
||||
S[4!!)`!#!!%f#3T`FR"bD@jdCLjM!*!9VbLp&`'!9%9B9+mS[4F!*!!#!!%f#3K
|
||||
`FR4TE@8ZB`#3&kp0$YN"J&4&@&5[63lC!#9!!J!",[i)Fh4NBA*R,QJ!N"H[),)
|
||||
(!)"849K8Vb#b"`!Q3!)!!5lq#9pcG'4KFQFZD!#3&UmJXJB!J&4&@&5[),)'!#G
|
||||
!!J!",[i(HACKE(-ZD!#3'+mJXJF!J&4&@&5[),)(!#K!!J!",[i)Fh4NE'PL,QJ
|
||||
!N"H[),)(!)"849K8Vb#b"`!T3!)!!5lq#(0dFQPZCbjS!*!AVb#b"`#!9%9B9+m
|
||||
JXJF!+J!"!!%f#3T`FQ0`G@0QCbjS!*!9VbLp"J'!9%9B9+mS[3B!+`!"!!%f#3P
|
||||
`FR4jF'9c,QJ!N"D[+,dH!B"849K8VbLp(J!X3!)!!5lq#(0dC'4PCLjS!*!AVb#
|
||||
b"`#!9%9B9+mJXJF!,3!"!!%f#3P`FQ&bC@jK,QJ!N"D[-)2Q!B"849K8Vc#$jJ!
|
||||
Z!!%!!6B*#R"bBA0cCA*d,QJ!N"@[+,d%!B"849K8VbLp"!![!!%!!6B*#A"bBfa
|
||||
TFh3ZD!#3&UmS[38"J&4&@&5[+,d&!$!!!3!"0JN(DR0KF'NZD!#3'+p+,rN"J&4
|
||||
&@&5[5Lrj!$%!!3!"0JN*DR0`G@*dC#jS!*!@Vc#$i`'!9%9B9+m`Jq-!-J!"!!%
|
||||
f#3PUFf&bFQ&j,QJ!N"D[-)2F!B"849K8Vc#$h!!c!!%!!6B*#'TcBA4[E5jS!*!
|
||||
AVd!Ie`'!9%9B9+p!(pF!0!!"!!%f#3K`FQKKFfJZD!#3&kmS[3d"J&4&@&5[+,d
|
||||
0!$9!!J!",[i(Fh4ND@mZD!#3'+mJXJF!J&4&@&5[),)(!$B!!3!"0JN*DR0`FRC
|
||||
dC#jS!*!@Ve5DZ`'!9%9B9+p8QVX!0`!"!!%f#3KUFf*[Ef`ZD!#3&kmS[-3"J&4
|
||||
&@&5[+,c%!$J!!3!"0JN+DR0MEfjQD@FZD!#3&Dmf[ZB"J&4&@&5[0VlQ!$N!!3!
|
||||
"0JN*DR0MER4iG#jS!*!@Vd!Ie`'!9%9B9+p!(pF!1J!"!!%f#3K`FQa[EQFZD!#
|
||||
3&kmS[4%"J&4&@&5[+,d4!$X!!3!"0JN*F(*[Ff4PF#jS!*!@VbLp&!'!9%9B9+m
|
||||
S[43!2!!"!!%f#3CUFfGM,QJ!N"Q[-)2J!B"849K8Vc#$i!!p!!%!!6B*#QTcD@j
|
||||
dCA*`,QJ!N"@[5Lrl!B"849K8VdS[q`!q!!%!!6B*#QTcFQ9RCAK`,QJ!N"@[9*U
|
||||
m!B"849K8Ve5D[!!r!!%!!6B*"fTcFh4b,QJ!N"L[5Lrr!B"849K8VdS[r`"!3!)
|
||||
!!5lq"f0dHA"P,QJ!N"L[),)(!)"849K8Vb#b"`""!!%!!6B*#'TcC'&dC5jS!*!
|
||||
AVbLmb`'!9%9B9+mS[-X!3J!"!!%f#3KUFf9YDA3ZD!#3&km`Xa`"J&4&@&5[-,-
|
||||
F!%-!!3!"0JN+DR0[F'0[C'8ZD!#3&Dp%TH!"J&4&@&5[4+AJ!%3!!3!"0JN-DR0
|
||||
[F'0[C'8ZC'9Q!*!6VdcqLJ'!9%9B9+p-rSS!43!"!!%f#3GUFfCeELjS!*!BVc)
|
||||
&@3'!9%9B9+mb"9N!4J!"!!%f#3KUFfa[BfXZD!#3&kp!(pN"J&4&@&5[3"rC!%F
|
||||
!!3!"0JN)DR0YBA4S,QJ!N"H[+,cG!B"849K8VbLmh3")!!%!!6B*"fTcER9Y,QJ
|
||||
!N"L[3"rD!B"849K8Vd!IfJ"*!!%!!6B*"fTcEf*U,QJ!N"L[1G9+!B"849K8VcR
|
||||
95J"+!!%!!6B*#@TcF'&bFf8ZD!#3&UmS[1N"J&4&@&5[+,cT!%X!!3!"0JN)DR0
|
||||
cBf&Z,QJ!N"H[4+AL!B"849K8Vd5PiJ"-!!%!!6B*#@TcFf0[F'8ZD!#3&Um`Jq3
|
||||
"J&4&@&5[-)2N!%d!!3!"0JN+DR0cBh*TF(3ZD!#3&Dp%TH-"J&4&@&5[4+AM!%i
|
||||
!!3!"0JN+F(*`FQPZG'BZD!#3&DmS[4J"J&4&@&5[+,dB!%m!!3!"0JN)F(*dD@e
|
||||
P,QJ!N"H[6392!B"849K8Vdd&6`"33!)!!5lq"R4TE@8ZD!#3'DmJXJF!J&4&@&5
|
||||
[),)(!&%!!3!"0JN+DR0NBQGKF'NZD!#3&Dmf[ZF"J&4&@&5[0VlR!&*!"3!"-E-
|
||||
)E@9YEh*j,QJ!N"H[),)(!)"849K8Vb#b"`"63!8!!6'c"e4jF'9c,QJ!N"L[),)
|
||||
(!)"849K8Vb#b"`"83!8!!6'c%d0[EQ4TG'P[EQ&X6@&MFQpc,QJ!N!b[),)(!)"
|
||||
849K8Vb#b"`"93!8!!6'c#deTH'9N6@pNC5jS!*!8Vb#b"`#!9%9B9+mJXJF!9N!
|
||||
#!!%ZrJCYBA4S,QJ!N"Q[),)(!)"849K8Vb#b"`"A3!)!!5lq"f9bFQj[,QJ!N"L
|
||||
[),)(!)"849K8Vb#b"`"B3!)!!5lq#'aTE@PdFbjS!*!AVb#b"`#!9%9B9+mJXJF
|
||||
!@3!"!!%f#3K`FQ4dEf%ZD!#3&kmS[3S"J&4&@&5[+,d+!&T!!J!",[i)Fh4NE'P
|
||||
L,QJ!N"H[),)(!B"849K8Vb#b"`"E3!)!!5lq#(0dFQPZCbjS!*!AVb#b"`'!9%9
|
||||
B9+mJXJF!A%!#!!%ZrJGPFR*ZEbjS!*!BVb#b"`'!9%9B9+mJXJF!A8!#!!%ZrJG
|
||||
QE'pKG#jS!*!BVb#b"`'!9%9B9+mJXJF!AN!#!!%ZrJCYBA4S,QJ!N"Q[),)(!B"
|
||||
849K8Vb#b"`"I!!%!!6B*#deKBe"bC@CTH#jS!*!8Vdd&eJ'!9%9B9+p0"GB!B!!
|
||||
"!!%f#3P`FQeKBfpc,QJ!N"D[+,d6!B"849K8VbLp%`"K3!8!!6'c#8p69A4TE(-
|
||||
ZD!#3&UmJXJF!J&4&@&5[),)(!'*!"3!"-E-,9'9iG&9dD@ac,QJ!N"5[),)(!)"
|
||||
849K8Vb#b"`"M3!8!!6'c#&0MFQP`G#jS!*!AVb#b"`#!9%9B9+mJXJF!C%!&!!%
|
||||
aX`Y4G@PMDf4bBAFZD!#3&+mJXJF!J&4&@&5[),)(!'9!"3!"-E-28A9TBfYNFQ&
|
||||
h9'9iG#jS!*!3Vb#b"`#!9%9B9+mJXJF!CN!&!!%aX`p*ER4X8Q9cEh9bBf9c,QJ
|
||||
!N"#[),)(!)"849K8Vb#b"`"R3!8!!6'c#%9fC@jdFbjS!*!AVb#b"`#!9%9B9+m
|
||||
JXJF!D%!&!!%aX`Y5CA0[GA*MCA-ZD!#3&+mJXJF!J&4&@&5[),)(!'P!"3!"-E-
|
||||
(4QPXCA-ZD!#3'+mJXJF!J&4&@&5[),)(!'T!"3!"-E-(9'PYCA)ZD!#3'+mJXJF
|
||||
!J&4&@&5[),)(!'X!!J!"0JN%DR-ZB`#3'kp0"Q-"J&4&@&5[63CM!*!'!4`!N!-
|
||||
#8&0PCrrr!*!*(!!!!3"38f9R!!%!!!CH&4J!!!%H!!!NX&"-Fh3!N!3'AK6i!!!
|
||||
PcJ!!&T*34Qac!*!%'"m!!!%!N!-h)3!!0L%!!!3NE[rd2A`"!2rfF!!Y32ri,8$
|
||||
rr&Q2,blrl&Q2,blrl%i*5P05C@BZF(*U!J!!9de08&*$9dP&!!#ahl(I!*!$!3"
|
||||
A68e38N0A588!!,(IXGm!N"+`P3GY!!!mX!!!1d8M2blrjUQD5N9Q"P@2UDmk(dT
|
||||
&CKT)E[qJ,bi!%#mZ!!`[,J!)6VVp"Nr[!""J$&@25'lrS(!'UP*86c!&61iFq2p
|
||||
`6Pj1G6!!!!8!N!8&!!8!"3!%!*!+!3#3%33&N!3!6PB!!%MR!4JQ!*!$!J!'!*!
|
||||
$,J!&!3$rr`#3#2rr!C!&!*!%(J%"!*!)QCN!!$rr2rmrr`#3!dS!!3!*"Ne[EQ&
|
||||
ME`#3(!3!+!!+!F)#J!!S!!S"`J+!!*!3!3#3!`)+!!8!#e0TEA"XC5"#C@9`!*$
|
||||
f!3!"#e0TEA"XC5"#C@9`!*$j!J#3"43!!3"#!Ki#D31H!&d!!5cV!!%f#3#3!aS
|
||||
!!`!!Irm!N!4rr`#3"(rr!*!%Irm!N!3&(!!%!*!$!3!%!3S!!3%k!&N!"!"GrTi
|
||||
!@5VS!&N!"!"G!!$!!!"C3)$ErN#!fqj!J%#!hGJPAIrr!!m!e!#3!i)!$`!!9J#
|
||||
3!`&-3)'Gc!"C,8J!AICJ!)$Hd!#!KAK!J*S+!&NY5!#!K'S!!-!!!&N!"!"GrTi
|
||||
J%%#"3)'Gc%#"R0i!A0Q)!03!N!1#!!m!!&B!N!5#!)#(U!#3"i!!N!H!!13!N!8
|
||||
%!&hfB!#3$%#"X"j!JDrN!!$!!!"C!!3!!"*H!035AJ##!!m!!&B!N!5#!)#&j!"
|
||||
C2q!!J)@f!*!$J!$)fBJ!e!$b!*N!@5VS!")!"!#!KkJ"h!!#*$T0B@028b"6GA"
|
||||
`Eh*d1NKPB@4PFR-k38j655")C@&NCA*c1J"!Kl[q3)HlrJ%pbq!"C,"d!@5`+!%
|
||||
pYJ#3!a2@!*!%!@5Y8%)!#!`!$#-8!*!*&%(F!*!J!6ajk!#3"@36eJ#3"!%mHHJ
|
||||
!!J!!!@5Y8!%q%f`!N#(Q!(-!q!$)!6i6P!!%!!!"C+k)!!!6eJ&NVE!!N!8-)SJ
|
||||
!%CHS*!!)"!!83G`!SJ%4!+)"%3#3"aJ!)3%!!!)D1NeKBdp6)&0eF("[FR3k6@&
|
||||
M5'9KC'9bFcS8$XJ!%D3S!*!*!5cN!*!(!J&Ul6!!&&AJ!"49e'Mrpd!"DZdT!*!
|
||||
$r`!8&5`"DZhi!@VY%!!5J93!%D6!*!!%"!&Ul5!!!5cN!*!)!@VY8!!",13!!#a
|
||||
d!5[,S(0MFQN!&d3!!"39,!!!rrm"DZk!!!!"!!!4T-!N!!J%!@VXd!!8')!!N!N
|
||||
MmS*!P,4d!*!$`!#3"!&UlUi!&"qX!83-8!&UlYB"DZf3!!#3!`%!%D4m*!!)"!&
|
||||
Ul4!!&"L!!"3KF!#3"aJ!)3!$!!!"!!!#'6T0B@028b"6GA"`Eh*d1NaTBR*KFQP
|
||||
PFcS!&!l)!"'N+!#3#3%Xj!#3"`)"DZd`!"49i!!89G4SrrG!!@VY+3#3!rm!&"8
|
||||
X!@VYq!&Ul4!!%S&8!"'N`#3!"!3"DZdJ!!%Xj!#3#!&Ul9!!!5cN!!!XG!%Vbk"
|
||||
cBh*T!"G%!!!8&5`!!2rr!@VZJ%#8!3!!%D6!*!!)"!&Ul0!!&"L!!*!)!@[K[%#
|
||||
8Y(3!N!2!!*!%!@VZVJ!8(k`"4!a3!@VZeJ&UlC!!!*!$!3!4T(`N!!J%!@VY%!!
|
||||
8')!!&#&`!*!('!!K!!-!!!%!!!)21NeKBdp6)&0eF("[FR3krrm!!%!!!@VXd!!
|
||||
8$XJ!%D3S!*!*!5cN!*!(!J&Ul6!!&&AJ!"49e'Mrpd!"DZdT!*!$r`!8&5`"DZh
|
||||
i!@VY%!!5J93!%D6!*!!%"!&Ul5!!!5cN!*!)!@VY8!!",13!!#ad!5[,S(0MFQN
|
||||
!&d3!!"39,!!!rrm"DZk!!!!"!!!4T-!N!!J%!@VXd!!8')!!N!NMmS*!P,4d!*!
|
||||
$`!#3"!&UlUi!&"qX!83-8!&UlYB"DZf3!!#3!`%!%D4m*!!)"!&Ul4!!&"L!!"3
|
||||
KF!#3"aJ!)3!$!*!%(2i!"K"0B@028b"38%-J6'PZDf9b!*!3"4"0B@028b"38%-
|
||||
J6'PZDf9b!*!`'N&38%`!N%"J!*!$3A"`E!#33'!!N!0068a#!*!J$NaTBL"*EA"
|
||||
[FR3J8&"$!*!969"-4J#3)!j-D@)J5@e`Eh*d)&"33`#3&8eA3d3!N%"J!*!$8P0
|
||||
53`#33'!!N!0849K8!bjLD("cF`!!!T`i!*!)!DJpd!#3"!*6H[!-3Q&XE'p[EL"
|
||||
)C@a`8%iS8!#3!`'S2G$rN!2p!P!h'!#3"&4&@&3#,Q-!N"d-69FJ3bp$+bXJ8&"
|
||||
$!*!A9%9B9!3ZBbXV!*!E$%eA)%-[3bXV)&"33`#3&e4&@&3$,Q0M!*!F$%eA)%-
|
||||
[3bXV)&"33`#3&e4&@&3$,Q0`!*!F$%eA)%-[3bXV)&"33`#3&e4&@&3%,Q0`F!#
|
||||
3'`a09b"$,d-V+b"38%-!N"G849K8"#jPH(!!N$p849K8!LjS!*!G$%eA)%-[3bX
|
||||
V)&"33`#3%a!!N!0849K8!Lj`!*!G$8eA)&"KFf0KE#"38%-!N"C849K8"#j`BA-
|
||||
!N"X069FJ8'&cBf&X)&"33`#3&P4&@&3%,R"MD!#3'`a09b"$,d-V+b"38%-!N"1
|
||||
!!*!$9%9B9!BZF'0S+bX!N"N-69FJ3bp$+bXJ8&"$!*!6J!#3!e4&@&3#,R)!N"d
|
||||
$8Q9k!*!J9%9B9!)ZFfK`Fh-!!!+F1!#3#!'S2G!!N!3#8hV`"P"33d&cE@i"F4K
|
||||
JF&"1+&!!N!-"U$h3rj!$r3*30aJ!N!4B3dp'!*!J%&K$6dC')%PYF'pbG#"38%-
|
||||
!N"0NEf0e!*"!B!#3!h*cFQ-!N%"J!*!$FfKXBJ#3)!j348BJ5@e`Eh*d)&"33`#
|
||||
3&A0dG@)!N#!18%9')%PYF'pbG#"38%-!N"N%,Q4[B`#31e!!N!-36@&M6e-J0MK
|
||||
,)%aTEQYPFJ#3-"T"8&"-!*"!B!#3!d&`F'`!N%"J!*!$68e-3J#3)!j-D@)J5@e
|
||||
`Eh*d)$Bi5`#3&8e36%B!N#!16'PL)%PYF'pbG#!f1%X!N"909d0%!*"!B!#3!dp
|
||||
#5L!!N#!169"A)%PYF'pbG#!f1%X!N"958e*$!*"!B!#3!e4&@&3$,Q*SF(0c!!!
|
||||
#R$J!N!J"U$h3!*!%!P0km!a#B@aXEfpZ)%KPE("36LK3!*!$!DJpd2q3!rd#8$F
|
||||
B!*!%9%9B9!)ZB`#3(3a09b"$,d-V+b!f1%X!N"G849K8"#jM+bX!N"X-69FJ3bp
|
||||
$+bXJ0MK,!*!A9%9B9!-ZBf-!N"`-69FJ3bp$+bXJ0MK,!*!A9%9B9!-ZBh!!N"`
|
||||
-69FJ3bp$+bXJ0MK,!*!A9%9B9!3ZBh"`!*!E$%eA)%-[3bXV)$Bi5`#3&e4&@&3
|
||||
%,Q9iF!#32e4&@&3#,QJ!N"d-69FJ3bp$+bXJ0MK,!*!6%!#3!e4&@&3#,R!!N"d
|
||||
069FJ8'&cBf&X)$Bi5`#3&P4&@&3%,R"KF`#3'`e09b"3BA0MB@`J0MK,!*!@9%9
|
||||
B9!3ZF'0S!*!E$%eA)%-[3bXV)$Bi5`#3%i!!N!0849K8"Lj`BfJV+`#3'3a09b"
|
||||
$,d-V+b!f1%X!N"1!!*!$9%9B9!)ZFJ#3(305CAS!N#"849K8"#jcC@HS2B!!!T`
|
||||
i9%9B9!)ZFQP`Fh-!!!+F1!#3#!'S2G!!N!3#8hV`!e*PHJ'S2F!"F4KJ!P"1+!#
|
||||
3"'4[Bh8!N%"J!*!$FR0bB`#33'!!N!0cD'aL!*!J$P"&4L"*EA"[FR3J0MK,!*!
|
||||
9Fh4eBJ#3)!j348BJ5@e`Eh*d)$Bi5`#3'33ZC'pM!*!l8!#3!a"AD@ic-L"i1$B
|
||||
J6'PZDf9b!*!`$94&@&3#,Q-!N"d-69FJ3bp$+bXJH$Jf!*!A9%9B9!3ZBbXV!*!
|
||||
E$%eA)%-[3bXV)(Ji0J#3&e4&@&3$,Q0`!*!F$%eA)%-[3bXV)(Ji0J#3&e4&@&3
|
||||
%,Q0`F!#3'`a09b"$,d-V+b"i1$B!N"G849K8!Lj`Ef0XpY!!"&(B!"8b-!!!"'X
|
||||
'h2E3!"6U)2rr")N069FJ8'&cBf&X)(Ji0J#3"JEFp`!!&1SJ"(ChX!#3"&4&@&3
|
||||
%,R"KFfcfd!!%8GJ!&6)`!!!%D`EFpY!!&1SJrrm%L3e09b"3BA0MB@`JH$Jf!*!
|
||||
'"Ych!!!8kL!%GRH`!*!%9%9B9!3ZF'0S!*!E$%eA)%-[3bXV)(Ji0J#3%i!!N!0
|
||||
849K8"Lj`BfJV+`#3'3a09b"$,d-V+b"i1$B!N"1!!*!$9%9B9!-ZFQ-!N"`)69F
|
||||
J9fPZ8N-!N"Y849K8"#jbCA13!`!!!T`i!*!)!DJpd!#3"!*6H[!09fPZ8Q9c)%P
|
||||
YF'pbG%iS8!#3!`'S2G$rN!2p!P!h'!#3#!3ZC'pM!*"$"#jXD@)!N"X16'PL)%P
|
||||
YF'pbG#"i1$B!N"N%,QpLDJ#3'`j2BQSJ5@e`Eh*d)(Ji0J#3&3P03b"-D@jVCA)
|
||||
!N$F63da98`!ZC'9QE+2!!!+F1!!@I$"SrrG!!IDM`!!@0#!!&NAm!*S"ai3iSr!
|
||||
!&ZlN!*!)!IDMm!!@0#!#@12X3!#3!de03dJ!N%4068a#!#jNEf0XSm!!!T`i!"C
|
||||
m-'Mrpd!"pU2!!"Bd)!!@4I`16'PL)%PYF'pbG#!f1%X!N!8"pU2`!"Bd)!*Be!J
|
||||
!N!408%a'!#jNEf0XSm!!!T`i!"Cm-'Mrpd!"pU2!!"Bd)!!@4I`16'PL)%PYF'p
|
||||
bG#!f1%X!N!8"pU2`!"Bd)!*Be!J!N!423NSJ!#jNEf0XSm!!!T`i!"Cm-'Mrpd!
|
||||
"pU2!!"Bd)!!@4I`169"A)%PYF'pbG#!f1%X!N!8"pU2`!"Bd)!*Be!J!N!4849K
|
||||
8!LjM!*!G#%e$)%-[3bXV!*!E9%9B9!3ZBbXVE+2!!!+F1!!@I$"SrrG!!IDM`!!
|
||||
@0#!!&NAm$%eA)%-[3bXV)$Bi5`#3"`(fSr!!&M3J!PM8#!#3"&4&@&3$,Q0M+fb
|
||||
M`!!#R$J!&R``D2rh3!(fSm!!&M3J!"C&r!a09b"$,d-V+b!f1%X!N!F"pU2`!"B
|
||||
d)!*Be!J!N!4849K8"#jME(-!N"X468-J3faKFh-J3fpYF'PXCA)!N!k!!*!$9%9
|
||||
B9!-ZBh!VE+2!!!+F1!!@I$"SrrG!!IDM`!!@0#!!&NAm$%eA)%-[3bXV)$Bi5`#
|
||||
3"`(fSr!!&M3J!PM8#!#3"&4&@&3%,Q0`F'bM`!!#R$J!&R``D2rh3!(fSm!!&M3
|
||||
J!"C&r!a09b"$,d-V+b!f1%X!N!F"pU2`!"Bd)!*Be!J!N!4849K8"#jNC@B!N$p
|
||||
849K8"#jNEf-!N$X3!*!$9%9B9!)ZD!#324!!N!0849K8!Lj`BfJV+m!!!T`i!"C
|
||||
m-'Mrpd!"pU2!!"Bd)!!@4I`069FJ8'&cBf&X)$Bi5`#3"J(fSr!!&M3J!PM8#!#
|
||||
3"&4&@&3%,R"KFbXV`!!#R$J!&R``D2rh3!(fSm!!&M3J!"C&r!e09b"3BA0MB@`
|
||||
J0MK,!*!'!IDMm!!@0#!#@03)!*!%9%9B9!3ZF'0S!*!E#%e$)%-[3bXV!*!AJ!#
|
||||
3!e4&@&3',R"MD#XV`!!#R$J!&R``D2rh3!(fSm!!&M3J!"C&r!a09b"$,d-V+b!
|
||||
f1%X!N!F"pU2`!"Bd)!*Be!L!!*!$9%9B9!-ZG(-!N%!,5Q&fB5"-D@jVCA)!N$8
|
||||
139"36!"cQk`"U$f!!!+F1!!@453!N!N@l%3!N"J"U$h!!*!%!P"1+'!!N!0"F("
|
||||
X!(1EV!'S2B!!!T`i!"C&*!#3#4EX4!#3'!'S2F!!N!3#8%iSB!#3!d0XFh-!,Q0
|
||||
XBA0c!!!#R$J!N!J"U$h3!*!%!P0km!G09b"+BACK!A%BB("36LKJ!*!$!DJpd2q
|
||||
3!rd#8$FB!*!%69G$4!"cQk`"U$f!!!+F1!!@453!N!N@l%3!N"J"U$h!!*!%!P"
|
||||
1+'!!N!058e*$!(1EV!'S2B!!!T`i!"C&*!#3#4EX4!#3'!'S2F!!N!3#8%iSB!#
|
||||
3!e4&@&3$,Q*S!*!&!T`i!*!)!DJpd!#3"!*6H[!-3Q&XE'p[EL")C@a`8%iSB!#
|
||||
3!`'S2G$rN!2p!P!h'!#3"&4&@&3&,QKdE@bM`!!#R$J!&R``D2rh3!(fSm!!&M3
|
||||
J!"C&r!#D!FH%1+2`!"EZj!!9Jm3!N!3"pU2`!"Bd)!*Biq`!N!4849K8"5jUBAC
|
||||
K!*!$!T`i!*!)!DJpd!#3"!*6H[!(69FJ5Q&fB3&a''"`8%iSB!#3!`'S2G$rN!2
|
||||
p!P!h'!#3"&4&@&3#,R*TF(0c!!!#R$J!N!J"U$h3!*!%!P0km!05CAT+BACK!A%
|
||||
BB("36LKJ!*!$!DJpd2q3!rd#8$FB!*!%@NP3)!!ZHQP`Fh-!!!+F1!#3#!'S2G!
|
||||
!N!3#8hV`"deA)%TKGQ%"F4KJF&"1+'!!N!-"U$h3rj!$r3*30aJ!N!4NEf0e!(1
|
||||
EV!'S2B!!!T`i!"C&*!#3#4EX4!#3'!'S2F!!N!3#8%iSB!#3!h*cFQ-!FjZX!DJ
|
||||
pJ!!#R$J!&N8N!*!*&Za%!*!B!DJp`!#3"!*36LKJ!*!("LjME'&cF`!!!T`i!*!
|
||||
)!DJpd!#3"!*6H[!(69FJ5Q&fB3&a''"`8%iSB!#3!`'S2G$rN!2p!P!h'!#3#!3
|
||||
ZHQP`Fh-!!!+F1!#3#!'S2G!!N!3#8hV`"deA)%TKGQ%"F4KJF&"1+'!!N!-"U$h
|
||||
3rj!$r3*30aJ!N!F'!!%"!*!&!RB!!3#3)3CKG'pdD@0YC3#30`%!!!%!!3!!!J%
|
||||
k!*$q!3!!!3%k!*$r!*!)&J!&!3#3"`%!N!N"!*!%#J!"!3!!!3%!!3#3"!i!"`%
|
||||
!!3%!!3%!N!-"!*!%aJ!(!!!&5P05C@BZF(*U3b"$,d-V+bke!*!Y2j!%39"36!!
|
||||
!!B"BJ!#33Mq3"!#3#98"N!!"#3*l!*!1!B!!N"%i!!N!!3#3"3Y0B@03FQ9QDAJ
|
||||
ZD'J!N#8-!!-!N!`"fJ!%!*!3!3#3r`#34&pIFh4KFR3!N(`"!*!$$!!"N!-!N!S
|
||||
"GJ!'!!!&B5jkDA!!N2m!N"pD59!J5N&@38T"9N%26@9dFQphCA*VFb"+BACK)&-
|
||||
L8L!T!6#`U!%`CN"96b"55'J!*#"65'J!*%)R(c`!!8kj!!!D"K!I5J"R)&92!*!
|
||||
&"!!#!*!&"!!$&,F!N!1+!!S!N!F+"8T68Q9Q,R"bDJ#3&JP+8e*PCLjcH@ejE3#
|
||||
3&!e6HA0dC@e$E'&cFf9c!*!5"N*eEQ4XC3#3($J!$3#3"`%!N#8"!*!&!3#3"3d
|
||||
!!J#3$K3!!`)"N!-!!3#3$`S!!C!$!!!"!3!"!*!$a!!'`!#339pIFh4KFR3!N(X
|
||||
"&J!'!*$r!*!BZJ!%!!!&5P05C@BZF(*UEfaP)&"33`#3$cq3"%&38%`!!!'!!!!
|
||||
"J!#3!d!!!&M!!*"K!6q3"!#3"e8"N!!"#3*l!*!0,J!#!*!$!J!#!*!S!J`!!J"
|
||||
3!!%!!3!"!!%!N2m!&#G$6d4&*b!R4%&835FJ*e"*3e3R!*$Y!N3!!J#3r`#3r`#
|
||||
34b3!!3#3*4)!!`%!!!-"!!%"!*!,NJ!%!!%!N%%#!!-!#J#343%"!*!%5J!"!!!
|
||||
&5P05C@BZF(*U3b"$,d-V+bke!*!13!#3"!3!N!3%!!!%!*!%"!"9!C!!!3N#H`#
|
||||
3$3`!"3%!N!a'C[83J$rP-M!!"!#3#,#9"ff`P3G[!*!3"A"MD'9Z!!-a,M-!#8T
|
||||
68Q9Q,R"bDJ#3#6MkZ`!$!*!$!3#3"!P+8e*PCLj`FQS!!c%Z-`#3!`-YDfm!N!`
|
||||
*ER-[DR-[FQ9Q!!!"!*!$0b%!!$BK!!!%*!-JCiJS#!#3!a`#*J!%F&CPFJ#3!bT
|
||||
`FQ9Q!#-!0P088L-!!!(QBfYTC!!!!I*YBhCc!!!"rJ#3$")'!"!!N!-'!*!%G5J
|
||||
!&`#3!cJ!N!4$V`!F!*!$KJ#3"$T5!#-!!!+D!*!%&Ii!-J!!!V)!N!42#`"#!!!
|
||||
#d!#3"'Kh!%m!!!I`!*!%6jF!9J!!*2)!N!42D3"M!!!Nr!#3"&jJ!'d!!#Gf!*!
|
||||
%$`B!H3!!*j!!!*!%HZ!!LJ!!*ji!N!3TZ!#9!!!RX!#3""dc!+%!!#Kk!*!%1"i
|
||||
!X!!!+,B!N!4Eh!#r!!!SaJ#3"&((!-B!!#UN!*!%$8F!d`!!+V3!N!3I%J$J!!!
|
||||
X,J#3"(Kr!2N!!#`f!*!%%Fi"#J!!,$i!N!3I(3%F!!!Xc!#3"!Nm!5`!!#d)!*!
|
||||
%DJi"2!!!,4N!N!3AQ!&)!!!Y-3#3"!IA!9N!!#dr!*!%@#B"C!!!,JF!N!44AJ&
|
||||
X!!![)3#3""4)!AJ!!#rI!*!%HXi"K3!!-"%!N!4$!J'5!!!b)3#3"%-Z!D8!!$4
|
||||
T!*!%1!8"Y!!!0*%!N!33N`(!!!!dT`#3"%Rc!FX!!$8p!*!&b2rr!!!eL`#3"!2
|
||||
`rrm!!!+8!*!&J!(A!!!eQ`#3"B!"jJ!!0H8$0Rq3!!p3FQpUC@0d)&CPFR0TEfi
|
||||
'4@4TG'pb"%C[ER3'4AKdFQ&c$P"bEfTPBh3J4AKdFQ&c$d0eFh4[E5",CAPhEh*
|
||||
NF`a"Bf0PFh-J8'&dD(-'9'&bCf9d$%*eD@aN)%9iG(*KF`P@3e-J8f9dGA!,0MK
|
||||
,)%0[C'9(C@i30MK,)%4TFf&cFf9YBQaPFJSf1%XJ6'PZDf9b#cBi5b"3FQpUC@0
|
||||
d$N-[3bXV)%0[EA"TE'9b$N-[3bXV)&GKFQjTEQGc"N0'66Bi5`a*8L"2F(4TE@P
|
||||
kCA)-5Q&fB5"3FQpUC@0d'%eKCfPM)%0KF#"$E'&cFb"$Efe`D@aPFK"0B@GTBb"
|
||||
$BA!J6'PZDf9b%8eKCfPM)%0KF#"3FQpUC@0d$e"KFf0KE#"$Efe`D@aPFJp3BA0
|
||||
MB@`J9f&bEQPZCh-,8&"$)%0[C'9(C@i38&"$)%4TFf&cFf9YBQaPFJT38%-J6'P
|
||||
ZDf9b"e"33b"348B,8&"$)&"bEfTPBh3-8&"$3A0Y)&"KEQ9X$&*PHL"$Efe`D@a
|
||||
PFK*8EfpX4R*[ER4&EQ3J8'&ZC@`19fPZ8N-J3fpYF'PXCA),H$Jf)%0[C'9(C@i
|
||||
+H$Jf)%aTEQYPFJYi1$BJ8(*[DQ9MG!j3FQpUC@0dEh)J4'&dB4G0B@0$9P-J9Q9
|
||||
bFfP[EL"5CA0[GA*MCI-6:
|
||||
BIN
mozilla/js/ref/JSRef.prj2
Normal file
BIN
mozilla/js/ref/JSRef.prj2
Normal file
Binary file not shown.
677
mozilla/js/ref/JSRef.prj2.hqx
Normal file
677
mozilla/js/ref/JSRef.prj2.hqx
Normal file
@@ -0,0 +1,677 @@
|
||||
(This file must be converted with BinHex 4.0)
|
||||
:#NT68Q9Q,R"bDM)!68e3FN0A588"!!!!I%i!!!)S)d4MEfpX!!!!!`!!!5J!!(A
|
||||
Q!!"h$J!!"8!!!!!i!3)"!!!!!!!!!!!!3fpNC9GKFR*TEh)J8(*[DQ9MG!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&!3$rr`!
|
||||
!!!!!!!!!rrm"!3%"!3!!!!!H!3%!!!!!!!!!!*QC!!!rrcrr2rm!!3!*"Ne[EQ&
|
||||
ME`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!#J!#J(#!S!!+!!+!F)#J!!
|
||||
!!!!!!!!!!!!!!!!!!!!"!!!&!!Y6D@e`E'8J3Q9PF!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!3Y6D@e`E'8
|
||||
J3Q9PF!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!"!%)#(J*T!ji!A3!",1X!!6B*5P05C@Bk4@4TG'pb!%T68Q9
|
||||
Q1NC[ER3!5P05C@Bk4AKdFQ&c!%T68Q9Q1P"bEfTPBh3J4AKdFQ&c!%T68Q9Q1N0
|
||||
eFh4[E5",CAPhEh*NF`"+8e*PCMT"Bf0PFh-J8'&dD(-!5P05C@Bk3R9TE'3J4AK
|
||||
dFQ&c!%T68Q9Q1MBi5b"$Ef4P4f9Z!%T68Q9Q1MBi5b"%DA0KFh0PE@*XCA)!5P0
|
||||
5C@Bk0MK,)%aTEQYPFJ"+8e*PCMSf1%XJ8(*[DQ9MG!"+8e*PCMT$,d-V+b"$Efe
|
||||
`D@aPFJ"+8e*PCMT$,d-V+b"ABA*ZD@jRF`"+8e*PCMT$4Ndf1%X!5P05C@Bk59)
|
||||
J6h"dD@eTHQ9b!%T68Q9Q1NTKGQ%J8(*[DQ9MG!"+8e*PCMT0B@GTBb"$BA!J3fa
|
||||
KFh-J3fpYF'PXCA)!5P05C@Bk6@&RD@-J3f&`)%aTEQYPFJ"+8e*PCMT0B@GTBb"
|
||||
$BA!J8(*[DQ9MG!"+8e*PCMT3BA0MB@`J3fpYF'PXCA)!5P05C@Bk8'&cBf&X)&G
|
||||
KFQjTEQGc!%T68Q9Q1P"33b"$Ef4P4f9Z!%T68Q9Q1P"33b"%DA0KFh0PE@*XCA)
|
||||
!5P05C@Bk8&"$)%aTEQYPFJ"+8e*PCMT38%-J8%9'!%T68Q9Q1P"33b"3FQpUC@0
|
||||
d!%T68Q9Q1P"33d&cE5"3B@jPE!"+8e*PCMT5CASJ3fpYF'PXCA)!5P05C@Bk9'p
|
||||
[E%CbEfjd4@jN)&"KEQ9X!%T68Q9Q1PGTEP*$)%0[EA"TE'9b!%T68Q9Q1RJi0L"
|
||||
$Ef4P4f9Z!%T68Q9Q1RJi0L"-D@jVCA)!5P05C@BkH$Jf)&"bEfTPBh3!5P05C@B
|
||||
k9'&bCf9d)&0PG(4TEQGc!%T68Q9Q1NCTE'8J6@&`F'PZCh-!8(*[DQ9MG#"'D@a
|
||||
P)%aTFh3!5P05C@Bk5Q&fB5"2GA4`GA3!5P05C@Bk5Q&fB5"@63"+8e*PCMT0B@0
|
||||
28b"0CA*RC5"3B@jPE!"+8e*PCMT+BACK)%aKEQGeB@GP!%T68Q9Q1NTKGQ&%Ef-
|
||||
J8(*[DQ9MG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!"!!!!!!!!!!d!!!!#!!!!!!!!!"J!!!!$!!!!!!!!!#8!!!!%!!!!!!!
|
||||
!!$S!!!!&!!!!!!!!!&!!!!!'!!!!!!!!!'-!!!!(!!!!!!!!!(B!!!!)!!!!!!!
|
||||
!!)J!!!!*!!!!!!!!!*m!!!!+!!!!!!!!!,!!!!!,!!!!!!!!!-)!!!!-!!!!!!!
|
||||
!!0F!!!!0!!!!!!!!!1`!!!!1!!!!!!!!!2N!!!!2!!!!!!!!!3`!!!!3!!!!!!!
|
||||
!!4m!!!!4!!!!!!!!!6i!!!!5!!!!!!!!!98!!!!6!!!!!!!!!@d!!!!8!!!!!!!
|
||||
!!B-!!!!9!!!!!!!!!CN!!!!@!!!!!!!!!DX!!!!A!!!!!!!!!F)!!!!B!!!!!!!
|
||||
!!G-!!!!C!!!!!!!!!H%!!!!D!!!!!!!!!I-!!!!E!!!!!!!!!JB!!!!F!!!!!!!
|
||||
!!KN!!!!G!!!!!!!!!M)!!!!H!!!!!!!!!NF!!!!I!!!!!!!!!PN!!!!J!!!!!!!
|
||||
!!QS!!!!K!!!!!!!!!R`!!!!L!!!!!!!!!T)!!!!M!!!!!!!!!UB!!!!N!!!!!!!
|
||||
!!VJ!!!!P!!!!!!!!!XS!!!!Q!!!!!!!!!YJ!!!!R!!!!!!!!![!!!!!S!!!!!!!
|
||||
!!`3!!!!T!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!F!!!!)!!!!#3!!!!S!!!!&!!!!"J!!!!X!!!!-!!!!$3!!!!3!!!!!!!!!!J!
|
||||
!!#)!!!!"!!!!$J!!!#F!!!!N!!!!$`!!!#8!!!!S!!!!*J!!!"!!!!!4!!!!%J!
|
||||
!!"-!!!!8!!!!&3!!!"B!!!!A!!!!'!!!!"N!!!!D!!!!!`!!!"X!!!!K!!!!(!!
|
||||
!!"d!!!!H!!!!(`!!!#!!!!!M!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!S!!!!!`!!!#-!!!!"!!!!+J!!!#8!!!!+!!!!"!!
|
||||
!!!8!!!!'!!!!"`!!!!J!!!!*!!!!#`!!!!`!!!!0!!!!$J!!!!m!!!!3!!!!%3!
|
||||
!!")!!!!6!!!!&!!!!"8!!!!!!!!!&J!!!"F!!!!B!!!!'3!!!"S!!!!e!!!!+3!
|
||||
!!!)!!!!Q!!!!-J!!!$%!!!!d!!!!-`!!!#X!!!!X!!!!*`!!!$!!!!!Z!!!!'`!
|
||||
!!"`!!!!G!!!!(J!!!"m!!!!J!!!!)3!!!#)!!!!Y!!!!*!!!!#m!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-!!(rr!!!!!(rr!!!!!(r
|
||||
r!!!!!(rr!!!!"!%"!!%!"J%!!!!!!!!!!3!!!!!!!!!!!!%!!!!!!3%!!!%"!!%
|
||||
!!!F"!!%"!!%"!!!!!3!!#`!"!!!!!!!,6@&M8(*PCQPi,QKS!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-"!3%"!!%!!3%!!!%"!3!!!!!!!!!
|
||||
!!!)!!!!!!!!!!!!!!!!$!J%"!3!"!!!!!!!!!!!!!!!!!!%"!3!!!3%!!8m!!!!
|
||||
#!!!!!a5h!!S!!!!!!!!!#J9+8e*PCLj`FQS!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!#8T68Q9Q,R0jEAPY!!!!!!!!!!!!!!!!!!!!!!!!!!!08hPcG'9Y3faKFh0PF`!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!C#G@jNE'8!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!5P05C@B!38j655"-D@*bBA*TCA-!6@&M)%aTBR*KFQPPF`""6P0*)%-V+bj38%-
|
||||
Z6'PL!'TcBA"T,Q-!DR0KFR*KH5jM!'TcBA4[E5jM!'TcBQp[E#jM!'TcBfjdH(3
|
||||
ZB`"UFf4KG'8ZB`"UFbjM!'TcC'*RBA"T,Q-!DR0PE@Pd,Q-!DR0QG@iZB`"UFfG
|
||||
M,Q-!DR0TER4PFR!ZB`"UFfa[BfXZB`"UFfeKG'JZB`"UFfjeE5jM!'TcEf*U,Q-
|
||||
!DR0[F'0[C'8ZB`"UFh"KFR0P,Q-!DR0bC@GPH(!ZB`"UFh0MB@iZB`"UFh0MEh"
|
||||
P,Q-!DR0cBh*TF(3ZB`"UFh0dFLjM!("bBA*PEQ%ZB`"`FQ&cFf9bG#jM!("bC(4
|
||||
[B5jM!("bD'&cD#jM!("bE'pR-LjM!("bE'pZCbjM!("bF(*TER4Q,Q-!F(*dD@e
|
||||
P,Q-!38j655"$,P"33bj-D@)!8dP299JZ8&"$,NaTBJ"*ER4PFQCKBf9-D@)!6@&
|
||||
dD%aTBJ"09d05G@jdD@eP,NaTBJ!k5P05C@B!6'PL)%PYF'pbG#"38%-!3Q&XE'p
|
||||
[EL")C@a`!%eA)%-[3bXV)&"33`"09b"3BA0MB@`J8&"$!&*PHJ"38%0"Ffd!@%0
|
||||
24NBJ5@e`Eh*d)&"33`"348BJ5@e`Eh*d)&"33`"08d`J3bj38%-Z6'PL!%e66#"
|
||||
$+bXZ8&"$,NaTBJ"08d`J8dP299JZ8&"$,NaTBJ"08d`J8R9ZG'PYC9"33bj-D@)
|
||||
!DR0iC(*KF'NZB`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!!!!B!!!!#!!!!!!!!!"8!!!!
|
||||
$!!!!!!!!!#-!!!!%!!!!!!!!!$3!!!!&!!!!!!!!!$`!!!!'!!!!!!!!!%B!!!!
|
||||
(!!!!!!!!!%m!!!!)!!!!!!!!!&J!!!!*!!!!!!!!!')!!!!+!!!!!!!!!'X!!!!
|
||||
,!!!!!!!!!(!!!!!-!!!!!!!!!(X!!!!0!!!!!!!!!)3!!!!1!!!!!!!!!)`!!!!
|
||||
2!!!!!!!!!*-!!!!3!!!!!!!!!*i!!!!4!!!!!!!!!+F!!!!5!!!!!!!!!,!!!!!
|
||||
6!!!!!!!!!,J!!!!8!!!!!!!!!-!!!!!9!!!!!!!!!-X!!!!@!!!!!!!!!08!!!!
|
||||
A!!!!!!!!!1!!!!!B!!!!!!!!!1N!!!!C!!!!!!!!!2-!!!!D!!!!!!!!!2i!!!!
|
||||
E!!!!!!!!!3B!!!!F!!!!!!!!!4!!!!!G!!!!!!!!!4X!!!!H!!!!!!!!!53!!!!
|
||||
I!!!!!!!!!5d!!!!J!!!!!!!!!6B!!!!K!!!!!!!!!6m!!!!L!!!!!!!!!8S!!!!
|
||||
M!!!!!!!!!9-!!!!N!!!!!!!!!@)!!!!P!!!!!!!!!A!!!!!Q!!!!!!!!!Ad!!!!
|
||||
R!!!!!!!!!B8!!!!S!!!!!!!!!C3!!!!T!!!!!!!!!CX!!!!U!!!!!!!!!DS!!!!
|
||||
V!!!!!!!!!EF!!!!X!!!!!!!!!F3!!!!Y!!!!!!!!!G)!!!!Z!!!!!!!!!GB!!!!
|
||||
[!!!!!!!!!Gd!!!!`!!!!!!!!!Hi!!!!a!!!!!!!!!Id!!!!b!!!!!!!!!JX!!!!
|
||||
c!!!!!!!!!KX!!!!d!!!!!!!!!Ld!!!!e!!!!!!!!!N!!!!!f!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!)!!!!!3!'!!!!"!3!!!N!!3!"1J!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!rrrrr`!!!!)!!J!"1NePG(*[Gf9bDh-
|
||||
J8h4KEQ4KFQ3J6'PLFQ&bH6T08d`J3cT#D@ik!()k6@9dFQphCA*VFb"6G'&ZC'&
|
||||
bC#"-D@*bBA*j1Ne66#"$1N*TEMS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!rrrrr`!!!!-!!J!"1NePG(*[Gf9bDh-
|
||||
J8h4KEQ4KFQ3J6'PLFQ&bH6T08d`J3bXV1N*TEMS!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!rrrrr`3!!!F!!J!"1NePG(*[Gf9bDh-
|
||||
J8h4KEQ4KFQ3J6'PLFQ&bH6T08d`J3cT08d`J3fpYE@pZ1P"eBQaTBb"*EQ0XG@4
|
||||
PFcS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!rrrrr`3!!!8!!J!"1NeKBdp6)&0eF("
|
||||
[FR3k6@&M5'9KC'9bFcS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!rrrrrd!!!!)!!J!"1NeKBdp6)&0eF("
|
||||
[FR3k6'PLFQ&bD@9c1J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!rrrrrd!!!!-!!J!"1NeKBdp6)&0eF("
|
||||
[FR3k5'9KC'9bFcS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!rrrrr`3!!!J!#!!!"8T68Q9Q,R"bDN-
|
||||
J3bp$+bXZY3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!$mr2cp"8&"-!!!"J&L!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2cmr2`!!!!!!!!!
|
||||
!!&8"N!!"#3*l!!!!!!!!!!!!!!!!!!!"J!!!!!!!!!!!!!!!!!!!!!3!!!!!!!!
|
||||
!!!!!!!!!!!!!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Aep
|
||||
cG'&bG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!J!!!"K,RTTF!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"D59!J5N&
|
||||
@38T"9N%26@9dFQphCA*VFb"+BACK)&-L8L!T!6#`U!%`CN"96b"55'J!*#"65'J
|
||||
!*%)R(c`!!8kj!!!D"K!I5J"R)&92!!!!!%MR'#!NEJ!)"B-0J!!!!!!!!!,3"B-
|
||||
EN!!!!!%!!!")+3!!4bN&J`R3"8PAZ#%1!!!!(!0k!"YSC'aR!!!!iP088L-!!`$
|
||||
Z689193!"!4j8BA*R!!!"0N019%`!!J&#C'0dBJ!!!@CTBf`d!!!"FQPME$J!!!&
|
||||
q5801)`!!!BTTBh-M!!!"PQPMFc3!!%T"9N%26@9dFQphCA*VFb"+BACKE@3!!3(
|
||||
HD@0dBJ!!!IC%594-!!!#!N4-4eJ!!!)14%a24`!!!KT38'pL!!!#*P*T!%`!!!)
|
||||
b9%e36!!!!Mj`FQ9Q!!!#5Q&PG'8!!!*@8e45)!!!!Q*8H(4b!!m#ENCXB@F!!!-
|
||||
ZGQ9bF`!"!cT%FQp`!!!$8J#!rrmJ!!!!!!!!!'KN!!!J!!&+!!!!!!%Xrrm!!!4
|
||||
c!!!!!!%Z!$NJ!!5k!!!!!!%Y!%B!!!6a!!!!!!4S!"8!!!1q!!!!!!4T!#)!!!3
|
||||
G!!!!!!#!!#`!!!4K!!!!!!4TrrmJ!!8E!!!!!!4UrrmJ!!8l!!!!!!4VrrmJ!!9
|
||||
F!!!!!!#!rrm!!!@-!!!!!!#!!&%!!!A!!!!!!!#!!'S!!!I%!!!!!!#!!)-!!![
|
||||
)!!!!!!#!!*!!!!!-c!!!!!!!J!#T!!!0%!!!!!!!J!$#!!!0P!!!!!!%DIrr!!!
|
||||
1Q!!!!!!%D[rr!!!1a!!!!!!%Drrr!!!1m!!!!!!%DIrr!!!2(!!!!!!%D2rr!!!
|
||||
2,J!!!!!!J2rr!!!24!!!!!!!J!$E)!!2I!!!!!!!J2rr!!!3MJ!!!!!!J!$P)!!
|
||||
4J!!!!!!!J!$i!!!4Y!!!!!!!J!%#!!!CV!!!!!!!J!%-)!!C[J!!!!!!J!%4!!!
|
||||
DE3!!!!!!!!%H!!!HZJ!!!!!!J!%Q!!!K5J!!!!!!JJ%i)!!K@J!!!!!!K!&-)!!
|
||||
KE`!!!!!!K3&G)!!KK!!!!!!!KJ&h)!!KQ3!!!!![#R9+593!aqIJ!!!!!!!!!3!
|
||||
%ar"!!!!"!!!!1dJ!!$T)"-INm!5bpX!UQJ!!!"`"5J!,689193!#!'*8BA*R!!!
|
||||
!KP088L-!!J#58&"[BJ!!!,C5D@4-!!!!`Q&PG'8!!!$18e45)!!!!0T'E'&R!!!
|
||||
!jP408%`!!!$bF(*PCJ!!!2jfCA*c!!%"#N4bEh!!!!%L"'J!!!!!!!!!!!!!"'N
|
||||
!$3!!!&m!!!!!"'S!&`!!!+-!!!!!!)!!'`!!!2J!!!!!!5crr`!!!3S!!!!!!5i
|
||||
!+#!!!9%!!!!!!5d!03!!!BJ!!!!!!)!!3!!!!E)!!!!!!)!!5J!!#ki!!!!!!!!
|
||||
!9!!!!!i!!!!!!!!!!3!!!!!+99"*,R"bC@CTH!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!"!!!!!!!"!!%!"`%"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&pIFh4KAepcG'&bG!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!F!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!"3!!"8T68Q9Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!r2cmr39"
|
||||
36!!!!B!!!!'!!!!!3!!!@-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!6mr2cm!!!!!!!!!!J!!!!)!!J!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+3!!!%!!!!-D!!!%!!!!!#N
|
||||
!rhrrIrprrhrrIrprrhrrIrprr`!#!!!25Q&fB80XBA0cCA-ZDQ&b!!!!!!!!!!!
|
||||
!!!!!!!!!!&T*8#"09eT3!!!!!!!$!!%!!!P0CA*RC5"2GA3!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!r2cmr39"
|
||||
36!!"!3!!"%4-4eKMDfPN8(*[DPG68%-!!!!Q!!!!43%!!!!"!!!U!!!!0J!!!%!
|
||||
!!!*,!!!%!!!!!$B!4%&835FJ*e"*3e3R!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!3!!!`%!!!!
|
||||
!"!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!-!#J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%
|
||||
"!!!"!!!&5P05C@BZF(*U3b"$,d-V+bke!!!!!!!!!!!!!!!!!!"!!!!!!!3!!!!
|
||||
!"!!!"!!!!!!%!&8"N!!"#3*l!!!!!!!!!!!!!!!'!!!25Q&fB80XBA0cCA-ZHQP
|
||||
`!!!!!!!!!!!!!!!!!!!!!&T*8#"+39C"!!!!!3!!!3!!!J%!!!-"!!!%!3!!"3%
|
||||
!!!B"!!!(!3!!#!%!!!N"!!!+!3!!#`%!!!`"!!!0!3!!$J%!!!m"!!!3!3!!%3%
|
||||
!!")"!!!6!3!!&!%!!"8"!!!@!3!!&`%!!"J"!!!U!3!!'3%!!"S"!!!E!3!!(!%
|
||||
!!"d"!!!H!3!!(`%!!#!"!!!Q!3!!*`%!!#J"!!!M!3!!*!%!!#N!!!!"!!!!!3%
|
||||
!!!)!!!!!!!!!!!!%!!%!!!!TX5aeU!!!,[i!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!3!!!!)!!!!$!!!!"!!!!!8!!!!'!!!!"`!!!!J!!!!*!!!!#J!
|
||||
!!!X!!!!-!!!!$3!!!!i!!!!2!!!!%!!!!"%!!!!5!!!!%`!!!"3!!!!9!!!!&J!
|
||||
!!"F!!!!B!!!!'3!!!"S!!!!E!!!!(!!!!"d!!!!H!!!!(`!!!#!!!!!K!!!!)J!
|
||||
!!#-!!!!N!!!!*3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!!!!!!!!!!!
|
||||
#!!%!+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!&!!!3!"!!%!!3!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!8*d024%8R)#G%394"*b!R8%P$9#F!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(!!"0B@028b"38%-J6'PZDf9
|
||||
b!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"+8e*PCJ!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!%!!6S!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!!)!!!!
|
||||
&!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!"!!!$!!!!"J)"!!!!!!!
|
||||
"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!3!!"!!!!!F#!3!!!!!!!3!"!3!!!!!
|
||||
!!!!!!!!!!!%!!!!!!!!!!!%!!!8!!!!)!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
|
||||
"!!!!!!!!!!!"!!!'!!!!#3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
|
||||
!!3!!"`!!!!S#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!%!!!J!!!!
|
||||
,!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!"!!!*!!!!$!)"!!!!!!!
|
||||
"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!3!!#J!!!!d#!3!!!!!!!3!"!3!!!!!
|
||||
!!!!!!!!!!!%!!!!!!!!!!!%!!!X!!!!1!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
|
||||
"!!!!!!!!!!!"!!!-!!!!$`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
|
||||
!!3!!$3!!!"!#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!%!!!i!!!!
|
||||
4!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!"!!!2!!!!%J)"!!!!!!!
|
||||
"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!3!!%!!!!"-#!3!!!!!!!3!"!3!!!!!
|
||||
!!!!!!!!!!!%!!!!!!!!!!!%!!"%!!!!8!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
|
||||
"!!!!!!!!!!!"!!!5!!!!&3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
|
||||
!!3!!%`!!!"B#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!%!!"3!!!!
|
||||
A!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!"!!!9!!!!'!)"!!!!!!!
|
||||
"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!3!!&J!!!"N#!3!!!!!!!3!"!3!!!!!
|
||||
!!!!!!!!!!!%!!!!!!!!!!!%!!"F!!!!D!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
|
||||
"!!!!!!!!!!!"!!!B!!!!'`)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
|
||||
!!3!!'3!!!"`#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!%!!"S!!!!
|
||||
G!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!"!!!E!!!!(J)"!!!!!!!
|
||||
"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!3!!(!!!!"m#!3!!!!!!!3!"!3!!!!!
|
||||
!!!!!!!!!!!%!!!!!!!!!!!%!!"d!!!!J!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!
|
||||
"!!!!!!!!!!!"!!!H!!!!)3)"!!!!!!!"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!
|
||||
!!3!!(`!!!#)#!3!!!!!!!3!"!3!!!!!!!!!!!!!!!!%!!!!!!!!!!!%!!#!!!!!
|
||||
M!J%!!!!!!!%!!3%!!!!!!!!!!!!!!!!"!!!!!!!!!!!"!!!M!!!!*J)"!!!!!!!
|
||||
"!!%$!!!!!!!!!!!!!!!!!3!!!!!!!!!!!3!!*!!!!#F#!3!!!!!!!3!"!`!!!!!
|
||||
!!!!!!!!!!!%!!!!!!!!!!!%!!#B!!!!b!J%!!!!!!!%!!3-!!!!!!!!!!!!!!!!
|
||||
"!!!!!!!!!!!"!!!R!!!!-`)"!!!!!!!"!!%$!!!!!!!!!!!!!!!!!3!!!!!!!!!
|
||||
!!3!!+!!!!$3#!3!!!!!!!3!"!`!!!!!!!!!!!!!!!!%!!!!!!!!!!!%!!#N!!!!
|
||||
e!J%!!!!!!!%!!3-!!!!!!!!!!!!!!!!"!!!!!!!!!!!"!!!U!!!!0J)"!!!!!!!
|
||||
"!!%"!!!!!!!!!!!!!!!!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!-!!!!)!!!!!`!!!!La,(ADrrqFN`!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!K0B@028b"38%-J6'PZDf9b!!!!!!!
|
||||
!!!!!!!!!!!!!!!!D39"36!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!3A"`E!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!"J!!!!68e-3J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!6'PL)%PYF'pbG#"38%-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69"-4J!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!6'PL)%PYF'pbG#"38%-!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!69G$4!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!8P053`!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!"J!!!!9%9B9#jLD!"`Fh-!!!+F1!!!!!!!!!!!!DJpd!!!!!!#8hV
|
||||
`3Q&XE'p[EL")C@a`!&"1+&!!!!!"U$h3rrrrr3*30aJ!!!!!9%9B9#jM!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ8&"$!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!9%9B9#jM+bX!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!69FJ3bp$+bXJ8&"$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jMB`!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ8&"$!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!9%9B9#jMF!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!69FJ3bp$+bXJ8&"$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jMF(!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ8&"$!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!9%9B9#jPH(!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jS!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ8&"$!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!3!!!!9%9B9#j`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!69FJ8'&cBf&X)&"33`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#j`BA-!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ8'&cBf&X)&"33`!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!9%9B9#j`BfJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!69FJ3bp$+bXJ8&"$!!!!!!!!!!!!!!!!!!!!!!!!!!#!!!!!9%9B9#j`BfJV+`!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ3bp$+bXJ8&"$!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!#!!!!!9%9B9#jb!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!8Q9k!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#jc!'K`Fh-
|
||||
!!!+F1!!!!!!!!!!!!DJpd!!!!!!#8hV`8&"$3A0Y!'i"F4KJF&"1+&!!!!!"U$h
|
||||
3rrrrr3*30aJ!!!!!@%024J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!@%024NBJ5@e`Eh*d)&"33`!!!!!!!!!!!!!!!!!!!!!!!!!!C'pMG3!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!"J!!!!FR0bB`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!FfKXBJ!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8%9')%PYF'pbG#"38%-!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!Fh4eBJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!8%9')%PYF'pbG#"38%-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#jNEf-!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!"3!!!!6@&M6e-J0MK,)%aTEQYPFJ!!!!!!!!!!!!!!!!!!!!!!'N&
|
||||
38%`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!B!!!!%&`F'`!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!B!!!!%e
|
||||
06%)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%aTBL"*EA"[FR3J0MK
|
||||
,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%e36%B!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!%aTBL"*EA"[FR3J0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%e
|
||||
A3d3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!B!!!!%p#5L!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!%e39b"*EA"[FR3J0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&*
|
||||
68N-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!B!!!!&4&@&3ZBQJ!F(0c!!!#R$J!!!!!!!!!!!'
|
||||
S2G!!!!!!!P0km%*KE'a[EfiJ5'9XF!"36LK3!!!!!DJpd2rrrrd#8$FB!!!!!&4
|
||||
&@&3ZB`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)%-[3bXV)$Bi5`!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZBbXV!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!%eA)%-[3bXV)$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4
|
||||
&@&3ZBf-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)%-[3bXV)$Bi5`!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZBh!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!%eA)%-[3bXV)$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4
|
||||
&@&3ZBh"`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)%-[3bXV)$Bi5`!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZCAK`!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4
|
||||
&@&3ZD!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)%-[3bXV)$Bi5`!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!%!!!!&4&@&3ZF!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!%eA)&"KFf0KE#!f1%X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4
|
||||
&@&3ZF'&c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)&"KFf0KE#!f1%X
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4&@&3ZF'0S!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!%eA)%-[3bXV)$Bi5`!!!!!!!!!!!!!!!!!!!!!!!!!!J!!!!&4
|
||||
&@&3ZF'0S+bX!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)%-[3bXV)$Bi5`!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!J!!!!&4&@&3ZFJ!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!&*PHJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&4
|
||||
&@&3ZFf9R!+JpJ!!#R$K849K8!LjbDA"cF`!!!T`i!!!!!!!!!!!"U$h3!!!!!!*
|
||||
6H[!$8Q9k!DJp`!&a''!#8%iS!!!!!'4[Bh8!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!B!!!!(*
|
||||
cFQ-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!B!!!!(0SE')!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!&"&4L"*EA"[FR3J0MK,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(0
|
||||
dG@)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&"&4L"*EA"[FR3J0MK
|
||||
,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!ZC'pM!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8!!!!&G
|
||||
TEM-b)(Ji0L"-D@jVCA)!!!!!!!!!!!!!!!!!!!!!!!e849K8,Q-!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!"09b"$,d-V+b"i1$B!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!"849K8,Q-V+`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"09b"
|
||||
$,d-V+b"i1$B!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"849K8,Q0`!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!"09b"$,d-V+b"i1$B!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!"849K8,Q0`F!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"09b"
|
||||
$,d-V+b"i1$B!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"849K8,R!!Ef0XpY!!"&(
|
||||
B!"8b-!!!"'X'h2E3!"6U)2rr")P09b"3BA0MB@`JH$Jf!!!!!!!!!!EFp`!!&1S
|
||||
J"(ChX!!!!!"849K8,R"KF`"XpY!!"&(B!"8b-!!!"'X'h2E3!"6U)2rr")P09b"
|
||||
3BA0MB@`JH$Jf!!!!!!!!!!EFp`!!&1SJ"(ChX!!!!!"849K8,R"MD!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!"09b"$,d-V+b"i1$B!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!)!!!!"849K8,R"MD#XV!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"09b"
|
||||
$,d-V+b"i1$B!!!!!!!!!!!!!!!!!!!!!!!!!!)!!!!"849K8,R*M!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!"09b"AD@j53`!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!"849K8,R*PF`"cF`!!!T`i!!!!!!!!!!!"U$h3!!!!!!*6H["AD@j
|
||||
5CA-J5@e`Eh*d!%iS8!!!!!'S2G$rrrrp!P!h'!!!!!!!!!!!,Q4[B`!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!,QaTBJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"-D@)
|
||||
J5@e`Eh*d)(Ji0J!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,QpLDJ!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!"2BQSJ5@e`Eh*d)(Ji0J!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!"03b"-D@jVCA)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!63da98`!
|
||||
ZC'9QE+2!!!+F1!!@I$"SrrG!!IDM`!!@0#!!&NAm!*S"ai3iSr!!&ZlN!!!!!!!
|
||||
!!!!"pU2`!"Bd)!*Biqa!!!!!68e$5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!68e-3J!
|
||||
ZC'pME+2!!!+F1!!@I$"SrrG!!IDM`!!@0#!!&NAm6'PL)%PYF'pbG#!f1%X!!!!
|
||||
!!!!"pU2`!"Bd)!*Be!J!!!!!69"-4J!ZC'pME+2!!!+F1!!@I$"SrrG!!IDM`!!
|
||||
@0#!!&NAm6'PL)%PYF'pbG#!f1%X!!!!!!!!"pU2`!"Bd)!*Be!J!!!!!6d*+)!!
|
||||
ZC'pME+2!!!+F1!!@I$"SrrG!!IDM`!!@0#!!&NAm69"A)%PYF'pbG#!f1%X!!!!
|
||||
!!!!"pU2`!"Bd)!*Be!J!!!!!9%9B9#jM!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!68-J3bp$+bX!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#j
|
||||
M+bX!E+2!!!+F1!!@I$"SrrG!!IDM`!!@0#!!&NAm69FJ3bp$+bXJ0MK,!!!!!!!
|
||||
!!!!"pU2`!"Bd)!*Be!J!!!!!9%9B9#jMB`!VE+2!!!+F1!!@I$"SrrG!!IDM`!!
|
||||
@0#!!&NAm69FJ3bp$+bXJ0MK,!!!!!!!!!!!"pU2`!"Bd)!*Be!J!!!!!9%9B9#j
|
||||
ME(-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!68-J3faKFh-J3fpYF'PXCA)
|
||||
!!!!!!!!!!!!!!!!!!!#!!!!!9%9B9#jMF!!VE+2!!!+F1!!@I$"SrrG!!IDM`!!
|
||||
@0#!!&NAm69FJ3bp$+bXJ0MK,!!!!!!!!!!!"pU2`!"Bd)!*Be!J!!!!!9%9B9#j
|
||||
MF(!!E+2!!!+F1!!@I$"SrrG!!IDM`!!@0#!!&NAm69FJ3bp$+bXJ0MK,!!!!!!!
|
||||
!!!!"pU2`!"Bd)!*Be!J!!!!!9%9B9#jNC@B!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!9%9B9#j
|
||||
NEf-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!3!!!!9%9B9#jS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!!9%9B9#j
|
||||
`!'0S+b[!!!+F1!!@I$"SrrG!!IDM`!!@0#!!&NAm69FJ8'&cBf&X)$Bi5`!!!!!
|
||||
!!!!"pU2`!"Bd)!*Be!J!!!!!9%9B9#j`BA-!+b[!!!+F1!!@I$"SrrG!!IDM`!!
|
||||
@0#!!&NAm69FJ8'&cBf&X)$Bi5`!!!!!!!!!"pU2`!"Bd)!*Be!J!!!!!9%9B9#j
|
||||
`BfJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!68-J3bp$+bX!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!#!!!!!9%9B9#j`BfJV+`$!!!+F1!!@I$"SrrG!!IDM`!!
|
||||
@0#!!&NAm69FJ3bp$+bXJ0MK,!!!!!!!!!!!"pU2`!"Bd)!*Be!L!!!!!9%9B9#j
|
||||
dF`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!5Q&fB5"-D@jVCA)!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!$N&38%`!FjZX!DJpJ!!#R$J!&N8N!!!!!!!!!!!!&Za%!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!DJp`!!!!!!#8%iSB!!!!%&`F'`!FjZX!DJpJ!!#R$J!&N8
|
||||
N!!!!!!!!!!!!&Za%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!DJp`!!!!!!#8%i
|
||||
SB!!!!%0XFh-!,Q0XBA0c!!!#R$J!!!!!!!!!!!'S2G!!!!!!!P0km%eA)%TKGQ%
|
||||
!!A%BB("36LKJ!!!!!DJpd2rrrrd#8$FB!!!!!%eA3d3!FjZX!DJpJ!!#R$J!&N8
|
||||
N!!!!!!!!!!!!&Za%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!DJp`!!!!!!#8%i
|
||||
SB!!!!&*68N-!FjZX!DJpJ!!#R$J!&N8N!!!!!!!!!!!!&Za%!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!DJp`!!!!!!#8%iSB!!!!&4&@&3ZBQJ!!!!!!!!#R$J!!!!
|
||||
!!!!!!!'S2G!!!!!!!P0km%*KE'a[EfiJ5'9XF!"36LKJ!!!!!DJpd2rrrrd#8$F
|
||||
B!!!!!&4&@&3ZD(4YE!#M`!!#R$J!&R``D2rh3!(fSm!!&M3J!"C&r!#D!FH%1+2
|
||||
`!"EZj!!9Jm3!!!!!!IDMm!!@0#!#@12X!!!!!&4&@&3ZDQ&fB3!!!!!#R$J!!!!
|
||||
!!!!!!!'S2G!!!!!!!P0km%eA)%TKGQ%!!A%BB("36LKJ!!!!!DJpd2rrrrd#8$F
|
||||
B!!!!!&4&@&3ZFJ"TF(0c!!!#R$J!!!!!!!!!!!'S2G!!!!!!!P0km&*PHJ"+BAC
|
||||
K!A%BB("36LKJ!!!!!DJpd2rrrrd#8$FB!!!!!&T*8#!!,RTTF(0c!!!#R$J!!!!
|
||||
!!!!!!!'S2G!!!!!!!P0km%eA)%TKGQ%!!A%BB("36LKJ!!!!!DJpd2rrrrd#8$F
|
||||
B!!!!!'4[Bh8!FjZX!DJpJ!!#R$J!&N8N!!!!!!!!!!!!&Za%!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!DJp`!!!!!!#8%iSB!!!!(*cFQ-!FjZX!DJpJ!!#R$J!&N8
|
||||
N!!!!!!!!!!!!&Za%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!DJp`!!!!!!#8%i
|
||||
SB!!!!!!!!!!ZBfaKFh-!!!!#R$J!!!!!!!!!!!'S2G!!!!!!!P0km%eA)%TKGQ%
|
||||
!!A%BB("36LKJ!!!!!DJpd2rrrrd#8$FB!!!!!!!!!!!ZHQP`!(0c!!!#R$J!!!!
|
||||
!!!!!!!'S2G!!!!!!!P0km%eA)%TKGQ%!!A%BB("36LKJ!!!!!DJpd2rrrrd#8$F
|
||||
B!!!!!%j[EQ8!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&069"b!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!%!!!!"0B@028b"0CA*RC3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
(39"36!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!3A"`E!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!
|
||||
!8P053`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!!9%9B9#jLD!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!3Q&XE'p[EL")C@a`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!9%9B9#jb!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!8Q9k!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!FR0bB`!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"J!!!
|
||||
!FfKXBJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!69FJ5Q&fB84[Bb"-D@jVCA)!!!!!!!!
|
||||
!!!!!!!!!!!!!$%02M'X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%e
|
||||
A)%TKGQ&%Ef-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%0XFh-!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)%TKGQ&%Ef-!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!&*68N-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&*
|
||||
PHJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!B!!!!&4&@&3ZBQJ!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%*KE'a[EfiJ5'9XF!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!&4&@&3ZD(4YE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!!!&4&@&3ZDQ&fB3!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)%TKGQ&%Ef-!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!&4&@&3ZFJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&*
|
||||
PHJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&T*8#!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)%TKGQ&%Ef-!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!3!!!!&TTF%B!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%e
|
||||
A)%TKGQ&%Ef-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(*cFQ-!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&*PHJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!B!!!!!!!!!!ZBfaKFh-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%e
|
||||
A)%TKGQ&%Ef-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!ZHQP`!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%eA)%TKGQ&%Ef-!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!"!!!!!e*26e3!!!!!!!!!!!!!!!!$4e*98!!!!!!!!!!$#NT
|
||||
KGQ&6Bh*TF(3!!!!J4NP-43%!!!*'58a&!3!!!dC*6%8"!!!%4NP-43%!!!9'58a
|
||||
&!3!!"NC*6%8"!!!(4NP-43%!!!K'58a&!3!!#8C*6%8"!!!+4NP-43%!!!Y'58a
|
||||
&!3!!$%C*6%8"!!!04NP-43%!!!j'58a&!3!!$dC*6%8"!!!34NP-43%!!"&'58a
|
||||
&!3!!%NC*6%8"!!!64NP-43%!!"4'58a&!3!!&8C*6%8"!!!@4NP-43%!!"G'58a
|
||||
&!3!!'%C*6%8"!!!U4NP-43%!!"P'58a&!3!!'NC*6%8"!!!E4NP-43%!!"a'58a
|
||||
&!3!!(8C*6%8"!!!H4NP-43%!!"p'58a&!3!!)%G599!!!!!!!!!!!3j"6P0*)%a
|
||||
TBR*KFQPPF`!!!!0'58a&!3!!*NC*6%8"!!!R4NP-43%!!#K(8P93!!!!!!!!!!)
|
||||
06@&M)%aTBR*KFQPPF`!!!!0'58a&!3!!)dC*6%8"!!!N4NP-43%!!#PJrrrrrrr
|
||||
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrm!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%"!!%"!3%!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!li!!!3!EA0dFJ!
|
||||
!!!!!!!!!!!!!!!!!"li!!!-!EA0dE!!!!!!!!!!!!!!!!!!!#Vi!!!%!EA0dEJ!
|
||||
!!!!!!!!!!!!!!!!!$L!!!!3!EA0dFJ!!!qJ!!!!!!!!!!!!!%L!!!!-!EA0dE!!
|
||||
!!qJ!!!!!!!!!!!!!#li!!!%!EA0dEJ!!!qJ!!!!!!!!!!!!!!5J!!!!ZF(*PCJ"
|
||||
0XIN!!!!"!!!!!!!!!9B!!!"+F(*PCJ"0Ud-!!!!#!!!!!!!!!D!!!!)+F(*PCJ"
|
||||
0(5X!!!!$!!!!!!!!!kS!!!!8F(*PCJ"0I(`!!!!%!!!!!!!!$,i!!!!DF(*PCJ"
|
||||
0*p3!!!!&!!!!!!!!&5!!!!k!F(*PCJ"05aS!!!!'!!!!!!!!$0J!!!!'F(*PCJ"
|
||||
-rbS!!!!(!!!!!!!!$0i!!!!BF(*PCJ"0HP!!!!!)!!!!!!!!$2B!!!!+F(*PCJ"
|
||||
0Rj8!!!!*!!!!!!!!$3!!!!!1F(*PCJ"0G*m!!!!+!!!!!!!!)k!!!!$'F(*PCJ"
|
||||
0#1S!!!!,!!!!!!!!$3i!!!!kF(*PCJ"0V+F!!!!-!!!!!!!!$8J!!!!-F(*PCJ"
|
||||
0JYi!!!!0!!!!!!!!*'B!!!(DF(*PCJ"06$3!!!!1!!!!!!!!$93!!!!-F(*PCJ"
|
||||
0438!!!!2!!!!!!!!*N!!!!93F(*PCJ"0TjN!!!!3!!!!!!!!$Bi!!!!%F(*PCJ"
|
||||
0U@N!!!!4!!!!!!!!$C)!!!!%F(*PCJ"0X@-!!!!5!!!!!!!!$CB!!!#+F(*PCJ"
|
||||
0-qS!!!!6!!!!!!!!+j!!!!!!1("bC@B!6EQQ!!!!&!!!!!!!!!eJ!!!!$A"bC@B
|
||||
!6Ck"!!!!&3!!!!!!!!eY!!!!&("bC@B!6CYM!!!!&J!!!!!!!!f"!!!!#R"bC@B
|
||||
!63Cr!!!!&`!!!!!!!#[)!!!!a("bC@B!62YA!!!!'!!!!!!!!#b-!!!"&R"bC@B
|
||||
!6D+U!!!!'3!!!!!!!#fL!!!!U("bC@B!6GG(!!!!'J!!!!!!!#j+!!!!,R"bC@B
|
||||
!62'p!!!!'`!!!!!!!$6B!!!#$("bC@B!63iS!!!!(!!!!!!!!$EN!!!#4("bC@B
|
||||
!6HID!!!!(3!!!!!!!#pq!!!!*("bC@B!63eC!!!!(J!!!!!!!#qL!!!!#R"bC@B
|
||||
!6G6V!!!!(`!!!!!!!#qX!!!!NR"bC@B!656N!!!!)!!!!!!!!$!q!!!!5R"bC@B
|
||||
!6AqD!!!!)3!!!!!!!$NS!!!'$("bC@B!6F'&!!!!)J!!!!!!!%c5!!!L4("bC@B
|
||||
!69kd!!!!)`!!!!!!!$5i!!!!)'edFf`!!!!"!!!!!!!!!!!!!$md!!!+b'edF'`
|
||||
!!!!"!!!!!!!!!!!!!$#k!!!!Q'edE'm!!!!"!!!!!!!!!!!!!#md!!!!%'edF'N
|
||||
!!!!"!!!!!!!!!!!!!#ji!!!!+'ecG'N!!!!!!!!!!!!!!!!!!$&5!!!#('edCf`
|
||||
!!!2S!!!!!!!!!!!!!%Rm!!!#,'e`FfN!!!2S!!!!!!!!!!!!!'m@!!!"`&"-Fh3
|
||||
!635L!!!!*!!!!!!!!#p%!!!!+'ecG'N!!!2S!!!!!!!!!!!!!$0Z!!!"&'edF(-
|
||||
!!!!"!!!!!!!!!!!!!#kJ!!!!-R"bC@B!6B@B!!!!*3!!!!!!!$#f!!!!"("bC@B
|
||||
!6BN6!!!!*J!!!!!!!#l5!!!!BR"bC@B!62V(!!!!*`!!!!!!!(&#!!!"%R"bC@B
|
||||
!$I@3!!!!!#J!!!!!!!"b9!!!",T`FQ9Q!!j0d!!!!#N!!!!!9i8!!!%!!!!"Z`!
|
||||
!!,X!!!"Y!!""d3SK3dp%49p&C#iaE3!!3G-E3dp%45"&C'PdEh)+5P05C@BZF(*
|
||||
U-R-ZFh4Y)&0`EfpXCA)Y,5dY,5eKB`)!68e3FN0A588"!2rrrrm!!!!!!!!!!!!
|
||||
!!!!!!!!!!!#`r,1a!!"`T!!!!LK%49p&C#iaEA!!$`$rrrrrrrm!!!!"%!!!!!!
|
||||
!!!!5!!!!3G--)8024%9IC@3ZDA4[!!!!3G843dp%45"PC'PdEh)J6QpdCA-'!!!
|
||||
!3G8!!!`K3dp%49pPC#jTG'm!$`$rrrrrrrm!!!!"%!!!!!!!!!!'!!!!3GN!!!S
|
||||
KDf0c)ep&!!!!ChdD,NXrj6)`!!3!!!!"!!!!!,$rT51`rk6#!!!!!!!!!!!!!!!
|
||||
!!!!!!!KhB@aNC@eKFJ!(-5ia,M)Z-J!+5P05C@BZF(*U-J!!!!!C6@&NC5"hBA*
|
||||
ZD@jRFb"TER4[)'9bFQpbF`!!!!"-qVX!!`!!!!!!!!!!#NT68Q9Q,R"bDM)!"c%
|
||||
Z-5ib,M)!!!!$,@YL!!p85P0'98ia-ep#8N&13dJ!!!!!!!!!!!!!#@jc,fTc,h*
|
||||
PCJ!!!3!!!!'l!!!!Z`!!!'d%X[E!+-3!!!!F!%B!!@0VD@3!!!!5E@0fF`!!!"i
|
||||
!J!!!!!!!!!5bp8J!J!!2!!!!D`!!!!!18(*[DQ9MG'pb)%4KG'%A6@&M3eC6)&C
|
||||
PFR0TEfiJ8Q9cEh9bBf@NfJ:
|
||||
@@ -1 +1,2 @@
|
||||
#define XP_MAC 1
|
||||
#define JSFILE 1
|
||||
299
mozilla/js/ref/Makefile
Normal file
299
mozilla/js/ref/Makefile
Normal file
@@ -0,0 +1,299 @@
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public License
|
||||
# Version 1.0 (the "NPL"); you may not use this file except in
|
||||
# compliance with the NPL. You may obtain a copy of the NPL at
|
||||
# http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
# for the specific language governing rights and limitations under the
|
||||
# NPL.
|
||||
#
|
||||
# The Initial Developer of this code under the NPL is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
# Reserved.
|
||||
|
||||
#
|
||||
# JSRef GNUmake makefile.
|
||||
#
|
||||
|
||||
# Set os+release dependent make variables
|
||||
OS_ARCH := $(subst /,_,$(shell uname -s))
|
||||
|
||||
# Attempt to differentiate between SunOS 5.4 and x86 5.4
|
||||
OS_CPUARCH := $(shell uname -m)
|
||||
ifeq ($(OS_CPUARCH),i86pc)
|
||||
OS_RELEASE := $(shell uname -r)_$(OS_CPUARCH)
|
||||
else
|
||||
OS_RELEASE := $(shell uname -r)
|
||||
endif
|
||||
|
||||
# Virtually all Linux versions are identical.
|
||||
# Any distinctions are handled in linux.h
|
||||
ifeq ($(OS_ARCH),Linux)
|
||||
OS_CONFIG := Linux_All
|
||||
else
|
||||
OS_CONFIG := $(OS_ARCH)$(OS_OBJTYPE)$(OS_RELEASE)
|
||||
endif
|
||||
|
||||
ASFLAGS =
|
||||
DEFINES =
|
||||
|
||||
include config/$(OS_CONFIG).mk
|
||||
|
||||
ifdef BUILD_OPT
|
||||
OPTIMIZER += -O
|
||||
DEFINES += -UDEBUG -DNDEBUG -UDEBUG_$(shell whoami)
|
||||
OBJDIR_TAG = _OPT
|
||||
else
|
||||
ifdef USE_MSVC
|
||||
OPTIMIZER = -Zi
|
||||
else
|
||||
OPTIMIZER = -g
|
||||
endif
|
||||
DEFINES += -DDEBUG -DDEBUG_$(shell whoami)
|
||||
OBJDIR_TAG = _DBG
|
||||
endif
|
||||
|
||||
#DEFINES += -DJS_THREADSAFE
|
||||
|
||||
ifdef JS_NO_THIN_LOCKS
|
||||
DEFINES += -DJS_USE_ONLY_NSPR_LOCKS
|
||||
endif
|
||||
|
||||
# Name of the binary code directories
|
||||
OBJDIR = $(OS_CONFIG)$(OBJDIR_TAG).OBJ
|
||||
VPATH = $(OBJDIR)
|
||||
|
||||
# Automatic make dependencies file
|
||||
DEPENDENCIES = $(OBJDIR)/.md
|
||||
|
||||
define MAKE_OBJDIR
|
||||
if test ! -d $(@D); then rm -rf $(@D); mkdir $(@D); fi
|
||||
endef
|
||||
|
||||
# Look in OBJDIR to find prcpucfg.h
|
||||
INCLUDES = -I$(OBJDIR)
|
||||
|
||||
#
|
||||
# XCFLAGS may be set in the environment or on the gmake command line
|
||||
#
|
||||
CFLAGS = $(OPTIMIZER) $(OS_CFLAGS) $(DEFINES) $(INCLUDES) \
|
||||
-DJSFILE $(XCFLAGS)
|
||||
LDFLAGS = -lm $(XLDFLAGS) -Lfdlibm -lfdm
|
||||
|
||||
# For purify
|
||||
PURE_CFLAGS = -DXP_UNIX $(OPTIMIZER) $(PURE_OS_CFLAGS) $(DEFINES) \
|
||||
$(INCLUDES) $(XCFLAGS)
|
||||
|
||||
#
|
||||
# JS file lists
|
||||
#
|
||||
PR_HFILES = \
|
||||
prarena.h \
|
||||
prassert.h \
|
||||
prclist.h \
|
||||
prdtoa.h \
|
||||
prhash.h \
|
||||
prlong.h \
|
||||
prmacos.h \
|
||||
prosdep.h \
|
||||
prpcos.h \
|
||||
prprintf.h \
|
||||
prtime.h \
|
||||
prtypes.h \
|
||||
prunixos.h \
|
||||
$(NULL)
|
||||
|
||||
JS_HFILES = \
|
||||
jsarray.h \
|
||||
jsatom.h \
|
||||
jsbool.h \
|
||||
jsconfig.h \
|
||||
jscntxt.h \
|
||||
jsdate.h \
|
||||
jsemit.h \
|
||||
jsfun.h \
|
||||
jsgc.h \
|
||||
jsinterp.h \
|
||||
jslock.h \
|
||||
jsmath.h \
|
||||
jsnum.h \
|
||||
jsobj.h \
|
||||
jsopcode.h \
|
||||
jsparse.h \
|
||||
jsprvtd.h \
|
||||
jspubtd.h \
|
||||
jsregexp.h \
|
||||
jsscan.h \
|
||||
jsscope.h \
|
||||
jsscript.h \
|
||||
jsstr.h \
|
||||
jsxdrapi.h \
|
||||
$(NULL)
|
||||
|
||||
API_HFILES = \
|
||||
jsapi.h \
|
||||
jsdbgapi.h \
|
||||
$(NULL)
|
||||
|
||||
HFILES = $(PR_HFILES) $(JS_HFILES) $(API_HFILES)
|
||||
|
||||
PR_CFILES = \
|
||||
prarena.c \
|
||||
prassert.c \
|
||||
prdtoa.c \
|
||||
prhash.c \
|
||||
prlog2.c \
|
||||
prlong.c \
|
||||
prprintf.c \
|
||||
prtime.c \
|
||||
$(NULL)
|
||||
|
||||
JS_CFILES = \
|
||||
jsapi.c \
|
||||
jsarray.c \
|
||||
jsatom.c \
|
||||
jsbool.c \
|
||||
jscntxt.c \
|
||||
jsdate.c \
|
||||
jsdbgapi.c \
|
||||
jsemit.c \
|
||||
jsfun.c \
|
||||
jsgc.c \
|
||||
jsinterp.c \
|
||||
jslock.c \
|
||||
jsmath.c \
|
||||
jsnum.c \
|
||||
jsobj.c \
|
||||
jsopcode.c \
|
||||
jsparse.c \
|
||||
jsregexp.c \
|
||||
jsscan.c \
|
||||
jsscope.c \
|
||||
jsscript.c \
|
||||
jsstr.c \
|
||||
jsxdrapi.c \
|
||||
$(NULL)
|
||||
|
||||
LIB_CFILES = $(PR_CFILES) $(JS_CFILES)
|
||||
LIB_ASFILES := $(wildcard *_$(OS_ARCH).s)
|
||||
PROG_CFILES = js.c
|
||||
|
||||
ifdef USE_MSVC
|
||||
LIB_OBJS = $(addprefix $(OBJDIR)/, $(LIB_CFILES:.c=.obj))
|
||||
PROG_OBJS = $(addprefix $(OBJDIR)/, $(PROG_CFILES:.c=.obj))
|
||||
else
|
||||
LIB_OBJS = $(addprefix $(OBJDIR)/, $(LIB_CFILES:.c=.o))
|
||||
LIB_OBJS += $(addprefix $(OBJDIR)/, $(LIB_ASFILES:.s=.o))
|
||||
PROG_OBJS = $(addprefix $(OBJDIR)/, $(PROG_CFILES:.c=.o))
|
||||
endif
|
||||
|
||||
CFILES = $(LIB_CFILES) $(PROG_CFILES)
|
||||
OBJS = $(LIB_OBJS) $(PROG_OBJS)
|
||||
|
||||
ifdef USE_MSVC
|
||||
LIBRARY = $(OBJDIR)/js32.dll
|
||||
PROGRAM = $(OBJDIR)/js
|
||||
else
|
||||
LIBRARY = $(OBJDIR)/libjs.a
|
||||
PROGRAM = $(OBJDIR)/js
|
||||
endif
|
||||
|
||||
ifdef USE_MSVC
|
||||
TARGETS = $(LIBRARY) # $(PROGRAM) not supported for MSVC yet
|
||||
else
|
||||
TARGETS = fdlibm/libfdm.a $(LIBRARY) $(PROGRAM)
|
||||
endif
|
||||
|
||||
all: $(TARGETS)
|
||||
|
||||
clean:
|
||||
rm -rf $(OBJS)
|
||||
cd fdlibm; gmake clean
|
||||
|
||||
clobber:
|
||||
rm -rf $(OBJS) $(TARGETS) $(DEPENDENCIES)
|
||||
cd fdlibm; gmake clean
|
||||
|
||||
depend:
|
||||
gcc -MM $(CFLAGS) $(JS_CFILES)
|
||||
|
||||
fdlibm/libfdm.a:
|
||||
cd fdlibm; gmake
|
||||
|
||||
$(OBJDIR)/%: %.c
|
||||
@$(MAKE_OBJDIR)
|
||||
$(CC) -o $@ $(CFLAGS) $*.c $(LDFLAGS)
|
||||
|
||||
$(OBJDIR)/%.o: %.c
|
||||
@$(MAKE_OBJDIR)
|
||||
$(CC) -o $@ -c $(CFLAGS) $*.c
|
||||
|
||||
$(OBJDIR)/%.o: %.s
|
||||
@$(MAKE_OBJDIR)
|
||||
$(AS) -o $@ $(ASFLAGS) $*.s
|
||||
|
||||
# windows only
|
||||
$(OBJDIR)/%.obj: %.c
|
||||
@$(MAKE_OBJDIR)
|
||||
$(CC) -Fo$(OBJDIR)/ -c $(CFLAGS) $*.c
|
||||
|
||||
ifeq ($(OS_ARCH),OS2)
|
||||
$(LIBRARY): $(LIB_OBJS)
|
||||
$(AR) $@ $? $(AR_OS2_SUFFIX)
|
||||
$(RANLIB) $@
|
||||
else
|
||||
ifdef USE_MSVC
|
||||
$(LIBRARY): $(LIB_OBJS)
|
||||
link.exe $(LIB_LINK_FLAGS) /base:0x61000000 \
|
||||
/out:"$@" /pdb:"$(OBJDIR)/js32.pdb" /implib:"$(OBJDIR)/js32.lib" $?
|
||||
else
|
||||
$(LIBRARY): $(LIB_OBJS)
|
||||
$(AR) rv $@ $?
|
||||
$(RANLIB) $@
|
||||
endif
|
||||
endif
|
||||
|
||||
#NSPR_LIBRARY = ../../dist/$(OBJDIR)/lib/libnspr21.so
|
||||
NSPR_LIBRARY =
|
||||
|
||||
$(PROGRAM): $(PROG_OBJS) $(LIBRARY)
|
||||
$(CC) -o $@ $(CFLAGS) $(PROG_OBJS) $(LIBRARY) $(NSPR_LIBRARY) $(LDFLAGS)
|
||||
|
||||
$(PROGRAM).pure: $(PROG_OBJS) $(LIBRARY)
|
||||
purify $(PUREFLAGS) \
|
||||
$(CC) -o $@ $(PURE_OS_CFLAGS) $(PROG_OBJS) $(LIBRARY) $(LDFLAGS)
|
||||
|
||||
$(HFILES) $(CFILES): $(OBJDIR)/prcpucfg.h
|
||||
|
||||
ifdef PREBUILT_CPUCFG
|
||||
$(OBJDIR)/prcpucfg.h: prcpucfg.h
|
||||
cp prcpucfg.h $(OBJDIR)
|
||||
else
|
||||
$(OBJDIR)/prcpucfg.h: $(OBJDIR)/prcpucfg
|
||||
rm -f $@
|
||||
$(OBJDIR)/prcpucfg > $@
|
||||
|
||||
$(OBJDIR)/prcpucfg: $(OBJDIR)/prcpucfg.o
|
||||
$(CC) -o $@ $(OBJDIR)/prcpucfg.o
|
||||
endif
|
||||
|
||||
#
|
||||
# Hardwire dependencies on jsopcode.def
|
||||
#
|
||||
jsopcode.h jsopcode.c: jsopcode.def
|
||||
|
||||
-include $(DEPENDENCIES)
|
||||
|
||||
TARNAME = jsref.tar
|
||||
TARFILES = files `cat files`
|
||||
|
||||
tar:
|
||||
tar cvf $(TARNAME) $(TARFILES)
|
||||
gzip $(TARNAME)
|
||||
|
||||
SUFFIXES: .i
|
||||
%.i: %.c
|
||||
$(CC) -C -E $(CFLAGS) $< > $*.i
|
||||
674
mozilla/js/ref/README
Normal file
674
mozilla/js/ref/README
Normal file
@@ -0,0 +1,674 @@
|
||||
This is the README file for the JavaScript Reference (JSRef) implementation.
|
||||
It consists of build conventions and instructions, source code conventions, a
|
||||
design walk-through, and a brief file-by-file description of the source.
|
||||
|
||||
JSRef builds a library or DLL containing the JavaScript runtime (compiler,
|
||||
interpreter, decompiler, garbage collector, atom manager, standard classes).
|
||||
It then compiles a small "shell" program and links that with the library to
|
||||
make an interpreter that can be used interactively and with test .js files to
|
||||
run scripts.
|
||||
|
||||
The current version of JSRef lacks a conformance testsuite. We aim to provide
|
||||
one as soon as possible.
|
||||
|
||||
Quick start tip: skip to "Using the JS API" below, build js, and play with the
|
||||
object named "it" (start by setting 'it.noisy = true').
|
||||
|
||||
Brendan Eich, 9/17/96
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
Build conventions:
|
||||
|
||||
- On Windows, use MSDEV4.2 (js*.mdp) or 5.0 (js*.mak).
|
||||
|
||||
- On Mac, use CodeWarrior 1.x (JSRef.prj.hqx) or 2 (JSRef.prj2.hqx).
|
||||
|
||||
- On Unix, use vendor cc or gcc (ftp://prep.ai.mit.edu/pub/gnu) for compiling,
|
||||
and use gmake for building.
|
||||
|
||||
To compile optimized code, pass BUILD_OPT=1 on the nmake/gmake command line
|
||||
or preset it in the environment or makefile. The C preprocessor macro DEBUG
|
||||
will be undefined, and NDEBUG (archaic Unix-ism for "No Debugging") will be
|
||||
defined. Without BUILD_OPT, DEBUG is predefined and NDEBUG is undefined.
|
||||
|
||||
On Unix, your own debug flag, DEBUG_$USER, will be defined or undefined as
|
||||
BUILD_OPT is unset or set.
|
||||
|
||||
(Linux autoconf support way overdue; coming some day soon, I promise.)
|
||||
|
||||
- To add C compiler options from the make command line, set XCFLAGS=-Dfoo.
|
||||
To predefine -D or -U options in the makefile, set DEFINES.
|
||||
To predefine -I options in the makefile, set INCLUDES.
|
||||
|
||||
- To turn on GC instrumentation, define JS_GCMETER.
|
||||
- To enable multi-threaded execution, define JS_THREADSAFE and flesh out the
|
||||
stubs and required headers in jslock.c/.h. See the JS API docs for more.
|
||||
- To turn on the arena package's instrumentation, define PR_ARENAMETER.
|
||||
- To turn on the hash table package's metering, define PR_HASHMETER.
|
||||
|
||||
Naming and coding conventions:
|
||||
|
||||
- Public function names begin with JS_ followed by capitalized "intercaps",
|
||||
e.g. JS_NewObject.
|
||||
- Extern but library-private function names use a js_ prefix and mixed case,
|
||||
e.g. js_LookupSymbol.
|
||||
- Most static function names have unprefixed, mixed-case names: GetChar.
|
||||
- But static native methods of JS objects have lowercase, underscore-separated
|
||||
or intercaps names, e.g., str_indexOf.
|
||||
- And library-private and static data use underscores, not intercaps (but
|
||||
library-private data do use a js_ prefix).
|
||||
- Scalar type names are lowercase and js-prefixed: jsdouble.
|
||||
- Aggregate type names are JS-prefixed and mixed-case: JSObject.
|
||||
- Macros are generally ALL_CAPS and underscored, to call out potential
|
||||
side effects, multiple uses of a formal argument, etc.
|
||||
|
||||
- Four spaces of indentation per statement nesting level.
|
||||
- Tabs are taken to be eight spaces, and an Emacs magic comment at the top of
|
||||
each file tries to help. If you're using MSVC or similar, you'll want to
|
||||
set tab width to 8, or convert these files to be space-filled.
|
||||
- DLL entry points have their return type expanded within a PR_PUBLIC_API()
|
||||
macro call, to get the right Windows secret type qualifiers in the right
|
||||
places for both 16- and 32-bit builds.
|
||||
- Callback functions that might be called from a DLL are similarly macroized
|
||||
with PR_STATIC_CALLBACK (if the function otherwise would be static to hide
|
||||
its name) or PR_CALLBACK (this macro takes no type argument; it should be
|
||||
used after the return type and before the function name).
|
||||
|
||||
Using the JS API:
|
||||
|
||||
- Starting up:
|
||||
|
||||
/*
|
||||
* Tune this to avoid wasting space for shallow stacks, while saving on
|
||||
* malloc overhead/fragmentation for deep or highly-variable stacks.
|
||||
*/
|
||||
#define STACK_CHUNK_SIZE 8192
|
||||
|
||||
JSRuntime *rt;
|
||||
JSContext *cx;
|
||||
|
||||
/* You need a runtime and one or more contexts to do anything with JS. */
|
||||
rt = JS_Init(1000000L);
|
||||
if (!rt)
|
||||
fail("can't create JavaScript runtime");
|
||||
cx = JS_NewContext(rt, STACK_CHUNK_SIZE);
|
||||
if (!cx)
|
||||
fail("can't create JavaScript context");
|
||||
|
||||
/*
|
||||
* The context definitely wants a global object, in order to have standard
|
||||
* classes and functions like Date and parseInt. See below for details on
|
||||
* JS_NewObject.
|
||||
*/
|
||||
JSObject *globalObj;
|
||||
|
||||
globalObj = JS_NewObject(cx, &my_global_class, 0, 0);
|
||||
JS_InitStandardClasses(cx, globalObj);
|
||||
|
||||
- Defining objects and properties:
|
||||
|
||||
/* Statically initialize a class to make "one-off" objects. */
|
||||
JSClass my_class = {
|
||||
"MyClass",
|
||||
|
||||
/* All of these can be replaced with the corresponding JS_*Stub
|
||||
function pointers. */
|
||||
my_addProperty, my_delProperty, my_getProperty, my_setProperty,
|
||||
my_enumerate, my_resolve, my_convert, my_finalize
|
||||
};
|
||||
|
||||
JSObject *obj;
|
||||
|
||||
/*
|
||||
* Define an object named in the global scope that can be enumerated by
|
||||
* for/in loops. The parent object is passed as the second argument, as
|
||||
* with all other API calls that take an object/name pair. The prototype
|
||||
* passed in is null, so the default object prototype will be used.
|
||||
*/
|
||||
obj = JS_DefineObject(cx, globalObj, "myObject", &my_class, 0,
|
||||
JSPROP_ENUMERATE);
|
||||
|
||||
/*
|
||||
* Define a bunch of properties with a JSPropertySpec array statically
|
||||
* initialized and terminated with a null-name entry. Besides its name,
|
||||
* each property has a "tiny" identifier (MY_COLOR, e.g.) that can be used
|
||||
* in switch statements (in a common my_getProperty function, for example).
|
||||
*/
|
||||
enum my_tinyid {
|
||||
MY_COLOR, MY_HEIGHT, MY_WIDTH, MY_FUNNY, MY_ARRAY, MY_RDONLY
|
||||
};
|
||||
|
||||
static JSPropertySpec my_props[] = {
|
||||
{"color", MY_COLOR, JSPROP_ENUMERATE},
|
||||
{"height", MY_HEIGHT, JSPROP_ENUMERATE},
|
||||
{"width", MY_WIDTH, JSPROP_ENUMERATE},
|
||||
{"funny", MY_FUNNY, JSPROP_ENUMERATE},
|
||||
{"array", MY_ARRAY, JSPROP_ENUMERATE},
|
||||
{"rdonly", MY_RDONLY, JSPROP_READONLY},
|
||||
{0}
|
||||
};
|
||||
|
||||
JS_DefineProperties(cx, obj, my_props);
|
||||
|
||||
/*
|
||||
* Given the above definitions and call to JS_DefineProperties, obj will
|
||||
* need this sort of "getter" method in its class (my_class, above). See
|
||||
* the example for the "It" class in js.c.
|
||||
*/
|
||||
static JSBool
|
||||
my_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
|
||||
{
|
||||
if (JSVAL_IS_INT(id)) {
|
||||
switch (JSVAL_TO_INT(id)) {
|
||||
case MY_COLOR: *vp = . . .; break;
|
||||
case MY_HEIGHT: *vp = . . .; break;
|
||||
case MY_WIDTH: *vp = . . .; break;
|
||||
case MY_FUNNY: *vp = . . .; break;
|
||||
case MY_ARRAY: *vp = . . .; break;
|
||||
case MY_RDONLY: *vp = . . .; break;
|
||||
}
|
||||
}
|
||||
return JS_TRUE;
|
||||
}
|
||||
|
||||
- Defining functions:
|
||||
|
||||
/* Define a bunch of native functions first: */
|
||||
static JSBool
|
||||
my_abs(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
|
||||
{
|
||||
jsdouble x, z;
|
||||
|
||||
if (!JS_ValueToNumber(cx, argv[0], &x))
|
||||
return JS_FALSE;
|
||||
z = (x < 0) ? -x : x;
|
||||
return JS_NewDoubleValue(cx, z, rval);
|
||||
}
|
||||
|
||||
. . .
|
||||
|
||||
/*
|
||||
* Use a JSFunctionSpec array terminated with a null name to define a
|
||||
* bunch of native functions.
|
||||
*/
|
||||
static JSFunctionSpec my_functions[] = {
|
||||
/* name native nargs */
|
||||
{"abs", my_abs, 1},
|
||||
{"acos", my_acos, 1},
|
||||
{"asin", my_asin, 1},
|
||||
. . .
|
||||
{0}
|
||||
};
|
||||
|
||||
/*
|
||||
* Pass a particular object to define methods for it alone. If you pass
|
||||
* a prototype object, the methods will apply to all instances past and
|
||||
* future of the prototype's class (see below for classes).
|
||||
*/
|
||||
JS_DefineFunctions(cx, globalObj, my_functions);
|
||||
|
||||
- Defining classes:
|
||||
|
||||
/*
|
||||
* This pulls together the above API elements by defining a constructor
|
||||
* function, a prototype object, and properties of the prototype and of
|
||||
* the constructor, all with one API call.
|
||||
*
|
||||
* Initialize a class by defining its constructor function, prototype, and
|
||||
* per-instance and per-class properties. The latter are called "static"
|
||||
* below by analogy to Java. They are defined in the constructor object's
|
||||
* scope, so that 'MyClass.myStaticProp' works along with 'new MyClass()'.
|
||||
*
|
||||
* JS_InitClass takes a lot of arguments, but you can pass null for any of
|
||||
* the last four if there are no such properties or methods.
|
||||
*
|
||||
* Note that you do not need to call JS_InitClass to make a new instance of
|
||||
* that class -- otherwise there would be a chicken-and-egg problem making
|
||||
* the global object -- but you should call JS_InitClass if you require a
|
||||
* constructor function for script authors to call via new, and/or a class
|
||||
* prototype object ('MyClass.prototype') for authors to extend with new
|
||||
* properties at run-time.
|
||||
*/
|
||||
protoObj = JS_InitClass(cx, globalObj, &my_class,
|
||||
|
||||
/* native constructor function and min arg count */
|
||||
MyClass, 0,
|
||||
|
||||
/* prototype object properties and methods -- these
|
||||
will be "inherited" by all instances through
|
||||
delegation up the instance's prototype link. */
|
||||
my_props, my_methods,
|
||||
|
||||
/* class constructor properties and methods */
|
||||
my_static_props, my_static_methods);
|
||||
|
||||
- Running scripts:
|
||||
|
||||
/* These should indicate source location for diagnostics. */
|
||||
char *filename;
|
||||
uintN lineno;
|
||||
|
||||
/*
|
||||
* The return value comes back here -- if it could be a GC thing, you must
|
||||
* add it to the GC's "root set" with JS_AddRoot(cx, &thing) where thing
|
||||
* is a JSString *, JSObject *, or jsdouble *, and remove the root before
|
||||
* rval goes out of scope, or when rval is no longer needed.
|
||||
*/
|
||||
jsval rval;
|
||||
JSBool ok;
|
||||
|
||||
/*
|
||||
* Some example source in a C string. Larger, non-null-terminated buffers
|
||||
* can be used, if you pass the buffer length to JS_EvaluateScript.
|
||||
*/
|
||||
char *source = "x * f(y)";
|
||||
|
||||
ok = JS_EvaluateScript(cx, globalObj, source, strlen(source),
|
||||
filename, lineno, &rval);
|
||||
|
||||
if (ok) {
|
||||
/* Should get a number back from the example source. */
|
||||
jsdouble d;
|
||||
|
||||
ok = JS_ValueToNumber(cx, rval, &d);
|
||||
. . .
|
||||
}
|
||||
|
||||
- Calling functions:
|
||||
|
||||
/* Call a global function named "foo" that takes no arguments. */
|
||||
ok = JS_CallFunctionName(cx, globalObj, "foo", 0, 0, &rval);
|
||||
|
||||
jsval argv[2];
|
||||
|
||||
/* Call a function in obj's scope named "method", passing two arguments. */
|
||||
argv[0] = . . .;
|
||||
argv[1] = . . .;
|
||||
ok = JS_CallFunctionName(cx, obj, "method", 2, argv, &rval);
|
||||
|
||||
- Shutting down:
|
||||
|
||||
/* For each context you've created: */
|
||||
JS_DestroyContext(cx);
|
||||
|
||||
/* And finally: */
|
||||
JS_Finish(rt);
|
||||
|
||||
- Debugging API
|
||||
|
||||
See the trap, untrap, watch, unwatch, line2pc, and pc2line commands in js.c.
|
||||
Also the (scant) comments in jsdbgapi.h.
|
||||
|
||||
Design walk-through:
|
||||
|
||||
This section must be brief for now -- it could easily turn into a book.
|
||||
|
||||
- JS "JavaScript Proper"
|
||||
|
||||
JS modules declare and implement the JavaScript compiler, interpreter,
|
||||
decompiler, GC and atom manager, and standard classes.
|
||||
|
||||
JavaScript uses untyped bytecode and runtime type tagging of data values.
|
||||
The jsval type is a signed machine word that contains either a signed integer
|
||||
value (if the low bit is set), or a type-tagged pointer or boolean value (if
|
||||
the low bit is clear). Tagged pointers all refer to 8-byte-aligned things in
|
||||
the GC heap.
|
||||
|
||||
Objects consist of a possibly shared structural description, called the map
|
||||
or scope; and unshared property values in a vector, called the slots. Object
|
||||
properties are associated with nonnegative integers stored in jsvals, or with
|
||||
atoms (unique string descriptors) if named by an identifier or a non-integral
|
||||
index expression.
|
||||
|
||||
Scripts contain bytecode, source annotations, and a pool of string, number,
|
||||
and identifier literals. Functions are objects that extend scripts or native
|
||||
functions with formal parameters, a literal syntax, and a distinct primitive
|
||||
type ("function").
|
||||
|
||||
The compiler consists of a recursive-descent parser and a random-logic rather
|
||||
than table-driven lexical scanner. Semantic and lexical feedback are used to
|
||||
disambiguate hard cases such as missing semicolons, assignable expressions
|
||||
("lvalues" in C parlance), etc. The parser generates bytecode as it parses,
|
||||
using fixup lists for downward branches and code buffering and rewriting for
|
||||
exceptional cases such as for loops. It attempts no error recovery.
|
||||
|
||||
The interpreter executes the bytecode of top-level scripts, and calls itself
|
||||
indirectly to interpret function bodies (which are also scripts). All state
|
||||
associated with an interpreter instance is passed through formal parameters
|
||||
to the interpreter entry point; most implicit state is collected in a type
|
||||
named JSContext. Therefore, all API and almost all other functions in JSRef
|
||||
take a JSContext pointer as their first argument.
|
||||
|
||||
The decompiler translates postfix bytecode into infix source by consulting a
|
||||
separate byte-sized code, called source notes, to disambiguate bytecodes that
|
||||
result from more than one grammatical production.
|
||||
|
||||
The GC is a mark-and-sweep, non-conservative (perfect) collector. It can
|
||||
allocate only fixed-sized things -- the current size is two machine words.
|
||||
It is used to hold JS object and string descriptors (but not property lists
|
||||
or string bytes), and double-precision floating point numbers. It runs
|
||||
automatically only when maxbytes (as passed to JS_Init) bytes of GC things
|
||||
have been allocated and another thing-allocation request is made. JS API
|
||||
users should call JS_GC or JS_MaybeGC between script executions or from the
|
||||
branch callback, as often as necessary.
|
||||
|
||||
An important point about the GC's "perfection": you must add roots for new
|
||||
objects created by your native methods if you store references to them into
|
||||
a non-JS structure in the malloc heap or in static data. Also, if you make
|
||||
a new object in a native method, but do not store it through the rval result
|
||||
parameter (see math_abs in the "Using the JS API" section above) so that it
|
||||
is in a known root, the object is guaranteed to survive only until another
|
||||
new object is created. Either lock the first new object when making two in
|
||||
a row, or store it in a root you've added, or store it via rval.
|
||||
|
||||
The atom manager consists of a hash table associating strings uniquely with
|
||||
scanner/parser information such as keyword type, index in script or function
|
||||
literal pool, etc. Atoms play three roles in JSRef: as literals referred to
|
||||
by unaligned 16-bit immediate bytecode operands, as unique string descriptors
|
||||
for efficient property name hashing, and as members of the root GC set for
|
||||
perfect GC. This design therefore requires atoms to be manually reference
|
||||
counted, from script literal pools (JSAtomMap) and object symbol (JSSymbol)
|
||||
entry keys.
|
||||
|
||||
Native objects and methods for arrays, booleans, dates, functions, numbers,
|
||||
and strings are implemented using the JS API and certain internal interfaces
|
||||
used as "fast paths".
|
||||
|
||||
In general, errors are signaled by false or unoverloaded-null return values,
|
||||
and are reported using JS_ReportError or one of its variants by the lowest
|
||||
level in order to provide the most detail. Client code can substitute its
|
||||
own error reporting function and suppress errors, or reflect them into Java
|
||||
or some other runtime system as exceptions, GUI dialogs, etc.
|
||||
|
||||
- PR "Portable Runtime"
|
||||
|
||||
PR modules declare and implement fundamental representation types and macros,
|
||||
arenas, hash tables, 64-bit integers, double-precision floating point to
|
||||
string and back conversions, and date/time functions that are used by the JS
|
||||
modules. The PR code is independent of JavaScript and can be used without
|
||||
linking with the JS code.
|
||||
|
||||
In general, errors are signaled by false or unoverloaded-null return values,
|
||||
but are not reported. Therefore, JS calls to PR functions check returns and
|
||||
report errors as specifically as possible.
|
||||
|
||||
File walk-through:
|
||||
|
||||
- jsapi.c, jsapi.h
|
||||
|
||||
The public API to be used by almost all client code.
|
||||
|
||||
If your client code can't make do with jsapi.h, and must reach into a friend
|
||||
or private js* file, please let us know so we can extend jsapi.h to include
|
||||
what you need in a fashion that we can support over the long run.
|
||||
|
||||
- jspubtd.h, jsprvtd.h
|
||||
|
||||
These files exist to group struct and scalar typedefs so they can be used
|
||||
everywhere without dragging in struct definitions from N different files.
|
||||
The jspubtd.h file contains public typedefs, and is included by jsapi.h.
|
||||
The jsprvtd.h file contains private typedefs and is included by various .h
|
||||
files that need type names, but not type sizes or declarations.
|
||||
|
||||
- jsdbgapi.c, jsdbgapi.h
|
||||
|
||||
The Debugging API, still very much under development. Provided so far:
|
||||
|
||||
- Traps, with which breakpoints, single-stepping, step over, step out, and
|
||||
so on can be implemented. The debugger will have to consult jsopcode.def
|
||||
on its own to figure out where to plant trap instructions to implement
|
||||
functions like step out, but a future jsdbgapi.h will provide convenience
|
||||
interfaces to do these things.
|
||||
|
||||
At most one trap per bytecode can be set. When a script (JSScript) is
|
||||
destroyed, all traps set in its bytecode are cleared.
|
||||
|
||||
- Watchpoints, for intercepting set operations on properties and running a
|
||||
debugger-supplied function that receives the old value and a pointer to
|
||||
the new one, which it can use to modify the new value being set.
|
||||
|
||||
- Line number to PC and back mapping functions. The line-to-PC direction
|
||||
"rounds" toward the next bytecode generated from a line greater than or
|
||||
equal to the input line, and may return the PC of a for-loop update part,
|
||||
if given the line number of the loop body's closing brace. Any line after
|
||||
the last one in a script or function maps to a PC one byte beyond the last
|
||||
bytecode in the script.
|
||||
|
||||
An example, from perfect.js:
|
||||
|
||||
14 function perfect(n)
|
||||
15 {
|
||||
16 print("The perfect numbers up to " + n + " are:");
|
||||
17
|
||||
18 // We build sumOfDivisors[i] to hold a string expression for
|
||||
19 // the sum of the divisors of i, excluding i itself.
|
||||
20 var sumOfDivisors = new ExprArray(n+1,1);
|
||||
21 for (var divisor = 2; divisor <= n; divisor++) {
|
||||
22 for (var j = divisor + divisor; j <= n; j += divisor) {
|
||||
23 sumOfDivisors[j] += " + " + divisor;
|
||||
24 }
|
||||
25 // At this point everything up to 'divisor' has its sumOfDivisors
|
||||
26 // expression calculated, so we can determine whether it's perfect
|
||||
27 // already by evaluating.
|
||||
28 if (eval(sumOfDivisors[divisor]) == divisor) {
|
||||
29 print("" + divisor + " = " + sumOfDivisors[divisor]);
|
||||
30 }
|
||||
31 }
|
||||
32 delete sumOfDivisors;
|
||||
33 print("That's all.");
|
||||
34 }
|
||||
|
||||
The line number to PC and back mappings can be tested using the js program
|
||||
with the following script:
|
||||
|
||||
load("perfect.js")
|
||||
print(perfect)
|
||||
dis(perfect)
|
||||
|
||||
print()
|
||||
for (var ln = 0; ln <= 40; ln++) {
|
||||
var pc = line2pc(perfect,ln)
|
||||
var ln2 = pc2line(perfect,pc)
|
||||
print("\tline " + ln + " => pc " + pc + " => line " + ln2)
|
||||
}
|
||||
|
||||
The result of the for loop over lines 0 to 40 inclusive is:
|
||||
|
||||
line 0 => pc 0 => line 16
|
||||
line 1 => pc 0 => line 16
|
||||
line 2 => pc 0 => line 16
|
||||
line 3 => pc 0 => line 16
|
||||
line 4 => pc 0 => line 16
|
||||
line 5 => pc 0 => line 16
|
||||
line 6 => pc 0 => line 16
|
||||
line 7 => pc 0 => line 16
|
||||
line 8 => pc 0 => line 16
|
||||
line 9 => pc 0 => line 16
|
||||
line 10 => pc 0 => line 16
|
||||
line 11 => pc 0 => line 16
|
||||
line 12 => pc 0 => line 16
|
||||
line 13 => pc 0 => line 16
|
||||
line 14 => pc 0 => line 16
|
||||
line 15 => pc 0 => line 16
|
||||
line 16 => pc 0 => line 16
|
||||
line 17 => pc 19 => line 20
|
||||
line 18 => pc 19 => line 20
|
||||
line 19 => pc 19 => line 20
|
||||
line 20 => pc 19 => line 20
|
||||
line 21 => pc 36 => line 21
|
||||
line 22 => pc 53 => line 22
|
||||
line 23 => pc 74 => line 23
|
||||
line 24 => pc 92 => line 22
|
||||
line 25 => pc 106 => line 28
|
||||
line 26 => pc 106 => line 28
|
||||
line 27 => pc 106 => line 28
|
||||
line 28 => pc 106 => line 28
|
||||
line 29 => pc 127 => line 29
|
||||
line 30 => pc 154 => line 21
|
||||
line 31 => pc 154 => line 21
|
||||
line 32 => pc 161 => line 32
|
||||
line 33 => pc 172 => line 33
|
||||
line 34 => pc 172 => line 33
|
||||
line 35 => pc 172 => line 33
|
||||
line 36 => pc 172 => line 33
|
||||
line 37 => pc 172 => line 33
|
||||
line 38 => pc 172 => line 33
|
||||
line 39 => pc 172 => line 33
|
||||
line 40 => pc 172 => line 33
|
||||
|
||||
- jsconfig.h
|
||||
|
||||
Various configuration macros defined as 0 or 1 depending on how JS_VERSION
|
||||
is defined (as 10 for JavaScript 1.0, 11 for JavaScript 1.1, etc.). Not all
|
||||
macros are tested around related code yet. In particular, JS 1.0 support is
|
||||
missing from JSRef. JS 1.2 support will appear in a future JSRef release.
|
||||
|
||||
- js.c
|
||||
|
||||
The "JS shell", a simple interpreter program that uses the JS API and more
|
||||
than a few internal interfaces (some of these internal interfaces could be
|
||||
replaced by jsapi.h calls). The js program built from this source provides
|
||||
a test vehicle for evaluating scripts and calling functions, trying out new
|
||||
debugger primitives, etc.
|
||||
|
||||
- jsarray.c, jsarray.h
|
||||
- jsbool.c, jsbool.h
|
||||
- jsdate.c, jsdate.h
|
||||
- jsfun.c, jsfun.h
|
||||
- jsmath.c, jsmath.h
|
||||
- jsnum.c, jsnum.h
|
||||
- jsstr.c, jsstr.h
|
||||
|
||||
These file pairs implement the standard classes and (where they exist) their
|
||||
underlying primitive types. They have similar structure, generally starting
|
||||
with class definitions and continuing with internal constructors, finalizers,
|
||||
and helper functions.
|
||||
|
||||
- jsobj.c, jsobj.h
|
||||
- jsscope.c, jsscope.h
|
||||
|
||||
These two pairs declare and implement the JS object system. All of the
|
||||
following happen here:
|
||||
|
||||
- creating objects by class and prototype, and finalizing objects;
|
||||
- defining, looking up, getting, setting, and deleting properties;
|
||||
- creating and destroying properties and binding names to them.
|
||||
|
||||
The details of an object map (scope) are mostly hidden in jsscope.[ch],
|
||||
where scopes start out as linked lists of symbols, and grow after some
|
||||
threshold into PR hash tables.
|
||||
|
||||
- jsatom.c, jsatom.h
|
||||
|
||||
The atom manager. Contains well-known string constants, their atoms, the
|
||||
global atom hash table and related state, the js_Atomize() function that
|
||||
turns a counted string of bytes into an atom, and literal pool (JSAtomMap)
|
||||
methods.
|
||||
|
||||
- jsgc.c, jsgc.h
|
||||
|
||||
[TBD]
|
||||
|
||||
- jsinterp.c, jsinterp.h
|
||||
- jscntxt.c, jscntxt.h
|
||||
|
||||
The bytecode interpreter, and related functions such as Call and AllocStack,
|
||||
live in interp.c. The JSContext constructor and destructor are factored out
|
||||
into jscntxt.c for minimal linking when the compiler part of JS is split from
|
||||
the interpreter part into a separate program.
|
||||
|
||||
- jsemit.c, jsemit.h
|
||||
- jsopcode.def, jsopcode.c, jsopcode.h
|
||||
- jsparse.c, jsparse.h
|
||||
- jsscan.c, jsscan.h
|
||||
- jsscript.c, jsscript.h
|
||||
|
||||
Compiler and decompiler modules. The jsopcode.def file is a C preprocessor
|
||||
source that defines almost everything there is to know about JS bytecodes.
|
||||
See its major comment for how to use it. For now, a debugger will use it
|
||||
and its dependents such as jsopcode.h directly, but over time we intend to
|
||||
extend jsdbgapi.h to hide uninteresting details and provide conveniences.
|
||||
|
||||
The code generator is split across paragraphs of code in jsparse.c, and the
|
||||
utility methods called on JSCodeGenerator appear in jsemit.c. Source notes
|
||||
generated by jsparse.c and jsemit.c are used in jsscript.c to map line number
|
||||
to program counter and back.
|
||||
|
||||
- prtypes.h, prlog2.c
|
||||
|
||||
Fundamental representation types and utility macros. This file alone among
|
||||
all .h files in JSRef must be included first by .c files. It is not nested
|
||||
in .h files, as other prerequisite .h files generally are, since it is also
|
||||
a direct dependency of most .c files and would be over-included if nested in
|
||||
addition to being directly included.
|
||||
|
||||
The one "not-quite-a-macro macro" is the PR_CeilingLog2 function in prlog2.c.
|
||||
|
||||
- prarena.c, prarena.h
|
||||
|
||||
Last-In-First-Out allocation macros that amortize malloc costs and allow for
|
||||
en-masse freeing. See the paper mentioned in prarena.h's major comment.
|
||||
|
||||
- prassert.c, prassert.h
|
||||
|
||||
The PR_ASSERT macro is used throughout JSRef source as a proof device to make
|
||||
invariants and preconditions clear to the reader, and to hold the line during
|
||||
maintenance and evolution against regressions or violations of assumptions
|
||||
that it would be too expensive to test unconditionally at run-time. Certain
|
||||
assertions are followed by run-time tests that cope with assertion failure,
|
||||
but only where I'm too smart or paranoid to believe the assertion will never
|
||||
fail...
|
||||
|
||||
- prclist.h
|
||||
|
||||
Doubly-linked circular list struct and macros.
|
||||
|
||||
- prcpucfg.c
|
||||
|
||||
This standalone program generates prcpucfg.h, a header file containing bytes
|
||||
per word and other constants that depend on CPU architecture and C compiler
|
||||
type model. It tries to discover most of these constants by running its own
|
||||
experiments on the build host, so if you are cross-compiling, beware.
|
||||
|
||||
- prdtoa.c, prdtoa.h
|
||||
|
||||
David Gay's portable double-precision floating point to string conversion
|
||||
code, with Permission To Use notice included.
|
||||
|
||||
- prhash.c, prhash.h
|
||||
|
||||
Portable, extensible hash tables. These use multiplicative hash for strength
|
||||
reduction over division hash, yet with very good key distribution over power
|
||||
of two table sizes. Collisions resolve via chaining, so each entry burns a
|
||||
malloc and can fragment the heap.
|
||||
|
||||
- prlong.c, prlong.h
|
||||
|
||||
64-bit integer emulation, and compatible macros that use C's long long type
|
||||
where it exists (my last company mapped long long to a 128-bit type, but no
|
||||
real architecture does 128-bit ints yet).
|
||||
|
||||
- prosdep.h, prmacos.h, prpcos.h, prunixos.h, os/*.h
|
||||
|
||||
A bunch of annoying OS dependencies rationalized into a few "feature-test"
|
||||
macros such as HAVE_LONG_LONG.
|
||||
|
||||
- prprintf.c, prprintf.h
|
||||
|
||||
Portable, buffer-overrun-resistant sprintf and friends.
|
||||
|
||||
For no good reason save lack of time, the %e, %f, and %g formats cause your
|
||||
system's native sprintf, rather than PR_dtoa, to be used. This bug doesn't
|
||||
affect JSRef, because it uses its own PR_dtoa call in jsnum.c to convert
|
||||
from double to string, but it's a bug that we'll fix later, and one you
|
||||
should be aware of if you intend to use a PR_*printf function with your own
|
||||
floating type arguments -- various vendor sprintf's mishandle NaN, +/-Inf,
|
||||
and some even print normal floating values inaccurately.
|
||||
|
||||
- prtime.c, prtime.h
|
||||
|
||||
Time functions. These interfaces are named in a way that makes local vs.
|
||||
universal time confusion likely. Caveat emptor, and we're working on it.
|
||||
To make matters worse, Java (and therefore JavaScript) uses "local" time
|
||||
numbers (offsets from the epoch) in its Date class.
|
||||
9
mozilla/js/ref/TODO
Normal file
9
mozilla/js/ref/TODO
Normal file
@@ -0,0 +1,9 @@
|
||||
- scriptable in jsref
|
||||
- exposed w/o java in js
|
||||
- immutable scopes
|
||||
- so can revive SCOPE_TABLE stuff
|
||||
- fast-as-prop-cache inline scopes for native objects
|
||||
so elim prop-cache
|
||||
- views
|
||||
- global vars in ssjs object model
|
||||
- html object model
|
||||
56
mozilla/js/ref/config/IRIX.mk
Normal file
56
mozilla/js/ref/config/IRIX.mk
Normal file
@@ -0,0 +1,56 @@
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public License
|
||||
# Version 1.0 (the "NPL"); you may not use this file except in
|
||||
# compliance with the NPL. You may obtain a copy of the NPL at
|
||||
# http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
# for the specific language governing rights and limitations under the
|
||||
# NPL.
|
||||
#
|
||||
# The Initial Developer of this code under the NPL is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
# Reserved.
|
||||
|
||||
#
|
||||
# Config stuff for IRIX
|
||||
#
|
||||
CPU_ARCH = mips
|
||||
GFX_ARCH = x
|
||||
|
||||
RANLIB = /bin/true
|
||||
|
||||
#NS_USE_GCC = 1
|
||||
|
||||
ifdef NS_USE_GCC
|
||||
CC = gcc
|
||||
CCC = g++
|
||||
AS = $(CC) -x assembler-with-cpp
|
||||
ODD_CFLAGS = -Wall -Wno-format
|
||||
ifdef BUILD_OPT
|
||||
OPTIMIZER = -O6
|
||||
endif
|
||||
else
|
||||
ifeq ($(OS_RELEASE),6.2)
|
||||
CC = cc -32 -DIRIX6_2
|
||||
endif
|
||||
ifeq ($(OS_RELEASE),6.3)
|
||||
CC = cc -32 -DIRIX6_3
|
||||
endif
|
||||
CCC = CC
|
||||
ODD_CFLAGS = -fullwarn -xansi
|
||||
ifdef BUILD_OPT
|
||||
OPTIMIZER += -Olimit 4000
|
||||
endif
|
||||
endif
|
||||
|
||||
# For purify
|
||||
HAVE_PURIFY = 1
|
||||
PURE_OS_CFLAGS = $(ODD_CFLAGS) -DXP_UNIX -DSVR4 -DSW_THREADS -DIRIX
|
||||
|
||||
OS_CFLAGS = $(PURE_OS_CFLAGS) -MDupdate $(DEPENDENCIES)
|
||||
|
||||
BSDECHO = echo
|
||||
MKSHLIB = $(LD) -shared
|
||||
20
mozilla/js/ref/config/IRIX5.3.mk
Normal file
20
mozilla/js/ref/config/IRIX5.3.mk
Normal file
@@ -0,0 +1,20 @@
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public License
|
||||
# Version 1.0 (the "NPL"); you may not use this file except in
|
||||
# compliance with the NPL. You may obtain a copy of the NPL at
|
||||
# http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
# for the specific language governing rights and limitations under the
|
||||
# NPL.
|
||||
#
|
||||
# The Initial Developer of this code under the NPL is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
# Reserved.
|
||||
|
||||
#
|
||||
# Config stuff for IRIX5.3
|
||||
#
|
||||
include config/IRIX.mk
|
||||
20
mozilla/js/ref/config/IRIX6.3.mk
Normal file
20
mozilla/js/ref/config/IRIX6.3.mk
Normal file
@@ -0,0 +1,20 @@
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public License
|
||||
# Version 1.0 (the "NPL"); you may not use this file except in
|
||||
# compliance with the NPL. You may obtain a copy of the NPL at
|
||||
# http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
# for the specific language governing rights and limitations under the
|
||||
# NPL.
|
||||
#
|
||||
# The Initial Developer of this code under the NPL is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
# Reserved.
|
||||
|
||||
#
|
||||
# Config stuff for IRIX6.3
|
||||
#
|
||||
include config/IRIX.mk
|
||||
33
mozilla/js/ref/config/Linux_All.mk
Normal file
33
mozilla/js/ref/config/Linux_All.mk
Normal file
@@ -0,0 +1,33 @@
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public License
|
||||
# Version 1.0 (the "NPL"); you may not use this file except in
|
||||
# compliance with the NPL. You may obtain a copy of the NPL at
|
||||
# http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
# for the specific language governing rights and limitations under the
|
||||
# NPL.
|
||||
#
|
||||
# The Initial Developer of this code under the NPL is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
# Reserved.
|
||||
|
||||
# Config for all versions of Linux
|
||||
|
||||
CC = gcc -Wall -Wno-format
|
||||
CCC = g++ -Wall -Wno-format
|
||||
|
||||
RANLIB = echo
|
||||
|
||||
#.c.o:
|
||||
# $(CC) -c -MD $*.d $(CFLAGS) $<
|
||||
|
||||
CPU_ARCH = x86 # XXX fixme
|
||||
GFX_ARCH = x
|
||||
|
||||
OS_CFLAGS = -DXP_UNIX -DSVR4 -DSYSV -D_BSD_SOURCE -DPOSIX_SOURCE -DLINUX
|
||||
OS_LIBS = -lm -lc
|
||||
|
||||
ASFLAGS += -x assembler-with-cpp
|
||||
78
mozilla/js/ref/config/SunOS4.1.4.mk
Normal file
78
mozilla/js/ref/config/SunOS4.1.4.mk
Normal file
@@ -0,0 +1,78 @@
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public License
|
||||
# Version 1.0 (the "NPL"); you may not use this file except in
|
||||
# compliance with the NPL. You may obtain a copy of the NPL at
|
||||
# http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
# for the specific language governing rights and limitations under the
|
||||
# NPL.
|
||||
#
|
||||
# The Initial Developer of this code under the NPL is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
# Reserved.
|
||||
|
||||
#
|
||||
# Config stuff for SunOS4.1
|
||||
#
|
||||
|
||||
CC = gcc
|
||||
CCC = g++
|
||||
RANLIB = ranlib
|
||||
|
||||
#.c.o:
|
||||
# $(CC) -c -MD $*.d $(CFLAGS) $<
|
||||
|
||||
CPU_ARCH = sparc
|
||||
GFX_ARCH = x
|
||||
|
||||
# A pile of -D's to build xfe on sunos
|
||||
MOZ_CFLAGS = -DSTRINGS_ALIGNED -DNO_REGEX -DNO_ISDIR -DUSE_RE_COMP \
|
||||
-DNO_REGCOMP -DUSE_GETWD -DNO_MEMMOVE -DNO_ALLOCA \
|
||||
-DBOGUS_MB_MAX -DNO_CONST
|
||||
|
||||
# Purify doesn't like -MDupdate
|
||||
NOMD_OS_CFLAGS = -DXP_UNIX -Wall -Wno-format -DSW_THREADS -DSUNOS4 -DNEED_SYSCALL \
|
||||
$(MOZ_CFLAGS)
|
||||
|
||||
OS_CFLAGS = $(NOMD_OS_CFLAGS) -MDupdate $(DEPENDENCIES)
|
||||
OS_LIBS = -ldl -lm
|
||||
|
||||
MKSHLIB = $(LD) -L$(MOTIF)/lib
|
||||
|
||||
HAVE_PURIFY = 1
|
||||
MOTIF = /home/motif/usr
|
||||
MOTIFLIB = -L$(MOTIF)/lib -lXm
|
||||
INCLUDES += -I/usr/X11R5/include -I$(MOTIF)/include
|
||||
|
||||
NOSUCHFILE = /solaris-rm-f-sucks
|
||||
|
||||
LOCALE_MAP = $(DEPTH)/cmd/xfe/intl/sunos.lm
|
||||
|
||||
EN_LOCALE = en_US
|
||||
DE_LOCALE = de
|
||||
FR_LOCALE = fr
|
||||
JP_LOCALE = ja
|
||||
SJIS_LOCALE = ja_JP.SJIS
|
||||
KR_LOCALE = ko
|
||||
CN_LOCALE = zh
|
||||
TW_LOCALE = zh_TW
|
||||
I2_LOCALE = i2
|
||||
IT_LOCALE = it
|
||||
SV_LOCALE = sv
|
||||
ES_LOCALE = es
|
||||
NL_LOCALE = nl
|
||||
PT_LOCALE = pt
|
||||
|
||||
LOC_LIB_DIR = /usr/openwin/lib/locale
|
||||
|
||||
BSDECHO = echo
|
||||
|
||||
#
|
||||
# These defines are for building unix plugins
|
||||
#
|
||||
BUILD_UNIX_PLUGINS = 1
|
||||
DSO_LDOPTS =
|
||||
DSO_LDFLAGS =
|
||||
65
mozilla/js/ref/config/SunOS5.3.mk
Normal file
65
mozilla/js/ref/config/SunOS5.3.mk
Normal file
@@ -0,0 +1,65 @@
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public License
|
||||
# Version 1.0 (the "NPL"); you may not use this file except in
|
||||
# compliance with the NPL. You may obtain a copy of the NPL at
|
||||
# http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
# for the specific language governing rights and limitations under the
|
||||
# NPL.
|
||||
#
|
||||
# The Initial Developer of this code under the NPL is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
# Reserved.
|
||||
|
||||
#
|
||||
# Config stuff for SunOS5.3
|
||||
#
|
||||
|
||||
CC = gcc -Wall -Wno-format
|
||||
CCC = g++ -Wall -Wno-format
|
||||
|
||||
#CC = /opt/SUNWspro/SC3.0.1/bin/cc
|
||||
RANLIB = echo
|
||||
|
||||
#.c.o:
|
||||
# $(CC) -c -MD $*.d $(CFLAGS) $<
|
||||
|
||||
CPU_ARCH = sparc
|
||||
GFX_ARCH = x
|
||||
|
||||
OS_CFLAGS = -DXP_UNIX -DSVR4 -DSYSV -DSOLARIS
|
||||
OS_LIBS = -lsocket -lnsl -ldl
|
||||
|
||||
ASFLAGS += -P -L -K PIC -D_ASM -D__STDC__=0
|
||||
|
||||
HAVE_PURIFY = 1
|
||||
|
||||
NOSUCHFILE = /solaris-rm-f-sucks
|
||||
|
||||
ifndef JS_NO_ULTRA
|
||||
ULTRA_OPTIONS := -xarch=v8plus
|
||||
ULTRA_OPTIONSD := -DULTRA_SPARC
|
||||
else
|
||||
ULTRA_OPTIONS := -xarch=v8
|
||||
ULTRA_OPTIONSD :=
|
||||
endif
|
||||
|
||||
ifeq ($(OS_CPUARCH),sun4u)
|
||||
DEFINES += $(ULTRA_OPTIONSD)
|
||||
ifeq ($(findstring gcc,$(CC)),gcc)
|
||||
DEFINES += -Wa,$(ULTRA_OPTIONS),$(ULTRA_OPTIONSD)
|
||||
else
|
||||
ASFLAGS += $(ULTRA_OPTIONS) $(ULTRA_OPTIONSD)
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(OS_CPUARCH),sun4m)
|
||||
ifeq ($(findstring gcc,$(CC)),gcc)
|
||||
DEFINES += -Wa,-xarch=v8
|
||||
else
|
||||
ASFLAGS += -xarch=v8
|
||||
endif
|
||||
endif
|
||||
66
mozilla/js/ref/config/SunOS5.4.mk
Normal file
66
mozilla/js/ref/config/SunOS5.4.mk
Normal file
@@ -0,0 +1,66 @@
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public License
|
||||
# Version 1.0 (the "NPL"); you may not use this file except in
|
||||
# compliance with the NPL. You may obtain a copy of the NPL at
|
||||
# http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
# for the specific language governing rights and limitations under the
|
||||
# NPL.
|
||||
#
|
||||
# The Initial Developer of this code under the NPL is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
# Reserved.
|
||||
|
||||
#
|
||||
# Config stuff for SunOS5.4
|
||||
#
|
||||
|
||||
ifdef NS_USE_NATIVE
|
||||
CC = cc
|
||||
CCC = CC
|
||||
else
|
||||
CC = gcc -Wall -Wno-format
|
||||
CCC = g++ -Wall -Wno-format
|
||||
endif
|
||||
|
||||
RANLIB = echo
|
||||
|
||||
CPU_ARCH = sparc
|
||||
GFX_ARCH = x
|
||||
|
||||
OS_CFLAGS = -DXP_UNIX -DSVR4 -DSYSV -D__svr4 -DSOLARIS
|
||||
OS_LIBS = -lsocket -lnsl -ldl
|
||||
|
||||
ASFLAGS += -P -L -K PIC -D_ASM -D__STDC__=0
|
||||
|
||||
HAVE_PURIFY = 1
|
||||
|
||||
NOSUCHFILE = /solaris-rm-f-sucks
|
||||
|
||||
ifndef JS_NO_ULTRA
|
||||
ULTRA_OPTIONS := -xarch=v8plus
|
||||
ULTRA_OPTIONSD := -DULTRA_SPARC
|
||||
else
|
||||
ULTRA_OPTIONS := -xarch=v8
|
||||
ULTRA_OPTIONSD :=
|
||||
endif
|
||||
|
||||
ifeq ($(OS_CPUARCH),sun4u)
|
||||
DEFINES += $(ULTRA_OPTIONSD)
|
||||
ifeq ($(findstring gcc,$(CC)),gcc)
|
||||
DEFINES += -Wa,$(ULTRA_OPTIONS),$(ULTRA_OPTIONSD)
|
||||
else
|
||||
ASFLAGS += $(ULTRA_OPTIONS) $(ULTRA_OPTIONSD)
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(OS_CPUARCH),sun4m)
|
||||
ifeq ($(findstring gcc,$(CC)),gcc)
|
||||
DEFINES += -Wa,-xarch=v8
|
||||
else
|
||||
ASFLAGS += -xarch=v8
|
||||
endif
|
||||
endif
|
||||
65
mozilla/js/ref/config/SunOS5.5.1.mk
Normal file
65
mozilla/js/ref/config/SunOS5.5.1.mk
Normal file
@@ -0,0 +1,65 @@
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public License
|
||||
# Version 1.0 (the "NPL"); you may not use this file except in
|
||||
# compliance with the NPL. You may obtain a copy of the NPL at
|
||||
# http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
# for the specific language governing rights and limitations under the
|
||||
# NPL.
|
||||
#
|
||||
# The Initial Developer of this code under the NPL is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
# Reserved.
|
||||
|
||||
#
|
||||
# Config stuff for SunOS5.5
|
||||
#
|
||||
AS = as
|
||||
CC = gcc -Wall -Wno-format
|
||||
CCC = g++ -Wall -Wno-format
|
||||
|
||||
#CC = /opt/SUNWspro/SC3.0.1/bin/cc
|
||||
RANLIB = echo
|
||||
|
||||
#.c.o:
|
||||
# $(CC) -c -MD $*.d $(CFLAGS) $<
|
||||
|
||||
CPU_ARCH = sparc
|
||||
GFX_ARCH = x
|
||||
|
||||
OS_CFLAGS = -DXP_UNIX -DSVR4 -DSYSV -DSOLARIS -D_SVID_GETTOD
|
||||
OS_LIBS = -lsocket -lnsl -ldl
|
||||
|
||||
ASFLAGS += -P -L -K PIC -D_ASM -D__STDC__=0
|
||||
|
||||
HAVE_PURIFY = 1
|
||||
|
||||
NOSUCHFILE = /solaris-rm-f-sucks
|
||||
|
||||
ifndef JS_NO_ULTRA
|
||||
ULTRA_OPTIONS := -xarch=v8plus
|
||||
ULTRA_OPTIONSD := -DULTRA_SPARC
|
||||
else
|
||||
ULTRA_OPTIONS := -xarch=v8
|
||||
ULTRA_OPTIONSD :=
|
||||
endif
|
||||
|
||||
ifeq ($(OS_CPUARCH),sun4u)
|
||||
DEFINES += $(ULTRA_OPTIONSD)
|
||||
ifeq ($(findstring gcc,$(CC)),gcc)
|
||||
DEFINES += -Wa,$(ULTRA_OPTIONS),$(ULTRA_OPTIONSD)
|
||||
else
|
||||
ASFLAGS += $(ULTRA_OPTIONS) $(ULTRA_OPTIONSD)
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(OS_CPUARCH),sun4m)
|
||||
ifeq ($(findstring gcc,$(CC)),gcc)
|
||||
DEFINES += -Wa,-xarch=v8
|
||||
else
|
||||
ASFLAGS += -xarch=v8
|
||||
endif
|
||||
endif
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user